Update from HH
[hl193./.git] / Multivariate / cauchy.ml
1 (* ========================================================================= *)
2 (* Complex path integrals and Cauchy's theorem.                              *)
3 (*                                                                           *)
4 (*              (c) Copyright, John Harrison 1998-2008                       *)
5 (* (c) Copyright, Gianni Ciolli, Graziano Gentili, Marco Maggesi 2008-2009.  *)
6 (*              (c) Copyright, Valentina Bruno 2010                          *)
7 (* ========================================================================= *)
8
9 needs "Library/binomial.ml";;
10 needs "Library/iter.ml";;
11 needs "Multivariate/moretop.ml";;
12
13 prioritize_complex();;
14
15 (* ------------------------------------------------------------------------- *)
16 (* A couple of extra tactics used in some proofs below.                      *)
17 (* ------------------------------------------------------------------------- *)
18
19 let ASSERT_TAC tm =
20   SUBGOAL_THEN tm STRIP_ASSUME_TAC;;
21
22 let EQ_TRANS_TAC tm =
23   MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC tm THEN CONJ_TAC;;
24
25 (* ------------------------------------------------------------------------- *)
26 (* Piecewise differentiability on a 1-D interval. The definition doesn't     *)
27 (* tie it to real^1 but it's not obviously that useful elsewhere.            *)
28 (* ------------------------------------------------------------------------- *)
29
30 parse_as_infix("piecewise_differentiable_on",(12,"right"));;
31
32 let piecewise_differentiable_on = new_definition
33  `f piecewise_differentiable_on i <=>
34         f continuous_on i /\
35         (?s. FINITE s /\ !x. x IN (i DIFF s) ==> f differentiable at x)`;;
36
37 let PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON = prove
38  (`!f s. f piecewise_differentiable_on s ==> f continuous_on s`,
39   SIMP_TAC[piecewise_differentiable_on]);;
40
41 let PIECEWISE_DIFFERENTIABLE_ON_SUBSET = prove
42  (`!f s t.
43         f piecewise_differentiable_on s /\ t SUBSET s
44         ==> f piecewise_differentiable_on t`,
45   REWRITE_TAC[piecewise_differentiable_on] THEN
46   MESON_TAC[SUBSET; IN_DIFF; CONTINUOUS_ON_SUBSET]);;
47
48 let DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE = prove
49  (`!f:real^1->real^N a b.
50         f differentiable_on interval[a,b]
51         ==> f piecewise_differentiable_on interval[a,b]`,
52   SIMP_TAC[piecewise_differentiable_on;
53            DIFFERENTIABLE_IMP_CONTINUOUS_ON] THEN
54   REPEAT STRIP_TAC THEN EXISTS_TAC `{a,b}:real^1->bool` THEN
55   ASM_REWRITE_TAC[FINITE_INSERT; FINITE_RULES] THEN
56   REWRITE_TAC[GSYM OPEN_CLOSED_INTERVAL_1] THEN
57   SIMP_TAC[GSYM DIFFERENTIABLE_ON_EQ_DIFFERENTIABLE_AT; OPEN_INTERVAL] THEN
58   MATCH_MP_TAC DIFFERENTIABLE_ON_SUBSET THEN
59   EXISTS_TAC `interval[a:real^1,b]` THEN
60   ASM_REWRITE_TAC[INTERVAL_OPEN_SUBSET_CLOSED]);;
61
62 let DIFFERENTIABLE_IMP_PIECEWISE_DIFFERENTIABLE = prove
63  (`!f s. (!x. x IN s ==> f differentiable (at x))
64          ==> f piecewise_differentiable_on s`,
65   SIMP_TAC[piecewise_differentiable_on; DIFFERENTIABLE_IMP_CONTINUOUS_AT;
66            CONTINUOUS_AT_IMP_CONTINUOUS_ON; IN_DIFF] THEN
67   MESON_TAC[FINITE_RULES]);;
68
69 let PIECEWISE_DIFFERENTIABLE_COMPOSE = prove
70  (`!f:real^M->real^N g:real^N->real^P s.
71         f piecewise_differentiable_on s /\
72         g piecewise_differentiable_on (IMAGE f s) /\
73         (!b. FINITE {x | x IN s /\ f(x) = b})
74         ==> (g o f) piecewise_differentiable_on s`,
75   REPEAT GEN_TAC THEN
76   SIMP_TAC[piecewise_differentiable_on; CONTINUOUS_ON_COMPOSE] THEN
77   DISCH_THEN(CONJUNCTS_THEN2
78    (CONJUNCTS_THEN2 ASSUME_TAC (X_CHOOSE_THEN `ks:real^M->bool`
79                                 STRIP_ASSUME_TAC))
80    (CONJUNCTS_THEN2
81      (CONJUNCTS_THEN2 ASSUME_TAC (X_CHOOSE_THEN `kt:real^N->bool`
82                                   STRIP_ASSUME_TAC))
83      ASSUME_TAC)) THEN
84   EXISTS_TAC
85     `ks UNION
86      UNIONS(IMAGE (\b. {x | x IN s /\ (f:real^M->real^N) x = b}) kt)` THEN
87   ASM_SIMP_TAC[FINITE_UNION; FINITE_UNIONS; FINITE_IMAGE] THEN
88   REWRITE_TAC[UNIONS_IMAGE; FORALL_IN_IMAGE; IN_DIFF; IN_UNION] THEN
89   ASM_REWRITE_TAC[IN_ELIM_THM; DE_MORGAN_THM] THEN
90   REPEAT STRIP_TAC THEN MATCH_MP_TAC DIFFERENTIABLE_CHAIN_AT THEN
91   CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM SET_TAC[]);;
92
93 let PIECEWISE_DIFFERENTIABLE_AFFINE = prove
94  (`!f:real^M->real^N s m c.
95         f piecewise_differentiable_on (IMAGE (\x. m % x + c) s)
96         ==> (f o (\x. m % x + c)) piecewise_differentiable_on s`,
97   REPEAT STRIP_TAC THEN ASM_CASES_TAC `m = &0` THENL
98    [ASM_REWRITE_TAC[o_DEF; VECTOR_MUL_LZERO] THEN
99     MATCH_MP_TAC DIFFERENTIABLE_IMP_PIECEWISE_DIFFERENTIABLE THEN
100     SIMP_TAC[DIFFERENTIABLE_CONST];
101     MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_COMPOSE THEN
102     ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
103      [MATCH_MP_TAC DIFFERENTIABLE_IMP_PIECEWISE_DIFFERENTIABLE THEN
104       SIMP_TAC[DIFFERENTIABLE_ADD; DIFFERENTIABLE_CMUL; DIFFERENTIABLE_CONST;
105                DIFFERENTIABLE_ID];
106       X_GEN_TAC `b:real^M` THEN ASM_SIMP_TAC[VECTOR_AFFINITY_EQ] THEN
107       MATCH_MP_TAC FINITE_SUBSET THEN
108       EXISTS_TAC `{inv m % b + --(inv m % c):real^M}` THEN
109       SIMP_TAC[FINITE_RULES] THEN SET_TAC[]]]);;
110
111 let PIECEWISE_DIFFERENTIABLE_CASES = prove
112  (`!f g:real^1->real^N a b c.
113         drop a <= drop c /\ drop c <= drop b /\ f c = g c /\
114         f piecewise_differentiable_on interval[a,c] /\
115         g piecewise_differentiable_on interval[c,b]
116         ==> (\x. if drop x <= drop c then f(x) else g(x))
117             piecewise_differentiable_on interval[a,b]`,
118   REPEAT GEN_TAC THEN
119   REPLICATE_TAC 3 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
120   REWRITE_TAC[piecewise_differentiable_on] THEN
121   DISCH_THEN(CONJUNCTS_THEN2
122    (CONJUNCTS_THEN2 ASSUME_TAC (X_CHOOSE_THEN `s:real^1->bool`
123                                 STRIP_ASSUME_TAC))
124    (CONJUNCTS_THEN2 ASSUME_TAC (X_CHOOSE_THEN `t:real^1->bool`
125                                 STRIP_ASSUME_TAC))) THEN
126   CONJ_TAC THENL
127    [SUBGOAL_THEN `interval[a:real^1,b] = interval[a,c] UNION interval[c,b]`
128     SUBST1_TAC THENL
129      [REWRITE_TAC[EXTENSION; IN_UNION; IN_INTERVAL_1] THEN
130       ASM_REAL_ARITH_TAC;
131       ALL_TAC] THEN
132     MATCH_MP_TAC CONTINUOUS_ON_CASES THEN
133     ASM_REWRITE_TAC[CLOSED_INTERVAL; IN_INTERVAL_1] THEN
134     ASM_MESON_TAC[REAL_LE_ANTISYM; DROP_EQ];
135     ALL_TAC] THEN
136   EXISTS_TAC `(c:real^1) INSERT s UNION t` THEN
137   ASM_REWRITE_TAC[FINITE_INSERT; FINITE_UNION] THEN
138   REWRITE_TAC[DE_MORGAN_THM; IN_DIFF; IN_INTERVAL_1; IN_INSERT; IN_UNION] THEN
139   X_GEN_TAC `x:real^1` THEN STRIP_TAC THEN
140   DISJ_CASES_TAC(REAL_ARITH `drop x <= drop c \/ drop c <= drop x`) THEN
141   MATCH_MP_TAC DIFFERENTIABLE_TRANSFORM_AT THENL
142    [EXISTS_TAC `f:real^1->real^N`; EXISTS_TAC `g:real^1->real^N`] THEN
143   EXISTS_TAC `dist(x:real^1,c)` THEN ASM_REWRITE_TAC[GSYM DIST_NZ] THEN
144   (CONJ_TAC THENL
145     [GEN_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
146      REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB] THEN
147      ASM_REAL_ARITH_TAC;
148      FIRST_X_ASSUM MATCH_MP_TAC THEN
149      ASM_REWRITE_TAC[IN_INTERVAL_1; IN_DIFF]]));;
150
151 let PIECEWISE_DIFFERENTIABLE_NEG = prove
152  (`!f:real^M->real^N s.
153         f piecewise_differentiable_on s
154         ==> (\x. --(f x)) piecewise_differentiable_on s`,
155   REPEAT GEN_TAC THEN REWRITE_TAC[piecewise_differentiable_on] THEN
156   MATCH_MP_TAC MONO_AND THEN SIMP_TAC[CONTINUOUS_ON_NEG] THEN
157   MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[DIFFERENTIABLE_NEG]);;
158
159 let PIECEWISE_DIFFERENTIABLE_ADD = prove
160  (`!f g:real^M->real^N s.
161         f piecewise_differentiable_on s /\
162         g piecewise_differentiable_on s
163         ==> (\x. f x + g x) piecewise_differentiable_on s`,
164   REPEAT GEN_TAC THEN REWRITE_TAC[piecewise_differentiable_on] THEN
165   DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
166   ASM_SIMP_TAC[CONTINUOUS_ON_ADD] THEN
167   FIRST_X_ASSUM(X_CHOOSE_THEN `t:real^M->bool` STRIP_ASSUME_TAC) THEN
168   FIRST_X_ASSUM(X_CHOOSE_THEN `u:real^M->bool` STRIP_ASSUME_TAC) THEN
169   EXISTS_TAC `t UNION u :real^M->bool` THEN
170   ASM_SIMP_TAC[FINITE_UNION; DIFFERENTIABLE_ADD; IN_INTER;
171                SET_RULE `s DIFF (t UNION u) = (s DIFF t) INTER (s DIFF u)`]);;
172
173 let PIECEWISE_DIFFERENTIABLE_SUB = prove
174  (`!f g:real^M->real^N s.
175         f piecewise_differentiable_on s /\
176         g piecewise_differentiable_on s
177         ==> (\x. f x - g x) piecewise_differentiable_on s`,
178   SIMP_TAC[VECTOR_SUB; PIECEWISE_DIFFERENTIABLE_ADD;
179            PIECEWISE_DIFFERENTIABLE_NEG]);;
180
181 (* ------------------------------------------------------------------------- *)
182 (* Valid paths, and their start and finish.                                  *)
183 (* ------------------------------------------------------------------------- *)
184
185 let valid_path = new_definition
186  `valid_path (f:real^1->complex) <=>
187      f piecewise_differentiable_on interval[vec 0,vec 1]`;;
188
189 let closed_path = new_definition
190  `closed_path g <=> pathstart g = pathfinish g`;;
191
192 let VALID_PATH_COMPOSE = prove
193  (`!f g. valid_path g /\ f differentiable_on (path_image g)
194          ==> valid_path (f o g)`,
195   REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
196   REWRITE_TAC[valid_path; piecewise_differentiable_on] THEN
197   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC
198    (X_CHOOSE_THEN `s:real^1->bool` STRIP_ASSUME_TAC)) THEN
199   ASM_SIMP_TAC[CONTINUOUS_ON_COMPOSE; DIFFERENTIABLE_IMP_CONTINUOUS_ON] THEN
200   CONJ_TAC THENL
201    [MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
202     ASM_MESON_TAC[DIFFERENTIABLE_IMP_CONTINUOUS_ON; path_image];
203     EXISTS_TAC `{vec 0:real^1,vec 1} UNION s` THEN
204     ASM_REWRITE_TAC[FINITE_UNION; FINITE_INSERT; FINITE_EMPTY] THEN
205     REWRITE_TAC[SET_RULE `s DIFF (t UNION u) = (s DIFF t) DIFF u`] THEN
206     REWRITE_TAC[GSYM OPEN_CLOSED_INTERVAL_1] THEN
207     X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
208     SUBGOAL_THEN
209      `((f:complex->complex) o (g:real^1->complex))
210       differentiable (at t within (interval(vec 0,vec 1) DIFF s))`
211     MP_TAC THENL
212      [MATCH_MP_TAC DIFFERENTIABLE_CHAIN_WITHIN THEN CONJ_TAC THENL
213        [MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
214         FIRST_X_ASSUM MATCH_MP_TAC;
215         FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [differentiable_on]) THEN
216         DISCH_THEN(MP_TAC o SPEC `(g:real^1->complex) t`) THEN
217         ANTS_TAC THENL
218          [REWRITE_TAC[path_image; IN_IMAGE] THEN EXISTS_TAC `t:real^1`;
219           MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT]
220             DIFFERENTIABLE_WITHIN_SUBSET) THEN
221           REWRITE_TAC[path_image] THEN MATCH_MP_TAC IMAGE_SUBSET]] THEN
222       MP_TAC(ISPECL [`vec 0:real^1`; `vec 1:real^1`]
223         INTERVAL_OPEN_SUBSET_CLOSED) THEN ASM SET_TAC[];
224       ASM_SIMP_TAC[DIFFERENTIABLE_WITHIN_OPEN; OPEN_DIFF; OPEN_INTERVAL;
225                    FINITE_IMP_CLOSED]]]);;
226
227 (* ------------------------------------------------------------------------- *)
228 (* In particular, all results for paths apply.                               *)
229 (* ------------------------------------------------------------------------- *)
230
231 let VALID_PATH_IMP_PATH = prove
232  (`!g. valid_path g ==> path g`,
233   SIMP_TAC[valid_path; path; piecewise_differentiable_on]);;
234
235 let CONNECTED_VALID_PATH_IMAGE = prove
236  (`!g. valid_path g ==> connected(path_image g)`,
237   MESON_TAC[CONNECTED_PATH_IMAGE; VALID_PATH_IMP_PATH]);;
238
239 let COMPACT_VALID_PATH_IMAGE = prove
240  (`!g. valid_path g ==> compact(path_image g)`,
241   MESON_TAC[COMPACT_PATH_IMAGE; VALID_PATH_IMP_PATH]);;
242
243 let BOUNDED_VALID_PATH_IMAGE = prove
244  (`!g. valid_path g ==> bounded(path_image g)`,
245   MESON_TAC[BOUNDED_PATH_IMAGE; VALID_PATH_IMP_PATH]);;
246
247 let CLOSED_VALID_PATH_IMAGE = prove
248  (`!g. valid_path g ==> closed(path_image g)`,
249   MESON_TAC[CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH]);;
250
251 (* ------------------------------------------------------------------------- *)
252 (* Theorems about rectifiable valid paths.                                   *)
253 (* ------------------------------------------------------------------------- *)
254
255 let RECTIFIABLE_VALID_PATH = prove
256  (`!g. valid_path g
257        ==> (rectifiable_path g <=>
258               (\t. vector_derivative g (at t)) absolutely_integrable_on
259               interval [vec 0,vec 1])`,
260   REWRITE_TAC[valid_path; piecewise_differentiable_on; GSYM path] THEN
261   REPEAT STRIP_TAC THEN MATCH_MP_TAC RECTIFIABLE_PATH_DIFFERENTIABLE THEN
262   ASM_MESON_TAC[FINITE_IMP_COUNTABLE]);;
263
264 let PATH_LENGTH_VALID_PATH = prove
265  (`!g. valid_path g /\ rectifiable_path g
266        ==> path_length g =
267                  drop(integral (interval[vec 0,vec 1])
268                                (\t. lift(norm(vector_derivative g (at t)))))`,
269   REWRITE_TAC[valid_path; piecewise_differentiable_on; GSYM path] THEN
270
271   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_LENGTH_DIFFERENTIABLE THEN
272   ASM_MESON_TAC[FINITE_IMP_COUNTABLE]);;
273
274 (* ------------------------------------------------------------------------- *)
275 (* Negligibility of valid_path image                                         *)
276 (* ------------------------------------------------------------------------- *)
277
278 let NEGLIGIBLE_VALID_PATH_IMAGE = prove
279  (`!g. valid_path g ==> negligible(path_image g)`,
280   REWRITE_TAC[piecewise_differentiable_on; piecewise_differentiable_on;
281               valid_path; path_image] THEN
282   GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
283   DISCH_THEN(X_CHOOSE_THEN `k:real^1->bool` STRIP_ASSUME_TAC) THEN
284   MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
285   EXISTS_TAC `IMAGE (g:real^1->real^2)
286                     (k UNION (interval [vec 0,vec 1] DIFF k))` THEN
287   CONJ_TAC THENL [REWRITE_TAC[IMAGE_UNION]; SET_TAC[]] THEN
288   ASM_SIMP_TAC[NEGLIGIBLE_UNION_EQ; NEGLIGIBLE_FINITE; FINITE_IMAGE] THEN
289   MATCH_MP_TAC NEGLIGIBLE_DIFFERENTIABLE_IMAGE_LOWDIM THEN
290   REWRITE_TAC[DIMINDEX_1; DIMINDEX_2; ARITH] THEN
291   ASM_SIMP_TAC[DIFFERENTIABLE_AT_IMP_DIFFERENTIABLE_ON]);;
292
293 (* ------------------------------------------------------------------------- *)
294 (* Integrals along a path (= piecewise differentiable function on [0,1]).    *)
295 (* ------------------------------------------------------------------------- *)
296
297 parse_as_infix("has_path_integral",(12,"right"));;
298 parse_as_infix("path_integrable_on",(12,"right"));;
299
300 let has_path_integral = define
301   `(f has_path_integral i) (g) <=>
302        ((\x. f(g(x)) * vector_derivative g (at x within interval[vec 0,vec 1]))
303         has_integral i)
304        (interval[vec 0,vec 1])`;;
305
306 let path_integral = new_definition
307  `path_integral g f = @i. (f has_path_integral i) (g)`;;
308
309 let path_integrable_on = new_definition
310  `f path_integrable_on g <=> ?i. (f has_path_integral i) g`;;
311
312 let PATH_INTEGRAL_UNIQUE = prove
313  (`!f g i. (f has_path_integral i) (g) ==> path_integral(g) f = i`,
314   REWRITE_TAC[path_integral; has_path_integral; GSYM integral] THEN
315   MESON_TAC[INTEGRAL_UNIQUE]);;
316
317 let HAS_PATH_INTEGRAL_INTEGRAL = prove
318  (`!f i. f path_integrable_on i
319          ==> (f has_path_integral (path_integral i f)) i`,
320   REWRITE_TAC[path_integral; path_integrable_on] THEN
321   MESON_TAC[PATH_INTEGRAL_UNIQUE]);;
322
323 let HAS_PATH_INTEGRAL_UNIQUE = prove
324  (`!f i j g. (f has_path_integral i) g /\
325              (f has_path_integral j) g
326              ==> i = j`,
327   REWRITE_TAC[has_path_integral] THEN MESON_TAC[HAS_INTEGRAL_UNIQUE]);;
328
329 let HAS_PATH_INTEGRAL_INTEGRABLE = prove
330  (`!f g i. (f has_path_integral i) g ==> f path_integrable_on g`,
331   REWRITE_TAC[path_integrable_on] THEN MESON_TAC[]);;
332
333 (* ------------------------------------------------------------------------- *)
334 (* Show that we can forget about the localized derivative.                   *)
335 (* ------------------------------------------------------------------------- *)
336
337 let VECTOR_DERIVATIVE_WITHIN_INTERIOR = prove
338  (`!a b x.
339         x IN interior(interval[a,b])
340         ==> vector_derivative f (at x within interval[a,b]) =
341             vector_derivative f (at x)`,
342   SIMP_TAC[vector_derivative; has_vector_derivative; has_derivative;
343            LIM_WITHIN_INTERIOR; NETLIMIT_WITHIN_INTERIOR; NETLIMIT_AT]);;
344
345 let HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE = prove
346  (`((\x. f' (g x) * vector_derivative g (at x within interval [a,b]))
347     has_integral i) (interval [a,b]) <=>
348     ((\x. f' (g x) * vector_derivative g (at x))
349      has_integral i) (interval [a,b])`,
350   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_SPIKE_EQ THEN
351   EXISTS_TAC `{a:real^1,b}` THEN
352   REWRITE_TAC[NEGLIGIBLE_INSERT; NEGLIGIBLE_EMPTY] THEN
353   SUBGOAL_THEN `interval[a:real^1,b] DIFF {a,b} = interior(interval[a,b])`
354    (fun th -> SIMP_TAC[th; VECTOR_DERIVATIVE_WITHIN_INTERIOR]) THEN
355   REWRITE_TAC[INTERIOR_CLOSED_INTERVAL] THEN
356   REWRITE_TAC[EXTENSION; IN_DIFF; IN_INTERVAL; IN_INSERT; NOT_IN_EMPTY] THEN
357   REWRITE_TAC[DIMINDEX_1; FORALL_1; GSYM drop; GSYM DROP_EQ] THEN
358   REAL_ARITH_TAC);;
359
360 let HAS_PATH_INTEGRAL = prove
361  (`(f has_path_integral i) g <=>
362         ((\x. f (g x) * vector_derivative g (at x)) has_integral i)
363         (interval[vec 0,vec 1])`,
364   SIMP_TAC[HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE; has_path_integral]);;
365
366 let PATH_INTEGRABLE_ON = prove
367  (`f path_integrable_on g <=>
368         (\t. f(g t) * vector_derivative g (at t))
369             integrable_on interval[vec 0,vec 1]`,
370   REWRITE_TAC[path_integrable_on; HAS_PATH_INTEGRAL; GSYM integrable_on]);;
371
372 (* ------------------------------------------------------------------------- *)
373 (* Reversing a path.                                                         *)
374 (* ------------------------------------------------------------------------- *)
375
376 let VALID_PATH_REVERSEPATH = prove
377  (`!g. valid_path(reversepath g) <=> valid_path g`,
378   SUBGOAL_THEN `!g. valid_path g ==> valid_path(reversepath g)`
379    (fun th -> MESON_TAC[th; REVERSEPATH_REVERSEPATH]) THEN GEN_TAC THEN
380   SIMP_TAC[valid_path; piecewise_differentiable_on; GSYM path;
381            PATH_REVERSEPATH] THEN
382   DISCH_THEN(CONJUNCTS_THEN2 (K ALL_TAC) MP_TAC) THEN
383   REWRITE_TAC[IN_DIFF] THEN
384   DISCH_THEN(X_CHOOSE_THEN `s:real^1->bool` STRIP_ASSUME_TAC) THEN
385   EXISTS_TAC `IMAGE (\x:real^1. vec 1 - x) s` THEN
386   ASM_SIMP_TAC[FINITE_IMAGE; reversepath] THEN
387   REPEAT STRIP_TAC THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
388   MATCH_MP_TAC DIFFERENTIABLE_CHAIN_AT THEN
389   SIMP_TAC[DIFFERENTIABLE_SUB; DIFFERENTIABLE_CONST; DIFFERENTIABLE_ID] THEN
390   FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL
391    [UNDISCH_TAC `(x:real^1) IN interval[vec 0,vec 1]` THEN
392     REWRITE_TAC[IN_INTERVAL_1; DROP_SUB; DROP_VEC] THEN REAL_ARITH_TAC;
393     DISCH_THEN(MP_TAC o ISPEC `\x:real^1. vec 1 - x` o
394      MATCH_MP FUN_IN_IMAGE) THEN
395     UNDISCH_TAC `~((x:real^1) IN IMAGE (\x. vec 1 - x) s)` THEN
396     REWRITE_TAC[VECTOR_ARITH `vec 1 - (vec 1 - x):real^1 = x`]]);;
397
398 let HAS_PATH_INTEGRAL_REVERSEPATH = prove
399  (`!f g i. valid_path g /\ (f has_path_integral i) g
400            ==> (f has_path_integral (--i)) (reversepath g)`,
401   REPEAT GEN_TAC THEN REWRITE_TAC[HAS_PATH_INTEGRAL] THEN
402   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
403   DISCH_THEN(MP_TAC o C CONJ (REAL_ARITH `~(-- &1 = &0)`)) THEN
404   DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_AFFINITY) THEN
405   DISCH_THEN(MP_TAC o SPEC `vec 1:real^1`) THEN
406   REWRITE_TAC[IMAGE_AFFINITY_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
407   CONV_TAC REAL_RAT_REDUCE_CONV THEN
408   REWRITE_TAC[VECTOR_ARITH `x + --x:real^1 = vec 0`] THEN
409   REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID; VECTOR_MUL_LNEG] THEN
410   REWRITE_TAC[VECTOR_MUL_LID; VECTOR_NEG_NEG; REAL_POW_ONE] THEN
411   REWRITE_TAC[reversepath; VECTOR_ARITH `-- x + a:real^N = a - x`] THEN
412   REWRITE_TAC[REAL_INV_1; VECTOR_MUL_LID] THEN
413   DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_NEG) THEN
414   REWRITE_TAC[VECTOR_SUB_RZERO] THEN
415   MATCH_MP_TAC(REWRITE_RULE [TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
416                 HAS_INTEGRAL_SPIKE_FINITE) THEN
417   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [valid_path]) THEN
418   REWRITE_TAC[piecewise_differentiable_on] THEN
419   DISCH_THEN(X_CHOOSE_THEN `s:real^1->bool` STRIP_ASSUME_TAC o CONJUNCT2) THEN
420   EXISTS_TAC `IMAGE (\x:real^1. vec 1 - x) s` THEN
421   ASM_SIMP_TAC[FINITE_IMAGE] THEN X_GEN_TAC `x:real^1` THEN STRIP_TAC THEN
422   ASM_REWRITE_TAC[GSYM COMPLEX_MUL_RNEG] THEN
423   AP_TERM_TAC THEN MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
424   GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
425   ONCE_REWRITE_TAC[VECTOR_ARITH `--x = --(&1) % x`] THEN
426   REWRITE_TAC[GSYM DROP_VEC; GSYM DROP_NEG] THEN
427   MATCH_MP_TAC VECTOR_DIFF_CHAIN_AT THEN REWRITE_TAC[] THEN
428   ONCE_REWRITE_TAC[VECTOR_ARITH `--x:real^N = vec 0 - x`] THEN
429   SIMP_TAC[HAS_VECTOR_DERIVATIVE_SUB; HAS_VECTOR_DERIVATIVE_CONST;
430            HAS_VECTOR_DERIVATIVE_ID] THEN
431   REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
432   FIRST_X_ASSUM MATCH_MP_TAC THEN
433   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_DIFF]) THEN
434   REWRITE_TAC[IN_DIFF] THEN MATCH_MP_TAC MONO_AND THEN
435   REWRITE_TAC[CONTRAPOS_THM; IN_DIFF; IN_INTERVAL_1; DROP_SUB; DROP_VEC] THEN
436   CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN REWRITE_TAC[IN_IMAGE] THEN
437   MESON_TAC[VECTOR_ARITH `vec 1 - (vec 1 - x):real^1 = x`]);;
438
439 let PATH_INTEGRABLE_REVERSEPATH = prove
440  (`!f g. valid_path g /\ f path_integrable_on g
441          ==> f path_integrable_on (reversepath g)`,
442   REWRITE_TAC[path_integrable_on] THEN
443   MESON_TAC[HAS_PATH_INTEGRAL_REVERSEPATH]);;
444
445 let PATH_INTEGRABLE_REVERSEPATH_EQ = prove
446  (`!f g. valid_path g
447          ==> (f path_integrable_on (reversepath g) <=>
448               f path_integrable_on g)`,
449   MESON_TAC[PATH_INTEGRABLE_REVERSEPATH; VALID_PATH_REVERSEPATH;
450             REVERSEPATH_REVERSEPATH]);;
451
452 let PATH_INTEGRAL_REVERSEPATH = prove
453  (`!f g. valid_path g /\ f path_integrable_on g
454          ==> path_integral (reversepath g) f = --(path_integral g f)`,
455   MESON_TAC[PATH_INTEGRAL_UNIQUE; HAS_PATH_INTEGRAL_REVERSEPATH;
456             HAS_PATH_INTEGRAL_INTEGRAL]);;
457
458 (* ------------------------------------------------------------------------- *)
459 (* Joining two paths together.                                               *)
460 (* ------------------------------------------------------------------------- *)
461
462 let VALID_PATH_JOIN_EQ = prove
463  (`!g1 g2.
464         pathfinish g1 = pathstart g2
465         ==> (valid_path(g1 ++ g2) <=> valid_path g1 /\ valid_path g2)`,
466   REWRITE_TAC[valid_path; piecewise_differentiable_on; GSYM path] THEN
467   ASM_SIMP_TAC[PATH_JOIN] THEN REPEAT STRIP_TAC THEN
468   ASM_CASES_TAC `path(g1:real^1->complex)` THEN ASM_REWRITE_TAC[] THEN
469   ASM_CASES_TAC `path(g2:real^1->complex)` THEN ASM_REWRITE_TAC[] THEN
470   EQ_TAC THENL
471    [DISCH_THEN(X_CHOOSE_THEN `s:real^1->bool` STRIP_ASSUME_TAC) THEN
472     CONJ_TAC THENL
473      [EXISTS_TAC `(vec 0) INSERT (vec 1) INSERT
474                   {x:real^1 | ((&1 / &2) % x) IN s}` THEN
475       CONJ_TAC THENL
476        [REWRITE_TAC[FINITE_INSERT] THEN MATCH_MP_TAC FINITE_IMAGE_INJ THEN
477         ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC;
478         ALL_TAC] THEN
479       X_GEN_TAC `x:real^1` THEN
480       FIRST_X_ASSUM(MP_TAC o SPEC `(&1 / &2) % x:real^1`) THEN
481       REWRITE_TAC[IN_DIFF; IN_ELIM_THM; IN_INTERVAL_1; DROP_CMUL; DROP_VEC;
482                   IN_INSERT; DE_MORGAN_THM; GSYM DROP_EQ; NOT_EXISTS_THM] THEN
483       DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN ANTS_TAC THENL
484        [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC;
485         ALL_TAC] THEN
486       DISCH_TAC THEN
487       SUBGOAL_THEN
488        `(g1:real^1->complex) = (\x. g1 (&2 % x)) o (\x. &1 / &2 % x)`
489       SUBST1_TAC THENL
490        [REWRITE_TAC[FUN_EQ_THM; o_THM] THEN GEN_TAC THEN AP_TERM_TAC THEN
491         VECTOR_ARITH_TAC;
492         ALL_TAC] THEN
493       MATCH_MP_TAC DIFFERENTIABLE_CHAIN_AT THEN
494       SIMP_TAC[DIFFERENTIABLE_CMUL; DIFFERENTIABLE_ID] THEN
495       MATCH_MP_TAC DIFFERENTIABLE_TRANSFORM_AT THEN
496       EXISTS_TAC `(g1 ++ g2):real^1->complex` THEN
497       EXISTS_TAC `dist(&1 / &2 % x:real^1,lift(&1 / &2))` THEN
498       ASM_REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB; DROP_CMUL;
499                       LIFT_DROP] THEN
500       REWRITE_TAC[joinpaths] THEN
501       REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
502       ASM_REAL_ARITH_TAC;
503
504       EXISTS_TAC `(vec 0) INSERT (vec 1) INSERT
505                   {x:real^1 | ((&1 / &2) % (x + vec 1)) IN s}` THEN
506       CONJ_TAC THENL
507        [REWRITE_TAC[FINITE_INSERT] THEN MATCH_MP_TAC FINITE_IMAGE_INJ THEN
508         ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC;
509         ALL_TAC] THEN
510       X_GEN_TAC `x:real^1` THEN
511       FIRST_X_ASSUM(MP_TAC o SPEC `(&1 / &2) % (x + vec 1):real^1`) THEN
512       REWRITE_TAC[IN_DIFF; IN_ELIM_THM; IN_INTERVAL_1; DROP_CMUL; DROP_VEC;
513        DROP_ADD; IN_INSERT; DE_MORGAN_THM; GSYM DROP_EQ; NOT_EXISTS_THM] THEN
514       DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN ANTS_TAC THENL
515        [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC;
516         ALL_TAC] THEN
517       DISCH_TAC THEN
518       SUBGOAL_THEN
519        `(g2:real^1->complex) =
520         (\x. g2 (&2 % x - vec 1)) o (\x. &1 / &2 % (x + vec 1))`
521       SUBST1_TAC THENL
522        [REWRITE_TAC[FUN_EQ_THM; o_THM] THEN GEN_TAC THEN AP_TERM_TAC THEN
523         VECTOR_ARITH_TAC;
524         ALL_TAC] THEN
525       MATCH_MP_TAC DIFFERENTIABLE_CHAIN_AT THEN
526       SIMP_TAC[DIFFERENTIABLE_CMUL; DIFFERENTIABLE_ADD;
527                DIFFERENTIABLE_CONST; DIFFERENTIABLE_ID] THEN
528       MATCH_MP_TAC DIFFERENTIABLE_TRANSFORM_AT THEN
529       EXISTS_TAC `(g1 ++ g2):real^1->complex` THEN
530       EXISTS_TAC `dist(&1 / &2 % (x + vec 1):real^1,lift(&1 / &2))` THEN
531       ASM_REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB; DROP_CMUL;
532                       DROP_ADD; DROP_VEC; LIFT_DROP] THEN
533       REWRITE_TAC[joinpaths] THEN
534       REPEAT STRIP_TAC THEN REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN
535       ASM_REAL_ARITH_TAC];
536     ALL_TAC] THEN
537   DISCH_THEN(CONJUNCTS_THEN2
538    (X_CHOOSE_THEN `s1:real^1->bool` STRIP_ASSUME_TAC)
539    (X_CHOOSE_THEN `s2:real^1->bool` STRIP_ASSUME_TAC)) THEN
540   EXISTS_TAC `(&1 / &2 % vec 1:real^1) INSERT
541               {x:real^1 | (&2 % x) IN s1} UNION
542               {x:real^1 | (&2 % x - vec 1) IN s2}` THEN
543   CONJ_TAC THENL
544    [REWRITE_TAC[FINITE_INSERT; FINITE_UNION] THEN
545     CONJ_TAC THEN MATCH_MP_TAC FINITE_IMAGE_INJ THEN
546     ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC;
547     ALL_TAC] THEN
548   X_GEN_TAC `x:real^1` THEN
549   REWRITE_TAC[IN_INTERVAL_1; IN_DIFF; DROP_VEC; IN_INSERT; IN_ELIM_THM;
550               DE_MORGAN_THM; IN_UNION; GSYM DROP_EQ; DROP_CMUL] THEN
551   STRIP_TAC THEN
552   REWRITE_TAC[joinpaths] THEN ASM_CASES_TAC `drop x <= &1 / &2` THENL
553    [MATCH_MP_TAC DIFFERENTIABLE_TRANSFORM_AT THEN
554     EXISTS_TAC `\x. (g1:real^1->complex)(&2 % x)` THEN
555     EXISTS_TAC `abs(&1 / &2 - drop x)` THEN
556     REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB; DROP_CMUL;
557                     DROP_ADD; DROP_VEC; LIFT_DROP] THEN
558     CONJ_TAC THENL
559      [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
560     CONJ_TAC THENL
561      [GEN_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
562       ASM_REAL_ARITH_TAC;
563       ALL_TAC];
564     MATCH_MP_TAC DIFFERENTIABLE_TRANSFORM_AT THEN
565     EXISTS_TAC `\x. (g2:real^1->complex)(&2 % x - vec 1)` THEN
566     EXISTS_TAC `abs(&1 / &2 - drop x)` THEN
567     REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB; DROP_CMUL;
568                     DROP_ADD; DROP_VEC; LIFT_DROP] THEN
569     CONJ_TAC THENL
570      [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
571     CONJ_TAC THENL
572      [GEN_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
573       ASM_REAL_ARITH_TAC;
574       ALL_TAC]] THEN
575   GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
576   MATCH_MP_TAC DIFFERENTIABLE_CHAIN_AT THEN
577   SIMP_TAC[DIFFERENTIABLE_CMUL; DIFFERENTIABLE_SUB; DIFFERENTIABLE_CONST;
578            DIFFERENTIABLE_ID] THEN
579   FIRST_X_ASSUM MATCH_MP_TAC THEN
580   ASM_REWRITE_TAC[IN_INTERVAL_1; DROP_SUB; IN_DIFF; DROP_VEC; DROP_CMUL] THEN
581   ASM_REAL_ARITH_TAC);;
582
583 let VALID_PATH_JOIN = prove
584  (`!g1 g2.
585         valid_path g1 /\ valid_path g2 /\ pathfinish g1 = pathstart g2
586         ==> valid_path(g1 ++ g2)`,
587   MESON_TAC[VALID_PATH_JOIN_EQ]);;
588
589 let HAS_PATH_INTEGRAL_JOIN = prove
590  (`!f g1 g2 i1 i2.
591         (f has_path_integral i1) g1 /\
592         (f has_path_integral i2) g2 /\
593         valid_path g1 /\ valid_path g2
594         ==> (f has_path_integral (i1 + i2)) (g1 ++ g2)`,
595   REPEAT GEN_TAC THEN REWRITE_TAC[HAS_PATH_INTEGRAL; CONJ_ASSOC] THEN
596   REPLICATE_TAC 2 (DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC)) THEN
597   DISCH_THEN(CONJUNCTS_THEN
598    (MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_AFFINITY))) THEN
599   DISCH_THEN(ASSUME_TAC o SPECL [`&2`; `--(vec 1):real^1`]) THEN
600   DISCH_THEN(MP_TAC o SPECL [`&2`; `vec 0:real^1`]) THEN POP_ASSUM MP_TAC THEN
601   REWRITE_TAC[DIMINDEX_1] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
602   REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
603   REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
604   CONV_TAC REAL_RAT_REDUCE_CONV THEN
605   REWRITE_TAC[VECTOR_MUL_RNEG; VECTOR_NEG_NEG; VECTOR_MUL_RZERO;
606               VECTOR_ADD_LID; VECTOR_NEG_0; VECTOR_ADD_RID;
607               VECTOR_ARITH `&1 / &2 % x + &1 / &2 % x = x:real^N`] THEN
608   REWRITE_TAC[DROP_CMUL; DROP_ADD; DROP_NEG; DROP_VEC; VECTOR_MUL_ASSOC] THEN
609   REWRITE_TAC[VECTOR_ARITH `x % (a + b) + y % b = x % a + (x + y) % b`;
610               VECTOR_ARITH `x % a + y % (a + b) = (x + y) % a + y % b`] THEN
611   REWRITE_TAC[REAL_ARITH `(&1 - (&2 * x + --(&1))) * inv(&2) = &1 - x`;
612               REAL_ARITH `&1 - x + &2 * x + --(&1) = x`;
613               REAL_ARITH `&1 - &2 * x + (&2 * x) * inv(&2) = &1 - x`;
614               REAL_ARITH `(&2 * x) * inv(&2) = x`] THEN
615   REWRITE_TAC[VECTOR_ARITH `b - inv(&2) % (a + b) = inv(&2) % (b - a)`;
616               VECTOR_ARITH `inv(&2) % (a + b) - a = inv(&2) % (b - a)`] THEN
617   REPEAT(DISCH_THEN(MP_TAC o SPEC `&2` o MATCH_MP HAS_INTEGRAL_CMUL) THEN
618          REWRITE_TAC[COMPLEX_CMUL; SIMPLE_COMPLEX_ARITH
619           `Cx(&2) * Cx(&1 / &2) * j = j /\
620            Cx(&2) * (a * Cx(inv(&2)) * b) = a * b`] THEN DISCH_TAC) THEN
621   MATCH_MP_TAC HAS_INTEGRAL_COMBINE THEN
622   EXISTS_TAC `&1 / &2 % vec 1:real^1` THEN ASM_REWRITE_TAC[] THEN
623   REWRITE_TAC[DROP_CMUL; DROP_VEC] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
624   CONJ_TAC THEN
625   FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE
626    [TAUT `a1 /\ a2 /\ b ==> c <=> b ==> a1 /\ a2 ==> c`]
627    HAS_INTEGRAL_SPIKE_FINITE)) THENL
628    [MP_TAC(REWRITE_RULE[valid_path] (ASSUME `valid_path g1`));
629     MP_TAC(REWRITE_RULE[valid_path] (ASSUME `valid_path g2`))] THEN
630   REWRITE_TAC[piecewise_differentiable_on] THEN
631   DISCH_THEN(MP_TAC o CONJUNCT2) THEN
632   DISCH_THEN(X_CHOOSE_THEN `s:real^1->bool` STRIP_ASSUME_TAC) THENL
633    [EXISTS_TAC `((&1 / &2) % vec 1) INSERT {x:real^1 | (&2 % x) IN s}`;
634     EXISTS_TAC `((&1 / &2) % vec 1) INSERT
635                 {x:real^1 | (&2 % x - vec 1) IN s}`] THEN
636   (CONJ_TAC THENL
637     [REWRITE_TAC[FINITE_INSERT] THEN MATCH_MP_TAC FINITE_IMAGE_INJ THEN
638      ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC;
639      ALL_TAC]) THEN
640   ASM_SIMP_TAC[FINITE_IMAGE; FINITE_INSERT; IN_DIFF; IN_INSERT; DE_MORGAN_THM;
641               joinpaths; IN_INTERVAL_1; DROP_VEC; DROP_CMUL; GSYM DROP_EQ] THEN
642   SIMP_TAC[REAL_LT_IMP_LE; REAL_MUL_RID; IN_ELIM_THM;
643          REAL_ARITH `&1 / &2 <= x /\ ~(x = &1 / &2) ==> ~(x <= &1 / &2)`] THEN
644   REWRITE_TAC[LIFT_CMUL; LIFT_SUB; LIFT_DROP; LIFT_NUM; GSYM VECTOR_SUB] THEN
645   X_GEN_TAC `x:real^1` THEN STRIP_TAC THEN
646   MATCH_MP_TAC(COMPLEX_RING `x = Cx(&2) * y ==> g * x = Cx(&2) * g * y`) THEN
647   MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
648   MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_TRANSFORM_AT THENL
649    [EXISTS_TAC `(\x. g1(&2 % x)):real^1->complex`;
650     EXISTS_TAC `(\x. g2(&2 % x - vec 1)):real^1->complex`] THEN
651   EXISTS_TAC `abs(drop x - &1 / &2)` THEN
652   REWRITE_TAC[DIST_REAL; GSYM drop; GSYM REAL_ABS_NZ] THEN
653   ASM_SIMP_TAC[REAL_LT_IMP_NE; REAL_SUB_0] THEN
654   (CONJ_TAC THENL
655     [GEN_TAC THEN COND_CASES_TAC THEN REWRITE_TAC[] THEN
656      ASM_REAL_ARITH_TAC;
657      ALL_TAC]) THEN
658   GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
659   REWRITE_TAC[GSYM COMPLEX_CMUL] THEN
660   SUBST1_TAC(SYM(SPEC `2` DROP_VEC)) THEN
661   MATCH_MP_TAC VECTOR_DIFF_CHAIN_AT THEN
662   (CONJ_TAC THENL
663     [TRY(GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_SUB_RZERO] THEN
664          MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_SUB THEN
665          REWRITE_TAC[HAS_VECTOR_DERIVATIVE_CONST]) THEN
666      REWRITE_TAC[has_vector_derivative] THEN
667      MATCH_MP_TAC(MESON[HAS_DERIVATIVE_LINEAR]
668       `f = g /\ linear f ==> (f has_derivative g) net`) THEN
669      REWRITE_TAC[linear; FUN_EQ_THM; DROP_VEC] THEN
670      REWRITE_TAC[GSYM DROP_EQ; DROP_ADD; DROP_CMUL; DROP_VEC] THEN
671      REAL_ARITH_TAC;
672      REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
673      FIRST_X_ASSUM MATCH_MP_TAC THEN
674      ASM_SIMP_TAC[IN_DIFF; IN_INTERVAL_1; DROP_SUB; DROP_CMUL; DROP_VEC] THEN
675      ASM_REAL_ARITH_TAC]));;
676
677 let PATH_INTEGRABLE_JOIN = prove
678  (`!f g1 g2.
679         valid_path g1 /\ valid_path g2
680         ==> (f path_integrable_on (g1 ++ g2) <=>
681              f path_integrable_on g1 /\ f path_integrable_on g2)`,
682   REPEAT STRIP_TAC THEN EQ_TAC THENL
683    [ALL_TAC;
684     REWRITE_TAC[path_integrable_on] THEN
685     ASM_MESON_TAC[HAS_PATH_INTEGRAL_JOIN]] THEN
686   RULE_ASSUM_TAC(REWRITE_RULE[valid_path]) THEN
687   REWRITE_TAC[PATH_INTEGRABLE_ON; joinpaths] THEN REPEAT STRIP_TAC THEN
688   FIRST_X_ASSUM(MP_TAC o MATCH_MP
689    (REWRITE_RULE[IMP_CONJ] INTEGRABLE_ON_SUBINTERVAL))
690   THENL
691    [DISCH_THEN(MP_TAC o SPECL [`lift(&0)`; `lift(&1 / &2)`]);
692     DISCH_THEN(MP_TAC o SPECL [`lift(&1 / &2)`; `lift(&1)`])] THEN
693   REWRITE_TAC[SUBSET_INTERVAL_1; DROP_VEC; LIFT_DROP] THEN
694   CONV_TAC REAL_RAT_REDUCE_CONV THEN
695   DISCH_THEN(MP_TAC o MATCH_MP
696    (REWRITE_RULE[IMP_CONJ] INTEGRABLE_AFFINITY))
697   THENL
698    [DISCH_THEN(MP_TAC o SPECL [`&1 / &2`; `vec 0:real^1`]);
699     DISCH_THEN(MP_TAC o SPECL [`&1 / &2`; `lift(&1 / &2)`])] THEN
700   REWRITE_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
701   REWRITE_TAC[IMAGE_AFFINITY_INTERVAL; INTERVAL_EQ_EMPTY_1] THEN
702   REWRITE_TAC[LIFT_DROP; LIFT_NUM; VECTOR_MUL_RZERO; VECTOR_NEG_0;
703               GSYM LIFT_CMUL; VECTOR_ADD_RID; VECTOR_MUL_RNEG] THEN
704   CONV_TAC REAL_RAT_REDUCE_CONV THEN REWRITE_TAC[LIFT_NUM] THEN
705   REWRITE_TAC[VECTOR_ARITH `vec 2 + --vec 1:real^1 = vec 1`;
706               VECTOR_ARITH `vec 1 + --vec 1:real^1 = vec 0`] THEN
707   DISCH_THEN(MP_TAC o SPEC `&1 / &2` o MATCH_MP INTEGRABLE_CMUL) THEN
708   REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_SPIKE_FINITE THEN
709   REWRITE_TAC[IN_DIFF; IN_INTERVAL_1; DROP_VEC; DROP_CMUL; DROP_ADD;
710               LIFT_DROP; COMPLEX_CMUL] THEN
711   REWRITE_TAC[COMPLEX_RING `a * b = Cx(&1 / &2) * x * y <=>
712                                 x * y = a * Cx(&2) * b`]
713   THENL
714    [UNDISCH_TAC `(g1:real^1->complex) piecewise_differentiable_on
715                         interval[vec 0,vec 1]`;
716     UNDISCH_TAC `(g2:real^1->complex) piecewise_differentiable_on
717                         interval[vec 0,vec 1]`] THEN
718   REWRITE_TAC[piecewise_differentiable_on] THEN
719   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
720   DISCH_THEN(X_CHOOSE_THEN `s:real^1->bool` STRIP_ASSUME_TAC) THEN
721   EXISTS_TAC `(vec 0:real^1) INSERT (vec 1) INSERT s` THEN
722   ASM_REWRITE_TAC[FINITE_INSERT; IN_INSERT; DE_MORGAN_THM] THEN
723   REWRITE_TAC[GSYM DROP_EQ; DROP_VEC] THEN X_GEN_TAC `t:real^1` THEN
724   STRIP_TAC THEN BINOP_TAC THENL
725    [AP_TERM_TAC THEN
726     ASM_SIMP_TAC[REAL_ARITH `x <= &1 ==> &1 / &2 * x <= &1 / &2`] THEN
727     AP_TERM_TAC THEN VECTOR_ARITH_TAC;
728     ALL_TAC;
729     AP_TERM_TAC THEN ASM_SIMP_TAC[REAL_ARITH
730      `&0 <= t /\ ~(t = &0) ==> ~(&1 / &2 * t + &1 / &2 <= &1 / &2)`] THEN
731     AP_TERM_TAC THEN
732     REWRITE_TAC[GSYM DROP_EQ; DROP_CMUL; DROP_ADD; DROP_SUB; LIFT_DROP] THEN
733     REWRITE_TAC[DROP_VEC] THEN REAL_ARITH_TAC;
734     ALL_TAC] THEN
735   MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
736   MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_TRANSFORM_AT THENL
737    [EXISTS_TAC `(\x. g1(&2 % x)):real^1->complex` THEN
738     EXISTS_TAC `abs(drop t - &1) / &2` THEN
739     ASM_SIMP_TAC[REAL_ARITH `&0 < abs x / &2 <=> ~(x = &0)`; REAL_SUB_0] THEN
740     REWRITE_TAC[DIST_REAL; GSYM drop; DROP_CMUL] THEN
741     CONJ_TAC THENL
742      [ASM_MESON_TAC[REAL_ARITH
743        `t <= &1 /\ ~(t = &1) /\ abs(x - &1 / &2 * t) < abs(t - &1) / &2
744         ==> x <= &1 / &2`];
745       ALL_TAC];
746     EXISTS_TAC `(\x. g2(&2 % x - vec 1)):real^1->complex` THEN
747     EXISTS_TAC `abs(drop t) / &2` THEN
748     ASM_SIMP_TAC[REAL_ARITH `&0 < abs x / &2 <=> ~(x = &0)`; REAL_SUB_0] THEN
749     REWRITE_TAC[DIST_REAL; GSYM drop; DROP_CMUL; DROP_ADD; LIFT_DROP] THEN
750     CONJ_TAC THENL
751      [ASM_MESON_TAC[REAL_ARITH
752        `&0 <= t /\ abs(x - (&1 / &2 * t + &1 / &2)) < abs(t) / &2
753         ==> ~(x <= &1 / &2)`];
754       ALL_TAC]] THEN
755   GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
756   REWRITE_TAC[GSYM COMPLEX_CMUL] THEN
757   SUBST1_TAC(SYM(SPEC `2` DROP_VEC)) THEN
758   MATCH_MP_TAC VECTOR_DIFF_CHAIN_AT THEN
759   (CONJ_TAC THENL
760     [TRY(GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_SUB_RZERO] THEN
761          MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_SUB THEN
762          REWRITE_TAC[HAS_VECTOR_DERIVATIVE_CONST]) THEN
763      REWRITE_TAC[has_vector_derivative] THEN
764      MATCH_MP_TAC(MESON[HAS_DERIVATIVE_LINEAR]
765       `f = g /\ linear f ==> (f has_derivative g) net`) THEN
766      REWRITE_TAC[linear; FUN_EQ_THM; DROP_VEC] THEN
767      REWRITE_TAC[GSYM DROP_EQ; DROP_ADD; DROP_CMUL; DROP_VEC] THEN
768      REAL_ARITH_TAC;
769      MATCH_MP_TAC(MESON[VECTOR_DERIVATIVE_WORKS]
770        `f differentiable (at t) /\ t' = t
771         ==> (f has_vector_derivative
772                   (vector_derivative f (at t))) (at t')`) THEN
773      CONJ_TAC THENL
774       [FIRST_X_ASSUM MATCH_MP_TAC THEN
775        ASM_REWRITE_TAC[IN_DIFF; IN_INTERVAL_1; DROP_VEC];
776        ALL_TAC] THEN
777      REWRITE_TAC[GSYM DROP_EQ; DROP_CMUL; DROP_ADD; DROP_SUB; LIFT_DROP;
778                  DROP_VEC] THEN
779      REAL_ARITH_TAC]));;
780
781 let PATH_INTEGRAL_JOIN = prove
782  (`!f g1 g2:real^1->complex.
783         valid_path g1 /\ valid_path g2 /\
784         f path_integrable_on g1 /\ f path_integrable_on g2
785         ==> path_integral (g1 ++ g2) f =
786             path_integral g1 f + path_integral g2 f`,
787   MESON_TAC[PATH_INTEGRAL_UNIQUE; HAS_PATH_INTEGRAL_INTEGRAL;
788             HAS_PATH_INTEGRAL_JOIN]);;
789
790 (* ------------------------------------------------------------------------- *)
791 (* Reparametrizing to shift the starting point of a (closed) path.           *)
792 (* ------------------------------------------------------------------------- *)
793
794 let VALID_PATH_SHIFTPATH = prove
795  (`!g a. valid_path g /\ pathfinish g = pathstart g /\
796          a IN interval[vec 0,vec 1]
797          ==> valid_path(shiftpath a g)`,
798   REWRITE_TAC[valid_path; shiftpath; DROP_ADD; GSYM DROP_VEC] THEN
799   REWRITE_TAC[REAL_ARITH `a + x <= y <=> x <= y - a`; GSYM DROP_SUB] THEN
800   REPEAT STRIP_TAC THEN MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_CASES THEN
801   REPLICATE_TAC 2 (CONJ_TAC THENL
802    [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
803     REWRITE_TAC[DROP_SUB; DROP_VEC] THEN REAL_ARITH_TAC;
804     ALL_TAC]) THEN
805   RULE_ASSUM_TAC(REWRITE_RULE[pathstart; pathfinish]) THEN
806   ASM_REWRITE_TAC[VECTOR_ARITH `a + vec 1 - a - vec 1:real^1 = vec 0`;
807                   VECTOR_ARITH `a + vec 1 - a:real^1 = vec 1`] THEN
808   CONJ_TAC THENL
809    [ONCE_REWRITE_TAC[VECTOR_ARITH `a + x:real^1 = &1 % x + a`];
810     ONCE_REWRITE_TAC[VECTOR_ARITH
811      `a + x - vec 1:real^1 = &1 % x + (a - vec 1)`]] THEN
812   GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
813   MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_AFFINE THEN
814   MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_SUBSET THEN
815   EXISTS_TAC `interval[vec 0:real^1,vec 1]` THEN ASM_REWRITE_TAC[] THEN
816   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
817   REWRITE_TAC[IMAGE_AFFINITY_INTERVAL; REAL_POS; INTERVAL_EQ_EMPTY_1;
818               IN_INTERVAL_1; DROP_SUB; DROP_VEC] THEN
819   ONCE_REWRITE_TAC[COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN
820   REWRITE_TAC[EMPTY_SUBSET; SUBSET_INTERVAL_1; DROP_ADD; DROP_CMUL;
821               DROP_SUB; DROP_VEC] THEN
822   REAL_ARITH_TAC);;
823
824 let HAS_PATH_INTEGRAL_SHIFTPATH = prove
825  (`!f g i a.
826         (f has_path_integral i) g /\ valid_path g /\
827         a IN interval[vec 0,vec 1]
828         ==> (f has_path_integral i) (shiftpath a g)`,
829   REWRITE_TAC[HAS_PATH_INTEGRAL; IN_INTERVAL_1; DROP_VEC] THEN
830   REPEAT STRIP_TAC THEN
831   SUBGOAL_THEN
832    `i = integral (interval[a,vec 1])
833                  (\x. f ((g:real^1->real^2) x) * vector_derivative g (at x)) +
834         integral (interval[vec 0,a])
835                  (\x. f (g x) * vector_derivative g (at x))`
836   SUBST1_TAC THENL
837    [MATCH_MP_TAC(INST_TYPE [`:1`,`:M`; `:2`,`:N`] HAS_INTEGRAL_UNIQUE) THEN
838     MAP_EVERY EXISTS_TAC
839      [`\x. f ((g:real^1->real^2) x) * vector_derivative g (at x)`;
840       `interval[vec 0:real^1,vec 1]`] THEN
841     ONCE_REWRITE_TAC[COMPLEX_ADD_SYM] THEN ASM_REWRITE_TAC[] THEN
842     MATCH_MP_TAC HAS_INTEGRAL_COMBINE THEN EXISTS_TAC `a:real^1` THEN
843     ASM_REWRITE_TAC[DROP_VEC] THEN
844     CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_INTEGRAL THEN
845     MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
846     MAP_EVERY EXISTS_TAC [`vec 0:real^1`; `vec 1:real^1`] THEN
847     (CONJ_TAC THENL [ASM_MESON_TAC[integrable_on]; ALL_TAC]) THEN
848     REWRITE_TAC[DROP_SUB; DROP_VEC; SUBSET_INTERVAL_1] THEN
849     ASM_REAL_ARITH_TAC;
850     ALL_TAC] THEN
851   MATCH_MP_TAC HAS_INTEGRAL_COMBINE THEN EXISTS_TAC `vec 1 - a:real^1` THEN
852   ASM_REWRITE_TAC[DROP_SUB; DROP_VEC; REAL_SUB_LE;
853                   REAL_ARITH `&1 - x <= &1 <=> &0 <= x`] THEN
854   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [valid_path]) THEN
855   REWRITE_TAC[piecewise_differentiable_on] THEN
856   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
857   DISCH_THEN(X_CHOOSE_THEN `s:real^1->bool` STRIP_ASSUME_TAC) THEN
858   REWRITE_TAC[shiftpath] THEN CONJ_TAC THEN
859   MATCH_MP_TAC HAS_INTEGRAL_SPIKE_FINITE THENL
860    [EXISTS_TAC `\x. f(g(a + x)) * vector_derivative g (at(a + x))` THEN
861     EXISTS_TAC `(vec 1 - a) INSERT IMAGE (\x:real^1. x - a) s` THEN
862     ASM_SIMP_TAC[FINITE_IMAGE; FINITE_INSERT] THEN CONJ_TAC THENL
863      [X_GEN_TAC `x:real^1` THEN
864       REWRITE_TAC[IN_DIFF; IN_INTERVAL_1; IN_INSERT; IN_IMAGE; UNWIND_THM2;
865                   DROP_SUB; DROP_ADD; DROP_VEC; DE_MORGAN_THM;
866                   VECTOR_ARITH `x:real^1 = y - a <=> y = a + x`] THEN
867       REWRITE_TAC[GSYM DROP_EQ; DROP_ADD; DROP_VEC] THEN STRIP_TAC THEN
868       ASM_SIMP_TAC[REAL_ARITH `x <= &1 - a ==> a + x <= &1`] THEN
869       AP_TERM_TAC THEN MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
870       MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_TRANSFORM_AT THEN
871       MAP_EVERY EXISTS_TAC
872        [`\x. (g:real^1->complex)(a + x)`; `dist(vec 1 - a:real^1,x)`] THEN
873       SIMP_TAC[CONJ_ASSOC; dist; NORM_REAL; GSYM drop; DROP_VEC; DROP_SUB] THEN
874       CONJ_TAC THENL
875        [REPEAT STRIP_TAC THEN REPEAT COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
876         ASM_REAL_ARITH_TAC;
877         ALL_TAC] THEN
878       GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
879       GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_MUL_LID] THEN
880       REWRITE_TAC[GSYM DROP_VEC] THEN MATCH_MP_TAC VECTOR_DIFF_CHAIN_AT THEN
881       SUBST1_TAC(VECTOR_ARITH `vec 1:real^1 = vec 0 + vec 1`) THEN
882       SIMP_TAC[HAS_VECTOR_DERIVATIVE_ADD; HAS_VECTOR_DERIVATIVE_CONST;
883                HAS_VECTOR_DERIVATIVE_ID] THEN
884       REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
885       FIRST_X_ASSUM MATCH_MP_TAC THEN
886       ASM_REWRITE_TAC[IN_DIFF; IN_INTERVAL_1; DROP_VEC; DROP_ADD] THEN
887       ASM_REAL_ARITH_TAC;
888       ALL_TAC] THEN
889     SUBGOAL_THEN `(\x. f (g x) * vector_derivative g (at x)) integrable_on
890                   (interval [a,vec 1])`
891     MP_TAC THENL
892      [MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
893       MAP_EVERY EXISTS_TAC [`vec 0:real^1`; `vec 1:real^1`] THEN
894       CONJ_TAC THENL [ASM_MESON_TAC[integrable_on]; ALL_TAC] THEN
895       ASM_REWRITE_TAC[DROP_SUB; DROP_VEC; SUBSET_INTERVAL_1; REAL_LE_REFL];
896       ALL_TAC] THEN
897     DISCH_THEN(MP_TAC o C CONJ (REAL_ARITH `~(&1 = &0)`) o MATCH_MP
898       INTEGRABLE_INTEGRAL) THEN
899     DISCH_THEN(MP_TAC o SPEC `a:real^1` o MATCH_MP HAS_INTEGRAL_AFFINITY) THEN
900     REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
901     REWRITE_TAC[VECTOR_ARITH `&1 % x + a:real^1 = a + x`] THEN
902     REWRITE_TAC[REAL_INV_1; REAL_POS; REAL_ABS_NUM; REAL_POW_ONE] THEN
903     ASM_REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC; GSYM REAL_NOT_LE] THEN
904     REWRITE_TAC[VECTOR_MUL_LID; GSYM VECTOR_SUB; VECTOR_SUB_REFL];
905     EXISTS_TAC `\x. f(g(a + x - vec 1)) *
906                     vector_derivative g (at(a + x - vec 1))` THEN
907     EXISTS_TAC `(vec 1 - a) INSERT IMAGE (\x:real^1. x - a + vec 1) s` THEN
908     ASM_SIMP_TAC[FINITE_IMAGE; FINITE_INSERT] THEN CONJ_TAC THENL
909      [X_GEN_TAC `x:real^1` THEN
910       REWRITE_TAC[IN_DIFF; IN_INTERVAL_1; IN_INSERT; IN_IMAGE; UNWIND_THM2;
911                   DROP_SUB; DROP_ADD; DROP_VEC; DE_MORGAN_THM;
912                   VECTOR_ARITH `x:real^1 = y - a + z <=> y = a + (x - z)`] THEN
913       REWRITE_TAC[GSYM DROP_EQ; DROP_ADD; DROP_VEC; DROP_SUB] THEN
914       STRIP_TAC THEN
915       ASM_SIMP_TAC[REAL_ARITH
916        `&1 - a <= x /\ ~(x = &1 - a) ==> ~(a + x <= &1)`] THEN
917       AP_TERM_TAC THEN MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
918       MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_TRANSFORM_AT THEN
919       MAP_EVERY EXISTS_TAC
920        [`\x. (g:real^1->complex)(a + x - vec 1)`;
921         `dist(vec 1 - a:real^1,x)`] THEN
922       SIMP_TAC[CONJ_ASSOC; dist; NORM_REAL; GSYM drop; DROP_VEC; DROP_SUB] THEN
923       CONJ_TAC THENL
924        [REPEAT STRIP_TAC THEN REPEAT COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
925         ASM_REAL_ARITH_TAC;
926         ALL_TAC] THEN
927       GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
928       GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_MUL_LID] THEN
929       REWRITE_TAC[GSYM DROP_VEC] THEN MATCH_MP_TAC VECTOR_DIFF_CHAIN_AT THEN
930       CONJ_TAC THENL
931        [GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_ADD_LID] THEN
932         ONCE_REWRITE_TAC[VECTOR_ARITH
933          `a + x - vec 1:real^1 = (a - vec 1) + x`] THEN
934         SIMP_TAC[HAS_VECTOR_DERIVATIVE_ADD; HAS_VECTOR_DERIVATIVE_CONST;
935                  HAS_VECTOR_DERIVATIVE_ID];
936         ALL_TAC] THEN
937       REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
938       FIRST_X_ASSUM MATCH_MP_TAC THEN
939       ASM_SIMP_TAC[IN_DIFF; DROP_SUB; IN_INTERVAL_1; DROP_VEC; DROP_ADD] THEN
940       ASM_REAL_ARITH_TAC;
941       ALL_TAC] THEN
942     SUBGOAL_THEN `(\x. f (g x) * vector_derivative g (at x)) integrable_on
943                   (interval [vec 0,a])`
944     MP_TAC THENL
945      [MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
946       MAP_EVERY EXISTS_TAC [`vec 0:real^1`; `vec 1:real^1`] THEN
947       CONJ_TAC THENL [ASM_MESON_TAC[integrable_on]; ALL_TAC] THEN
948       ASM_REWRITE_TAC[DROP_SUB; DROP_VEC; SUBSET_INTERVAL_1; REAL_LE_REFL];
949       ALL_TAC] THEN
950     DISCH_THEN(MP_TAC o C CONJ (REAL_ARITH `~(&1 = &0)`) o MATCH_MP
951       INTEGRABLE_INTEGRAL) THEN
952     DISCH_THEN(MP_TAC o SPEC `a - vec 1:real^1` o
953       MATCH_MP HAS_INTEGRAL_AFFINITY) THEN
954     REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
955     REWRITE_TAC[VECTOR_ARITH `&1 % x + a - vec 1:real^1 = a + x - vec 1`] THEN
956     REWRITE_TAC[REAL_INV_1; REAL_POS; REAL_ABS_NUM; REAL_POW_ONE] THEN
957     ASM_REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC; GSYM REAL_NOT_LE] THEN
958     REWRITE_TAC[VECTOR_MUL_LID;
959                 VECTOR_ARITH `vec 0 + --(a - vec 1):real^1 = vec 1 - a`;
960                 VECTOR_ARITH `a + --(a - vec 1):real^1 = vec 1`]]);;
961
962 let HAS_PATH_INTEGRAL_SHIFTPATH_EQ = prove
963  (`!f g i a.
964         valid_path g /\ pathfinish g = pathstart g /\
965         a IN interval[vec 0,vec 1]
966         ==> ((f has_path_integral i) (shiftpath a g) <=>
967              (f has_path_integral i) g)`,
968   REPEAT STRIP_TAC THEN EQ_TAC THEN STRIP_TAC THEN
969   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_SHIFTPATH] THEN
970   SUBGOAL_THEN
971    `(f has_path_integral i) (shiftpath (vec 1 - a) (shiftpath a g))`
972   MP_TAC THENL
973    [MATCH_MP_TAC HAS_PATH_INTEGRAL_SHIFTPATH THEN
974     ASM_SIMP_TAC[VALID_PATH_SHIFTPATH] THEN REPEAT(POP_ASSUM MP_TAC) THEN
975     REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; DROP_SUB] THEN REAL_ARITH_TAC;
976     ALL_TAC] THEN
977   REWRITE_TAC[HAS_PATH_INTEGRAL] THEN MATCH_MP_TAC EQ_IMP THEN
978   MATCH_MP_TAC HAS_INTEGRAL_SPIKE_FINITE_EQ THEN
979   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [valid_path]) THEN
980   REWRITE_TAC[piecewise_differentiable_on] THEN
981   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
982   DISCH_THEN(X_CHOOSE_THEN `s:real^1->bool` STRIP_ASSUME_TAC) THEN
983   EXISTS_TAC `(s:real^1->bool) UNION {vec 0,vec 1}` THEN
984   ASM_SIMP_TAC[FINITE_UNION; FINITE_RULES] THEN
985   REWRITE_TAC[SET_RULE `s DIFF (t UNION u) = (s DIFF u) DIFF t`] THEN
986   REWRITE_TAC[GSYM OPEN_CLOSED_INTERVAL_1] THEN X_GEN_TAC `x:real^1` THEN
987   STRIP_TAC THEN   BINOP_TAC THEN CONV_TAC SYM_CONV THENL
988    [AP_TERM_TAC THEN MATCH_MP_TAC SHIFTPATH_SHIFTPATH THEN ASM_SIMP_TAC[] THEN
989     ASM_MESON_TAC[INTERVAL_OPEN_SUBSET_CLOSED; SUBSET; IN_DIFF];
990     ALL_TAC] THEN
991   MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
992   MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
993   MAP_EVERY EXISTS_TAC
994    [`g:real^1->real^2`; `interval(vec 0,vec 1) DIFF s:real^1->bool`] THEN
995   ASM_SIMP_TAC[GSYM VECTOR_DERIVATIVE_WORKS; OPEN_DIFF; FINITE_IMP_CLOSED;
996                OPEN_INTERVAL] THEN
997   REPEAT STRIP_TAC THENL
998    [CONV_TAC SYM_CONV THEN MATCH_MP_TAC SHIFTPATH_SHIFTPATH;
999     FIRST_X_ASSUM MATCH_MP_TAC] THEN
1000   ASM_MESON_TAC[INTERVAL_OPEN_SUBSET_CLOSED; SUBSET; IN_DIFF]);;
1001
1002 let PATH_INTEGRAL_SHIFTPATH = prove
1003  (`!f g a. valid_path g /\ pathfinish g = pathstart g /\
1004            a IN interval[vec 0,vec 1]
1005            ==> path_integral (shiftpath a g) f = path_integral g f`,
1006   SIMP_TAC[path_integral; HAS_PATH_INTEGRAL_SHIFTPATH_EQ]);;
1007
1008 (* ------------------------------------------------------------------------- *)
1009 (* More about straight-line paths.                                           *)
1010 (* ------------------------------------------------------------------------- *)
1011
1012 let HAS_VECTOR_DERIVATIVE_LINEPATH_WITHIN = prove
1013  (`!a b:complex x s.
1014     (linepath(a,b) has_vector_derivative (b - a)) (at x within s)`,
1015   REPEAT GEN_TAC THEN REWRITE_TAC[linepath; has_vector_derivative] THEN
1016   ONCE_REWRITE_TAC[VECTOR_ARITH `u % (b - a) = vec 0 + u % (b - a)`] THEN
1017   REWRITE_TAC[VECTOR_ARITH `(&1 - u) % a + u % b = a + u % (b - a)`] THEN
1018   MATCH_MP_TAC HAS_DERIVATIVE_ADD THEN REWRITE_TAC[HAS_DERIVATIVE_CONST] THEN
1019   MATCH_MP_TAC HAS_DERIVATIVE_VMUL_DROP THEN REWRITE_TAC[HAS_DERIVATIVE_ID]);;
1020
1021 let HAS_VECTOR_DERIVATIVE_LINEPATH_AT = prove
1022  (`!a b:complex x.
1023     (linepath(a,b) has_vector_derivative (b - a)) (at x)`,
1024   MESON_TAC[WITHIN_UNIV; HAS_VECTOR_DERIVATIVE_LINEPATH_WITHIN]);;
1025
1026 let VALID_PATH_LINEPATH = prove
1027  (`!a b. valid_path(linepath(a,b))`,
1028   REPEAT GEN_TAC THEN REWRITE_TAC[valid_path] THEN
1029   MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
1030   REWRITE_TAC[differentiable_on; differentiable] THEN
1031   MESON_TAC[HAS_VECTOR_DERIVATIVE_LINEPATH_WITHIN; has_vector_derivative]);;
1032
1033 let VECTOR_DERIVATIVE_LINEPATH_WITHIN = prove
1034  (`!a b x. x IN interval[vec 0,vec 1]
1035            ==> vector_derivative (linepath(a,b))
1036                 (at x within interval[vec 0,vec 1]) = b - a`,
1037   REPEAT STRIP_TAC THEN
1038   MATCH_MP_TAC VECTOR_DERIVATIVE_WITHIN_CLOSED_INTERVAL THEN
1039   ASM_REWRITE_TAC[HAS_VECTOR_DERIVATIVE_LINEPATH_WITHIN] THEN
1040   REWRITE_TAC[DROP_VEC; REAL_LT_01]);;
1041
1042 let VECTOR_DERIVATIVE_LINEPATH_AT = prove
1043  (`!a b x. vector_derivative (linepath(a,b)) (at x) = b - a`,
1044   REPEAT STRIP_TAC THEN
1045   MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
1046   ASM_REWRITE_TAC[HAS_VECTOR_DERIVATIVE_LINEPATH_AT]);;
1047
1048 let HAS_PATH_INTEGRAL_LINEPATH = prove
1049  (`!f i a b. (f has_path_integral i) (linepath(a,b)) <=>
1050              ((\x. f(linepath(a,b) x) * (b - a)) has_integral i)
1051              (interval[vec 0,vec 1])`,
1052   REPEAT GEN_TAC THEN REWRITE_TAC[has_path_integral] THEN
1053   MATCH_MP_TAC HAS_INTEGRAL_EQ_EQ THEN
1054   SIMP_TAC[VECTOR_DERIVATIVE_LINEPATH_WITHIN]);;
1055
1056 let LINEPATH_IN_PATH = prove
1057  (`!x. x IN interval[vec 0,vec 1] ==> linepath(a,b) x IN segment[a,b]`,
1058   REWRITE_TAC[segment; linepath; IN_ELIM_THM; IN_INTERVAL_1; DROP_VEC] THEN
1059   MESON_TAC[]);;
1060
1061 let RE_LINEPATH_CX = prove
1062  (`!a b x. Re(linepath(Cx a,Cx b) x) = (&1 - drop x) * a + drop x * b`,
1063   REWRITE_TAC[linepath; RE_ADD; COMPLEX_CMUL; RE_MUL_CX; RE_CX]);;
1064
1065 let IM_LINEPATH_CX = prove
1066  (`!a b x. Im(linepath(Cx a,Cx b) x) = &0`,
1067   REWRITE_TAC[linepath; IM_ADD; COMPLEX_CMUL; IM_MUL_CX; IM_CX] THEN
1068   REAL_ARITH_TAC);;
1069
1070 let LINEPATH_CX = prove
1071  (`!a b x. linepath(Cx a,Cx b) x = Cx((&1 - drop x) * a + drop x * b)`,
1072   REWRITE_TAC[COMPLEX_EQ; RE_LINEPATH_CX; IM_LINEPATH_CX; RE_CX; IM_CX]);;
1073
1074 let HAS_PATH_INTEGRAL_TRIVIAL = prove
1075  (`!f a. (f has_path_integral (Cx(&0))) (linepath(a,a))`,
1076   REWRITE_TAC[HAS_PATH_INTEGRAL_LINEPATH; COMPLEX_SUB_REFL;
1077               COMPLEX_MUL_RZERO] THEN
1078   REWRITE_TAC[GSYM COMPLEX_VEC_0; HAS_INTEGRAL_0]);;
1079
1080 let PATH_INTEGRAL_TRIVIAL = prove
1081  (`!f a. path_integral (linepath(a,a)) f = Cx(&0)`,
1082   MESON_TAC[HAS_PATH_INTEGRAL_TRIVIAL; PATH_INTEGRAL_UNIQUE]);;
1083
1084 (* ------------------------------------------------------------------------- *)
1085 (* Relation to subpath construction.                                         *)
1086 (* ------------------------------------------------------------------------- *)
1087
1088 let VALID_PATH_SUBPATH = prove
1089  (`!g u v. valid_path g /\
1090            u IN interval[vec 0,vec 1] /\ v IN interval[vec 0,vec 1]
1091            ==> valid_path(subpath u v g)`,
1092   SIMP_TAC[valid_path; PATH_SUBPATH] THEN
1093   REPEAT STRIP_TAC THEN REWRITE_TAC[subpath] THEN
1094   ASM_CASES_TAC `v:real^1 = u` THENL
1095    [MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
1096     ASM_REWRITE_TAC[VECTOR_SUB_REFL; VECTOR_MUL_LZERO; DROP_VEC] THEN
1097     REWRITE_TAC[DIFFERENTIABLE_ON_CONST];
1098     MATCH_MP_TAC(REWRITE_RULE[o_DEF] PIECEWISE_DIFFERENTIABLE_COMPOSE) THEN
1099     REPEAT CONJ_TAC THENL
1100      [MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
1101       MATCH_MP_TAC DIFFERENTIABLE_AT_IMP_DIFFERENTIABLE_ON THEN
1102       REPEAT STRIP_TAC THEN MATCH_MP_TAC DIFFERENTIABLE_ADD THEN
1103       REWRITE_TAC[DIFFERENTIABLE_CONST] THEN
1104       MATCH_MP_TAC DIFFERENTIABLE_CMUL THEN REWRITE_TAC[DIFFERENTIABLE_ID];
1105       MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_SUBSET THEN
1106       EXISTS_TAC `interval[vec 0:real^1,vec 1]` THEN ASM_REWRITE_TAC[] THEN
1107       ONCE_REWRITE_TAC[VECTOR_ADD_SYM] THEN
1108       REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
1109       REPEAT(COND_CASES_TAC THEN REWRITE_TAC[EMPTY_SUBSET]) THEN
1110       REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1])) THEN
1111       SIMP_TAC[SUBSET_INTERVAL_1; DROP_ADD; DROP_CMUL; DROP_SUB; DROP_VEC] THEN
1112       REAL_ARITH_TAC;
1113       REWRITE_TAC[GSYM DROP_EQ; DROP_CMUL; DROP_ADD; DROP_SUB] THEN
1114       ASM_SIMP_TAC[DROP_EQ; REAL_FIELD `~(u:real = v) ==>
1115         (u + (v - u) * x = b <=> x = (b - u) / (v - u))`] THEN
1116       X_GEN_TAC `b:real^1` THEN MATCH_MP_TAC FINITE_SUBSET THEN
1117       EXISTS_TAC `{lift((drop b - drop u) / (drop v - drop u))}` THEN
1118       REWRITE_TAC[FINITE_INSERT; FINITE_EMPTY; SUBSET; IN_ELIM_THM] THEN
1119       SIMP_TAC[GSYM LIFT_EQ; LIFT_DROP; IN_SING]]]);;
1120
1121 let HAS_PATH_INTEGRAL_SUBPATH_REFL = prove
1122  (`!f g u. (f has_path_integral (Cx(&0))) (subpath u u g)`,
1123   REWRITE_TAC[HAS_PATH_INTEGRAL; subpath; VECTOR_SUB_REFL] THEN
1124   REWRITE_TAC[DROP_VEC; VECTOR_MUL_LZERO; VECTOR_DERIVATIVE_CONST_AT] THEN
1125   REWRITE_TAC[COMPLEX_VEC_0; COMPLEX_MUL_RZERO] THEN
1126   REWRITE_TAC[GSYM COMPLEX_VEC_0; HAS_INTEGRAL_0]);;
1127
1128 let PATH_INTEGRABLE_SUBPATH_REFL = prove
1129  (`!f g u. f path_integrable_on (subpath u u g)`,
1130   REWRITE_TAC[path_integrable_on] THEN
1131   MESON_TAC[HAS_PATH_INTEGRAL_SUBPATH_REFL]);;
1132
1133 let PATH_INTEGRAL_SUBPATH_REFL = prove
1134  (`!f g u. path_integral (subpath u u g) f = Cx(&0)`,
1135   MESON_TAC[PATH_INTEGRAL_UNIQUE; HAS_PATH_INTEGRAL_SUBPATH_REFL]);;
1136
1137 let HAS_PATH_INTEGRAL_SUBPATH = prove
1138  (`!f g u v.
1139         valid_path g /\ f path_integrable_on g /\
1140         u IN interval[vec 0,vec 1] /\ v IN interval[vec 0,vec 1] /\
1141         drop u <= drop v
1142         ==> (f has_path_integral
1143              integral (interval[u,v])
1144                       (\x. f(g x) * vector_derivative g (at x)))
1145             (subpath u v g)`,
1146   REWRITE_TAC[path_integrable_on; HAS_PATH_INTEGRAL; subpath] THEN
1147   REWRITE_TAC[GSYM integrable_on] THEN REPEAT STRIP_TAC THEN
1148   ASM_CASES_TAC `v:real^1 = u` THENL
1149    [ASM_REWRITE_TAC[INTEGRAL_REFL; VECTOR_SUB_REFL; DROP_VEC] THEN
1150     REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_DERIVATIVE_CONST_AT] THEN
1151     REWRITE_TAC[COMPLEX_VEC_0; COMPLEX_MUL_RZERO] THEN
1152     REWRITE_TAC[GSYM COMPLEX_VEC_0; HAS_INTEGRAL_0];
1153     SUBGOAL_THEN `drop u < drop v` ASSUME_TAC THENL
1154      [ASM_REWRITE_TAC[REAL_LT_LE; DROP_EQ]; ALL_TAC]] THEN
1155   FIRST_X_ASSUM(MP_TAC o SPECL [`u:real^1`; `v:real^1`] o
1156    MATCH_MP(REWRITE_RULE[IMP_CONJ] INTEGRABLE_ON_SUBINTERVAL)) THEN
1157   ANTS_TAC THENL
1158    [ASM_MESON_TAC[SUBSET_INTERVAL_1; IN_INTERVAL_1; REAL_LT_IMP_LE];
1159     REWRITE_TAC[HAS_INTEGRAL_INTEGRAL]] THEN
1160   DISCH_THEN(MP_TAC o SPECL [`drop(v - u)`; `u:real^1`] o
1161    MATCH_MP(REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_AFFINITY)) THEN
1162   ASM_SIMP_TAC[DROP_SUB; REAL_ARITH `u < v ==> ~(v - u = &0)`] THEN
1163   REWRITE_TAC[IMAGE_AFFINITY_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_SUB] THEN
1164   ASM_SIMP_TAC[REAL_LE_INV_EQ; REAL_ARITH `u < v ==> ~(v < u) /\ &0 <= v - u`;
1165                VECTOR_ARITH `a % u + --(a % v):real^N = a % (u - v)`] THEN
1166   REWRITE_TAC[VECTOR_SUB_REFL; VECTOR_MUL_RZERO] THEN
1167   SUBGOAL_THEN `inv(drop v - drop u) % (v - u) = vec 1` SUBST1_TAC THENL
1168    [REWRITE_TAC[GSYM DROP_EQ; DROP_VEC; DROP_CMUL; DROP_SUB] THEN
1169     UNDISCH_TAC `drop u < drop v` THEN CONV_TAC REAL_FIELD;
1170     ALL_TAC] THEN
1171   DISCH_THEN(MP_TAC o SPEC `drop(v - u)` o MATCH_MP HAS_INTEGRAL_CMUL) THEN
1172   ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE; REAL_SUB_LE] THEN
1173   REWRITE_TAC[DIMINDEX_1; REAL_POW_1; VECTOR_MUL_ASSOC; DROP_SUB] THEN
1174   ASM_SIMP_TAC[REAL_FIELD `u < v ==> (v - u) * inv(v - u) = &1`] THEN
1175   REWRITE_TAC[VECTOR_MUL_LID] THEN
1176   MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
1177     HAS_INTEGRAL_SPIKE_FINITE) THEN
1178   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [valid_path]) THEN
1179   REWRITE_TAC[piecewise_differentiable_on; IN_DIFF] THEN
1180   DISCH_THEN(X_CHOOSE_THEN `k:real^1->bool` STRIP_ASSUME_TAC o CONJUNCT2) THEN
1181   EXISTS_TAC `{t | ((drop v - drop u) % t + u) IN k}` THEN CONJ_TAC THENL
1182    [MATCH_MP_TAC FINITE_IMAGE_INJ THEN
1183     ASM_REWRITE_TAC[GSYM DROP_EQ; DROP_CMUL; DROP_SUB; DROP_ADD] THEN
1184     UNDISCH_TAC `drop u < drop v` THEN CONV_TAC REAL_FIELD;
1185     ALL_TAC] THEN
1186   ASM_REWRITE_TAC[IN_DIFF; IN_ELIM_THM] THEN
1187   X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN REWRITE_TAC[COMPLEX_CMUL] THEN
1188   ONCE_REWRITE_TAC[COMPLEX_RING `a * b * c:complex = b * a * c`] THEN
1189   REWRITE_TAC[VECTOR_ARITH `x + a % y:real^N = a % y + x`] THEN
1190   AP_TERM_TAC THEN REWRITE_TAC[GSYM COMPLEX_CMUL; GSYM DROP_SUB] THEN
1191   MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_UNIQUE_AT THEN
1192   MATCH_MP_TAC(REWRITE_RULE[o_DEF] VECTOR_DIFF_CHAIN_AT) THEN
1193   REWRITE_TAC[DROP_SUB] THEN CONJ_TAC THENL
1194    [SUBST1_TAC(VECTOR_ARITH `v - u:real^1 = (v - u) + vec 0`) THEN
1195     MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_ADD THEN
1196     REWRITE_TAC[HAS_VECTOR_DERIVATIVE_CONST] THEN
1197     SUBST1_TAC(MESON[LIFT_DROP; LIFT_EQ_CMUL]
1198      `v - u = drop(v - u) % vec 1`) THEN REWRITE_TAC[GSYM DROP_SUB] THEN
1199     MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_CMUL THEN
1200     REWRITE_TAC[HAS_VECTOR_DERIVATIVE_ID];
1201     REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
1202     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_INTERVAL_1] THEN
1203     REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1])) THEN
1204     REWRITE_TAC[DROP_ADD; DROP_SUB; DROP_CMUL; DROP_VEC] THEN
1205     REPEAT STRIP_TAC THENL
1206      [MATCH_MP_TAC REAL_LE_ADD THEN CONJ_TAC THEN
1207       TRY(MATCH_MP_TAC REAL_LE_MUL) THEN ASM_REAL_ARITH_TAC;
1208       MATCH_MP_TAC REAL_LE_TRANS THEN
1209       EXISTS_TAC `(drop v - drop u) * &1 + drop u` THEN
1210       ASM_SIMP_TAC[REAL_LE_RADD; REAL_LE_LMUL;
1211                    REAL_SUB_LE; REAL_LT_IMP_LE] THEN
1212       ASM_REAL_ARITH_TAC]]);;
1213
1214 let PATH_INTEGRABLE_SUBPATH = prove
1215  (`!f g u v.
1216         valid_path g /\ f path_integrable_on g /\
1217         u IN interval[vec 0,vec 1] /\ v IN interval[vec 0,vec 1]
1218         ==> f path_integrable_on (subpath u v g)`,
1219   REPEAT STRIP_TAC THEN DISJ_CASES_TAC(REAL_ARITH
1220    `drop u <= drop v \/ drop v <= drop u`)
1221   THENL
1222    [ASM_MESON_TAC[path_integrable_on; HAS_PATH_INTEGRAL_SUBPATH];
1223     ONCE_REWRITE_TAC[GSYM REVERSEPATH_SUBPATH] THEN
1224     MATCH_MP_TAC PATH_INTEGRABLE_REVERSEPATH THEN
1225     ASM_SIMP_TAC[VALID_PATH_SUBPATH] THEN
1226     ASM_MESON_TAC[path_integrable_on; HAS_PATH_INTEGRAL_SUBPATH]]);;
1227
1228 let HAS_INTEGRAL_PATH_INTEGRAL_SUBPATH = prove
1229  (`!f g u v.
1230         valid_path g /\ f path_integrable_on g /\
1231         u IN interval[vec 0,vec 1] /\ v IN interval[vec 0,vec 1] /\
1232         drop u <= drop v
1233         ==> (((\x. f(g x) * vector_derivative g (at x))) has_integral
1234              path_integral (subpath u v g) f)
1235             (interval[u,v])`,
1236   REPEAT STRIP_TAC THEN
1237   REWRITE_TAC[HAS_INTEGRAL_INTEGRABLE_INTEGRAL] THEN CONJ_TAC THENL
1238    [MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
1239     EXISTS_TAC `interval[vec 0:real^1,vec 1]` THEN
1240     ASM_REWRITE_TAC[GSYM PATH_INTEGRABLE_ON; SUBSET_INTERVAL_1] THEN
1241     ASM_MESON_TAC[IN_INTERVAL_1];
1242     CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1243     ASM_SIMP_TAC[HAS_PATH_INTEGRAL_SUBPATH]]);;
1244
1245 let PATH_INTEGRAL_SUBPATH_INTEGRAL = prove
1246  (`!f g u v.
1247         valid_path g /\ f path_integrable_on g /\
1248         u IN interval[vec 0,vec 1] /\ v IN interval[vec 0,vec 1] /\
1249         drop u <= drop v
1250         ==> path_integral (subpath u v g) f =
1251             integral (interval[u,v])
1252                      (\x. f(g x) * vector_derivative g (at x))`,
1253   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1254   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_SUBPATH]);;
1255
1256 let PATH_INTEGRAL_SUBPATH_COMBINE = prove
1257  (`!f g u v w.
1258         valid_path g /\ f path_integrable_on g /\
1259         u IN interval[vec 0,vec 1] /\
1260         v IN interval[vec 0,vec 1] /\
1261         w IN interval[vec 0,vec 1]
1262         ==> path_integral (subpath u v g) f + path_integral (subpath v w g) f =
1263             path_integral (subpath u w g) f`,
1264   REPLICATE_TAC 3 GEN_TAC THEN
1265   SUBGOAL_THEN
1266    `!u v w.
1267         drop u <= drop v /\ drop v <= drop w
1268         ==> valid_path g /\ f path_integrable_on g /\
1269             u IN interval[vec 0,vec 1] /\
1270             v IN interval[vec 0,vec 1] /\
1271             w IN interval[vec 0,vec 1]
1272             ==> path_integral (subpath u v g) f +
1273                 path_integral (subpath v w g) f =
1274                 path_integral (subpath u w g) f`
1275   ASSUME_TAC THENL
1276    [ALL_TAC;
1277     REPEAT STRIP_TAC THEN REPEAT_TCL DISJ_CASES_THEN ASSUME_TAC
1278      (REAL_ARITH `drop u <= drop v /\ drop v <= drop w \/
1279                   drop u <= drop w /\ drop w <= drop v \/
1280                   drop v <= drop u /\ drop u <= drop w \/
1281                   drop v <= drop w /\ drop w <= drop u \/
1282                   drop w <= drop u /\ drop u <= drop v \/
1283                   drop w <= drop v /\ drop v <= drop u`) THEN
1284     FIRST_ASSUM(ANTE_RES_THEN MP_TAC) THEN ASM_REWRITE_TAC[] THEN
1285     REPEAT_TCL CONJUNCTS_THEN SUBST1_TAC (MESON[REVERSEPATH_SUBPATH]
1286      `subpath v u (g:real^1->complex) = reversepath(subpath u v g) /\
1287       subpath w u g = reversepath(subpath u w g) /\
1288       subpath w v g = reversepath(subpath v w g)`) THEN
1289     ASM_SIMP_TAC[PATH_INTEGRAL_REVERSEPATH; PATH_INTEGRABLE_SUBPATH;
1290                  VALID_PATH_REVERSEPATH; VALID_PATH_SUBPATH] THEN
1291     CONV_TAC COMPLEX_RING] THEN
1292   REPEAT GEN_TAC THEN STRIP_TAC THEN
1293   SUBGOAL_THEN `drop u <= drop w` ASSUME_TAC THENL
1294    [ASM_REAL_ARITH_TAC; STRIP_TAC] THEN
1295   ASM_SIMP_TAC[PATH_INTEGRAL_SUBPATH_INTEGRAL] THEN
1296   MATCH_MP_TAC INTEGRAL_COMBINE THEN ASM_REWRITE_TAC[] THEN
1297   MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
1298   EXISTS_TAC `interval[vec 0:real^1,vec 1]` THEN
1299   ASM_REWRITE_TAC[GSYM PATH_INTEGRABLE_ON; SUBSET_INTERVAL_1] THEN
1300   ASM_MESON_TAC[IN_INTERVAL_1]);;
1301
1302 let PATH_INTEGRAL_INTEGRAL = prove
1303  (`!f g. path_integral g f =
1304          integral (interval [vec 0,vec 1])
1305                   (\x. f (g x) * vector_derivative g (at x))`,
1306   REWRITE_TAC[path_integral; integral; HAS_PATH_INTEGRAL]);;
1307
1308 (* ------------------------------------------------------------------------- *)
1309 (* Easier to reason about segments via convex hulls.                         *)
1310 (* ------------------------------------------------------------------------- *)
1311
1312 let SEGMENTS_SUBSET_CONVEX_HULL = prove
1313  (`!a b c. segment[a,b] SUBSET (convex hull {a,b,c}) /\
1314            segment[a,c] SUBSET (convex hull {a,b,c}) /\
1315            segment[b,c] SUBSET (convex hull {a,b,c}) /\
1316            segment[b,a] SUBSET (convex hull {a,b,c}) /\
1317            segment[c,a] SUBSET (convex hull {a,b,c}) /\
1318            segment[c,b] SUBSET (convex hull {a,b,c})`,
1319   REPEAT STRIP_TAC THEN REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
1320   MATCH_MP_TAC HULL_MONO THEN SET_TAC[]);;
1321
1322 let POINTS_IN_CONVEX_HULL = prove
1323  (`!x s. x IN s ==> x IN convex hull s`,
1324   MESON_TAC[SUBSET; HULL_SUBSET]);;
1325
1326 let CONVEX_HULL_SUBSET = prove
1327  (`(!x. x IN s ==> x IN convex hull t)
1328    ==> (convex hull s) SUBSET (convex hull t)`,
1329   REPEAT STRIP_TAC THEN MATCH_MP_TAC HULL_MINIMAL THEN
1330   ASM_REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET]);;
1331
1332 let NOT_IN_INTERIOR_CONVEX_HULL_3 = prove
1333  (`!a b c:complex. ~(a IN interior(convex hull {a,b,c})) /\
1334                    ~(b IN interior(convex hull {a,b,c})) /\
1335                    ~(c IN interior(convex hull {a,b,c}))`,
1336   REPEAT GEN_TAC THEN REPEAT CONJ_TAC THEN
1337   MATCH_MP_TAC NOT_IN_INTERIOR_CONVEX_HULL THEN
1338   ASM_SIMP_TAC[CARD_CLAUSES; FINITE_INSERT; FINITE_EMPTY; IN_INSERT] THEN
1339   REWRITE_TAC[DIMINDEX_2] THEN ARITH_TAC);;
1340
1341 (* ------------------------------------------------------------------------- *)
1342 (* Cauchy's theorem where there's a primitive.                               *)
1343 (* ------------------------------------------------------------------------- *)
1344
1345 let PATH_INTEGRAL_PRIMITIVE_LEMMA = prove
1346  (`!f f' g a b s.
1347         ~(interval[a,b] = {}) /\
1348         (!x. x IN s ==> (f has_complex_derivative f'(x)) (at x within s)) /\
1349         g piecewise_differentiable_on interval[a,b] /\
1350         (!x. x IN interval[a,b] ==> g(x) IN s)
1351         ==> ((\x. f'(g x) * vector_derivative g (at x within interval[a,b]))
1352              has_integral (f(g b) - f(g a))) (interval[a,b])`,
1353   REPEAT GEN_TAC THEN REWRITE_TAC[valid_path; piecewise_differentiable_on] THEN
1354   REWRITE_TAC[INTERVAL_EQ_EMPTY_1; REAL_NOT_LT] THEN
1355   DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
1356   FIRST_X_ASSUM(X_CHOOSE_THEN `k:real^1->bool` STRIP_ASSUME_TAC) THEN
1357   MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR_STRONG THEN
1358   EXISTS_TAC `k:real^1->bool` THEN ASM_REWRITE_TAC[DROP_VEC; REAL_POS] THEN
1359   ASM_SIMP_TAC[FINITE_IMP_COUNTABLE; GSYM o_DEF] THEN CONJ_TAC THENL
1360    [MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN ASM_REWRITE_TAC[] THEN
1361     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
1362     ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
1363     MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
1364     ASM_MESON_TAC[holomorphic_on];
1365     ALL_TAC] THEN
1366   X_GEN_TAC `x:real^1` THEN
1367   REPEAT STRIP_TAC THEN REWRITE_TAC[has_vector_derivative; COMPLEX_CMUL] THEN
1368   SUBGOAL_THEN `(f has_complex_derivative f'(g x))
1369                 (at (g x) within (IMAGE g (interval[a:real^1,b])))`
1370   MP_TAC THENL
1371    [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_WITHIN_SUBSET THEN
1372     EXISTS_TAC `s:complex->bool` THEN
1373     ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
1374     FIRST_X_ASSUM MATCH_MP_TAC THEN
1375     ASM_MESON_TAC[INTERVAL_OPEN_SUBSET_CLOSED; SUBSET; IN_DIFF];
1376     ALL_TAC] THEN
1377   SUBGOAL_THEN
1378    `(g:real^1->complex) differentiable (at x within interval[a,b])`
1379   MP_TAC THENL
1380    [MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
1381     FIRST_X_ASSUM MATCH_MP_TAC THEN
1382     ASM_MESON_TAC[INTERVAL_OPEN_SUBSET_CLOSED; SUBSET; IN_DIFF];
1383     ALL_TAC] THEN
1384   GEN_REWRITE_TAC LAND_CONV [VECTOR_DERIVATIVE_WORKS] THEN
1385   REWRITE_TAC[has_vector_derivative; IMP_IMP; has_complex_derivative] THEN
1386   DISCH_THEN(MP_TAC o MATCH_MP DIFF_CHAIN_WITHIN) THEN
1387   DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1388     HAS_DERIVATIVE_WITHIN_SUBSET)) THEN
1389   DISCH_THEN(MP_TAC o SPEC `interval(a:real^1,b)`) THEN
1390   RULE_ASSUM_TAC(REWRITE_RULE[IN_DIFF]) THEN
1391   ASM_SIMP_TAC[INTERVAL_OPEN_SUBSET_CLOSED; OPEN_INTERVAL;
1392                HAS_DERIVATIVE_WITHIN_OPEN] THEN
1393   REWRITE_TAC[o_DEF; COMPLEX_CMUL] THEN REWRITE_TAC[COMPLEX_MUL_AC]);;
1394
1395 let PATH_INTEGRAL_PRIMITIVE = prove
1396  (`!f f' g s.
1397         (!x. x IN s ==> (f has_complex_derivative f'(x)) (at x within s)) /\
1398         valid_path g /\ (path_image g) SUBSET s
1399         ==> (f' has_path_integral (f(pathfinish g) - f(pathstart g))) (g)`,
1400   REWRITE_TAC[valid_path; path_image; pathfinish; pathstart] THEN
1401   REWRITE_TAC[has_path_integral] THEN
1402   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_PRIMITIVE_LEMMA THEN
1403   ASM_REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC; REAL_POS; REAL_NOT_LT] THEN
1404   RULE_ASSUM_TAC(REWRITE_RULE[SUBSET; FORALL_IN_IMAGE]) THEN
1405   ASM_MESON_TAC[]);;
1406
1407 let CAUCHY_THEOREM_PRIMITIVE = prove
1408  (`!f f' g s.
1409         (!x. x IN s ==> (f has_complex_derivative f'(x)) (at x within s)) /\
1410         valid_path g /\ (path_image g) SUBSET s /\
1411         pathfinish g = pathstart g
1412         ==> (f' has_path_integral Cx(&0)) (g)`,
1413   MESON_TAC[PATH_INTEGRAL_PRIMITIVE; COMPLEX_SUB_REFL]);;
1414
1415 (* ------------------------------------------------------------------------- *)
1416 (* Existence of path integral for continuous function.                       *)
1417 (* ------------------------------------------------------------------------- *)
1418
1419 let PATH_INTEGRABLE_CONTINUOUS_LINEPATH = prove
1420  (`!f a b. f continuous_on segment[a,b]
1421            ==> f path_integrable_on (linepath(a,b))`,
1422   REPEAT GEN_TAC THEN REWRITE_TAC[path_integrable_on; has_path_integral] THEN
1423   DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
1424   REWRITE_TAC[GSYM integrable_on] THEN MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
1425   MATCH_MP_TAC CONTINUOUS_ON_EQ THEN
1426   EXISTS_TAC `\x. f(linepath(a,b) x) * (b - a)` THEN
1427   SIMP_TAC[VECTOR_DERIVATIVE_LINEPATH_WITHIN] THEN
1428   ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
1429   MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_LMUL THEN
1430   GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
1431   MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
1432   ASM_REWRITE_TAC[GSYM path_image; ETA_AX; PATH_IMAGE_LINEPATH] THEN
1433   REWRITE_TAC[CONTINUOUS_ON_LINEPATH]);;
1434
1435 (* ------------------------------------------------------------------------- *)
1436 (* Arithmetical combining theorems.                                          *)
1437 (* ------------------------------------------------------------------------- *)
1438
1439 let HAS_PATH_INTEGRAL_CONST_LINEPATH = prove
1440  (`!a b c. ((\x. c) has_path_integral (c * (b - a))) (linepath(a,b))`,
1441   REPEAT GEN_TAC THEN REWRITE_TAC[HAS_PATH_INTEGRAL_LINEPATH] THEN
1442   MP_TAC(ISPECL [`vec 0:real^1`; `vec 1:real^1`; `c * (b - a):complex`]
1443          HAS_INTEGRAL_CONST) THEN
1444   REWRITE_TAC[CONTENT_UNIT; VECTOR_MUL_LID]);;
1445
1446 let HAS_PATH_INTEGRAL_NEG = prove
1447  (`!f i g. (f has_path_integral i) g
1448            ==> ((\x. --(f x)) has_path_integral (--i)) g`,
1449   REWRITE_TAC[has_path_integral; COMPLEX_MUL_LNEG; HAS_INTEGRAL_NEG]);;
1450
1451 let HAS_PATH_INTEGRAL_ADD = prove
1452  (`!f1 i1 f2 i2 g.
1453         (f1 has_path_integral i1) g /\ (f2 has_path_integral i2) g
1454         ==> ((\x. f1(x) + f2(x)) has_path_integral (i1 + i2)) g`,
1455   REWRITE_TAC[has_path_integral; COMPLEX_ADD_RDISTRIB] THEN
1456   SIMP_TAC[HAS_INTEGRAL_ADD]);;
1457
1458 let HAS_PATH_INTEGRAL_SUB = prove
1459  (`!f1 i1 f2 i2 g.
1460         (f1 has_path_integral i1) g /\ (f2 has_path_integral i2) g
1461          ==> ((\x. f1(x) - f2(x)) has_path_integral (i1 - i2)) g`,
1462   REWRITE_TAC[has_path_integral; COMPLEX_SUB_RDISTRIB] THEN
1463   SIMP_TAC[HAS_INTEGRAL_SUB]);;
1464
1465 let HAS_PATH_INTEGRAL_COMPLEX_LMUL = prove
1466  (`!f g i c. (f has_path_integral i) g
1467              ==> ((\x. c * f x) has_path_integral (c * i)) g`,
1468   REWRITE_TAC[has_path_integral; HAS_INTEGRAL_COMPLEX_LMUL;
1469               GSYM COMPLEX_MUL_ASSOC]);;
1470
1471 let HAS_PATH_INTEGRAL_COMPLEX_RMUL = prove
1472  (`!f g i c. (f has_path_integral i) g
1473              ==> ((\x. f x * c) has_path_integral (i * c)) g`,
1474   ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
1475   REWRITE_TAC[HAS_PATH_INTEGRAL_COMPLEX_LMUL]);;
1476
1477 let HAS_PATH_INTEGRAL_COMPLEX_DIV = prove
1478  (`!f g i c. (f has_path_integral i) g
1479              ==> ((\x. f x / c) has_path_integral (i / c)) g`,
1480   REWRITE_TAC[complex_div; HAS_PATH_INTEGRAL_COMPLEX_RMUL]);;
1481
1482 let HAS_PATH_INTEGRAL_EQ = prove
1483  (`!f g p y.
1484         (!x. x IN path_image p ==> f x = g x) /\
1485         (f has_path_integral y) p
1486         ==> (g has_path_integral y) p`,
1487   REPEAT GEN_TAC THEN
1488   REWRITE_TAC[path_image; IN_IMAGE; has_path_integral; IMP_CONJ] THEN
1489   DISCH_TAC THEN MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_EQ) THEN
1490   ASM_SIMP_TAC[] THEN ASM_MESON_TAC[]);;
1491
1492 let HAS_PATH_INTEGRAL_BOUND_LINEPATH = prove
1493  (`!f i a b B.
1494         (f has_path_integral i) (linepath(a,b)) /\
1495         &0 <= B /\ (!x. x IN segment[a,b] ==> norm(f x) <= B)
1496         ==> norm(i) <= B * norm(b - a)`,
1497   REPEAT GEN_TAC THEN REWRITE_TAC[has_path_integral] THEN STRIP_TAC THEN
1498   GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
1499   REWRITE_TAC[GSYM CONTENT_UNIT_1] THEN MATCH_MP_TAC HAS_INTEGRAL_BOUND THEN
1500   EXISTS_TAC `\x. f (linepath (a,b) x) *
1501                     vector_derivative (linepath (a,b))
1502                        (at x within interval [vec 0,vec 1])` THEN
1503   ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE;
1504                VECTOR_DERIVATIVE_LINEPATH_WITHIN] THEN
1505   REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
1506   MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
1507   FIRST_X_ASSUM MATCH_MP_TAC THEN
1508   REWRITE_TAC[GSYM PATH_IMAGE_LINEPATH; path_image] THEN
1509   ASM SET_TAC[]);;
1510
1511 let HAS_PATH_INTEGRAL_BOUND_LINEPATH_STRONG = prove
1512  (`!f i a b B k.
1513         FINITE k /\
1514         (f has_path_integral i) (linepath(a,b)) /\
1515         &0 <= B /\ (!x. x IN segment[a,b] DIFF k ==> norm(f x) <= B)
1516         ==> norm(i) <= B * norm(b - a)`,
1517   REPEAT GEN_TAC THEN ASM_CASES_TAC `b:complex = a` THENL
1518    [ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0; REAL_MUL_RZERO] THEN
1519     STRIP_TAC THEN SUBGOAL_THEN `i = Cx(&0)`
1520       (fun th -> REWRITE_TAC[th; COMPLEX_NORM_0; REAL_LE_REFL]) THEN
1521     MATCH_MP_TAC HAS_PATH_INTEGRAL_UNIQUE THEN
1522     ASM_MESON_TAC[HAS_PATH_INTEGRAL_TRIVIAL];
1523     STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
1524     EXISTS_TAC `\x. if x IN k then Cx(&0) else (f:complex->complex) x` THEN
1525     ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
1526      [ALL_TAC; ASM SET_TAC[COMPLEX_NORM_0]] THEN
1527     UNDISCH_TAC `(f has_path_integral i) (linepath (a,b))` THEN
1528     MATCH_MP_TAC EQ_IMP THEN REWRITE_TAC[has_path_integral] THEN
1529     MATCH_MP_TAC HAS_INTEGRAL_SPIKE_EQ THEN
1530     EXISTS_TAC `{t | t IN interval[vec 0,vec 1] /\
1531                      linepath(a:complex,b) t IN k}` THEN
1532     CONJ_TAC THENL [MATCH_MP_TAC NEGLIGIBLE_FINITE; SET_TAC[]] THEN
1533     MATCH_MP_TAC FINITE_FINITE_PREIMAGE_GENERAL THEN ASM_REWRITE_TAC[] THEN
1534     X_GEN_TAC `c:complex` THEN DISCH_TAC THEN
1535     MATCH_MP_TAC(MESON[FINITE_SING; FINITE_SUBSET]
1536      `(?a. s SUBSET {a}) ==> FINITE s`) THEN
1537     MATCH_MP_TAC(SET_RULE
1538      `(!a b. a IN s /\ b IN s ==> a = b) ==> (?a. s SUBSET {a})`) THEN
1539     MAP_EVERY X_GEN_TAC [`s:real^1`; `t:real^1`] THEN
1540     REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
1541     FIRST_X_ASSUM(MP_TAC o SYM) THEN FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
1542     REWRITE_TAC[linepath; VECTOR_ARITH
1543      `(&1 - s) % a + s % b:real^N = (&1 - t) % a + t % b <=>
1544       (s - t) % (b - a) = vec 0`] THEN
1545     ASM_REWRITE_TAC[VECTOR_MUL_EQ_0; VECTOR_SUB_EQ; REAL_SUB_0] THEN
1546     REWRITE_TAC[DROP_EQ]]);;
1547
1548 let HAS_PATH_INTEGRAL_0 = prove
1549  (`!g. ((\x. Cx(&0)) has_path_integral Cx(&0)) g`,
1550   REWRITE_TAC[has_path_integral; COMPLEX_MUL_LZERO] THEN
1551   REWRITE_TAC[GSYM COMPLEX_VEC_0; HAS_INTEGRAL_0]);;
1552
1553 let HAS_PATH_INTEGRAL_IS_0 = prove
1554  (`!f g. (!z. z IN path_image g ==> f(z) = Cx(&0))
1555          ==> (f has_path_integral Cx(&0)) g`,
1556   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_EQ THEN
1557   EXISTS_TAC `\z:complex. Cx(&0)` THEN
1558   ASM_REWRITE_TAC[HAS_PATH_INTEGRAL_0] THEN ASM_MESON_TAC[]);;
1559
1560 let HAS_PATH_INTEGRAL_VSUM = prove
1561  (`!f p s. FINITE s /\ (!a. a IN s ==> (f a has_path_integral i a) p)
1562            ==> ((\x. vsum s (\a. f a x)) has_path_integral vsum s i) p`,
1563   GEN_TAC THEN GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
1564   MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
1565   SIMP_TAC[VSUM_CLAUSES; HAS_PATH_INTEGRAL_0; COMPLEX_VEC_0; IN_INSERT] THEN
1566   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN
1567   ASM_REWRITE_TAC[ETA_AX] THEN CONJ_TAC THEN
1568   FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC[]);;
1569
1570 (* ------------------------------------------------------------------------- *)
1571 (* Same thing non-relationally.                                              *)
1572 (* ------------------------------------------------------------------------- *)
1573
1574 let PATH_INTEGRAL_CONST_LINEPATH = prove
1575  (`!a b c. path_integral (linepath(a,b)) (\x. c) = c * (b - a)`,
1576   REPEAT GEN_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1577   REWRITE_TAC[HAS_PATH_INTEGRAL_CONST_LINEPATH]);;
1578
1579 let PATH_INTEGRAL_NEG = prove
1580  (`!f g. f path_integrable_on g
1581          ==> path_integral g (\x. --(f x)) = --(path_integral g f)`,
1582   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1583   MATCH_MP_TAC HAS_PATH_INTEGRAL_NEG THEN
1584   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1585
1586 let PATH_INTEGRAL_ADD = prove
1587  (`!f1 f2 g.
1588         f1 path_integrable_on g /\ f2 path_integrable_on g
1589         ==> path_integral g (\x. f1(x) + f2(x)) =
1590                 path_integral g f1 + path_integral g f2`,
1591   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1592   MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN
1593   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1594
1595 let PATH_INTEGRAL_SUB = prove
1596  (`!f1 f2 g.
1597         f1 path_integrable_on g /\ f2 path_integrable_on g
1598         ==> path_integral g (\x. f1(x) - f2(x)) =
1599                 path_integral g f1 - path_integral g f2`,
1600   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1601   MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
1602   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1603
1604 let PATH_INTEGRAL_COMPLEX_LMUL = prove
1605  (`!f g c.  f path_integrable_on g
1606            ==> path_integral g (\x. c * f x) = c * path_integral g f`,
1607   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1608   MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_LMUL THEN
1609   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1610
1611 let PATH_INTEGRAL_COMPLEX_RMUL = prove
1612  (`!f g c.  f path_integrable_on g
1613            ==> path_integral g (\x. f x * c) = path_integral g f * c`,
1614   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1615   MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_RMUL THEN
1616   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1617
1618 let PATH_INTEGRAL_COMPLEX_DIV = prove
1619  (`!f g c.  f path_integrable_on g
1620            ==> path_integral g (\x. f x / c) = path_integral g f / c`,
1621    REWRITE_TAC[complex_div; PATH_INTEGRAL_COMPLEX_RMUL]);;
1622
1623 let PATH_INTEGRAL_EQ = prove
1624  (`!f g p.
1625         (!x. x IN path_image p ==> f x = g x)
1626         ==> path_integral p f = path_integral p g`,
1627   REPEAT STRIP_TAC THEN REWRITE_TAC[path_integral] THEN
1628   AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN
1629   ASM_MESON_TAC[HAS_PATH_INTEGRAL_EQ]);;
1630
1631 let PATH_INTEGRAL_EQ_0 = prove
1632  (`!f g. (!z. z IN path_image g ==> f(z) = Cx(&0))
1633          ==> path_integral g f = Cx(&0)`,
1634   MESON_TAC[HAS_PATH_INTEGRAL_IS_0; PATH_INTEGRAL_UNIQUE]);;
1635
1636 let PATH_INTEGRAL_BOUND_LINEPATH = prove
1637  (`!f a b.
1638         f path_integrable_on (linepath(a,b)) /\
1639         &0 <= B /\ (!x. x IN segment[a,b] ==> norm(f x) <= B)
1640         ==> norm(path_integral (linepath(a,b)) f) <= B * norm(b - a)`,
1641   REPEAT STRIP_TAC THEN
1642   MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
1643   EXISTS_TAC `f:complex->complex` THEN
1644   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1645
1646 let PATH_INTEGRAL_0 = prove
1647  (`!g. path_integral g (\x. Cx(&0)) = Cx(&0)`,
1648   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1649   REWRITE_TAC[HAS_PATH_INTEGRAL_0]);;
1650
1651 let PATH_INTEGRAL_VSUM = prove
1652  (`!f p s. FINITE s /\ (!a. a IN s ==> (f a) path_integrable_on p)
1653            ==> path_integral p (\x. vsum s (\a. f a x)) =
1654                 vsum s (\a. path_integral p (f a))`,
1655   REPEAT STRIP_TAC THEN
1656   MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1657   MATCH_MP_TAC HAS_PATH_INTEGRAL_VSUM THEN
1658   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1659
1660 let PATH_INTEGRABLE_EQ = prove
1661  (`!f g p. (!x. x IN path_image p ==> f x = g x) /\ f path_integrable_on p
1662            ==> g path_integrable_on p`,
1663   REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_EQ]);;
1664
1665 (* ------------------------------------------------------------------------- *)
1666 (* Arithmetic theorems for path integrability.                               *)
1667 (* ------------------------------------------------------------------------- *)
1668
1669 let PATH_INTEGRABLE_NEG = prove
1670  (`!f g. f path_integrable_on g
1671            ==> (\x. --(f x)) path_integrable_on g`,
1672   REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_NEG]);;
1673
1674 let PATH_INTEGRABLE_ADD = prove
1675  (`!f1 f2 g.
1676         f1 path_integrable_on g /\ f2 path_integrable_on g
1677         ==> (\x. f1(x) + f2(x)) path_integrable_on g`,
1678   REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_ADD]);;
1679
1680 let PATH_INTEGRABLE_SUB = prove
1681  (`!f1 f2 g.
1682         f1 path_integrable_on g /\ f2 path_integrable_on g
1683         ==> (\x. f1(x) - f2(x)) path_integrable_on g`,
1684   REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_SUB]);;
1685
1686 let PATH_INTEGRABLE_COMPLEX_LMUL = prove
1687  (`!f g c. f path_integrable_on g
1688              ==> (\x. c * f x) path_integrable_on g`,
1689   REWRITE_TAC[path_integrable_on] THEN
1690   MESON_TAC[HAS_PATH_INTEGRAL_COMPLEX_LMUL]);;
1691
1692 let PATH_INTEGRABLE_COMPLEX_RMUL = prove
1693  (`!f g c. f path_integrable_on g
1694              ==> (\x. f x * c) path_integrable_on g`,
1695   ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
1696   REWRITE_TAC[PATH_INTEGRABLE_COMPLEX_LMUL]);;
1697
1698 let PATH_INTEGRABLE_COMPLEX_DIV = prove
1699  (`!f g c. f path_integrable_on g
1700              ==> (\x. f x / c) path_integrable_on g`,
1701   REWRITE_TAC[path_integrable_on] THEN
1702   MESON_TAC[HAS_PATH_INTEGRAL_COMPLEX_DIV]);;
1703
1704 let PATH_INTEGRABLE_VSUM = prove
1705  (`!f g s. FINITE s /\ (!a. a IN s ==> f a path_integrable_on g)
1706            ==> (\x. vsum s (\a. f a x)) path_integrable_on g`,
1707   REWRITE_TAC[path_integrable_on] THEN
1708   MESON_TAC[HAS_PATH_INTEGRAL_VSUM]);;
1709
1710 (* ------------------------------------------------------------------------- *)
1711 (* Considering a path integral "backwards".                                  *)
1712 (* ------------------------------------------------------------------------- *)
1713
1714 let HAS_PATH_INTEGRAL_REVERSE_LINEPATH = prove
1715  (`!f a b i.
1716         (f has_path_integral i) (linepath(a,b))
1717         ==> (f has_path_integral (--i)) (linepath(b,a))`,
1718   MESON_TAC[REVERSEPATH_LINEPATH; VALID_PATH_LINEPATH;
1719             HAS_PATH_INTEGRAL_REVERSEPATH]);;
1720
1721 let PATH_INTEGRAL_REVERSE_LINEPATH = prove
1722  (`!f a b.
1723         f continuous_on (segment[a,b])
1724         ==> path_integral(linepath(a,b)) f =
1725             --(path_integral(linepath(b,a)) f)`,
1726   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1727   MATCH_MP_TAC HAS_PATH_INTEGRAL_REVERSE_LINEPATH THEN
1728   MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
1729   MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
1730   ASM_MESON_TAC[SEGMENT_SYM]);;
1731
1732 (* ------------------------------------------------------------------------- *)
1733 (* Splitting a path integral in a flat way.                                  *)
1734 (* ------------------------------------------------------------------------- *)
1735
1736 let HAS_PATH_INTEGRAL_SPLIT = prove
1737  (`!f a b c i j k.
1738         &0 <= k /\ k <= &1 /\ c - a = k % (b - a) /\
1739         (f has_path_integral i) (linepath(a,c)) /\
1740         (f has_path_integral j) (linepath(c,b))
1741         ==> (f has_path_integral (i + j)) (linepath(a,b))`,
1742   REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1743   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1744   ASM_CASES_TAC `k = &0` THENL
1745    [ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ] THEN
1746     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
1747     ASM_MESON_TAC[HAS_PATH_INTEGRAL_TRIVIAL; PATH_INTEGRAL_UNIQUE;
1748                   COMPLEX_ADD_LID];
1749     ALL_TAC] THEN
1750   ASM_CASES_TAC `k = &1` THEN ASM_REWRITE_TAC[VECTOR_MUL_LID] THENL
1751    [REWRITE_TAC[VECTOR_ARITH `c - a = b - a <=> c = b:real^N`] THEN
1752     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
1753     ASM_MESON_TAC[HAS_PATH_INTEGRAL_TRIVIAL; PATH_INTEGRAL_UNIQUE;
1754                   COMPLEX_ADD_RID];
1755     ALL_TAC] THEN
1756   REWRITE_TAC[HAS_PATH_INTEGRAL_LINEPATH] THEN
1757   REWRITE_TAC[linepath] THEN REPEAT GEN_TAC THEN
1758   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1759   DISCH_THEN(CONJUNCTS_THEN
1760    (MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_AFFINITY))) THEN
1761   DISCH_THEN(ASSUME_TAC o SPECL
1762     [`inv(&1 - k):real`; `--(k / (&1 - k)) % vec 1:real^1`]) THEN
1763   DISCH_THEN(MP_TAC o SPECL [`inv(k):real`; `vec 0:real^1`]) THEN
1764   POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[REAL_INV_EQ_0; REAL_SUB_0] THEN
1765   REWRITE_TAC[REAL_INV_INV; DIMINDEX_1; REAL_POW_1; REAL_ABS_INV] THEN
1766   REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
1767   REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
1768   ASM_REWRITE_TAC[REAL_SUB_LE; REAL_ARITH `~(&1 < &0)`] THEN
1769   REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_NEG_0; VECTOR_ADD_RID] THEN
1770   REWRITE_TAC[VECTOR_MUL_ASSOC; VECTOR_MUL_LNEG] THEN
1771   ASM_SIMP_TAC[REAL_FIELD
1772     `~(k = &1) ==> (&1 - k) * --(k / (&1 - k)) = --k`] THEN
1773   REWRITE_TAC[VECTOR_ADD_LID; VECTOR_MUL_LNEG; VECTOR_NEG_NEG;
1774               VECTOR_ARITH `(&1 - k) % x + k % x:real^1 = x`] THEN
1775   REWRITE_TAC[DROP_ADD; DROP_CMUL; DROP_NEG; DROP_VEC; REAL_MUL_RID] THEN
1776   FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP (VECTOR_ARITH
1777     `c - a = x ==> c = x + a`)) THEN
1778   REWRITE_TAC[VECTOR_ARITH `b - (k % (b - a) + a) = (&1 - k) % (b - a)`] THEN
1779   SUBGOAL_THEN
1780    `!x. (&1 - (inv (&1 - k) * drop x + --(k / (&1 - k)))) % (k % (b - a) + a) +
1781         (inv (&1 - k) * drop x + --(k / (&1 - k))) % b =
1782         (&1 - drop x) % a + drop x % b`
1783    (fun th -> REWRITE_TAC[th]) THENL
1784    [REWRITE_TAC[VECTOR_ARITH
1785      `x % (k % (b - a) + a) + y % b =
1786       (x * (&1 - k)) % a + (y + x * k) % b`] THEN
1787     GEN_TAC THEN BINOP_TAC THEN BINOP_TAC THEN REWRITE_TAC[] THEN
1788     REPEAT(POP_ASSUM MP_TAC) THEN CONV_TAC REAL_FIELD;
1789     ALL_TAC] THEN
1790   SUBGOAL_THEN
1791    `!x. (&1 - inv k * drop x) % a + (inv k * drop x) % (k % (b - a) + a) =
1792         (&1 - drop x) % a + drop x % b`
1793    (fun th -> REWRITE_TAC[th]) THENL
1794    [REWRITE_TAC[VECTOR_ARITH
1795      `x % a + y % (k % (b - a) + a) =
1796       (x + y * (&1 - k)) % a + (y * k) % b`] THEN
1797     GEN_TAC THEN BINOP_TAC THEN BINOP_TAC THEN REWRITE_TAC[] THEN
1798     REPEAT(POP_ASSUM MP_TAC) THEN CONV_TAC REAL_FIELD;
1799     ALL_TAC] THEN
1800   DISCH_TAC THEN
1801   DISCH_THEN(MP_TAC o SPEC `inv(k:real)` o MATCH_MP HAS_INTEGRAL_CMUL) THEN
1802   FIRST_ASSUM(MP_TAC o SPEC `inv(&1 - k)` o MATCH_MP HAS_INTEGRAL_CMUL) THEN
1803   ASM_SIMP_TAC[REAL_ARITH `&0 <= k ==> abs k = k`;
1804                REAL_ARITH `k <= &1 ==> abs(&1 - k) = &1 - k`] THEN
1805   ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_MUL_LINV; REAL_SUB_0] THEN
1806   REWRITE_TAC[IMP_IMP; VECTOR_MUL_LID] THEN
1807   REWRITE_TAC[COMPLEX_CMUL] THEN
1808   ONCE_REWRITE_TAC[COMPLEX_RING
1809    `Cx(inv a) * b * Cx(a) * c = (Cx(inv a) * Cx a) * b * c`] THEN
1810   ASM_SIMP_TAC[GSYM CX_MUL; REAL_MUL_LINV; REAL_SUB_0; COMPLEX_MUL_LID] THEN
1811   STRIP_TAC THEN
1812   MATCH_MP_TAC HAS_INTEGRAL_COMBINE THEN EXISTS_TAC `k % vec 1:real^1` THEN
1813   ASM_REWRITE_TAC[DROP_CMUL; DROP_VEC; REAL_MUL_RID]);;
1814
1815 let PATH_INTEGRAL_SPLIT = prove
1816  (`!f a b c k.
1817         &0 <= k /\ k <= &1 /\ c - a = k % (b - a) /\
1818         f continuous_on (segment[a,b])
1819         ==> path_integral(linepath(a,b)) f =
1820             path_integral(linepath(a,c)) f +
1821             path_integral(linepath(c,b)) f`,
1822   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1823   MATCH_MP_TAC HAS_PATH_INTEGRAL_SPLIT THEN
1824   MAP_EVERY EXISTS_TAC [`c:complex`; `k:real`] THEN ASM_REWRITE_TAC[] THEN
1825   CONJ_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
1826   MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
1827   MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
1828   EXISTS_TAC `segment[a:complex,b]` THEN ASM_REWRITE_TAC[] THEN
1829   REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
1830   REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
1831   ASM_SIMP_TAC[POINTS_IN_CONVEX_HULL; IN_INSERT] THEN
1832   FIRST_ASSUM(SUBST1_TAC o MATCH_MP (VECTOR_ARITH
1833    `c - a = k % (b - a) ==> c = (&1 - k) % a + k % b`)) THEN
1834   MATCH_MP_TAC IN_CONVEX_SET THEN
1835   ASM_SIMP_TAC[CONVEX_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT]);;
1836
1837 let PATH_INTEGRAL_SPLIT_LINEPATH = prove
1838  (`!f a b c.
1839         f continuous_on segment[a,b] /\ c IN segment[a,b]
1840         ==> path_integral(linepath (a,b)) f =
1841             path_integral(linepath (a,c)) f +
1842             path_integral(linepath (c,b)) f`,
1843   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_SPLIT THEN
1844   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_SEGMENT]) THEN
1845   MATCH_MP_TAC MONO_EXISTS THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
1846   VECTOR_ARITH_TAC);;
1847
1848 (* ------------------------------------------------------------------------- *)
1849 (* The special case of midpoints used in the main quadrisection.             *)
1850 (* ------------------------------------------------------------------------- *)
1851
1852 let HAS_PATH_INTEGRAL_MIDPOINT = prove
1853  (`!f a b i j.
1854         (f has_path_integral i) (linepath(a,midpoint(a,b))) /\
1855         (f has_path_integral j) (linepath(midpoint(a,b),b))
1856         ==> (f has_path_integral (i + j)) (linepath(a,b))`,
1857   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_SPLIT THEN
1858   MAP_EVERY EXISTS_TAC [`midpoint(a:complex,b)`; `&1 / &2`] THEN
1859   ASM_REWRITE_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
1860   REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);;
1861
1862 let PATH_INTEGRAL_MIDPOINT = prove
1863  (`!f a b.
1864         f continuous_on (segment[a,b])
1865         ==> path_integral(linepath(a,b)) f =
1866             path_integral(linepath(a,midpoint(a,b))) f +
1867             path_integral(linepath(midpoint(a,b),b)) f`,
1868   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_SPLIT THEN
1869   EXISTS_TAC `&1 / &2` THEN
1870   ASM_REWRITE_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
1871   REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);;
1872
1873 (* ------------------------------------------------------------------------- *)
1874 (* A couple of special case lemmas that are useful below.                    *)
1875 (* ------------------------------------------------------------------------- *)
1876
1877 let TRIANGLE_LINEAR_HAS_CHAIN_INTEGRAL = prove
1878  (`!a b c m d. ((\x. m * x + d) has_path_integral Cx(&0))
1879          (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`,
1880   REPEAT GEN_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_PRIMITIVE THEN
1881   MAP_EVERY EXISTS_TAC [`\x. m / Cx(&2) * x pow 2 + d * x`; `(:complex)`] THEN
1882   SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH; SUBSET_UNIV;
1883            PATHFINISH_LINEPATH; VALID_PATH_JOIN; VALID_PATH_LINEPATH] THEN
1884   REPEAT STRIP_TAC THEN COMPLEX_DIFF_TAC THEN CONV_TAC NUM_REDUCE_CONV THEN
1885   CONV_TAC COMPLEX_RING);;
1886
1887 let HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL = prove
1888  (`!f i a b c d.
1889         (f has_path_integral i)
1890         (linepath(a,b) ++ linepath(b,c) ++ linepath(c,d))
1891         ==> path_integral (linepath(a,b)) f +
1892             path_integral (linepath(b,c)) f +
1893             path_integral (linepath(c,d)) f = i`,
1894   REPEAT STRIP_TAC THEN
1895   FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
1896   FIRST_X_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE) THEN
1897   SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_LINEPATH; VALID_PATH_JOIN;
1898            PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
1899            PATHFINISH_LINEPATH] THEN
1900   STRIP_TAC THEN CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1901   REPEAT(MATCH_MP_TAC HAS_PATH_INTEGRAL_JOIN THEN
1902          SIMP_TAC[VALID_PATH_LINEPATH; VALID_PATH_JOIN;
1903                   PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
1904                   PATHFINISH_LINEPATH] THEN
1905          CONJ_TAC) THEN
1906   MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN ASM_REWRITE_TAC[]);;
1907
1908 (* ------------------------------------------------------------------------- *)
1909 (* Reversing the order in a double path integral. The condition is           *)
1910 (* stronger than needed but it's often true in typical situations.           *)
1911 (* ------------------------------------------------------------------------- *)
1912
1913 let PATH_INTEGRAL_SWAP = prove
1914  (`!f g h.
1915     (\y. f (fstcart y) (sndcart y)) continuous_on
1916     (path_image g PCROSS path_image h) /\
1917     valid_path g /\ valid_path h /\
1918     (\t. vector_derivative g (at t)) continuous_on interval[vec 0,vec 1] /\
1919     (\t. vector_derivative h (at t)) continuous_on interval[vec 0,vec 1]
1920     ==> path_integral g (\w. path_integral h (f w)) =
1921         path_integral h (\z. path_integral g (\w. f w z))`,
1922   REWRITE_TAC[PCROSS] THEN REPEAT STRIP_TAC THEN
1923   ONCE_REWRITE_TAC[PATH_INTEGRAL_INTEGRAL] THEN MATCH_MP_TAC EQ_TRANS THEN
1924   EXISTS_TAC
1925    `integral (interval[vec 0,vec 1])
1926              (\x. path_integral h
1927                     (\y. f (g x) y * vector_derivative g (at x)))` THEN
1928   CONJ_TAC THENL
1929    [MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `x:real^1` THEN
1930     DISCH_TAC THEN REWRITE_TAC[] THEN
1931     CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_COMPLEX_RMUL THEN
1932     REWRITE_TAC[PATH_INTEGRABLE_ON] THEN
1933     MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
1934     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN ASM_REWRITE_TAC[] THEN
1935     SUBGOAL_THEN
1936      `(\t:real^1. (f:complex->complex->complex) (g x) (h t)) =
1937       (\y. f (fstcart y) (sndcart y)) o
1938       (\t. pastecart (g(x:real^1)) (h t))`
1939     SUBST1_TAC THENL
1940      [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART];
1941       ALL_TAC] THEN
1942     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
1943      [MATCH_MP_TAC CONTINUOUS_ON_PASTECART THEN
1944       ASM_SIMP_TAC[CONTINUOUS_ON_CONST; GSYM path; VALID_PATH_IMP_PATH];
1945       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1946          CONTINUOUS_ON_SUBSET)) THEN
1947       REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM] THEN
1948       ASM_SIMP_TAC[path_image; FUN_IN_IMAGE]];
1949     ALL_TAC] THEN
1950   MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
1951    `integral (interval[vec 0,vec 1])
1952              (\y. path_integral g
1953                     (\x. f x (h y) * vector_derivative h (at y)))` THEN
1954   CONJ_TAC THENL
1955    [ALL_TAC;
1956     MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `y:real^1` THEN
1957     DISCH_TAC THEN REWRITE_TAC[] THEN
1958     MATCH_MP_TAC PATH_INTEGRAL_COMPLEX_RMUL THEN
1959     REWRITE_TAC[PATH_INTEGRABLE_ON] THEN
1960     MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
1961     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN ASM_REWRITE_TAC[] THEN
1962     SUBGOAL_THEN
1963      `(\t:real^1. (f:complex->complex->complex) (g t) (h y)) =
1964       (\z. f (fstcart z) (sndcart z)) o
1965       (\t. pastecart (g t) (h(y:real^1)))`
1966     SUBST1_TAC THENL
1967      [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART];
1968       ALL_TAC] THEN
1969     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
1970      [MATCH_MP_TAC CONTINUOUS_ON_PASTECART THEN
1971       ASM_SIMP_TAC[CONTINUOUS_ON_CONST; GSYM path; VALID_PATH_IMP_PATH];
1972       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1973          CONTINUOUS_ON_SUBSET)) THEN
1974       REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM] THEN
1975       ASM_SIMP_TAC[path_image; FUN_IN_IMAGE]]] THEN
1976   REWRITE_TAC[PATH_INTEGRAL_INTEGRAL] THEN
1977   W(MP_TAC o PART_MATCH (lhand o rand)
1978      INTEGRAL_SWAP_CONTINUOUS o lhs o snd) THEN
1979   REWRITE_TAC[] THEN ANTS_TAC THENL
1980    [ALL_TAC;
1981     DISCH_THEN(fun th -> GEN_REWRITE_TAC LAND_CONV [th]) THEN
1982     REPEAT(MATCH_MP_TAC INTEGRAL_EQ THEN
1983            REWRITE_TAC[] THEN REPEAT STRIP_TAC) THEN
1984     REWRITE_TAC[COMPLEX_MUL_AC]] THEN
1985   REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC) THENL
1986    [ALL_TAC;
1987     SUBGOAL_THEN
1988      `(\z:real^(1,1)finite_sum. vector_derivative g (at (fstcart z))) =
1989       (\t. vector_derivative (g:real^1->complex) (at t)) o fstcart`
1990     SUBST1_TAC THENL [REWRITE_TAC[o_DEF]; ALL_TAC] THEN
1991     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
1992     SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_FSTCART] THEN
1993     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1994         CONTINUOUS_ON_SUBSET)) THEN
1995     SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM; PCROSS;
1996              FORALL_PASTECART; GSYM PCROSS_INTERVAL; FSTCART_PASTECART];
1997     SUBGOAL_THEN
1998      `(\z:real^(1,1)finite_sum. vector_derivative h (at (sndcart z))) =
1999       (\t. vector_derivative (h:real^1->complex) (at t)) o sndcart`
2000     SUBST1_TAC THENL [REWRITE_TAC[o_DEF]; ALL_TAC] THEN
2001     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
2002     SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_SNDCART] THEN
2003     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
2004         CONTINUOUS_ON_SUBSET)) THEN
2005     SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM; PCROSS;
2006           FORALL_PASTECART; GSYM PCROSS_INTERVAL; SNDCART_PASTECART]] THEN
2007   SUBGOAL_THEN
2008    `(\z. f (g (fstcart z)) (h (sndcart z))) =
2009     (\y. (f:complex->complex->complex) (fstcart y) (sndcart y)) o
2010     (\p. pastecart (g(fstcart p:real^1)) (h(sndcart p:real^1)))`
2011   SUBST1_TAC THENL
2012    [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART]; ALL_TAC] THEN
2013   MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
2014    [MATCH_MP_TAC CONTINUOUS_ON_PASTECART THEN
2015     CONJ_TAC THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
2016     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
2017     SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_FSTCART; LINEAR_SNDCART] THEN
2018     REWRITE_TAC[GSYM PCROSS_INTERVAL; PCROSS; GSYM SIMPLE_IMAGE] THEN
2019     REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART;
2020                 SET_RULE `{f x | x IN {g a b | P a /\ Q b}} =
2021                           {f(g a b) | P a /\ Q b}`] THEN
2022     REPEAT(FIRST_X_ASSUM(ASSUME_TAC o REWRITE_RULE[path] o
2023         MATCH_MP VALID_PATH_IMP_PATH)) THEN
2024     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
2025       CONTINUOUS_ON_SUBSET)) THEN
2026     SIMP_TAC[SUBSET; FORALL_IN_GSPEC];
2027     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
2028       CONTINUOUS_ON_SUBSET)) THEN
2029     REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM;
2030                 FORALL_PASTECART; GSYM PCROSS_INTERVAL; PCROSS;
2031                 path_image; FSTCART_PASTECART; SNDCART_PASTECART] THEN
2032     SIMP_TAC[FUN_IN_IMAGE]]);;
2033
2034 (* ------------------------------------------------------------------------- *)
2035 (* The key quadrisection step.                                               *)
2036 (* ------------------------------------------------------------------------- *)
2037
2038 let NORM_SUM_LEMMA = prove
2039  (`norm(a + b + c + d:complex) >= e
2040    ==> norm(a) >= e / &4 \/
2041        norm(b) >= e / &4 \/
2042        norm(c) >= e / &4 \/
2043        norm(d) >= e / &4`,
2044   NORM_ARITH_TAC);;
2045
2046 let CAUCHY_THEOREM_QUADRISECTION = prove
2047  (`!f a b c e K.
2048         f continuous_on (convex hull {a,b,c}) /\
2049         dist (a,b) <= K /\
2050         dist (b,c) <= K /\
2051         dist (c,a) <= K /\
2052         norm(path_integral(linepath(a,b)) f +
2053              path_integral(linepath(b,c)) f +
2054              path_integral(linepath(c,a)) f) >= e * K pow 2
2055         ==> ?a' b' c'. a' IN convex hull {a,b,c} /\
2056                        b' IN convex hull {a,b,c} /\
2057                        c' IN convex hull {a,b,c} /\
2058                        dist(a',b') <= K / &2 /\
2059                        dist(b',c') <= K / &2 /\
2060                        dist(c',a') <= K / &2 /\
2061                        norm(path_integral(linepath(a',b')) f +
2062                             path_integral(linepath(b',c')) f +
2063                             path_integral(linepath(c',a')) f)
2064                         >= e * (K / &2) pow 2`,
2065   REPEAT STRIP_TAC THEN MAP_EVERY ABBREV_TAC
2066    [`a':complex = midpoint(b,c)`;
2067     `b':complex = midpoint(c,a)`;
2068     `c':complex = midpoint(a,b)`] THEN
2069   SUBGOAL_THEN
2070    `path_integral(linepath(a,b)) f +
2071     path_integral(linepath(b,c)) f +
2072     path_integral(linepath(c,a)) f =
2073     (path_integral(linepath(a,c')) f +
2074      path_integral(linepath(c',b')) f +
2075      path_integral(linepath(b',a)) f) +
2076     (path_integral(linepath(a',c')) f +
2077      path_integral(linepath(c',b)) f +
2078      path_integral(linepath(b,a')) f) +
2079     (path_integral(linepath(a',c)) f +
2080      path_integral(linepath(c,b')) f +
2081      path_integral(linepath(b',a')) f) +
2082     (path_integral(linepath(a',b')) f +
2083      path_integral(linepath(b',c')) f +
2084      path_integral(linepath(c',a')) f)`
2085   SUBST_ALL_TAC THENL
2086    [MP_TAC(SPEC `f:complex->complex` PATH_INTEGRAL_MIDPOINT) THEN DISCH_THEN
2087      (fun th -> MP_TAC(SPECL [`a:complex`; `b:complex`] th) THEN
2088                 MP_TAC(SPECL [`b:complex`; `c:complex`] th) THEN
2089                 MP_TAC(SPECL [`c:complex`; `a:complex`] th)) THEN
2090     MP_TAC(SPEC `f:complex->complex` PATH_INTEGRAL_REVERSE_LINEPATH) THEN DISCH_THEN
2091      (fun th -> MP_TAC(SPECL [`a':complex`; `b':complex`] th) THEN
2092                 MP_TAC(SPECL [`b':complex`; `c':complex`] th) THEN
2093                 MP_TAC(SPECL [`c':complex`; `a':complex`] th)) THEN
2094     ASM_REWRITE_TAC[] THEN
2095     REPEAT(MATCH_MP_TAC(TAUT
2096      `((a /\ c ==> b /\ d) ==> e) ==> (a ==> b) ==> (c ==> d) ==> e`)) THEN
2097     ANTS_TAC THENL [ALL_TAC; CONV_TAC COMPLEX_RING] THEN
2098     REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2099     REPEAT CONJ_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2100     EXISTS_TAC `convex hull {a:complex,b,c}` THEN ASM_REWRITE_TAC[] THEN
2101     MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2102     SIMP_TAC[IN_INSERT; NOT_IN_EMPTY;
2103              TAUT `(a \/ b ==> c) <=> (a ==> c) /\ (b ==> c)`] THEN
2104     MAP_EVERY EXPAND_TAC ["a'"; "b'"; "c'"] THEN
2105     SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT];
2106     ALL_TAC] THEN
2107   REWRITE_TAC[REAL_ARITH `e * (K / &2) pow 2 = (e * K pow 2) / &4`] THEN
2108   FIRST_X_ASSUM(MP_TAC o MATCH_MP NORM_SUM_LEMMA) THEN STRIP_TAC THENL
2109    [MAP_EVERY EXISTS_TAC [`a:complex`; `c':complex`; `b':complex`];
2110     MAP_EVERY EXISTS_TAC [`a':complex`; `c':complex`; `b:complex`];
2111     MAP_EVERY EXISTS_TAC [`a':complex`; `c:complex`; `b':complex`];
2112     MAP_EVERY EXISTS_TAC [`a':complex`; `b':complex`; `c':complex`]] THEN
2113   ASM_REWRITE_TAC[] THEN
2114   MAP_EVERY EXPAND_TAC ["a'"; "b'"; "c'"] THEN
2115   SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT] THEN
2116   REWRITE_TAC[midpoint; dist; GSYM VECTOR_SUB_LDISTRIB;
2117               VECTOR_ARITH `a - inv(&2) % (a + b) = inv(&2) % (a - b)`;
2118               VECTOR_ARITH `inv(&2) % (c + a) - a = inv(&2) % (c - a)`;
2119               VECTOR_ARITH `(a + b) - (c + a) = b - c`;
2120               VECTOR_ARITH `(b + c) - (c + a) = b - a`] THEN
2121   SIMP_TAC[NORM_MUL; REAL_ARITH `abs(inv(&2)) * x <= k / &2 <=> x <= k`] THEN
2122   ASM_REWRITE_TAC[GSYM dist] THEN ASM_MESON_TAC[DIST_SYM]);;
2123
2124 (* ------------------------------------------------------------------------- *)
2125 (* Yet at small enough scales this cannot be the case.                       *)
2126 (* ------------------------------------------------------------------------- *)
2127
2128 let TRIANGLE_POINTS_CLOSER = prove
2129  (`!a b c x y:real^N.
2130         x IN convex hull {a,b,c} /\
2131         y IN convex hull {a,b,c}
2132         ==> norm(x - y) <= norm(a - b) \/
2133             norm(x - y) <= norm(b - c) \/
2134             norm(x - y) <= norm(c - a)`,
2135   REPEAT STRIP_TAC THEN MP_TAC(ISPEC `{a:real^N,b,c}` SIMPLEX_EXTREMAL_LE) THEN
2136   REWRITE_TAC[FINITE_INSERT; FINITE_RULES; NOT_INSERT_EMPTY] THEN
2137   REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2138   REPEAT STRIP_TAC THEN
2139   FIRST_X_ASSUM(MP_TAC o SPECL [`x:real^N`; `y:real^N`]) THEN
2140   ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
2141   ASM_MESON_TAC[NORM_POS_LE; REAL_LE_TRANS; NORM_SUB]);;
2142
2143 let HOLOMORPHIC_POINT_SMALL_TRIANGLE = prove
2144  (`!f s x e.
2145         x IN s /\ f continuous_on s /\
2146         f complex_differentiable (at x within s) /\
2147         &0 < e
2148         ==> ?k. &0 < k /\
2149                 !a b c. dist(a,b) <= k /\ dist(b,c) <= k /\ dist(c,a) <= k /\
2150                         x IN convex hull {a,b,c} /\ convex hull {a,b,c} SUBSET s
2151                         ==> norm(path_integral(linepath(a,b)) f +
2152                                  path_integral(linepath(b,c)) f +
2153                                  path_integral(linepath(c,a)) f)
2154                             <= e * (dist(a,b) + dist(b,c) + dist(c,a)) pow 2`,
2155   REPEAT STRIP_TAC THEN
2156   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [complex_differentiable]) THEN
2157   DISCH_THEN(X_CHOOSE_THEN `f':complex` MP_TAC) THEN
2158   GEN_REWRITE_TAC LAND_CONV [has_complex_derivative] THEN
2159   REWRITE_TAC[HAS_DERIVATIVE_WITHIN_ALT] THEN
2160   DISCH_THEN(MP_TAC o SPEC `e:real` o CONJUNCT2) THEN
2161   ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
2162   GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV)
2163    [TAUT `a /\ b ==> c <=> b ==> a ==> c`] THEN
2164   REWRITE_TAC[APPROACHABLE_LT_LE] THEN
2165   ONCE_REWRITE_TAC[TAUT `b ==> a ==> c <=> a /\ b ==> c`] THEN
2166   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN STRIP_TAC THEN
2167   ASM_REWRITE_TAC[dist] THEN
2168   MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`; `c:complex`] THEN
2169   STRIP_TAC THEN
2170   SUBGOAL_THEN
2171    `path_integral (linepath(a,b)) f +
2172     path_integral (linepath(b,c)) f +
2173     path_integral (linepath(c,a)) f =
2174     path_integral (linepath(a,b)) (\y. f y - f x - f' * (y - x)) +
2175     path_integral (linepath(b,c)) (\y. f y - f x - f' * (y - x)) +
2176     path_integral (linepath(c,a)) (\y. f y - f x - f' * (y - x))`
2177   SUBST1_TAC THENL
2178    [SUBGOAL_THEN
2179      `path_integral (linepath(a,b)) (\y. f y - f x - f' * (y - x)) =
2180       path_integral (linepath(a,b)) f -
2181       path_integral (linepath(a,b)) (\y. f x + f' * (y - x)) /\
2182       path_integral (linepath(b,c)) (\y. f y - f x - f' * (y - x)) =
2183       path_integral (linepath(b,c)) f -
2184       path_integral (linepath(b,c)) (\y. f x + f' * (y - x)) /\
2185       path_integral (linepath(c,a)) (\y. f y - f x - f' * (y - x)) =
2186       path_integral (linepath(c,a)) f -
2187       path_integral (linepath(c,a)) (\y. f x + f' * (y - x))`
2188     (REPEAT_TCL CONJUNCTS_THEN SUBST1_TAC) THENL
2189      [REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a - b - c = a - (b + c)`] THEN
2190       REPEAT CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
2191       MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
2192       CONJ_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
2193       MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2194       MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2195       EXISTS_TAC `s:complex->bool` THEN
2196       ASM_SIMP_TAC[CONTINUOUS_ON_ID; CONTINUOUS_ON_ADD; CONTINUOUS_ON_CONST;
2197                    CONTINUOUS_ON_COMPLEX_MUL; CONTINUOUS_ON_SUB] THEN
2198       MATCH_MP_TAC SUBSET_TRANS THEN
2199       EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2200       ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2201       MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2202       REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
2203       ASM_SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT];
2204       ALL_TAC] THEN
2205     REWRITE_TAC[COMPLEX_RING
2206      `x + y + z = (x - x') + (y - y') + (z - z') <=>
2207       x' + y' + z' = Cx(&0)`] THEN
2208     MP_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`;
2209                    `f':complex`; `f x - f' * x`]
2210            TRIANGLE_LINEAR_HAS_CHAIN_INTEGRAL) THEN
2211     REWRITE_TAC[COMPLEX_RING
2212      `f' * x' + f x - f' * x = f x + f' * (x' - x)`] THEN
2213     DISCH_THEN(MP_TAC o MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2214     REWRITE_TAC[];
2215     ALL_TAC] THEN
2216   ONCE_REWRITE_TAC[NORM_SUB] THEN MATCH_MP_TAC(REAL_ARITH
2217    `&0 <= x * y /\ &0 <= x * z /\ &0 <= y * z /\
2218     a <= (e * (x + y + z)) * x +
2219          (e * (x + y + z)) * y +
2220          (e * (x + y + z)) * z
2221     ==> a <= e * (x + y + z) pow 2`) THEN
2222   SIMP_TAC[REAL_LE_MUL; NORM_POS_LE] THEN
2223   REPEAT(MATCH_MP_TAC NORM_TRIANGLE_LE THEN
2224          MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC) THEN
2225   (MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
2226    EXISTS_TAC `\y:complex. f y - f x - f' * (y - x)` THEN
2227    ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_ADD; REAL_LT_IMP_LE; NORM_POS_LE] THEN
2228    CONJ_TAC THENL
2229     [MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
2230      MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2231      MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
2232      ASM_SIMP_TAC[CONTINUOUS_ON_SUB; ETA_AX; CONTINUOUS_ON_COMPLEX_MUL;
2233                  CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
2234      MATCH_MP_TAC SUBSET_TRANS THEN
2235      EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2236      ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2237      MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2238      REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
2239      ASM_SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT];
2240      ALL_TAC] THEN
2241    X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
2242    MATCH_MP_TAC REAL_LE_TRANS THEN
2243    EXISTS_TAC `e * norm(y - x:complex)` THEN CONJ_TAC THENL
2244     [FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL
2245       [MATCH_MP_TAC(SET_RULE `!t. y IN t /\ t SUBSET s ==> y IN s`) THEN
2246        EXISTS_TAC `convex hull {a:complex,b,c}` THEN ASM_REWRITE_TAC[];
2247        MATCH_MP_TAC(REAL_ARITH
2248         `!n1 n2 n3. n1 <= d /\ n2 <= d /\ n3 <= d /\
2249                     (n <= n1 \/ n <= n2 \/ n <= n3)
2250                     ==> n <= d`) THEN
2251        MAP_EVERY EXISTS_TAC
2252         [`norm(a - b:complex)`; `norm(b - c:complex)`;
2253          `norm(c - a:complex)`] THEN
2254        ASM_REWRITE_TAC[] THEN MATCH_MP_TAC TRIANGLE_POINTS_CLOSER];
2255      ASM_SIMP_TAC[REAL_LE_LMUL_EQ] THEN
2256      ONCE_REWRITE_TAC[NORM_SUB] THEN
2257      MATCH_MP_TAC(REAL_ARITH
2258       `(x <= a \/ x <= b \/ x <= c) /\ (&0 <= a /\ &0 <= b /\ &0 <= c)
2259        ==> x <= a + b + c`) THEN
2260      REWRITE_TAC[NORM_POS_LE] THEN MATCH_MP_TAC TRIANGLE_POINTS_CLOSER THEN
2261      ASM_REWRITE_TAC[]] THEN
2262     REPEAT CONJ_TAC THEN
2263     FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
2264      `x IN s ==> s SUBSET t ==> x IN t`)) THEN
2265     REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2266     REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
2267     ASM_SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL;
2268                  IN_INSERT]));;
2269
2270 (* ------------------------------------------------------------------------- *)
2271 (* Hence the most basic theorem for a triangle.                              *)
2272 (* ------------------------------------------------------------------------- *)
2273
2274 let CAUCHY_THEOREM_TRIANGLE = prove
2275  (`!f a b c.
2276         f holomorphic_on (convex hull {a,b,c})
2277         ==> (f has_path_integral Cx(&0))
2278             (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`,
2279   let lemma1 = prove
2280    (`!P Q abc.
2281           P abc 0 /\
2282           (!abc:A n. P abc n ==> ?abc'. P abc' (SUC n) /\ Q abc' abc)
2283           ==> ?ABC. ABC 0 = abc /\ !n. P (ABC n) n /\ Q (ABC(SUC n)) (ABC n)`,
2284     REPEAT STRIP_TAC THEN
2285     (MP_TAC o prove_recursive_functions_exist num_RECURSION)
2286       `ABC 0 = abc:A /\
2287        !n. ABC(SUC n) = @abc. P abc (SUC n) /\ Q abc (ABC n)` THEN
2288     MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN
2289     STRIP_TAC THEN CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
2290     REWRITE_TAC[FORALL_AND_THM] THEN
2291     MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
2292      [INDUCT_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; ALL_TAC] THEN
2293     DISCH_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]) in
2294   let lemma3 = prove
2295    (`!P Q a:A b:A c:A.
2296           P a b c 0 /\
2297           (!a b c n. P a b c n
2298                      ==> ?a' b' c'. P a' b' c' (SUC n) /\ Q a' b' c' a b c)
2299           ==> ?A B C. A 0 = a /\ B 0 = b /\ C 0 = c /\
2300                       !n. P (A n) (B n) (C n) n /\
2301                           Q (A(SUC n)) (B(SUC n)) (C(SUC n)) (A n) (B n) (C n)`,
2302     REPEAT STRIP_TAC THEN
2303     MP_TAC(ISPECL
2304      [`\(a,b,c). (P:A->A->A->num->bool) a b c`;
2305       `\(a,b,c) (a',b',c'). (Q:A->A->A->A->A->A->bool) a b c a' b' c'`;
2306       `(a:A,b:A,c:A)`]
2307           lemma1) THEN
2308     REWRITE_TAC[FORALL_PAIR_THM; EXISTS_PAIR_THM] THEN
2309     ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
2310     DISCH_THEN(X_CHOOSE_THEN `ABC:num->A#A#A` STRIP_ASSUME_TAC) THEN
2311     MAP_EVERY EXISTS_TAC
2312      [`(\(a,b,c). a) o (ABC:num->A#A#A)`;
2313       `(\(a,b,c). b) o (ABC:num->A#A#A)`;
2314       `(\(a,b,c). c) o (ABC:num->A#A#A)`] THEN
2315     REWRITE_TAC[o_THM] THEN
2316     REPEAT(CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC]) THEN
2317     X_GEN_TAC `n:num` THEN
2318     FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN
2319     SPEC_TAC(`(ABC:num->A#A#A) (SUC n)`,`y:A#A#A`) THEN
2320     SPEC_TAC(`(ABC:num->A#A#A) n`,`x:A#A#A`) THEN
2321     REWRITE_TAC[FORALL_PAIR_THM]) in
2322   REPEAT STRIP_TAC THEN
2323   STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2324                 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2325   FIRST_ASSUM(ASSUME_TAC o MATCH_MP HOLOMORPHIC_ON_IMP_CONTINUOUS_ON) THEN
2326   SUBGOAL_THEN
2327    `f path_integrable_on (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`
2328   MP_TAC THENL
2329    [SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN; VALID_PATH_LINEPATH;
2330              PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
2331              PATHFINISH_LINEPATH] THEN
2332     ASM_MESON_TAC[PATH_INTEGRABLE_CONTINUOUS_LINEPATH; CONTINUOUS_ON_SUBSET];
2333     ALL_TAC] THEN
2334   SIMP_TAC[path_integrable_on] THEN DISCH_THEN(X_CHOOSE_TAC `y:complex`) THEN
2335   ASM_CASES_TAC `y = Cx(&0)` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
2336   ABBREV_TAC
2337    `K = &1 + max (dist(a:complex,b)) (max (dist(b,c)) (dist(c,a)))` THEN
2338   SUBGOAL_THEN `&0 < K` ASSUME_TAC THENL
2339    [EXPAND_TAC "K" THEN MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < &1 + x`) THEN
2340     REWRITE_TAC[REAL_LE_MAX; DIST_POS_LE];
2341     ALL_TAC] THEN
2342   ABBREV_TAC `e = norm(y:complex) / K pow 2` THEN
2343   SUBGOAL_THEN `&0 < e` ASSUME_TAC THENL
2344    [EXPAND_TAC "e" THEN
2345     ASM_SIMP_TAC[REAL_LT_DIV; REAL_POW_LT; COMPLEX_NORM_NZ];
2346     ALL_TAC] THEN
2347   SUBGOAL_THEN
2348    `?A B C. A 0 = a /\ B 0 = b /\ C 0 = c /\
2349             !n. (convex hull {A n,B n,C n} SUBSET convex hull {a,b,c} /\
2350                  dist(A n,B n) <= K / &2 pow n /\
2351                  dist(B n,C n) <= K / &2 pow n /\
2352                  dist(C n,A n) <= K / &2 pow n /\
2353                  norm(path_integral(linepath (A n,B n)) f +
2354                       path_integral(linepath (B n,C n)) f +
2355                       path_integral(linepath (C n,A n)) f) >=
2356                  e * (K / &2 pow n) pow 2) /\
2357                 convex hull {A(SUC n),B(SUC n),C(SUC n)} SUBSET
2358                 convex hull {A n,B n,C n}`
2359   MP_TAC THENL
2360    [MATCH_MP_TAC lemma3 THEN CONJ_TAC THENL
2361      [ASM_REWRITE_TAC[real_pow; REAL_DIV_1; CONJ_ASSOC; SUBSET_REFL] THEN
2362       CONJ_TAC THENL [EXPAND_TAC "K" THEN REAL_ARITH_TAC; ALL_TAC] THEN
2363       EXPAND_TAC "e" THEN
2364       ASM_SIMP_TAC[REAL_DIV_RMUL; REAL_LT_IMP_NZ; REAL_POW_LT] THEN
2365       MATCH_MP_TAC(REAL_ARITH `x = y ==> x >= y`) THEN AP_TERM_TAC THEN
2366       FIRST_ASSUM(SUBST1_TAC o SYM o
2367         MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2368       REWRITE_TAC[];
2369       ALL_TAC] THEN
2370     MAP_EVERY X_GEN_TAC
2371      [`a':complex`; `b':complex`; `c':complex`; `n:num`] THEN
2372     REPEAT STRIP_TAC THEN
2373     MP_TAC(SPECL [`f:complex->complex`; `a':complex`; `b':complex`;
2374        `c':complex`; `e:real`; `K / &2 pow n`]
2375        CAUCHY_THEOREM_QUADRISECTION) THEN
2376     ASM_REWRITE_TAC[] THEN
2377     ANTS_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2378     REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN STRIP_TAC THEN
2379     ASM_REWRITE_TAC[real_pow; REAL_FIELD `x / (&2 * y) = x / y / &2`] THEN
2380     MATCH_MP_TAC(SET_RULE
2381      `s SUBSET t /\ t SUBSET u ==> s SUBSET u /\ s SUBSET t`) THEN
2382     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2383     ASM SET_TAC[];
2384     ALL_TAC] THEN
2385   REWRITE_TAC[FORALL_AND_THM] THEN STRIP_TAC THEN
2386   SUBGOAL_THEN
2387    `?x:complex. !n:num. x IN convex hull {A n,B n,C n}`
2388   STRIP_ASSUME_TAC THENL
2389    [MATCH_MP_TAC BOUNDED_CLOSED_NEST THEN REPEAT CONJ_TAC THENL
2390      [GEN_TAC THEN MATCH_MP_TAC COMPACT_IMP_CLOSED;
2391       REWRITE_TAC[CONVEX_HULL_EQ_EMPTY; NOT_INSERT_EMPTY];
2392       MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN ASM_REWRITE_TAC[] THEN
2393       MESON_TAC[SUBSET_REFL; SUBSET_TRANS];
2394       MATCH_MP_TAC COMPACT_IMP_BOUNDED] THEN
2395     MATCH_MP_TAC FINITE_IMP_COMPACT_CONVEX_HULL THEN
2396     REWRITE_TAC[FINITE_INSERT; FINITE_RULES];
2397     ALL_TAC] THEN
2398   MP_TAC(ISPECL [`f:complex->complex`; `convex hull {a:complex,b,c}`;
2399                  `x:complex`; `e / &10`] HOLOMORPHIC_POINT_SMALL_TRIANGLE) THEN
2400   ANTS_TAC THENL
2401    [ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; complex_differentiable] THEN
2402     ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
2403     ASM_MESON_TAC[holomorphic_on; SUBSET];
2404     ALL_TAC] THEN
2405   DISCH_THEN(X_CHOOSE_THEN `k:real` STRIP_ASSUME_TAC) THEN
2406   MP_TAC(SPEC `K:real / k` REAL_ARCH_POW2) THEN
2407   ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN
2408   ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2409   SIMP_TAC[GSYM REAL_LT_LDIV_EQ; REAL_POW_LT; REAL_OF_NUM_LT; ARITH] THEN
2410   DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN FIRST_X_ASSUM(MP_TAC o SPECL
2411    [`(A:num->complex) n`; `(B:num->complex) n`; `(C:num->complex) n`]) THEN
2412   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
2413    [ASM_MESON_TAC[REAL_LE_TRANS; REAL_LT_IMP_LE]; ALL_TAC] THEN
2414   ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN DISCH_THEN(K ALL_TAC) THEN
2415   REWRITE_TAC[REAL_NOT_LE] THEN
2416   MATCH_MP_TAC REAL_LTE_TRANS THEN
2417   EXISTS_TAC `e * (K / &2 pow n) pow 2` THEN
2418   CONJ_TAC THENL [ALL_TAC; ASM_REWRITE_TAC[GSYM real_ge]] THEN
2419   ASM_SIMP_TAC[real_div; GSYM REAL_MUL_ASSOC; REAL_LT_LMUL_EQ] THEN
2420   MATCH_MP_TAC(REAL_ARITH
2421    `&0 < x /\ y <= &9 * x ==> inv(&10) * y < x`) THEN
2422   ASM_SIMP_TAC[REAL_POW_LT; REAL_LT_MUL; REAL_LT_INV_EQ;
2423                 REAL_OF_NUM_LT; ARITH] THEN
2424   REWRITE_TAC[REAL_ARITH `&9 * x pow 2 = (&3 * x) pow 2`] THEN
2425   MATCH_MP_TAC REAL_POW_LE2 THEN
2426   SIMP_TAC[REAL_LE_ADD; DIST_POS_LE; GSYM real_div] THEN
2427   MATCH_MP_TAC(REAL_ARITH
2428    `x <= a /\ y <= a /\ z <= a ==> x + y + z <= &3 * a`) THEN
2429   ASM_REWRITE_TAC[]);;
2430
2431 (* ------------------------------------------------------------------------- *)
2432 (* Version needing function holomorphic in interior only.                    *)
2433 (* ------------------------------------------------------------------------- *)
2434
2435 let CAUCHY_THEOREM_FLAT_LEMMA = prove
2436  (`!f a b c k.
2437         f continuous_on convex hull {a,b,c} /\ c - a = k % (b - a) /\ &0 <= k
2438         ==> path_integral (linepath(a,b)) f +
2439             path_integral (linepath(b,c)) f +
2440             path_integral (linepath(c,a)) f = Cx(&0)`,
2441   REPEAT STRIP_TAC THEN
2442   STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2443                 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2444   ASM_CASES_TAC `k <= &1` THENL
2445    [MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `b:complex`; `c:complex`;
2446                   `k:real`] PATH_INTEGRAL_SPLIT) THEN
2447     ASM_REWRITE_TAC[] THEN
2448     ANTS_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2449     DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC(COMPLEX_RING
2450      `x = --b /\ y = --a ==> (x + y) + (a + b) = Cx(&0)`) THEN
2451     CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_REVERSE_LINEPATH THEN
2452     ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
2453     MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `c:complex`; `b:complex`;
2454                   `inv k:real`] PATH_INTEGRAL_SPLIT) THEN
2455     ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_LE_INV_EQ; REAL_MUL_LINV; REAL_INV_LE_1;
2456       VECTOR_MUL_LID; REAL_ARITH `~(k <= &1) ==> ~(k = &0) /\ &1 <= k`] THEN
2457     ANTS_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2458     MATCH_MP_TAC(COMPLEX_RING
2459      `ac = --ca ==> ac = ab + bc ==> ab + bc + ca = Cx(&0)`) THEN
2460     MATCH_MP_TAC PATH_INTEGRAL_REVERSE_LINEPATH THEN
2461     ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]]);;
2462
2463 let CAUCHY_THEOREM_FLAT = prove
2464  (`!f a b c k.
2465         f continuous_on convex hull {a,b,c} /\ c - a = k % (b - a)
2466         ==> path_integral (linepath(a,b)) f +
2467             path_integral (linepath(b,c)) f +
2468             path_integral (linepath(c,a)) f = Cx(&0)`,
2469   REPEAT STRIP_TAC THEN ASM_CASES_TAC `&0 <= k` THENL
2470    [ASM_MESON_TAC[CAUCHY_THEOREM_FLAT_LEMMA]; ALL_TAC] THEN
2471   STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2472                 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2473   MP_TAC(ISPECL [`f:complex->complex`; `b:complex`; `a:complex`; `c:complex`;
2474                  `&1 - k`] CAUCHY_THEOREM_FLAT_LEMMA) THEN
2475   ANTS_TAC THENL
2476    [ASM_MESON_TAC[INSERT_AC; REAL_ARITH `~(&0 <= k) ==> &0 <= &1 - k`;
2477          VECTOR_ARITH `b - a = k % (c - a) ==> (b - c) = (&1 - k) % (a - c)`];
2478     ALL_TAC] THEN
2479   MATCH_MP_TAC(COMPLEX_RING
2480      `ab = --ba /\ ac = --ca /\ bc = --cb
2481       ==> ba + ac + cb = Cx(&0) ==> ab + bc + ca = Cx(&0)`) THEN
2482   REPEAT CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_REVERSE_LINEPATH THEN
2483   ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]);;
2484
2485 let CAUCHY_THEOREM_TRIANGLE_INTERIOR = prove
2486  (`!f a b c.
2487         f continuous_on (convex hull {a,b,c}) /\
2488         f holomorphic_on interior (convex hull {a,b,c})
2489         ==> (f has_path_integral Cx(&0))
2490             (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`,
2491   REPEAT STRIP_TAC THEN
2492   STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2493                 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2494   SUBGOAL_THEN
2495     `?B. &0 < B /\
2496          !y. y IN IMAGE (f:complex->complex) (convex hull {a,b,c})
2497              ==> norm(y) <= B`
2498   MP_TAC THENL
2499    [REWRITE_TAC[GSYM BOUNDED_POS] THEN MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
2500     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
2501     ASM_SIMP_TAC[FINITE_IMP_COMPACT_CONVEX_HULL; FINITE_INSERT; FINITE_RULES];
2502     REWRITE_TAC[FORALL_IN_IMAGE] THEN STRIP_TAC] THEN
2503   SUBGOAL_THEN
2504     `?C. &0 < C /\ !x:complex. x IN convex hull {a,b,c} ==> norm(x) <= C`
2505   MP_TAC THENL
2506    [REWRITE_TAC[GSYM BOUNDED_POS] THEN
2507     MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
2508     ASM_SIMP_TAC[FINITE_IMP_COMPACT_CONVEX_HULL; FINITE_INSERT; FINITE_RULES];
2509     STRIP_TAC] THEN
2510   SUBGOAL_THEN
2511    `(f:complex->complex) uniformly_continuous_on (convex hull {a,b,c})`
2512   MP_TAC THENL
2513    [MATCH_MP_TAC COMPACT_UNIFORMLY_CONTINUOUS THEN
2514     ASM_SIMP_TAC[FINITE_IMP_COMPACT_CONVEX_HULL; FINITE_RULES; FINITE_INSERT];
2515     ALL_TAC] THEN
2516   REWRITE_TAC[uniformly_continuous_on] THEN DISCH_TAC THEN
2517   SUBGOAL_THEN
2518    `f path_integrable_on
2519     (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`
2520   MP_TAC THENL
2521    [SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN; VALID_PATH_LINEPATH;
2522              PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
2523              PATHFINISH_LINEPATH] THEN
2524     ASM_MESON_TAC[PATH_INTEGRABLE_CONTINUOUS_LINEPATH; CONTINUOUS_ON_SUBSET];
2525     ALL_TAC] THEN
2526   SIMP_TAC[path_integrable_on] THEN DISCH_THEN(X_CHOOSE_TAC `y:complex`) THEN
2527   ASM_CASES_TAC `y = Cx(&0)` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
2528   UNDISCH_TAC `~(y = Cx(&0))` THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
2529   DISCH_THEN(K ALL_TAC) THEN REWRITE_TAC[] THEN
2530   FIRST_ASSUM(ASSUME_TAC o SYM o MATCH_MP
2531      HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2532   ASM_REWRITE_TAC[] THEN
2533   ASM_CASES_TAC `c:complex = a` THENL
2534    [MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2535     EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ];
2536     ALL_TAC] THEN
2537   ASM_CASES_TAC `b:complex = c` THENL
2538    [ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = c + a + b`] THEN
2539     MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2540     EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ] THEN
2541     ASM_MESON_TAC[INSERT_AC];
2542     ALL_TAC] THEN
2543   ASM_CASES_TAC `a:complex = b` THENL
2544    [ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = b + c + a`] THEN
2545     MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2546     EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ] THEN
2547     ASM_MESON_TAC[INSERT_AC];
2548     ALL_TAC] THEN
2549   ASM_CASES_TAC `interior(convex hull {a:complex,b,c}) = {}` THENL
2550    [MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2551     SUBGOAL_THEN `{a:complex,b,c} HAS_SIZE (dimindex(:2) + 1)`
2552     MP_TAC THENL
2553      [ASM_SIMP_TAC[HAS_SIZE; CARD_CLAUSES; FINITE_INSERT; FINITE_EMPTY] THEN
2554       ASM_REWRITE_TAC[DIMINDEX_2; ARITH; IN_INSERT; NOT_IN_EMPTY];
2555       ALL_TAC] THEN
2556     DISCH_THEN(MP_TAC o MATCH_MP INTERIOR_CONVEX_HULL_EQ_EMPTY) THEN
2557     ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
2558     SUBGOAL_THEN `collinear{a:complex,b,c}` MP_TAC THENL
2559      [ASM_REWRITE_TAC[COLLINEAR_3_EQ_AFFINE_DEPENDENT]; ALL_TAC] THEN
2560     ONCE_REWRITE_TAC[SET_RULE `{a,b,c} = {b,a,c}`] THEN
2561     ONCE_REWRITE_TAC[COLLINEAR_3] THEN
2562     ASM_REWRITE_TAC[COLLINEAR_LEMMA; VECTOR_SUB_EQ];
2563     ALL_TAC] THEN
2564   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
2565   DISCH_THEN(X_CHOOSE_TAC `d:complex`) THEN FIRST_X_ASSUM(MP_TAC o SYM) THEN
2566   DISCH_TAC THEN
2567   ASM_REWRITE_TAC[] THEN ASM_CASES_TAC `y = Cx(&0)` THEN ASM_REWRITE_TAC[] THEN
2568   FIRST_X_ASSUM(MP_TAC o SPEC `norm(y:complex) / &24 / C`) THEN
2569   SUBGOAL_THEN `&0 < norm(y:complex) / &24 / C` ASSUME_TAC THENL
2570    [ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH; NORM_POS_LE; REAL_LTE_ADD;
2571                  COMPLEX_NORM_NZ; COMPLEX_SUB_0];
2572     ASM_REWRITE_TAC[dist]] THEN
2573   DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN ABBREV_TAC
2574    `e = min (&1)
2575             (min (d1 / (&4 * C))
2576                  ((norm(y:complex) / &24 / C) / B))` THEN
2577   SUBGOAL_THEN `&0 < e` ASSUME_TAC THENL
2578    [EXPAND_TAC "e" THEN
2579     ASM_SIMP_TAC[REAL_HALF; REAL_LT_MIN; REAL_LT_DIV; COMPLEX_NORM_NZ;
2580                  REAL_LT_MUL; REAL_OF_NUM_LT; ARITH];
2581     ALL_TAC] THEN
2582   ABBREV_TAC `shrink = \x:complex. x - e % (x - d)` THEN
2583   SUBGOAL_THEN `shrink (a:complex) IN interior(convex hull {a,b,c}) /\
2584                 shrink b IN interior(convex hull {a,b,c}) /\
2585                 shrink c IN interior(convex hull {a,b,c})`
2586   STRIP_ASSUME_TAC THENL
2587    [REPEAT CONJ_TAC THEN EXPAND_TAC "shrink" THEN
2588     MATCH_MP_TAC IN_INTERIOR_CONVEX_SHRINK THEN
2589     ASM_REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
2590     (CONJ_TAC THENL [ALL_TAC; EXPAND_TAC "e" THEN REAL_ARITH_TAC]) THEN
2591     MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2592     REWRITE_TAC[IN_INSERT];
2593     ALL_TAC] THEN
2594   SUBGOAL_THEN
2595    `norm((path_integral(linepath(shrink a,shrink b)) f -
2596           path_integral(linepath(a,b)) f) +
2597          (path_integral(linepath(shrink b,shrink c)) f -
2598           path_integral(linepath(b,c)) f) +
2599          (path_integral(linepath(shrink c,shrink a)) f -
2600           path_integral(linepath(c,a)) f)) <= norm(y:complex) / &2`
2601   MP_TAC THENL
2602    [ALL_TAC;
2603     ASM_REWRITE_TAC[COMPLEX_RING
2604      `(ab' - ab) + (bc' - bc) + (ca' - ca) =
2605       (ab' + bc' + ca') - (ab + bc + ca)`] THEN
2606     SUBGOAL_THEN
2607      `(f has_path_integral (Cx(&0)))
2608       (linepath (shrink a,shrink b) ++
2609        linepath (shrink b,shrink c) ++
2610        linepath (shrink c,shrink (a:complex)))`
2611     MP_TAC THENL
2612      [MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE THEN
2613       MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
2614       EXISTS_TAC `interior(convex hull {a:complex,b,c})` THEN
2615       ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HULL_MINIMAL THEN
2616       SIMP_TAC[CONVEX_INTERIOR; CONVEX_CONVEX_HULL] THEN
2617       ASM SET_TAC[];
2618       ALL_TAC] THEN
2619     DISCH_THEN(MP_TAC o MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2620     SIMP_TAC[] THEN DISCH_THEN(K ALL_TAC) THEN
2621     REWRITE_TAC[COMPLEX_SUB_LZERO; NORM_NEG] THEN
2622     MATCH_MP_TAC(REAL_ARITH `&0 <= y /\ ~(y = &0) ==> ~(y <= y / &2)`) THEN
2623     ASM_REWRITE_TAC[COMPLEX_NORM_ZERO; NORM_POS_LE]] THEN
2624   SUBGOAL_THEN
2625    `!x y. x IN convex hull {a,b,c} /\ y IN convex hull {a,b,c}
2626           ==> norm(x - y) <= &2 * C`
2627   ASSUME_TAC THENL
2628    [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_MUL_2; VECTOR_SUB] THEN
2629     MATCH_MP_TAC NORM_TRIANGLE_LE THEN REWRITE_TAC[NORM_NEG] THEN
2630     MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_SIMP_TAC[];
2631     ALL_TAC] THEN
2632   REWRITE_TAC[REAL_ARITH `x / &2 = x / &6 + x / &6 + x / &6`] THEN
2633   REPEAT(MATCH_MP_TAC NORM_TRIANGLE_LE THEN
2634          MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC) THEN
2635   GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
2636   GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM CONTENT_UNIT_1] THEN
2637   MATCH_MP_TAC HAS_INTEGRAL_BOUND THENL
2638    [EXISTS_TAC `\x. f(linepath(shrink a,shrink b) x) *
2639                     (shrink b - shrink a) -
2640                     f(linepath(a,b) x) * (b - a)`;
2641     EXISTS_TAC `\x. f(linepath(shrink b,shrink c) x) *
2642                     (shrink c - shrink b) -
2643                     f(linepath(b,c) x) * (c - b)`;
2644     EXISTS_TAC `\x. f(linepath(shrink c,shrink a) x) *
2645                     (shrink a - shrink c) -
2646                     f(linepath(c,a) x) * (a - c)`] THEN
2647   ASM_SIMP_TAC[COMPLEX_NORM_NZ; REAL_ARITH `&0 < x ==> &0 <= x / &6`] THEN
2648   (CONJ_TAC THENL
2649     [MATCH_MP_TAC HAS_INTEGRAL_SUB THEN
2650      REWRITE_TAC[GSYM HAS_PATH_INTEGRAL_LINEPATH] THEN
2651      CONJ_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
2652      MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2653      MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2654      EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2655      ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2656      MATCH_MP_TAC HULL_MINIMAL THEN
2657      REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET; IN_INSERT; NOT_IN_EMPTY] THEN
2658      ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
2659      ALL_TAC] THEN
2660    REPEAT STRIP_TAC THEN
2661    ONCE_REWRITE_TAC[COMPLEX_RING
2662     `f' * x' - f * x = f' * (x' - x) + x * (f' - f):complex`] THEN
2663    MATCH_MP_TAC NORM_TRIANGLE_LE THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
2664    MATCH_MP_TAC REAL_LE_TRANS THEN
2665    EXISTS_TAC `B * (norm(y:complex) / &24 / C / B) * &2 * C +
2666                (&2 * C) * (norm y / &24 / C)` THEN
2667    CONJ_TAC THENL
2668     [ALL_TAC;
2669      MATCH_MP_TAC REAL_EQ_IMP_LE THEN
2670      MAP_EVERY UNDISCH_TAC [`&0 < B`; `&0 < C`] THEN CONV_TAC REAL_FIELD] THEN
2671    MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THEN
2672    MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THENL
2673     [CONJ_TAC THENL
2674       [FIRST_X_ASSUM MATCH_MP_TAC THEN
2675        W(fun (asl,w) ->
2676          MP_TAC(PART_MATCH (lhand o rand) LINEPATH_IN_PATH (lhand w))) THEN
2677        ASM_REWRITE_TAC[] THEN
2678        W(fun (asl,w) -> SPEC_TAC(lhand(rand w),`x:complex`)) THEN
2679        REWRITE_TAC[GSYM SUBSET; SEGMENT_CONVEX_HULL] THEN
2680        MATCH_MP_TAC HULL_MINIMAL THEN
2681        REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET; IN_INSERT; NOT_IN_EMPTY] THEN
2682        ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
2683        ALL_TAC] THEN
2684      EXPAND_TAC "shrink" THEN
2685      REWRITE_TAC[VECTOR_ARITH `(b - e % (b - d)) - (a - e % (a - d)) -
2686                            (b - a) = e % (a - b)`] THEN
2687      REWRITE_TAC[NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
2688      ASM_SIMP_TAC[NORM_POS_LE; REAL_ARITH `&0 < x ==> abs x = x`;
2689                   REAL_ABS_POS] THEN
2690      CONJ_TAC THENL [EXPAND_TAC "e" THEN REAL_ARITH_TAC; ALL_TAC] THEN
2691      FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THEN
2692      MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2693      REWRITE_TAC[IN_INSERT];
2694      ALL_TAC] THEN
2695    CONJ_TAC THENL
2696     [FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THEN
2697      MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2698      REWRITE_TAC[IN_INSERT];
2699      ALL_TAC] THEN
2700    MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2701    CONJ_TAC THENL
2702     [W(fun (asl,w) ->
2703        MP_TAC(PART_MATCH (lhand o rand) LINEPATH_IN_PATH (lhand w))) THEN
2704      ASM_MESON_TAC[SUBSET];
2705      ALL_TAC] THEN
2706    CONJ_TAC THENL
2707     [W(fun (asl,w) ->
2708        MP_TAC(PART_MATCH (lhand o rand) LINEPATH_IN_PATH (lhand w))) THEN
2709      ASM_REWRITE_TAC[] THEN
2710      W(fun (asl,w) -> SPEC_TAC(lhand(rand w),`x:complex`)) THEN
2711      REWRITE_TAC[GSYM SUBSET; SEGMENT_CONVEX_HULL] THEN
2712      MATCH_MP_TAC HULL_MINIMAL THEN
2713      REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET; IN_INSERT; NOT_IN_EMPTY] THEN
2714      ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
2715      ALL_TAC] THEN
2716    REWRITE_TAC[linepath] THEN REWRITE_TAC[VECTOR_ARITH
2717      `((&1 - x) % a' + x % b') - ((&1 - x) % a + x % b) =
2718       (&1 - x) % (a' - a) + x % (b' - b)`] THEN
2719    EXPAND_TAC "shrink" THEN REWRITE_TAC[VECTOR_ARITH `a - b - a = --b`] THEN
2720    MATCH_MP_TAC NORM_TRIANGLE_LT THEN REWRITE_TAC[NORM_MUL; NORM_NEG] THEN
2721    MATCH_MP_TAC REAL_CONVEX_BOUND_LT THEN ONCE_REWRITE_TAC[TAUT
2722     `a /\ b /\ c /\ d /\ e <=> (c /\ d /\ e) /\ a /\ b`] THEN
2723    CONJ_TAC THENL
2724     [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
2725      REWRITE_TAC[DROP_VEC] THEN REAL_ARITH_TAC;
2726      ALL_TAC] THEN
2727    CONJ_TAC THEN
2728    MATCH_MP_TAC REAL_LET_TRANS THEN
2729    EXISTS_TAC `e * &2 * C` THEN
2730    ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH `&0 < x ==> abs x = x`] THEN
2731    (CONJ_TAC THENL
2732      [FIRST_X_ASSUM MATCH_MP_TAC THEN
2733       ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET; HULL_SUBSET; IN_INSERT];
2734       ALL_TAC]) THEN
2735    ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
2736    EXPAND_TAC "e" THEN REWRITE_TAC[REAL_MIN_LT] THEN
2737    DISJ2_TAC THEN DISJ1_TAC THEN
2738    REWRITE_TAC[REAL_FIELD `d / (a * b) = inv(a:real) * d / b`] THEN
2739    REWRITE_TAC[REAL_ARITH `inv(&4) * x < inv(&2) * x <=> &0 < x`] THEN
2740    ASM_SIMP_TAC[REAL_LT_DIV]));;
2741
2742 (* ------------------------------------------------------------------------- *)
2743 (* Version allowing finite number of exceptional points.                     *)
2744 (* ------------------------------------------------------------------------- *)
2745
2746 let CAUCHY_THEOREM_TRIANGLE_COFINITE = prove
2747  (`!f s a b c.
2748         f continuous_on (convex hull {a,b,c}) /\
2749         FINITE s /\
2750         (!x. x IN interior(convex hull {a,b,c}) DIFF s
2751              ==> f complex_differentiable (at x))
2752         ==> (f has_path_integral Cx(&0))
2753             (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`,
2754   GEN_TAC THEN GEN_TAC THEN WF_INDUCT_TAC `CARD(s:complex->bool)` THEN
2755   REPEAT STRIP_TAC THEN ASM_CASES_TAC `s:complex->bool = {}` THENL
2756    [MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_INTERIOR THEN
2757     ASM_REWRITE_TAC[holomorphic_on] THEN X_GEN_TAC `z:complex` THEN
2758     DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
2759     ASM_REWRITE_TAC[complex_differentiable; IN_DIFF; NOT_IN_EMPTY] THEN
2760     MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
2761     ALL_TAC] THEN
2762   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
2763   DISCH_THEN(X_CHOOSE_TAC `d:complex`) THEN
2764   FIRST_X_ASSUM(MP_TAC o SPEC `s DELETE (d:complex)`) THEN
2765   ASM_SIMP_TAC[CARD_DELETE; CARD_EQ_0;
2766                  ARITH_RULE `n - 1 < n <=> ~(n = 0)`] THEN
2767   ASM_CASES_TAC `(d:complex) IN convex hull {a,b,c}` THENL
2768    [ALL_TAC;
2769     DISCH_THEN MATCH_MP_TAC THEN
2770     ASM_REWRITE_TAC[FINITE_DELETE; IN_DIFF; IN_DELETE] THEN
2771     REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2772     ASM_REWRITE_TAC[IN_DIFF] THEN ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET]] THEN
2773   DISCH_TAC THEN SUBGOAL_THEN
2774    `(f has_path_integral Cx(&0))
2775     (linepath(a,b) ++ linepath(b,d) ++ linepath(d,a)) /\
2776     (f has_path_integral Cx(&0))
2777     (linepath(b,c) ++ linepath(c,d) ++ linepath(d,b)) /\
2778     (f has_path_integral Cx(&0))
2779     (linepath(c,a) ++ linepath(a,d) ++ linepath(d,c))`
2780   MP_TAC THENL
2781    [RULE_ASSUM_TAC(REWRITE_RULE[IMP_IMP; RIGHT_IMP_FORALL_THM]) THEN
2782     REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2783     ASM_REWRITE_TAC[FINITE_DELETE] THEN
2784     (CONJ_TAC THENL
2785       [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2786        EXISTS_TAC `convex hull {a:complex,b,c}` THEN ASM_REWRITE_TAC[] THEN
2787        MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2788        REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2789        REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2790        MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2791        REWRITE_TAC[IN_INSERT];
2792        ALL_TAC]) THEN
2793     ASM_REWRITE_TAC[FINITE_DELETE; IN_DIFF; IN_DELETE] THEN
2794     REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2795     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [DE_MORGAN_THM]) THEN
2796     (ASM_CASES_TAC `x:complex = d` THEN ASM_REWRITE_TAC[] THENL
2797       [ASM_MESON_TAC[NOT_IN_INTERIOR_CONVEX_HULL_3]; ALL_TAC]) THEN
2798     DISCH_TAC THEN ASM_REWRITE_TAC[IN_DIFF] THEN
2799     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
2800      `x IN interior s
2801       ==> interior s SUBSET interior t ==> x IN interior t`)) THEN
2802     MATCH_MP_TAC SUBSET_INTERIOR THEN
2803     MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2804     SIMP_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2805     REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2806     MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN REWRITE_TAC[IN_INSERT];
2807     ALL_TAC] THEN
2808   SUBGOAL_THEN
2809    `f path_integrable_on
2810     (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`
2811   MP_TAC THENL
2812    [SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN; VALID_PATH_LINEPATH;
2813              PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
2814              PATHFINISH_LINEPATH] THEN
2815     STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2816                   SEGMENTS_SUBSET_CONVEX_HULL) THEN
2817     ASM_MESON_TAC[PATH_INTEGRABLE_CONTINUOUS_LINEPATH; CONTINUOUS_ON_SUBSET];
2818     ALL_TAC] THEN
2819   REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
2820   X_GEN_TAC `y:complex` THEN
2821   DISCH_THEN(fun th -> ASSUME_TAC th THEN MP_TAC th) THEN
2822   REWRITE_TAC[IMP_IMP] THEN
2823   DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN
2824    (MP_TAC o MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL)) THEN
2825   ASM_CASES_TAC `y = Cx(&0)` THEN ASM_REWRITE_TAC[] THENL
2826    [ASM_MESON_TAC[]; UNDISCH_TAC `~(y = Cx(&0))`] THEN
2827   REWRITE_TAC[] THEN
2828   SUBGOAL_THEN `(f:complex->complex) continuous_on segment[a,d] /\
2829                 f continuous_on segment[b,d] /\
2830                 f continuous_on segment[c,d]`
2831   MP_TAC THENL
2832    [ALL_TAC;
2833     DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN (MP_TAC o MATCH_MP
2834                PATH_INTEGRAL_REVERSE_LINEPATH)) THEN
2835     CONV_TAC COMPLEX_RING] THEN
2836   REPEAT CONJ_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2837   EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2838   ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2839   MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2840   SIMP_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2841   REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2842   MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN REWRITE_TAC[IN_INSERT]);;
2843
2844 (* ------------------------------------------------------------------------- *)
2845 (* Existence of a primitive.                                                 *)
2846 (* ------------------------------------------------------------------------- *)
2847
2848 let STARLIKE_CONVEX_SUBSET = prove
2849  (`!s a b c:real^N.
2850         a IN s /\ segment[b,c] SUBSET s /\
2851         (!x. x IN s ==> segment[a,x] SUBSET s)
2852         ==> convex hull {a,b,c} SUBSET s`,
2853   REPEAT STRIP_TAC THEN
2854   MP_TAC(ISPECL [`{b:real^N,c}`; `a:real^N`] CONVEX_HULL_INSERT) THEN
2855   REWRITE_TAC[NOT_INSERT_EMPTY] THEN DISCH_THEN SUBST1_TAC THEN
2856   REWRITE_TAC[SUBSET; IN_ELIM_THM; LEFT_IMP_EXISTS_THM] THEN
2857   MAP_EVERY X_GEN_TAC [`x:real^N`; `u:real`; `v:real`; `d:real^N`] THEN
2858   STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `d:real^N`) THEN ANTS_TAC THENL
2859    [ASM_MESON_TAC[SUBSET; SEGMENT_CONVEX_HULL];
2860     ASM_REWRITE_TAC[SUBSET] THEN DISCH_THEN MATCH_MP_TAC THEN
2861     REWRITE_TAC[SEGMENT_CONVEX_HULL; CONVEX_HULL_2; IN_ELIM_THM] THEN
2862     ASM_MESON_TAC[]]);;
2863
2864 let TRIANGLE_PATH_INTEGRALS_STARLIKE_PRIMITIVE = prove
2865  (`!f s a.
2866       a IN s /\ open s /\ f continuous_on s /\
2867       (!z. z IN s ==> segment[a,z] SUBSET s) /\
2868       (!b c. segment[b,c] SUBSET s
2869              ==> path_integral (linepath(a,b)) f +
2870                  path_integral (linepath(b,c)) f +
2871                  path_integral (linepath(c,a)) f = Cx(&0))
2872       ==> ?g. !z. z IN s ==> (g has_complex_derivative f(z)) (at z)`,
2873   REPEAT STRIP_TAC THEN
2874   EXISTS_TAC `\x. path_integral (linepath(a,x)) f` THEN
2875   X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
2876   REWRITE_TAC[has_complex_derivative] THEN
2877   REWRITE_TAC[has_derivative_at; LINEAR_COMPLEX_MUL] THEN
2878   MATCH_MP_TAC LIM_TRANSFORM THEN
2879   EXISTS_TAC `\y. inv(norm(y - x)) % (path_integral(linepath(x,y)) f -
2880                    f x * (y - x))` THEN
2881   REWRITE_TAC[VECTOR_ARITH
2882    `i % (x - a) - i % (y - (z + a)) = i % (x + z - y)`] THEN
2883   CONJ_TAC THENL
2884    [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
2885     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
2886     DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN ASM_REWRITE_TAC[] THEN
2887     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
2888     STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2889     X_GEN_TAC `y:complex` THEN REWRITE_TAC[dist] THEN STRIP_TAC THEN
2890     REWRITE_TAC[VECTOR_MUL_EQ_0] THEN DISJ2_TAC THEN
2891     MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `y:complex`]
2892          PATH_INTEGRAL_REVERSE_LINEPATH) THEN
2893     ANTS_TAC THENL
2894      [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2895       EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
2896       FIRST_X_ASSUM MATCH_MP_TAC THEN
2897       FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
2898       ASM_REWRITE_TAC[IN_BALL; ONCE_REWRITE_RULE[NORM_SUB] dist];
2899       REWRITE_TAC[COMPLEX_VEC_0] THEN MATCH_MP_TAC(COMPLEX_RING
2900         `ax + xy + ya = Cx(&0) ==> ay = --ya ==> xy + ax - ay = Cx(&0)`) THEN
2901       FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_X_ASSUM(MATCH_MP_TAC o
2902        MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT] SUBSET_TRANS)) THEN
2903       REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2904       MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
2905       REWRITE_TAC[SUBSET; IN_BALL; IN_INSERT; NOT_IN_EMPTY] THEN
2906       REPEAT STRIP_TAC THEN
2907       ASM_REWRITE_TAC[dist; NORM_0; VECTOR_SUB_REFL] THEN
2908       ASM_MESON_TAC[NORM_SUB]];
2909     REWRITE_TAC[LIM_AT] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
2910     SUBGOAL_THEN `(f:complex->complex) continuous at x` MP_TAC THENL
2911      [MATCH_MP_TAC CONTINUOUS_ON_INTERIOR THEN ASM_MESON_TAC[INTERIOR_OPEN];
2912       ALL_TAC] THEN
2913     REWRITE_TAC[continuous_at; dist; VECTOR_SUB_RZERO] THEN
2914     DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
2915     DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
2916     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
2917     DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
2918     ASM_REWRITE_TAC[SUBSET; IN_BALL; dist] THEN
2919     DISCH_THEN(X_CHOOSE_THEN `d2:real` STRIP_ASSUME_TAC) THEN
2920     EXISTS_TAC `min d1 d2` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
2921     X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
2922     SUBGOAL_THEN `f path_integrable_on linepath(x,y)` MP_TAC THENL
2923      [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2924       MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
2925       ASM_REWRITE_TAC[] THEN
2926       MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(x:complex,d2)` THEN
2927       CONJ_TAC THENL
2928        [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2929         MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
2930         REWRITE_TAC[SUBSET; IN_BALL; IN_INSERT; NOT_IN_EMPTY] THEN
2931         REPEAT STRIP_TAC THEN
2932         ASM_REWRITE_TAC[dist; NORM_0; VECTOR_SUB_REFL] THEN
2933         ASM_MESON_TAC[NORM_SUB];
2934         ASM_REWRITE_TAC[SUBSET; IN_BALL; dist]];
2935       ALL_TAC] THEN
2936     REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
2937     X_GEN_TAC `z:complex` THEN
2938     MP_TAC(SPECL [`x:complex`; `y:complex`; `(f:complex->complex) x`]
2939                   HAS_PATH_INTEGRAL_CONST_LINEPATH) THEN
2940     REWRITE_TAC[IMP_IMP] THEN
2941     DISCH_THEN(fun th -> ASSUME_TAC(CONJUNCT2 th) THEN MP_TAC th) THEN
2942     FIRST_ASSUM(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
2943     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
2944     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_NEG) THEN
2945     REWRITE_TAC[COMPLEX_NEG_SUB] THEN STRIP_TAC THEN
2946     MATCH_MP_TAC(REAL_ARITH `x <= e / &2 /\ &0 < e ==> x < e`) THEN
2947     ASM_REWRITE_TAC[NORM_MUL; REAL_ABS_INV; REAL_ABS_NORM] THEN
2948     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
2949     ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
2950     MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
2951     EXISTS_TAC `\w. (f:complex->complex) w - f x` THEN
2952     ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> &0 <= e / &2`] THEN
2953     X_GEN_TAC `w:complex` THEN STRIP_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
2954     FIRST_X_ASSUM MATCH_MP_TAC THEN
2955     ASM_MESON_TAC[REAL_LET_TRANS; SEGMENT_BOUND]]);;
2956
2957 let HOLOMORPHIC_STARLIKE_PRIMITIVE = prove
2958  (`!f s k. open s /\ starlike s /\ FINITE k /\ f continuous_on s /\
2959            (!x. x IN s DIFF k ==> f complex_differentiable at x)
2960            ==> ?g. !x. x IN s ==> (g has_complex_derivative f(x)) (at x)`,
2961   REPEAT STRIP_TAC THEN
2962   FIRST_X_ASSUM(X_CHOOSE_THEN `a:complex` STRIP_ASSUME_TAC o
2963         GEN_REWRITE_RULE I [starlike]) THEN
2964   MATCH_MP_TAC TRIANGLE_PATH_INTEGRALS_STARLIKE_PRIMITIVE THEN
2965   EXISTS_TAC `a:complex` THEN ASM_REWRITE_TAC[] THEN
2966   MAP_EVERY X_GEN_TAC [`x:complex`; `y:complex`] THEN STRIP_TAC THEN
2967   MATCH_MP_TAC HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL THEN
2968   MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_COFINITE THEN
2969   EXISTS_TAC `k:complex->bool` THEN ASM_REWRITE_TAC[] THEN
2970   SUBGOAL_THEN `convex hull {a:complex,x,y} SUBSET s` ASSUME_TAC THENL
2971    [MATCH_MP_TAC STARLIKE_CONVEX_SUBSET THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN
2972   CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2973   REWRITE_TAC[IN_DIFF] THEN REPEAT STRIP_TAC THEN
2974   FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_DIFF] THEN
2975   ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET]);;
2976
2977 (* ------------------------------------------------------------------------- *)
2978 (* Cauchy's theorem for an open starlike set.                                *)
2979 (* ------------------------------------------------------------------------- *)
2980
2981 let CAUCHY_THEOREM_STARLIKE = prove
2982  (`!f s k g. open s /\ starlike s /\ FINITE k /\ f continuous_on s /\
2983              (!x. x IN s DIFF k ==> f complex_differentiable at x) /\
2984              valid_path g /\ (path_image g) SUBSET s /\
2985              pathfinish g = pathstart g
2986              ==> (f has_path_integral Cx(&0)) (g)`,
2987   MESON_TAC[HOLOMORPHIC_STARLIKE_PRIMITIVE; CAUCHY_THEOREM_PRIMITIVE;
2988             HAS_COMPLEX_DERIVATIVE_AT_WITHIN]);;
2989
2990 let CAUCHY_THEOREM_STARLIKE_SIMPLE = prove
2991  (`!f s g. open s /\ starlike s /\ f holomorphic_on s /\
2992            valid_path g /\ (path_image g) SUBSET s /\
2993            pathfinish g = pathstart g
2994            ==> (f has_path_integral Cx(&0)) (g)`,
2995   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_STARLIKE THEN
2996   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
2997   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; FINITE_RULES] THEN
2998   REWRITE_TAC[IN_DIFF; NOT_IN_EMPTY; complex_differentiable] THEN
2999   ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; holomorphic_on]);;
3000
3001 (* ------------------------------------------------------------------------- *)
3002 (* For a convex set we can avoid assuming openness and boundary analyticity. *)
3003 (* ------------------------------------------------------------------------- *)
3004
3005 let TRIANGLE_PATH_INTEGRALS_CONVEX_PRIMITIVE = prove
3006  (`!f s a.
3007       a IN s /\ convex s /\ f continuous_on s /\
3008       (!b c. b IN s /\ c IN s
3009              ==> path_integral (linepath(a,b)) f +
3010                  path_integral (linepath(b,c)) f +
3011                  path_integral (linepath(c,a)) f = Cx(&0))
3012       ==> ?g. !z. z IN s ==> (g has_complex_derivative f(z)) (at z within s)`,
3013   REPEAT STRIP_TAC THEN
3014   EXISTS_TAC `\x. path_integral (linepath(a,x)) f` THEN
3015   X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
3016   REWRITE_TAC[has_complex_derivative] THEN
3017   REWRITE_TAC[has_derivative_within; LINEAR_COMPLEX_MUL] THEN
3018   MATCH_MP_TAC LIM_TRANSFORM THEN
3019   EXISTS_TAC `\y. inv(norm(y - x)) % (path_integral(linepath(x,y)) f -
3020                    f x * (y - x))` THEN
3021   REWRITE_TAC[VECTOR_ARITH
3022    `i % (x - a) - i % (y - (z + a)) = i % (x + z - y)`] THEN
3023   CONJ_TAC THENL
3024    [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_WITHIN] THEN
3025     EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN
3026     X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
3027     REWRITE_TAC[VECTOR_MUL_EQ_0] THEN DISJ2_TAC THEN
3028     MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `y:complex`]
3029          PATH_INTEGRAL_REVERSE_LINEPATH) THEN
3030     ANTS_TAC THENL
3031      [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
3032       EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
3033       REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
3034       MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
3035       REWRITE_TAC[COMPLEX_VEC_0] THEN MATCH_MP_TAC(COMPLEX_RING
3036         `ax + xy + ya = Cx(&0) ==> ay = --ya ==> xy + ax - ay = Cx(&0)`) THEN
3037       ASM_SIMP_TAC[]];
3038     REWRITE_TAC[LIM_WITHIN] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3039     SUBGOAL_THEN
3040      `(f:complex->complex) continuous (at x within s)` MP_TAC THENL
3041      [ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN]; ALL_TAC] THEN
3042     REWRITE_TAC[continuous_within; dist; VECTOR_SUB_RZERO] THEN
3043     DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
3044     DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
3045     EXISTS_TAC `d1:real` THEN ASM_REWRITE_TAC[] THEN
3046     X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
3047     SUBGOAL_THEN `f path_integrable_on linepath(x,y)` MP_TAC THENL
3048      [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
3049       MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
3050       ASM_REWRITE_TAC[] THEN REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
3051       MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
3052       ALL_TAC] THEN
3053     REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
3054     X_GEN_TAC `z:complex` THEN
3055     MP_TAC(SPECL [`x:complex`; `y:complex`; `(f:complex->complex) x`]
3056                   HAS_PATH_INTEGRAL_CONST_LINEPATH) THEN
3057     REWRITE_TAC[IMP_IMP] THEN
3058     DISCH_THEN(fun th -> ASSUME_TAC(CONJUNCT2 th) THEN MP_TAC th) THEN
3059     FIRST_ASSUM(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
3060     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
3061     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_NEG) THEN
3062     REWRITE_TAC[COMPLEX_NEG_SUB] THEN STRIP_TAC THEN
3063     MATCH_MP_TAC(REAL_ARITH `x <= e / &2 /\ &0 < e ==> x < e`) THEN
3064     ASM_REWRITE_TAC[NORM_MUL; REAL_ABS_INV; REAL_ABS_NORM] THEN
3065     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
3066     ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
3067     MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
3068     EXISTS_TAC `\w. (f:complex->complex) w - f x` THEN
3069     ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> &0 <= e / &2`] THEN
3070     X_GEN_TAC `w:complex` THEN STRIP_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
3071     FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL
3072      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
3073        `w IN t ==> t SUBSET s ==> w IN s`)) THEN
3074       REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
3075       MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
3076       ASM_MESON_TAC[REAL_LET_TRANS; SEGMENT_BOUND]]]);;
3077
3078 let PATHINTEGRAL_CONVEX_PRIMITIVE = prove
3079  (`!f s. convex s /\ f continuous_on s /\
3080          (!a b c. a IN s /\ b IN s /\ c IN s
3081                   ==>  (f has_path_integral Cx(&0))
3082                        (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a)))
3083          ==> ?g. !x. x IN s
3084                      ==> (g has_complex_derivative f(x)) (at x within s)`,
3085   REPEAT STRIP_TAC THEN
3086   ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN
3087   FIRST_X_ASSUM(X_CHOOSE_THEN `a:complex` STRIP_ASSUME_TAC o
3088         GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
3089   MATCH_MP_TAC TRIANGLE_PATH_INTEGRALS_CONVEX_PRIMITIVE THEN
3090   EXISTS_TAC `a:complex` THEN ASM_REWRITE_TAC[] THEN
3091   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL THEN
3092   ASM_SIMP_TAC[]);;
3093
3094 let HOLOMORPHIC_CONVEX_PRIMITIVE = prove
3095  (`!f s k. convex s /\ FINITE k /\ f continuous_on s /\
3096            (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x)
3097            ==> ?g. !x. x IN s
3098                        ==> (g has_complex_derivative f(x)) (at x within s)`,
3099   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATHINTEGRAL_CONVEX_PRIMITIVE THEN
3100   ASM_REWRITE_TAC[] THEN
3101   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_COFINITE THEN
3102   EXISTS_TAC `k:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
3103    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
3104     ASM_REWRITE_TAC[];
3105     X_GEN_TAC `w:complex` THEN
3106     DISCH_THEN(fun th -> FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
3107     SPEC_TAC(`w:complex`,`w:complex`) THEN ASM_REWRITE_TAC[GSYM SUBSET] THEN
3108     MATCH_MP_TAC(SET_RULE `s SUBSET t ==> (s DIFF k) SUBSET (t DIFF k)`) THEN
3109     MATCH_MP_TAC SUBSET_INTERIOR] THEN
3110   MATCH_MP_TAC HULL_MINIMAL THEN ASM_REWRITE_TAC[] THEN ASM SET_TAC[]);;
3111
3112 let CAUCHY_THEOREM_CONVEX = prove
3113  (`!f s k g. convex s /\ FINITE k /\ f continuous_on s /\
3114              (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x) /\
3115              valid_path g /\ (path_image g) SUBSET s /\
3116              pathfinish g = pathstart g
3117              ==> (f has_path_integral Cx(&0)) (g)`,
3118   MESON_TAC[HOLOMORPHIC_CONVEX_PRIMITIVE; CAUCHY_THEOREM_PRIMITIVE]);;
3119
3120 let CAUCHY_THEOREM_CONVEX_SIMPLE = prove
3121  (`!f s g. convex s /\ f holomorphic_on s /\
3122            valid_path g /\ (path_image g) SUBSET s /\
3123            pathfinish g = pathstart g
3124            ==> (f has_path_integral Cx(&0)) (g)`,
3125   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_CONVEX THEN
3126   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
3127   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; FINITE_RULES] THEN
3128   REWRITE_TAC[IN_DIFF; NOT_IN_EMPTY; complex_differentiable] THEN
3129   SUBGOAL_THEN `f holomorphic_on (interior s)` MP_TAC THENL
3130    [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; INTERIOR_SUBSET]; ALL_TAC] THEN
3131   MESON_TAC[holomorphic_on; HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN;
3132             OPEN_INTERIOR]);;
3133
3134 (* ------------------------------------------------------------------------- *)
3135 (* In particular for a disc.                                                 *)
3136 (* ------------------------------------------------------------------------- *)
3137
3138 let CAUCHY_THEOREM_DISC = prove
3139  (`!f g k a e.
3140         FINITE k /\ f continuous_on cball(a,e) /\
3141         (!x. x IN ball(a,e) DIFF k ==> f complex_differentiable at x) /\
3142         valid_path g /\ (path_image g) SUBSET cball(a,e) /\
3143         pathfinish g = pathstart g
3144         ==> (f has_path_integral Cx(&0)) (g)`,
3145   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_CONVEX THEN
3146   MAP_EVERY EXISTS_TAC [`cball(a:complex,e)`; `k:complex->bool`] THEN
3147   ASM_REWRITE_TAC[INTERIOR_CBALL; CONVEX_CBALL]);;
3148
3149 let CAUCHY_THEOREM_DISC_SIMPLE = prove
3150  (`!f g a e.
3151         f holomorphic_on ball(a,e) /\
3152         valid_path g /\ (path_image g) SUBSET ball(a,e) /\
3153         pathfinish g = pathstart g
3154         ==> (f has_path_integral Cx(&0)) (g)`,
3155   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_CONVEX_SIMPLE THEN
3156   EXISTS_TAC `ball(a:complex,e)` THEN ASM_REWRITE_TAC[CONVEX_BALL; OPEN_BALL]);;
3157
3158 (* ------------------------------------------------------------------------- *)
3159 (* Generalize integrability to local primitives.                             *)
3160 (* ------------------------------------------------------------------------- *)
3161
3162 let PATH_INTEGRAL_LOCAL_PRIMITIVE_LEMMA = prove
3163  (`!f f' g s a b.
3164         (!x. x IN s ==> (f has_complex_derivative f' x) (at x within s)) /\
3165         g piecewise_differentiable_on interval[a,b] /\
3166         (!x. x IN interval[a,b] ==> g(x) IN s)
3167         ==> (\x. f' (g x) * vector_derivative g (at x within interval[a,b]))
3168             integrable_on interval[a,b]`,
3169   REPEAT STRIP_TAC THEN
3170   ASM_CASES_TAC `interval[a:real^1,b] = {}` THENL
3171    [ASM_REWRITE_TAC[INTEGRABLE_ON_EMPTY];
3172     REWRITE_TAC[integrable_on] THEN
3173     EXISTS_TAC `(f:complex->complex) (g(b:real^1)) - f(g a)` THEN
3174     MATCH_MP_TAC PATH_INTEGRAL_PRIMITIVE_LEMMA THEN
3175     ASM_MESON_TAC[]]);;
3176
3177 let PATH_INTEGRAL_LOCAL_PRIMITIVE_ANY = prove
3178  (`!f g s a b.
3179     (!x. x IN s
3180          ==> ?d h. &0 < d /\
3181                    !y. norm(y - x) < d
3182                        ==> (h has_complex_derivative f(y)) (at y within s)) /\
3183     g piecewise_differentiable_on interval[a,b] /\
3184     (!x. x IN interval[a,b] ==> g(x) IN s)
3185     ==> (\x. f(g x) * vector_derivative g (at x)) integrable_on interval[a,b]`,
3186   REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_ON_LITTLE_SUBINTERVALS THEN
3187   X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
3188   FIRST_X_ASSUM(MP_TAC o SPEC `(g:real^1->complex) x`) THEN
3189   ASM_SIMP_TAC[LEFT_IMP_EXISTS_THM] THEN
3190   MAP_EVERY X_GEN_TAC [`d:real`; `h:complex->complex`] THEN STRIP_TAC THEN
3191   FIRST_ASSUM(MP_TAC o MATCH_MP
3192     PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON) THEN
3193   REWRITE_TAC[continuous_on] THEN DISCH_THEN(MP_TAC o SPEC `x:real^1`) THEN
3194   ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `d:real`) THEN
3195   ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
3196   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
3197   SIMP_TAC[integrable_on; GSYM HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
3198   REWRITE_TAC[GSYM integrable_on] THEN
3199   MATCH_MP_TAC PATH_INTEGRAL_LOCAL_PRIMITIVE_LEMMA THEN
3200   MAP_EVERY EXISTS_TAC
3201    [`h:complex->complex`; `IMAGE (g:real^1->complex) (interval[u,v])`] THEN
3202   REWRITE_TAC[FORALL_IN_IMAGE] THEN REPEAT STRIP_TAC THENL
3203    [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_WITHIN_SUBSET THEN
3204     EXISTS_TAC `s:complex->bool` THEN
3205     CONJ_TAC THENL [FIRST_X_ASSUM MATCH_MP_TAC; ASM SET_TAC[]] THEN
3206     REWRITE_TAC[GSYM dist] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3207     ASM_MESON_TAC[SUBSET; IN_BALL; DIST_SYM];
3208     ASM_MESON_TAC[PIECEWISE_DIFFERENTIABLE_ON_SUBSET];
3209     ASM SET_TAC[]]);;
3210
3211 let PATH_INTEGRAL_LOCAL_PRIMITIVE = prove
3212  (`!f g s.
3213         (!x. x IN s
3214          ==> ?d h. &0 < d /\
3215                    !y. norm(y - x) < d
3216                        ==> (h has_complex_derivative f(y)) (at y within s)) /\
3217         valid_path g /\ (path_image g) SUBSET s
3218         ==> f path_integrable_on g`,
3219   REWRITE_TAC[valid_path; path_image; SUBSET; FORALL_IN_IMAGE] THEN
3220   REWRITE_TAC[path_integrable_on; has_path_integral] THEN
3221   REWRITE_TAC[HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
3222   REWRITE_TAC[GSYM integrable_on; PATH_INTEGRAL_LOCAL_PRIMITIVE_ANY]);;
3223
3224 (* ------------------------------------------------------------------------- *)
3225 (* In particular if a function is holomorphic.                               *)
3226 (* ------------------------------------------------------------------------- *)
3227
3228 let PATH_INTEGRABLE_HOLOMORPHIC = prove
3229  (`!f g s k.
3230         open s /\ FINITE k /\
3231         f continuous_on s /\
3232         (!x. x IN s DIFF k ==> f complex_differentiable at x) /\
3233         valid_path g /\ path_image g SUBSET s
3234         ==> f path_integrable_on g`,
3235   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_LOCAL_PRIMITIVE THEN
3236   EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
3237   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3238   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
3239   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
3240   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN STRIP_TAC THEN
3241   MP_TAC(ISPECL [`f:complex->complex`; `ball(z:complex,d)`;
3242                  `k:complex->bool`] HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
3243   ANTS_TAC THENL
3244    [ASM_REWRITE_TAC[CONVEX_BALL; DIFF_EMPTY] THEN CONJ_TAC THENL
3245      [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
3246     GEN_TAC THEN DISCH_THEN(fun th ->
3247         FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
3248     SIMP_TAC[IN_DIFF] THEN ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET];
3249     MATCH_MP_TAC MONO_EXISTS THEN
3250     SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL] THEN
3251     ONCE_REWRITE_TAC[NORM_SUB] THEN REWRITE_TAC[IN_BALL; dist] THEN
3252     ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN]]);;
3253
3254 let PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE = prove
3255  (`!f g s. open s /\ f holomorphic_on s /\ valid_path g /\ path_image g SUBSET s
3256            ==> f path_integrable_on g`,
3257   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC THEN
3258   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
3259   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; FINITE_RULES; DIFF_EMPTY] THEN
3260   ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; complex_differentiable]);;
3261
3262 (* ------------------------------------------------------------------------- *)
3263 (* Key fact that path integral is the same for a "nearby" path. This is the  *)
3264 (* main lemma for the homotopy form of Cauchy's theorem and is also useful   *)
3265 (* if we want "without loss of generality" to assume some niceness of our    *)
3266 (* path (e.g. smoothness). It can also be used to define the integrals of    *)
3267 (* analytic functions over arbitrary continuous paths. This is just done for *)
3268 (* winding numbers now; I'm not sure if it's worth going further with that.  *)
3269 (* ------------------------------------------------------------------------- *)
3270
3271 let PATH_INTEGRAL_NEARBY_ENDS,PATH_INTEGRAL_NEARBY_LOOP = (CONJ_PAIR o prove)
3272  (`(!s p.
3273       open s /\ path p /\ path_image p SUBSET s
3274       ==> ?d. &0 < d /\
3275               !g h. valid_path g /\ valid_path h /\
3276                     (!t. t IN interval[vec 0,vec 1]
3277                          ==> norm(g t - p t) < d /\ norm(h t - p t) < d) /\
3278                     pathstart h = pathstart g /\ pathfinish h = pathfinish g
3279                     ==> path_image g SUBSET s /\
3280                         path_image h SUBSET s /\
3281                         !f. f holomorphic_on s
3282                             ==> path_integral h f = path_integral g f) /\
3283    (!s p.
3284       open s /\ path p /\ path_image p SUBSET s
3285       ==> ?d. &0 < d /\
3286               !g h. valid_path g /\ valid_path h /\
3287                     (!t. t IN interval[vec 0,vec 1]
3288                          ==> norm(g t - p t) < d /\ norm(h t - p t) < d) /\
3289                     pathfinish g = pathstart g /\ pathfinish h = pathstart h
3290                     ==> path_image g SUBSET s /\
3291                         path_image h SUBSET s /\
3292                         !f. f holomorphic_on s
3293                             ==> path_integral h f = path_integral g f)`,
3294   REWRITE_TAC[AND_FORALL_THM] THEN REPEAT GEN_TAC THEN
3295   MAP_EVERY (fun t -> ASM_CASES_TAC t THEN ASM_REWRITE_TAC[])
3296    [`open(s:complex->bool)`;
3297     `path(p:real^1->complex)`;
3298     `path_image(p:real^1->complex) SUBSET s`] THEN
3299   REWRITE_TAC[RIGHT_IMP_EXISTS_THM] THEN
3300   MATCH_MP_TAC(MESON[] `(?x. P x /\ Q x) ==> (?x. P x) /\ (?x. Q x)`) THEN
3301   SUBGOAL_THEN
3302    `!z. z IN path_image p ==> ?e. &0 < e /\ ball(z:complex,e) SUBSET s`
3303   MP_TAC THENL
3304    [ASM_MESON_TAC[OPEN_CONTAINS_BALL; SUBSET]; ALL_TAC] THEN
3305   GEN_REWRITE_TAC (LAND_CONV o TOP_DEPTH_CONV)
3306    [RIGHT_IMP_EXISTS_THM; RIGHT_AND_EXISTS_THM; SKOLEM_THM] THEN
3307   REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `ee:complex->real` THEN
3308   DISCH_THEN(LABEL_TAC "*") THEN
3309   FIRST_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_HEINE_BOREL o
3310     MATCH_MP COMPACT_PATH_IMAGE) THEN
3311   DISCH_THEN(MP_TAC o SPEC
3312    `IMAGE (\z:complex. ball(z,ee z / &3)) (path_image p)`) THEN
3313   ANTS_TAC THENL
3314    [REWRITE_TAC[FORALL_IN_IMAGE; OPEN_BALL; SUBSET] THEN
3315     X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3316     REWRITE_TAC[UNIONS_IMAGE; IN_ELIM_THM] THEN EXISTS_TAC `z:complex` THEN
3317     ASM_SIMP_TAC[CENTRE_IN_BALL; REAL_ARITH `&0 < e / &3 <=> &0 < e`];
3318     ALL_TAC] THEN
3319   REWRITE_TAC[path_image; GSYM IMAGE_o] THEN REWRITE_TAC[GSYM path_image] THEN
3320   ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN
3321   REWRITE_TAC[CONJ_ASSOC; FINITE_SUBSET_IMAGE] THEN
3322   REWRITE_TAC[LEFT_AND_EXISTS_THM; MESON[]
3323    `(?f s. (P s /\ f = g s) /\ Q f) <=> ?s. P s /\ Q(g s)`] THEN
3324   REWRITE_TAC[UNIONS_IMAGE; LEFT_IMP_EXISTS_THM] THEN
3325   X_GEN_TAC `k:real^1->bool` THEN
3326   DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
3327   GEN_REWRITE_TAC LAND_CONV [SUBSET] THEN REWRITE_TAC[IN_ELIM_THM; o_THM] THEN
3328   ASM_CASES_TAC `k:real^1->bool = {}` THENL
3329    [ASM_REWRITE_TAC[NOT_IN_EMPTY; GSYM NOT_EXISTS_THM; MEMBER_NOT_EMPTY] THEN
3330     REWRITE_TAC[PATH_IMAGE_NONEMPTY];
3331     DISCH_THEN(LABEL_TAC "+")] THEN
3332   SUBGOAL_THEN
3333     `!i:real^1. i IN k ==> &0 < ee((p i):complex)`
3334   ASSUME_TAC THENL
3335    [ASM_MESON_TAC[SUBSET; path_image; IN_IMAGE]; ALL_TAC] THEN
3336   ABBREV_TAC `e = inf(IMAGE ((ee:complex->real) o (p:real^1->complex)) k)` THEN
3337   MP_TAC(ISPEC `IMAGE ((ee:complex->real) o (p:real^1->complex)) k`
3338     INF_FINITE) THEN
3339   MP_TAC(ISPECL [`IMAGE ((ee:complex->real) o (p:real^1->complex)) k`; `&0`]
3340     REAL_LT_INF_FINITE) THEN
3341   ASM_SIMP_TAC[FINITE_IMAGE; IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
3342   ASM_REWRITE_TAC[o_THM] THEN DISCH_TAC THEN
3343   DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
3344   EXISTS_TAC `e / &3` THEN
3345   MP_TAC(ISPECL [`p:real^1->complex`; `interval[vec 0:real^1,vec 1]`]
3346         COMPACT_UNIFORMLY_CONTINUOUS) THEN REWRITE_TAC[COMPACT_INTERVAL] THEN
3347   ANTS_TAC THENL [ASM_MESON_TAC[path]; ALL_TAC] THEN
3348   REWRITE_TAC[uniformly_continuous_on] THEN
3349   DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN
3350   ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &3 <=> &0 < e`] THEN
3351   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
3352   REWRITE_TAC[RIGHT_IMP_FORALL_THM; AND_FORALL_THM] THEN
3353   MAP_EVERY X_GEN_TAC [`g:real^1->complex`; `h:real^1->complex`] THEN
3354   MAP_EVERY (fun t -> ASM_CASES_TAC t THEN ASM_REWRITE_TAC[])
3355    [`!t. t IN interval[vec 0,vec 1]
3356          ==> norm((g:real^1->complex) t - p t) < e / &3 /\
3357              norm((h:real^1->complex) t - p t) < e / &3`;
3358     `valid_path(g:real^1->complex)`; `valid_path(h:real^1->complex)`] THEN
3359   MATCH_MP_TAC(TAUT
3360    `q /\ (p1 \/ p2 ==> q ==> r) ==> (p1 ==> q /\ r) /\ (p2 ==> q /\ r)`) THEN
3361   CONJ_TAC THENL
3362    [CONJ_TAC THEN REWRITE_TAC[path_image; SUBSET; FORALL_IN_IMAGE] THEN
3363     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
3364     REMOVE_THEN "+" (MP_TAC o SPEC `(p:real^1->complex) t`) THEN
3365     ASM_SIMP_TAC[path_image; FUN_IN_IMAGE; IN_BALL] THEN
3366     DISCH_THEN(X_CHOOSE_THEN `u:real^1` STRIP_ASSUME_TAC) THENL
3367      [SUBGOAL_THEN `(g:real^1->complex) t IN ball(p(u:real^1),ee(p u))`
3368       MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[path_image; IN_IMAGE; SUBSET]];
3369       SUBGOAL_THEN `(h:real^1->complex) t IN ball(p(u:real^1),ee(p u))`
3370       MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[path_image; IN_IMAGE; SUBSET]]] THEN
3371     REWRITE_TAC[IN_BALL] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
3372      (NORM_ARITH `dist(gu,gt) < eu / &3
3373                   ==> norm(ht - gt) < e / &3 /\ e <= eu
3374                   ==> dist(gu,ht) < eu`)) THEN
3375     ASM_SIMP_TAC[];
3376     DISCH_TAC THEN STRIP_TAC THEN
3377     X_GEN_TAC `f:complex->complex` THEN DISCH_TAC] THEN
3378   SUBGOAL_THEN
3379    `?ff. !z. z IN path_image p
3380              ==> &0 < ee z /\ ball(z,ee z) SUBSET s /\
3381                  !w. w IN ball(z,ee z)
3382                      ==> (ff z has_complex_derivative f w) (at w)`
3383   MP_TAC THENL
3384    [REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_EXISTS_IMP_THM;
3385                 RIGHT_EXISTS_AND_THM] THEN
3386     X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3387     REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
3388     ASM_REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
3389     MP_TAC(ISPECL [`f:complex->complex`; `ball(z:complex,ee z)`;
3390                    `{}:complex->bool`] HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
3391     SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL] THEN
3392     DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[CONVEX_BALL; FINITE_EMPTY] THEN
3393     SIMP_TAC[DIFF_EMPTY; INTERIOR_OPEN; OPEN_BALL] THEN
3394     SUBGOAL_THEN `f holomorphic_on ball(z,ee z)` MP_TAC THENL
3395      [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
3396       ASM_REWRITE_TAC[];
3397       SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
3398       SIMP_TAC[holomorphic_on; HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL;
3399                complex_differentiable]];
3400     REMOVE_THEN "*" (K ALL_TAC) THEN
3401     DISCH_THEN(CHOOSE_THEN (LABEL_TAC "*"))] THEN
3402   MP_TAC(ISPEC `d:real` REAL_ARCH_INV) THEN ASM_REWRITE_TAC[] THEN
3403   DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
3404   SUBGOAL_THEN
3405    `!n. n <= N
3406         ==> path_integral(subpath (vec 0) (&n / &N % vec 1) h) f -
3407             path_integral(subpath (vec 0) (&n / &N % vec 1) g) f =
3408             path_integral(linepath (g(&n / &N % vec 1),h(&n / &N % vec 1))) f -
3409             path_integral(linepath (g(vec 0),h(vec 0))) f`
3410   (MP_TAC o SPEC `N:num`) THENL
3411    [ALL_TAC;
3412     ASM_SIMP_TAC[LE_REFL; REAL_DIV_REFL; REAL_OF_NUM_EQ; VECTOR_MUL_LID] THEN
3413     FIRST_X_ASSUM(DISJ_CASES_THEN MP_TAC) THEN
3414     REWRITE_TAC[pathstart; pathfinish] THEN STRIP_TAC THEN
3415     ASM_REWRITE_TAC[SUBPATH_TRIVIAL; PATH_INTEGRAL_TRIVIAL] THEN
3416     CONV_TAC COMPLEX_RING] THEN
3417   INDUCT_TAC THENL
3418    [REWRITE_TAC[real_div; REAL_MUL_LZERO; VECTOR_MUL_LZERO] THEN
3419     FIRST_X_ASSUM(DISJ_CASES_THEN MP_TAC) THEN
3420     REWRITE_TAC[pathstart; pathfinish] THEN REPEAT STRIP_TAC THEN
3421     ASM_REWRITE_TAC[PATH_INTEGRAL_TRIVIAL; PATH_INTEGRAL_SUBPATH_REFL] THEN
3422     REWRITE_TAC[COMPLEX_SUB_REFL];
3423     DISCH_TAC THEN FIRST_X_ASSUM(K ALL_TAC o check (is_disj o concl))] THEN
3424   REMOVE_THEN "+" (MP_TAC o SPEC `(p:real^1->complex)(&n / &N % vec 1)`) THEN
3425   REWRITE_TAC[IN_BALL] THEN ANTS_TAC THENL
3426    [REWRITE_TAC[path_image] THEN MATCH_MP_TAC FUN_IN_IMAGE THEN
3427     REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN
3428     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
3429     REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC;
3430     DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC)] THEN
3431   MP_TAC(ISPECL
3432    [`(ff:complex->complex->complex) (p(t:real^1))`; `f:complex->complex`;
3433     `subpath (&n / &N % vec 1) (&(SUC n) / &N % vec 1) (g:real^1->complex) ++
3434      linepath(g (&(SUC n) / &N % vec 1),h(&(SUC n) / &N % vec 1)) ++
3435      subpath (&(SUC n) / &N % vec 1) (&n / &N % vec 1) h ++
3436      linepath(h (&n / &N % vec 1),g (&n / &N % vec 1))`;
3437     `ball((p:real^1->complex) t,ee(p t))`] CAUCHY_THEOREM_PRIMITIVE) THEN
3438   ASM_SIMP_TAC[VALID_PATH_JOIN_EQ; PATHSTART_JOIN; PATHFINISH_JOIN;
3439    PATHSTART_SUBPATH; PATHFINISH_SUBPATH; PATH_IMAGE_JOIN; PATHSTART_LINEPATH;
3440    PATHFINISH_LINEPATH; VALID_PATH_LINEPATH; UNION_SUBSET] THEN
3441   ONCE_REWRITE_TAC[IMP_CONJ] THEN ANTS_TAC THENL
3442    [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3443     REMOVE_THEN "*" (MP_TAC o SPEC `(p:real^1->complex) t`) THEN ANTS_TAC THENL
3444      [ASM_MESON_TAC[path_image; IN_IMAGE; SUBSET];
3445       ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN; CENTRE_IN_BALL]];
3446     ALL_TAC] THEN
3447   MATCH_MP_TAC(TAUT `p /\ q /\ (p ==> r ==> s) ==> (p /\ q ==> r) ==> s`) THEN
3448   CONJ_TAC THENL
3449    [CONJ_TAC THEN MATCH_MP_TAC VALID_PATH_SUBPATH THEN ASM_REWRITE_TAC[] THEN
3450     REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN
3451     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
3452     REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC;
3453     ALL_TAC] THEN
3454   CONJ_TAC THENL
3455    [SUBGOAL_THEN `drop(&n / &N % vec 1) <= drop(&(SUC n) / &N % vec 1)`
3456     ASSUME_TAC THENL
3457      [ASM_SIMP_TAC[DROP_CMUL; DROP_VEC; REAL_MUL_RID; REAL_LE_DIV2_EQ;
3458                    REAL_OF_NUM_LT; LE_1; REAL_OF_NUM_LE] THEN
3459       ARITH_TAC;
3460       ASM_SIMP_TAC[PATH_IMAGE_SUBPATH; PATH_IMAGE_LINEPATH] THEN
3461       ONCE_REWRITE_TAC[GSYM REVERSEPATH_SUBPATH] THEN
3462       ASM_SIMP_TAC[PATH_IMAGE_SUBPATH; PATH_IMAGE_REVERSEPATH]] THEN
3463     MATCH_MP_TAC(TAUT
3464      `(p /\ r) /\ (p /\ r ==> q /\ s) ==> p /\ q /\ r /\ s`) THEN
3465     CONJ_TAC THENL
3466      [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
3467       REWRITE_TAC[AND_FORALL_THM; TAUT
3468         `(p ==> q) /\ (p ==> r) <=> p ==> q /\ r`] THEN
3469       X_GEN_TAC `u:real^1` THEN REWRITE_TAC[IN_INTERVAL_1] THEN
3470       REWRITE_TAC[DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN STRIP_TAC THEN
3471       REWRITE_TAC[IN_BALL] THEN
3472       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
3473        `!e pu. dist(pt,pn) < ee / &3
3474                ==> dist(pn,pu) < e / &3 /\ e <= ee /\
3475                    norm(gu - pu) < e / &3 /\ norm(hu - pu) < e / &3
3476                    ==> dist(pt,gu) < ee /\ dist(pt,hu) < ee`)) THEN
3477       MAP_EVERY EXISTS_TAC [`e:real`; `(p:real^1->complex) u`] THEN
3478       ASM_SIMP_TAC[] THEN
3479       SUBGOAL_THEN `(u:real^1) IN interval[vec 0,vec 1]` ASSUME_TAC THENL
3480        [REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN CONJ_TAC THENL
3481          [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
3482            REAL_LE_TRANS)) THEN ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS];
3483           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
3484            REAL_LE_TRANS)) THEN
3485           ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
3486           ASM_REWRITE_TAC[REAL_MUL_LID; REAL_OF_NUM_LE]];
3487         ASM_SIMP_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3488         ASM_REWRITE_TAC[] THEN
3489         REWRITE_TAC[DIST_REAL; GSYM drop; IN_INTERVAL_1;
3490                     DROP_VEC; DROP_CMUL; REAL_MUL_RID] THEN
3491         ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_POS; REAL_LE_DIV;
3492               REAL_OF_NUM_LT; LE_1; REAL_MUL_LID; REAL_OF_NUM_LE;
3493               ARITH_RULE `SUC n <= N ==> n <= N`] THEN
3494         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
3495          `u <= s ==> n <= u /\ s - n < d ==> abs(n - u) < d`)) THEN
3496         ASM_REWRITE_TAC[] THEN
3497         REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB] THEN
3498         SIMP_TAC[REAL_OF_NUM_SUB; ARITH_RULE `n <= SUC n`] THEN
3499         ASM_REWRITE_TAC[ARITH_RULE `SUC n - n = 1`; REAL_MUL_LID]];
3500       GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [SUBSET] THEN
3501       REWRITE_TAC[FORALL_IN_IMAGE] THEN STRIP_TAC THEN
3502       REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN CONJ_TAC THEN
3503       MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
3504       REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET] THEN
3505       CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3506       REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; REAL_NOT_LT] THEN
3507       REWRITE_TAC[DROP_VEC; DROP_CMUL; REAL_MUL_RID] THEN
3508         ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_POS; REAL_LE_DIV;
3509               REAL_OF_NUM_LT; LE_1; REAL_MUL_LID; REAL_OF_NUM_LE] THEN
3510       ARITH_TAC];
3511     STRIP_TAC THEN DISCH_THEN(fun th ->
3512         MP_TAC(MATCH_MP PATH_INTEGRAL_UNIQUE th) THEN
3513         MP_TAC(MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE th)) THEN
3514     ASM_SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN_EQ; VALID_PATH_LINEPATH;
3515       PATHSTART_SUBPATH; PATHFINISH_SUBPATH; PATHSTART_JOIN; PATHFINISH_JOIN;
3516       PATHSTART_LINEPATH; PATHFINISH_LINEPATH; VALID_PATH_LINEPATH;
3517       PATH_INTEGRAL_JOIN] THEN
3518     STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o check(is_imp o concl)) THEN
3519     ASM_SIMP_TAC[ARITH_RULE `SUC n <= N ==> n <= N`] THEN
3520     MATCH_MP_TAC(COMPLEX_RING
3521      `hn - he = hn' /\ gn + gd = gn' /\ hgn = --ghn
3522       ==> hn - gn = ghn - gh0
3523           ==> gd + ghn' + he + hgn = Cx(&0)
3524               ==> hn' - gn' = ghn' - gh0`) THEN
3525     REPEAT CONJ_TAC THENL
3526      [ASM_SIMP_TAC[complex_sub; GSYM PATH_INTEGRAL_REVERSEPATH] THEN
3527       REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
3528       MATCH_MP_TAC PATH_INTEGRAL_SUBPATH_COMBINE;
3529       MATCH_MP_TAC PATH_INTEGRAL_SUBPATH_COMBINE;
3530       GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV)
3531        [GSYM REVERSEPATH_LINEPATH] THEN
3532       MATCH_MP_TAC PATH_INTEGRAL_REVERSEPATH] THEN
3533     ASM_REWRITE_TAC[VALID_PATH_LINEPATH] THEN
3534     ASM_REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN
3535     ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1;
3536                  REAL_MUL_LID; REAL_OF_NUM_LE] THEN
3537     ASM_SIMP_TAC[ARITH_RULE `SUC n <= N ==> n <= N`] THEN
3538     TRY(MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
3539         EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN NO_TAC) THEN
3540     ASM_MESON_TAC[PATH_INTEGRABLE_REVERSEPATH; VALID_PATH_LINEPATH;
3541                   REVERSEPATH_LINEPATH]]);;
3542
3543 (* ------------------------------------------------------------------------- *)
3544 (* Hence we can treat even non-rectifiable paths as having a "length"        *)
3545 (* for bounds on analytic functions in open sets.                            *)
3546 (* ------------------------------------------------------------------------- *)
3547
3548 let VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION = prove
3549  (`!p:real^1->complex.
3550      vector_polynomial_function p ==> valid_path p`,
3551   REPEAT STRIP_TAC THEN REWRITE_TAC[valid_path] THEN
3552   MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
3553   MATCH_MP_TAC DIFFERENTIABLE_AT_IMP_DIFFERENTIABLE_ON THEN
3554   REWRITE_TAC[VECTOR_DERIVATIVE_WORKS] THEN
3555   REPEAT STRIP_TAC THEN REWRITE_TAC[vector_derivative] THEN
3556   CONV_TAC SELECT_CONV THEN
3557   ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION]);;
3558
3559 let PATH_INTEGRAL_BOUND_EXISTS = prove
3560  (`!s g. open s /\ valid_path g /\ path_image g SUBSET s
3561          ==> ?L. &0 < L /\
3562                  !f B. f holomorphic_on s /\ (!z. z IN s ==> norm(f z) <= B)
3563                        ==> norm(path_integral g f) <= L * B`,
3564   REPEAT STRIP_TAC THEN
3565   MP_TAC(ISPECL [`s:complex->bool`; `g:real^1->complex`]
3566         PATH_INTEGRAL_NEARBY_ENDS) THEN
3567   ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
3568   DISCH_THEN(X_CHOOSE_THEN `d:real` (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
3569   DISCH_THEN(MP_TAC o SPEC `g:real^1->complex`) THEN
3570   ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
3571   DISCH_THEN(STRIP_ASSUME_TAC o GSYM) THEN
3572   MP_TAC(ISPECL [`g:real^1->complex`; `d:real`]
3573    PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
3574   ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
3575   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3576   FIRST_X_ASSUM(MP_TAC o SPEC `p:real^1->complex`) THEN
3577   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN STRIP_TAC THEN
3578   FIRST_ASSUM(X_CHOOSE_THEN `p':real^1->complex` STRIP_ASSUME_TAC o
3579     MATCH_MP HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION) THEN
3580   SUBGOAL_THEN `bounded(IMAGE (p':real^1->complex) (interval[vec 0,vec 1]))`
3581   MP_TAC THENL
3582    [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
3583     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
3584     REWRITE_TAC[COMPACT_INTERVAL] THEN
3585     ASM_MESON_TAC[CONTINUOUS_VECTOR_POLYNOMIAL_FUNCTION;
3586                   CONTINUOUS_AT_IMP_CONTINUOUS_ON];
3587     REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE]] THEN
3588   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `L:real` THEN STRIP_TAC THEN
3589   ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
3590   SUBGOAL_THEN `f path_integrable_on p /\ valid_path p` STRIP_ASSUME_TAC THENL
3591    [ASM_MESON_TAC[PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE;
3592                   VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION];
3593     ALL_TAC] THEN
3594   MP_TAC(ISPECL [`f:complex->complex`; `p:real^1->complex`]
3595         PATH_INTEGRAL_INTEGRAL) THEN ASM_REWRITE_TAC[] THEN
3596   DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
3597    `drop(integral (interval[vec 0,vec 1]) (\x:real^1. lift(L * B)))` THEN
3598   CONJ_TAC THENL
3599    [MATCH_MP_TAC INTEGRAL_NORM_BOUND_INTEGRAL THEN
3600     ASM_REWRITE_TAC[INTEGRABLE_CONST; GSYM PATH_INTEGRABLE_ON] THEN
3601     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
3602     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
3603     REWRITE_TAC[LIFT_DROP; COMPLEX_NORM_MUL] THEN
3604     MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN
3605     CONJ_TAC THENL
3606      [FIRST_X_ASSUM MATCH_MP_TAC THEN
3607       ASM_MESON_TAC[path_image; SUBSET; IN_IMAGE];
3608       ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_UNIQUE_AT]];
3609     REWRITE_TAC[INTEGRAL_CONST; CONTENT_UNIT_1; VECTOR_MUL_LID] THEN
3610     REWRITE_TAC[LIFT_DROP; REAL_LE_REFL]]);;
3611
3612 (* ------------------------------------------------------------------------- *)
3613 (* Winding number.                                                           *)
3614 (* ------------------------------------------------------------------------- *)
3615
3616 let winding_number = new_definition
3617  `winding_number(g,z) =
3618     @n. !e. &0 < e
3619             ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3620                     pathstart p = pathstart g /\
3621                     pathfinish p = pathfinish g /\
3622                     (!t. t IN interval[vec 0,vec 1] ==> norm(g t - p t) < e) /\
3623                     path_integral p (\w. Cx(&1) / (w - z)) =
3624                     Cx(&2) * Cx(pi) * ii * n`;;
3625
3626 let CX_2PII_NZ = prove
3627  (`~(Cx(&2) * Cx(pi) * ii = Cx(&0))`,
3628   SIMP_TAC[COMPLEX_ENTIRE; CX_PI_NZ; II_NZ; CX_INJ; REAL_OF_NUM_EQ; ARITH]);;
3629
3630 let PATH_INTEGRABLE_INVERSEDIFF = prove
3631  (`!g z. valid_path g /\ ~(z IN path_image g)
3632          ==> (\w. Cx(&1) / (w - z)) path_integrable_on g`,
3633   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
3634   EXISTS_TAC `(:complex) DELETE z` THEN
3635   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN; SET_RULE
3636    `s SUBSET (UNIV DELETE x) <=> ~(x IN s)`] THEN
3637   X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_UNIV; IN_DELETE] THEN
3638   STRIP_TAC THEN
3639   W(MP_TAC o DISCH_ALL o COMPLEX_DIFF_CONV o snd o dest_exists o snd) THEN
3640   ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN MESON_TAC[]);;
3641
3642 let WINDING_NUMBER = prove
3643  (`!g z e.
3644         path g /\ ~(z IN path_image g) /\ &0 < e
3645          ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3646                  pathstart p = pathstart g /\
3647                  pathfinish p = pathfinish g /\
3648                  (!t. t IN interval[vec 0,vec 1] ==> norm(g t - p t) < e) /\
3649                  path_integral p (\w. Cx(&1) / (w - z)) =
3650                  Cx(&2) * Cx(pi) * ii * winding_number(g,z)`,
3651   REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
3652   GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN DISCH_TAC THEN
3653   REWRITE_TAC[winding_number] THEN CONV_TAC SELECT_CONV THEN
3654   MP_TAC(ISPECL [`(:complex) DELETE z`; `g:real^1->complex`]
3655         PATH_INTEGRAL_NEARBY_ENDS) THEN
3656   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN
3657   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
3658   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
3659   MP_TAC(ISPECL [`g:real^1->complex`; `d / &2`]
3660     PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
3661   ASM_REWRITE_TAC[REAL_HALF] THEN
3662   DISCH_THEN(X_CHOOSE_THEN `h:real^1->complex` STRIP_ASSUME_TAC) THEN
3663   EXISTS_TAC `Cx(&1) / (Cx(&2) * Cx pi * ii) *
3664               path_integral h (\w. Cx(&1) / (w - z))` THEN
3665   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3666   MP_TAC(ISPECL [`g:real^1->complex`; `min d e / &2`]
3667     PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
3668   ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN
3669   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `p:real^1->complex` THEN
3670   STRIP_TAC THEN
3671   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION; CX_2PII_NZ; COMPLEX_FIELD
3672    `~(a * b * c = Cx(&0))
3673     ==> a * b * c * Cx(&1) / (a * b * c) * z = z`] THEN
3674   FIRST_X_ASSUM(MP_TAC o SPECL [`h:real^1->complex`; `p:real^1->complex`]) THEN
3675   ANTS_TAC THENL
3676    [ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
3677     ASM_MESON_TAC[NORM_ARITH
3678      `norm(h - g) < d / &2 /\ norm(p - g) < min d e / &2
3679       ==> norm(h - g) < d /\ norm(p - g) < d`];
3680     ALL_TAC] THEN
3681   REWRITE_TAC[SET_RULE `t SUBSET UNIV DELETE x <=> ~(x IN t)`] THEN
3682   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
3683    [ASM_MESON_TAC[NORM_SUB; REAL_ARITH `&0 < e /\ x < min d e / &2 ==> x < e`];
3684     ALL_TAC] THEN
3685   FIRST_X_ASSUM MATCH_MP_TAC THEN
3686   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN] THEN
3687   REWRITE_TAC[IN_DELETE; IN_UNIV; GSYM complex_differentiable] THEN
3688   REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC THEN
3689   ASM_REWRITE_TAC[COMPLEX_SUB_0]);;
3690
3691 let WINDING_NUMBER_UNIQUE = prove
3692  (`!g z e n.
3693         path g /\ ~(z IN path_image g) /\
3694         (!e. &0 < e
3695              ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3696                      pathstart p = pathstart g /\
3697                      pathfinish p = pathfinish g /\
3698                      (!t. t IN interval[vec 0,vec 1]
3699                           ==> norm(g t - p t) < e) /\
3700                      path_integral p (\w. Cx(&1) / (w - z)) =
3701                      Cx(&2) * Cx(pi) * ii * n)
3702         ==> winding_number(g,z) = n`,
3703   REPEAT STRIP_TAC THEN
3704   MP_TAC(ISPECL [`(:complex) DELETE z`; `g:real^1->complex`]
3705         PATH_INTEGRAL_NEARBY_ENDS) THEN
3706   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN
3707   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
3708   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
3709   FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3710   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3711   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`] WINDING_NUMBER) THEN
3712   DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3713   DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
3714   FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `q:real^1->complex`]) THEN
3715   ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[NORM_SUB] THEN ASM_SIMP_TAC[] THEN
3716   STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `\w. Cx(&1) / (w - z)`) THEN
3717   ANTS_TAC THENL
3718    [ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN] THEN
3719     REWRITE_TAC[IN_DELETE; IN_UNIV; GSYM complex_differentiable] THEN
3720     REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC THEN
3721     ASM_REWRITE_TAC[COMPLEX_SUB_0];
3722     ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN
3723     CONV_TAC COMPLEX_RING]);;
3724
3725 let WINDING_NUMBER_UNIQUE_LOOP = prove
3726  (`!g z e n.
3727         path g /\ ~(z IN path_image g) /\ pathfinish g = pathstart g /\
3728         (!e. &0 < e
3729              ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3730                      pathfinish p = pathstart p /\
3731                      (!t. t IN interval[vec 0,vec 1]
3732                           ==> norm(g t - p t) < e) /\
3733                      path_integral p (\w. Cx(&1) / (w - z)) =
3734                      Cx(&2) * Cx(pi) * ii * n)
3735         ==> winding_number(g,z) = n`,
3736   REPEAT STRIP_TAC THEN
3737   MP_TAC(ISPECL [`(:complex) DELETE z`; `g:real^1->complex`]
3738         PATH_INTEGRAL_NEARBY_LOOP) THEN
3739   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN
3740   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
3741   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
3742   FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3743   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3744   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`] WINDING_NUMBER) THEN
3745   DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3746   DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
3747   FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `q:real^1->complex`]) THEN
3748   ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[NORM_SUB] THEN ASM_SIMP_TAC[] THEN
3749   STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `\w. Cx(&1) / (w - z)`) THEN
3750   ANTS_TAC THENL
3751    [ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN] THEN
3752     REWRITE_TAC[IN_DELETE; IN_UNIV; GSYM complex_differentiable] THEN
3753     REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC THEN
3754     ASM_REWRITE_TAC[COMPLEX_SUB_0];
3755     ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN
3756     CONV_TAC COMPLEX_RING]);;
3757
3758 let WINDING_NUMBER_VALID_PATH = prove
3759  (`!g z. valid_path g /\ ~(z IN path_image g)
3760          ==> winding_number(g,z) =
3761              Cx(&1) / (Cx(&2) * Cx(pi) * ii) *
3762              path_integral g (\w. Cx(&1) / (w - z))`,
3763   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
3764   ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
3765   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3766   EXISTS_TAC `g:real^1->complex` THEN
3767   ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
3768   MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_FIELD);;
3769
3770 let HAS_PATH_INTEGRAL_WINDING_NUMBER = prove
3771  (`!g z. valid_path g /\ ~(z IN path_image g)
3772          ==> ((\w. Cx(&1) / (w - z)) has_path_integral
3773               (Cx(&2) * Cx(pi) * ii * winding_number(g,z))) g`,
3774   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH] THEN
3775   ASM_SIMP_TAC[CX_2PII_NZ; COMPLEX_FIELD
3776    `~(a * b * c = Cx(&0))
3777     ==> a * b * c * Cx(&1) / (a * b * c) * z = z`] THEN
3778   MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
3779   ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF]);;
3780
3781 let WINDING_NUMBER_TRIVIAL = prove
3782  (`!a z. ~(z = a) ==> winding_number(linepath(a,a),z) = Cx(&0)`,
3783   SIMP_TAC[VALID_PATH_LINEPATH; PATH_INTEGRAL_TRIVIAL; COMPLEX_MUL_RZERO;
3784            WINDING_NUMBER_VALID_PATH; PATH_IMAGE_LINEPATH; SEGMENT_REFL;
3785            IN_SING]);;
3786
3787 let WINDING_NUMBER_JOIN = prove
3788  (`!g1 g2 z.
3789         path g1 /\ path g2 /\ pathfinish g1 = pathstart g2 /\
3790         ~(z IN path_image g1) /\ ~(z IN path_image g2)
3791         ==> winding_number(g1 ++ g2,z) =
3792             winding_number(g1,z) + winding_number(g2,z)`,
3793   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
3794   ASM_SIMP_TAC[PATH_JOIN; PATH_IMAGE_JOIN; IN_UNION] THEN
3795   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3796   MP_TAC(ISPECL [`g2:real^1->complex`; `z:complex`; `e:real`]
3797     WINDING_NUMBER) THEN
3798   MP_TAC(ISPECL [`g1:real^1->complex`; `z:complex`; `e:real`]
3799     WINDING_NUMBER) THEN
3800   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
3801   X_GEN_TAC `p1:real^1->complex` THEN STRIP_TAC THEN
3802   X_GEN_TAC `p2:real^1->complex` THEN STRIP_TAC THEN
3803   EXISTS_TAC `p1 ++ p2:real^1->complex` THEN
3804   ASM_SIMP_TAC[VALID_PATH_JOIN; PATHSTART_JOIN; PATHFINISH_JOIN] THEN
3805   ASM_SIMP_TAC[PATH_IMAGE_JOIN; IN_UNION] THEN  CONJ_TAC THENL
3806    [REWRITE_TAC[joinpaths; IN_INTERVAL_1; DROP_VEC] THEN REPEAT STRIP_TAC THEN
3807     COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
3808     FIRST_X_ASSUM MATCH_MP_TAC THEN
3809     ASM_REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; DROP_CMUL; DROP_SUB] THEN
3810     ASM_REAL_ARITH_TAC;
3811     W(MP_TAC o PART_MATCH (lhs o rand) PATH_INTEGRAL_JOIN o lhand o snd) THEN
3812     ASM_REWRITE_TAC[COMPLEX_ADD_LDISTRIB] THEN
3813     DISCH_THEN MATCH_MP_TAC THEN
3814     CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_INVERSEDIFF THEN
3815     ASM_REWRITE_TAC[]]);;
3816
3817 let WINDING_NUMBER_REVERSEPATH = prove
3818  (`!g z. path g /\ ~(z IN path_image g)
3819          ==> winding_number(reversepath g,z) = --(winding_number(g,z))`,
3820   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
3821   ASM_SIMP_TAC[PATH_REVERSEPATH; PATH_IMAGE_REVERSEPATH] THEN
3822   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3823   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `e:real`]
3824     WINDING_NUMBER) THEN
3825   ASM_REWRITE_TAC[] THEN
3826   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3827   EXISTS_TAC `reversepath p:real^1->complex` THEN
3828   ASM_SIMP_TAC[VALID_PATH_REVERSEPATH; PATH_IMAGE_REVERSEPATH;
3829                PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
3830                PATH_INTEGRAL_REVERSEPATH; PATH_INTEGRABLE_INVERSEDIFF] THEN
3831   REWRITE_TAC[COMPLEX_MUL_RNEG; reversepath; IN_INTERVAL_1; DROP_VEC] THEN
3832   REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3833   REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; DROP_SUB] THEN ASM_REAL_ARITH_TAC);;
3834
3835 let WINDING_NUMBER_SHIFTPATH = prove
3836  (`!g a z. path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g) /\
3837            a IN interval[vec 0,vec 1]
3838            ==> winding_number(shiftpath a g,z) = winding_number(g,z)`,
3839   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE_LOOP THEN
3840   ASM_SIMP_TAC[PATH_SHIFTPATH; PATH_IMAGE_SHIFTPATH] THEN CONJ_TAC THENL
3841    [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL_1; DROP_VEC]) THEN
3842     ASM_SIMP_TAC[PATHSTART_SHIFTPATH; PATHFINISH_SHIFTPATH];
3843     ALL_TAC] THEN
3844   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3845   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `e:real`]
3846     WINDING_NUMBER) THEN ASM_REWRITE_TAC[] THEN
3847   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3848   EXISTS_TAC `shiftpath a p:real^1->complex` THEN
3849   ASM_SIMP_TAC[VALID_PATH_SHIFTPATH; PATH_IMAGE_SHIFTPATH;
3850                PATH_INTEGRAL_SHIFTPATH; PATH_INTEGRABLE_INVERSEDIFF] THEN
3851   RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL_1; DROP_VEC]) THEN
3852   ASM_SIMP_TAC[PATHSTART_SHIFTPATH; PATHFINISH_SHIFTPATH] THEN
3853   SIMP_TAC[COMPLEX_MUL_RNEG; shiftpath; IN_INTERVAL_1; DROP_ADD; DROP_VEC] THEN
3854   REPEAT STRIP_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
3855   FIRST_X_ASSUM MATCH_MP_TAC THEN
3856   REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; DROP_SUB; DROP_ADD] THEN
3857   ASM_REAL_ARITH_TAC);;
3858
3859 let WINDING_NUMBER_SPLIT_LINEPATH = prove
3860  (`!a b c z.
3861     c IN segment[a,b] /\ ~(z IN segment[a,b])
3862     ==> winding_number(linepath(a,b),z) =
3863         winding_number(linepath(a,c),z) +
3864         winding_number(linepath(c,b),z)`,
3865   REPEAT STRIP_TAC THEN
3866   SUBGOAL_THEN `~((z:complex) IN segment[a,c]) /\ ~(z IN segment[c,b])`
3867   STRIP_ASSUME_TAC THENL
3868    [CONJ_TAC THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
3869      `~(z IN s) ==> t SUBSET s ==> ~(z IN t)`)) THEN
3870     ASM_REWRITE_TAC[SUBSET_SEGMENT; ENDS_IN_SEGMENT];
3871     ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; PATH_IMAGE_LINEPATH;
3872                  VALID_PATH_LINEPATH] THEN
3873     REWRITE_TAC[GSYM COMPLEX_ADD_LDISTRIB] THEN AP_TERM_TAC THEN
3874     MATCH_MP_TAC PATH_INTEGRAL_SPLIT_LINEPATH THEN
3875     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN
3876     SIMP_TAC[CONTINUOUS_ON_CONST; CONTINUOUS_ON_SUB; CONTINUOUS_ON_ID] THEN
3877     ASM_MESON_TAC[COMPLEX_SUB_0]]);;
3878
3879 let WINDING_NUMBER_EQUAL = prove
3880  (`!p q z. (!t. t IN interval[vec 0,vec 1] ==> p t = q t)
3881            ==> winding_number(p,z) = winding_number(q,z)`,
3882   REPEAT STRIP_TAC THEN SIMP_TAC[winding_number; PATH_INTEGRAL_INTEGRAL] THEN
3883   AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3884   X_GEN_TAC `W:complex` THEN REWRITE_TAC[] THEN
3885   AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3886   X_GEN_TAC `e:real` THEN REWRITE_TAC[] THEN
3887   ASM_CASES_TAC `&0 < e` THEN ASM_REWRITE_TAC[] THEN
3888   AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3889   X_GEN_TAC `g:real^1->complex` THEN
3890   ASM_SIMP_TAC[pathstart; pathfinish; ENDS_IN_UNIT_INTERVAL]);;
3891
3892 let WINDING_NUMBER_OFFSET = prove
3893  (`!p z. winding_number(p,z) = winding_number((\w. p w - z),Cx(&0))`,
3894   REPEAT GEN_TAC THEN REWRITE_TAC[winding_number; PATH_INTEGRAL_INTEGRAL] THEN
3895   AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3896   X_GEN_TAC `W:complex` THEN REWRITE_TAC[] THEN
3897   AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3898   X_GEN_TAC `e:real` THEN REWRITE_TAC[] THEN
3899   ASM_CASES_TAC `&0 < e` THEN
3900   ASM_REWRITE_TAC[path_image; valid_path; pathstart; pathfinish] THEN
3901   EQ_TAC THEN
3902   DISCH_THEN(X_CHOOSE_THEN `g:real^1->complex` STRIP_ASSUME_TAC) THENL
3903    [EXISTS_TAC `\t. (g:real^1->complex) t - z`;
3904     EXISTS_TAC `\t. (g:real^1->complex) t + z`] THEN
3905   ASM_REWRITE_TAC[COMPLEX_RING `(p - z) - (g - z):complex = p - g`;
3906                   COMPLEX_RING `p - (g + z):complex = p - z - g`;
3907                   COMPLEX_RING `(p - z) + z:complex = p`;
3908                   COMPLEX_SUB_RZERO] THEN
3909   RULE_ASSUM_TAC(REWRITE_RULE[IN_IMAGE]) THEN
3910   ASM_SIMP_TAC[PIECEWISE_DIFFERENTIABLE_ADD; PIECEWISE_DIFFERENTIABLE_SUB;
3911                DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE;
3912                DIFFERENTIABLE_ON_CONST; IN_IMAGE] THEN
3913   ASM_REWRITE_TAC[COMPLEX_RING `Cx(&0) = w - z <=> z = w`;
3914                   COMPLEX_RING `z = w + z <=> Cx(&0) = w`] THEN
3915   FIRST_X_ASSUM(fun th -> GEN_REWRITE_TAC RAND_CONV [SYM th]) THEN
3916   MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
3917   REWRITE_TAC[COMPLEX_RING `(w + z) - z = w - Cx(&0)`] THEN AP_TERM_TAC THEN
3918   REWRITE_TAC[vector_derivative; has_vector_derivative; HAS_DERIVATIVE_AT;
3919               COMPLEX_RING `(x - z) - (w - z):complex = x - w`;
3920               COMPLEX_RING `(x + z) - (w + z):complex = x - w`]);;
3921
3922 (* ------------------------------------------------------------------------- *)
3923 (* A combined theorem deducing several things piecewise.                     *)
3924 (* ------------------------------------------------------------------------- *)
3925
3926 let WINDING_NUMBER_JOIN_POS_COMBINED = prove
3927  (`!g1 g2 z.
3928        (valid_path g1 /\
3929         ~(z IN path_image g1) /\
3930         &0 < Re(winding_number(g1,z))) /\
3931        (valid_path g2 /\
3932         ~(z IN path_image g2) /\
3933         &0 < Re(winding_number(g2,z))) /\
3934        pathfinish g1 = pathstart g2
3935        ==> valid_path(g1 ++ g2) /\
3936            ~(z IN path_image(g1 ++ g2)) /\
3937            &0 < Re(winding_number(g1 ++ g2,z))`,
3938   REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_SIMP_TAC[VALID_PATH_JOIN] THEN
3939   ASM_SIMP_TAC[PATH_IMAGE_JOIN; VALID_PATH_IMP_PATH; IN_UNION] THEN
3940   ASM_SIMP_TAC[WINDING_NUMBER_JOIN; VALID_PATH_IMP_PATH; RE_ADD] THEN
3941   ASM_REAL_ARITH_TAC);;
3942
3943 (* ------------------------------------------------------------------------- *)
3944 (* Useful sufficient conditions for the winding number to be positive etc.   *)
3945 (* ------------------------------------------------------------------------- *)
3946
3947 let RE_WINDING_NUMBER = prove
3948  (`!g z. valid_path g /\ ~(z IN path_image g)
3949          ==> Re(winding_number(g,z)) =
3950              Im(path_integral g (\w. Cx(&1) / (w - z))) / (&2 * pi)`,
3951   SIMP_TAC[WINDING_NUMBER_VALID_PATH; complex_div; COMPLEX_MUL_LID] THEN
3952   REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM CX_MUL] THEN
3953   REWRITE_TAC[COMPLEX_INV_MUL; GSYM CX_INV; COMPLEX_INV_II] THEN
3954   REWRITE_TAC[COMPLEX_MUL_LNEG; COMPLEX_MUL_RNEG; RE_NEG] THEN
3955   REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; RE_MUL_CX; RE_MUL_II] THEN
3956   MP_TAC PI_POS THEN CONV_TAC REAL_FIELD);;
3957
3958 let WINDING_NUMBER_POS_LE = prove
3959  (`!g z. valid_path g /\ ~(z IN path_image g) /\
3960          (!x. x IN interval(vec 0,vec 1)
3961               ==> &0 <= Im(vector_derivative g (at x) * cnj(g x - z)))
3962          ==> &0 <= Re(winding_number(g,z))`,
3963   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[RE_WINDING_NUMBER] THEN
3964   MATCH_MP_TAC REAL_LE_DIV THEN
3965   SIMP_TAC[REAL_LE_MUL; REAL_POS; PI_POS; REAL_LT_IMP_LE; IM_DEF] THEN
3966   MATCH_MP_TAC(INST_TYPE [`:1`,`:M`; `:2`,`:N`]
3967     HAS_INTEGRAL_COMPONENT_POS) THEN
3968   MAP_EVERY EXISTS_TAC
3969    [`\x:real^1. if x IN interval(vec 0,vec 1)
3970                 then Cx(&1) / (g x - z) * vector_derivative g (at x)
3971                 else Cx(&0)`;
3972     `interval[vec 0:real^1,vec 1]`] THEN
3973   REWRITE_TAC[ARITH; DIMINDEX_2] THEN CONJ_TAC THENL
3974    [MATCH_MP_TAC HAS_INTEGRAL_SPIKE_INTERIOR THEN
3975     EXISTS_TAC `\x:real^1. Cx(&1) / (g x - z) * vector_derivative g (at x)` THEN
3976     ASM_SIMP_TAC[] THEN REWRITE_TAC[GSYM HAS_PATH_INTEGRAL] THEN
3977     MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
3978     ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF];
3979     ALL_TAC] THEN
3980   X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN COND_CASES_TAC THEN
3981   ASM_REWRITE_TAC[GSYM IM_DEF; IM_CX; REAL_LE_REFL] THEN
3982   FIRST_X_ASSUM(MP_TAC o SPEC `x:real^1`) THEN
3983   ASM_REWRITE_TAC[complex_div; COMPLEX_MUL_LID] THEN
3984   REWRITE_TAC[complex_inv; complex_inv; complex_mul; RE; IM; cnj] THEN
3985   REWRITE_TAC[real_div; REAL_RING
3986    `(a * x) * b + (--c * x) * d:real = x * (a * b - c * d)`] THEN
3987   REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN
3988   SIMP_TAC[REAL_POW_2; REAL_LE_INV_EQ; REAL_LE_ADD; REAL_LE_SQUARE] THEN
3989   ASM_REAL_ARITH_TAC);;
3990
3991 let WINDING_NUMBER_POS_LT_LEMMA = prove
3992  (`!g z e. valid_path g /\ ~(z IN path_image g) /\ &0 < e /\
3993            (!x. x IN interval(vec 0,vec 1)
3994                 ==> e <= Im(vector_derivative g (at x) / (g x - z)))
3995            ==> &0 < Re(winding_number(g,z))`,
3996   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[RE_WINDING_NUMBER] THEN
3997   MATCH_MP_TAC REAL_LT_DIV THEN
3998   SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; ARITH; PI_POS] THEN
3999   MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `Im(ii * Cx e)` THEN
4000   CONJ_TAC THENL
4001    [ASM_REWRITE_TAC[COMPLEX_MUL_LNEG; IM_MUL_II; IM_NEG; RE_CX]; ALL_TAC] THEN
4002   REWRITE_TAC[IM_DEF] THEN
4003   MATCH_MP_TAC(ISPECL [`\x:real^1. ii * Cx e`;
4004         `\x:real^1. if x IN interval(vec 0,vec 1)
4005                     then Cx(&1) / (g x - z) * vector_derivative g (at x)
4006                     else ii * Cx e`;
4007         `interval[vec 0:real^1,vec 1]`; `ii * Cx e`;
4008         `path_integral g (\w. Cx(&1) / (w - z))`; `2`]
4009        HAS_INTEGRAL_COMPONENT_LE) THEN
4010   REWRITE_TAC[DIMINDEX_2; ARITH] THEN REPEAT CONJ_TAC THENL
4011    [GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_MUL_LID] THEN
4012     ONCE_REWRITE_TAC[GSYM CONTENT_UNIT_1] THEN
4013     REWRITE_TAC[HAS_INTEGRAL_CONST];
4014     MATCH_MP_TAC HAS_INTEGRAL_SPIKE_INTERIOR THEN
4015     EXISTS_TAC `\x:real^1. Cx(&1) / (g x - z) * vector_derivative g (at x)` THEN
4016     ASM_SIMP_TAC[] THEN REWRITE_TAC[GSYM HAS_PATH_INTEGRAL] THEN
4017     MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
4018     ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF];
4019     X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN COND_CASES_TAC THEN
4020     ASM_REWRITE_TAC[GSYM IM_DEF; IM_CX; REAL_LE_REFL] THEN
4021     REWRITE_TAC[IM_MUL_II; RE_CX] THEN
4022     FIRST_X_ASSUM(MP_TAC o SPEC `x:real^1`) THEN
4023     ASM_REWRITE_TAC[complex_div; COMPLEX_MUL_LID; COMPLEX_MUL_SYM]]);;
4024
4025 let WINDING_NUMBER_POS_LT = prove
4026  (`!g z e. valid_path g /\ ~(z IN path_image g) /\ &0 < e /\
4027            (!x. x IN interval(vec 0,vec 1)
4028                 ==> e <= Im(vector_derivative g (at x) * cnj(g x - z)))
4029            ==> &0 < Re(winding_number(g,z))`,
4030   REPEAT STRIP_TAC THEN
4031   SUBGOAL_THEN `bounded (IMAGE (\w. w - z) (path_image g))` MP_TAC THENL
4032    [REWRITE_TAC[path_image; GSYM IMAGE_o] THEN
4033     MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
4034     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
4035     REWRITE_TAC[COMPACT_INTERVAL] THEN
4036     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
4037     SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
4038     MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON THEN
4039     ASM_REWRITE_TAC[GSYM valid_path];
4040     ALL_TAC] THEN
4041   REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
4042   DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
4043   MATCH_MP_TAC WINDING_NUMBER_POS_LT_LEMMA THEN
4044   EXISTS_TAC `e:real / B pow 2` THEN
4045   ASM_SIMP_TAC[REAL_LT_DIV; REAL_POW_LT] THEN
4046   X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
4047   ONCE_REWRITE_TAC[COMPLEX_DIV_CNJ] THEN
4048   REWRITE_TAC[real_div; complex_div; GSYM CX_INV; GSYM CX_POW] THEN
4049   REWRITE_TAC[IM_MUL_CX] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
4050   ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LE_INV_EQ; REAL_POW_LE] THEN
4051   MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL
4052    [MATCH_MP_TAC REAL_POW_LT THEN REWRITE_TAC[NORM_POS_LT; VECTOR_SUB_EQ] THEN
4053     UNDISCH_TAC `~((z:complex) IN path_image g)`;
4054     MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[NORM_POS_LE] THEN
4055     FIRST_X_ASSUM MATCH_MP_TAC] THEN
4056   REWRITE_TAC[path_image; IN_IMAGE] THEN
4057   ASM_MESON_TAC[SUBSET; INTERVAL_OPEN_SUBSET_CLOSED]);;
4058
4059 (* ------------------------------------------------------------------------- *)
4060 (* The winding number is an integer (proof from Ahlfors's book).             *)
4061 (* ------------------------------------------------------------------------- *)
4062
4063 let WINDING_NUMBER_AHLFORS_LEMMA = prove
4064  (`!g a b.
4065         g piecewise_differentiable_on interval [a,b] /\
4066         drop a <= drop b /\ (!x. x IN interval [a,b] ==> ~(g x = z))
4067         ==> (\x. vector_derivative g (at x within interval[a,b]) / (g(x) - z))
4068             integrable_on interval[a,b] /\
4069             cexp(--(integral (interval[a,b])
4070                         (\x. vector_derivative g (at x within interval[a,b]) /
4071                                (g(x) - z)))) *
4072             (g(b) - z) = g(a) - z`,
4073   let lemma = prove
4074    (`!f g g' s x z.
4075           (g has_vector_derivative g') (at x within s) /\
4076           (f has_vector_derivative (g' / (g x - z))) (at x within s) /\
4077           ~(g x = z)
4078           ==> ((\x. cexp(--f x) * (g x - z)) has_vector_derivative Cx(&0))
4079               (at x within s)`,
4080     REPEAT STRIP_TAC THEN
4081     SUBGOAL_THEN
4082      `cexp(--f x) * (g' - Cx(&0)) +
4083       (cexp(--f x) * --(g' / ((g:real^1->complex) x - z))) * (g x - z) = Cx(&0)`
4084      (SUBST1_TAC o SYM)
4085     THENL
4086      [FIRST_X_ASSUM(MP_TAC o check (is_neg o concl)) THEN
4087       CONV_TAC COMPLEX_FIELD;
4088       ALL_TAC] THEN
4089     MATCH_MP_TAC(ISPEC `( * ):complex->complex->complex`
4090       HAS_VECTOR_DERIVATIVE_BILINEAR_WITHIN) THEN
4091     REWRITE_TAC[BILINEAR_COMPLEX_MUL; GSYM COMPLEX_VEC_0] THEN
4092     ASM_SIMP_TAC[HAS_VECTOR_DERIVATIVE_SUB; ETA_AX;
4093                  HAS_VECTOR_DERIVATIVE_CONST] THEN
4094     GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
4095     REWRITE_TAC[has_vector_derivative] THEN
4096     SUBGOAL_THEN `!x y. (\z. drop z % (x * y :complex)) =
4097                         (\w. x * w) o (\z. drop z % y)`
4098      (fun th -> REWRITE_TAC[th])
4099     THENL
4100      [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4101       SIMPLE_COMPLEX_ARITH_TAC;
4102       ALL_TAC] THEN
4103     MATCH_MP_TAC DIFF_CHAIN_WITHIN THEN
4104     REWRITE_TAC[GSYM has_complex_derivative; GSYM has_vector_derivative] THEN
4105     SIMP_TAC[HAS_COMPLEX_DERIVATIVE_CEXP; HAS_COMPLEX_DERIVATIVE_AT_WITHIN] THEN
4106     ASM_SIMP_TAC[HAS_VECTOR_DERIVATIVE_NEG]) in
4107   REPEAT GEN_TAC THEN STRIP_TAC THEN
4108   SUBGOAL_THEN
4109    `!w. ~(w = z)
4110         ==> ?h. !y. norm(y - w) < norm(w - z)
4111                     ==> (h has_complex_derivative inv(y - z)) (at y)`
4112    (LABEL_TAC "P")
4113   THENL
4114    [REPEAT STRIP_TAC THEN
4115     MP_TAC(ISPECL [`\w:complex. inv(w - z)`;
4116                `ball(w:complex,norm(w - z))`;
4117                `{}:complex->bool`]
4118               HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
4119     SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL; INTERIOR_OPEN] THEN
4120     REWRITE_TAC[CONVEX_BALL; FINITE_RULES; DIFF_EMPTY] THEN ANTS_TAC THENL
4121      [SUBGOAL_THEN `(\w. inv(w - z)) holomorphic_on ball(w:complex,norm(w - z))`
4122        (fun th ->
4123         MESON_TAC[HOLOMORPHIC_ON_OPEN; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
4124                   OPEN_BALL; complex_differentiable; th]) THEN
4125       SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; IN_BALL] THEN
4126       X_GEN_TAC `u:complex` THEN DISCH_TAC THEN
4127       EXISTS_TAC `--Cx(&1) / (u - z) pow 2` THEN COMPLEX_DIFF_TAC THEN
4128       REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_SUB_0] THEN
4129       ASM_MESON_TAC[REAL_LT_REFL; dist];
4130       ALL_TAC] THEN
4131     REWRITE_TAC[IN_BALL; dist] THEN MESON_TAC[NORM_SUB];
4132     ALL_TAC] THEN
4133   SUBGOAL_THEN
4134    `!t. t IN interval[a,b]
4135         ==> (\x. vector_derivative g (at x within interval[a,b]) / (g(x) - z))
4136             integrable_on interval[a,t] /\
4137             cexp(--(integral (interval[a,t])
4138                          (\x. vector_derivative g (at x within interval[a,b]) /
4139                               (g(x) - z)))) *
4140             (g(t) - z) = g(a) - z`
4141    (fun th -> MATCH_MP_TAC th THEN
4142               ASM_REWRITE_TAC[IN_INTERVAL_1; REAL_LE_REFL]) THEN
4143   REWRITE_TAC[TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
4144   REWRITE_TAC[FORALL_AND_THM] THEN
4145   MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
4146    [REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
4147     MAP_EVERY EXISTS_TAC [`a:real^1`; `b:real^1`] THEN
4148     ASM_REWRITE_TAC[SUBSET_INTERVAL_1; REAL_LE_REFL] THEN
4149     CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[IN_INTERVAL_1]] THEN
4150     REWRITE_TAC[integrable_on; complex_div] THEN
4151     ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
4152     REWRITE_TAC[HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
4153     REWRITE_TAC[GSYM integrable_on] THEN
4154     MATCH_MP_TAC PATH_INTEGRAL_LOCAL_PRIMITIVE_ANY THEN
4155     EXISTS_TAC `(:complex) DELETE z` THEN
4156     ASM_SIMP_TAC[IN_DELETE; IN_UNIV;
4157                  DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE] THEN
4158     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
4159     EXISTS_TAC `norm(w - z:complex)` THEN
4160     ASM_REWRITE_TAC[COMPLEX_NORM_NZ; COMPLEX_SUB_0] THEN
4161     ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
4162     ALL_TAC] THEN
4163   DISCH_TAC THEN MATCH_MP_TAC HAS_DERIVATIVE_ZERO_UNIQUE_STRONG_INTERVAL THEN
4164   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [piecewise_differentiable_on]) THEN
4165   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
4166   MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[IN_DIFF; FINITE_IMP_COUNTABLE] THEN
4167   X_GEN_TAC `k:real^1->bool` THEN STRIP_TAC THEN
4168   ASM_SIMP_TAC[CONVEX_INTERVAL; INTEGRAL_REFL] THEN
4169   REWRITE_TAC[COMPLEX_VEC_0; COMPLEX_NEG_0; CEXP_0; COMPLEX_MUL_LID] THEN
4170   CONJ_TAC THENL
4171    [MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
4172     ASM_SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; ETA_AX;
4173                  PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON] THEN
4174     GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
4175     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
4176     REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
4177     MATCH_MP_TAC CONTINUOUS_ON_NEG THEN
4178     MATCH_MP_TAC INDEFINITE_INTEGRAL_CONTINUOUS_RIGHT THEN
4179     FIRST_X_ASSUM MATCH_MP_TAC THEN
4180     ASM_REWRITE_TAC[IN_INTERVAL_1; REAL_LE_REFL];
4181     ALL_TAC] THEN
4182   X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
4183   MP_TAC(ISPECL [`\w:complex. inv(w - z)`;
4184                  `ball((g:real^1->complex) t,dist(g t,z))`;
4185                  `{}:complex->bool`]
4186                 HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
4187   SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL; INTERIOR_OPEN] THEN
4188   REWRITE_TAC[CONVEX_BALL; FINITE_RULES; DIFF_EMPTY] THEN ANTS_TAC THENL
4189    [SUBGOAL_THEN `(\w. inv(w - z)) holomorphic_on ball(g(t:real^1),dist(g t,z))`
4190      (fun th ->
4191       MESON_TAC[HOLOMORPHIC_ON_OPEN; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
4192                 OPEN_BALL; complex_differentiable; th]) THEN
4193     SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; IN_BALL] THEN
4194     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
4195     EXISTS_TAC `--Cx(&1) / (w - z) pow 2` THEN COMPLEX_DIFF_TAC THEN
4196     REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_SUB_0] THEN
4197     ASM_MESON_TAC[REAL_LT_REFL];
4198     ALL_TAC] THEN
4199   REWRITE_TAC[IN_BALL; dist] THEN
4200   DISCH_THEN(X_CHOOSE_TAC `h:complex->complex`) THEN
4201   SUBGOAL_THEN `(\h. Cx(&0)) = (\h. drop h % Cx(&0))` SUBST1_TAC THENL
4202    [REWRITE_TAC[FUN_EQ_THM; GSYM COMPLEX_VEC_0; VECTOR_MUL_RZERO];
4203     ALL_TAC] THEN
4204   REWRITE_TAC[GSYM has_vector_derivative] THEN MATCH_MP_TAC lemma THEN
4205   EXISTS_TAC `vector_derivative g (at t within interval[a,b]):complex` THEN
4206   REPEAT CONJ_TAC THENL
4207    [REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
4208     ASM_MESON_TAC[DIFFERENTIABLE_AT_WITHIN];
4209     ALL_TAC;
4210     ASM_MESON_TAC[]] THEN
4211   REWRITE_TAC[has_vector_derivative] THEN
4212   MATCH_MP_TAC HAS_DERIVATIVE_TRANSFORM_WITHIN THEN
4213   ASM_REWRITE_TAC[GSYM has_vector_derivative] THEN
4214   EXISTS_TAC `\u. integral (interval [a,t])
4215                   (\x. vector_derivative g (at x within interval [a,b]) /
4216                        ((g:real^1->complex) x - z)) + (h(g(u)) - h(g(t)))` THEN
4217   REWRITE_TAC[LEFT_EXISTS_AND_THM; CONJ_ASSOC] THEN
4218   REWRITE_TAC[GSYM CONJ_ASSOC] THEN CONJ_TAC THENL
4219    [ALL_TAC;
4220     ONCE_REWRITE_TAC[COMPLEX_RING `a + (b - c) = b + (a - c):complex`] THEN
4221     GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_ADD_RID] THEN
4222     MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_ADD THEN
4223     REWRITE_TAC[HAS_VECTOR_DERIVATIVE_CONST] THEN
4224     REWRITE_TAC[has_vector_derivative] THEN
4225     SUBGOAL_THEN `!x y. (\h. drop h % x / y) =
4226                         (\x. inv(y) * x) o (\h. drop h % x)`
4227      (fun th -> REWRITE_TAC[th])
4228     THENL
4229      [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4230       SIMPLE_COMPLEX_ARITH_TAC;
4231       ALL_TAC] THEN
4232     GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
4233     MATCH_MP_TAC DIFF_CHAIN_WITHIN THEN
4234     REWRITE_TAC[GSYM has_complex_derivative; GSYM has_vector_derivative] THEN
4235     REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
4236     CONJ_TAC THENL [ASM_MESON_TAC[DIFFERENTIABLE_AT_WITHIN]; ALL_TAC] THEN
4237     MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
4238     FIRST_X_ASSUM MATCH_MP_TAC THEN
4239     REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; COMPLEX_NORM_NZ] THEN
4240     ASM_SIMP_TAC[COMPLEX_SUB_0]] THEN
4241   SUBGOAL_THEN
4242    `?d. &0 < d /\
4243         !y:real^1. y IN interval[a,b] /\ dist(y,t) < d
4244                    ==> dist(g y:complex,g t) < norm(g t - z) /\ ~(y IN k)`
4245   MP_TAC THENL
4246    [SUBGOAL_THEN `(g:real^1->complex) continuous (at t within interval[a,b])`
4247     MP_TAC THENL
4248      [ASM_MESON_TAC[PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON;
4249                     CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN];
4250       ALL_TAC] THEN
4251     REWRITE_TAC[continuous_within] THEN
4252     DISCH_THEN(MP_TAC o SPEC `norm((g:real^1->complex) t - z)`) THEN
4253     ASM_SIMP_TAC[COMPLEX_NORM_NZ; COMPLEX_SUB_0] THEN
4254     DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
4255     FIRST_X_ASSUM(X_CHOOSE_THEN `d2:real` STRIP_ASSUME_TAC o
4256       SPEC `t:real^1` o MATCH_MP FINITE_SET_AVOID) THEN
4257     EXISTS_TAC `min d1 d2` THEN ASM_SIMP_TAC[REAL_LT_MIN] THEN
4258     ASM_MESON_TAC[DIST_SYM; REAL_NOT_LE];
4259     ALL_TAC] THEN
4260   REWRITE_TAC[TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
4261   REWRITE_TAC[FORALL_AND_THM] THEN
4262   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN STRIP_TAC THEN
4263   ASM_REWRITE_TAC[] THEN X_GEN_TAC `u:real^1` THEN REWRITE_TAC[dist] THEN
4264   STRIP_TAC THEN
4265   DISJ_CASES_TAC(REAL_ARITH `drop t <= drop u \/ drop u <= drop t`) THENL
4266    [SUBGOAL_THEN
4267      `integral (interval [a,u])
4268         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) =
4269       integral (interval [a,t])
4270         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) +
4271       integral (interval [t,u])
4272         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z))`
4273     SUBST1_TAC THENL
4274      [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE THEN
4275       ASM_MESON_TAC[IN_INTERVAL_1];
4276       ALL_TAC] THEN
4277     SIMP_TAC[COMPLEX_RING `a + x = a + y <=> y:complex = x`];
4278     SUBGOAL_THEN
4279      `integral (interval [a,t])
4280         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) =
4281       integral (interval [a,u])
4282         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) +
4283       integral (interval [u,t])
4284         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z))`
4285     SUBST1_TAC THENL
4286      [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE THEN
4287       ASM_MESON_TAC[IN_INTERVAL_1];
4288       ALL_TAC] THEN
4289     SIMP_TAC[COMPLEX_RING `(a + x) + (w - z) = a <=> x:complex = z - w`]] THEN
4290   (MATCH_MP_TAC INTEGRAL_UNIQUE THEN
4291    MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS THEN
4292    ASM_REWRITE_TAC[GSYM o_DEF] THEN X_GEN_TAC `x:real^1` THEN
4293    REPEAT STRIP_TAC THEN REWRITE_TAC[has_vector_derivative; COMPLEX_CMUL] THEN
4294    SUBGOAL_THEN `!x y. (\h. Cx(drop h) * x / y) =
4295                        (\x. inv(y) * x) o (\h. drop h % x)`
4296     (fun th -> REWRITE_TAC[th])
4297    THENL
4298     [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4299      SIMPLE_COMPLEX_ARITH_TAC;
4300      ALL_TAC] THEN
4301    MATCH_MP_TAC DIFF_CHAIN_WITHIN THEN
4302    REWRITE_TAC[GSYM has_complex_derivative; GSYM has_vector_derivative] THEN
4303    CONJ_TAC THENL
4304     [MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_WITHIN_SUBSET THEN
4305      EXISTS_TAC `interval[a:real^1,b]` THEN
4306      REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN CONJ_TAC THENL
4307       [MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
4308        FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL
4309         [ALL_TAC; FIRST_X_ASSUM MATCH_MP_TAC];
4310        ALL_TAC] THEN
4311      REPEAT(FIRST_X_ASSUM(MP_TAC o
4312         check (fun t -> not(is_forall (concl t))))) THEN
4313      REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB] THEN
4314      REWRITE_TAC[SUBSET_INTERVAL_1; IN_INTERVAL_1; REAL_LE_REFL] THEN
4315      REAL_ARITH_TAC;
4316      ALL_TAC] THEN
4317    MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
4318    FIRST_X_ASSUM MATCH_MP_TAC THEN GEN_REWRITE_TAC LAND_CONV [GSYM dist] THEN
4319    ONCE_REWRITE_TAC[DIST_SYM] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
4320    CONJ_TAC THENL [ASM_MESON_TAC[IN_INTERVAL_1; REAL_LE_TRANS]; ALL_TAC] THEN
4321    REPEAT(FIRST_X_ASSUM(MP_TAC o
4322       check (fun t -> not(is_forall (concl t))))) THEN
4323    REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB] THEN
4324    REWRITE_TAC[SUBSET_INTERVAL_1; IN_INTERVAL_1; REAL_LE_REFL] THEN
4325    REAL_ARITH_TAC));;
4326
4327 let WINDING_NUMBER_AHLFORS = prove
4328  (`!g z a b.
4329         g piecewise_differentiable_on interval [a,b] /\
4330         drop a <= drop b /\ (!x. x IN interval [a,b] ==> ~(g x = z))
4331         ==> (\x. vector_derivative g (at x) / (g(x) - z))
4332             integrable_on interval[a,b] /\
4333             cexp(--(integral (interval[a,b])
4334                              (\x. vector_derivative g (at x) / (g(x) - z)))) *
4335             (g(b) - z) = g(a) - z`,
4336   REPEAT GEN_TAC THEN STRIP_TAC THEN
4337   REWRITE_TAC[integrable_on; integral] THEN
4338   REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] complex_div] THEN
4339   REWRITE_TAC[GSYM HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
4340   ONCE_REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM](GSYM complex_div)] THEN
4341   REWRITE_TAC[GSYM integral; GSYM integrable_on] THEN
4342   MATCH_MP_TAC WINDING_NUMBER_AHLFORS_LEMMA THEN ASM_REWRITE_TAC[]);;
4343
4344 let WINDING_NUMBER_AHLFORS_FULL = prove
4345  (`!p z. path p /\ ~(z IN path_image p)
4346          ==> pathfinish p - z =
4347              cexp(Cx(&2) * Cx pi * ii * winding_number(p,z)) *
4348              (pathstart p - z)`,
4349   REPEAT STRIP_TAC THEN
4350   MP_TAC(ISPECL [`p:real^1->complex`; `z:complex`; `&1`] WINDING_NUMBER) THEN
4351   ASM_REWRITE_TAC[REAL_LT_01; LEFT_IMP_EXISTS_THM] THEN
4352   X_GEN_TAC `g:real^1->complex` THEN STRIP_TAC THEN
4353   REPEAT(FIRST_X_ASSUM(SUBST_ALL_TAC o SYM)) THEN
4354   RULE_ASSUM_TAC(REWRITE_RULE[valid_path; path_image; IN_IMAGE;
4355         NOT_EXISTS_THM]) THEN
4356   MP_TAC(ISPECL
4357    [`g:real^1->complex`; `z:complex`; `vec 0:real^1`; `vec 1:real^1`]
4358    WINDING_NUMBER_AHLFORS) THEN
4359   ASM_SIMP_TAC[DROP_VEC; REAL_POS; pathstart; pathfinish] THEN ANTS_TAC THENL
4360    [ASM_MESON_TAC[]; DISCH_THEN(SUBST1_TAC o SYM o CONJUNCT2)] THEN
4361   REWRITE_TAC[GSYM CEXP_ADD; COMPLEX_MUL_ASSOC; PATH_INTEGRAL_INTEGRAL] THEN
4362   REWRITE_TAC[SIMPLE_COMPLEX_ARITH `Cx(&1) / z * w = w / z`] THEN
4363   REWRITE_TAC[GSYM complex_sub; COMPLEX_SUB_REFL; CEXP_0; COMPLEX_MUL_LID]);;
4364
4365 (* ------------------------------------------------------------------------- *)
4366 (* State in terms of complex integers. Note the useful equality version.     *)
4367 (* ------------------------------------------------------------------------- *)
4368
4369 let complex_integer = new_definition
4370  `complex_integer z <=> integer(Re z) /\ Im z = &0`;;
4371
4372 let COMPLEX_INTEGER = prove
4373  (`complex_integer z <=> ?n. integer n /\ z = Cx n`,
4374   REWRITE_TAC[COMPLEX_EQ; RE_CX; IM_CX; complex_integer] THEN MESON_TAC[]);;
4375
4376 let INTEGER_WINDING_NUMBER_EQ = prove
4377  (`!g z. path g /\ ~(z IN path_image g)
4378          ==> (complex_integer(winding_number(g,z)) <=>
4379               pathfinish g = pathstart g)`,
4380   REPEAT STRIP_TAC THEN
4381   MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_BALL) THEN
4382   ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4383   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4384   ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_BALL] THEN
4385   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
4386   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `e:real`]
4387     WINDING_NUMBER) THEN
4388   ASM_REWRITE_TAC[] THEN
4389   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
4390   SUBGOAL_THEN
4391    `complex_integer(winding_number(p,z)) <=>
4392     pathfinish p = pathstart p`
4393   MP_TAC THENL
4394    [UNDISCH_THEN
4395      `path_integral p (\w. Cx(&1) / (w - z)) =
4396       Cx(&2) * Cx pi * ii * winding_number (g,z)` (K ALL_TAC) THEN
4397     ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH];
4398     ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; CX_2PII_NZ; COMPLEX_FIELD
4399      `~(a * b * c = Cx(&0))
4400       ==> Cx(&1) / (a * b * c) * a * b * c * z = z`]] THEN
4401   UNDISCH_THEN `pathstart p:complex = pathstart g` (SUBST_ALL_TAC o SYM) THEN
4402   UNDISCH_THEN `pathfinish p:complex = pathfinish g` (SUBST_ALL_TAC o SYM) THEN
4403   RULE_ASSUM_TAC(REWRITE_RULE[valid_path; path_image]) THEN
4404   REWRITE_TAC[pathfinish; pathstart] THEN
4405   MATCH_MP_TAC EQ_TRANS THEN
4406   EXISTS_TAC `cexp(path_integral p (\w. Cx(&1) / (w - z))) = Cx(&1)` THEN
4407   CONJ_TAC THENL
4408    [REWRITE_TAC[CEXP_EQ_1; complex_integer] THEN
4409     REWRITE_TAC[complex_div; COMPLEX_MUL_LID; COMPLEX_INV_MUL] THEN
4410     SIMP_TAC[GSYM CX_INV; GSYM CX_MUL; COMPLEX_MUL_ASSOC; COMPLEX_INV_II] THEN
4411     REWRITE_TAC[RE_MUL_CX; IM_MUL_CX; GSYM COMPLEX_MUL_ASSOC] THEN
4412     REWRITE_TAC[COMPLEX_MUL_LNEG; RE_MUL_II; IM_MUL_II; RE_NEG; IM_NEG] THEN
4413     REWRITE_TAC[REAL_NEGNEG; REAL_ENTIRE; REAL_INV_EQ_0; REAL_NEG_EQ_0] THEN
4414     SIMP_TAC[REAL_OF_NUM_EQ; ARITH; REAL_LT_IMP_NZ; PI_POS] THEN
4415     SIMP_TAC[PI_POS; REAL_FIELD
4416      `&0 < p ==> (x = &2 * n * p <=> (inv(&2) * inv(p)) * x = n)`] THEN
4417     MESON_TAC[];
4418     MP_TAC(ISPECL [`p:real^1->complex`; `z:complex`;
4419                    `vec 0:real^1`; `vec 1:real^1`]
4420                   WINDING_NUMBER_AHLFORS) THEN
4421     ASM_REWRITE_TAC[DROP_VEC; REAL_POS] THEN
4422     ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
4423     DISCH_THEN(MP_TAC o CONJUNCT2) THEN
4424     REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] complex_div] THEN
4425     REWRITE_TAC[integral; GSYM HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
4426     REWRITE_TAC[GSYM has_path_integral; GSYM path_integral] THEN
4427     REWRITE_TAC[CEXP_NEG; COMPLEX_MUL_RID] THEN
4428     MATCH_MP_TAC(COMPLEX_FIELD
4429      `~(i = Cx(&0)) /\ ~(g0 = z)
4430       ==> (inv i * (g1 - z) = g0 - z ==> (i = Cx(&1) <=> g1 = g0))`) THEN
4431     REWRITE_TAC[CEXP_NZ] THEN
4432     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [IN_IMAGE]) THEN
4433     REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN MESON_TAC[REAL_POS; DROP_VEC]]);;
4434
4435 let INTEGER_WINDING_NUMBER = prove
4436  (`!g z. path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g)
4437          ==> complex_integer(winding_number(g,z))`,
4438   MESON_TAC[INTEGER_WINDING_NUMBER_EQ]);;
4439
4440 (* ------------------------------------------------------------------------- *)
4441 (* For |WN| >= 1 the path must contain points in every direction.            *)
4442 (* We can thus bound the WN of a path that doesn't meet some "cut".          *)
4443 (* ------------------------------------------------------------------------- *)
4444
4445 let WINDING_NUMBER_POS_MEETS = prove
4446  (`!g z. valid_path g /\ ~(z IN path_image g) /\
4447          Re(winding_number(g,z)) >= &1
4448          ==> !w. ~(w = z)
4449                  ==> ?a. &0 < a /\ z + (Cx a * (w - z)) IN path_image g`,
4450   REPEAT STRIP_TAC THEN
4451   SUBGOAL_THEN
4452    `!t. t IN interval[vec 0,vec 1] ==> ~((g:real^1->complex) t = z)`
4453   ASSUME_TAC THENL
4454    [UNDISCH_TAC `~((z:complex) IN path_image g)` THEN
4455     REWRITE_TAC[path_image; IN_IMAGE] THEN MESON_TAC[];
4456     ALL_TAC] THEN
4457   ABBREV_TAC `r:complex = (w - z) / (pathstart g - z)` THEN
4458   STRIP_ASSUME_TAC(GSYM(SPEC `r:complex` ARG)) THEN
4459   SUBGOAL_THEN
4460    `?t. t IN interval[vec 0,vec 1] /\
4461         Im(integral (interval[vec 0,t])
4462                     (\x. vector_derivative g (at x) / (g x - z))) = Arg r`
4463   STRIP_ASSUME_TAC THENL
4464    [REWRITE_TAC[IM_DEF] THEN MATCH_MP_TAC IVT_INCREASING_COMPONENT_ON_1 THEN
4465     ASM_SIMP_TAC[DIMINDEX_2; DROP_VEC; ARITH; INTEGRAL_REFL; REAL_POS;
4466                  VEC_COMPONENT] THEN
4467     CONJ_TAC THENL
4468      [MATCH_MP_TAC INDEFINITE_INTEGRAL_CONTINUOUS_RIGHT THEN
4469       REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] complex_div] THEN
4470       REWRITE_TAC[GSYM PATH_INTEGRABLE_ON] THEN
4471       REWRITE_TAC[SIMPLE_COMPLEX_ARITH `inv z = Cx(&1) / z`] THEN
4472       MATCH_MP_TAC PATH_INTEGRABLE_INVERSEDIFF THEN ASM_REWRITE_TAC[];
4473       ALL_TAC] THEN
4474     MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2 * pi` THEN
4475     ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN
4476     UNDISCH_TAC `Re(winding_number (g,z)) >= &1` THEN
4477     ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; GSYM IM_DEF] THEN
4478     REWRITE_TAC[path_integral; HAS_PATH_INTEGRAL; GSYM integral] THEN
4479     SUBST1_TAC(COMPLEX_FIELD `ii = --inv ii`) THEN
4480     REWRITE_TAC[complex_div; COMPLEX_INV_MUL; COMPLEX_INV_NEG] THEN
4481     REWRITE_TAC[GSYM CX_INV; GSYM CX_MUL; COMPLEX_MUL_ASSOC] THEN
4482     REWRITE_TAC[RE_MUL_CX; RE; COMPLEX_MUL_RNEG; RE_NEG; COMPLEX_MUL_LNEG;
4483                 COMPLEX_INV_INV; GSYM COMPLEX_MUL_ASSOC; RE_MUL_II] THEN
4484     REWRITE_TAC[REAL_MUL_RNEG; REAL_NEGNEG] THEN
4485     SIMP_TAC[REAL_ARITH `((&1 * inv(&2)) * p) * x >= &1 <=> &2 <= x * p`] THEN
4486     SIMP_TAC[GSYM real_div; REAL_LE_RDIV_EQ; PI_POS] THEN
4487     REWRITE_TAC[COMPLEX_MUL_LID; COMPLEX_MUL_AC];
4488     ALL_TAC] THEN
4489   MP_TAC(ISPECL
4490    [`g:real^1->complex`; `z:complex`; `vec 0:real^1`; `t:real^1`]
4491    WINDING_NUMBER_AHLFORS) THEN
4492   ANTS_TAC THENL
4493    [REPEAT CONJ_TAC THENL
4494      [MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_SUBSET THEN
4495       EXISTS_TAC `interval[vec 0:real^1,vec 1]` THEN
4496       RULE_ASSUM_TAC(REWRITE_RULE[valid_path]) THEN ASM_REWRITE_TAC[];
4497       ALL_TAC;
4498       GEN_TAC THEN
4499       DISCH_THEN(fun th -> FIRST_ASSUM MATCH_MP_TAC THEN MP_TAC th)] THEN
4500     UNDISCH_TAC `(t:real^1) IN interval[vec 0,vec 1]` THEN
4501     REWRITE_TAC[SUBSET; IN_INTERVAL_1; DROP_VEC] THEN REAL_ARITH_TAC;
4502     ALL_TAC] THEN
4503   DISCH_THEN(MP_TAC o CONJUNCT2) THEN REWRITE_TAC[CEXP_NEG] THEN
4504   ABBREV_TAC `i = integral (interval [vec 0,t])
4505     (\x. vector_derivative g (at x) / (g x - z))` THEN
4506   SUBST1_TAC(SPEC `i:complex` COMPLEX_EXPAND) THEN
4507   ASM_REWRITE_TAC[CEXP_ADD; COMPLEX_INV_MUL; GSYM CX_EXP] THEN
4508   UNDISCH_TAC `Cx(norm r) * cexp(ii * Cx(Arg r)) = r` THEN
4509   REWRITE_TAC[IMP_IMP] THEN DISCH_THEN(MP_TAC o MATCH_MP (COMPLEX_FIELD
4510    `x * e = r /\ (y * inv e) * w = z
4511     ==> ~(e = Cx(&0)) ==> x * y * w = r * z`)) THEN
4512   REWRITE_TAC[CEXP_NZ] THEN
4513   EXPAND_TAC "r" THEN
4514   GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV) [pathstart] THEN
4515   SUBGOAL_THEN `~((g:real^1->complex)(vec 0) = z)` ASSUME_TAC THENL
4516    [FIRST_ASSUM MATCH_MP_TAC THEN SIMP_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS];
4517     ALL_TAC] THEN
4518   ASM_SIMP_TAC[COMPLEX_DIV_RMUL; COMPLEX_SUB_0; GSYM CX_INV; GSYM CX_MUL;
4519                COMPLEX_MUL_ASSOC; GSYM real_div] THEN
4520   DISCH_TAC THEN
4521   EXISTS_TAC `exp(Re i) / norm(r:complex)` THEN
4522   SUBGOAL_THEN `~(r = Cx(&0))` ASSUME_TAC THENL
4523    [EXPAND_TAC "r" THEN MATCH_MP_TAC(COMPLEX_FIELD
4524    `~(x = Cx(&0)) /\ ~(y = Cx(&0)) ==> ~(x / y = Cx(&0))`) THEN
4525     ASM_REWRITE_TAC[COMPLEX_SUB_0; pathstart];
4526     ALL_TAC] THEN
4527   ASM_SIMP_TAC[REAL_LT_DIV; REAL_EXP_POS_LT; COMPLEX_NORM_NZ] THEN
4528   REWRITE_TAC[path_image; IN_IMAGE] THEN
4529   EXISTS_TAC `t:real^1` THEN ASM_REWRITE_TAC[] THEN
4530   MATCH_MP_TAC(COMPLEX_FIELD
4531    `inv i * (gt - z) = wz /\ ~(i = Cx(&0)) ==> z + i * wz = gt`) THEN
4532   ASM_REWRITE_TAC[GSYM CX_INV; REAL_INV_DIV; CX_INJ] THEN
4533   MATCH_MP_TAC(REAL_FIELD `~(x = &0) /\ ~(y = &0) ==> ~(x / y = &0)`) THEN
4534   ASM_REWRITE_TAC[REAL_EXP_NZ; COMPLEX_NORM_ZERO]);;
4535
4536 let WINDING_NUMBER_BIG_MEETS = prove
4537  (`!g z. valid_path g /\ ~(z IN path_image g) /\
4538          abs(Re(winding_number(g,z))) >= &1
4539          ==> !w. ~(w = z)
4540                  ==> ?a. &0 < a /\ z + (Cx a * (w - z)) IN path_image g`,
4541   REPEAT GEN_TAC THEN REWRITE_TAC[real_abs] THEN COND_CASES_TAC THEN
4542   ASM_SIMP_TAC[WINDING_NUMBER_POS_MEETS] THEN
4543   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
4544   ASM_SIMP_TAC[GSYM RE_NEG; VALID_PATH_IMP_PATH;
4545                GSYM WINDING_NUMBER_REVERSEPATH] THEN
4546   DISCH_TAC THEN ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
4547   MATCH_MP_TAC WINDING_NUMBER_POS_MEETS THEN
4548   ASM_SIMP_TAC[PATH_IMAGE_REVERSEPATH; VALID_PATH_REVERSEPATH]);;
4549
4550 let WINDING_NUMBER_LT_1 = prove
4551  (`!g w z. valid_path g /\ ~(z IN path_image g) /\ ~(w = z) /\
4552            (!a. &0 < a ==> ~(z + (Cx a * (w - z)) IN path_image g))
4553            ==> Re(winding_number(g,z)) < &1`,
4554   REPEAT STRIP_TAC THEN
4555   REWRITE_TAC[GSYM REAL_NOT_LE; GSYM real_ge] THEN
4556   ASM_MESON_TAC[WINDING_NUMBER_POS_MEETS]);;
4557
4558 (* ------------------------------------------------------------------------- *)
4559 (* One way of proving that WN=1 for a loop.                                  *)
4560 (* ------------------------------------------------------------------------- *)
4561
4562 let WINDING_NUMBER_EQ_1 = prove
4563  (`!g z. valid_path g /\ ~(z IN path_image g) /\ pathfinish g = pathstart g /\
4564          &0 < Re(winding_number(g,z)) /\ Re(winding_number(g,z)) < &2
4565          ==> winding_number(g,z) = Cx(&1)`,
4566   REPEAT GEN_TAC THEN
4567   REPLICATE_TAC 3 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
4568   SUBGOAL_THEN `complex_integer(winding_number(g,z))` MP_TAC THENL
4569    [ASM_SIMP_TAC[INTEGER_WINDING_NUMBER; VALID_PATH_IMP_PATH]; ALL_TAC] THEN
4570   SIMP_TAC[complex_integer; COMPLEX_EQ; RE_CX; IM_CX] THEN
4571   SIMP_TAC[REAL_LT_INTEGERS; INTEGER_CLOSED] THEN REAL_ARITH_TAC);;
4572
4573 (* ------------------------------------------------------------------------- *)
4574 (* Continuity of winding number and invariance on connected sets.            *)
4575 (* ------------------------------------------------------------------------- *)
4576
4577 let CONTINUOUS_AT_WINDING_NUMBER = prove
4578  (`!g z. path g /\ ~(z IN path_image g)
4579          ==> (\w. winding_number(g,w)) continuous (at z)`,
4580   REPEAT STRIP_TAC THEN
4581   MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_CBALL) THEN
4582   ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE] THEN
4583   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4584   ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_CBALL] THEN
4585   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
4586   MP_TAC(ISPECL [`(:complex) DIFF cball(z,e / &2)`; `g:real^1->complex`]
4587         PATH_INTEGRAL_NEARBY_ENDS) THEN
4588   ASM_SIMP_TAC[OPEN_DIFF; OPEN_UNIV; CLOSED_CBALL] THEN ANTS_TAC THENL
4589    [REWRITE_TAC[SUBSET; IN_DIFF; IN_CBALL; SUBSET; IN_UNIV] THEN
4590     GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
4591     REWRITE_TAC[] THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
4592     ASM_REAL_ARITH_TAC;
4593     ALL_TAC] THEN
4594   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
4595   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `min d e / &2`]
4596     WINDING_NUMBER) THEN
4597   ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN
4598   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
4599   MATCH_MP_TAC CONTINUOUS_TRANSFORM_AT THEN
4600   MAP_EVERY EXISTS_TAC [`\w. winding_number(p,w)`; `min d e / &2`] THEN
4601   ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN CONJ_TAC THENL
4602    [X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
4603     MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
4604     ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
4605     MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
4606      [REWRITE_TAC[path_image; IN_IMAGE] THEN
4607       DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC) THEN
4608       FIRST_X_ASSUM(MP_TAC o SPEC `(g:real^1->complex) t`) THEN
4609       FIRST_X_ASSUM(MP_TAC o SPEC `t:real^1`) THEN
4610       ASM_SIMP_TAC[path_image; FUN_IN_IMAGE] THEN
4611       UNDISCH_TAC `dist (w:complex,z) < min d e / &2` THEN
4612       ASM_REWRITE_TAC[] THEN CONV_TAC NORM_ARITH;
4613       DISCH_TAC THEN X_GEN_TAC `k:real` THEN DISCH_TAC THEN
4614       MP_TAC(ISPECL [`g:real^1->complex`; `w:complex`; `min k (min d e) / &2`]
4615          WINDING_NUMBER) THEN
4616       ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN ANTS_TAC THENL
4617        [FIRST_X_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
4618         ASM_REAL_ARITH_TAC;
4619         ALL_TAC] THEN
4620       DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
4621       EXISTS_TAC `p:real^1->complex` THEN ASM_REWRITE_TAC[] THEN
4622       ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
4623       FIRST_X_ASSUM(fun th -> GEN_REWRITE_TAC RAND_CONV [SYM th]) THEN
4624       CONV_TAC SYM_CONV THEN FIRST_X_ASSUM(MP_TAC o SPECL
4625         [`p:real^1->complex`; `q:real^1->complex`]) THEN
4626       ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
4627        [X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
4628         REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `t:real^1`)) THEN
4629         ASM_REWRITE_TAC[] THEN CONV_TAC NORM_ARITH;
4630         DISCH_THEN(MATCH_MP_TAC o last o CONJUNCTS)] THEN
4631       MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
4632       SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
4633                IN_DELETE; IN_UNIV; COMPLEX_SUB_0] THEN
4634       ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN SIMP_TAC[IN_DIFF] THEN
4635       REWRITE_TAC[IN_UNIV; IN_CBALL] THEN
4636       ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC];
4637     UNDISCH_TAC `~((z:complex) IN path_image p)` THEN
4638     UNDISCH_TAC `valid_path(p:real^1->complex)` THEN
4639     POP_ASSUM_LIST(K ALL_TAC) THEN SPEC_TAC(`z:complex`,`z:complex`) THEN
4640     SPEC_TAC(`p:real^1->complex`,`g:real^1->complex`)] THEN
4641   REPEAT STRIP_TAC THEN
4642   MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_BALL) THEN
4643   ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4644   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4645   ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_BALL] THEN
4646   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
4647   MP_TAC(ISPECL [`(:complex) DIFF cball(z, &3 / &4 * d)`; `g:real^1->complex`]
4648         PATH_INTEGRAL_BOUND_EXISTS) THEN
4649   ASM_REWRITE_TAC[GSYM closed; CLOSED_CBALL; SUBSET; IN_DIFF;
4650                   IN_CBALL; IN_UNIV; REAL_NOT_LE] THEN
4651   ANTS_TAC THENL
4652    [ASM_MESON_TAC[REAL_ARITH `&0 < d /\ ~(&3 / &4 * d < x) ==> x < d`];
4653     ALL_TAC] THEN
4654   DISCH_THEN(X_CHOOSE_THEN `L:real` STRIP_ASSUME_TAC) THEN
4655   REWRITE_TAC[continuous_at] THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
4656   EXISTS_TAC `min (d / &4) (e / &2 * d pow 2 / L / &4)` THEN
4657   ASM_SIMP_TAC[REAL_LT_MIN; REAL_POW_LT; REAL_LT_DIV; REAL_LT_MUL; REAL_HALF;
4658                REAL_ARITH `&0 < x / &4 <=> &0 < x`] THEN
4659   X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
4660   SUBGOAL_THEN `~((w:complex) IN path_image g)` ASSUME_TAC THENL
4661    [FIRST_X_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
4662     ASM_REAL_ARITH_TAC;
4663     ALL_TAC] THEN
4664   ASM_SIMP_TAC[dist; WINDING_NUMBER_VALID_PATH; GSYM COMPLEX_SUB_LDISTRIB] THEN
4665   REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_CX] THEN
4666   REWRITE_TAC[REAL_ABS_NUM; COMPLEX_NORM_II; REAL_ABS_PI] THEN
4667   REWRITE_TAC[real_div; REAL_MUL_LID; REAL_MUL_RID] THEN
4668   MATCH_MP_TAC(REAL_ARITH
4669     `inv p * x <= &1 * x /\ x < e ==> inv p * x < e`) THEN
4670   CONJ_TAC THENL
4671    [MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
4672     MATCH_MP_TAC REAL_INV_LE_1 THEN MP_TAC PI_APPROX_32 THEN REAL_ARITH_TAC;
4673     ALL_TAC] THEN
4674   MATCH_MP_TAC(REAL_ARITH `!d. &0 < e /\ d = e / &2 /\ x <= d ==> x < e`) THEN
4675   EXISTS_TAC `L * (e / &2 * d pow 2 / L / &4) * inv(d / &2) pow 2` THEN
4676   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
4677    [MAP_EVERY UNDISCH_TAC [`&0 < d`; `&0 < L`] THEN CONV_TAC REAL_FIELD;
4678     ALL_TAC] THEN
4679   SUBGOAL_THEN
4680    `path_integral g (\x. Cx(&1) / (x - w)) -
4681     path_integral g (\x. Cx(&1) / (x - z)) =
4682     path_integral g (\x. Cx(&1) / (x - w) - Cx(&1) / (x - z))`
4683   SUBST1_TAC THENL
4684    [CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_SUB THEN
4685     CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_INVERSEDIFF THEN
4686     ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
4687     ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC;
4688     ALL_TAC] THEN
4689   FIRST_X_ASSUM MATCH_MP_TAC THEN
4690   SIMP_TAC[HOLOMORPHIC_ON_OPEN; GSYM closed; CLOSED_CBALL] THEN
4691   REWRITE_TAC[IN_UNIV; IN_DIFF; IN_CBALL; REAL_NOT_LE; AND_FORALL_THM] THEN
4692   X_GEN_TAC `x:complex` THEN
4693   REWRITE_TAC[TAUT `(a ==> b) /\ (a ==> c) <=> a ==> b /\ c`] THEN
4694   DISCH_TAC THEN REWRITE_TAC[GSYM complex_differentiable] THEN
4695   SUBGOAL_THEN `~(x:complex = w) /\ ~(x = z)` STRIP_ASSUME_TAC THENL
4696    [CONJ_TAC THEN DISCH_THEN SUBST_ALL_TAC THEN
4697     REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM REAL_NOT_LE])) THEN
4698     CONV_TAC NORM_ARITH;
4699     ALL_TAC] THEN
4700   CONJ_TAC THENL
4701    [MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
4702     CONJ_TAC THEN MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
4703     ASM_SIMP_TAC[COMPLEX_SUB_0; COMPLEX_DIFFERENTIABLE_SUB;
4704                  COMPLEX_DIFFERENTIABLE_ID; COMPLEX_DIFFERENTIABLE_CONST];
4705     ALL_TAC] THEN
4706   ASM_SIMP_TAC[COMPLEX_FIELD
4707    `~(x = w) /\ ~(x = z)
4708     ==> Cx(&1) / (x - w) - Cx(&1) / (x - z) =
4709         (w - z) * inv((x - w) * (x - z))`] THEN
4710   REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
4711   ASM_SIMP_TAC[NORM_POS_LE; GSYM dist; REAL_LT_IMP_LE] THEN
4712   REWRITE_TAC[COMPLEX_NORM_INV; REAL_POW_INV] THEN
4713   MATCH_MP_TAC REAL_LE_INV2 THEN
4714   ASM_SIMP_TAC[REAL_POW_2; REAL_LT_MUL; REAL_HALF; COMPLEX_NORM_MUL] THEN
4715   MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_SIMP_TAC[REAL_HALF; REAL_LT_IMP_LE] THEN
4716   REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM REAL_NOT_LE])) THEN
4717   CONV_TAC NORM_ARITH);;
4718
4719 let CONTINUOUS_ON_WINDING_NUMBER = prove
4720  (`!g. path g
4721        ==> (\w. winding_number(g,w)) continuous_on
4722            ((:complex) DIFF path_image g)`,
4723   SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; GSYM closed;
4724            OPEN_UNIV; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4725   SIMP_TAC[IN_DIFF; IN_UNIV; CONTINUOUS_AT_WINDING_NUMBER]);;
4726
4727 let WINDING_NUMBER_CONSTANT = prove
4728  (`!s g. path g /\ pathfinish g = pathstart g /\
4729          connected s /\ s INTER path_image g = {}
4730          ==> ?k. !z. z IN s ==> winding_number(g,z) = k`,
4731   REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_DISCRETE_RANGE_CONSTANT THEN
4732   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
4733    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
4734     EXISTS_TAC `(:complex) DIFF path_image g` THEN
4735     ASM_SIMP_TAC[CONTINUOUS_ON_WINDING_NUMBER] THEN ASM SET_TAC[];
4736     ALL_TAC] THEN
4737   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
4738   EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN
4739   X_GEN_TAC `w:complex` THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
4740   SUBGOAL_THEN
4741    `complex_integer(winding_number(g,w)) /\
4742     complex_integer(winding_number(g,z))`
4743   MP_TAC THENL
4744    [CONJ_TAC THEN MATCH_MP_TAC INTEGER_WINDING_NUMBER THEN
4745     ASM_REWRITE_TAC[] THEN ASM SET_TAC[];
4746     REWRITE_TAC[COMPLEX_INTEGER] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]] THEN
4747   REWRITE_TAC[GSYM CX_SUB; CX_INJ; COMPLEX_NORM_CX] THEN
4748   REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_ABS_INTEGER_LEMMA THEN
4749   ASM_SIMP_TAC[REAL_SUB_0; INTEGER_CLOSED]);;
4750
4751 let WINDING_NUMBER_EQ = prove
4752  (`!g s w z.
4753         path g /\ pathfinish g = pathstart g /\
4754         w IN s /\ z IN s /\ connected s /\ s INTER path_image g = {}
4755         ==> winding_number(g,w) = winding_number(g,z)`,
4756   MESON_TAC[WINDING_NUMBER_CONSTANT]);;
4757
4758 let OPEN_WINDING_NUMBER_LEVELSETS = prove
4759  (`!g k. path g /\ pathfinish g = pathstart g
4760          ==> open {z | ~(z IN path_image g) /\ winding_number(g,z) = k}`,
4761   REPEAT STRIP_TAC THEN REWRITE_TAC[open_def; IN_ELIM_THM] THEN
4762   X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
4763   MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_BALL) THEN
4764   ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4765   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4766   ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_BALL] THEN
4767   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
4768   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `w:complex` THEN
4769   REPEAT STRIP_TAC THENL [ASM_MESON_TAC[DIST_SYM]; ALL_TAC] THEN
4770   MP_TAC(ISPECL [`ball(z:complex,e)`; `g:real^1->complex`]
4771         WINDING_NUMBER_CONSTANT) THEN
4772   ASM_SIMP_TAC[CONNECTED_BALL; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_BALL] THEN
4773   ASM_MESON_TAC[DIST_REFL; DIST_SYM]);;
4774
4775 (* ------------------------------------------------------------------------- *)
4776 (* Winding number is zero "outside" a curve, in various senses.              *)
4777 (* ------------------------------------------------------------------------- *)
4778
4779 let WINDING_NUMBER_ZERO_IN_OUTSIDE = prove
4780  (`!g z. path g /\ pathfinish g = pathstart g /\ z IN outside(path_image g)
4781          ==> winding_number(g,z) = Cx(&0)`,
4782   REPEAT STRIP_TAC THEN
4783   MP_TAC(ISPECL [`path_image(g:real^1->complex)`; `Cx(&0)`]
4784    BOUNDED_SUBSET_BALL) THEN ASM_SIMP_TAC[BOUNDED_PATH_IMAGE] THEN
4785   DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
4786   SUBGOAL_THEN `?w. ~(w IN ball(Cx(&0),B + &1))` STRIP_ASSUME_TAC THENL
4787    [MATCH_MP_TAC(SET_RULE `~(s = UNIV) ==> ?z. ~(z IN s)`) THEN
4788     MESON_TAC[BOUNDED_BALL; NOT_BOUNDED_UNIV];
4789     ALL_TAC] THEN
4790   MP_TAC(ISPECL [`Cx(&0)`; `B:real`; `B + &1`] SUBSET_BALL) THEN
4791   REWRITE_TAC[REAL_ARITH `B <= B + &1`] THEN DISCH_TAC THEN
4792   MP_TAC(ISPECL [`path_image(g:real^1->complex)`; `ball(Cx(&0),B + &1)`]
4793         OUTSIDE_SUBSET_CONVEX) THEN
4794   ASM_REWRITE_TAC[CONVEX_BALL] THEN
4795   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
4796   REWRITE_TAC[SUBSET; IN_UNIV; IN_DIFF] THEN DISCH_TAC THEN
4797   MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC `winding_number(g,w)` THEN
4798   CONJ_TAC THENL
4799    [MP_TAC(ISPECL [`outside(path_image(g:real^1->complex))`;
4800                    `g:real^1->complex`] WINDING_NUMBER_CONSTANT) THEN
4801     ASM_SIMP_TAC[OUTSIDE_NO_OVERLAP; CONNECTED_OUTSIDE;
4802                  DIMINDEX_2; LE_REFL; BOUNDED_PATH_IMAGE] THEN
4803     ASM SET_TAC[];
4804     MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN ASM_REWRITE_TAC[] THEN
4805     MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
4806      [ASM SET_TAC[]; DISCH_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC] THEN
4807     MP_TAC(ISPECL [`g:real^1->complex`; `min e (&1)`]
4808         PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
4809     ASM_REWRITE_TAC[REAL_LT_MIN; REAL_LT_01] THEN
4810     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `p:real^1->complex` THEN
4811     STRIP_TAC THEN ONCE_REWRITE_TAC[NORM_SUB] THEN
4812     ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN CONJ_TAC THENL
4813      [UNDISCH_TAC `~(w IN ball (Cx(&0),B + &1))` THEN
4814       REWRITE_TAC[CONTRAPOS_THM; path_image; IN_BALL] THEN
4815       SPEC_TAC(`w:complex`,`x:complex`) THEN REWRITE_TAC[FORALL_IN_IMAGE];
4816       REWRITE_TAC[COMPLEX_MUL_RZERO] THEN
4817       MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
4818       MATCH_MP_TAC CAUCHY_THEOREM_CONVEX_SIMPLE THEN
4819       EXISTS_TAC `ball(Cx(&0),B + &1)` THEN
4820       ASM_SIMP_TAC[CONVEX_BALL; VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
4821       CONJ_TAC THENL
4822        [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
4823         SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
4824                  COMPLEX_SUB_0] THEN
4825         ASM_MESON_TAC[];
4826         REWRITE_TAC[path_image; SUBSET; FORALL_IN_IMAGE; IN_BALL]]] THEN
4827       X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
4828       REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
4829       MATCH_MP_TAC(NORM_ARITH
4830        `!g:real^1->complex. norm(p t - g t) < &1 /\ norm(g t) <= B
4831                             ==> norm(p t) < B + &1`) THEN
4832       EXISTS_TAC `g:real^1->complex` THEN
4833       UNDISCH_TAC `path_image g SUBSET ball (Cx(&0),B)` THEN
4834       ASM_SIMP_TAC[SUBSET; IN_BALL; path_image; FORALL_IN_IMAGE] THEN
4835       ASM_SIMP_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG; REAL_LT_IMP_LE]]);;
4836
4837 let WINDING_NUMBER_ZERO_OUTSIDE = prove
4838  (`!g s z. path g /\ convex s /\ pathfinish g = pathstart g /\
4839            ~(z IN s) /\ path_image g SUBSET s
4840            ==> winding_number(g,z) = Cx(&0)`,
4841   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_ZERO_IN_OUTSIDE THEN
4842   ASM_REWRITE_TAC[] THEN
4843   MP_TAC(ISPECL [`path_image(g:real^1->complex)`; `s:complex->bool`]
4844         OUTSIDE_SUBSET_CONVEX) THEN
4845   ASM SET_TAC[]);;
4846
4847 let WINDING_NUMBER_ZERO_ATINFINITY = prove
4848  (`!g. path g /\ pathfinish g = pathstart g
4849        ==> ?B. !z. B <= norm(z) ==> winding_number(g,z) = Cx(&0)`,
4850   REPEAT STRIP_TAC THEN
4851   SUBGOAL_THEN `bounded (path_image g :complex->bool)` MP_TAC THENL
4852    [ASM_SIMP_TAC[BOUNDED_PATH_IMAGE]; ALL_TAC] THEN
4853   REWRITE_TAC[bounded] THEN DISCH_THEN(X_CHOOSE_TAC `B:real`) THEN
4854   EXISTS_TAC `B + &1` THEN REPEAT STRIP_TAC THEN
4855   MATCH_MP_TAC WINDING_NUMBER_ZERO_OUTSIDE THEN
4856   EXISTS_TAC `cball(Cx(&0),B)` THEN ASM_REWRITE_TAC[CONVEX_CBALL] THEN
4857   REWRITE_TAC[SUBSET; IN_CBALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
4858   ASM_MESON_TAC[REAL_ARITH `~(B + &1 <= z /\ z <= B)`]);;
4859
4860 let WINDING_NUMBER_ZERO_POINT = prove
4861  (`!g s. path g /\ pathfinish g = pathstart g /\
4862          open s /\ path_image g SUBSET s
4863          ==> ?z. z IN s /\ winding_number(g,z) = Cx(&0)`,
4864   REPEAT STRIP_TAC THEN
4865   MP_TAC(ISPECL [`path_image g:complex->bool`; `s:complex->bool`]
4866         OUTSIDE_COMPACT_IN_OPEN) THEN
4867   ASM_SIMP_TAC[COMPACT_PATH_IMAGE] THEN ANTS_TAC THENL
4868    [ASM_MESON_TAC[SUBSET_EMPTY; PATH_IMAGE_NONEMPTY]; ALL_TAC] THEN
4869   REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN MATCH_MP_TAC MONO_EXISTS THEN
4870   GEN_TAC THEN REWRITE_TAC[IN_INTER] THEN
4871   ASM_SIMP_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE]);;
4872
4873 (* ------------------------------------------------------------------------- *)
4874 (* If a path winds round a set, it winds rounds its inside.                  *)
4875 (* ------------------------------------------------------------------------- *)
4876
4877 let WINDING_NUMBER_AROUND_INSIDE = prove
4878  (`!g s z.
4879         path g /\ pathfinish g = pathstart g /\
4880         closed s /\ connected s /\ s INTER path_image g = {} /\
4881         z IN s /\ ~(winding_number(g,z) = Cx(&0))
4882         ==> !w. w IN s UNION inside(s)
4883                 ==> winding_number(g,w) = winding_number(g,z)`,
4884   MAP_EVERY X_GEN_TAC
4885    [`g:real^1->complex`; `s:complex->bool`; `z0:complex`] THEN STRIP_TAC THEN
4886   SUBGOAL_THEN `!z. z IN s ==> winding_number(g,z) = winding_number(g,z0)`
4887   ASSUME_TAC THENL [ASM_MESON_TAC[WINDING_NUMBER_EQ]; ALL_TAC] THEN
4888   ABBREV_TAC `k = winding_number (g,z0)` THEN
4889   SUBGOAL_THEN `(s:complex->bool) SUBSET inside(path_image g)` ASSUME_TAC THENL
4890    [REWRITE_TAC[SUBSET; INSIDE_OUTSIDE; IN_DIFF; IN_UNIV; IN_UNION] THEN
4891     X_GEN_TAC `z:complex` THEN REPEAT STRIP_TAC THENL
4892      [ASM SET_TAC[]; ASM_MESON_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE]];
4893     ALL_TAC] THEN
4894   X_GEN_TAC `z:complex` THEN REWRITE_TAC[IN_UNION] THEN
4895   STRIP_TAC THEN ASM_SIMP_TAC[] THEN
4896   MP_TAC(ISPECL [`s:complex->bool`;
4897                  `path_image g:complex->bool`]
4898         INSIDE_INSIDE_COMPACT_CONNECTED) THEN
4899   ASM_SIMP_TAC[COMPACT_PATH_IMAGE; CONNECTED_PATH_IMAGE] THEN STRIP_TAC THEN
4900   EXPAND_TAC "k" THEN MATCH_MP_TAC WINDING_NUMBER_EQ THEN
4901   EXISTS_TAC `s UNION inside s :complex->bool` THEN
4902   ASM_SIMP_TAC[CONNECTED_WITH_INSIDE; IN_UNION] THEN
4903   MP_TAC(ISPEC `path_image g :complex->bool` INSIDE_NO_OVERLAP) THEN
4904   ASM SET_TAC[]);;
4905
4906 (* ------------------------------------------------------------------------- *)
4907 (* Bounding a WN by 1/2 for a path and point in opposite halfspaces.         *)
4908 (* ------------------------------------------------------------------------- *)
4909
4910 let WINDING_NUMBER_SUBPATH_CONTINUOUS = prove
4911  (`!g z. valid_path g /\ ~(z IN path_image g)
4912          ==> (\a. winding_number(subpath (vec 0) a g,z)) continuous_on
4913              interval[vec 0,vec 1]`,
4914   REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_EQ THEN EXISTS_TAC
4915     `\a. Cx(&1) / (Cx(&2) * Cx pi * ii) *
4916          integral (interval[vec 0,a])
4917                   (\t. Cx(&1) / (g t - z) * vector_derivative g (at t))` THEN
4918   CONJ_TAC THENL
4919    [X_GEN_TAC `a:real^1` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
4920     MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
4921      `Cx(&1) / (Cx(&2) * Cx pi * ii) *
4922       path_integral (subpath (vec 0) a g) (\w. Cx(&1) / (w - z))` THEN
4923     CONJ_TAC THENL
4924      [AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN
4925       MATCH_MP_TAC PATH_INTEGRAL_SUBPATH_INTEGRAL THEN
4926       ASM_SIMP_TAC[ENDS_IN_UNIT_INTERVAL; PATH_INTEGRABLE_INVERSEDIFF] THEN
4927       ASM_MESON_TAC[IN_INTERVAL_1];
4928       REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN CONV_TAC SYM_CONV THEN
4929       MATCH_MP_TAC WINDING_NUMBER_VALID_PATH THEN
4930       ASM_MESON_TAC[VALID_PATH_SUBPATH; SUBSET; VALID_PATH_IMP_PATH;
4931                  ENDS_IN_UNIT_INTERVAL; PATH_IMAGE_SUBPATH_SUBSET]];
4932     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_LMUL THEN
4933     MATCH_MP_TAC INDEFINITE_INTEGRAL_CONTINUOUS_RIGHT THEN
4934     REWRITE_TAC[GSYM PATH_INTEGRABLE_ON] THEN
4935     ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF]]);;
4936
4937 let WINDING_NUMBER_IVT_POS = prove
4938  (`!g z w.
4939         valid_path g /\ ~(z IN path_image g) /\
4940         &0 <= w /\ w <= Re(winding_number(g,z))
4941         ==> ?t. t IN interval[vec 0,vec 1] /\
4942                 Re(winding_number(subpath (vec 0) t g,z)) = w`,
4943   REPEAT STRIP_TAC THEN REWRITE_TAC[RE_DEF] THEN
4944   MATCH_MP_TAC IVT_INCREASING_COMPONENT_ON_1 THEN
4945   ASM_SIMP_TAC[WINDING_NUMBER_SUBPATH_CONTINUOUS] THEN
4946   ASM_REWRITE_TAC[SUBPATH_TRIVIAL; GSYM RE_DEF; DIMINDEX_2; ARITH] THEN
4947   REWRITE_TAC[DROP_VEC; REAL_POS; SUBPATH_REFL] THEN
4948   MP_TAC(ISPECL [`(g:real^1->complex) (vec 0)`; `z:complex`]
4949         WINDING_NUMBER_TRIVIAL) THEN
4950   ASM_MESON_TAC[pathstart; PATHSTART_IN_PATH_IMAGE; RE_CX]);;
4951
4952 let WINDING_NUMBER_IVT_NEG = prove
4953  (`!g z w.
4954         valid_path g /\ ~(z IN path_image g) /\
4955         Re(winding_number(g,z)) <= w /\ w <= &0
4956         ==> ?t. t IN interval[vec 0,vec 1] /\
4957                 Re(winding_number(subpath (vec 0) t g,z)) = w`,
4958   REPEAT STRIP_TAC THEN REWRITE_TAC[RE_DEF] THEN
4959   MATCH_MP_TAC IVT_DECREASING_COMPONENT_ON_1 THEN
4960   ASM_SIMP_TAC[WINDING_NUMBER_SUBPATH_CONTINUOUS] THEN
4961   ASM_REWRITE_TAC[SUBPATH_TRIVIAL; GSYM RE_DEF; DIMINDEX_2; ARITH] THEN
4962   REWRITE_TAC[DROP_VEC; REAL_POS; SUBPATH_REFL] THEN
4963   MP_TAC(ISPECL [`(g:real^1->complex) (vec 0)`; `z:complex`]
4964         WINDING_NUMBER_TRIVIAL) THEN
4965   ASM_MESON_TAC[pathstart; PATHSTART_IN_PATH_IMAGE; RE_CX]);;
4966
4967 let WINDING_NUMBER_IVT_ABS = prove
4968  (`!g z w.
4969         valid_path g /\ ~(z IN path_image g) /\
4970         &0 <= w /\ w <= abs(Re(winding_number(g,z)))
4971         ==> ?t. t IN interval[vec 0,vec 1] /\
4972                 abs(Re(winding_number(subpath (vec 0) t g,z))) = w`,
4973   REPEAT GEN_TAC THEN ASM_CASES_TAC `&0 <= Re(winding_number(g,z))` THEN
4974   ASM_REWRITE_TAC[real_abs] THEN REWRITE_TAC[GSYM real_abs] THEN
4975   REPEAT STRIP_TAC THENL
4976    [MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `w:real`]
4977         WINDING_NUMBER_IVT_POS);
4978     MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `--w:real`]
4979         WINDING_NUMBER_IVT_NEG)] THEN
4980   (ANTS_TAC THENL [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; ALL_TAC]) THEN
4981   MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[] THEN ASM_REAL_ARITH_TAC);;
4982
4983 let WINDING_NUMBER_LT_HALF = prove
4984  (`!g z a b.
4985         valid_path g /\ a dot z <= b /\ path_image g SUBSET {w | a dot w > b}
4986         ==> abs(Re(winding_number(g,z))) < &1 / &2`,
4987   let lemma = prove
4988    (`!g z a b.
4989           valid_path g /\ ~(z IN path_image g) /\
4990           a dot z <= b /\ path_image g SUBSET {w | a dot w > b}
4991           ==> Re(winding_number(g,z)) < &1 / &2`,
4992     REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LE] THEN STRIP_TAC THEN
4993     MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `&1 / &2`]
4994       WINDING_NUMBER_IVT_POS) THEN
4995     CONV_TAC REAL_RAT_REDUCE_CONV THEN ASM_REWRITE_TAC[NOT_EXISTS_THM] THEN
4996     X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
4997     MP_TAC(ISPECL [`subpath (vec 0) t (g:real^1->complex)`; `z:complex`]
4998           WINDING_NUMBER_AHLFORS_FULL) THEN
4999     ASM_SIMP_TAC[VALID_PATH_SUBPATH; VALID_PATH_IMP_PATH;
5000                  ENDS_IN_UNIT_INTERVAL; NOT_IMP] THEN
5001     CONJ_TAC THENL
5002      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
5003        `~(z IN t) ==> s SUBSET t ==> ~(z IN s)`)) THEN
5004       ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; ENDS_IN_UNIT_INTERVAL;
5005                    VALID_PATH_IMP_PATH];
5006       ASM_REWRITE_TAC[EULER; RE_MUL_CX; RE_MUL_II; IM_MUL_CX; IM_MUL_II] THEN
5007       REWRITE_TAC[REAL_ARITH `&2 * pi * &1 / &2 = pi`; SIN_PI; COS_PI] THEN
5008       REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_RID] THEN
5009       REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
5010       REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM CX_MUL] THEN
5011       REWRITE_TAC[REAL_MUL_RNEG; REAL_MUL_RID; GSYM COMPLEX_CMUL] THEN
5012       DISCH_TAC THEN
5013       SUBGOAL_THEN `&0 < a dot ((g:real^1->complex) t - z) /\
5014                     &0 < a dot (g(vec 0) - z)`
5015       MP_TAC THENL
5016        [REWRITE_TAC[DOT_RSUB; REAL_SUB_LT] THEN CONJ_TAC THEN
5017         MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `b:real` THEN
5018         ASM_REWRITE_TAC[GSYM real_gt] THEN
5019         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
5020          `g SUBSET {z | a dot z > b} ==> t IN g ==> a dot t > b`)) THEN
5021         REWRITE_TAC[path_image] THEN MATCH_MP_TAC FUN_IN_IMAGE THEN
5022         ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL];
5023         ASM_REWRITE_TAC[DOT_RMUL] THEN
5024         DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
5025         ASM_SIMP_TAC[REAL_LT_MUL_EQ] THEN
5026         MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(&0 < -- x)`) THEN
5027         REWRITE_TAC[REAL_EXP_POS_LT]]]) in
5028   REPEAT STRIP_TAC THEN
5029   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
5030   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
5031   ASM_REWRITE_TAC[IN_ELIM_THM; REAL_ARITH `a:real > b <=> ~(a <= b)`] THEN
5032   DISCH_TAC THEN MATCH_MP_TAC(REAL_ARITH `x < a /\ --x < a ==> abs x < a`) THEN
5033   CONJ_TAC THENL [ASM_MESON_TAC[lemma]; ALL_TAC] THEN
5034   MP_TAC(ISPECL [`reversepath g:real^1->complex`; `z:complex`;
5035                  `a:complex`; `b:real`] lemma) THEN
5036   ASM_SIMP_TAC[VALID_PATH_REVERSEPATH; PATH_IMAGE_REVERSEPATH;
5037                WINDING_NUMBER_REVERSEPATH; VALID_PATH_IMP_PATH; RE_NEG] THEN
5038   REAL_ARITH_TAC);;
5039
5040 let WINDING_NUMBER_LE_HALF = prove
5041  (`!g z a b.
5042         valid_path g /\ ~(z IN path_image g) /\
5043         ~(a = vec 0) /\ a dot z <= b /\ path_image g SUBSET {w | a dot w >= b}
5044         ==> abs(Re(winding_number(g,z))) <= &1 / &2`,
5045   REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN
5046   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
5047    CONTINUOUS_AT_WINDING_NUMBER) THEN
5048   ASM_SIMP_TAC[VALID_PATH_IMP_PATH; continuous_at] THEN
5049   DISCH_THEN(MP_TAC o SPEC `abs(Re(winding_number(g,z))) - &1 / &2`) THEN
5050   ASM_REWRITE_TAC[REAL_SUB_LT] THEN
5051   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
5052   FIRST_X_ASSUM(MP_TAC o SPEC `z - d / &2 / norm(a) % a:complex`) THEN
5053   REWRITE_TAC[NORM_ARITH `dist(z - d:complex,z) = norm d`] THEN
5054   ASM_SIMP_TAC[NORM_MUL; REAL_ABS_DIV; REAL_ABS_NORM; REAL_DIV_RMUL;
5055                NORM_EQ_0; NOT_IMP] THEN
5056   CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
5057   MATCH_MP_TAC(NORM_ARITH
5058     `abs(Re w' - Re w) <= norm(w' - w) /\ abs(Re w') < &1 / &2
5059      ==> ~(dist(w',w) < abs(Re w) - &1 / &2)`) THEN
5060   REWRITE_TAC[GSYM RE_SUB] THEN CONJ_TAC THENL
5061    [SIMP_TAC[COMPONENT_LE_NORM; RE_DEF; DIMINDEX_2; ARITH]; ALL_TAC] THEN
5062   MATCH_MP_TAC WINDING_NUMBER_LT_HALF THEN EXISTS_TAC `a:complex` THEN
5063   EXISTS_TAC `b - d / &3 * norm(a:complex)` THEN
5064   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
5065    [REWRITE_TAC[DOT_RSUB; DOT_RMUL; GSYM NORM_POW_2] THEN
5066     ASM_SIMP_TAC[NORM_EQ_0; REAL_FIELD
5067      `~(a = &0) ==> x / a * a pow 2 = x * a`] THEN
5068     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
5069      `a:real <= b ==> d <= e ==> a - e <= b - d`)) THEN
5070     MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
5071     ASM_REAL_ARITH_TAC;
5072     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5073         SUBSET_TRANS)) THEN
5074     REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN MATCH_MP_TAC(REAL_ARITH
5075      `&0 < e ==> !x. a dot x >= b ==> a dot x > b - e`) THEN
5076     MATCH_MP_TAC REAL_LT_MUL THEN ASM_SIMP_TAC[NORM_POS_LT] THEN
5077     ASM_REAL_ARITH_TAC]);;
5078
5079 let WINDING_NUMBER_LT_HALF_LINEPATH = prove
5080  (`!a b z.
5081         ~(z IN segment[a,b])
5082         ==> abs(Re(winding_number(linepath(a,b),z))) < &1 / &2`,
5083   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_LT_HALF THEN
5084   MP_TAC(ISPECL [`segment[a:complex,b]`; `z:complex`]
5085         SEPARATING_HYPERPLANE_CLOSED_POINT) THEN
5086   ASM_REWRITE_TAC[CONVEX_SEGMENT; CLOSED_SEGMENT] THEN
5087   REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN
5088   SIMP_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH; SUBSET; IN_ELIM_THM;
5089            REAL_LT_IMP_LE]);;
5090
5091 (* ------------------------------------------------------------------------- *)
5092 (* Positivity of WN for a linepath.                                          *)
5093 (* ------------------------------------------------------------------------- *)
5094
5095 let WINDING_NUMBER_LINEPATH_POS_LT = prove
5096  (`!a b z. &0 < Im((b - a) * cnj(b - z))
5097            ==> &0 < Re(winding_number(linepath(a,b),z))`,
5098   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_POS_LT THEN
5099   EXISTS_TAC `Im((b - a) * cnj(b - z))` THEN
5100   ASM_REWRITE_TAC[VALID_PATH_LINEPATH; VECTOR_DERIVATIVE_LINEPATH_AT] THEN
5101   CONJ_TAC THENL
5102    [POP_ASSUM MP_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
5103     SPEC_TAC(`z:complex`,`z:complex`) THEN
5104     REWRITE_TAC[path_image; FORALL_IN_IMAGE; linepath] THEN
5105     REWRITE_TAC[VECTOR_ARITH
5106      `b - ((&1 - x) % a + x % b) = (&1 - x) % (b - a)`] THEN
5107     REWRITE_TAC[COMPLEX_CMUL; CNJ_MUL; CNJ_CX] THEN
5108     REWRITE_TAC[COMPLEX_RING `a * Cx x * cnj a = Cx x * a * cnj a`] THEN
5109     SIMP_TAC[COMPLEX_MUL_CNJ; GSYM CX_POW; GSYM CX_MUL; IM_CX; REAL_LT_REFL];
5110     ALL_TAC] THEN
5111   SUBGOAL_THEN
5112     `segment[a,b] SUBSET
5113       {y | Im((b - a) * cnj(b - z)) <= Im((b - a) * cnj(y - z))}`
5114   MP_TAC THENL
5115    [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
5116     CONJ_TAC THENL
5117      [REWRITE_TAC[SET_RULE `{a,b} SUBSET {y | P y} <=> P a /\ P b`] THEN
5118       POP_ASSUM MP_TAC THEN
5119       REWRITE_TAC[cnj; complex_mul; RE; IM; RE_SUB; IM_SUB] THEN
5120       REAL_ARITH_TAC;
5121       ALL_TAC] THEN
5122     REWRITE_TAC[COMPLEX_SUB_LDISTRIB; IM_SUB; CNJ_SUB; REAL_LE_SUB_LADD] THEN
5123     REWRITE_TAC[CONVEX_ALT; cnj; complex_mul; RE; IM; RE_SUB; IM_SUB] THEN
5124     REWRITE_TAC[IN_ELIM_THM; IM_ADD; RE_ADD; IM_CMUL; RE_CMUL] THEN
5125     REWRITE_TAC[REAL_NEG_ADD; REAL_NEG_RMUL] THEN
5126     ONCE_REWRITE_TAC[REAL_ARITH
5127      `e <= ab * ((&1 - u) * x + u * y) + ab' * ((&1 - u) * x' + u * y') <=>
5128       (&1 - u) * e + u * e <=
5129         (&1 - u) * (ab * x + ab' * x') + u * (ab * y + ab' * y')`] THEN
5130     REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_ADD2 THEN
5131     CONJ_TAC THEN MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN
5132     ASM_REAL_ARITH_TAC;
5133     REWRITE_TAC[GSYM PATH_IMAGE_LINEPATH] THEN
5134     REWRITE_TAC[SUBSET; path_image; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
5135     ASM_MESON_TAC[SUBSET; INTERVAL_OPEN_SUBSET_CLOSED]]);;
5136
5137 (* ------------------------------------------------------------------------- *)
5138 (* Winding number for a triangle.                                            *)
5139 (* ------------------------------------------------------------------------- *)
5140
5141 let WINDING_NUMBER_TRIANGLE = prove
5142  (`!a b c z.
5143         z IN interior(convex hull {a,b,c})
5144         ==> winding_number(linepath(a,b) ++ linepath(b,c) ++ linepath(c,a),z) =
5145             if &0 < Im((b - a) * cnj (b - z)) then Cx(&1) else --Cx(&1)`,
5146   let lemma1 = prove
5147    (`!a b c. vec 0 IN interior(convex hull {a,b,c})
5148              ==> ~(Im(a / b) <= &0 /\ &0 <= Im(b / c))`,
5149     REPEAT GEN_TAC THEN
5150     ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN SIMP_TAC[] THEN
5151     GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)
5152      [GSYM COMPLEX_INV_DIV] THEN
5153     REWRITE_TAC[IM_COMPLEX_INV_GE_0] THEN
5154     GEOM_BASIS_MULTIPLE_TAC 1 `b:complex` THEN
5155     REWRITE_TAC[COMPLEX_CMUL; COMPLEX_BASIS; GSYM CX_MUL; REAL_MUL_RID] THEN
5156     X_GEN_TAC `x:real` THEN GEN_REWRITE_TAC LAND_CONV [REAL_LE_LT] THEN
5157     REWRITE_TAC[IM_DIV_CX] THEN ASM_CASES_TAC `x = &0` THEN
5158     ASM_REWRITE_TAC[NOT_IN_INTERIOR_CONVEX_HULL_3; COMPLEX_VEC_0] THEN
5159     DISCH_TAC THEN REPEAT GEN_TAC THEN
5160     ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_MUL_LZERO] THEN STRIP_TAC THEN
5161     MATCH_MP_TAC(SET_RULE
5162      `!s. ~(x IN s) /\ t SUBSET s ==> ~(x IN t)`) THEN
5163     EXISTS_TAC `interior {z | Im z <= &0}` THEN CONJ_TAC THENL
5164      [REWRITE_TAC[IM_DEF; INTERIOR_HALFSPACE_COMPONENT_LE] THEN
5165       REWRITE_TAC[GSYM COMPLEX_VEC_0; IN_ELIM_THM; VEC_COMPONENT] THEN
5166       REAL_ARITH_TAC;
5167       MATCH_MP_TAC SUBSET_INTERIOR THEN MATCH_MP_TAC HULL_MINIMAL THEN
5168       REWRITE_TAC[CONVEX_HALFSPACE_IM_LE] THEN
5169       ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_ELIM_THM] THEN
5170       REWRITE_TAC[IM_CX; REAL_LE_REFL]]) in
5171   let lemma2 = prove
5172    (`z IN interior(convex hull {a,b,c})
5173      ==>  &0 < Im((b - a) * cnj (b - z)) /\
5174           &0 < Im((c - b) * cnj (c - z)) /\
5175           &0 < Im((a - c) * cnj (a - z)) \/
5176           Im((b - a) * cnj (b - z)) < &0 /\
5177           &0 < Im((b - c) * cnj (b - z)) /\
5178           &0 < Im((a - b) * cnj (a - z)) /\
5179           &0 < Im((c - a) * cnj (c - z))`,
5180     GEOM_ORIGIN_TAC `z:complex` THEN
5181     REWRITE_TAC[VECTOR_SUB_RZERO; COMPLEX_SUB_RDISTRIB] THEN
5182     REWRITE_TAC[COMPLEX_MUL_CNJ; IM_SUB; GSYM CX_POW; IM_CX] THEN
5183     REWRITE_TAC[REAL_ARITH `&0 < &0 - x <=> x < &0`;
5184                 REAL_ARITH `&0 - x < &0 <=> &0 < x`] THEN
5185     REWRITE_TAC[GSYM IM_COMPLEX_DIV_GT_0; GSYM IM_COMPLEX_DIV_LT_0] THEN
5186     REPEAT STRIP_TAC THEN
5187     GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [GSYM COMPLEX_INV_DIV] THEN
5188     REWRITE_TAC[IM_COMPLEX_INV_LT_0; IM_COMPLEX_INV_GT_0] THEN
5189     GEN_REWRITE_TAC (RAND_CONV o LAND_CONV o LAND_CONV o RAND_CONV)
5190      [GSYM COMPLEX_INV_DIV] THEN
5191     REWRITE_TAC[IM_COMPLEX_INV_LT_0] THEN
5192     MP_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`] lemma1) THEN
5193     MP_TAC(ISPECL [`b:complex`; `c:complex`; `a:complex`] lemma1) THEN
5194     MP_TAC(ISPECL [`c:complex`; `a:complex`; `b:complex`] lemma1) THEN
5195     POP_ASSUM MP_TAC THEN SIMP_TAC[INSERT_AC] THEN REAL_ARITH_TAC) in
5196   let lemma3 = prove
5197    (`!a b c z.
5198           z IN interior(convex hull {a,b,c}) /\
5199           &0 < Im((b - a) * cnj (b - z)) /\
5200           &0 < Im((c - b) * cnj (c - z)) /\
5201           &0 < Im((a - c) * cnj (a - z))
5202           ==> winding_number
5203                (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a),z) = Cx(&1)`,
5204     REPEAT STRIP_TAC THEN
5205     MATCH_MP_TAC WINDING_NUMBER_EQ_1 THEN
5206     REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; CONJ_ASSOC;
5207                 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
5208     CONJ_TAC THENL
5209      [REWRITE_TAC[GSYM CONJ_ASSOC] THEN
5210       REPEAT(MATCH_MP_TAC WINDING_NUMBER_JOIN_POS_COMBINED THEN
5211              REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
5212                          PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
5213              CONJ_TAC) THEN
5214       ASM_SIMP_TAC[WINDING_NUMBER_LINEPATH_POS_LT; VALID_PATH_LINEPATH] THEN
5215       RULE_ASSUM_TAC(REWRITE_RULE
5216        [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
5217       ASM_REWRITE_TAC[PATH_IMAGE_LINEPATH];
5218       RULE_ASSUM_TAC(REWRITE_RULE
5219          [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
5220       ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_IMAGE_JOIN; PATH_JOIN; IN_UNION;
5221              PATH_LINEPATH; PATHSTART_JOIN; PATHFINISH_JOIN; RE_ADD;
5222              PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
5223       MATCH_MP_TAC(REAL_ARITH
5224        `abs a < &1 / &2 /\ abs b < &1 / &2 /\ abs c < &1 / &2
5225         ==> a + b + c < &2`) THEN
5226       REPEAT CONJ_TAC THEN MATCH_MP_TAC WINDING_NUMBER_LT_HALF_LINEPATH THEN
5227       ASM_REWRITE_TAC[]]) in
5228   REPEAT STRIP_TAC THEN
5229   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP lemma2) THEN
5230   ASM_SIMP_TAC[lemma3; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
5231   SUBGOAL_THEN
5232    `winding_number
5233       (linepath(c,b) ++ linepath(b,a) ++ linepath(a,c),z) = Cx(&1)`
5234   MP_TAC THENL
5235    [MATCH_MP_TAC lemma3 THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[INSERT_AC];
5236     COND_CASES_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC]] THEN
5237   DISCH_THEN(SUBST1_TAC o SYM) THEN CONV_TAC SYM_CONV THEN
5238   REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
5239   RULE_ASSUM_TAC(REWRITE_RULE
5240    [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
5241   FIRST_ASSUM(ASSUME_TAC o ONCE_REWRITE_RULE[SEGMENT_SYM] o CONJUNCT2) THEN
5242   ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_IMAGE_JOIN; PATH_JOIN; IN_UNION;
5243          PATH_LINEPATH; PATHSTART_JOIN; PATHFINISH_JOIN; RE_ADD;
5244          PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
5245   ASM_SIMP_TAC[COMPLEX_NEG_ADD; GSYM WINDING_NUMBER_REVERSEPATH;
5246               PATH_IMAGE_LINEPATH; PATH_LINEPATH; REVERSEPATH_LINEPATH] THEN
5247   CONV_TAC COMPLEX_RING);;
5248
5249 (* ------------------------------------------------------------------------- *)
5250 (* Cauchy's integral formula, again for a convex enclosing set.              *)
5251 (* ------------------------------------------------------------------------- *)
5252
5253 let CAUCHY_INTEGRAL_FORMULA_WEAK = prove
5254  (`!f s k g z.
5255         convex s /\ FINITE k /\ f continuous_on s /\
5256         (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x) /\
5257         z IN interior(s) DIFF k /\
5258         valid_path g /\ (path_image g) SUBSET (s DELETE z) /\
5259         pathfinish g = pathstart g
5260         ==> ((\w. f(w) / (w - z)) has_path_integral
5261              (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
5262   REWRITE_TAC[IN_DIFF] THEN REPEAT STRIP_TAC THEN
5263   FIRST_ASSUM(MP_TAC o SPEC `z:complex`) THEN ANTS_TAC THENL
5264    [ASM_REWRITE_TAC[]; ALL_TAC] THEN
5265   REWRITE_TAC[complex_differentiable; LEFT_IMP_EXISTS_THM] THEN
5266   X_GEN_TAC `f':complex` THEN DISCH_TAC THEN MP_TAC(SPECL
5267    [`\w:complex. if w = z then f' else (f w - f z) / (w - z)`;
5268     `s:complex->bool`;
5269     `(z:complex) INSERT k`;
5270     `g:real^1->complex`] CAUCHY_THEOREM_CONVEX) THEN
5271   REWRITE_TAC[IN_DIFF; IN_INSERT; DE_MORGAN_THM] THEN ANTS_TAC THENL
5272    [ASM_REWRITE_TAC[FINITE_INSERT] THEN REPEAT CONJ_TAC THENL
5273      [ALL_TAC;
5274       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
5275       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_AT THEN
5276       EXISTS_TAC `\w:complex. (f w - f z) / (w - z)` THEN
5277       EXISTS_TAC `dist(w:complex,z)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
5278       CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC] THEN
5279       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
5280       ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
5281       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
5282       ASM_SIMP_TAC[ETA_AX; COMPLEX_DIFFERENTIABLE_CONST;
5283                    COMPLEX_DIFFERENTIABLE_ID];
5284       ASM SET_TAC[]] THEN
5285     REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN
5286     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
5287     ASM_CASES_TAC `w:complex = z` THENL
5288      [ALL_TAC;
5289       MATCH_MP_TAC CONTINUOUS_TRANSFORM_WITHIN THEN
5290       EXISTS_TAC `\w:complex. (f w - f z) / (w - z)` THEN
5291       EXISTS_TAC `dist(w:complex,z)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
5292       CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC] THEN
5293       MATCH_MP_TAC CONTINUOUS_COMPLEX_DIV_WITHIN THEN
5294       RULE_ASSUM_TAC(REWRITE_RULE[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN]) THEN
5295       ASM_SIMP_TAC[CONTINUOUS_CONST; CONTINUOUS_SUB; CONTINUOUS_WITHIN_ID;
5296                    ETA_AX; COMPLEX_SUB_0]] THEN
5297     FIRST_X_ASSUM SUBST_ALL_TAC THEN REWRITE_TAC[CONTINUOUS_WITHIN] THEN
5298     MATCH_MP_TAC LIM_TRANSFORM_AWAY_WITHIN THEN
5299     EXISTS_TAC `\w:complex. (f w - f z) / (w - z)` THEN SIMP_TAC[] THEN
5300     EXISTS_TAC `z + Cx(&1)` THEN
5301     CONJ_TAC THENL [CONV_TAC COMPLEX_RING; ALL_TAC] THEN
5302     REWRITE_TAC[GSYM HAS_COMPLEX_DERIVATIVE_WITHIN] THEN
5303     ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
5304     ALL_TAC] THEN
5305   MP_TAC(SPECL [`g:real^1->complex`; `z:complex`]
5306     HAS_PATH_INTEGRAL_WINDING_NUMBER) THEN
5307   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5308   DISCH_THEN(MP_TAC o SPEC `(f:complex->complex) z` o MATCH_MP
5309     HAS_PATH_INTEGRAL_COMPLEX_LMUL) THEN REWRITE_TAC[IMP_IMP] THEN
5310   DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_ADD) THEN
5311   REWRITE_TAC[COMPLEX_RING
5312    `f * Cx(&2) * a * b * c + Cx(&0) = Cx(&2) * a * b * c * f`] THEN
5313   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_EQ) THEN
5314   X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
5315   SUBGOAL_THEN `~(w:complex = z)` MP_TAC THENL
5316    [ASM SET_TAC[]; ALL_TAC] THEN
5317   ASM_REWRITE_TAC[] THEN CONV_TAC COMPLEX_FIELD);;
5318
5319 let CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE = prove
5320  (`!f s g z.
5321         convex s /\ f holomorphic_on s /\
5322         z IN interior(s) /\
5323         valid_path g /\ (path_image g) SUBSET (s DELETE z) /\
5324         pathfinish g = pathstart g
5325         ==> ((\w. f(w) / (w - z)) has_path_integral
5326              (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
5327   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_INTEGRAL_FORMULA_WEAK THEN
5328   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
5329   ASM_REWRITE_TAC[DIFF_EMPTY; FINITE_RULES] THEN
5330   SIMP_TAC[OPEN_INTERIOR; complex_differentiable; GSYM HOLOMORPHIC_ON_OPEN] THEN
5331   ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
5332                 HOLOMORPHIC_ON_SUBSET; INTERIOR_SUBSET]);;
5333
5334 (* ------------------------------------------------------------------------- *)
5335 (* Homotopy forms of Cauchy's theorem. The first two proofs are almost the   *)
5336 (* same and could potentially be unified with a little more work.            *)
5337 (* ------------------------------------------------------------------------- *)
5338
5339 let CAUCHY_THEOREM_HOMOTOPIC_PATHS = prove
5340  (`!f g h s.
5341         open s /\ f holomorphic_on s /\
5342         valid_path g /\ valid_path h /\ homotopic_paths s g h
5343         ==> path_integral g f = path_integral h f`,
5344   REPEAT STRIP_TAC THEN
5345   FIRST_ASSUM(ASSUME_TAC o SYM o MATCH_MP HOMOTOPIC_PATHS_IMP_PATHSTART) THEN
5346   FIRST_ASSUM(ASSUME_TAC o SYM o MATCH_MP HOMOTOPIC_PATHS_IMP_PATHFINISH) THEN
5347   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homotopic_paths]) THEN
5348   REWRITE_TAC[homotopic_with; LEFT_IMP_EXISTS_THM; PCROSS] THEN
5349   X_GEN_TAC `k:real^(1,1)finite_sum->complex` THEN STRIP_TAC THEN
5350   SUBGOAL_THEN
5351    `!t. t IN interval[vec 0:real^1,vec 1]
5352         ==> ?e. &0 < e /\
5353               !t1 t2. t1 IN interval[vec 0:real^1,vec 1] /\
5354                       t2 IN interval[vec 0,vec 1] /\
5355                       norm(t1 - t) < e /\ norm(t2 - t) < e
5356                    ==> ?d. &0 < d /\
5357                         !g1 g2. valid_path g1 /\ valid_path g2 /\
5358                                 (!u. u IN interval[vec 0,vec 1]
5359                                      ==> norm(g1 u - k(pastecart t1 u)) < d /\
5360                                          norm(g2 u - k(pastecart t2 u)) < d) /\
5361                                 pathstart g1 = pathstart g /\
5362                                 pathfinish g1 = pathfinish g /\
5363                                 pathstart g2 = pathstart g /\
5364                                 pathfinish g2 = pathfinish g
5365                                 ==> path_image g1 SUBSET s /\
5366                                     path_image g2 SUBSET s /\
5367                                     path_integral g2 f = path_integral g1 f`
5368   MP_TAC THENL
5369    [X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
5370     MP_TAC(ISPECL
5371      [`s:complex->bool`; `\u. (k:real^(1,1)finite_sum->complex)(pastecart t u)`]
5372      PATH_INTEGRAL_NEARBY_ENDS) THEN
5373     REWRITE_TAC[] THEN ANTS_TAC THENL
5374      [ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[GSYM o_DEF] THEN
5375       REWRITE_TAC[path_image; path; IMAGE_o] THEN CONJ_TAC THENL
5376        [ALL_TAC; ASM SET_TAC[]] THEN
5377       MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5378       SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5379                CONTINUOUS_ON_CONST] THEN
5380       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5381         CONTINUOUS_ON_SUBSET)) THEN ASM SET_TAC[];
5382       DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC)] THEN
5383     FIRST_ASSUM(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5384           COMPACT_UNIFORMLY_CONTINUOUS)) THEN
5385     SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS; COMPACT_INTERVAL] THEN
5386     REWRITE_TAC[uniformly_continuous_on] THEN
5387     DISCH_THEN(MP_TAC o SPEC `e / &4`) THEN
5388     ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5389     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
5390     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5391     REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
5392     REWRITE_TAC[FORALL_IN_GSPEC] THEN
5393     REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP; GSYM CONJ_ASSOC] THEN
5394     DISCH_THEN(MP_TAC o MATCH_MP (MESON[]
5395      `(!t x t' x'. P t x t' x') ==> (!t t' u. P t u t' u)`)) THEN
5396     REWRITE_TAC[dist; NORM_PASTECART; PASTECART_SUB] THEN
5397     REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5398     CONV_TAC REAL_RAT_REDUCE_CONV THEN
5399     REWRITE_TAC[TAUT `a /\ b /\ c /\ b /\ d <=> a /\ c /\ b /\ d`] THEN
5400     SIMP_TAC[REAL_ADD_RID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
5401     ASM_REWRITE_TAC[] THEN
5402     MAP_EVERY X_GEN_TAC [`t1:real^1`; `t2:real^1`] THEN
5403     STRIP_TAC THEN EXISTS_TAC `e / &4` THEN
5404     ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5405     MAP_EVERY X_GEN_TAC [`g1:real^1->complex`; `g2:real^1->complex`] THEN
5406     STRIP_TAC THEN FIRST_X_ASSUM
5407      (MP_TAC o SPECL [`g1:real^1->complex`; `g2:real^1->complex`]) THEN
5408     ASM_REWRITE_TAC[] THEN ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
5409     X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN
5410     ASM_MESON_TAC[NORM_ARITH
5411      `norm(g1 - k1) < e / &4 /\ norm(g2 - k2) < e / &4 /\
5412       norm(k1 - kt) < e / &4 /\ norm(k2 - kt) < e / &4
5413       ==> norm(g1 - kt) < e /\ norm(g2 - kt) < e`];
5414     GEN_REWRITE_TAC (LAND_CONV o BINDER_CONV) [RIGHT_IMP_EXISTS_THM] THEN
5415     REWRITE_TAC[ SKOLEM_THM; LEFT_IMP_EXISTS_THM]] THEN
5416   X_GEN_TAC `ee:real^1->real` THEN DISCH_THEN(LABEL_TAC "*") THEN
5417   MP_TAC(ISPEC `interval[vec 0:real^1,vec 1]` COMPACT_IMP_HEINE_BOREL) THEN
5418   REWRITE_TAC[COMPACT_INTERVAL] THEN
5419   DISCH_THEN(MP_TAC o SPEC
5420    `IMAGE (\t:real^1. ball(t,ee t / &3)) (interval[vec 0,vec 1])`) THEN
5421   ANTS_TAC THENL
5422    [REWRITE_TAC[FORALL_IN_IMAGE; OPEN_BALL; SUBSET] THEN
5423     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
5424     REWRITE_TAC[UNIONS_IMAGE; IN_ELIM_THM] THEN EXISTS_TAC `t:real^1` THEN
5425     ASM_SIMP_TAC[CENTRE_IN_BALL; REAL_ARITH `&0 < e / &3 <=> &0 < e`];
5426     ALL_TAC] THEN
5427   ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN
5428   REWRITE_TAC[CONJ_ASSOC; FINITE_SUBSET_IMAGE] THEN
5429   REWRITE_TAC[LEFT_AND_EXISTS_THM; MESON[]
5430    `(?f s. (P s /\ f = g s) /\ Q f) <=> ?s. P s /\ Q(g s)`] THEN
5431   REWRITE_TAC[UNIONS_IMAGE; LEFT_IMP_EXISTS_THM] THEN
5432   X_GEN_TAC `k:real^1->bool` THEN
5433   DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
5434   GEN_REWRITE_TAC LAND_CONV [SUBSET] THEN REWRITE_TAC[IN_ELIM_THM] THEN
5435   ASM_CASES_TAC `k:real^1->bool = {}` THENL
5436    [ASM_REWRITE_TAC[NOT_IN_EMPTY; GSYM NOT_EXISTS_THM; MEMBER_NOT_EMPTY] THEN
5437     REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN REAL_ARITH_TAC;
5438     DISCH_THEN(LABEL_TAC "+")] THEN
5439   SUBGOAL_THEN `!i:real^1. i IN k ==> &0 < ee(i)`
5440   ASSUME_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
5441   ABBREV_TAC `e = inf(IMAGE (ee:real^1->real) k)` THEN
5442   MP_TAC(ISPEC `IMAGE (ee:real^1->real) k` INF_FINITE) THEN
5443   MP_TAC(ISPECL [`IMAGE (ee:real^1->real) k`; `&0`]
5444     REAL_LT_INF_FINITE) THEN
5445   ASM_SIMP_TAC[FINITE_IMAGE; IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
5446   DISCH_TAC THEN DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
5447   MP_TAC(ISPEC `e / &3` REAL_ARCH_INV) THEN
5448   ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &3 <=> &0 < e`] THEN
5449   DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
5450   SUBGOAL_THEN
5451    `!n. n <= N
5452         ==> ?d. &0 < d /\
5453                 !j. valid_path j /\
5454                     (!u. u IN interval [vec 0,vec 1]
5455                         ==> norm(j u - k(pastecart (lift(&n / &N)) u)) < d) /\
5456                     pathstart j = pathstart g /\
5457                     pathfinish j = pathfinish g
5458                     ==> path_image j SUBSET s /\
5459                         path_integral j f = path_integral g f`
5460   (MP_TAC o SPEC `N:num`) THENL
5461    [ALL_TAC;
5462     REWRITE_TAC[LE_REFL; LEFT_IMP_EXISTS_THM] THEN
5463     GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5464     DISCH_THEN(MP_TAC o SPEC `h:real^1->complex`) THEN
5465     ASM_SIMP_TAC[REAL_DIV_REFL; REAL_OF_NUM_EQ; LIFT_NUM] THEN
5466     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[]] THEN
5467   INDUCT_TAC THENL
5468    [REMOVE_THEN "*" (MP_TAC o SPEC `vec 0:real^1`) THEN
5469     ASM_REWRITE_TAC[real_div; REAL_MUL_LZERO; LE_0; LIFT_NUM] THEN
5470     REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL] THEN
5471     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5472     REPEAT(DISCH_THEN(MP_TAC o SPEC `vec 0:real^1`) THEN
5473            REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL]) THEN
5474     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5475     MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN STRIP_TAC THEN
5476     ASM_REWRITE_TAC[] THEN X_GEN_TAC `j:real^1->complex` THEN
5477     STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
5478      [`g:real^1->complex`; `j:real^1->complex`]) THEN
5479     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[];
5480     DISCH_TAC] THEN
5481   SUBGOAL_THEN `lift(&n / &N) IN interval[vec 0,vec 1] /\
5482                 lift(&(SUC n) / &N) IN interval[vec 0,vec 1]`
5483   STRIP_ASSUME_TAC THENL
5484    [REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; LIFT_DROP] THEN
5485     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
5486     REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_LID; REAL_OF_NUM_LE] THEN
5487     ASM_ARITH_TAC;
5488     ALL_TAC] THEN
5489   REMOVE_THEN "+" (MP_TAC o SPEC `lift(&n / &N)`) THEN ASM_REWRITE_TAC[] THEN
5490   DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC) THEN
5491   FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN
5492   ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
5493   DISCH_THEN(X_CHOOSE_THEN `d1:real`
5494     (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "1"))) THEN
5495   REMOVE_THEN "*" (MP_TAC o SPEC `t:real^1`) THEN
5496   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5497   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5498   DISCH_THEN(MP_TAC o SPECL [`lift(&n / &N)`; `lift(&(SUC n) / &N)`]) THEN
5499   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
5500    [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
5501     MATCH_MP_TAC(NORM_ARITH
5502      `!e. norm(n' - n:real^N) < e / &3 /\ e <= ee
5503      ==> dist(t,n) < ee / &3 ==> norm(n - t) < ee /\ norm(n' - t) < ee`) THEN
5504     EXISTS_TAC `e:real` THEN
5505     REWRITE_TAC[NORM_REAL; GSYM drop; DROP_SUB; LIFT_DROP] THEN
5506     REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB] THEN
5507     SIMP_TAC[REAL_OF_NUM_SUB; ARITH_RULE `n <= SUC n`] THEN
5508     REWRITE_TAC[ARITH_RULE `SUC n - n = 1`; REAL_MUL_LID] THEN
5509     REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN
5510     ASM_SIMP_TAC[GSYM real_div];
5511     ALL_TAC] THEN
5512   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d2:real` THEN
5513   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
5514   X_GEN_TAC `j:real^1->complex` THEN STRIP_TAC THEN
5515   MP_TAC(ISPECL
5516    [`\u:real^1. (k(pastecart (lift (&n / &N)) u):complex)`;
5517     `min d1 d2`] PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
5518   ASM_SIMP_TAC[REAL_LT_MIN; REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5519   ANTS_TAC THENL
5520    [REWRITE_TAC[path] THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
5521     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5522     SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5523              CONTINUOUS_ON_CONST] THEN
5524     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5525         CONTINUOUS_ON_SUBSET)) THEN
5526     ASM SET_TAC[];
5527     DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC)] THEN
5528   REMOVE_THEN "1" (MP_TAC o SPEC `p:real^1->complex`) THEN
5529   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN STRIP_TAC THEN
5530   FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `j:real^1->complex`]) THEN
5531   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION]);;
5532
5533 let CAUCHY_THEOREM_HOMOTOPIC_LOOPS = prove
5534  (`!f g h s.
5535         open s /\ f holomorphic_on s /\
5536         valid_path g /\ valid_path h /\ homotopic_loops s g h
5537         ==> path_integral g f = path_integral h f`,
5538   REPEAT STRIP_TAC THEN
5539   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_LOOP) THEN
5540   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homotopic_loops]) THEN
5541   REWRITE_TAC[homotopic_with; PCROSS; LEFT_IMP_EXISTS_THM] THEN
5542   X_GEN_TAC `k:real^(1,1)finite_sum->complex` THEN STRIP_TAC THEN
5543   SUBGOAL_THEN
5544    `!t. t IN interval[vec 0:real^1,vec 1]
5545         ==> ?e. &0 < e /\
5546               !t1 t2. t1 IN interval[vec 0:real^1,vec 1] /\
5547                       t2 IN interval[vec 0,vec 1] /\
5548                       norm(t1 - t) < e /\ norm(t2 - t) < e
5549                    ==> ?d. &0 < d /\
5550                         !g1 g2. valid_path g1 /\ valid_path g2 /\
5551                                 (!u. u IN interval[vec 0,vec 1]
5552                                      ==> norm(g1 u - k(pastecart t1 u)) < d /\
5553                                          norm(g2 u - k(pastecart t2 u)) < d) /\
5554                                 pathfinish g1 = pathstart g1 /\
5555                                 pathfinish g2 = pathstart g2
5556                                 ==> path_image g1 SUBSET s /\
5557                                     path_image g2 SUBSET s /\
5558                                     path_integral g2 f = path_integral g1 f`
5559   MP_TAC THENL
5560    [X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
5561     MP_TAC(ISPECL
5562      [`s:complex->bool`; `\u. (k:real^(1,1)finite_sum->complex)(pastecart t u)`]
5563      PATH_INTEGRAL_NEARBY_LOOP) THEN
5564     REWRITE_TAC[] THEN ANTS_TAC THENL
5565      [ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[GSYM o_DEF] THEN
5566       REWRITE_TAC[path_image; path; IMAGE_o] THEN CONJ_TAC THENL
5567        [ALL_TAC; ASM SET_TAC[]] THEN
5568       MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5569       SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5570                CONTINUOUS_ON_CONST] THEN
5571       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5572         CONTINUOUS_ON_SUBSET)) THEN ASM SET_TAC[];
5573       DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC)] THEN
5574     FIRST_ASSUM(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5575           COMPACT_UNIFORMLY_CONTINUOUS)) THEN
5576     SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS; COMPACT_INTERVAL] THEN
5577     REWRITE_TAC[uniformly_continuous_on] THEN
5578     DISCH_THEN(MP_TAC o SPEC `e / &4`) THEN
5579     ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5580     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
5581     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5582     REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
5583     REWRITE_TAC[FORALL_IN_GSPEC] THEN
5584     REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP; GSYM CONJ_ASSOC] THEN
5585     DISCH_THEN(MP_TAC o MATCH_MP (MESON[]
5586      `(!t x t' x'. P t x t' x') ==> (!t t' u. P t u t' u)`)) THEN
5587     REWRITE_TAC[dist; NORM_PASTECART; PASTECART_SUB] THEN
5588     REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5589     CONV_TAC REAL_RAT_REDUCE_CONV THEN
5590     REWRITE_TAC[TAUT `a /\ b /\ c /\ b /\ d <=> a /\ c /\ b /\ d`] THEN
5591     SIMP_TAC[REAL_ADD_RID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
5592     ASM_REWRITE_TAC[] THEN
5593     MAP_EVERY X_GEN_TAC [`t1:real^1`; `t2:real^1`] THEN
5594     STRIP_TAC THEN EXISTS_TAC `e / &4` THEN
5595     ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5596     MAP_EVERY X_GEN_TAC [`g1:real^1->complex`; `g2:real^1->complex`] THEN
5597     STRIP_TAC THEN FIRST_X_ASSUM
5598      (MP_TAC o SPECL [`g1:real^1->complex`; `g2:real^1->complex`]) THEN
5599     ASM_REWRITE_TAC[] THEN ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
5600     X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN
5601     ASM_MESON_TAC[NORM_ARITH
5602      `norm(g1 - k1) < e / &4 /\ norm(g2 - k2) < e / &4 /\
5603       norm(k1 - kt) < e / &4 /\ norm(k2 - kt) < e / &4
5604       ==> norm(g1 - kt) < e /\ norm(g2 - kt) < e`];
5605     GEN_REWRITE_TAC (LAND_CONV o BINDER_CONV) [RIGHT_IMP_EXISTS_THM] THEN
5606     REWRITE_TAC[ SKOLEM_THM; LEFT_IMP_EXISTS_THM]] THEN
5607   X_GEN_TAC `ee:real^1->real` THEN DISCH_THEN(LABEL_TAC "*") THEN
5608   MP_TAC(ISPEC `interval[vec 0:real^1,vec 1]` COMPACT_IMP_HEINE_BOREL) THEN
5609   REWRITE_TAC[COMPACT_INTERVAL] THEN
5610   DISCH_THEN(MP_TAC o SPEC
5611    `IMAGE (\t:real^1. ball(t,ee t / &3)) (interval[vec 0,vec 1])`) THEN
5612   ANTS_TAC THENL
5613    [REWRITE_TAC[FORALL_IN_IMAGE; OPEN_BALL; SUBSET] THEN
5614     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
5615     REWRITE_TAC[UNIONS_IMAGE; IN_ELIM_THM] THEN EXISTS_TAC `t:real^1` THEN
5616     ASM_SIMP_TAC[CENTRE_IN_BALL; REAL_ARITH `&0 < e / &3 <=> &0 < e`];
5617     ALL_TAC] THEN
5618   ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN
5619   REWRITE_TAC[CONJ_ASSOC; FINITE_SUBSET_IMAGE] THEN
5620   REWRITE_TAC[LEFT_AND_EXISTS_THM; MESON[]
5621    `(?f s. (P s /\ f = g s) /\ Q f) <=> ?s. P s /\ Q(g s)`] THEN
5622   REWRITE_TAC[UNIONS_IMAGE; LEFT_IMP_EXISTS_THM] THEN
5623   X_GEN_TAC `k:real^1->bool` THEN
5624   DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
5625   GEN_REWRITE_TAC LAND_CONV [SUBSET] THEN REWRITE_TAC[IN_ELIM_THM] THEN
5626   ASM_CASES_TAC `k:real^1->bool = {}` THENL
5627    [ASM_REWRITE_TAC[NOT_IN_EMPTY; GSYM NOT_EXISTS_THM; MEMBER_NOT_EMPTY] THEN
5628     REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN REAL_ARITH_TAC;
5629     DISCH_THEN(LABEL_TAC "+")] THEN
5630   SUBGOAL_THEN `!i:real^1. i IN k ==> &0 < ee(i)`
5631   ASSUME_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
5632   ABBREV_TAC `e = inf(IMAGE (ee:real^1->real) k)` THEN
5633   MP_TAC(ISPEC `IMAGE (ee:real^1->real) k` INF_FINITE) THEN
5634   MP_TAC(ISPECL [`IMAGE (ee:real^1->real) k`; `&0`]
5635     REAL_LT_INF_FINITE) THEN
5636   ASM_SIMP_TAC[FINITE_IMAGE; IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
5637   DISCH_TAC THEN DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
5638   MP_TAC(ISPEC `e / &3` REAL_ARCH_INV) THEN
5639   ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &3 <=> &0 < e`] THEN
5640   DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
5641   SUBGOAL_THEN
5642    `!n. n <= N
5643         ==> ?d. &0 < d /\
5644                 !j. valid_path j /\
5645                     (!u. u IN interval [vec 0,vec 1]
5646                         ==> norm(j u - k(pastecart (lift(&n / &N)) u)) < d) /\
5647                     pathfinish j = pathstart j
5648                     ==> path_image j SUBSET s /\
5649                         path_integral j f = path_integral g f`
5650   (MP_TAC o SPEC `N:num`) THENL
5651    [ALL_TAC;
5652     REWRITE_TAC[LE_REFL; LEFT_IMP_EXISTS_THM] THEN
5653     GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5654     DISCH_THEN(MP_TAC o SPEC `h:real^1->complex`) THEN
5655     ASM_SIMP_TAC[REAL_DIV_REFL; REAL_OF_NUM_EQ; LIFT_NUM] THEN
5656     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[]] THEN
5657   INDUCT_TAC THENL
5658    [REMOVE_THEN "*" (MP_TAC o SPEC `vec 0:real^1`) THEN
5659     ASM_REWRITE_TAC[real_div; REAL_MUL_LZERO; LE_0; LIFT_NUM] THEN
5660     REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL] THEN
5661     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5662     REPEAT(DISCH_THEN(MP_TAC o SPEC `vec 0:real^1`) THEN
5663            REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL]) THEN
5664     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5665     MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN STRIP_TAC THEN
5666     ASM_REWRITE_TAC[] THEN X_GEN_TAC `j:real^1->complex` THEN
5667     STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
5668      [`g:real^1->complex`; `j:real^1->complex`]) THEN
5669     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[];
5670     DISCH_TAC] THEN
5671   SUBGOAL_THEN `lift(&n / &N) IN interval[vec 0,vec 1] /\
5672                 lift(&(SUC n) / &N) IN interval[vec 0,vec 1]`
5673   STRIP_ASSUME_TAC THENL
5674    [REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; LIFT_DROP] THEN
5675     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
5676     REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_LID; REAL_OF_NUM_LE] THEN
5677     ASM_ARITH_TAC;
5678     ALL_TAC] THEN
5679   REMOVE_THEN "+" (MP_TAC o SPEC `lift(&n / &N)`) THEN ASM_REWRITE_TAC[] THEN
5680   DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC) THEN
5681   FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN
5682   ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
5683   DISCH_THEN(X_CHOOSE_THEN `d1:real`
5684     (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "1"))) THEN
5685   REMOVE_THEN "*" (MP_TAC o SPEC `t:real^1`) THEN
5686   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5687   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5688   DISCH_THEN(MP_TAC o SPECL [`lift(&n / &N)`; `lift(&(SUC n) / &N)`]) THEN
5689   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
5690    [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
5691     MATCH_MP_TAC(NORM_ARITH
5692      `!e. norm(n' - n:real^N) < e / &3 /\ e <= ee
5693      ==> dist(t,n) < ee / &3 ==> norm(n - t) < ee /\ norm(n' - t) < ee`) THEN
5694     EXISTS_TAC `e:real` THEN
5695     REWRITE_TAC[NORM_REAL; GSYM drop; DROP_SUB; LIFT_DROP] THEN
5696     REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB] THEN
5697     SIMP_TAC[REAL_OF_NUM_SUB; ARITH_RULE `n <= SUC n`] THEN
5698     REWRITE_TAC[ARITH_RULE `SUC n - n = 1`; REAL_MUL_LID] THEN
5699     REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN
5700     ASM_SIMP_TAC[GSYM real_div];
5701     ALL_TAC] THEN
5702   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d2:real` THEN
5703   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
5704   X_GEN_TAC `j:real^1->complex` THEN STRIP_TAC THEN
5705   MP_TAC(ISPECL
5706    [`\u:real^1. (k(pastecart (lift (&n / &N)) u):complex)`;
5707     `min d1 d2`] PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
5708   ASM_SIMP_TAC[REAL_LT_MIN; REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5709   ANTS_TAC THENL
5710    [REWRITE_TAC[path] THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
5711     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5712     SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5713              CONTINUOUS_ON_CONST] THEN
5714     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5715         CONTINUOUS_ON_SUBSET)) THEN
5716     ASM SET_TAC[];
5717     DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC)] THEN
5718   REMOVE_THEN "1" (MP_TAC o SPEC `p:real^1->complex`) THEN
5719   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN STRIP_TAC THEN
5720   FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `j:real^1->complex`]) THEN
5721   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION]);;
5722
5723 let CAUCHY_THEOREM_NULL_HOMOTOPIC = prove
5724  (`!f g s a.
5725         open s /\ f holomorphic_on s /\ a IN s /\ valid_path g /\
5726         homotopic_loops s g (linepath(a,a))
5727         ==> (f has_path_integral Cx(&0)) g`,
5728   REPEAT STRIP_TAC THEN
5729   FIRST_ASSUM(ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_SUBSET) THEN
5730   MATCH_MP_TAC
5731    (MESON[HAS_PATH_INTEGRAL_INTEGRAL; path_integrable_on; PATH_INTEGRAL_UNIQUE]
5732      `!p. f path_integrable_on g /\ (f has_path_integral y) p /\
5733           path_integral g f = path_integral p f
5734           ==> (f has_path_integral y) g`) THEN
5735   EXISTS_TAC `linepath(a:complex,a)` THEN REPEAT CONJ_TAC THENL
5736    [ASM_MESON_TAC[PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE];
5737     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
5738     DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[] THEN
5739     DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
5740     MATCH_MP_TAC CAUCHY_THEOREM_CONVEX_SIMPLE THEN
5741     EXISTS_TAC `ball(a:complex,e)` THEN
5742     ASM_REWRITE_TAC[VALID_PATH_LINEPATH; CONVEX_BALL; PATH_IMAGE_LINEPATH;
5743                     PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
5744     ASM_REWRITE_TAC[SEGMENT_REFL; SING_SUBSET; IN_BALL; CENTRE_IN_BALL] THEN
5745     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET];
5746     MATCH_MP_TAC CAUCHY_THEOREM_HOMOTOPIC_LOOPS THEN
5747     EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[VALID_PATH_LINEPATH]]);;
5748
5749 let CAUCHY_THEOREM_SIMPLY_CONNECTED = prove
5750  (`!f g s. open s /\ simply_connected s /\ f holomorphic_on s /\
5751            valid_path g /\ path_image g SUBSET s /\ pathfinish g = pathstart g
5752            ==> (f has_path_integral Cx(&0)) g`,
5753   REWRITE_TAC[SIMPLY_CONNECTED_EQ_CONTRACTIBLE_PATH] THEN REPEAT STRIP_TAC THEN
5754   MATCH_MP_TAC CAUCHY_THEOREM_NULL_HOMOTOPIC THEN
5755   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `pathstart g :complex`] THEN
5756   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
5757    [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; SUBSET];
5758     MATCH_MP_TAC HOMOTOPIC_PATHS_IMP_HOMOTOPIC_LOOPS THEN
5759     ASM_SIMP_TAC[PATHFINISH_LINEPATH; VALID_PATH_IMP_PATH]]);;
5760
5761 (* ------------------------------------------------------------------------- *)
5762 (* More winding number properties, including the fact that it's +-1 inside   *)
5763 (* a simple closed curve.                                                    *)
5764 (* ------------------------------------------------------------------------- *)
5765
5766 let WINDING_NUMBER_HOMOTOPIC_PATHS = prove
5767  (`!g h z. homotopic_paths ((:complex) DELETE z) g h
5768            ==> winding_number(g,z) = winding_number(h,z)`,
5769   REPEAT STRIP_TAC THEN
5770   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_PATH) THEN
5771   FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_SUBSET) THEN
5772   REWRITE_TAC[SET_RULE `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5773   STRIP_TAC THEN
5774   MP_TAC(ISPECL [`g:real^1->complex`; `(:complex) DELETE z`]
5775      HOMOTOPIC_NEARBY_PATHS) THEN
5776   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5777    `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5778   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
5779   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `d:real`]
5780     WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5781   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
5782   MP_TAC(ISPECL [`h:real^1->complex`; `(:complex) DELETE z`]
5783      HOMOTOPIC_NEARBY_PATHS) THEN
5784   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5785    `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5786   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
5787   MP_TAC(ISPECL [`h:real^1->complex`; `z:complex`; `e:real`]
5788     WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5789   DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
5790   SUBGOAL_THEN
5791    `path_integral p (\w. Cx(&1) / (w - z)) =
5792     path_integral q (\w. Cx(&1) / (w - z))`
5793   MP_TAC THENL
5794    [MATCH_MP_TAC CAUCHY_THEOREM_HOMOTOPIC_PATHS THEN
5795     EXISTS_TAC `(:complex) DELETE z` THEN
5796     ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN CONJ_TAC THENL
5797      [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
5798       SIMP_TAC[HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID;
5799                HOLOMORPHIC_ON_SUB; IN_DELETE; COMPLEX_SUB_0];
5800       ALL_TAC] THEN
5801     MATCH_MP_TAC HOMOTOPIC_PATHS_TRANS THEN
5802     EXISTS_TAC `g:real^1->complex` THEN CONJ_TAC THENL
5803      [ONCE_REWRITE_TAC[HOMOTOPIC_PATHS_SYM] THEN
5804       FIRST_X_ASSUM MATCH_MP_TAC THEN
5805       ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH];
5806       MATCH_MP_TAC HOMOTOPIC_PATHS_TRANS THEN
5807       EXISTS_TAC `h:real^1->complex` THEN ASM_REWRITE_TAC[] THEN
5808       FIRST_X_ASSUM MATCH_MP_TAC THEN
5809       ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH]];
5810     ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_RING]);;
5811
5812 let WINDING_NUMBER_HOMOTOPIC_LOOPS = prove
5813  (`!g h z. homotopic_loops ((:complex) DELETE z) g h
5814            ==> winding_number(g,z) = winding_number(h,z)`,
5815   REPEAT STRIP_TAC THEN
5816   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_PATH) THEN
5817   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_LOOP) THEN
5818   FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_SUBSET) THEN
5819   REWRITE_TAC[SET_RULE `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5820   STRIP_TAC THEN
5821   MP_TAC(ISPECL [`g:real^1->complex`; `(:complex) DELETE z`]
5822      HOMOTOPIC_NEARBY_LOOPS) THEN
5823   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5824    `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5825   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
5826   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `d:real`]
5827     WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5828   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
5829   MP_TAC(ISPECL [`h:real^1->complex`; `(:complex) DELETE z`]
5830      HOMOTOPIC_NEARBY_LOOPS) THEN
5831   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5832    `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5833   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
5834   MP_TAC(ISPECL [`h:real^1->complex`; `z:complex`; `e:real`]
5835     WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5836   DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
5837   SUBGOAL_THEN
5838    `path_integral p (\w. Cx(&1) / (w - z)) =
5839     path_integral q (\w. Cx(&1) / (w - z))`
5840   MP_TAC THENL
5841    [MATCH_MP_TAC CAUCHY_THEOREM_HOMOTOPIC_LOOPS THEN
5842     EXISTS_TAC `(:complex) DELETE z` THEN
5843     ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN CONJ_TAC THENL
5844      [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
5845       SIMP_TAC[HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID;
5846                HOLOMORPHIC_ON_SUB; IN_DELETE; COMPLEX_SUB_0];
5847       ALL_TAC] THEN
5848     MATCH_MP_TAC HOMOTOPIC_LOOPS_TRANS THEN
5849     EXISTS_TAC `g:real^1->complex` THEN CONJ_TAC THENL
5850      [ONCE_REWRITE_TAC[HOMOTOPIC_LOOPS_SYM] THEN
5851       FIRST_X_ASSUM MATCH_MP_TAC THEN
5852       ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH];
5853       MATCH_MP_TAC HOMOTOPIC_LOOPS_TRANS THEN
5854       EXISTS_TAC `h:real^1->complex` THEN ASM_REWRITE_TAC[] THEN
5855       FIRST_X_ASSUM MATCH_MP_TAC THEN
5856       ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH]];
5857     ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_RING]);;
5858
5859 let WINDING_NUMBER_PATHS_LINEAR_EQ = prove
5860  (`!g h z.
5861         path g /\ path h /\
5862         pathstart h = pathstart g /\
5863         pathfinish h = pathfinish g /\
5864         (!t. t IN interval[vec 0,vec 1] ==> ~(z IN segment[g t,h t]))
5865         ==> winding_number(h,z) = winding_number(g,z)`,
5866   REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5867   MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
5868   MATCH_MP_TAC HOMOTOPIC_PATHS_LINEAR THEN ASM SET_TAC[]);;
5869
5870 let WINDING_NUMBER_LOOPS_LINEAR_EQ = prove
5871  (`!g h z.
5872         path g /\ path h /\
5873         pathfinish g = pathstart g /\
5874         pathfinish h = pathstart h /\
5875         (!t. t IN interval[vec 0,vec 1] ==> ~(z IN segment[g t,h t]))
5876         ==> winding_number(h,z) = winding_number(g,z)`,
5877   REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5878   MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_LOOPS THEN
5879   MATCH_MP_TAC HOMOTOPIC_LOOPS_LINEAR THEN ASM SET_TAC[]);;
5880
5881 let WINDING_NUMBER_NEARBY_PATHS_EQ = prove
5882  (`!g h z.
5883         path g /\ path h /\
5884         pathstart h = pathstart g /\
5885         pathfinish h = pathfinish g /\
5886         (!t. t IN interval[vec 0,vec 1] ==> norm(h t - g t) < norm(g t - z))
5887         ==> winding_number(h,z) = winding_number(g,z)`,
5888   REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5889   MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
5890   MATCH_MP_TAC HOMOTOPIC_PATHS_NEARBY_EXPLICIT THEN ASM SET_TAC[]);;
5891
5892 let WINDING_NUMBER_NEARBY_LOOPS_EQ = prove
5893  (`!g h z.
5894         path g /\ path h /\
5895         pathfinish g = pathstart g /\
5896         pathfinish h = pathstart h /\
5897         (!t. t IN interval[vec 0,vec 1] ==> norm(h t - g t) < norm(g t - z))
5898         ==> winding_number(h,z) = winding_number(g,z)`,
5899   REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5900   MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_LOOPS THEN
5901   MATCH_MP_TAC HOMOTOPIC_LOOPS_NEARBY_EXPLICIT THEN ASM SET_TAC[]);;
5902
5903 let WINDING_NUMBER_SUBPATH_COMBINE = prove
5904  (`!g u v w z.
5905         path g /\ ~(z IN path_image g) /\
5906         u IN interval [vec 0,vec 1] /\
5907         v IN interval [vec 0,vec 1] /\
5908         w IN interval [vec 0,vec 1]
5909         ==> winding_number(subpath u v g,z) +
5910             winding_number(subpath v w g,z) =
5911             winding_number(subpath u w g,z)`,
5912   REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
5913   EXISTS_TAC `winding_number(subpath u v g ++ subpath v w g,z)` THEN
5914   CONJ_TAC THENL
5915    [CONV_TAC SYM_CONV THEN MATCH_MP_TAC WINDING_NUMBER_JOIN THEN
5916     ASM_SIMP_TAC[PATH_SUBPATH; PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
5917     ASM_MESON_TAC[SUBSET; PATH_IMAGE_SUBPATH_SUBSET];
5918     MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
5919     MATCH_MP_TAC HOMOTOPIC_JOIN_SUBPATHS THEN
5920     ASM_REWRITE_TAC[] THEN ASM SET_TAC[]]);;
5921
5922 let WINDING_NUMBER_STRONG = prove
5923  (`!g z e.
5924         path g /\ ~(z IN path_image g) /\ &0 < e
5925          ==> ?p. vector_polynomial_function p /\ valid_path p /\
5926                  ~(z IN path_image p) /\
5927                  pathstart p = pathstart g /\
5928                  pathfinish p = pathfinish g /\
5929                  (!t. t IN interval[vec 0,vec 1] ==> norm(g t - p t) < e) /\
5930                  path_integral p (\w. Cx(&1) / (w - z)) =
5931                  Cx(&2) * Cx(pi) * ii * winding_number(g,z)`,
5932   REPEAT STRIP_TAC THEN
5933   SUBGOAL_THEN
5934    `?d. &0 < d /\
5935        !t. t IN interval[vec 0,vec 1] ==> d <= norm((g:real^1->complex) t - z)`
5936   STRIP_ASSUME_TAC THENL
5937    [EXISTS_TAC `setdist({z:complex},path_image g)` THEN
5938     REWRITE_TAC[SETDIST_POS_LE; REAL_ARITH
5939      `&0 < x <=> &0 <= x /\ ~(x = &0)`] THEN
5940      ASM_SIMP_TAC[SETDIST_EQ_0_CLOSED_COMPACT; CLOSED_SING; COMPACT_PATH_IMAGE;
5941                   PATH_IMAGE_NONEMPTY] THEN
5942      CONJ_TAC THENL [ASM SET_TAC[]; REPEAT STRIP_TAC] THEN
5943      REWRITE_TAC[ONCE_REWRITE_RULE[DIST_SYM] (GSYM dist)] THEN
5944      MATCH_MP_TAC SETDIST_LE_DIST THEN REWRITE_TAC[path_image] THEN
5945      ASM SET_TAC[];
5946      MP_TAC(ISPECL [`g:real^1->complex`; `min d e`]
5947       PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
5948      ASM_REWRITE_TAC[REAL_LT_MIN] THEN MATCH_MP_TAC MONO_EXISTS THEN
5949      X_GEN_TAC `p:real^1->complex` THEN STRIP_TAC THEN
5950      ONCE_REWRITE_TAC[NORM_SUB] THEN
5951      ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
5952      MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
5953       [REWRITE_TAC[path_image; IN_IMAGE] THEN
5954        ASM_MESON_TAC[NORM_SUB; REAL_NOT_LT];
5955        DISCH_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
5956         `!w'. ~(a * b * c = Cx(&0)) /\ w' = w /\ w' = Cx(&1) / (a * b * c) * i
5957               ==> i = a * b * c * w`) THEN
5958        EXISTS_TAC `winding_number(p,z)` THEN
5959        REWRITE_TAC[CX_2PII_NZ] THEN CONJ_TAC THENL
5960         [MATCH_MP_TAC WINDING_NUMBER_NEARBY_PATHS_EQ; ALL_TAC] THEN
5961        ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; VALID_PATH_IMP_PATH;
5962                     VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
5963        ASM_MESON_TAC[REAL_LTE_TRANS; NORM_SUB]]]);;
5964
5965 let WINDING_NUMBER_FROM_INNERPATH = prove
5966  (`!c1 c2 c a b z:complex d.
5967         ~(a = b) /\
5968         simple_path c1 /\ pathstart c1 = a /\ pathfinish c1 = b /\
5969         simple_path c2 /\ pathstart c2 = a /\ pathfinish c2 = b /\
5970         simple_path c /\ pathstart c = a /\ pathfinish c = b /\
5971         path_image c1 INTER path_image c2 = {a,b} /\
5972         path_image c1 INTER path_image c = {a,b} /\
5973         path_image c2 INTER path_image c = {a,b} /\
5974         ~(path_image c INTER inside(path_image c1 UNION path_image c2) = {}) /\
5975         z IN inside(path_image c1 UNION path_image c) /\
5976         winding_number(c1 ++ reversepath c,z) = d /\ ~(d = Cx(&0))
5977         ==> z IN inside(path_image c1 UNION path_image c2) /\
5978             winding_number(c1 ++ reversepath c2,z) = d`,
5979   REPEAT GEN_TAC THEN STRIP_TAC THEN
5980   MP_TAC(ISPECL [`c1:real^1->complex`; `c2:real^1->complex`;
5981                  `c:real^1->complex`; `a:complex`; `b:complex`]
5982          SPLIT_INSIDE_SIMPLE_CLOSED_CURVE) THEN
5983   ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
5984   CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5985   UNDISCH_TAC `winding_number(c1 ++ reversepath c,z) = d` THEN
5986   MP_TAC(ISPECL
5987    [`c ++ reversepath(c2:real^1->complex)`; `z:complex`]
5988    WINDING_NUMBER_ZERO_IN_OUTSIDE) THEN
5989   SUBGOAL_THEN
5990    `~((z:complex) IN path_image c) /\
5991     ~(z IN path_image c1) /\
5992     ~(z IN path_image c2)`
5993   STRIP_ASSUME_TAC THENL
5994    [MP_TAC(ISPEC `(path_image c1 UNION path_image c):complex->bool`
5995                  INSIDE_NO_OVERLAP) THEN
5996     MP_TAC(ISPEC `(path_image c1 UNION path_image c2):complex->bool`
5997                  INSIDE_NO_OVERLAP) THEN
5998     ASM SET_TAC[];
5999     ASM_SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_JOIN;
6000       PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH; PATH_IMAGE_REVERSEPATH;
6001       PATH_JOIN; PATH_REVERSEPATH; SIMPLE_PATH_IMP_PATH;
6002       WINDING_NUMBER_JOIN; WINDING_NUMBER_REVERSEPATH] THEN
6003     ANTS_TAC THENL
6004      [ASM_REWRITE_TAC[OUTSIDE_INSIDE; IN_DIFF; IN_UNION; IN_UNIV] THEN
6005       ONCE_REWRITE_TAC[UNION_COMM] THEN ASM SET_TAC[];
6006       CONV_TAC COMPLEX_RING]]);;
6007
6008 let SIMPLE_CLOSED_PATH_WINDING_NUMBER_INSIDE = prove
6009  (`!g. simple_path g
6010        ==> (!z. z IN inside(path_image g) ==> winding_number(g,z) = Cx(&1)) \/
6011            (!z. z IN inside(path_image g) ==> winding_number(g,z) = --Cx(&1))`,
6012   let lemma1 = prove
6013    (`!p a e.
6014           &0 < e /\
6015           simple_path(p ++ linepath(a - e % basis 1,a + e % basis 1)) /\
6016           pathstart p = a + e % basis 1 /\ pathfinish p = a - e % basis 1 /\
6017           ball(a,e) INTER path_image p = {}
6018           ==> ?z. z IN inside(path_image
6019                          (p ++ linepath(a - e % basis 1,a + e % basis 1))) /\
6020                   norm(winding_number
6021                    (p ++ linepath(a - e % basis 1,a + e % basis 1),z)) = &1`,
6022     REPEAT STRIP_TAC THEN
6023     MP_TAC(ISPECL
6024      [`p:real^1->complex`; `linepath(a - e % basis 1,a + e % basis 1)`]
6025      SIMPLE_PATH_JOIN_LOOP_EQ) THEN
6026     ASM_REWRITE_TAC[PATHFINISH_LINEPATH; PATHSTART_LINEPATH] THEN
6027     STRIP_TAC THEN
6028     SUBGOAL_THEN
6029       `(a:complex) IN frontier(inside
6030        (path_image(p ++ linepath(a - e % basis 1,a + e % basis 1))))`
6031     MP_TAC THENL
6032      [FIRST_ASSUM
6033        (MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] JORDAN_INSIDE_OUTSIDE)) THEN
6034       ASM_REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
6035                       PATHFINISH_LINEPATH] THEN
6036       STRIP_TAC THEN ASM_SIMP_TAC[PATH_IMAGE_JOIN; PATHSTART_LINEPATH] THEN
6037       REWRITE_TAC[IN_UNION; PATH_IMAGE_LINEPATH] THEN DISJ2_TAC THEN
6038       REWRITE_TAC[IN_SEGMENT] THEN EXISTS_TAC `&1 / &2` THEN
6039       CONV_TAC REAL_RAT_REDUCE_CONV THEN VECTOR_ARITH_TAC;
6040       ALL_TAC] THEN
6041     REWRITE_TAC[FRONTIER_STRADDLE] THEN
6042     DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
6043     DISCH_THEN(X_CHOOSE_THEN `c:complex` STRIP_ASSUME_TAC o CONJUNCT1) THEN
6044     MP_TAC(ISPEC
6045      `path_image (p ++ linepath(a - e % basis 1:complex,a + e % basis 1))`
6046      INSIDE_NO_OVERLAP) THEN
6047     REWRITE_TAC[EXTENSION] THEN DISCH_THEN(MP_TAC o SPEC `c:complex`) THEN
6048     ASM_REWRITE_TAC[IN_INTER; NOT_IN_EMPTY] THEN
6049     ASM_SIMP_TAC[PATH_IMAGE_JOIN; PATHSTART_LINEPATH; PATH_IMAGE_LINEPATH] THEN
6050     REWRITE_TAC[IN_UNION; DE_MORGAN_THM] THEN
6051     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6052     GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [SEGMENT_AS_BALL] THEN
6053     ASM_REWRITE_TAC[IN_INTER;
6054       VECTOR_ARITH `inv(&2) % ((a - e) + (a + e)):complex = a`;
6055       VECTOR_ARITH `(a + e) - (a - e):complex = &2 % e`] THEN
6056     ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6057     ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> (abs(&2) * abs e * &1) / &2 = e`] THEN
6058     ASM_SIMP_TAC[IN_CBALL; REAL_LT_IMP_LE] THEN STRIP_TAC THEN
6059     SUBGOAL_THEN
6060      `~collinear{a - e % basis 1,c:complex,a + e % basis 1}`
6061     ASSUME_TAC THENL
6062      [MP_TAC(ISPECL
6063        [`a - e % basis 1:complex`; `a + e % basis  1:complex`; `c:complex`]
6064        COLLINEAR_3_AFFINE_HULL) THEN
6065       ASM_SIMP_TAC[VECTOR_ARITH `a - x:complex = a + x <=> x = vec 0`;
6066                    BASIS_NONZERO; DIMINDEX_2; ARITH; VECTOR_MUL_EQ_0;
6067                    REAL_LT_IMP_NZ] THEN
6068       REWRITE_TAC[INSERT_AC];
6069       ALL_TAC] THEN
6070     SUBGOAL_THEN
6071     `~(interior(convex hull {a - e % basis 1,c:complex,a + e % basis 1}) = {})`
6072     MP_TAC THENL
6073      [ASM_SIMP_TAC[INTERIOR_CONVEX_HULL_3_MINIMAL] THEN
6074       REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN
6075       REPEAT(ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN EXISTS_TAC `&1 / &3`) THEN
6076       CONV_TAC REAL_RAT_REDUCE_CONV THEN MESON_TAC[];
6077       ALL_TAC] THEN
6078     REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN
6079     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
6080     FIRST_ASSUM(MP_TAC o AP_TERM `norm:complex->real` o
6081       MATCH_MP WINDING_NUMBER_TRIANGLE) THEN
6082     REWRITE_TAC[] THEN ONCE_REWRITE_TAC[COND_RAND] THEN
6083     REWRITE_TAC[NORM_NEG; COND_ID; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
6084     DISCH_TAC THEN
6085     MP_TAC(ISPECL
6086      [`linepath(a + e % basis 1:complex,a - e % basis 1)`;
6087       `p:real^1->complex`;
6088       `linepath(a + e % basis 1:complex,c) ++ linepath(c,a - e % basis 1)`;
6089       `a + e % basis 1:complex`; `a - e % basis 1:complex`;
6090       `z:complex`;
6091       `winding_number
6092         (linepath(a - e % basis 1,c) ++
6093          linepath(c,a + e % basis 1) ++
6094          linepath(a + e % basis 1,a - e % basis 1),
6095          z)`] WINDING_NUMBER_FROM_INNERPATH) THEN
6096     ASM_SIMP_TAC[SIMPLE_PATH_LINEPATH; PATHSTART_JOIN; PATHFINISH_JOIN;
6097              VECTOR_ARITH `a + x:complex = a - x <=> x = vec 0`;
6098              BASIS_NONZERO; DIMINDEX_2; ARITH; VECTOR_MUL_EQ_0;
6099              REAL_LT_IMP_NZ; PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
6100              ARC_IMP_SIMPLE_PATH; PATH_IMAGE_JOIN; PATH_IMAGE_LINEPATH] THEN
6101     ANTS_TAC THENL
6102      [ALL_TAC;
6103       MATCH_MP_TAC(TAUT
6104        `(p ==> p') /\ (p /\ q ==> q') ==> p /\ q ==> p' /\ q'`) THEN
6105       CONJ_TAC THENL [MESON_TAC[UNION_COMM; SEGMENT_SYM]; ALL_TAC] THEN
6106       DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (SUBST_ALL_TAC o SYM)) THEN
6107       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
6108        `norm(z:complex) = &1 ==> u = --z ==> norm u = &1`)) THEN
6109       GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV)
6110        [GSYM REVERSEPATH_LINEPATH] THEN
6111       ASM_SIMP_TAC[GSYM REVERSEPATH_JOINPATHS; PATHSTART_LINEPATH] THEN
6112       ONCE_REWRITE_TAC[COMPLEX_RING `a:complex = --b <=> b = --a`] THEN
6113       MATCH_MP_TAC WINDING_NUMBER_REVERSEPATH THEN
6114       ASM_SIMP_TAC[PATH_JOIN; PATHSTART_LINEPATH; PATH_IMAGE_JOIN;
6115                    PATH_LINEPATH; ARC_IMP_PATH; PATH_IMAGE_LINEPATH] THEN
6116       ONCE_REWRITE_TAC[SEGMENT_SYM] THEN ONCE_REWRITE_TAC[UNION_COMM] THEN
6117       ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]] THEN
6118     REPEAT CONJ_TAC THENL
6119      [MATCH_MP_TAC ARC_IMP_SIMPLE_PATH THEN MATCH_MP_TAC ARC_JOIN THEN
6120       REWRITE_TAC[ARC_LINEPATH_EQ; PATHSTART_LINEPATH;
6121                   PATHFINISH_LINEPATH] THEN
6122       REPEAT(CONJ_TAC THENL
6123        [DISCH_THEN SUBST_ALL_TAC THEN
6124         RULE_ASSUM_TAC(REWRITE_RULE[INSERT_AC; COLLINEAR_2]) THEN
6125         FIRST_X_ASSUM CONTR_TAC;
6126         ALL_TAC]) THEN
6127       REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
6128       MATCH_MP_TAC(SET_RULE `s = t ==> s SUBSET t`) THEN
6129       MATCH_MP_TAC INTER_SEGMENT THEN ASM_MESON_TAC[INSERT_AC];
6130       REWRITE_TAC[SEGMENT_CLOSED_OPEN] THEN
6131       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6132        `b INTER p = {}
6133         ==> s SUBSET b /\ k SUBSET p
6134             ==> (s UNION k) INTER p = k`)) THEN
6135       CONJ_TAC THENL
6136        [REWRITE_TAC[SUBSET; IN_SEGMENT; IN_BALL] THEN
6137         REWRITE_TAC[VECTOR_ARITH
6138          `(&1 - u) % (a + e) + u % (a - e):complex =
6139           a + (&1 - &2 * u) % e`] THEN
6140         REPEAT STRIP_TAC THEN
6141         ASM_REWRITE_TAC[NORM_ARITH `dist(a:complex,a + e) = norm e`] THEN
6142         SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6143         MATCH_MP_TAC(REAL_ARITH
6144          `x * e < &1 * e /\ &0 < e ==> x * abs e * &1 < e`) THEN
6145         ASM_SIMP_TAC[REAL_LT_RMUL_EQ] THEN ASM_REAL_ARITH_TAC;
6146         REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET] THEN
6147         ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE]];
6148       MATCH_MP_TAC(SET_RULE
6149        `s INTER t1 = {a} /\ s INTER t2 = {b}
6150         ==> s INTER (t1 UNION t2) = {a,b}`) THEN
6151       CONJ_TAC THENL
6152        [GEN_REWRITE_TAC (LAND_CONV o LAND_CONV) [SEGMENT_SYM];
6153         GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [SEGMENT_SYM]] THEN
6154       MATCH_MP_TAC INTER_SEGMENT THEN DISJ2_TAC THEN
6155       ASM_MESON_TAC[INSERT_AC];
6156       MATCH_MP_TAC(SET_RULE
6157        `s INTER t1 = {a} /\ s INTER t2 = {b}
6158         ==> s INTER (t1 UNION t2) = {a,b}`) THEN
6159       CONJ_TAC THENL [ONCE_REWRITE_TAC[SEGMENT_SYM]; ALL_TAC] THEN
6160       REWRITE_TAC[SEGMENT_CLOSED_OPEN] THEN
6161       MATCH_MP_TAC(SET_RULE
6162        `b IN p /\ ~(c IN p) /\ p INTER s = {}
6163         ==> p INTER (s UNION {c,b}) = {b}`) THEN
6164       (CONJ_TAC THENL
6165         [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE];
6166          ASM_REWRITE_TAC[]]) THEN
6167       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6168        `b INTER p = {} ==> s SUBSET b ==> p INTER s = {}`)) THEN
6169       REWRITE_TAC[GSYM INTERIOR_CBALL] THEN
6170       MATCH_MP_TAC IN_INTERIOR_CLOSURE_CONVEX_SEGMENT THEN
6171       ASM_REWRITE_TAC[CONVEX_CBALL; INTERIOR_CBALL; IN_BALL] THEN
6172       MATCH_MP_TAC(REWRITE_RULE[SUBSET] CLOSURE_SUBSET) THEN
6173       REWRITE_TAC[IN_CBALL;
6174                   NORM_ARITH `dist(a:complex,a - e) = norm e`;
6175                   NORM_ARITH `dist(a:complex,a + e) = norm e`] THEN
6176       ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6177       ASM_REAL_ARITH_TAC;
6178       REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `c:complex` THEN
6179       REWRITE_TAC[IN_INTER; ENDS_IN_SEGMENT; IN_UNION] THEN
6180       FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6181        `c IN s ==> s = t ==> c IN t`)) THEN
6182       ASM_SIMP_TAC[PATH_IMAGE_JOIN; PATHSTART_LINEPATH] THEN
6183       REWRITE_TAC[UNION_COMM; PATH_IMAGE_LINEPATH; SEGMENT_SYM];
6184       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [GSYM
6185         INSIDE_OF_TRIANGLE]) THEN
6186       REWRITE_TAC[UNION_ACI; SEGMENT_SYM];
6187       ASM_SIMP_TAC[REVERSEPATH_JOINPATHS; PATHSTART_JOIN; PATHFINISH_JOIN;
6188            PATHSTART_LINEPATH; PATHFINISH_LINEPATH; REVERSEPATH_LINEPATH] THEN
6189       RULE_ASSUM_TAC(REWRITE_RULE
6190         [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
6191       ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_JOIN; PATH_LINEPATH;
6192           PATH_IMAGE_JOIN; IN_UNION; PATHSTART_JOIN; PATHFINISH_JOIN;
6193           PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
6194       CONV_TAC COMPLEX_RING;
6195       DISCH_THEN SUBST_ALL_TAC THEN
6196       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE LAND_CONV [COMPLEX_NORM_CX]) THEN
6197       REAL_ARITH_TAC]) in
6198   let lemma2 = prove
6199    (`!p a d e.
6200           &0 < d /\ &0 < e /\
6201           simple_path(p ++ linepath(a - d % basis 1,a + e % basis 1)) /\
6202           pathstart p = a + e % basis 1 /\ pathfinish p = a - d % basis 1
6203           ==> ?z. z IN inside(path_image
6204                          (p ++ linepath(a - d % basis 1,a + e % basis 1))) /\
6205                   norm(winding_number
6206                    (p ++ linepath(a - d % basis 1,a + e % basis 1),z)) = &1`,
6207     REPEAT STRIP_TAC THEN
6208     MP_TAC(ISPECL
6209      [`p:real^1->complex`; `linepath(a - d % basis 1,a + e % basis 1)`]
6210      SIMPLE_PATH_JOIN_LOOP_EQ) THEN
6211     ASM_REWRITE_TAC[PATHFINISH_LINEPATH; PATHSTART_LINEPATH] THEN
6212     REWRITE_TAC[ARC_LINEPATH_EQ; PATH_IMAGE_LINEPATH] THEN STRIP_TAC THEN
6213     SUBGOAL_THEN `~((a:complex) IN path_image p)` ASSUME_TAC THENL
6214      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6215        `p INTER s SUBSET {d,e}
6216         ==> a IN s /\ ~(d = a) /\ ~(e = a) ==> ~(a IN p)`)) THEN
6217       REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6218       REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6219         NORM_ARITH `dist(a - d:complex,a) + dist(a,a + e) = norm(d) + norm(e)`;
6220         VECTOR_ARITH `a + e:complex = a <=> e = vec 0`;
6221         VECTOR_ARITH `a - d:complex = a <=> d = vec 0`] THEN
6222       SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; NORM_MUL; VECTOR_MUL_EQ_0] THEN
6223       ASM_SIMP_TAC[BASIS_NONZERO; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6224       ASM_REAL_ARITH_TAC;
6225       ALL_TAC] THEN
6226     MP_TAC(ISPEC `(:complex) DIFF path_image p` OPEN_CONTAINS_BALL) THEN
6227     ASM_SIMP_TAC[GSYM closed; CLOSED_ARC_IMAGE; IN_UNIV; IN_DIFF] THEN
6228     DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[] THEN
6229     REWRITE_TAC[SET_RULE `s SUBSET UNIV DIFF t <=> s INTER t = {}`] THEN
6230     DISCH_THEN(X_CHOOSE_THEN `k:real` STRIP_ASSUME_TAC) THEN
6231     ABBREV_TAC `kde:real = min k (min d e) / &2` THEN
6232     SUBGOAL_THEN `&0 < kde /\ kde < k /\ kde < d /\ kde < e`
6233     STRIP_ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
6234     MP_TAC(ISPECL
6235      [`linepath(a + kde % basis 1,a + e % basis 1) ++ p ++
6236        linepath(a - d % basis 1,a - kde % basis 1)`;
6237       `a:complex`; `kde:real`] lemma1) THEN
6238     ASM_SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_JOIN;
6239       PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH;
6240       SIMPLE_PATH_JOIN_LOOP_EQ] THEN
6241     ANTS_TAC THENL
6242      [REPEAT CONJ_TAC THENL
6243        [MATCH_MP_TAC ARC_JOIN THEN
6244         ASM_SIMP_TAC[ARC_JOIN_EQ; PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
6245                      PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_LINEPATH;
6246                      ARC_LINEPATH_EQ; PATH_IMAGE_JOIN] THEN
6247         REWRITE_TAC[VECTOR_ARITH `a + e:complex = a + d <=> e - d = vec 0`;
6248                   VECTOR_ARITH `a - d:complex = a - e <=> e - d = vec 0`] THEN
6249         REWRITE_TAC[GSYM VECTOR_SUB_RDISTRIB; VECTOR_MUL_EQ_0; REAL_SUB_0] THEN
6250         ASM_SIMP_TAC[BASIS_NONZERO; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6251         ASM_SIMP_TAC[REAL_LT_IMP_NE] THEN
6252         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6253          `p INTER de SUBSET {e,d}
6254           ==> dk SUBSET de /\ ke SUBSET de /\ ~(e IN dk) /\ ~(d IN ke) /\
6255               ke INTER dk = {}
6256           ==> p INTER dk SUBSET {d} /\ ke INTER (p UNION dk) SUBSET {e}`)) THEN
6257         REWRITE_TAC[SUBSET_SEGMENT; ENDS_IN_SEGMENT] THEN
6258         REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6259         REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e) /\
6260                                 dist(a + d,a - e) = norm(d + e) /\
6261                                 dist(a - d,a - e) = norm(d - e) /\
6262                                 dist(a + d,a + e) = norm(d - e)`] THEN
6263         REWRITE_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB] THEN
6264         ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6265         REPEAT(CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC]) THEN
6266         REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_INTER; NOT_IN_EMPTY] THEN
6267         MATCH_MP_TAC(MESON[REAL_LT_ANTISYM]
6268          `!a:complex. (!x. x IN t ==> x$1 < a$1) /\ (!x. x IN s ==> a$1 < x$1)
6269                       ==> !x. ~(x IN s /\ x IN t)`) THEN
6270         EXISTS_TAC `a:complex` THEN
6271         SIMP_TAC[IN_SEGMENT; LEFT_IMP_EXISTS_THM] THEN
6272         SIMP_TAC[VECTOR_SUB_COMPONENT; VECTOR_ADD_COMPONENT;
6273                  VECTOR_MUL_COMPONENT; BASIS_COMPONENT; DIMINDEX_2; ARITH] THEN
6274         REWRITE_TAC[REAL_ARITH
6275          `(a < (&1 - u) * (a + x) + u * (a + y) <=>
6276            &0 < (&1 - u) * x + u * y) /\
6277           ((&1 - u) * (a - x) + u * (a - y) < a <=>
6278            &0 < (&1 - u) * x + u * y)`] THEN
6279         REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_MUL_RID] THEN
6280         REWRITE_TAC[REAL_ARITH `&0 < (&1 - u) * x + u * y <=>
6281                                 (&1 - u) * --x + u * --y < &0`] THEN
6282         MATCH_MP_TAC REAL_CONVEX_BOUND_LT THEN ASM_REAL_ARITH_TAC;
6283         REWRITE_TAC[ARC_LINEPATH_EQ; VECTOR_MUL_EQ_0;
6284                     VECTOR_ARITH `a - k:complex = a + k <=> k = vec 0`] THEN
6285         ASM_SIMP_TAC[REAL_LT_IMP_NZ; BASIS_NONZERO; DIMINDEX_2; ARITH];
6286         MATCH_MP_TAC(SET_RULE
6287           `kk INTER p = {} /\ kk INTER ke = {kp} /\ dk INTER kk = {kn}
6288            ==> (ke UNION p UNION dk) INTER kk SUBSET {kp,kn}`) THEN
6289         CONJ_TAC THENL
6290          [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6291            `b INTER p = {} ==> s SUBSET b ==> s INTER p = {}`)) THEN
6292           SIMP_TAC[SUBSET; IN_SEGMENT; IN_BALL; LEFT_IMP_EXISTS_THM] THEN
6293           REWRITE_TAC[VECTOR_ARITH
6294             `(&1 - u) % (a - d) + u % (a + d):complex = a - (&1 - &2 * u) % d`;
6295            NORM_ARITH `dist(a:complex,a - d) = norm d`] THEN
6296           REPEAT STRIP_TAC THEN
6297           SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6298           MATCH_MP_TAC(REAL_ARITH
6299            `&0 < kd /\ a * kd <= &1 * kd /\ kd < k
6300             ==> a * abs kd * &1 < k`) THEN
6301           ASM_SIMP_TAC[REAL_LE_RMUL_EQ] THEN ASM_REAL_ARITH_TAC;
6302           CONJ_TAC THEN MATCH_MP_TAC INTER_SEGMENT THEN DISJ1_TAC THEN
6303           REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6304           REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e) /\
6305                                   dist(a + d,a - e) = norm(d + e) /\
6306                                   dist(a - d,a - e) = norm(d - e) /\
6307                                   dist(a + d,a + e) = norm(d - e)`] THEN
6308           REWRITE_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB] THEN
6309           ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6310           ASM_REAL_ARITH_TAC];
6311         REWRITE_TAC[UNION_OVER_INTER; EMPTY_UNION] THEN
6312         ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN CONJ_TAC THENL
6313          [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6314            `b INTER p = {} ==> c SUBSET b ==> c INTER p = {}`)) THEN
6315           MATCH_MP_TAC SUBSET_BALL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE];
6316           ALL_TAC] THEN
6317         REWRITE_TAC[SET_RULE `s INTER t = {} <=>
6318                               !x. x IN t ==> ~(x IN s)`] THEN
6319         SIMP_TAC[IN_SEGMENT; LEFT_IMP_EXISTS_THM; IN_BALL] THEN
6320         REWRITE_TAC[VECTOR_ARITH
6321         `(&1 - u) % (a - d) + u % (a - e):complex =
6322          a - ((&1 - u) % d + u % e) /\
6323          (&1 - u) % (a + d) + u % (a + e):complex =
6324          a + ((&1 - u) % d + u % e)`;
6325         NORM_ARITH
6326          `dist(a:complex,a + d) = norm d /\ dist(a,a - e) = norm e`] THEN
6327         REWRITE_TAC[VECTOR_MUL_ASSOC; GSYM VECTOR_ADD_RDISTRIB] THEN
6328         SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6329         REWRITE_TAC[REAL_NOT_LT; REAL_MUL_RID] THEN REPEAT STRIP_TAC THEN
6330         MATCH_MP_TAC(REAL_ARITH `x <= y ==> x <= abs y`) THEN
6331         REWRITE_TAC[REAL_ARITH
6332          `(k <= (&1 - u) * k + u * e <=> &0 <= u * (e - k)) /\
6333           (k <= (&1 - u) * d + u * k <=> &0 <= (&1 - u) * (d - k))`] THEN
6334         MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC];
6335       ALL_TAC] THEN
6336     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN
6337     MATCH_MP_TAC(TAUT
6338      `(p <=> p') /\ (p /\ p' ==> (q <=> q')) ==> p /\ q ==> p' /\ q'`) THEN
6339     CONJ_TAC THENL
6340      [AP_TERM_TAC THEN AP_TERM_TAC THEN
6341       ONCE_REWRITE_TAC[SET_RULE
6342        `(c UNION p UNION a) UNION b = p UNION (a UNION b UNION c)`] THEN
6343       AP_TERM_TAC THEN
6344       W(MP_TAC o PART_MATCH (lhand o rand) UNION_SEGMENT o
6345          rand o lhand o snd) THEN
6346       REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between;
6347                   NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6348                   NORM_ARITH `dist(a + d:complex,a + e) = norm(d - e)`] THEN
6349       ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB;
6350                    NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6351       ANTS_TAC THENL [ASM_REAL_ARITH_TAC; DISCH_THEN SUBST1_TAC] THEN
6352       MATCH_MP_TAC UNION_SEGMENT THEN
6353       REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between;
6354                   NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6355                   NORM_ARITH `dist(a - d:complex,a - e) = norm(d - e)`] THEN
6356       ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB;
6357                    NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6358       ASM_REAL_ARITH_TAC;
6359       ALL_TAC] THEN
6360     DISCH_THEN(CONJUNCTS_THEN (MP_TAC o MATCH_MP
6361      (MESON[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]
6362        `z IN inside s ==> ~(z IN s)`))) THEN
6363     REWRITE_TAC[IN_UNION; DE_MORGAN_THM] THEN REPEAT STRIP_TAC THEN
6364     AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
6365     ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_JOIN; ARC_IMP_PATH; PATH_LINEPATH;
6366       PATH_IMAGE_JOIN; IN_UNION; PATH_IMAGE_LINEPATH; PATHSTART_JOIN;
6367       PATHFINISH_JOIN; PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
6368     MATCH_MP_TAC(COMPLEX_RING
6369      `d + k + e:complex = z ==> (e + p + d) + k = p + z`) THEN
6370     MATCH_MP_TAC EQ_TRANS THEN
6371     EXISTS_TAC
6372      `winding_number(linepath (a - d % basis 1:complex,a - kde % basis 1),z) +
6373       winding_number(linepath (a - kde % basis 1,a + e % basis 1),z)` THEN
6374     CONJ_TAC THENL [AP_TERM_TAC; ALL_TAC] THEN CONV_TAC SYM_CONV THEN
6375     MATCH_MP_TAC WINDING_NUMBER_SPLIT_LINEPATH THEN
6376     ASM_REWRITE_TAC[] THENL
6377      [CONJ_TAC THENL
6378        [ALL_TAC;
6379         SUBGOAL_THEN
6380          `~(z IN segment[a - kde % basis 1:complex,a + kde % basis 1]) /\
6381           ~(z IN segment[a + kde % basis 1,a + e % basis 1])`
6382         MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
6383         MATCH_MP_TAC(SET_RULE
6384          `s UNION t = u ==> ~(z IN s) /\ ~(z IN t) ==> ~(z IN u)`) THEN
6385         MATCH_MP_TAC UNION_SEGMENT];
6386       ALL_TAC] THEN
6387     REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6388     REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6389                 NORM_ARITH `dist(a - d:complex,a - e) = norm(d - e)`;
6390                 NORM_ARITH `dist(a + d:complex,a + e) = norm(d - e)`] THEN
6391     ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB; NORM_MUL;
6392                    NORM_BASIS; DIMINDEX_2; ARITH] THEN
6393     ASM_REAL_ARITH_TAC) in
6394   let lemma3 = prove
6395    (`!p:real^1->complex.
6396           simple_path p /\ pathfinish p = pathstart p
6397           ==> ?z. z IN inside(path_image p) /\ norm(winding_number(p,z)) = &1`,
6398     GEN_TAC THEN STRIP_TAC THEN
6399     MP_TAC(ISPEC `p:real^1->complex` JORDAN_INSIDE_OUTSIDE) THEN
6400     ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
6401     UNDISCH_TAC `~(inside(path_image p):complex->bool = {})` THEN
6402     REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN
6403     DISCH_THEN(X_CHOOSE_TAC `a:complex`) THEN
6404     MP_TAC(ISPECL [`inside(path_image p):complex->bool`;
6405                    `a:complex`; `basis 1:complex`]
6406           RAY_TO_FRONTIER) THEN
6407     MP_TAC(ISPECL [`inside(path_image p):complex->bool`;
6408                    `a:complex`; `--basis 1:complex`]
6409           RAY_TO_FRONTIER) THEN
6410     ASM_SIMP_TAC[INTERIOR_OPEN; VECTOR_NEG_EQ_0; BASIS_NONZERO;
6411                  DIMINDEX_2; ARITH] THEN
6412     REWRITE_TAC[VECTOR_ARITH `a + d % --b:complex = a - d % b`] THEN
6413     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
6414     DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
6415     SUBGOAL_THEN
6416      `?t. t IN interval[vec 0,vec 1] /\
6417           (p:real^1->complex) t = a - d % basis 1`
6418     STRIP_ASSUME_TAC THENL
6419      [RULE_ASSUM_TAC(REWRITE_RULE[path_image; IN_IMAGE]) THEN
6420       ASM_MESON_TAC[];
6421       ALL_TAC] THEN
6422     SUBGOAL_THEN
6423      `?q. simple_path q /\
6424           pathstart q:complex = a - d % basis 1 /\
6425           pathfinish q = a - d % basis 1 /\
6426           path_image q = path_image p /\
6427           (!z. z IN inside(path_image p)
6428                ==> winding_number(q,z) = winding_number(p,z))`
6429     MP_TAC THENL
6430      [EXISTS_TAC `shiftpath t (p:real^1->complex)` THEN
6431       FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6432       ASM_SIMP_TAC[PATHSTART_SHIFTPATH; PATHFINISH_SHIFTPATH; DROP_VEC;
6433                    SIMPLE_PATH_SHIFTPATH; PATH_IMAGE_SHIFTPATH] THEN
6434       REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_SHIFTPATH THEN
6435       ASM_SIMP_TAC[SIMPLE_PATH_IMP_PATH] THEN
6436       ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6437       DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` MP_TAC) THEN
6438       REPLICATE_TAC 3 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
6439       REWRITE_TAC[IMP_CONJ] THEN DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
6440       SUBGOAL_THEN
6441        `?z. z IN inside(path_image q) /\ norm(winding_number(q,z)) = &1`
6442        (fun th -> MESON_TAC[th]) THEN
6443       POP_ASSUM_LIST(MP_TAC o end_itlist CONJ o rev o
6444           filter (fun tm -> not(free_in `t:real^1` (concl tm) or
6445                                 free_in `p:real^1->complex` (concl tm)))) THEN
6446       STRIP_TAC] THEN
6447     SUBGOAL_THEN
6448      `?t. t IN interval[vec 0,vec 1] /\
6449           (q:real^1->complex) t = a + e % basis 1`
6450     STRIP_ASSUME_TAC THENL
6451      [RULE_ASSUM_TAC(REWRITE_RULE[path_image; IN_IMAGE]) THEN
6452       ASM_MESON_TAC[];
6453       ALL_TAC] THEN
6454     SUBGOAL_THEN `~(a - d % basis 1:complex = a + e % basis 1)`
6455     ASSUME_TAC THENL
6456      [REWRITE_TAC[VECTOR_ARITH
6457        `a - d % l:complex = a + e % l <=> (e + d) % l = vec 0`] THEN
6458       SIMP_TAC[VECTOR_MUL_EQ_0; BASIS_NONZERO; DIMINDEX_2; ARITH] THEN
6459       ASM_REAL_ARITH_TAC;
6460       ALL_TAC] THEN
6461     SUBGOAL_THEN
6462       `path_image q INTER segment[a - d % basis 1,a + e % basis 1] =
6463        {a - d % basis 1:complex,a + e % basis 1}`
6464     ASSUME_TAC THENL
6465      [REWRITE_TAC[SEGMENT_CLOSED_OPEN] THEN
6466       MATCH_MP_TAC(SET_RULE
6467        `a IN p /\ b IN p /\ p INTER s = {}
6468         ==> p INTER (s UNION {a,b}) = {a,b}`) THEN
6469       CONJ_TAC THENL [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE]; ALL_TAC] THEN
6470       CONJ_TAC THENL [ASM_MESON_TAC[path_image; IN_IMAGE]; ALL_TAC] THEN
6471       ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6472                    ENDS_IN_UNIT_INTERVAL] THEN
6473       REWRITE_TAC[SET_RULE `s INTER t = {} <=> !x. x IN t ==> ~(x IN s)`] THEN
6474       REWRITE_TAC[IN_SEGMENT; VECTOR_ARITH
6475        `(&1 - u) % (a - d % l) + u % (a + e % l):complex =
6476          a + (u * e - (&1 - u) * d) % l`] THEN
6477       X_GEN_TAC `y:complex` THEN
6478       DISCH_THEN(X_CHOOSE_THEN `k:real` STRIP_ASSUME_TAC o CONJUNCT2) THEN
6479       ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(MESON
6480        [INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]
6481        `x IN inside s ==> ~(x IN s)`) THEN
6482       ASM_CASES_TAC `&0 <= k * e - (&1 - k) * d` THENL
6483        [ALL_TAC;
6484         ONCE_REWRITE_TAC[VECTOR_ARITH
6485          `a + (s - t) % l:complex = a - (t - s) % l`]] THEN
6486       FIRST_X_ASSUM MATCH_MP_TAC THEN
6487       ASM_SIMP_TAC[REAL_ARITH `~(&0 <= a - b) ==> &0 <= b - a`] THEN
6488       REWRITE_TAC[REAL_ARITH `k * e - (&1 - k) * d < e <=>
6489                               &0 < (&1 - k) * (d + e)`] THEN
6490       REWRITE_TAC[REAL_ARITH `(&1 - k) * d - k * e < d <=>
6491                               &0 < k * (d + e)`] THEN
6492       MATCH_MP_TAC REAL_LT_MUL THEN ASM_REAL_ARITH_TAC;
6493       ALL_TAC] THEN
6494     MP_TAC(ISPECL
6495      [`subpath t (vec 0) (q:real^1->complex)`;
6496       `a:complex`; `d:real`; `e:real`] lemma2) THEN
6497     ASM_SIMP_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH;
6498                  PATH_IMAGE_JOIN; PATHSTART_LINEPATH] THEN
6499     ANTS_TAC THENL
6500      [CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[pathstart]] THEN
6501       MATCH_MP_TAC SIMPLE_PATH_JOIN_LOOP THEN
6502       ASM_REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH;
6503                       PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
6504       ASM_REWRITE_TAC[ARC_LINEPATH_EQ] THEN REPEAT CONJ_TAC THENL
6505        [MATCH_MP_TAC ARC_SIMPLE_PATH_SUBPATH THEN
6506         RULE_ASSUM_TAC(REWRITE_RULE[pathstart]) THEN
6507         ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL];
6508         RULE_ASSUM_TAC(REWRITE_RULE[pathstart]) THEN ASM_REWRITE_TAC[];
6509         REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
6510         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6511          `p INTER s = {a,b} ==> p' SUBSET p ==> p' INTER s SUBSET {b,a}`)) THEN
6512         ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6513                      ENDS_IN_UNIT_INTERVAL]];
6514       DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC)] THEN
6515     MP_TAC(ISPECL
6516      [`subpath (vec 0) t (q:real^1->complex)`;
6517       `subpath (vec 1) t (q:real^1->complex)`;
6518       `linepath(a - d % basis 1:complex,a + e % basis 1)`;
6519       `a - d % basis 1:complex`; `a + e % basis 1:complex`;
6520       `z:complex`;
6521       `--winding_number
6522           (subpath t (vec 0) q ++
6523            linepath (a - d % basis 1,a + e % basis 1),z)`]
6524       WINDING_NUMBER_FROM_INNERPATH) THEN
6525     ASM_REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH;
6526                     PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
6527     REWRITE_TAC[REVERSEPATH_SUBPATH; REVERSEPATH_LINEPATH] THEN
6528     SUBGOAL_THEN
6529      `path_image (subpath (vec 0) t q) UNION
6530       path_image (subpath (vec 1) t q) :complex->bool =
6531       path_image q`
6532     SUBST1_TAC THENL
6533      [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6534       SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN
6535       ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6536       REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
6537       SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6538       REWRITE_TAC[GSYM IMAGE_UNION; PATH_IMAGE_REVERSEPATH] THEN
6539       SUBGOAL_THEN `interval[vec 0:real^1,t] UNION interval[t,vec 1] =
6540                     interval[vec 0,vec 1]`
6541         (fun th -> ASM_REWRITE_TAC[th; GSYM path_image]) THEN
6542       REWRITE_TAC[EXTENSION; IN_UNION; IN_INTERVAL_1; DROP_VEC] THEN
6543       ASM_REAL_ARITH_TAC;
6544       ALL_TAC] THEN
6545     ANTS_TAC THENL
6546      [RULE_ASSUM_TAC(REWRITE_RULE[pathstart; pathfinish]) THEN
6547       REPLICATE_TAC 2 (ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
6548        [MATCH_MP_TAC SIMPLE_PATH_SUBPATH THEN
6549         ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL] THEN ASM_MESON_TAC[];
6550         ALL_TAC]) THEN
6551       ASM_REWRITE_TAC[SIMPLE_PATH_LINEPATH_EQ; PATH_IMAGE_LINEPATH] THEN
6552       REPEAT CONJ_TAC THENL
6553        [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6554         SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN
6555         ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6556         REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
6557         SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6558         MATCH_MP_TAC(SET_RULE
6559           `a IN s /\ a IN t /\ b IN s /\ b IN t /\
6560            (!x. x IN s ==> !y. y IN t ==> x = y ==> x = a \/ x = b)
6561            ==> s INTER t = {a,b}`) THEN
6562         REPEAT CONJ_TAC THENL
6563          [REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `vec 0:real^1` THEN
6564           ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6565           ASM_REAL_ARITH_TAC;
6566           REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `vec 1:real^1` THEN
6567           ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6568           ASM_REAL_ARITH_TAC;
6569           REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `t:real^1` THEN
6570           ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6571           ASM_REAL_ARITH_TAC;
6572           REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `t:real^1` THEN
6573           ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6574           ASM_REAL_ARITH_TAC;
6575           ALL_TAC] THEN
6576         REWRITE_TAC[FORALL_IN_IMAGE; IN_INTERVAL_1; DROP_VEC] THEN
6577         X_GEN_TAC `s:real^1` THEN STRIP_TAC THEN
6578         X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN DISCH_TAC THEN
6579         FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [simple_path]) THEN
6580         DISCH_THEN(MP_TAC o SPECL [`s:real^1`; `u:real^1`] o CONJUNCT2) THEN
6581         ASM_REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN
6582         ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
6583         DISCH_THEN(REPEAT_TCL DISJ_CASES_THEN
6584           (REPEAT_TCL CONJUNCTS_THEN SUBST_ALL_TAC)) THEN
6585         ASM_REWRITE_TAC[] THEN SUBGOAL_THEN `drop u = drop t` MP_TAC THENL
6586          [ASM_REAL_ARITH_TAC; ASM_MESON_TAC[DROP_EQ]];
6587         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6588          `p INTER s = {a,b}
6589           ==> a IN q /\ b IN q /\ q SUBSET p ==> q INTER s = {a,b}`)) THEN
6590         ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6591                      ENDS_IN_UNIT_INTERVAL] THEN
6592         FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6593         SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6594         REWRITE_TAC[IN_IMAGE] THEN CONJ_TAC THENL
6595          [EXISTS_TAC `vec 0:real^1`; EXISTS_TAC `t:real^1`] THEN
6596         ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6597         ASM_REAL_ARITH_TAC;
6598         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6599          `p INTER s = {a,b}
6600           ==> a IN q /\ b IN q /\ q SUBSET p ==> q INTER s = {a,b}`)) THEN
6601         ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6602                      ENDS_IN_UNIT_INTERVAL] THEN
6603         ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6604         REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
6605         FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6606         SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6607         REWRITE_TAC[IN_IMAGE] THEN CONJ_TAC THENL
6608          [EXISTS_TAC `vec 1:real^1`; EXISTS_TAC `t:real^1`] THEN
6609         ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6610         ASM_REAL_ARITH_TAC;
6611         REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_INTER] THEN
6612         EXISTS_TAC `a:complex` THEN
6613         ASM_REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6614         REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6615               NORM_ARITH `dist(a - d:complex,a) = norm(d)`;
6616               NORM_ARITH `dist(a:complex,a + e) = norm e`] THEN
6617         ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; NORM_MUL;
6618                  NORM_BASIS; DIMINDEX_2; ARITH] THEN
6619         ASM_REAL_ARITH_TAC;
6620         ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6621         RULE_ASSUM_TAC(REWRITE_RULE[PATH_IMAGE_LINEPATH]) THEN
6622         ASM_REWRITE_TAC[REVERSEPATH_SUBPATH];
6623         W(MP_TAC o PART_MATCH (rand o rand) WINDING_NUMBER_REVERSEPATH o
6624           rand o snd) THEN
6625         ANTS_TAC THENL
6626          [ASM_SIMP_TAC[PATH_JOIN_EQ; PATH_IMAGE_JOIN; PATH_LINEPATH;
6627             SIMPLE_PATH_IMP_PATH; PATHSTART_LINEPATH; PATHFINISH_SUBPATH;
6628             PATH_SUBPATH; ENDS_IN_UNIT_INTERVAL] THEN
6629           ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6630           DISCH_THEN(SUBST1_TAC o SYM) THEN
6631           ASM_SIMP_TAC[REVERSEPATH_JOINPATHS; REVERSEPATH_LINEPATH;
6632                        REVERSEPATH_SUBPATH; PATHFINISH_SUBPATH;
6633                        PATHSTART_LINEPATH] THEN
6634           MATCH_MP_TAC(MESON[COMPLEX_ADD_SYM]
6635            `winding_number(g ++ h,z) =
6636             winding_number(g,z) + winding_number(h,z) /\
6637             winding_number(h ++ g,z) =
6638             winding_number(h,z) + winding_number(g,z)
6639             ==> winding_number(g ++ h,z) =winding_number(h ++ g,z)`) THEN
6640           CONJ_TAC THEN MATCH_MP_TAC WINDING_NUMBER_JOIN THEN
6641           ASM_SIMP_TAC[PATH_LINEPATH; PATH_SUBPATH; PATH_SUBPATH;
6642                        SIMPLE_PATH_IMP_PATH; ENDS_IN_UNIT_INTERVAL;
6643                        PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
6644                        PATHSTART_SUBPATH; PATHFINISH_SUBPATH]
6645           THENL [ALL_TAC; ONCE_REWRITE_TAC[CONJ_SYM]] THEN
6646           REWRITE_TAC[SET_RULE
6647            `~(z IN s) /\ ~(z IN t) <=> ~(z IN s UNION t)`] THEN
6648           ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6649           REWRITE_TAC[REVERSEPATH_LINEPATH; REVERSEPATH_SUBPATH] THEN
6650           ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]];
6651         REWRITE_TAC[COMPLEX_NEG_EQ_0] THEN DISCH_THEN SUBST_ALL_TAC THEN
6652         RULE_ASSUM_TAC(REWRITE_RULE
6653          [COMPLEX_NORM_CX; REAL_OF_NUM_EQ; REAL_ABS_NUM; ARITH]) THEN
6654         FIRST_X_ASSUM CONTR_TAC];
6655       DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6656       ONCE_REWRITE_TAC[COMPLEX_RING `a:complex = --b <=> --a = b`] THEN
6657       DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
6658       RULE_ASSUM_TAC(REWRITE_RULE[NORM_NEG])] THEN
6659     EXISTS_TAC `z:complex` THEN ASM_REWRITE_TAC[] THEN
6660     SUBGOAL_THEN
6661      `winding_number(subpath (vec 0) t q ++ subpath t (vec 1) q,z) =
6662       winding_number(subpath (vec 0) (vec 1) q,z)`
6663      (fun th -> ASM_MESON_TAC[th; SUBPATH_TRIVIAL]) THEN
6664     MATCH_MP_TAC EQ_TRANS THEN
6665     EXISTS_TAC `winding_number(subpath (vec 0) t q,z) +
6666                 winding_number(subpath t (vec 1) q,z)` THEN
6667     CONJ_TAC THENL
6668      [MATCH_MP_TAC WINDING_NUMBER_JOIN THEN
6669       ASM_SIMP_TAC[PATH_SUBPATH; ENDS_IN_UNIT_INTERVAL; SIMPLE_PATH_IMP_PATH;
6670                    PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
6671       SUBGOAL_THEN `~((z:complex) IN path_image q)` MP_TAC THENL
6672        [ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6673         MATCH_MP_TAC(SET_RULE
6674           `s1 SUBSET s /\ s2 SUBSET s
6675            ==> ~(z IN s) ==> ~(z IN s1) /\ ~(z IN s2)`) THEN
6676         ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; ENDS_IN_UNIT_INTERVAL;
6677                   SIMPLE_PATH_IMP_PATH]];
6678       MATCH_MP_TAC WINDING_NUMBER_SUBPATH_COMBINE THEN
6679       ASM_REWRITE_TAC[ENDS_IN_INTERVAL; GSYM IN_INTERVAL_1] THEN
6680       ASM_SIMP_TAC[UNIT_INTERVAL_NONEMPTY; SIMPLE_PATH_IMP_PATH] THEN
6681       ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]]) in
6682   GEN_TAC THEN DISCH_TAC THEN
6683   ASM_CASES_TAC `pathfinish g:complex = pathstart g` THENL
6684    [ALL_TAC; ASM_MESON_TAC[INSIDE_SIMPLE_CURVE_IMP_CLOSED]] THEN
6685   MATCH_MP_TAC(MESON[]
6686    `(?k. !z. z IN s ==> f z = k) /\
6687     (?z. z IN s /\ (f z = a \/ f z = b))
6688     ==> (!z. z IN s ==> f z = a) \/ (!z. z IN s ==> f z = b)`) THEN
6689   CONJ_TAC THENL
6690    [MATCH_MP_TAC WINDING_NUMBER_CONSTANT THEN
6691     ASM_SIMP_TAC[INSIDE_NO_OVERLAP; SIMPLE_PATH_IMP_PATH] THEN
6692     ASM_SIMP_TAC[JORDAN_INSIDE_OUTSIDE];
6693     MP_TAC(SPEC `g:real^1->complex` lemma3) THEN ASM_REWRITE_TAC[] THEN
6694     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN
6695     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
6696     MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
6697       INTEGER_WINDING_NUMBER) THEN
6698     ANTS_TAC THENL
6699      [ASM_SIMP_TAC[SIMPLE_PATH_IMP_PATH] THEN
6700       ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6701       SIMP_TAC[complex_integer; COMPLEX_EQ; IM_NEG; IM_CX] THEN
6702       SIMP_TAC[GSYM real; REAL_NORM; RE_NEG; RE_CX] THEN REAL_ARITH_TAC]]);;
6703
6704 let SIMPLE_CLOSED_PATH_ABS_WINDING_NUMBER_INSIDE = prove
6705  (`!g z. simple_path g /\ z IN inside(path_image g)
6706          ==> abs(Re(winding_number(g,z))) = &1`,
6707   REPEAT STRIP_TAC THEN FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP
6708     SIMPLE_CLOSED_PATH_WINDING_NUMBER_INSIDE) THEN
6709   ASM_SIMP_TAC[RE_NEG; RE_CX; REAL_ABS_NUM; REAL_ABS_NEG]);;
6710
6711 let SIMPLE_CLOSED_PATH_NORM_WINDING_NUMBER_INSIDE = prove
6712  (`!g z. simple_path g /\ z IN inside(path_image g)
6713          ==> norm(winding_number(g,z)) = &1`,
6714   REPEAT STRIP_TAC THEN
6715   SUBGOAL_THEN `pathfinish g:complex = pathstart g` ASSUME_TAC THENL
6716    [ASM_MESON_TAC[INSIDE_SIMPLE_CURVE_IMP_CLOSED]; ALL_TAC] THEN
6717   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
6718       INTEGER_WINDING_NUMBER) THEN
6719   ANTS_TAC THENL
6720    [ASM_SIMP_TAC[SIMPLE_PATH_IMP_PATH] THEN
6721     ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6722     ASM_SIMP_TAC[complex_integer; GSYM real; REAL_NORM;
6723                  SIMPLE_CLOSED_PATH_ABS_WINDING_NUMBER_INSIDE]]);;
6724
6725 let SIMPLE_CLOSED_PATH_WINDING_NUMBER_CASES = prove
6726  (`!g z. simple_path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g)
6727          ==> winding_number(g,z) IN {--Cx(&1),Cx(&0),Cx(&1)}`,
6728   REPEAT STRIP_TAC THEN
6729   MP_TAC(ISPEC `path_image g:complex->bool` INSIDE_UNION_OUTSIDE) THEN
6730   REWRITE_TAC[EXTENSION; IN_DIFF; IN_UNIV; IN_UNION] THEN
6731   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
6732   ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN STRIP_TAC THEN
6733   ASM_SIMP_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE; SIMPLE_PATH_IMP_PATH] THEN
6734   ASM_MESON_TAC[SIMPLE_CLOSED_PATH_WINDING_NUMBER_INSIDE]);;
6735
6736 let SIMPLE_CLOSED_PATH_WINDING_NUMBER_POS = prove
6737  (`!g z. simple_path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g) /\
6738          &0 < Re(winding_number(g,z))
6739          ==> winding_number(g,z) = Cx(&1)`,
6740   REPEAT STRIP_TAC THEN
6741   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
6742       SIMPLE_CLOSED_PATH_WINDING_NUMBER_CASES) THEN
6743   ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
6744   STRIP_TAC THEN UNDISCH_TAC `&0 < Re(winding_number(g,z))` THEN
6745   ASM_REWRITE_TAC[RE_NEG; RE_CX] THEN REAL_ARITH_TAC);;
6746
6747 let SIMPLY_CONNECTED_IMP_WINDING_NUMBER_ZERO = prove
6748  (`!s g z. simply_connected s /\
6749            path g /\ path_image g SUBSET s /\
6750            pathfinish g = pathstart g /\ ~(z IN s)
6751            ==> winding_number(g,z) = Cx(&0)`,
6752   REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
6753   EXISTS_TAC `winding_number(linepath(pathstart g,pathstart g),z)` THEN
6754   CONJ_TAC THENL
6755    [MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
6756     MATCH_MP_TAC HOMOTOPIC_LOOPS_IMP_HOMOTOPIC_PATHS_NULL THEN
6757     EXISTS_TAC `pathstart(g:real^1->complex)` THEN
6758     MATCH_MP_TAC HOMOTOPIC_LOOPS_SUBSET THEN
6759     EXISTS_TAC `s:complex->bool` THEN
6760     CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
6761     FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [simply_connected]) THEN
6762     ASM_REWRITE_TAC[PATH_LINEPATH; PATHSTART_LINEPATH;
6763                     PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH; SEGMENT_REFL;
6764                     INSERT_SUBSET; EMPTY_SUBSET];
6765     MATCH_MP_TAC WINDING_NUMBER_TRIVIAL] THEN
6766   MP_TAC(ISPEC `g:real^1->complex` PATHSTART_IN_PATH_IMAGE) THEN
6767   ASM SET_TAC[]);;
6768
6769 let NO_BOUNDED_CONNECTED_COMPONENT_IMP_WINDING_NUMBER_ZERO = prove
6770  (`!s. ~(?z. ~(z IN s) /\ bounded(connected_component ((:complex) DIFF s) z))
6771        ==> !g z. path g /\ path_image g SUBSET s /\
6772                  pathfinish g = pathstart g /\ ~(z IN s)
6773                  ==> winding_number(g,z) = Cx(&0)`,
6774   REWRITE_TAC[NOT_EXISTS_THM] THEN REPEAT STRIP_TAC THEN
6775   MATCH_MP_TAC WINDING_NUMBER_ZERO_IN_OUTSIDE THEN
6776   ASM_REWRITE_TAC[outside; IN_ELIM_THM] THEN
6777   CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
6778   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
6779   ASM_REWRITE_TAC[CONTRAPOS_THM] THEN
6780   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] BOUNDED_SUBSET) THEN
6781   MATCH_MP_TAC CONNECTED_COMPONENT_MONO THEN ASM SET_TAC[]);;
6782
6783 let NO_BOUNDED_PATH_COMPONENT_IMP_WINDING_NUMBER_ZERO = prove
6784  (`!s. ~(?z. ~(z IN s) /\ bounded(path_component ((:complex) DIFF s) z))
6785        ==> !g z. path g /\ path_image g SUBSET s /\
6786                  pathfinish g = pathstart g /\ ~(z IN s)
6787                  ==> winding_number(g,z) = Cx(&0)`,
6788   GEN_TAC THEN DISCH_TAC THEN
6789   MATCH_MP_TAC NO_BOUNDED_CONNECTED_COMPONENT_IMP_WINDING_NUMBER_ZERO THEN
6790   ASM_MESON_TAC[PATH_COMPONENT_SUBSET_CONNECTED_COMPONENT; BOUNDED_SUBSET]);;
6791
6792 (* ------------------------------------------------------------------------- *)
6793 (* Partial circle path.                                                      *)
6794 (* ------------------------------------------------------------------------- *)
6795
6796 let partcirclepath = new_definition
6797  `partcirclepath(z,r,s,t) =
6798     \x. z + Cx(r) * cexp(ii * linepath(Cx(s),Cx(t)) x)`;;
6799
6800 let PATHSTART_PARTCIRCLEPATH = prove
6801  (`!r z s t. pathstart(partcirclepath(z,r,s,t)) =
6802                 z + Cx(r) * cexp(ii * Cx(s))`,
6803   REWRITE_TAC[pathstart; partcirclepath;
6804               REWRITE_RULE[pathstart] PATHSTART_LINEPATH]);;
6805
6806 let PATHFINISH_PARTCIRCLEPATH = prove
6807  (`!r z s t. pathfinish(partcirclepath(z,r,s,t)) =
6808                 z + Cx(r) * cexp(ii * Cx(t))`,
6809   REWRITE_TAC[pathfinish; partcirclepath;
6810               REWRITE_RULE[pathfinish] PATHFINISH_LINEPATH]);;
6811
6812 let HAS_VECTOR_DERIVATIVE_PARTCIRCLEPATH = prove
6813  (`!z r s t x.
6814         ((partcirclepath(z,r,s,t)) has_vector_derivative
6815          (ii * Cx(r) * (Cx t - Cx s) * cexp(ii * linepath(Cx(s),Cx(t)) x)))
6816         (at x)`,
6817   REWRITE_TAC[partcirclepath; linepath; COMPLEX_CMUL; CX_SUB] THEN
6818   REPEAT GEN_TAC THEN MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_REAL_COMPLEX THEN
6819   COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING);;
6820
6821 let VECTOR_DERIVATIVE_PARTCIRCLEPATH = prove
6822  (`!z r s t x.
6823         vector_derivative (partcirclepath(z,r,s,t)) (at x) =
6824         ii * Cx(r) * (Cx t - Cx s) * cexp(ii * linepath(Cx(s),Cx(t)) x)`,
6825   REPEAT GEN_TAC THEN MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
6826   REWRITE_TAC[HAS_VECTOR_DERIVATIVE_PARTCIRCLEPATH]);;
6827
6828 let VALID_PATH_PARTCIRCLEPATH = prove
6829  (`!z r s t. valid_path(partcirclepath(z,r,s,t))`,
6830   REPEAT GEN_TAC THEN REWRITE_TAC[valid_path] THEN
6831   MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
6832   REWRITE_TAC[differentiable_on] THEN X_GEN_TAC `x:real^1` THEN STRIP_TAC THEN
6833   MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
6834   REWRITE_TAC[VECTOR_DERIVATIVE_WORKS; VECTOR_DERIVATIVE_PARTCIRCLEPATH;
6835               HAS_VECTOR_DERIVATIVE_PARTCIRCLEPATH]);;
6836
6837 let PATH_PARTCIRCLEPATH = prove
6838  (`!z r s t. path(partcirclepath(z,r,s,t))`,
6839   SIMP_TAC[VALID_PATH_PARTCIRCLEPATH; VALID_PATH_IMP_PATH]);;
6840
6841 let PATH_IMAGE_PARTCIRCLEPATH = prove
6842  (`!z r s t.
6843         &0 <= r /\ s <= t
6844         ==> path_image(partcirclepath(z,r,s,t)) =
6845                 {z + Cx(r) * cexp(ii * Cx x) | s <= x /\ x <= t}`,
6846   REPEAT STRIP_TAC THEN REWRITE_TAC[path_image; partcirclepath] THEN
6847   REWRITE_TAC[EXTENSION; TAUT `(a <=> b) <=> (a ==> b) /\ (b ==> a)`] THEN
6848   REWRITE_TAC[FORALL_AND_THM; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
6849   CONJ_TAC THENL
6850    [X_GEN_TAC `x:real^1` THEN REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN
6851     DISCH_TAC THEN EXISTS_TAC `(&1 - drop x) * s + drop x * t` THEN
6852     REWRITE_TAC[linepath; CX_ADD; CX_SUB; COMPLEX_CMUL; CX_MUL] THEN
6853     REWRITE_TAC[REAL_ARITH `s <= (&1 - x) * s + x * t <=> &0 <= x * (t - s)`;
6854       REAL_ARITH `(&1 - x) * s + x * t <= t <=> &0 <= (&1 - x) * (t - s)`] THEN
6855     ASM_SIMP_TAC[REAL_LE_MUL; REAL_SUB_LE];
6856     ALL_TAC] THEN
6857   X_GEN_TAC `w:complex` THEN
6858   DISCH_THEN(X_CHOOSE_THEN `x:real` STRIP_ASSUME_TAC) THEN
6859   ASM_REWRITE_TAC[IN_IMAGE] THEN ASM_CASES_TAC `s:real < t` THENL
6860    [EXISTS_TAC `lift((x - s) / (t - s))` THEN
6861     ASM_SIMP_TAC[IN_INTERVAL_1; REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_SUB_LT;
6862                  LIFT_DROP; DROP_VEC; linepath; REAL_MUL_LZERO; REAL_MUL_LID;
6863                  REAL_SUB_LE; REAL_ARITH `x - s:real <= t - s <=> x <= t`] THEN
6864     AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
6865     REWRITE_TAC[COMPLEX_CMUL; CX_SUB; CX_DIV] THEN
6866     SUBGOAL_THEN `~(Cx(s) = Cx(t))` MP_TAC THENL
6867      [ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NE]; CONV_TAC COMPLEX_FIELD];
6868     UNDISCH_TAC `s:real <= t` THEN ASM_REWRITE_TAC[REAL_LE_LT] THEN
6869     DISCH_THEN SUBST_ALL_TAC THEN EXISTS_TAC `vec 0:real^1` THEN
6870     SIMP_TAC[IN_INTERVAL_1; DROP_VEC; linepath; VECTOR_MUL_LZERO;
6871              REAL_SUB_RZERO; VECTOR_MUL_LID; VECTOR_ADD_RID; REAL_POS] THEN
6872     AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
6873     REWRITE_TAC[CX_INJ] THEN ASM_REAL_ARITH_TAC]);;
6874
6875 let PATH_IMAGE_PARTCIRCLEPATH_SUBSET = prove
6876  (`!z r s t.
6877         &0 <= r /\ s <= t
6878         ==> path_image(partcirclepath(z,r,s,t)) SUBSET sphere(z,r)`,
6879   SIMP_TAC[PATH_IMAGE_PARTCIRCLEPATH] THEN
6880   SIMP_TAC[SUBSET; IN_ELIM_THM; IN_SPHERE; LEFT_IMP_EXISTS_THM] THEN
6881   REWRITE_TAC[NORM_ARITH `dist(z,z + a) = norm a`] THEN
6882   REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP; COMPLEX_NORM_CX;
6883               RE_MUL_II; IM_CX; REAL_NEG_0; REAL_EXP_0] THEN
6884   REAL_ARITH_TAC);;
6885
6886 let IN_PATH_IMAGE_PARTCIRCLEPATH = prove
6887  (`!z r s t w.
6888         &0 <= r /\ s <= t /\ w IN path_image(partcirclepath(z,r,s,t))
6889         ==> norm(w - z) = r`,
6890   MP_TAC PATH_IMAGE_PARTCIRCLEPATH_SUBSET THEN
6891   REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN
6892   REWRITE_TAC[SUBSET; IN_SPHERE; dist; NORM_SUB] THEN SET_TAC[]);;
6893
6894 let HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG = prove
6895  (`!f i z r s t B k.
6896         FINITE k /\
6897         (f has_path_integral i) (partcirclepath(z,r,s,t)) /\
6898         &0 <= B /\ &0 < r /\ s <= t /\
6899         (!x. x IN path_image(partcirclepath(z,r,s,t)) DIFF k
6900              ==> norm(f x) <= B)
6901         ==> norm(i) <= B * r * (t - s)`,
6902   let lemma1 = prove
6903    (`!b w. FINITE {z | norm(z) <= b /\ cexp(z) = w}`,
6904     REPEAT GEN_TAC THEN ASM_CASES_TAC `w = Cx(&0)` THEN
6905     ASM_REWRITE_TAC[CEXP_NZ; SET_RULE `{x | F} = {}`; FINITE_RULES] THEN
6906     FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP CEXP_CLOG) THEN
6907     REWRITE_TAC[CEXP_EQ] THEN
6908     REWRITE_TAC[SET_RULE
6909      `{z | P z /\ ?n. Q n /\ z = f n} = IMAGE f {n | Q n /\ P(f n)}`] THEN
6910     MATCH_MP_TAC FINITE_IMAGE THEN
6911     MATCH_MP_TAC FINITE_SUBSET THEN
6912     EXISTS_TAC `{n | integer n /\
6913                      norm(Cx(&2 * n * pi) * ii) <= b + norm(clog w)}` THEN
6914     CONJ_TAC THENL
6915      [ALL_TAC; SIMP_TAC[SUBSET; IN_ELIM_THM] THEN NORM_ARITH_TAC] THEN
6916     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
6917     REWRITE_TAC[REAL_MUL_RID; REAL_ABS_MUL; REAL_ABS_NUM; REAL_ABS_PI] THEN
6918     ASM_SIMP_TAC[REAL_MUL_ASSOC; GSYM REAL_LE_RDIV_EQ; PI_POS] THEN
6919     REWRITE_TAC[REAL_ARITH `&2 * x <= a <=> x <= a / &2`] THEN
6920     REWRITE_TAC[GSYM REAL_BOUNDS_LE; FINITE_INTSEG]) in
6921   let lemma2 = prove
6922    (`!a b. ~(a = Cx(&0)) ==> FINITE {z | norm(z) <= b /\ cexp(a * z) = w}`,
6923     REPEAT STRIP_TAC THEN MATCH_MP_TAC FINITE_SUBSET THEN
6924     EXISTS_TAC
6925      `IMAGE (\z. z / a) {z | norm(z) <= b * norm(a) /\ cexp(z) = w}` THEN
6926     SIMP_TAC[lemma1; FINITE_IMAGE] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
6927     REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN
6928     ASM_SIMP_TAC[COMPLEX_FIELD `~(a = Cx(&0)) ==> (x = y / a <=> a * x = y)`;
6929                  UNWIND_THM1; COMPLEX_NORM_MUL; REAL_LE_LMUL; NORM_POS_LE]) in
6930   REPEAT GEN_TAC THEN REWRITE_TAC[HAS_PATH_INTEGRAL] THEN STRIP_TAC THEN
6931   MP_TAC(ASSUME `s <= t`) THEN GEN_REWRITE_TAC LAND_CONV [REAL_LE_LT] THEN
6932   STRIP_TAC THENL
6933    [ALL_TAC;
6934     FIRST_X_ASSUM SUBST_ALL_TAC THEN
6935     REPEAT(POP_ASSUM MP_TAC) THEN
6936     REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH] THEN
6937     REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_LZERO; COMPLEX_MUL_RZERO] THEN
6938     SIMP_TAC[GSYM COMPLEX_VEC_0; HAS_INTEGRAL_0_EQ; NORM_0] THEN
6939     REAL_ARITH_TAC] THEN
6940   GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
6941   REWRITE_TAC[GSYM CONTENT_UNIT_1] THEN MATCH_MP_TAC HAS_INTEGRAL_BOUND THEN
6942   EXISTS_TAC `\x. if (partcirclepath(z,r,s,t) x) IN k then Cx(&0)
6943                   else f(partcirclepath(z,r,s,t) x) *
6944                        vector_derivative (partcirclepath(z,r,s,t)) (at x)` THEN
6945   ASM_SIMP_TAC[] THEN CONJ_TAC THENL
6946    [ASM_MESON_TAC[REAL_LE_MUL; REAL_POS; REAL_LT_IMP_LE; REAL_SUB_LE];
6947     ALL_TAC] THEN
6948   CONJ_TAC THENL
6949    [MATCH_MP_TAC HAS_INTEGRAL_SPIKE THEN
6950     EXISTS_TAC `\x. f(partcirclepath(z,r,s,t) x) *
6951                     vector_derivative (partcirclepath(z,r,s,t)) (at x)` THEN
6952     EXISTS_TAC `{x | x IN interval[vec 0,vec 1] /\
6953                      (partcirclepath(z,r,s,t) x) IN k}` THEN
6954     ASM_SIMP_TAC[IN_DIFF; IN_ELIM_THM; IMP_CONJ] THEN
6955     MATCH_MP_TAC NEGLIGIBLE_FINITE THEN
6956     MATCH_MP_TAC FINITE_FINITE_PREIMAGE_GENERAL THEN ASM_REWRITE_TAC[] THEN
6957     X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
6958     REWRITE_TAC[partcirclepath] THEN
6959     ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ; COMPLEX_FIELD
6960      `~(r = Cx(&0)) ==> (z + r * e = y <=> e = (y - z) / r)`] THEN
6961     REWRITE_TAC[linepath; COMPLEX_CMUL] THEN
6962     REWRITE_TAC[GSYM CX_MUL; GSYM CX_ADD] THEN
6963     REWRITE_TAC[REAL_ARITH `(&1 - t) * x + t * y = x + t * (y - x)`] THEN
6964     REWRITE_TAC[CX_ADD; COMPLEX_ADD_LDISTRIB; CEXP_ADD] THEN
6965     SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
6966      `~(e = Cx(&0)) ==> (e * x = y <=> x = y / e)`] THEN
6967     ABBREV_TAC `w = (y - z) / Cx r / cexp(ii * Cx s)` THEN
6968     REWRITE_TAC[CX_MUL; COMPLEX_RING
6969      `ii * Cx x * Cx(t - s) = (ii * Cx(t - s)) * Cx x`] THEN
6970     MATCH_MP_TAC FINITE_SUBSET THEN
6971     EXISTS_TAC
6972      `{x | Cx(drop x) IN
6973            {z | norm(z) <= &1 /\ cexp((ii * Cx(t - s)) * z) = w}}` THEN
6974     CONJ_TAC THENL
6975      [MATCH_MP_TAC FINITE_IMAGE_INJ THEN REWRITE_TAC[CX_INJ; DROP_EQ] THEN
6976       MATCH_MP_TAC lemma2 THEN
6977       REWRITE_TAC[COMPLEX_RING `ii * x = Cx(&0) <=> x = Cx(&0)`] THEN
6978       ASM_SIMP_TAC[CX_INJ; REAL_SUB_0; REAL_LT_IMP_NE];
6979       SIMP_TAC[SUBSET; IN_ELIM_THM; IN_INTERVAL_1; DROP_VEC] THEN
6980       SIMP_TAC[COMPLEX_NORM_CX] THEN REAL_ARITH_TAC];
6981     ALL_TAC] THEN
6982   X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
6983   COND_CASES_TAC THEN ASM_REWRITE_TAC[COMPLEX_NORM_0] THEN
6984   ASM_SIMP_TAC[REAL_LE_MUL; REAL_LT_IMP_LE; REAL_SUB_LE] THEN
6985   REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH] THEN
6986   REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
6987   REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_LID] THEN
6988   REWRITE_TAC[NORM_CEXP; RE_MUL_II; IM_LINEPATH_CX] THEN
6989   REWRITE_TAC[REAL_EXP_0; REAL_NEG_0; REAL_MUL_RID] THEN
6990   MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN CONJ_TAC THENL
6991    [FIRST_X_ASSUM MATCH_MP_TAC THEN
6992     REWRITE_TAC[path_image] THEN ASM SET_TAC[];
6993     ALL_TAC] THEN
6994   SIMP_TAC[REAL_LE_MUL; NORM_POS_LE; REAL_ABS_POS] THEN
6995   MATCH_MP_TAC REAL_LE_MUL2 THEN
6996   ASM_SIMP_TAC[NORM_POS_LE; GSYM CX_SUB; COMPLEX_NORM_CX] THEN
6997   ASM_REAL_ARITH_TAC);;
6998
6999 let HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH = prove
7000  (`!f i z r s t B.
7001         (f has_path_integral i) (partcirclepath(z,r,s,t)) /\
7002         &0 <= B /\ &0 < r /\ s <= t /\
7003         (!x. x IN path_image(partcirclepath(z,r,s,t))
7004              ==> norm(f x) <= B)
7005         ==> norm(i) <= B * r * (t - s)`,
7006   REPEAT STRIP_TAC THEN
7007   MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG THEN
7008   MAP_EVERY EXISTS_TAC
7009    [`f:complex->complex`; `z:complex`; `{}:complex->bool`] THEN
7010   ASM_REWRITE_TAC[FINITE_RULES; IN_DIFF; NOT_IN_EMPTY]);;
7011
7012 let PATH_INTEGRABLE_CONTINUOUS_PARTCIRCLEPATH = prove
7013  (`!f z r s t. f continuous_on path_image(partcirclepath(z,r,s,t))
7014                ==> f path_integrable_on (partcirclepath(z,r,s,t))`,
7015   REPEAT GEN_TAC THEN REWRITE_TAC[path_integrable_on; HAS_PATH_INTEGRAL] THEN
7016   REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH; GSYM integrable_on] THEN
7017   DISCH_TAC THEN MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
7018   MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC THENL
7019    [ONCE_REWRITE_TAC[GSYM o_DEF] THEN
7020     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
7021     ASM_REWRITE_TAC[GSYM path_image; ETA_AX] THEN
7022     MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON THEN
7023     ASM_REWRITE_TAC[GSYM valid_path; VALID_PATH_PARTCIRCLEPATH];
7024     ALL_TAC] THEN
7025   REWRITE_TAC[linepath] THEN
7026   REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
7027          REWRITE_TAC[CONTINUOUS_ON_CONST]) THEN
7028   ONCE_REWRITE_TAC[GSYM o_DEF] THEN
7029   MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
7030   REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
7031   REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
7032          REWRITE_TAC[CONTINUOUS_ON_CONST]) THEN
7033   REWRITE_TAC[VECTOR_ARITH `(&1 - x) % s + x % t = s + x % (t - s)`] THEN
7034   MATCH_MP_TAC CONTINUOUS_ON_ADD THEN REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
7035   MATCH_MP_TAC LINEAR_CONTINUOUS_ON THEN
7036   REWRITE_TAC[linear; DROP_ADD; DROP_CMUL; CX_ADD; COMPLEX_CMUL; CX_MUL;
7037               CX_SUB] THEN
7038   CONV_TAC COMPLEX_RING);;
7039
7040 let WINDING_NUMBER_PARTCIRCLEPATH_POS_LT = prove
7041  (`!r z s t w.
7042         s < t /\ norm(w - z) < r
7043         ==> &0 < Re(winding_number(partcirclepath(z,r,s,t),w))`,
7044   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_POS_LT THEN
7045   EXISTS_TAC `r * (t - s) * (r - norm(w - z:complex))` THEN
7046   FIRST_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
7047    `n < r ==> &0 <= n ==> &0 < r`)) THEN
7048   REWRITE_TAC[NORM_POS_LE] THEN DISCH_TAC THEN
7049   ASM_SIMP_TAC[REAL_LT_MUL; REAL_SUB_LT; VALID_PATH_PARTCIRCLEPATH] THEN
7050   ASM_REWRITE_TAC[VALID_PATH_PARTCIRCLEPATH] THEN CONJ_TAC THENL
7051    [ASM_MESON_TAC[IN_PATH_IMAGE_PARTCIRCLEPATH; REAL_LT_IMP_LE; REAL_LT_REFL];
7052     ALL_TAC] THEN
7053   X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
7054   REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH] THEN
7055   REWRITE_TAC[partcirclepath] THEN
7056   REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; IM_MUL_II; RE_MUL_CX; GSYM CX_SUB] THEN
7057   REWRITE_TAC[CNJ_ADD; CNJ_SUB; CNJ_MUL; CNJ_CX] THEN
7058   REWRITE_TAC[COMPLEX_RING
7059    `c * ((z + r * c') - w):complex = r * c * c' - c * (w - z)`] THEN
7060   REWRITE_TAC[COMPLEX_MUL_CNJ; NORM_CEXP; RE_MUL_II] THEN
7061   REWRITE_TAC[IM_LINEPATH_CX; REAL_NEG_0; REAL_EXP_0; COMPLEX_MUL_RID;
7062               COMPLEX_POW_2] THEN
7063   ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_SUB_LT; RE_SUB; RE_CX] THEN
7064   MATCH_MP_TAC(REAL_ARITH
7065    `norm(x) <= norm(y) /\ abs(Re(x)) <= norm(x)
7066     ==> r - norm(y) <= r - Re x`) THEN
7067   REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN
7068   REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP; RE_MUL_II; IM_LINEPATH_CX] THEN
7069   REWRITE_TAC[REAL_EXP_0; REAL_NEG_0; REAL_MUL_LID; GSYM CNJ_SUB] THEN
7070   REWRITE_TAC[COMPLEX_NORM_CNJ; REAL_LE_REFL]);;
7071
7072 let SIMPLE_PATH_PARTCIRCLEPATH = prove
7073  (`!z r s t. simple_path(partcirclepath(z,r,s,t)) <=>
7074                 ~(r = &0) /\ ~(s = t) /\ abs(s - t) <= &2 * pi`,
7075   let lemma = prove
7076    (`(!x y. (&0 <= x /\ x <= &1) /\ (&0 <= y /\ y <= &1) ==> P(abs(x - y))) <=>
7077      (!x. &0 <= x /\ x <= &1 ==> P x)`,
7078     MESON_TAC[REAL_ARITH `(&0 <= x /\ x <= &1) /\ (&0 <= y /\ y <= &1)
7079                           ==> &0 <= abs(x - y) /\ abs(x - y) <= &1`;
7080               REAL_ARITH `&0 <= &0 /\ &0 <= &1`;
7081               REAL_ARITH `(&0 <= x ==> abs(x - &0) = x)`]) in
7082   REPEAT GEN_TAC THEN REWRITE_TAC[simple_path; PATH_PARTCIRCLEPATH] THEN
7083   REWRITE_TAC[partcirclepath] THEN
7084   SIMP_TAC[COMPLEX_RING `z + r * x = z + r * y <=> r * (x - y) = Cx(&0)`] THEN
7085   REWRITE_TAC[COMPLEX_ENTIRE; CX_INJ] THEN
7086   ASM_CASES_TAC `r = &0` THEN ASM_REWRITE_TAC[] THENL
7087    [DISCH_THEN(MP_TAC o SPECL [`lift(&1 / &3)`; `lift(&1 / &2)`]) THEN
7088     REWRITE_TAC[IN_INTERVAL_1; LIFT_DROP; GSYM LIFT_NUM; LIFT_EQ] THEN
7089     CONV_TAC REAL_RAT_REDUCE_CONV;
7090     ALL_TAC] THEN
7091   ASM_CASES_TAC `s:real = t` THEN ASM_REWRITE_TAC[] THENL
7092    [DISCH_THEN(MP_TAC o SPECL [`lift(&1 / &3)`; `lift(&1 / &2)`]) THEN
7093     REWRITE_TAC[linepath; VECTOR_ARITH `(&1 - t) % x + t % x = x`] THEN
7094     REWRITE_TAC[IN_INTERVAL_1; LIFT_DROP; GSYM LIFT_NUM; LIFT_EQ] THEN
7095     CONV_TAC REAL_RAT_REDUCE_CONV THEN REWRITE_TAC[COMPLEX_SUB_0];
7096     ALL_TAC] THEN
7097   REWRITE_TAC[COMPLEX_SUB_0; CEXP_EQ] THEN
7098   REWRITE_TAC[COMPLEX_RING
7099    `ii * x = ii * y + z * ii <=> ii * (x - (y + z)) = Cx(&0)`] THEN
7100   REWRITE_TAC[COMPLEX_ENTIRE; II_NZ; LINEPATH_CX] THEN
7101   REWRITE_TAC[GSYM CX_SUB; GSYM CX_ADD; CX_INJ] THEN
7102   REWRITE_TAC[REAL_ARITH
7103    `((&1 - x) * s + x * t) - (((&1 - y) * s + y * t) + z) = &0 <=>
7104     (x - y) * (t - s) = z`] THEN
7105   REWRITE_TAC[GSYM DROP_EQ; DROP_VEC; IN_INTERVAL_1] THEN
7106   SIMP_TAC[REAL_ARITH
7107    `&0 <= x /\ x <= &1 /\ &0 <= y /\ y <= &1
7108     ==> (x = y \/ x = &0 /\ y = &1 \/ x = &1 /\ y = &0 <=>
7109          abs(x - y) = &0 \/ abs(x - y) = &1)`] THEN
7110   SIMP_TAC[PI_POS; REAL_FIELD
7111    `&0 < pi ==> (x = &2 * n * pi <=> n = x / (&2 * pi))`] THEN
7112   REWRITE_TAC[ONCE_REWRITE_RULE[CONJ_SYM] UNWIND_THM2] THEN
7113   ONCE_REWRITE_TAC[GSYM INTEGER_ABS] THEN
7114   REWRITE_TAC[GSYM FORALL_DROP; REAL_ABS_MUL; REAL_ABS_DIV] THEN
7115   REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_PI] THEN
7116   ONCE_REWRITE_TAC[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`] THEN
7117   REWRITE_TAC[lemma] THEN EQ_TAC THENL
7118    [DISCH_THEN(MP_TAC o SPEC `(&2 * pi) / abs(t - s)`) THEN
7119     ASM_SIMP_TAC[REAL_ABS_SUB; REAL_FIELD
7120      `~(s = t) ==> x / abs(s - t) * abs(s - t) = x`] THEN
7121     ASM_SIMP_TAC[PI_POS; INTEGER_CLOSED; REAL_FIELD
7122      `&0 < pi ==> (&2 * pi) / (&2 * pi) = &1`] THEN
7123     ASM_SIMP_TAC[REAL_EQ_LDIV_EQ; REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ;
7124                  GSYM REAL_ABS_NZ; REAL_SUB_0] THEN
7125     MP_TAC PI_POS THEN REAL_ARITH_TAC;
7126     DISCH_TAC THEN X_GEN_TAC `x:real` THEN REPEAT STRIP_TAC THEN
7127     FIRST_X_ASSUM(MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
7128        REAL_ABS_INTEGER_LEMMA)) THEN
7129     SIMP_TAC[REAL_ABS_DIV; REAL_ABS_MUL; REAL_ABS_ABS; REAL_ABS_NUM;
7130              REAL_ABS_PI] THEN
7131     SIMP_TAC[REAL_EQ_LDIV_EQ; REAL_LE_RDIV_EQ; PI_POS; REAL_LT_MUL;
7132              REAL_OF_NUM_LT; ARITH] THEN
7133     ASM_CASES_TAC `x = &0` THEN ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN
7134     ASM_REWRITE_TAC[REAL_ENTIRE; REAL_MUL_LID;
7135                     REAL_ARITH `abs(t - s) = &0 <=> s = t`] THEN
7136     DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
7137      `p <= x * abs(s - t)
7138       ==> abs(s - t) <= p ==> &1 * abs(s - t) <= x * abs(s - t)`)) THEN
7139     ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN ASM_REWRITE_TAC[] THEN
7140     ASM_SIMP_TAC[REAL_LE_RMUL_EQ; GSYM REAL_ABS_NZ; REAL_SUB_0] THEN
7141     ASM_REAL_ARITH_TAC]);;
7142
7143 let ARC_PARTCIRCLEPATH = prove
7144  (`!z r s t. ~(r = &0) /\ ~(s = t) /\ abs(s - t) < &2 * pi
7145              ==> arc(partcirclepath(z,r,s,t))`,
7146   REPEAT STRIP_TAC THEN REWRITE_TAC[arc; PATH_PARTCIRCLEPATH] THEN
7147   REWRITE_TAC[partcirclepath] THEN
7148   SIMP_TAC[COMPLEX_RING `z + r * x = z + r * y <=> r * (x - y) = Cx(&0)`] THEN
7149   ASM_REWRITE_TAC[COMPLEX_ENTIRE; CX_INJ] THEN
7150   REWRITE_TAC[COMPLEX_SUB_0; CEXP_EQ] THEN
7151   REWRITE_TAC[COMPLEX_RING
7152    `ii * x = ii * y + z * ii <=> ii * (x - (y + z)) = Cx(&0)`] THEN
7153   REWRITE_TAC[COMPLEX_ENTIRE; II_NZ; LINEPATH_CX] THEN
7154   REWRITE_TAC[GSYM CX_SUB; GSYM CX_ADD; CX_INJ] THEN
7155   REWRITE_TAC[REAL_ARITH
7156    `((&1 - x) * s + x * t) - (((&1 - y) * s + y * t) + z) = &0 <=>
7157     (x - y) * (t - s) = z`] THEN
7158   REPEAT GEN_TAC THEN DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
7159   FIRST_X_ASSUM(X_CHOOSE_THEN `n:real` MP_TAC) THEN
7160   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
7161   ASM_CASES_TAC `n = &0` THEN
7162   ASM_REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_ENTIRE; REAL_SUB_0;
7163                   DROP_EQ] THEN
7164   MP_TAC(SPEC `n:real` REAL_ABS_INTEGER_LEMMA) THEN
7165   ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
7166   ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN DISCH_THEN(K ALL_TAC) THEN
7167   MATCH_MP_TAC(REAL_ARITH `abs x < abs y ==> ~(x = y)`) THEN
7168   REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NUM; REAL_ABS_PI] THEN
7169   MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `&1 * &2 * pi` THEN
7170   CONJ_TAC THENL
7171    [ALL_TAC;
7172     ONCE_REWRITE_TAC[REAL_ARITH `&2 * n * pi = n * &2 * pi`] THEN
7173     MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN
7174     MP_TAC PI_POS THEN REAL_ARITH_TAC] THEN
7175   MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&1 * abs(t - s)` THEN
7176   CONJ_TAC THENL
7177    [ALL_TAC;
7178     ASM_REWRITE_TAC[REAL_MUL_LID] THEN ASM_MESON_TAC[REAL_ABS_SUB]] THEN
7179   MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN
7180   REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1])) THEN
7181   REWRITE_TAC[DROP_VEC] THEN REAL_ARITH_TAC);;
7182
7183 (* ------------------------------------------------------------------------- *)
7184 (* Special case of one complete circle.                                      *)
7185 (* ------------------------------------------------------------------------- *)
7186
7187 let circlepath = new_definition
7188  `circlepath(z,r) = partcirclepath(z,r,&0,&2 * pi)`;;
7189
7190 let CIRCLEPATH = prove
7191  (`circlepath(z,r) = \x. z + Cx(r) * cexp(Cx(&2) * Cx pi * ii * Cx(drop x))`,
7192   REWRITE_TAC[circlepath; partcirclepath; linepath; COMPLEX_CMUL] THEN
7193   REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_LID] THEN
7194   REWRITE_TAC[CX_MUL; COMPLEX_MUL_AC]);;
7195
7196 let PATHSTART_CIRCLEPATH = prove
7197  (`!r z. pathstart(circlepath(z,r)) = z + Cx(r)`,
7198   REWRITE_TAC[circlepath; PATHSTART_PARTCIRCLEPATH] THEN
7199   REWRITE_TAC[COMPLEX_MUL_RZERO; CEXP_0; COMPLEX_MUL_RID]);;
7200
7201 let PATHFINISH_CIRCLEPATH = prove
7202  (`!r z. pathfinish(circlepath(z,r)) = z + Cx(r)`,
7203   REWRITE_TAC[circlepath; PATHFINISH_PARTCIRCLEPATH] THEN
7204   REWRITE_TAC[CEXP_EULER; GSYM CX_COS; GSYM CX_SIN] THEN
7205   REWRITE_TAC[SIN_NPI; COS_NPI; REAL_POW_NEG; ARITH; REAL_POW_ONE] THEN
7206   CONV_TAC COMPLEX_RING);;
7207
7208 let HAS_VECTOR_DERIVATIVE_CIRCLEPATH = prove
7209  (`((circlepath (z,r)) has_vector_derivative
7210     (Cx(&2) * Cx(pi) * ii * Cx(r) * cexp(Cx(&2) * Cx pi * ii * Cx(drop x))))
7211    (at x)`,
7212   REWRITE_TAC[CIRCLEPATH] THEN
7213   MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_REAL_COMPLEX THEN
7214   COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING);;
7215
7216 let VECTOR_DERIVATIVE_CIRCLEPATH = prove
7217  (`vector_derivative (circlepath (z,r)) (at x) =
7218         Cx(&2) * Cx(pi) * ii * Cx(r) * cexp(Cx(&2) * Cx pi * ii * Cx(drop x))`,
7219   MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
7220   REWRITE_TAC[HAS_VECTOR_DERIVATIVE_CIRCLEPATH]);;
7221
7222 let VALID_PATH_CIRCLEPATH = prove
7223  (`!z r. valid_path (circlepath(z,r))`,
7224   REWRITE_TAC[circlepath; VALID_PATH_PARTCIRCLEPATH]);;
7225
7226 let PATH_IMAGE_CIRCLEPATH = prove
7227  (`!z r. &0 <= r ==> path_image (circlepath(z,r)) = sphere(z,r)`,
7228   REPEAT STRIP_TAC THEN REWRITE_TAC[CIRCLEPATH; path_image] THEN
7229   REWRITE_TAC[sphere; NORM_ARITH `dist(w,z) = norm(z - w)`] THEN
7230   MATCH_MP_TAC SUBSET_ANTISYM THEN REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
7231   REWRITE_TAC[IN_ELIM_THM; COMPLEX_RING `(z + r) - z = r:complex`] THEN
7232   REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP] THEN CONJ_TAC THENL
7233    [ONCE_REWRITE_TAC[COMPLEX_RING
7234      `Cx(&2) * p * i * z = (Cx(&2) * p * z) * i`] THEN
7235     REWRITE_TAC[RE_MUL_II; GSYM CX_MUL; IM_CX] THEN
7236     REWRITE_TAC[REAL_EXP_NEG; REAL_EXP_0; REAL_MUL_RID; COMPLEX_NORM_CX] THEN
7237     POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
7238     ALL_TAC] THEN
7239   X_GEN_TAC `x:complex` THEN DISCH_TAC THEN ABBREV_TAC `w:complex = x - z` THEN
7240   FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP (COMPLEX_RING
7241    `x - z = w:complex ==> x = z + w`)) THEN
7242   REWRITE_TAC[IN_IMAGE; COMPLEX_RING `z + a = z + b:complex <=> a = b`] THEN
7243   ASM_CASES_TAC `w = Cx(&0)` THENL
7244    [UNDISCH_THEN `norm(w:complex) = r` (MP_TAC o SYM) THEN
7245     ASM_REWRITE_TAC[COMPLEX_NORM_0; REAL_ABS_ZERO] THEN
7246     DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[COMPLEX_MUL_LZERO] THEN
7247     REWRITE_TAC[MEMBER_NOT_EMPTY; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
7248     REWRITE_TAC[REAL_NOT_LT; REAL_POS];
7249     ALL_TAC] THEN
7250   MP_TAC(SPECL [`Re(w / Cx(norm w))`; `Im(w / Cx(norm w))`]
7251     SINCOS_TOTAL_2PI) THEN
7252   REWRITE_TAC[GSYM COMPLEX_SQNORM] THEN
7253   REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NORM] THEN
7254   ASM_SIMP_TAC[REAL_DIV_REFL; REAL_POW_ONE; COMPLEX_NORM_ZERO] THEN
7255   DISCH_THEN(X_CHOOSE_THEN `t:real` (STRIP_ASSUME_TAC o GSYM)) THEN
7256   EXISTS_TAC `lift(t / (&2 * pi))` THEN
7257   ONCE_REWRITE_TAC[COMPLEX_RING
7258      `Cx(&2) * p * i * z = i * (Cx(&2) * p * z)`] THEN
7259   REWRITE_TAC[CEXP_EULER; LIFT_DROP; CX_DIV; CX_MUL] THEN
7260   ASM_SIMP_TAC[CX_PI_NZ; COMPLEX_FIELD
7261    `~(p = Cx(&0)) ==> Cx(&2) * p * t / (Cx(&2) * p) = t`] THEN
7262   ASM_REWRITE_TAC[GSYM CX_COS; GSYM CX_SIN] THEN CONJ_TAC THENL
7263    [REWRITE_TAC[complex_div; GSYM CX_INV] THEN
7264     REWRITE_TAC[SIMPLE_COMPLEX_ARITH `Re(w * Cx x) = Re(w) * x`;
7265                 SIMPLE_COMPLEX_ARITH `Im(w * Cx x) = Im(w) * x`] THEN
7266     REWRITE_TAC[COMPLEX_ADD_LDISTRIB; GSYM CX_MUL] THEN
7267     SUBGOAL_THEN `!z:real. r * z * inv r = z` MP_TAC THENL
7268      [SUBGOAL_THEN `~(r = &0)` MP_TAC THENL [ALL_TAC; CONV_TAC REAL_FIELD] THEN
7269       ASM_MESON_TAC[COMPLEX_NORM_ZERO];
7270       ONCE_REWRITE_TAC[COMPLEX_RING `t * ii * s = ii * t * s`] THEN
7271       SIMP_TAC[GSYM CX_MUL; GSYM COMPLEX_EXPAND]];
7272     REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; LIFT_DROP] THEN
7273     ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_LT_MUL;
7274                  PI_POS; REAL_OF_NUM_LT; ARITH] THEN
7275     ASM_REAL_ARITH_TAC]);;
7276
7277 let HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH_STRONG = prove
7278  (`!f i z r B k.
7279         FINITE k /\
7280         (f has_path_integral i) (circlepath(z,r)) /\
7281         &0 <= B /\ &0 < r /\
7282         (!x. norm(x - z) = r /\ ~(x IN k) ==> norm(f x) <= B)
7283         ==> norm(i) <= B * (&2 * pi * r)`,
7284   REWRITE_TAC[circlepath] THEN REPEAT STRIP_TAC THEN
7285   SUBST1_TAC(REAL_ARITH `B * (&2 * pi * r) = B * r * (&2 * pi - &0)`) THEN
7286   MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG THEN
7287   MAP_EVERY EXISTS_TAC
7288    [`f:complex->complex`; `z:complex`; `k:complex->bool`] THEN
7289   ASM_SIMP_TAC[REAL_LE_MUL; REAL_POS; REAL_LT_IMP_LE; PI_POS; IN_DIFF] THEN
7290   ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; GSYM circlepath; REAL_LT_IMP_LE] THEN
7291   ASM_REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(w,z) = norm(z - w)`]);;
7292
7293 let HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH = prove
7294  (`!f i z r B.
7295         (f has_path_integral i) (circlepath(z,r)) /\
7296         &0 <= B /\ &0 < r /\ (!x. norm(x - z) = r ==> norm(f x) <= B)
7297         ==> norm(i) <= B * (&2 * pi * r)`,
7298   REWRITE_TAC[circlepath] THEN REPEAT STRIP_TAC THEN
7299   SUBST1_TAC(REAL_ARITH `B * (&2 * pi * r) = B * r * (&2 * pi - &0)`) THEN
7300   MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH THEN
7301   MAP_EVERY EXISTS_TAC [`f:complex->complex`; `z:complex`] THEN
7302   ASM_SIMP_TAC[REAL_LE_MUL; REAL_POS; REAL_LT_IMP_LE; PI_POS] THEN
7303   ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; GSYM circlepath; REAL_LT_IMP_LE] THEN
7304   ASM_REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(w,z) = norm(z - w)`]);;
7305
7306 let PATH_INTEGRABLE_CONTINUOUS_CIRCLEPATH = prove
7307  (`!f z r. f continuous_on path_image(circlepath(z,r))
7308            ==> f path_integrable_on (circlepath(z,r))`,
7309   SIMP_TAC[PATH_INTEGRABLE_CONTINUOUS_PARTCIRCLEPATH; circlepath]);;
7310
7311 let SIMPLE_PATH_CIRCLEPATH = prove
7312  (`!z r. simple_path(circlepath(z,r)) <=> ~(r = &0)`,
7313   REWRITE_TAC[circlepath; SIMPLE_PATH_PARTCIRCLEPATH] THEN
7314   MP_TAC PI_POS THEN REAL_ARITH_TAC);;
7315
7316 let WINDING_NUMBER_CIRCLEPATH = prove
7317  (`!z r w. norm(w - z) < r ==> winding_number(circlepath(z,r),w) = Cx(&1)`,
7318   REPEAT STRIP_TAC THEN
7319   MATCH_MP_TAC SIMPLE_CLOSED_PATH_WINDING_NUMBER_POS THEN
7320   REWRITE_TAC[SIMPLE_PATH_CIRCLEPATH;
7321               PATHSTART_CIRCLEPATH; PATHFINISH_CIRCLEPATH; CONJ_ASSOC] THEN
7322   CONJ_TAC THENL
7323    [FIRST_X_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
7324      `n < r ==> (&0 <= n ==> &0 <= r /\ &0 < r) /\ n < r`)) THEN
7325     SIMP_TAC[NORM_POS_LE; PATH_IMAGE_CIRCLEPATH; IN_ELIM_THM] THEN
7326     ASM_REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(w,z) = norm(z - w)`] THEN
7327     REAL_ARITH_TAC;
7328     REWRITE_TAC[circlepath] THEN
7329     MATCH_MP_TAC WINDING_NUMBER_PARTCIRCLEPATH_POS_LT THEN
7330     ASM_SIMP_TAC[REAL_LT_MUL; PI_POS; REAL_OF_NUM_LT; ARITH]]);;
7331
7332 (* ------------------------------------------------------------------------- *)
7333 (* Hence the Cauchy formula for points inside a circle.                      *)
7334 (* ------------------------------------------------------------------------- *)
7335
7336 let CAUCHY_INTEGRAL_CIRCLEPATH = prove
7337  (`!f z r w.
7338         f continuous_on cball(z,r) /\
7339         f holomorphic_on ball(z,r) /\
7340         w IN ball(z,r)
7341         ==> ((\u. f(u) / (u - w)) has_path_integral
7342              (Cx(&2) * Cx(pi) * ii * f(w))) (circlepath(z,r))`,
7343   REPEAT STRIP_TAC THEN
7344   MP_TAC(SPECL [`f:complex->complex`; `cball(z:complex,r)`;
7345                 `{}:complex->bool`; `circlepath(z,r)`; `w:complex`]
7346                CAUCHY_INTEGRAL_FORMULA_WEAK) THEN
7347   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
7348   ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[dist] THEN DISCH_TAC THEN
7349   ASM_SIMP_TAC[WINDING_NUMBER_CIRCLEPATH; COMPLEX_MUL_LID] THEN
7350   DISCH_THEN MATCH_MP_TAC THEN
7351   ASM_REWRITE_TAC[VALID_PATH_CIRCLEPATH; PATHSTART_CIRCLEPATH; FINITE_RULES;
7352        PATHFINISH_CIRCLEPATH; CONVEX_CBALL; INTERIOR_CBALL; DIFF_EMPTY] THEN
7353   REWRITE_TAC[complex_differentiable] THEN
7354   CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL]; ALL_TAC] THEN
7355   FIRST_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
7356    `n < r ==> &0 <= n ==> &0 <= r`)) THEN
7357   SIMP_TAC[NORM_POS_LE; PATH_IMAGE_CIRCLEPATH] THEN
7358   REWRITE_TAC[SET_RULE `s SUBSET c DELETE q <=> s SUBSET c /\ ~(q IN s)`] THEN
7359   REWRITE_TAC[SPHERE_SUBSET_CBALL; IN_SPHERE] THEN
7360   UNDISCH_TAC `norm(w - z:complex) < r` THEN CONV_TAC NORM_ARITH);;
7361
7362 let CAUCHY_INTEGRAL_CIRCLEPATH_SIMPLE = prove
7363  (`!f z r w.
7364         f holomorphic_on cball(z,r) /\ w IN ball(z,r)
7365         ==> ((\u. f(u) / (u - w)) has_path_integral
7366              (Cx(&2) * Cx(pi) * ii * f(w))) (circlepath(z,r))`,
7367   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_INTEGRAL_CIRCLEPATH THEN
7368   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
7369   ASM_MESON_TAC[BALL_SUBSET_CBALL; HOLOMORPHIC_ON_SUBSET]);;
7370
7371 (* ------------------------------------------------------------------------- *)
7372 (* Uniform convergence of path integral when the derivative of the path is   *)
7373 (* bounded, and in particular for the special case of a circle.              *)
7374 (* ------------------------------------------------------------------------- *)
7375
7376 let PATH_INTEGRAL_UNIFORM_LIMIT = prove
7377  (`!net f B g l.
7378      ~(trivial_limit net) /\ valid_path g /\
7379      (!t. t IN interval[vec 0,vec 1]
7380           ==> norm(vector_derivative g (at t)) <= B) /\
7381      eventually (\n:A. (f n) path_integrable_on g) net /\
7382      (!e. &0 < e
7383           ==> eventually (\n. !x. x IN path_image g
7384                                   ==> norm(f n x - l x) < e) net)
7385      ==> l path_integrable_on g /\
7386          ((\n. path_integral g (f n)) --> path_integral g l) net`,
7387   REPEAT GEN_TAC THEN STRIP_TAC THEN
7388   MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
7389    [REWRITE_TAC[path_integrable_on; HAS_PATH_INTEGRAL; GSYM integrable_on] THEN
7390     MATCH_MP_TAC INTEGRABLE_UNIFORM_LIMIT THEN
7391     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
7392     FIRST_X_ASSUM(MP_TAC o SPEC `e / (abs B + &1)`) THEN
7393     ASM_SIMP_TAC[REAL_LT_DIV; REAL_ARITH `&0 < abs B + &1`] THEN
7394     UNDISCH_TAC `eventually (\n:A. (f n) path_integrable_on g) net` THEN
7395     REWRITE_TAC[IMP_IMP; GSYM EVENTUALLY_AND] THEN
7396     DISCH_THEN(MP_TAC o MATCH_MP EVENTUALLY_HAPPENS) THEN
7397     ASM_REWRITE_TAC[path_image; path_integrable_on; FORALL_IN_IMAGE] THEN
7398     REWRITE_TAC[HAS_PATH_INTEGRAL; GSYM integrable_on] THEN
7399     DISCH_THEN(X_CHOOSE_THEN `a:A` STRIP_ASSUME_TAC) THEN
7400     EXISTS_TAC `\x. f (a:A) (g x) * vector_derivative g (at x)` THEN
7401     ASM_REWRITE_TAC[GSYM COMPLEX_SUB_RDISTRIB] THEN
7402     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
7403     MATCH_MP_TAC REAL_LE_TRANS THEN
7404     EXISTS_TAC `e / (abs B + &1) * B` THEN CONJ_TAC THENL
7405      [REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
7406       ASM_SIMP_TAC[NORM_POS_LE] THEN ONCE_REWRITE_TAC[NORM_SUB] THEN
7407       ASM_SIMP_TAC[REAL_LT_IMP_LE];
7408       REWRITE_TAC[REAL_ARITH `e / x * B <= e <=> &0 <= e * (&1 - B / x)`] THEN
7409       MATCH_MP_TAC REAL_LE_MUL THEN
7410       ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_SUB_LE; REAL_LE_LDIV_EQ;
7411                    REAL_ARITH `&0 < abs B + &1`] THEN
7412       REAL_ARITH_TAC];
7413     ALL_TAC] THEN
7414   DISCH_TAC THEN ONCE_REWRITE_TAC[LIM_NULL] THEN REWRITE_TAC[tendsto] THEN
7415   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
7416   FIRST_X_ASSUM(MP_TAC o SPEC `e / &2 / (abs B + &1)`) THEN
7417   ASM_SIMP_TAC[REAL_LT_DIV; REAL_ARITH `&0 < abs B + &1`; REAL_HALF] THEN
7418   UNDISCH_TAC `eventually (\n:A. (f n) path_integrable_on g) net` THEN
7419   REWRITE_TAC[IMP_IMP; GSYM EVENTUALLY_AND] THEN
7420   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
7421   X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
7422   ASM_SIMP_TAC[PATH_INTEGRAL_INTEGRAL; DIST_0; GSYM INTEGRAL_SUB;
7423                GSYM PATH_INTEGRABLE_ON; ETA_AX] THEN
7424   MATCH_MP_TAC REAL_LET_TRANS THEN
7425   EXISTS_TAC
7426    `drop(integral (interval[vec 0,vec 1]) (\x:real^1. lift(e / &2)))` THEN
7427   CONJ_TAC THENL
7428    [MATCH_MP_TAC INTEGRAL_NORM_BOUND_INTEGRAL THEN
7429     ASM_SIMP_TAC[INTEGRABLE_SUB; GSYM PATH_INTEGRABLE_ON; ETA_AX] THEN
7430     REWRITE_TAC[INTEGRABLE_CONST; GSYM COMPLEX_SUB_RDISTRIB; LIFT_DROP] THEN
7431     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
7432     EXISTS_TAC `e / &2 / (abs B + &1) * B` THEN CONJ_TAC THENL
7433      [REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
7434       ASM_SIMP_TAC[NORM_POS_LE] THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
7435       FIRST_X_ASSUM MATCH_MP_TAC THEN
7436       REWRITE_TAC[IN_IMAGE; path_image] THEN ASM_MESON_TAC[];
7437       REWRITE_TAC[REAL_ARITH `e / x * B <= e <=> &0 <= e * (&1 - B / x)`] THEN
7438       MATCH_MP_TAC REAL_LE_MUL THEN
7439       ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_SUB_LE; REAL_LE_LDIV_EQ;
7440                    REAL_ARITH `&0 < abs B + &1`] THEN
7441       ASM_REAL_ARITH_TAC];
7442     REWRITE_TAC[INTEGRAL_CONST; CONTENT_UNIT_1; VECTOR_MUL_LID; LIFT_DROP] THEN
7443     ASM_REAL_ARITH_TAC]);;
7444
7445 let PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH = prove
7446  (`!net f l z r.
7447      &0 < r /\ ~(trivial_limit net) /\
7448      eventually (\n:A. (f n) path_integrable_on circlepath(z,r)) net /\
7449      (!e. &0 < e
7450           ==> eventually (\n. !x. x IN path_image (circlepath(z,r))
7451                                   ==> norm(f n x - l x) < e) net)
7452      ==> l path_integrable_on circlepath(z,r) /\
7453          ((\n. path_integral (circlepath(z,r)) (f n))
7454           --> path_integral (circlepath(z,r)) l) net`,
7455   REPEAT GEN_TAC THEN STRIP_TAC THEN
7456   MATCH_MP_TAC PATH_INTEGRAL_UNIFORM_LIMIT THEN EXISTS_TAC `&2 * pi * r` THEN
7457   ASM_SIMP_TAC[PI_POS; REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
7458   REWRITE_TAC[VALID_PATH_CIRCLEPATH; VECTOR_DERIVATIVE_CIRCLEPATH] THEN
7459   REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
7460   REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_PI; REAL_MUL_LID] THEN
7461   REWRITE_TAC[NORM_CEXP; RE_MUL_CX; RE_MUL_II; IM_CX] THEN
7462   REWRITE_TAC[REAL_NEG_0; REAL_MUL_RZERO; REAL_EXP_0; REAL_MUL_RID] THEN
7463   ASM_SIMP_TAC[real_abs; REAL_LE_REFL; REAL_LT_IMP_LE]);;
7464
7465 (* ------------------------------------------------------------------------- *)
7466 (* General stepping result for derivative formulas.                          *)
7467 (* ------------------------------------------------------------------------- *)
7468
7469 let CAUCHY_NEXT_DERIVATIVE = prove
7470  (`!f' f g s k B.
7471      ~(k = 0) /\
7472      open s /\ valid_path g /\
7473      (!t. t IN interval[vec 0,vec 1]
7474           ==> norm(vector_derivative g (at t)) <= B) /\
7475      f' continuous_on path_image g /\
7476      (!w. w IN s DIFF path_image g
7477           ==> ((\u. f'(u) / (u - w) pow k) has_path_integral f w) g)
7478      ==> !w. w IN s DIFF path_image g
7479              ==> (\u. f'(u) / (u - w) pow (k + 1)) path_integrable_on g /\
7480                  (f has_complex_derivative
7481                   (Cx(&k) * path_integral g (\u. f'(u) / (u - w) pow (k + 1))))
7482                   (at w)`,
7483   REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `w:complex` THEN
7484   REWRITE_TAC[IN_DIFF] THEN STRIP_TAC THEN
7485   MP_TAC(ISPEC `s DIFF path_image(g:real^1->complex)`
7486         OPEN_CONTAINS_BALL) THEN
7487   ASM_SIMP_TAC[OPEN_DIFF; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
7488   DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
7489   ASM_REWRITE_TAC[IN_DIFF] THEN
7490   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
7491   MP_TAC(ISPECL
7492    [`at(w:complex)`;
7493     `\u x:complex. f'(x) * (inv(x - u) pow k - inv(x - w) pow k) /
7494                    (u - w) / Cx(&k)`;
7495     `B:real`; `g:real^1->complex`;
7496     `\u. f'(u) / (u - w) pow (k + 1)`]
7497         PATH_INTEGRAL_UNIFORM_LIMIT) THEN
7498   REWRITE_TAC[] THEN ANTS_TAC THENL
7499    [ALL_TAC;
7500     MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
7501     DISCH_THEN(MP_TAC o SPEC `Cx(&k)` o MATCH_MP LIM_COMPLEX_LMUL) THEN
7502     REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT] THEN
7503     MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
7504                   LIM_TRANSFORM_AT) THEN
7505     EXISTS_TAC `d:real` THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `u:complex` THEN
7506     REWRITE_TAC[dist] THEN STRIP_TAC THEN
7507     SUBGOAL_THEN `~(u:complex = w)` ASSUME_TAC THENL
7508      [ASM_MESON_TAC[COMPLEX_SUB_0; COMPLEX_NORM_0; REAL_LT_REFL]; ALL_TAC] THEN
7509     ASM_SIMP_TAC[CX_INJ; REAL_OF_NUM_EQ; COMPLEX_FIELD
7510      `~(y = Cx(&0)) ==> (y * x = z <=> x = z / y)`] THEN
7511     ASM_SIMP_TAC[COMPLEX_SUB_0; CX_INJ; REAL_OF_NUM_EQ; COMPLEX_SUB_LDISTRIB;
7512            COMPLEX_FIELD `~(c = Cx(&0)) ==> (a - b) / c = a / c - b / c`] THEN
7513     MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
7514     MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
7515     REWRITE_TAC[complex_div; COMPLEX_MUL_ASSOC] THEN
7516     REWRITE_TAC[GSYM complex_div] THEN
7517     CONJ_TAC THEN REPEAT(MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_DIV) THEN
7518     REWRITE_TAC[GSYM complex_div; COMPLEX_POW_INV] THEN
7519     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
7520     FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
7521     ASM_REWRITE_TAC[IN_BALL; dist; VECTOR_SUB_REFL; NORM_0] THEN
7522     ASM_MESON_TAC[NORM_SUB]] THEN
7523   ASM_REWRITE_TAC[TRIVIAL_LIMIT_AT] THEN CONJ_TAC THENL
7524    [REWRITE_TAC[EVENTUALLY_AT] THEN EXISTS_TAC `d:real` THEN
7525     ASM_REWRITE_TAC[] THEN X_GEN_TAC `u:complex` THEN
7526     REWRITE_TAC[dist] THEN STRIP_TAC THEN
7527     REWRITE_TAC[complex_div; COMPLEX_MUL_ASSOC] THEN
7528     REPEAT(MATCH_MP_TAC PATH_INTEGRABLE_COMPLEX_RMUL) THEN
7529     REWRITE_TAC[COMPLEX_SUB_LDISTRIB; COMPLEX_POW_INV; GSYM complex_div] THEN
7530     MATCH_MP_TAC PATH_INTEGRABLE_SUB THEN
7531     REWRITE_TAC[path_integrable_on] THEN CONJ_TAC THENL
7532      [EXISTS_TAC `(f:complex->complex) u`;
7533       EXISTS_TAC `(f:complex->complex) w`] THEN
7534     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
7535     FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
7536     REWRITE_TAC[IN_BALL; dist; VECTOR_SUB_REFL; NORM_0] THEN
7537     ASM_MESON_TAC[NORM_SUB];
7538     ALL_TAC] THEN
7539   SUBGOAL_THEN
7540    `!e. &0 < e
7541      ==> eventually
7542          (\n. !x. x IN path_image g
7543                   ==> norm
7544                       ((inv (x - n) pow k - inv (x - w) pow k) /
7545                        (n - w) / Cx(&k) - inv(x - w) pow (k + 1)) <
7546                       e)
7547          (at w)`
7548   ASSUME_TAC THENL
7549    [ALL_TAC;
7550     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
7551     SUBGOAL_THEN `bounded(IMAGE (f':complex->complex) (path_image g))`
7552     MP_TAC THENL
7553      [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
7554       MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
7555       ASM_SIMP_TAC[COMPACT_VALID_PATH_IMAGE];
7556       ALL_TAC] THEN
7557     REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
7558     DISCH_THEN(X_CHOOSE_THEN `C:real` STRIP_ASSUME_TAC) THEN
7559     FIRST_X_ASSUM(MP_TAC o SPEC `e / C:real`) THEN
7560     ASM_SIMP_TAC[REAL_LT_DIV] THEN
7561     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
7562     X_GEN_TAC `u:complex` THEN REWRITE_TAC[] THEN
7563     MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `x:complex` THEN
7564     DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
7565     ASM_REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC] THEN
7566     REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB; COMPLEX_NORM_MUL] THEN
7567     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_SIMP_TAC[REAL_LT_RDIV_EQ] THEN
7568     MATCH_MP_TAC(REAL_ARITH `a <= b ==> b < x ==> a < x`) THEN
7569     REWRITE_TAC[COMPLEX_POW_INV] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
7570     ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE]] THEN
7571   X_GEN_TAC `e:real` THEN DISCH_TAC THEN REWRITE_TAC[EVENTUALLY_AT] THEN
7572   EXISTS_TAC `min (d / &2) ((e * (d / &2) pow (k + 2)) / (&k + &1))` THEN
7573   ASM_SIMP_TAC[REAL_LT_MIN; REAL_HALF; REAL_POW_LT; REAL_LT_MUL; dist;
7574                REAL_LT_DIV; REAL_ARITH `&0 < &k + &1`] THEN
7575   X_GEN_TAC `u:complex` THEN STRIP_TAC THEN
7576   X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
7577   MP_TAC(ISPECL [`\n w. if n = 0 then inv(x - w) pow k
7578                         else if n = 1 then Cx(&k) / (x - w) pow (k + 1)
7579                         else (Cx(&k) * Cx(&k + &1)) / (x - w) pow (k + 2)`;
7580                  `1`; `ball(w:complex,d / &2)`;
7581                  `(&k * (&k + &1)) / (d / &2) pow (k + 2)`]
7582          COMPLEX_TAYLOR) THEN
7583   REWRITE_TAC[] THEN ANTS_TAC THENL
7584    [REWRITE_TAC[CONVEX_BALL; ADD_EQ_0; ARITH] THEN CONJ_TAC THENL
7585      [ALL_TAC;
7586       X_GEN_TAC `v:complex` THEN REWRITE_TAC[IN_BALL; dist] THEN DISCH_TAC THEN
7587       REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_CX]THEN
7588       REWRITE_TAC[real_div; GSYM REAL_POW_INV; GSYM REAL_MUL_ASSOC] THEN
7589       REWRITE_TAC[REAL_ABS_NUM; REAL_ARITH `abs(&k + &1) = &k + &1`] THEN
7590       REPEAT(MATCH_MP_TAC REAL_LE_LMUL THEN
7591              CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC]) THEN
7592       REWRITE_TAC[REAL_POW_INV] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
7593       ASM_SIMP_TAC[GSYM real_div; REAL_POW_LT; REAL_HALF] THEN
7594       REWRITE_TAC[COMPLEX_NORM_POW] THEN MATCH_MP_TAC REAL_POW_LE2 THEN
7595       ASM_SIMP_TAC[REAL_ARITH `&0 < d ==> &0 <= d / &2`] THEN
7596       UNDISCH_TAC `ball(w:complex,d) SUBSET s DIFF path_image g` THEN
7597       REWRITE_TAC[SUBSET] THEN DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
7598       ASM_REWRITE_TAC[IN_DIFF; IN_BALL] THEN
7599       UNDISCH_TAC `norm(w - v:complex) < d / &2` THEN
7600       CONV_TAC NORM_ARITH] THEN
7601     GEN_TAC THEN X_GEN_TAC `y:complex` THEN
7602     REWRITE_TAC[IN_BALL; dist] THEN STRIP_TAC THEN
7603     SUBGOAL_THEN `~(y:complex = x)` ASSUME_TAC THENL
7604      [DISCH_THEN SUBST_ALL_TAC THEN
7605       UNDISCH_TAC `ball(w:complex,d) SUBSET s DIFF path_image g` THEN
7606       REWRITE_TAC[SUBSET] THEN DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
7607       ASM_REWRITE_TAC[IN_DIFF; IN_BALL; dist] THEN ASM_REAL_ARITH_TAC;
7608       ALL_TAC] THEN
7609     FIRST_X_ASSUM(DISJ_CASES_THEN SUBST_ALL_TAC o MATCH_MP
7610       (ARITH_RULE `i <= 1 ==> i = 0 \/ i = 1`)) THEN
7611     REWRITE_TAC[ARITH] THEN
7612     MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
7613     COMPLEX_DIFF_TAC THEN
7614     REWRITE_TAC[COMPLEX_POW_EQ_0; COMPLEX_INV_EQ_0; CONJ_ASSOC;
7615        COMPLEX_MUL_LZERO; COMPLEX_SUB_0; ADD_EQ_0; ARITH] THEN
7616     REWRITE_TAC[COMPLEX_SUB_LZERO; COMPLEX_NEG_NEG; complex_div] THEN
7617     REWRITE_TAC[COMPLEX_MUL_LID; GSYM COMPLEX_MUL_ASSOC;
7618      GSYM COMPLEX_POW_INV; GSYM COMPLEX_INV_MUL; GSYM COMPLEX_POW_ADD] THEN
7619     ASM_SIMP_TAC[ARITH_RULE `~(k = 0) ==> k - 1 + 2 = k + 1`] THEN
7620     REWRITE_TAC[COMPLEX_INV_INV; ADD_SUB; COMPLEX_MUL_RNEG;
7621                 COMPLEX_NEG_NEG; COMPLEX_MUL_RID; COMPLEX_POW_POW] THEN
7622     REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; GSYM REAL_OF_NUM_ADD] THEN
7623     AP_TERM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[COMPLEX_POW_INV] THEN
7624     ASM_SIMP_TAC[COMPLEX_POW_EQ_0; COMPLEX_INV_EQ_0; COMPLEX_SUB_0;
7625                  COMPLEX_FIELD `~(x = Cx(&0)) /\ ~(y = Cx(&0))
7626                                 ==> (z * inv x = inv y <=> y * z = x)`] THEN
7627     REWRITE_TAC[GSYM COMPLEX_POW_ADD] THEN AP_TERM_TAC THEN ARITH_TAC;
7628     ALL_TAC] THEN
7629   DISCH_THEN(MP_TAC o SPECL [`w:complex`; `u:complex`]) THEN
7630   ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_HALF; NUMSEG_CONV `0..1`] THEN
7631   ASM_SIMP_TAC[IN_BALL; dist; VSUM_CLAUSES; FINITE_RULES] THEN
7632   ANTS_TAC THENL [ASM_MESON_TAC[NORM_SUB]; ALL_TAC] THEN
7633   REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; ARITH] THEN
7634   REWRITE_TAC[complex_pow; VECTOR_ADD_RID; ARITH; FACT] THEN
7635   CONV_TAC NUM_REDUCE_CONV THEN
7636   REWRITE_TAC[COMPLEX_DIV_1; COMPLEX_MUL_RID; COMPLEX_POW_1] THEN
7637   SUBGOAL_THEN `~(u:complex = w)` ASSUME_TAC THENL
7638    [ASM_MESON_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; REAL_LT_REFL];
7639     ALL_TAC] THEN
7640   SUBGOAL_THEN `~(x:complex = w)` ASSUME_TAC THENL
7641    [ASM_MESON_TAC[]; ALL_TAC] THEN
7642   ASM_SIMP_TAC[COMPLEX_SUB_0; COMPLEX_POW_EQ_0; CX_INJ; REAL_OF_NUM_EQ;
7643      COMPLEX_FIELD
7644         `~(d = Cx(&0)) /\ ~(c = Cx(&0)) /\ ~(e = Cx(&0))
7645          ==> a - (b + c / d * e) = ((a - b) / e / c - inv d) * c * e`] THEN
7646   REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; REAL_DIV_1] THEN
7647   REWRITE_TAC[REAL_ABS_NUM; GSYM COMPLEX_POW_INV] THEN DISCH_TAC THEN
7648   MATCH_MP_TAC REAL_LT_RCANCEL_IMP THEN
7649   EXISTS_TAC `&k * norm(u - w:complex)` THEN
7650   ASM_SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; LT_NZ] THEN
7651   FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
7652    `n <= x ==> x < y ==> n < y`)) THEN
7653   REWRITE_TAC[REAL_POW_2; REAL_MUL_ASSOC] THEN
7654   ASM_SIMP_TAC[REAL_POW_2; REAL_MUL_ASSOC; REAL_LT_RMUL_EQ] THEN
7655   GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
7656   REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
7657   MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[REAL_OF_NUM_LT; LT_NZ] THEN
7658   ONCE_REWRITE_TAC[REAL_ARITH `a * b * c:real = (c * a) * b`] THEN
7659   ASM_SIMP_TAC[GSYM real_div; REAL_LT_LDIV_EQ; REAL_HALF; REAL_POW_LT] THEN
7660   ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_ARITH `&0 < &k + &1`]);;
7661
7662 let CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH = prove
7663  (`!f g z r k.
7664         ~(k = 0) /\
7665         (f continuous_on path_image(circlepath(z,r))) /\
7666         (!w. w IN ball(z,r)
7667              ==> ((\u. f(u) / (u - w) pow k) has_path_integral g w)
7668                  (circlepath(z,r)))
7669         ==> !w. w IN ball(z,r)
7670                 ==> (\u. f(u) / (u - w) pow (k + 1)) path_integrable_on
7671                             (circlepath(z,r)) /\
7672                     (g has_complex_derivative
7673                      (Cx(&k) * path_integral(circlepath(z,r))
7674                                  (\u. f(u) / (u - w) pow (k + 1))))
7675                     (at w)`,
7676   REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_CASES_TAC `&0 <= r` THENL
7677    [ALL_TAC;
7678     GEN_TAC THEN REWRITE_TAC[IN_BALL] THEN
7679     MATCH_MP_TAC(TAUT `~p ==> p ==> q`) THEN
7680     UNDISCH_TAC `~(&0 <= r)` THEN CONV_TAC NORM_ARITH] THEN
7681   MP_TAC(ISPECL
7682    [`f:complex->complex`; `g:complex->complex`; `circlepath(z,r)`;
7683     `ball(z:complex,r)`; `k:num`; `&2 * pi * r`] CAUCHY_NEXT_DERIVATIVE) THEN
7684   ASM_REWRITE_TAC[OPEN_BALL; VALID_PATH_CIRCLEPATH] THEN
7685   SUBGOAL_THEN `ball(z,r) DIFF path_image(circlepath (z,r)) = ball(z,r)`
7686   SUBST1_TAC THENL
7687    [REWRITE_TAC[SET_RULE `s DIFF t = s <=> !x. x IN t ==> ~(x IN s)`] THEN
7688     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; IN_SPHERE; IN_BALL; REAL_LT_REFL];
7689     DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
7690     REWRITE_TAC[VECTOR_DERIVATIVE_CIRCLEPATH] THEN
7691     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
7692     REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_PI; REAL_MUL_LID] THEN
7693     REWRITE_TAC[NORM_CEXP; RE_MUL_CX; RE_MUL_II; IM_CX] THEN
7694     REWRITE_TAC[REAL_NEG_0; REAL_MUL_RZERO; REAL_EXP_0; REAL_MUL_RID] THEN
7695     ASM_SIMP_TAC[real_abs; REAL_LE_REFL]]);;
7696
7697 (* ------------------------------------------------------------------------- *)
7698 (* In particular, the first derivative formula.                              *)
7699 (* ------------------------------------------------------------------------- *)
7700
7701 let CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH = prove
7702  (`!f z r w.
7703         f continuous_on cball(z,r) /\
7704         f holomorphic_on ball(z,r) /\
7705         w IN ball(z,r)
7706         ==> (\u. f(u) / (u - w) pow 2) path_integrable_on circlepath(z,r) /\
7707             (f has_complex_derivative
7708                 (Cx(&1) / (Cx(&2) * Cx(pi) * ii) *
7709                  path_integral(circlepath(z,r)) (\u. f(u) / (u - w) pow 2)))
7710             (at w)`,
7711   REPEAT GEN_TAC THEN STRIP_TAC THEN
7712   MP_TAC(SPECL [`f:complex->complex`; `\x:complex. Cx(&2) * Cx(pi) * ii * f x`;
7713                 `z:complex`; `r:real`; `1`]
7714          CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
7715   ASM_SIMP_TAC[COMPLEX_POW_1; ARITH; CAUCHY_INTEGRAL_CIRCLEPATH] THEN
7716   ANTS_TAC THENL
7717    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `cball(z:complex,r)` THEN
7718     ASM_REWRITE_TAC[] THEN
7719     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
7720     DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
7721      `n < r ==> &0 <= n ==> &0 <= r`)) THEN
7722     SIMP_TAC[DIST_POS_LE; PATH_IMAGE_CIRCLEPATH; SPHERE_SUBSET_CBALL];
7723     ALL_TAC] THEN
7724   DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN ASM_REWRITE_TAC[] THEN
7725   MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[COMPLEX_MUL_LID] THEN
7726   DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
7727         MATCH_MP HAS_COMPLEX_DERIVATIVE_LMUL_AT) THEN
7728   MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
7729   REWRITE_TAC[FUN_EQ_THM] THEN MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_FIELD);;
7730
7731 (* ------------------------------------------------------------------------- *)
7732 (* Existence of all higher derivatives.                                      *)
7733 (* ------------------------------------------------------------------------- *)
7734
7735 let HOLOMORPHIC_DERIVATIVE = prove
7736  (`!f f' s. open s /\ (!z. z IN s ==> (f has_complex_derivative f'(z)) (at z))
7737             ==> f' holomorphic_on s`,
7738   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN] THEN
7739   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7740   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
7741   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
7742   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
7743   MP_TAC(SPECL [`\x. Cx(&1) / (Cx(&2) * Cx pi * ii) * f(x:complex)`;
7744                 `f':complex->complex`; `z:complex`; `r:real`; `2`]
7745                CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
7746   ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[CENTRE_IN_BALL]] THEN
7747   SUBGOAL_THEN `f holomorphic_on cball(z,r)` ASSUME_TAC THENL
7748    [ASM_REWRITE_TAC[holomorphic_on] THEN
7749     ASM_MESON_TAC[SUBSET; HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
7750     ALL_TAC] THEN
7751   REWRITE_TAC[ARITH] THEN CONJ_TAC THENL
7752    [MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_LMUL THEN
7753     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `cball(z:complex,r)` THEN
7754     ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
7755     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE; SPHERE_SUBSET_CBALL];
7756     ALL_TAC] THEN
7757   X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
7758   MP_TAC(SPECL [`f:complex->complex`; `z:complex`; `r:real`; `w:complex`]
7759                CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH) THEN
7760   ANTS_TAC THENL
7761    [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
7762                   BALL_SUBSET_CBALL];
7763     ALL_TAC] THEN
7764   STRIP_TAC THEN
7765   FIRST_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRAL) THEN
7766   DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
7767     MATCH_MP HAS_PATH_INTEGRAL_COMPLEX_LMUL) THEN
7768   REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC] THEN
7769   MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
7770   REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM complex_div] THEN
7771   MATCH_MP_TAC COMPLEX_DERIVATIVE_UNIQUE_AT THEN
7772   MAP_EVERY EXISTS_TAC [`f:complex->complex`; `w:complex`] THEN
7773   ASM_REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC] THEN
7774   ASM_MESON_TAC[SUBSET; BALL_SUBSET_CBALL]);;
7775
7776 let HOLOMORPHIC_COMPLEX_DERIVATIVE = prove
7777  (`!f s. open s /\ f holomorphic_on s
7778          ==> (complex_derivative f) holomorphic_on s`,
7779   REPEAT STRIP_TAC THEN MATCH_MP_TAC HOLOMORPHIC_DERIVATIVE THEN
7780   EXISTS_TAC `f:complex->complex` THEN ASM_REWRITE_TAC[] THEN
7781   ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DERIVATIVE; HOLOMORPHIC_ON_OPEN]);;
7782
7783 let ANALYTIC_COMPLEX_DERIVATIVE = prove
7784  (`!f s. f analytic_on s ==> (complex_derivative f) analytic_on s`,
7785   REPEAT GEN_TAC THEN REWRITE_TAC[analytic_on] THEN DISCH_TAC THEN
7786   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7787   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7788   ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
7789   SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_BALL]);;
7790
7791 let HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE = prove
7792  (`!f s n. open s /\ f holomorphic_on s
7793            ==> (higher_complex_derivative n f) holomorphic_on s`,
7794   REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN
7795   INDUCT_TAC THEN
7796   ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; higher_complex_derivative]);;
7797
7798 let ANALYTIC_HIGHER_COMPLEX_DERIVATIVE = prove
7799  (`!f s n. f analytic_on s ==> (higher_complex_derivative n f) analytic_on s`,
7800   REPEAT GEN_TAC THEN REWRITE_TAC[analytic_on] THEN DISCH_TAC THEN
7801   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7802   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7803   ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
7804   ASM_SIMP_TAC[HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE; OPEN_BALL]);;
7805
7806 let HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE = prove
7807  (`!f s x n. open s /\ f holomorphic_on s /\ x IN s
7808              ==> ((higher_complex_derivative n f) has_complex_derivative
7809                           (higher_complex_derivative (SUC n) f x)) (at x)`,
7810   REPEAT STRIP_TAC THEN REWRITE_TAC[higher_complex_derivative] THEN
7811   REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
7812   MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
7813   EXISTS_TAC `s:complex->bool` THEN
7814   ASM_SIMP_TAC[HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]);;
7815
7816 (* ------------------------------------------------------------------------- *)
7817 (* Morera's theorem.                                                         *)
7818 (* ------------------------------------------------------------------------- *)
7819
7820 let MORERA_LOCAL_TRIANGLE_GEN = prove
7821  (`!f s.
7822      (!z. z IN s
7823           ==> ?e a. &0 < e /\ z IN ball(a,e) /\ f continuous_on ball(a,e) /\
7824                     !b c. segment[b,c] SUBSET ball(a,e)
7825                            ==> path_integral (linepath(a,b)) f +
7826                                path_integral (linepath(b,c)) f +
7827                                path_integral (linepath(c,a)) f = Cx(&0))
7828      ==> f analytic_on s`,
7829   REPEAT STRIP_TAC THEN REWRITE_TAC[analytic_on] THEN
7830   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7831   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7832   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
7833   MAP_EVERY X_GEN_TAC [`e:real`; `a:complex`] THEN STRIP_TAC THEN
7834   EXISTS_TAC `e - dist(a:complex,z)` THEN CONJ_TAC THENL
7835    [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN NORM_ARITH_TAC;
7836     ALL_TAC] THEN
7837   MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `ball(a:complex,e)` THEN
7838   CONJ_TAC THENL
7839    [MATCH_MP_TAC HOLOMORPHIC_DERIVATIVE THEN REWRITE_TAC[OPEN_BALL] THEN
7840     MATCH_MP_TAC TRIANGLE_PATH_INTEGRALS_STARLIKE_PRIMITIVE THEN
7841     EXISTS_TAC `a:complex` THEN ASM_REWRITE_TAC[CENTRE_IN_BALL; OPEN_BALL] THEN
7842     REPEAT STRIP_TAC THEN REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
7843     MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
7844     ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; CENTRE_IN_BALL];
7845     REWRITE_TAC[SUBSET; IN_BALL] THEN NORM_ARITH_TAC]);;
7846
7847 let MORERA_LOCAL_TRIANGLE = prove
7848  (`!f s. (!z. z IN s
7849               ==> ?t. open t /\ z IN t /\ f continuous_on t /\
7850                       !a b c. convex hull {a,b,c} SUBSET t
7851                               ==> path_integral (linepath(a,b)) f +
7852                                   path_integral (linepath(b,c)) f +
7853                                   path_integral (linepath(c,a)) f = Cx(&0))
7854          ==> f analytic_on s`,
7855   REPEAT GEN_TAC THEN DISCH_TAC THEN
7856   MATCH_MP_TAC MORERA_LOCAL_TRIANGLE_GEN THEN
7857   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7858   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7859   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
7860   X_GEN_TAC `t:complex->bool` THEN STRIP_TAC THEN
7861   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
7862   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
7863   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
7864   EXISTS_TAC `z:complex` THEN ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN
7865   CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
7866   MAP_EVERY X_GEN_TAC [`x:complex`; `w:complex`] THEN DISCH_TAC THEN
7867   FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM
7868    (MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT] SUBSET_TRANS)) THEN
7869   MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
7870   ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; CENTRE_IN_BALL] THEN
7871   MP_TAC(ISPECL [`x:complex`; `w:complex`] ENDS_IN_SEGMENT) THEN
7872   ASM SET_TAC[]);;
7873
7874 let MORERA_TRIANGLE = prove
7875  (`!f s. open s /\ f continuous_on s /\
7876          (!a b c. convex hull {a,b,c} SUBSET s
7877                   ==> path_integral (linepath(a,b)) f +
7878                       path_integral (linepath(b,c)) f +
7879                       path_integral (linepath(c,a)) f = Cx(&0))
7880          ==> f analytic_on s`,
7881   REPEAT STRIP_TAC THEN MATCH_MP_TAC MORERA_LOCAL_TRIANGLE THEN
7882   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN EXISTS_TAC `s:complex->bool` THEN
7883   ASM_REWRITE_TAC[]);;
7884
7885 (* ------------------------------------------------------------------------- *)
7886 (* Combining theorems for higher derivatives including Leibniz rule.         *)
7887 (* ------------------------------------------------------------------------- *)
7888
7889 let HIGHER_COMPLEX_DERIVATIVE_EQ_ITER = prove
7890  (`!n. higher_complex_derivative n = ITER n complex_derivative`,
7891   INDUCT_TAC THEN
7892   ASM_REWRITE_TAC [FUN_EQ_THM; ITER; higher_complex_derivative]);;
7893
7894 let HIGHER_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE = prove
7895  (`!f m n. higher_complex_derivative m (higher_complex_derivative n f) =
7896            higher_complex_derivative (m + n) f`,
7897   REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_EQ_ITER; ITER_ADD]);;
7898
7899 let higher_complex_derivative_alt = prove
7900  (`(!f. higher_complex_derivative 0 f = f) /\
7901    (!f z n. higher_complex_derivative (SUC n) f =
7902             higher_complex_derivative n (complex_derivative f))`,
7903   REWRITE_TAC [HIGHER_COMPLEX_DERIVATIVE_EQ_ITER; ITER_ALT]);;
7904
7905 let HIGHER_COMPLEX_DERIVATIVE_LINEAR = prove
7906  (`!c n. higher_complex_derivative n (\w. c * w) =
7907     \z. if n = 0 then c * z else if n = 1 then c else (Cx(&0))`,
7908   GEN_TAC THEN INDUCT_TAC THEN
7909   ASM_REWRITE_TAC [higher_complex_derivative; NOT_SUC; SUC_INJ; ONE] THEN
7910   STRUCT_CASES_TAC (SPEC `n:num` num_CASES) THEN
7911   REWRITE_TAC [NOT_SUC; SUC_INJ;
7912                COMPLEX_DERIVATIVE_LINEAR; COMPLEX_DERIVATIVE_CONST]);;
7913
7914 let HIGHER_COMPLEX_DERIVATIVE_CONST = prove
7915  (`!i c. higher_complex_derivative i (\w.c) = \w. if i=0 then c else Cx(&0)`,
7916   INDUCT_TAC THEN ASM_REWRITE_TAC [higher_complex_derivative_alt; NOT_SUC;
7917                                    COMPLEX_DERIVATIVE_CONST; FUN_EQ_THM] THEN
7918   MESON_TAC[]);;
7919
7920 let HIGHER_COMPLEX_DERIVATIVE_ID = prove
7921  (`!z i. higher_complex_derivative i (\w.w) z =
7922             if i = 0 then z else if i = 1 then Cx(&1) else Cx(&0)`,
7923   GEN_TAC THEN INDUCT_TAC THEN
7924   ASM_REWRITE_TAC [higher_complex_derivative_alt; NOT_SUC; ONE; SUC_INJ] THEN
7925   REWRITE_TAC[COMPLEX_DERIVATIVE_ID; HIGHER_COMPLEX_DERIVATIVE_CONST; ONE]);;
7926
7927 let HAS_COMPLEX_DERIVATIVE_ITER_1 = prove
7928  (`!f n z. f z = z /\ (f has_complex_derivative Cx(&1)) (at z)
7929            ==> (ITER n f has_complex_derivative Cx(&1)) (at z)`,
7930   GEN_TAC THEN INDUCT_TAC THEN REPEAT STRIP_TAC THEN
7931   REWRITE_TAC [ITER_POINTLESS; I_DEF; HAS_COMPLEX_DERIVATIVE_ID] THEN
7932   SUBGOAL_THEN `Cx(&1) = Cx(&1) * Cx(&1)` SUBST1_TAC THENL
7933   [REWRITE_TAC [COMPLEX_MUL_LID];
7934    ASM_SIMP_TAC [ITER_FIXPOINT; COMPLEX_DIFF_CHAIN_AT]]);;
7935
7936 let HIGHER_COMPLEX_DERIVATIVE_NEG = prove
7937  (`!f s n z.
7938      open s /\ f holomorphic_on s /\ z IN s
7939      ==> higher_complex_derivative n (\w. --(f w)) z =
7940                 --(higher_complex_derivative n f z)`,
7941   REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7942   REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7943   REWRITE_TAC [higher_complex_derivative] THEN REPEAT STRIP_TAC THEN
7944   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7945   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7946   EXISTS_TAC `(\w. --(higher_complex_derivative n f w))` THEN
7947   EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
7948   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_NEG THEN
7949   REWRITE_TAC [ETA_AX; GSYM higher_complex_derivative] THEN
7950   ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]);;
7951
7952 let HIGHER_COMPLEX_DERIVATIVE_ADD = prove
7953  (`!f g s n z.
7954      open s /\ f holomorphic_on s /\ g holomorphic_on s /\ z IN s ==>
7955      higher_complex_derivative n (\w. f w + g w) z  =
7956      higher_complex_derivative n f z + higher_complex_derivative n g z`,
7957   REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7958   REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7959   REWRITE_TAC [higher_complex_derivative] THEN REPEAT STRIP_TAC THEN
7960   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7961   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7962   EXISTS_TAC `(\w. higher_complex_derivative n f w +
7963                    higher_complex_derivative n g w)` THEN
7964   EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
7965   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_ADD THEN
7966   REWRITE_TAC [ETA_AX; GSYM higher_complex_derivative] THEN
7967   ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]);;
7968
7969 let HIGHER_COMPLEX_DERIVATIVE_SUB = prove
7970  (`!f g s n z.
7971      open s /\ f holomorphic_on s /\ g holomorphic_on s /\ z IN s ==>
7972      higher_complex_derivative n (\w. f w - g w) z  =
7973      higher_complex_derivative n f z - higher_complex_derivative n g z`,
7974   REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7975   REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7976   REWRITE_TAC [higher_complex_derivative] THEN REPEAT STRIP_TAC THEN
7977   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7978   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7979   EXISTS_TAC `(\w. higher_complex_derivative n f w -
7980                    higher_complex_derivative n g w)` THEN
7981   EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
7982   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
7983   REWRITE_TAC [ETA_AX; GSYM higher_complex_derivative] THEN
7984   ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]);;
7985
7986 let HIGHER_COMPLEX_DERIVATIVE_MUL = prove
7987  (`!f g s n z.
7988      open s /\ f holomorphic_on s /\ g holomorphic_on s /\ z IN s
7989      ==> higher_complex_derivative n (\w. f w * g w) z =
7990          vsum (0..n) (\i. Cx(&(binom(n,i))) *
7991                           higher_complex_derivative i f z *
7992                           higher_complex_derivative (n-i) g z)`,
7993   REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7994   REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7995   REPEAT STRIP_TAC THEN REWRITE_TAC [NUMSEG_SING; VSUM_SING; SUB] THEN
7996   REWRITE_TAC [higher_complex_derivative; binom; COMPLEX_MUL_LID] THEN
7997   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7998   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7999   EXISTS_TAC `\w. vsum (0..n)
8000                     (\i. Cx(&(binom (n,i))) *
8001                          higher_complex_derivative i f w *
8002                          higher_complex_derivative (n-i) g w)` THEN
8003   EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
8004   SUBGOAL_THEN `vsum (0..SUC n) (\i. Cx(&(binom (SUC n,i))) *
8005                                      higher_complex_derivative i f z *
8006                                      higher_complex_derivative (SUC n-i) g z) =
8007                 vsum (0..n) (\i. Cx(&(binom (n,i))) *
8008                                  (higher_complex_derivative i f z *
8009                                   higher_complex_derivative (SUC n-i) g z +
8010                                   higher_complex_derivative (SUC i) f z *
8011                                   higher_complex_derivative (n-i) g z))`
8012     SUBST1_TAC THENL
8013   [SUBGOAL_THEN
8014        `!i. binom(SUC n,i) = binom(n,i) + if i=0 then 0 else binom(n,PRE i)`
8015      (fun th -> REWRITE_TAC[th; GSYM REAL_OF_NUM_ADD; CX_ADD]) THENL
8016    [INDUCT_TAC THEN REWRITE_TAC[binom; NOT_SUC; PRE; ADD_SYM; ADD_0];
8017     REWRITE_TAC [COMPLEX_ADD_LDISTRIB; COMPLEX_ADD_RDISTRIB]] THEN
8018    SIMP_TAC [VSUM_ADD; FINITE_NUMSEG] THEN BINOP_TAC THENL
8019    [REWRITE_TAC [VSUM_CLAUSES_NUMSEG; LE_0] THEN
8020     SUBGOAL_THEN `binom(n,SUC n)=0` SUBST1_TAC THENL
8021     [REWRITE_TAC [BINOM_EQ_0] THEN ARITH_TAC; CONV_TAC COMPLEX_RING];
8022     SIMP_TAC [VSUM_CLAUSES_LEFT; SPEC `SUC n` LE_0] THEN
8023     REWRITE_TAC [COMPLEX_MUL_LZERO; COMPLEX_ADD_LID; GSYM ADD1;
8024                  VSUM_SUC; o_DEF; SUB_SUC; NOT_SUC; PRE]];
8025    MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_VSUM THEN
8026    REWRITE_TAC [FINITE_NUMSEG; IN_NUMSEG] THEN REPEAT STRIP_TAC THEN
8027    MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_LMUL_AT THEN
8028    MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_MUL_AT THEN
8029    ASM_SIMP_TAC [ETA_AX; ARITH_RULE `i <= n ==> SUC n - i = SUC (n-i)`] THEN
8030    ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]]);;
8031
8032 let HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN = prove
8033  (`!f g s i z.
8034      open s /\ f holomorphic_on s /\ g holomorphic_on s /\
8035      (!w. w IN s ==> f w = g w) /\ z IN s
8036      ==> higher_complex_derivative i f z = higher_complex_derivative i g z`,
8037   REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
8038   REPEAT DISCH_TAC THEN INDUCT_TAC THEN REPEAT STRIP_TAC THEN
8039   ASM_SIMP_TAC [higher_complex_derivative] THEN
8040   MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
8041   ASM_MESON_TAC [HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]);;
8042
8043 let HIGHER_COMPLEX_DERIVATIVE_COMPOSE_LINEAR = prove
8044  (`!f u s t n z.
8045      f holomorphic_on t /\ open s /\ open t /\
8046      (!w. w IN s ==> u * w IN t) /\ z IN s
8047      ==> higher_complex_derivative n (\w. f (u * w)) z =
8048          u pow n * higher_complex_derivative n f (u * z)`,
8049   REWRITE_TAC [RIGHT_FORALL_IMP_THM; IMP_CONJ] THEN
8050   REPEAT GEN_TAC THEN REPEAT DISCH_TAC THEN INDUCT_TAC THEN
8051   REWRITE_TAC [higher_complex_derivative; complex_pow; COMPLEX_MUL_LID] THEN
8052   REPEAT STRIP_TAC THEN EQ_TRANS_TAC
8053     `complex_derivative
8054       (\z. u pow n * higher_complex_derivative n f (u * z)) z` THENL
8055   [MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
8056    EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8057    [MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
8058     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC
8059      (REWRITE_RULE [o_DEF]
8060        (SPECL [`\z:complex. u * z`; `f:complex->complex`]
8061               HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
8062     EXISTS_TAC `t:complex->bool` THEN ASM_REWRITE_TAC[] THEN MATCH_MP_TAC
8063      (REWRITE_RULE [o_DEF]
8064        (SPECL [`\w:complex. u:complex`; `\w:complex. w`]
8065               HOLOMORPHIC_ON_MUL)) THEN
8066     REWRITE_TAC [HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID];
8067     MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
8068     SIMP_TAC [HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_CONST] THEN MATCH_MP_TAC
8069      (REWRITE_RULE [o_DEF]
8070        (SPECL [`\w. u * w`; `higher_complex_derivative f n`]
8071               HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
8072     EXISTS_TAC `t:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8073     [MATCH_MP_TAC
8074       (REWRITE_RULE [o_DEF]
8075         (SPECL [`\w:complex. u:complex`; `\w:complex. w`]
8076                HOLOMORPHIC_ON_MUL)) THEN
8077      REWRITE_TAC [HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID];
8078      ASM_SIMP_TAC [HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]]];
8079    EQ_TRANS_TAC
8080      `u pow n * complex_derivative
8081         (\z. higher_complex_derivative n f (u * z)) z` THENL
8082    [MATCH_MP_TAC COMPLEX_DERIVATIVE_LMUL THEN
8083     MATCH_MP_TAC ANALYTIC_ON_IMP_DIFFERENTIABLE_AT THEN
8084     EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
8085     MATCH_MP_TAC (REWRITE_RULE [o_DEF] ANALYTIC_ON_COMPOSE_GEN) THEN
8086     EXISTS_TAC `t:complex->bool` THEN
8087     ASM_SIMP_TAC [ANALYTIC_ON_LINEAR; ANALYTIC_HIGHER_COMPLEX_DERIVATIVE;
8088                   ANALYTIC_ON_OPEN];
8089     ABBREV_TAC `a = u:complex pow n` THEN
8090     REWRITE_TAC [COMPLEX_MUL_AC; COMPLEX_EQ_MUL_LCANCEL] THEN
8091     ASM_CASES_TAC `a = Cx(&0)` THEN ASM_REWRITE_TAC[] THEN
8092     GEN_REWRITE_TAC RAND_CONV [COMPLEX_MUL_SYM] THEN MATCH_MP_TAC
8093      (REWRITE_RULE [o_DEF; COMPLEX_DIFFERENTIABLE_LINEAR;
8094                     COMPLEX_DERIVATIVE_LINEAR]
8095        (SPECL [`\w. u * w`;`higher_complex_derivative n f`]
8096               COMPLEX_DERIVATIVE_CHAIN)) THEN
8097     ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT;
8098                    HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]]]);;
8099
8100 let HIGHER_COMPLEX_DERIVATIVE_ADD_AT = prove
8101  (`!f g n z.
8102      f analytic_on {z} /\ g analytic_on {z}
8103      ==> higher_complex_derivative n (\w. f w + g w) z =
8104          higher_complex_derivative n f z +
8105          higher_complex_derivative n g z`,
8106   REWRITE_TAC [ANALYTIC_AT_TWO] THEN
8107   MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_ADD]);;
8108
8109 let HIGHER_COMPLEX_DERIVATIVE_SUB_AT = prove
8110  (`!f g n z.
8111      f analytic_on {z} /\ g analytic_on {z}
8112      ==> higher_complex_derivative n (\w. f w - g w) z =
8113          higher_complex_derivative n f z -
8114          higher_complex_derivative n g z`,
8115   REWRITE_TAC [ANALYTIC_AT_TWO] THEN
8116   MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_SUB]);;
8117
8118 let HIGHER_COMPLEX_DERIVATIVE_NEG_AT = prove
8119  (`!f n z.
8120      f analytic_on {z}
8121      ==> higher_complex_derivative n (\w. --(f w)) z =
8122          --(higher_complex_derivative n f z)`,
8123   REWRITE_TAC [ANALYTIC_AT] THEN
8124   MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_NEG]);;
8125
8126 let HIGHER_COMPLEX_DERIVATIVE_MUL_AT = prove
8127  (`!f g n z.
8128      f analytic_on {z} /\ g analytic_on {z}
8129      ==> higher_complex_derivative n (\w. f w * g w) z =
8130          vsum (0..n) (\i. Cx(&(binom(n,i))) *
8131                           higher_complex_derivative i f z *
8132                           higher_complex_derivative (n-i) g z)`,
8133   REWRITE_TAC [ANALYTIC_AT_TWO] THEN
8134   MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_MUL]);;
8135
8136 (* ------------------------------------------------------------------------- *)
8137 (* Nonexistence of isolated singularities and a stronger integral formula.   *)
8138 (* ------------------------------------------------------------------------- *)
8139
8140 let NO_ISOLATED_SINGULARITY = prove
8141  (`!f s k. open s /\ FINITE k /\
8142            f continuous_on s /\ f holomorphic_on (s DIFF k)
8143            ==> f holomorphic_on s`,
8144   REPEAT GEN_TAC THEN
8145   SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DIFF; FINITE_IMP_CLOSED; IMP_CONJ] THEN
8146   REWRITE_TAC[GSYM complex_differentiable] THEN REPEAT DISCH_TAC THEN
8147   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8148   ASM_CASES_TAC `(z:complex) IN k` THEN ASM_SIMP_TAC[IN_DIFF] THEN
8149   MP_TAC(ISPECL [`z:complex`; `k:complex->bool`] FINITE_SET_AVOID) THEN
8150   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `d:real` THEN
8151   STRIP_TAC THEN
8152   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
8153   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
8154   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
8155   SUBGOAL_THEN `f holomorphic_on ball(z,min d e)` MP_TAC THENL
8156    [ALL_TAC;
8157     ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; CENTRE_IN_BALL; REAL_LT_MIN;
8158                  complex_differentiable]] THEN
8159   SUBGOAL_THEN
8160    `?g. !w. w IN ball(z,min d e)
8161             ==> (g has_complex_derivative f w) (at w within ball(z,min d e))`
8162   MP_TAC THENL
8163    [ALL_TAC;
8164     SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL] THEN
8165     MESON_TAC[HOLOMORPHIC_DERIVATIVE; OPEN_BALL]] THEN
8166   MATCH_MP_TAC PATHINTEGRAL_CONVEX_PRIMITIVE THEN
8167   REWRITE_TAC[CONVEX_BALL] THEN CONJ_TAC THENL
8168    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
8169     ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
8170      (SET_RULE `b SUBSET s ==> c SUBSET b ==> c SUBSET s`)) THEN
8171     REWRITE_TAC[SUBSET; IN_BALL] THEN REAL_ARITH_TAC;
8172     ALL_TAC] THEN
8173   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_COFINITE THEN
8174   EXISTS_TAC `k:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8175    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
8176     ASM_REWRITE_TAC[];
8177     X_GEN_TAC `w:complex` THEN
8178     DISCH_THEN(fun th -> FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
8179     SPEC_TAC(`w:complex`,`w:complex`) THEN ASM_REWRITE_TAC[GSYM SUBSET] THEN
8180     MATCH_MP_TAC(SET_RULE `s SUBSET t ==> (s DIFF k) SUBSET (t DIFF k)`) THEN
8181     MATCH_MP_TAC(SET_RULE
8182      `interior s SUBSET s /\ s SUBSET t ==> interior s SUBSET t`) THEN
8183     REWRITE_TAC[INTERIOR_SUBSET]] THEN
8184   (MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,e)` THEN
8185    ASM_REWRITE_TAC[] THEN
8186    MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,min d e)` THEN
8187    CONJ_TAC THENL
8188     [MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
8189      ASM SET_TAC[];
8190      REWRITE_TAC[SUBSET; IN_BALL] THEN REAL_ARITH_TAC]));;
8191
8192 let CAUCHY_INTEGRAL_FORMULA_CONVEX = prove
8193  (`!f s k g z.
8194         convex s /\ FINITE k /\ f continuous_on s /\
8195         (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x) /\
8196         z IN interior(s) /\
8197         valid_path g /\ (path_image g) SUBSET (s DELETE z) /\
8198         pathfinish g = pathstart g
8199         ==> ((\w. f(w) / (w - z)) has_path_integral
8200              (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
8201   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_INTEGRAL_FORMULA_WEAK THEN
8202   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
8203   ASM_REWRITE_TAC[DIFF_EMPTY; FINITE_RULES] THEN
8204   SIMP_TAC[GSYM HOLOMORPHIC_ON_OPEN; complex_differentiable; OPEN_INTERIOR] THEN
8205   MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN
8206   EXISTS_TAC `k:complex->bool` THEN
8207   ASM_REWRITE_TAC[OPEN_INTERIOR] THEN CONJ_TAC THENL
8208    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
8209     ASM_REWRITE_TAC[INTERIOR_SUBSET];
8210     ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DIFF; FINITE_IMP_CLOSED;
8211                  OPEN_INTERIOR; GSYM complex_differentiable]]);;
8212
8213 (* ------------------------------------------------------------------------- *)
8214 (* Formula for higher derivatives.                                           *)
8215 (* ------------------------------------------------------------------------- *)
8216
8217 let CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH = prove
8218  (`!f z r k w.
8219         f continuous_on cball(z,r) /\
8220         f holomorphic_on ball(z,r) /\
8221         w IN ball(z,r)
8222         ==> ((\u. f(u) / (u - w) pow (k + 1))
8223              has_path_integral
8224              ((Cx(&2) * Cx(pi) * ii) / Cx(&(FACT k)) *
8225               higher_complex_derivative k f w))
8226             (circlepath(z,r))`,
8227   REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
8228   REPEAT GEN_TAC THEN DISCH_TAC THEN DISCH_TAC THEN
8229   ASM_CASES_TAC `&0 < r` THENL
8230    [ALL_TAC;
8231     REWRITE_TAC[IN_BALL] THEN
8232     ASM_MESON_TAC[NORM_ARITH `~(&0 < r) ==> ~(dist(a,b) < r)`]] THEN
8233   INDUCT_TAC THEN REWRITE_TAC[higher_complex_derivative] THENL
8234    [REWRITE_TAC[ARITH; COMPLEX_POW_1; FACT; COMPLEX_DIV_1] THEN
8235     ASM_SIMP_TAC[GSYM COMPLEX_MUL_ASSOC; CAUCHY_INTEGRAL_CIRCLEPATH];
8236     ALL_TAC] THEN
8237   MP_TAC(SPECL
8238    [`f:complex->complex`;
8239     `\x. (Cx(&2) * Cx(pi) * ii) / Cx(&(FACT k)) *
8240          higher_complex_derivative k f x`;
8241     `z:complex`; `r:real`; `k + 1`] CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
8242   ASM_REWRITE_TAC[ADD1; ARITH_RULE `(k + 1) + 1 = k + 2`] THEN ANTS_TAC THENL
8243    [REWRITE_TAC[ADD_EQ_0; ARITH_EQ] THEN
8244     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8245     EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[] THEN
8246     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE; SPHERE_SUBSET_CBALL];
8247     ALL_TAC] THEN
8248   DISCH_THEN(fun th ->
8249     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN MP_TAC(SPEC `w:complex` th)) THEN
8250   ASM_REWRITE_TAC[] THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
8251   REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
8252   X_GEN_TAC `y:complex` THEN
8253   DISCH_THEN(fun th -> ASSUME_TAC th THEN MP_TAC th) THEN
8254   MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
8255   MATCH_MP_TAC(COMPLEX_FIELD
8256    `~(a = Cx(&0)) /\ ~(b = Cx(&0)) /\ x = b / a * y ==> y = a / b * x`) THEN
8257   REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ] THEN
8258   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
8259   FIRST_ASSUM(MP_TAC o MATCH_MP HAS_COMPLEX_DERIVATIVE_LMUL_AT) THEN
8260   DISCH_THEN(MP_TAC o SPEC `Cx(&(FACT k)) / (Cx(&2) * Cx pi * ii)`) THEN
8261   REWRITE_TAC[] THEN MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN BINOP_TAC THENL
8262    [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN
8263     MATCH_MP_TAC(COMPLEX_FIELD
8264      `~(a = Cx(&0)) /\ ~(b = Cx(&0)) ==> (a / b) * (b / a) * x = x`) THEN
8265     REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ];
8266     REWRITE_TAC[FACT; GSYM REAL_OF_NUM_MUL; GSYM ADD1; CX_MUL] THEN
8267     MATCH_MP_TAC(COMPLEX_FIELD
8268      `z:complex = y /\ ~(d = Cx(&0))
8269       ==> k / d * k1 * z = (k1 * k) / d * y`) THEN
8270     REWRITE_TAC[CX_2PII_NZ] THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
8271     ASM_REWRITE_TAC[]]);;
8272
8273 let CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH = prove
8274  (`!f z r k w.
8275         f continuous_on cball(z,r) /\
8276         f holomorphic_on ball(z,r) /\
8277         w IN ball(z,r)
8278         ==> (\u. f(u) / (u - w) pow (k + 1))
8279                 path_integrable_on circlepath(z,r) /\
8280             higher_complex_derivative k f w =
8281               Cx(&(FACT k)) / (Cx(&2) * Cx(pi) * ii) *
8282               path_integral(circlepath(z,r)) (\u. f(u) / (u - w) pow (k + 1))`,
8283   REPEAT GEN_TAC THEN DISCH_TAC THEN
8284   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP
8285     CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH) THEN
8286   CONJ_TAC THENL [ASM_MESON_TAC[path_integrable_on]; ALL_TAC] THEN
8287   MATCH_MP_TAC(COMPLEX_FIELD
8288    `~(a = Cx(&0)) /\ ~(b = Cx(&0)) /\ x = b / a * y ==> y = a / b * x`) THEN
8289   REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ] THEN
8290   MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN ASM_REWRITE_TAC[]);;
8291
8292 (* ------------------------------------------------------------------------- *)
8293 (* A holomorphic function is analytic, i.e. has local power series.          *)
8294 (* ------------------------------------------------------------------------- *)
8295
8296 let HOLOMORPHIC_POWER_SERIES = prove
8297  (`!f z w r.
8298      f holomorphic_on ball(z,r) /\ w IN ball(z,r)
8299      ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) * (w - z) pow n)
8300           sums f(w)) (from 0)`,
8301   REPEAT STRIP_TAC THEN
8302   SUBGOAL_THEN
8303    `?r. &0 < r /\ f holomorphic_on cball(z,r) /\ w IN ball(z,r)`
8304   MP_TAC THENL
8305    [EXISTS_TAC `(r + dist(w:complex,z)) / &2` THEN REPEAT CONJ_TAC THENL
8306      [ALL_TAC;
8307       MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
8308       EXISTS_TAC `ball(z:complex,r)` THEN ASM_REWRITE_TAC[SUBSET];
8309       ALL_TAC] THEN
8310     UNDISCH_TAC `(w:complex) IN ball(z,r)` THEN
8311     REWRITE_TAC[IN_BALL; IN_CBALL] THEN NORM_ARITH_TAC;
8312     ALL_TAC] THEN
8313   POP_ASSUM_LIST(K ALL_TAC) THEN
8314   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
8315   SUBGOAL_THEN `f holomorphic_on ball(z,r) /\ f continuous_on cball(z,r)`
8316   STRIP_ASSUME_TAC THENL
8317    [ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
8318     MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN ASM_MESON_TAC[BALL_SUBSET_CBALL];
8319     ALL_TAC] THEN
8320   SUBGOAL_THEN
8321    `((\k. path_integral (circlepath(z,r)) (\u. f u / (u - z) pow (k + 1)) *
8322           (w - z) pow k)
8323      sums path_integral (circlepath(z,r)) (\u. f u / (u - w))) (from 0)`
8324   MP_TAC THENL
8325    [ALL_TAC;
8326     DISCH_THEN(MP_TAC o SPEC `inv(Cx(&2) * Cx(pi) * ii)` o
8327         MATCH_MP SERIES_COMPLEX_LMUL) THEN
8328     MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN BINOP_TAC THENL
8329      [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `k:num` THEN
8330       MP_TAC(SPECL [`f:complex->complex`; `z:complex`; `r:real`; `k:num`;
8331        `z:complex`] CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH) THEN
8332       ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN
8333       DISCH_THEN(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
8334       MATCH_MP_TAC(COMPLEX_FIELD
8335        `~(pit = Cx(&0)) /\ ~(fact = Cx(&0))
8336         ==> inv(pit) * ((pit / fact) * d) * wz = d / fact * wz`) THEN
8337       REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ];
8338       MP_TAC(SPECL [`f:complex->complex`; `z:complex`; `r:real`; `w:complex`]
8339         CAUCHY_INTEGRAL_CIRCLEPATH_SIMPLE) THEN
8340       ASM_REWRITE_TAC[] THEN
8341       DISCH_THEN(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
8342       MATCH_MP_TAC(COMPLEX_FIELD
8343        `~(x * y * z = Cx(&0)) ==> inv(x * y * z) * x * y * z * w = w`) THEN
8344       REWRITE_TAC[CX_2PII_NZ]]] THEN
8345   REWRITE_TAC[sums; FROM_0; INTER_UNIV] THEN
8346   MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
8347   EXISTS_TAC `\n. path_integral (circlepath(z,r))
8348                    (\u. vsum (0..n)
8349                          (\k. f u * (w - z) pow k / (u - z) pow (k + 1)))` THEN
8350   CONJ_TAC THENL
8351    [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
8352     X_GEN_TAC `k:num` THEN REWRITE_TAC[] THEN
8353     W(MP_TAC o PART_MATCH (lhs o rand) PATH_INTEGRAL_VSUM o lhand o snd) THEN
8354     ANTS_TAC THENL
8355      [REWRITE_TAC[FINITE_NUMSEG] THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN
8356       ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH
8357        `a * b / c:complex = b * a / c`] THEN
8358       MATCH_MP_TAC PATH_INTEGRABLE_COMPLEX_LMUL THEN
8359       ASM_SIMP_TAC[CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH;
8360                    CENTRE_IN_BALL];
8361       ALL_TAC] THEN
8362     DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC VSUM_EQ THEN
8363     X_GEN_TAC `m:num` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
8364     ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a * b / c:complex = a / c * b`] THEN
8365     MATCH_MP_TAC PATH_INTEGRAL_COMPLEX_RMUL THEN
8366     ASM_SIMP_TAC[CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH; CENTRE_IN_BALL];
8367     ALL_TAC] THEN
8368   MATCH_MP_TAC(CONJUNCT2
8369    (REWRITE_RULE[FORALL_AND_THM; TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`]
8370         PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH)) THEN
8371   ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL
8372    [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
8373     X_GEN_TAC `k:num` THEN REWRITE_TAC[] THEN
8374     MATCH_MP_TAC PATH_INTEGRABLE_VSUM THEN
8375     REWRITE_TAC[FINITE_NUMSEG] THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN
8376     ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a * b / c:complex = b * a / c`] THEN
8377     MATCH_MP_TAC PATH_INTEGRABLE_COMPLEX_LMUL THEN
8378     ASM_SIMP_TAC[CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH; CENTRE_IN_BALL];
8379     ALL_TAC] THEN
8380   X_GEN_TAC `e:real` THEN STRIP_TAC THEN
8381   ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE; IN_ELIM_THM] THEN
8382   SIMP_TAC[VSUM_COMPLEX_LMUL; FINITE_NUMSEG; complex_div] THEN
8383   REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB; COMPLEX_NORM_MUL] THEN
8384   REWRITE_TAC[COMPLEX_POW_ADD; COMPLEX_INV_MUL; COMPLEX_POW_1] THEN
8385   SIMP_TAC[COMPLEX_MUL_ASSOC; VSUM_COMPLEX_RMUL; FINITE_NUMSEG] THEN
8386   REWRITE_TAC[GSYM complex_div; GSYM COMPLEX_POW_DIV] THEN
8387   REWRITE_TAC[VSUM_GP; CONJUNCT1 LT; CONJUNCT1 complex_pow] THEN
8388   REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
8389   SUBGOAL_THEN
8390    `?B. &0 < B /\
8391         !u:complex. u IN cball(z,r) ==> norm(f u:complex) <= B`
8392   STRIP_ASSUME_TAC THENL
8393    [MP_TAC(ISPEC `IMAGE (f:complex->complex) (cball(z,r))`
8394       COMPACT_IMP_BOUNDED) THEN
8395     ASM_SIMP_TAC[COMPACT_CONTINUOUS_IMAGE; COMPACT_CBALL] THEN
8396     REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE];
8397     ALL_TAC] THEN
8398   SUBGOAL_THEN `?k. &0 < k /\ k <= r /\ norm(w - z) <= r - k /\
8399                     !u. norm(u - z) = r ==> k <= norm(u - w)`
8400   STRIP_ASSUME_TAC THENL
8401    [EXISTS_TAC `r - dist(z:complex,w)` THEN
8402     REPEAT(POP_ASSUM MP_TAC) THEN REWRITE_TAC[IN_BALL] THEN
8403     NORM_ARITH_TAC;
8404     ALL_TAC] THEN
8405   REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(z,x) = r <=> norm(x - z) = r`] THEN
8406   MP_TAC(SPECL [`(r - k) / r:real`; `e / B * k:real`] REAL_ARCH_POW_INV) THEN
8407   ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_LT_DIV; REAL_HALF; REAL_LT_MUL] THEN
8408   ASM_REWRITE_TAC[REAL_ARITH `r - k < &1 * r <=> &0 < k`] THEN
8409   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN
8410   X_GEN_TAC `n:num` THEN DISCH_TAC THEN
8411   X_GEN_TAC `u:complex` THEN DISCH_TAC THEN
8412   SUBGOAL_THEN `~(u:complex = z) /\ ~(u = w)` STRIP_ASSUME_TAC THENL
8413    [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
8414     MAP_EVERY UNDISCH_TAC [`&0 < r`; `norm(u - z:complex) = r`] THEN
8415     NORM_ARITH_TAC;
8416     ALL_TAC] THEN
8417   ASM_SIMP_TAC[COMPLEX_FIELD
8418    `~(u = z) /\ ~(u = w) ==> ~((w - z) / (u - z) = Cx(&1))`] THEN
8419   ASM_SIMP_TAC[COMPLEX_FIELD
8420    `~(u = z) /\ ~(u = w)
8421     ==> x / (Cx(&1) - (w - z) / (u - z)) / (u - z) = x / (u - w)`] THEN
8422   ASM_SIMP_TAC[COMPLEX_FIELD
8423    `~(u = w)
8424     ==> (Cx(&1) - e) / (u - w) - inv(u - w) = --(e / (u - w))`] THEN
8425   REWRITE_TAC[COMPLEX_NORM_DIV; NORM_NEG; COMPLEX_NORM_POW] THEN
8426   MATCH_MP_TAC REAL_LET_TRANS THEN
8427   EXISTS_TAC `B * ((r - k) / r) pow N / k:real` THEN CONJ_TAC THENL
8428    [ALL_TAC;
8429     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
8430     ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_LT_LDIV_EQ]] THEN
8431   MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_SIMP_TAC[NORM_POS_LE] THEN
8432   REPEAT CONJ_TAC THENL
8433    [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_CBALL] THEN
8434     ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[dist; REAL_LE_REFL];
8435     MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[NORM_POS_LE] THEN
8436     MATCH_MP_TAC REAL_POW_LE THEN MATCH_MP_TAC REAL_LE_DIV THEN
8437     ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE];
8438     ALL_TAC] THEN
8439   REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
8440   REWRITE_TAC[GSYM real_div] THEN REPEAT CONJ_TAC THENL
8441    [MATCH_MP_TAC REAL_POW_LE THEN MATCH_MP_TAC REAL_LE_DIV THEN
8442     ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE];
8443     ALL_TAC;
8444     REWRITE_TAC[REAL_LE_INV_EQ; NORM_POS_LE];
8445     MATCH_MP_TAC REAL_LE_INV2 THEN ASM_SIMP_TAC[]] THEN
8446   MATCH_MP_TAC REAL_LE_TRANS THEN
8447   EXISTS_TAC `((r - k) / r:real) pow (SUC n)` THEN CONJ_TAC THENL
8448    [MATCH_MP_TAC REAL_POW_LE2 THEN
8449     ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LE_DIV; NORM_POS_LE; REAL_LT_IMP_LE];
8450     MATCH_MP_TAC REAL_POW_MONO_INV THEN
8451     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ] THEN
8452     ASM_SIMP_TAC[ARITH_RULE `N <= n ==> N <= SUC n`] THEN
8453     ASM_REAL_ARITH_TAC]);;
8454
8455 (* ------------------------------------------------------------------------- *)
8456 (* These weak Liouville versions don't even need the derivative formula.     *)
8457 (* ------------------------------------------------------------------------- *)
8458
8459 let LIOUVILLE_WEAK = prove
8460  (`!f l. f holomorphic_on (:complex) /\ (f --> l) at_infinity
8461          ==> !z. f(z) = l`,
8462   SUBGOAL_THEN
8463    `!f.  f holomorphic_on (:complex) /\ (f --> Cx(&0)) at_infinity
8464          ==> !z. f(z) = Cx(&0)`
8465   MP_TAC THENL
8466    [ALL_TAC;
8467     REPEAT STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o ISPEC
8468       `\z. (f:complex->complex) z - l`) THEN
8469     ASM_SIMP_TAC[VECTOR_SUB_EQ; HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST;
8470                  ETA_AX; GSYM LIM_NULL; GSYM COMPLEX_VEC_0]] THEN
8471   REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[TAUT `p = ~ ~ p`] THEN
8472   PURE_REWRITE_TAC[GSYM COMPLEX_NORM_NZ] THEN DISCH_TAC THEN
8473   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [LIM_AT_INFINITY]) THEN
8474   DISCH_THEN(MP_TAC o SPEC `norm((f:complex->complex) z) / &2`) THEN
8475   ASM_REWRITE_TAC[dist; REAL_HALF; COMPLEX_SUB_RZERO] THEN
8476   DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
8477   MP_TAC(SPECL [`f:complex->complex`; `z:complex`;
8478                 `&1 + abs B + norm(z:complex)`; `z:complex`]
8479                 CAUCHY_INTEGRAL_CIRCLEPATH) THEN
8480   ASM_SIMP_TAC[CONVEX_UNIV; INTERIOR_OPEN; OPEN_UNIV; IN_UNIV] THEN
8481   ABBREV_TAC `R = &1 + abs B + norm(z:complex)` THEN
8482   SUBGOAL_THEN `&0 < R` ASSUME_TAC THENL
8483    [ASM_MESON_TAC[NORM_POS_LE; REAL_ABS_POS; REAL_ARITH
8484      `&0 <= x /\ &0 <= y ==> &0 < &1 + x + y`]; ALL_TAC] THEN
8485   ASM_REWRITE_TAC[CENTRE_IN_BALL; NOT_IMP; CONJ_ASSOC] THEN CONJ_TAC THENL
8486    [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
8487                   SUBSET_UNIV];
8488     ALL_TAC] THEN
8489   DISCH_THEN(MP_TAC o MATCH_MP
8490    (ONCE_REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH)) THEN
8491   DISCH_THEN(MP_TAC o SPEC `norm((f:complex->complex) z) / &2 / R`) THEN
8492   ASM_SIMP_TAC[REAL_LE_DIV; NORM_POS_LE; REAL_POS; REAL_LT_IMP_LE] THEN
8493   ASM_SIMP_TAC[REAL_FIELD `&0 < R ==> x / R * &2 * pi * R = &2 * pi * x`] THEN
8494   REWRITE_TAC[NOT_IMP; REAL_NOT_LE] THEN CONJ_TAC THENL
8495    [REPEAT STRIP_TAC THEN ASM_SIMP_TAC[COMPLEX_NORM_DIV; REAL_LE_DIV2_EQ] THEN
8496     MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
8497     UNDISCH_TAC `norm(x - z:complex) = R` THEN EXPAND_TAC "R" THEN
8498     MATCH_MP_TAC(REAL_ARITH
8499      `d <= x + z ==> d = &1 + abs b + z ==> x >= b`) THEN
8500     REWRITE_TAC[VECTOR_SUB] THEN MESON_TAC[NORM_TRIANGLE; NORM_NEG];
8501     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_ABS_PI;
8502                 COMPLEX_NORM_II] THEN
8503     SIMP_TAC[REAL_LT_LMUL_EQ; REAL_OF_NUM_LT; ARITH; PI_POS; REAL_MUL_LID] THEN
8504     SUBGOAL_THEN `?w:complex. norm w = abs B` MP_TAC THENL
8505      [MESON_TAC[VECTOR_CHOOSE_SIZE; REAL_ABS_POS]; ALL_TAC] THEN
8506     ASM_MESON_TAC[NORM_POS_LE; REAL_ARITH
8507      `abs B >= B /\ (&0 <= x /\ x < z / &2 ==> z / &2 < z)`]]);;
8508
8509 let LIOUVILLE_WEAK_INVERSE = prove
8510  (`!f. f holomorphic_on (:complex) /\
8511        (!B. eventually (\x. norm(f x) >= B) at_infinity)
8512        ==> ?z. f(z) = Cx(&0)`,
8513   REPEAT STRIP_TAC THEN MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN
8514   PURE_REWRITE_TAC[NOT_EXISTS_THM] THEN DISCH_TAC THEN
8515   MP_TAC(SPECL [`\x:complex. Cx(&1) / (f(x))`; `Cx(&0)`] LIOUVILLE_WEAK) THEN
8516   ASM_SIMP_TAC[COMPLEX_FIELD `~(y = Cx(&0)) ==> ~(Cx(&1) / y = Cx(&0))`] THEN
8517   CONJ_TAC THENL
8518    [REWRITE_TAC[holomorphic_on; complex_div; COMPLEX_MUL_LID; IN_UNIV] THEN
8519     GEN_TAC THEN REWRITE_TAC[GSYM complex_differentiable; WITHIN_UNIV] THEN
8520     MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_INV_AT THEN ASM_REWRITE_TAC[] THEN
8521     ASM_MESON_TAC[OPEN_UNIV; HOLOMORPHIC_ON_OPEN; IN_UNIV;
8522                   complex_differentiable];
8523     REWRITE_TAC[tendsto] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
8524     FIRST_X_ASSUM(MP_TAC o SPEC `&2/ e`) THEN
8525     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8526     REWRITE_TAC[dist; COMPLEX_SUB_RZERO; real_ge; COMPLEX_NORM_DIV;
8527                 COMPLEX_NORM_CX; REAL_ABS_POS] THEN
8528     ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_LE_LDIV_EQ; COMPLEX_NORM_NZ] THEN
8529     REAL_ARITH_TAC]);;
8530
8531 (* ------------------------------------------------------------------------- *)
8532 (* In particular we get the Fundamental Theorem of Algebra.                  *)
8533 (* ------------------------------------------------------------------------- *)
8534
8535 let FTA = prove
8536  (`!a n. a(0) = Cx(&0) \/ ~(!k. k IN 1..n ==> a(k) = Cx(&0))
8537          ==> ?z. vsum(0..n) (\i. a(i) * z pow i) = Cx(&0)`,
8538   REPEAT STRIP_TAC THENL
8539    [EXISTS_TAC `Cx(&0)` THEN
8540     SIMP_TAC[VSUM_CLAUSES_LEFT; LE_0] THEN
8541     ASM_SIMP_TAC[ADD_CLAUSES; COMPLEX_POW_ZERO; LE_1; COMPLEX_ADD_LID;
8542                  COMPLEX_MUL_RZERO; COMPLEX_MUL_LZERO] THEN
8543     REWRITE_TAC[GSYM COMPLEX_VEC_0; VSUM_0];
8544     MATCH_MP_TAC LIOUVILLE_WEAK_INVERSE THEN CONJ_TAC THENL
8545      [MATCH_MP_TAC HOLOMORPHIC_ON_VSUM THEN
8546       SIMP_TAC[FINITE_NUMSEG; HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_MUL;
8547                HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID];
8548       ASM_MESON_TAC[COMPLEX_POLYFUN_EXTREMAL]]]);;
8549
8550 (* ------------------------------------------------------------------------- *)
8551 (* Weierstrass convergence theorem.                                          *)
8552 (* ------------------------------------------------------------------------- *)
8553
8554 let HOLOMORPHIC_UNIFORM_LIMIT = prove
8555  (`!net:(A net) f g z r.
8556         ~(trivial_limit net) /\
8557         eventually
8558            (\n. (f n) continuous_on cball(z,r) /\
8559                 (f n) holomorphic_on ball(z,r))
8560            net /\
8561         (!e. &0 < e
8562              ==> eventually (\n. !x. x IN cball(z,r) ==> norm(f n x - g x) < e)
8563                             net)
8564         ==> g continuous_on cball(z,r) /\ g holomorphic_on ball(z,r)`,
8565   REPEAT GEN_TAC THEN STRIP_TAC THEN
8566   DISJ_CASES_TAC(REAL_ARITH `r <= &0 \/ &0 < r`) THENL
8567    [ASM_SIMP_TAC[BALL_EMPTY; holomorphic_on; NOT_IN_EMPTY] THEN
8568     FIRST_X_ASSUM(DISJ_CASES_TAC o MATCH_MP (REAL_ARITH
8569      `r <= &0 ==> r < &0 \/ r = &0`)) THEN
8570     ASM_SIMP_TAC[continuous_on; CBALL_EMPTY; CBALL_SING; NOT_IN_EMPTY] THEN
8571     SIMP_TAC[IN_SING; DIST_REFL] THEN MESON_TAC[REAL_LT_01];
8572     ALL_TAC] THEN
8573   MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
8574    [MATCH_MP_TAC CONTINUOUS_UNIFORM_LIMIT THEN
8575     MAP_EVERY EXISTS_TAC [`net:A net`; `f:A->complex->complex`] THEN
8576     RULE_ASSUM_TAC(REWRITE_RULE[EVENTUALLY_AND]) THEN
8577     ASM_REWRITE_TAC[];
8578     ALL_TAC] THEN
8579   DISCH_TAC THEN
8580   MP_TAC(ISPECL
8581    [`\x. Cx(&1) / (Cx(&2) * Cx pi * ii) * g(x:complex)`;
8582     `g:complex->complex`; `z:complex`; `r:real`; `1`]
8583      CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
8584   SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8585   ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
8586   REWRITE_TAC[ARITH] THEN CONJ_TAC THENL
8587    [MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
8588     REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
8589     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8590     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8591     EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
8592     SIMP_TAC[SPHERE_SUBSET_CBALL];
8593     ALL_TAC] THEN
8594   X_GEN_TAC `w:complex` THEN DISCH_TAC THEN REWRITE_TAC[COMPLEX_POW_1] THEN
8595   REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC] THEN
8596   REWRITE_TAC[GSYM complex_div] THEN REWRITE_TAC[COMPLEX_MUL_ASSOC] THEN
8597   REWRITE_TAC[GSYM complex_div] THEN REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC] THEN
8598   SUBGOAL_THEN
8599    `(\u. g u / (u - w)) path_integrable_on circlepath(z,r) /\
8600     ((\n:A. path_integral(circlepath(z,r))
8601             (\u. f n u / (u - w))) -->
8602      path_integral(circlepath(z,r)) (\u. g u / (u - w))) net`
8603   MP_TAC THENL
8604    [MATCH_MP_TAC PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH THEN
8605     ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8606      [FIRST_X_ASSUM(fun th -> MP_TAC th THEN
8607         MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO)) THEN
8608       X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8609       MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_CIRCLEPATH THEN
8610       ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8611       REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8612       MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN CONJ_TAC THENL
8613        [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8614         EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
8615         SIMP_TAC[SUBSET; IN_CBALL; IN_ELIM_THM; NORM_SUB; dist; REAL_LE_REFL];
8616         ALL_TAC] THEN
8617       ASM_SIMP_TAC[CONTINUOUS_ON_COMPLEX_POW; CONTINUOUS_ON_SUB;
8618                    CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
8619       REWRITE_TAC[COMPLEX_POW_EQ_0; ARITH; IN_ELIM_THM] THEN
8620       GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
8621       SIMP_TAC[COMPLEX_SUB_0] THEN DISCH_THEN SUBST_ALL_TAC THEN
8622       ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8623       ALL_TAC] THEN
8624     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
8625     FIRST_X_ASSUM(MP_TAC o SPEC `e * abs(r - norm(w - z:complex))`) THEN
8626     SUBGOAL_THEN `&0 < e * abs(r - norm(w - z:complex))` ASSUME_TAC THENL
8627      [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[GSYM REAL_ABS_NZ] THEN
8628       SIMP_TAC[REAL_SUB_0] THEN
8629       ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8630       ALL_TAC] THEN
8631     ASM_REWRITE_TAC[] THEN
8632     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8633     X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN
8634     MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `x:complex` THEN
8635     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8636     REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8637     REWRITE_TAC[IN_ELIM_THM] THEN
8638     DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
8639     ASM_REWRITE_TAC[IN_CBALL] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
8640     ASM_REWRITE_TAC[dist; REAL_LE_REFL] THEN
8641     SUBGOAL_THEN `~(x:complex = w)` ASSUME_TAC THENL
8642      [DISCH_THEN SUBST_ALL_TAC THEN
8643       ASM_MESON_TAC[IN_BALL; dist; NORM_SUB; REAL_LT_REFL];
8644       ALL_TAC] THEN
8645     ASM_SIMP_TAC[COMPLEX_FIELD
8646      `~(x = w) ==> a / (x - w) - b / (x - w) =
8647                    (a - b:complex) / (x - w)`] THEN
8648     ASM_SIMP_TAC[COMPLEX_NORM_DIV; REAL_LT_LDIV_EQ; COMPLEX_NORM_NZ;
8649                  COMPLEX_POW_EQ_0; COMPLEX_SUB_0] THEN
8650     MATCH_MP_TAC(REAL_ARITH `a <= b ==> x < a ==> x < b`) THEN
8651     ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_LT_IMP_LE; COMPLEX_NORM_POW] THEN
8652     MATCH_MP_TAC(REAL_ARITH `w < r /\ r <= x + w ==> abs(r - w) <= x`) THEN
8653     CONJ_TAC THENL [ASM_MESON_TAC[IN_BALL; dist; NORM_SUB]; ALL_TAC] THEN
8654     FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
8655     REWRITE_TAC[GSYM dist] THEN MESON_TAC[DIST_TRIANGLE];
8656     ALL_TAC] THEN
8657   STRIP_TAC THEN
8658   FIRST_X_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRAL) THEN
8659   DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
8660     MATCH_MP HAS_PATH_INTEGRAL_COMPLEX_LMUL) THEN
8661   MATCH_MP_TAC EQ_IMP THEN REWRITE_TAC[] THEN AP_THM_TAC THEN AP_TERM_TAC THEN
8662   MATCH_MP_TAC LIM_UNIQUE THEN
8663   MAP_EVERY EXISTS_TAC [`net:A net`; `\n. (f:A->complex->complex) n w`] THEN
8664   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8665    [ALL_TAC;
8666     REWRITE_TAC[tendsto; dist] THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
8667     FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
8668     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8669     REWRITE_TAC[] THEN ASM_MESON_TAC[SUBSET; BALL_SUBSET_CBALL]] THEN
8670   SUBGOAL_THEN
8671    `((\n:A. Cx(&2) * Cx pi * ii * f n w)
8672      --> path_integral (circlepath (z,r)) (\u. g u / (u - w))) net`
8673   MP_TAC THENL
8674    [MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN EXISTS_TAC
8675      `\n:A. path_integral (circlepath (z,r)) (\u. f n u / (u - w))` THEN
8676     ASM_REWRITE_TAC[] THEN
8677     FIRST_X_ASSUM(fun th -> MP_TAC th THEN
8678      MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO)) THEN
8679     X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8680     MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
8681     MATCH_MP_TAC CAUCHY_INTEGRAL_CIRCLEPATH THEN
8682     ASM_REWRITE_TAC[ETA_AX];
8683     ALL_TAC] THEN
8684   DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
8685     MATCH_MP LIM_COMPLEX_LMUL) THEN
8686   SIMP_TAC[CX_2PII_NZ; COMPLEX_FIELD
8687    `~(x * y * z = Cx(&0)) ==> Cx(&1) / (x * y * z) * x * y * z * w = w`]);;
8688
8689 (* ------------------------------------------------------------------------- *)
8690 (* Version showing that the limit is the limit of the derivatives.           *)
8691 (* ------------------------------------------------------------------------- *)
8692
8693 let HAS_COMPLEX_DERIVATIVE_UNIFORM_LIMIT = prove
8694  (`!net:(A net) f f' g z r.
8695         &0 < r /\ ~(trivial_limit net) /\
8696         eventually
8697           (\n. (f n) continuous_on cball(z,r) /\
8698                (!w. w IN ball(z,r)
8699                     ==> ((f n) has_complex_derivative (f' n w)) (at w)))
8700           net /\
8701         (!e. &0 < e
8702              ==> eventually (\n. !x. x IN cball(z,r) ==> norm(f n x - g x) < e)
8703                             net)
8704         ==> g continuous_on cball(z,r) /\
8705             ?g'. !w. w IN ball(z,r)
8706                      ==> (g has_complex_derivative (g' w)) (at w) /\
8707                          ((\n. f' n w) --> g' w) net`,
8708   REPEAT GEN_TAC THEN STRIP_TAC THEN
8709   MP_TAC(SPECL [`net:(A)net`; `f:A->complex->complex`;
8710                 `g:complex->complex`; `z:complex`; `r:real`]
8711                HOLOMORPHIC_UNIFORM_LIMIT) THEN
8712   ANTS_TAC THENL
8713    [ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(fun th ->
8714       MP_TAC th THEN MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ]
8715         EVENTUALLY_MONO)) THEN
8716     SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN MESON_TAC[];
8717     ALL_TAC] THEN
8718   SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8719   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC
8720     (MP_TAC o REWRITE_RULE[RIGHT_IMP_EXISTS_THM])) THEN
8721   REWRITE_TAC[SKOLEM_THM] THEN MATCH_MP_TAC MONO_EXISTS THEN
8722   X_GEN_TAC `g':complex->complex` THEN STRIP_TAC THEN
8723   ASM_SIMP_TAC[] THEN X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
8724   ONCE_REWRITE_TAC[LIM_NULL] THEN MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
8725   EXISTS_TAC
8726    `\n. Cx(&1) / (Cx(&2) * Cx pi * ii) *
8727         (path_integral(circlepath(z,r)) (\x. f (n:A) x / (x - w) pow 2) -
8728          path_integral(circlepath(z,r)) (\x. g x / (x - w) pow 2))` THEN
8729   REWRITE_TAC[] THEN CONJ_TAC THENL
8730    [FIRST_X_ASSUM(fun th ->
8731       MP_TAC th THEN MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ]
8732         EVENTUALLY_MONO)) THEN
8733     X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8734     REWRITE_TAC[COMPLEX_SUB_LDISTRIB] THEN BINOP_TAC THEN
8735     MATCH_MP_TAC COMPLEX_DERIVATIVE_UNIQUE_AT THENL
8736      [EXISTS_TAC `(f:A->complex->complex) a`;
8737       EXISTS_TAC `g:complex->complex`] THEN
8738     EXISTS_TAC `w:complex` THEN ASM_SIMP_TAC[] THEN
8739     W(fun (asl,w) -> MP_TAC(PART_MATCH (rand o rand)
8740       CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH w)) THEN
8741     ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8742     ANTS_TAC THEN SIMP_TAC[] THEN ASM_MESON_TAC[];
8743     ALL_TAC] THEN
8744   REWRITE_TAC[COMPLEX_VEC_0] THEN
8745   SUBST1_TAC(SYM(SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` COMPLEX_MUL_RZERO)) THEN
8746   MATCH_MP_TAC LIM_COMPLEX_MUL THEN REWRITE_TAC[LIM_CONST] THEN
8747   REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN REWRITE_TAC[GSYM LIM_NULL] THEN
8748   W(fun (asl,w) -> MP_TAC(PART_MATCH (rand o rand)
8749       PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH w)) THEN
8750   ANTS_TAC THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL
8751    [FIRST_X_ASSUM(fun th -> MP_TAC th THEN
8752       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO)) THEN
8753     X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8754     MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_CIRCLEPATH THEN
8755     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8756     REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8757     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN CONJ_TAC THENL
8758      [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8759       EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
8760       SIMP_TAC[SUBSET; IN_CBALL; IN_ELIM_THM; NORM_SUB; dist; REAL_LE_REFL];
8761       ALL_TAC] THEN
8762     ASM_SIMP_TAC[CONTINUOUS_ON_COMPLEX_POW; CONTINUOUS_ON_SUB;
8763                  CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
8764     REWRITE_TAC[COMPLEX_POW_EQ_0; ARITH; IN_ELIM_THM] THEN
8765     GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
8766     SIMP_TAC[COMPLEX_SUB_0] THEN DISCH_THEN SUBST_ALL_TAC THEN
8767     ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8768     ALL_TAC] THEN
8769   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
8770   FIRST_X_ASSUM(MP_TAC o SPEC `e * abs(r - norm(w - z:complex)) pow 2`) THEN
8771   SUBGOAL_THEN `&0 < e * abs(r - norm(w - z:complex)) pow 2` ASSUME_TAC THENL
8772    [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[] THEN
8773     MATCH_MP_TAC REAL_POW_LT THEN REWRITE_TAC[GSYM REAL_ABS_NZ] THEN
8774     SIMP_TAC[REAL_SUB_0] THEN
8775     ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8776     ALL_TAC] THEN
8777   ASM_REWRITE_TAC[] THEN
8778   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8779   X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN
8780   MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `x:complex` THEN
8781   ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8782   REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8783   REWRITE_TAC[IN_ELIM_THM] THEN
8784   DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
8785   ASM_REWRITE_TAC[IN_CBALL] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
8786   ASM_REWRITE_TAC[dist; REAL_LE_REFL] THEN
8787   SUBGOAL_THEN `~(x:complex = w)` ASSUME_TAC THENL
8788    [DISCH_THEN SUBST_ALL_TAC THEN
8789     ASM_MESON_TAC[IN_BALL; dist; NORM_SUB; REAL_LT_REFL];
8790     ALL_TAC] THEN
8791   ASM_SIMP_TAC[COMPLEX_FIELD
8792    `~(x = w) ==> a / (x - w) pow 2 - b / (x - w) pow 2 =
8793                  (a - b:complex) / (x - w) pow 2`] THEN
8794   ASM_SIMP_TAC[COMPLEX_NORM_DIV; REAL_LT_LDIV_EQ; COMPLEX_NORM_NZ;
8795                COMPLEX_POW_EQ_0; COMPLEX_SUB_0] THEN
8796   MATCH_MP_TAC(REAL_ARITH `a <= b ==> x < a ==> x < b`) THEN
8797   ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_LT_IMP_LE; COMPLEX_NORM_POW] THEN
8798   MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN
8799   MATCH_MP_TAC(REAL_ARITH `w < r /\ r <= x + w ==> abs(r - w) <= x`) THEN
8800   CONJ_TAC THENL [ASM_MESON_TAC[IN_BALL; dist; NORM_SUB]; ALL_TAC] THEN
8801   FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
8802   REWRITE_TAC[GSYM dist] THEN MESON_TAC[DIST_TRIANGLE]);;
8803
8804 (* ------------------------------------------------------------------------- *)
8805 (* Some more simple/convenient versions for applications.                    *)
8806 (* ------------------------------------------------------------------------- *)
8807
8808 let HOLOMORPHIC_UNIFORM_SEQUENCE = prove
8809  (`!f g s.
8810         open s /\
8811         (!n. (f n) holomorphic_on s) /\
8812         (!x. x IN s
8813              ==> ?d. &0 < d /\ cball(x,d) SUBSET s /\
8814                      !e. &0 < e
8815                          ==> eventually (\n. !y. y IN cball(x,d)
8816                                                  ==> norm(f n y - g y) < e)
8817                                         sequentially)
8818         ==> g holomorphic_on s`,
8819   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN] THEN
8820   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8821   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
8822   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
8823   MP_TAC(ISPECL [`sequentially`; `f:num->complex->complex`;
8824                  `g:complex->complex`; `z:complex`; `r:real`]
8825                 HOLOMORPHIC_UNIFORM_LIMIT) THEN
8826   ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN ANTS_TAC THENL
8827    [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
8828     ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
8829                   BALL_SUBSET_CBALL];
8830     SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8831     ASM_MESON_TAC[CENTRE_IN_BALL]]);;
8832
8833 let HAS_COMPLEX_DERIVATIVE_UNIFORM_SEQUENCE = prove
8834  (`!f f' g s.
8835         open s /\
8836         (!n x. x IN s ==> ((f n) has_complex_derivative f' n x) (at x)) /\
8837         (!x. x IN s
8838              ==> ?d. &0 < d /\ cball(x,d) SUBSET s /\
8839                      !e. &0 < e
8840                          ==> eventually (\n. !y. y IN cball(x,d)
8841                                                  ==> norm(f n y - g y) < e)
8842                                         sequentially)
8843         ==> ?g'. !x. x IN s ==> (g has_complex_derivative g'(x)) (at x) /\
8844                                 ((\n. f' n x) --> g'(x)) sequentially`,
8845   REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_EXISTS_IMP_THM] THEN
8846   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8847   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
8848   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
8849   MP_TAC(ISPECL [`sequentially`; `f:num->complex->complex`;
8850                  `f':num->complex->complex`;
8851                  `g:complex->complex`; `z:complex`; `r:real`]
8852                 HAS_COMPLEX_DERIVATIVE_UNIFORM_LIMIT) THEN
8853   ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN ANTS_TAC THENL
8854    [ALL_TAC; ASM_MESON_TAC[CENTRE_IN_BALL]] THEN
8855   MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN
8856   REWRITE_TAC[] THEN CONJ_TAC THENL
8857    [MATCH_MP_TAC CONTINUOUS_AT_IMP_CONTINUOUS_ON THEN
8858     ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_IMP_CONTINUOUS_AT; SUBSET];
8859     ASM_MESON_TAC[BALL_SUBSET_CBALL; SUBSET]]);;
8860
8861 (* ------------------------------------------------------------------------- *)
8862 (* A one-stop shop for an analytic function defined by a series.             *)
8863 (* ------------------------------------------------------------------------- *)
8864
8865 let SERIES_AND_DERIVATIVE_COMPARISON = prove
8866  (`!f f' s k h.
8867      open s /\
8868      (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
8869      (?l. (lift o h sums l) k) /\
8870      (?N. !n x. N <= n /\ n IN k /\ x IN s ==> norm(f n x) <= h n)
8871           ==> ?g g'. !x. x IN s
8872                          ==> ((\n. f n x) sums g x) k /\
8873                              ((\n. f' n x) sums g' x) k /\
8874                              (g has_complex_derivative g' x) (at x)`,
8875   REPEAT GEN_TAC THEN
8876   REPLICATE_TAC 2 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
8877   DISCH_THEN(MP_TAC o MATCH_MP SERIES_COMPARISON_UNIFORM) THEN
8878   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
8879   REWRITE_TAC[] THEN DISCH_TAC THEN
8880   REWRITE_TAC[TAUT `a ==> b /\ c /\ d <=> (a ==> b) /\ (a ==> d /\ c)`] THEN
8881   REWRITE_TAC[FORALL_AND_THM; RIGHT_EXISTS_AND_THM] THEN CONJ_TAC THENL
8882    [REWRITE_TAC[sums; LIM_SEQUENTIALLY] THEN ASM_MESON_TAC[]; ALL_TAC] THEN
8883   REWRITE_TAC[sums] THEN
8884   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_UNIFORM_SEQUENCE THEN
8885   EXISTS_TAC `\n x. vsum
8886     (k INTER (0..n)) (\n. (f:num->complex->complex) n x)` THEN
8887   ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_VSUM; FINITE_INTER_NUMSEG; IN_INTER] THEN
8888   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8889   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
8890   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[GSYM dist] THEN
8891   MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[EVENTUALLY_SEQUENTIALLY] THEN
8892   ASM_MESON_TAC[SUBSET]);;
8893
8894 (* ------------------------------------------------------------------------- *)
8895 (* A version where we only have local uniform/comparative convergence.       *)
8896 (* ------------------------------------------------------------------------- *)
8897
8898 let SERIES_AND_DERIVATIVE_COMPARISON_LOCAL = prove
8899  (`!f f' s k.
8900      open s /\
8901      (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
8902      (!x. x IN s
8903           ==> ?d h N. &0 < d /\ (?l. (lift o h sums l) k) /\
8904                       !n y. N <= n /\ n IN k /\ y IN ball(x,d)
8905                                ==> norm(f n y) <= h n)
8906      ==> ?g g'. !x. x IN s
8907                     ==> ((\n. f n x) sums g x) k /\
8908                         ((\n. f' n x) sums g' x) k /\
8909                         (g has_complex_derivative g' x) (at x)`,
8910   REPEAT STRIP_TAC THEN
8911   EXISTS_TAC `\x. infsum k (\n. (f:num->complex->complex) n x)` THEN
8912   REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_EXISTS_IMP_THM] THEN
8913   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8914   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
8915   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
8916   MAP_EVERY X_GEN_TAC [`d:real`; `h:num->real`; `N:num`] THEN
8917   DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
8918   MP_TAC(ISPECL [`f:num->complex->complex`; `f':num->complex->complex`;
8919                  `ball(z:complex,d) INTER s`; `k:num->bool`; `h:num->real`]
8920                 SERIES_AND_DERIVATIVE_COMPARISON) THEN
8921   ASM_SIMP_TAC[OPEN_INTER; OPEN_BALL; IN_INTER] THEN
8922   ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
8923   DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` MP_TAC) THEN
8924   ONCE_REWRITE_TAC[TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
8925   REWRITE_TAC[FORALL_AND_THM; RIGHT_EXISTS_AND_THM] THEN
8926   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
8927   REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_AND_EXISTS_THM] THEN
8928   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
8929   MATCH_MP_TAC MONO_EXISTS THEN ASM_SIMP_TAC[CENTRE_IN_BALL] THEN
8930   X_GEN_TAC `g':complex` THEN REPEAT STRIP_TAC THENL
8931    [ASM_MESON_TAC[SUMS_INFSUM; CENTRE_IN_BALL; summable]; ALL_TAC] THEN
8932   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_AT THEN
8933   EXISTS_TAC `g:complex->complex` THEN
8934   MP_TAC(ISPEC `ball(z:complex,d) INTER s` OPEN_CONTAINS_BALL) THEN
8935   ASM_SIMP_TAC[OPEN_INTER; OPEN_BALL] THEN
8936   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
8937   ASM_REWRITE_TAC[IN_INTER; CENTRE_IN_BALL] THEN MATCH_MP_TAC MONO_EXISTS THEN
8938   REWRITE_TAC[SUBSET; IN_BALL; IN_INTER] THEN
8939   ASM_MESON_TAC[INFSUM_UNIQUE; SUBSET; IN_BALL; DIST_SYM]);;
8940
8941 (* ------------------------------------------------------------------------- *)
8942 (* Sometimes convenient to compare with a complex series of +ve reals.       *)
8943 (* ------------------------------------------------------------------------- *)
8944
8945 let SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX = prove
8946  (`!f f' s k.
8947      open s /\
8948      (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
8949      (!x. x IN s
8950           ==> ?d h N. &0 < d /\ summable k h /\
8951                       (!n. n IN k ==> real(h n) /\ &0 <= Re(h n)) /\
8952                       (!n y. N <= n /\ n IN k /\ y IN ball(x,d)
8953                              ==> norm(f n y) <= norm(h n)))
8954      ==> ?g g'. !x. x IN s
8955                     ==> ((\n. f n x) sums g x) k /\
8956                         ((\n. f' n x) sums g' x) k /\
8957                         (g has_complex_derivative g' x) (at x)`,
8958   REPEAT STRIP_TAC THEN
8959   MATCH_MP_TAC SERIES_AND_DERIVATIVE_COMPARISON_LOCAL THEN
8960   ASM_REWRITE_TAC[] THEN X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
8961   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
8962   ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
8963   X_GEN_TAC `d:real` THEN ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
8964   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
8965   DISCH_THEN(X_CHOOSE_THEN `h:num->complex` STRIP_ASSUME_TAC) THEN
8966   EXISTS_TAC `\n. norm((h:num->complex) n)` THEN ASM_REWRITE_TAC[] THEN
8967   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [summable]) THEN
8968   DISCH_THEN(X_CHOOSE_THEN `l:complex` STRIP_ASSUME_TAC) THEN
8969   EXISTS_TAC `lift(Re l)` THEN MATCH_MP_TAC SUMS_EQ THEN
8970   EXISTS_TAC `\i:num. lift(Re(h i))` THEN
8971   ASM_SIMP_TAC[REAL_NORM_POS; o_DEF] THEN
8972   REWRITE_TAC[RE_DEF] THEN MATCH_MP_TAC SERIES_COMPONENT THEN
8973   ASM_REWRITE_TAC[DIMINDEX_2; ARITH]);;
8974
8975 let SERIES_DIFFERENTIABLE_COMPARISON_COMPLEX = prove
8976  (`!f s k.
8977      open s /\
8978      (!n x. n IN k /\ x IN s ==> (f n) complex_differentiable (at x)) /\
8979      (!x. x IN s
8980           ==> ?d h N. &0 < d /\ summable k h /\
8981                       (!n. n IN k ==> real(h n) /\ &0 <= Re(h n)) /\
8982                       (!n y. N <= n /\ n IN k /\ y IN ball(x,d)
8983                              ==> norm(f n y) <= norm(h n)))
8984      ==> ?g. !x. x IN s
8985                  ==> ((\n. f n x) sums g x) k /\
8986                       g complex_differentiable (at x)`,
8987   REPEAT GEN_TAC THEN
8988   REWRITE_TAC[complex_differentiable; RIGHT_AND_EXISTS_THM] THEN
8989   GEN_REWRITE_TAC (PAT_CONV `\x. a /\ x /\ b ==> x` o ONCE_DEPTH_CONV)
8990    [RIGHT_IMP_EXISTS_THM] THEN
8991   REWRITE_TAC[SKOLEM_THM] THEN
8992   REWRITE_TAC[RIGHT_AND_EXISTS_THM; LEFT_AND_EXISTS_THM] THEN
8993   DISCH_THEN(CHOOSE_THEN (MP_TAC o MATCH_MP
8994      SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX)) THEN
8995   MESON_TAC[]);;
8996
8997 (* ------------------------------------------------------------------------- *)
8998 (* In particular, a power series is analytic inside circle of convergence.   *)
8999 (* ------------------------------------------------------------------------- *)
9000
9001 let POWER_SERIES_AND_DERIVATIVE_0 = prove
9002  (`!k a r. summable k (\n. a(n) * Cx(r) pow n)
9003            ==> ?g g'.
9004                   !z. norm(z) < r
9005                       ==> ((\n. a(n) * z pow n) sums g(z)) k /\
9006                           ((\n. Cx(&n) * a(n) * z pow (n - 1)) sums g'(z)) k /\
9007                           (g has_complex_derivative g' z) (at z)`,
9008   REPEAT STRIP_TAC THEN
9009   ASM_CASES_TAC `&0 < r` THEN
9010   ASM_SIMP_TAC[NORM_ARITH `~(&0 < r) ==> ~(norm z < r)`] THEN
9011   SUBGOAL_THEN `!z. norm(z) < r <=> z IN ball(Cx(&0),r)`
9012    (fun th -> REWRITE_TAC[th])
9013   THENL
9014    [REWRITE_TAC[IN_BALL; dist; COMPLEX_SUB_LZERO; NORM_NEG]; ALL_TAC] THEN
9015   MATCH_MP_TAC SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX THEN
9016   REWRITE_TAC[OPEN_BALL; IN_BALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
9017   CONJ_TAC THENL
9018    [REPEAT STRIP_TAC THEN COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING;
9019     ALL_TAC] THEN
9020   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9021   MAP_EVERY EXISTS_TAC
9022    [`(r - norm(z:complex)) / &2`;
9023     `\n. Cx(norm(a(n):complex) * ((r + norm(z:complex)) / &2) pow n)`;
9024     `0`] THEN
9025   ASM_REWRITE_TAC[REAL_SUB_LT; REAL_HALF; REAL_CX; RE_CX] THEN
9026   REPEAT CONJ_TAC THENL
9027    [REWRITE_TAC[CX_MUL; CX_POW] THEN
9028     MATCH_MP_TAC POWER_SERIES_CONV_IMP_ABSCONV_WEAK THEN
9029     EXISTS_TAC `Cx r` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[COMPLEX_NORM_CX];
9030     REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN
9031     REWRITE_TAC[NORM_POS_LE] THEN MATCH_MP_TAC REAL_POW_LE;
9032     REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_NORM_CX; COMPLEX_NORM_MUL] THEN
9033     REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NORM] THEN
9034     MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
9035     REWRITE_TAC[COMPLEX_NORM_POW; REAL_ABS_POW] THEN
9036     MATCH_MP_TAC REAL_POW_LE2] THEN
9037   ASM_NORM_ARITH_TAC);;
9038
9039 let POWER_SERIES_AND_DERIVATIVE = prove
9040  (`!k a r w.
9041         summable k (\n. a(n) * Cx(r) pow n)
9042         ==> ?g g'.
9043              !z. z IN ball(w,r)
9044                  ==> ((\n. a(n) * (z - w) pow n) sums g(z)) k /\
9045                      ((\n. Cx(&n) * a(n) * (z - w) pow (n - 1)) sums g'(z)) k /\
9046                      (g has_complex_derivative g' z) (at z)`,
9047   REPEAT STRIP_TAC THEN
9048   FIRST_ASSUM(MP_TAC o MATCH_MP POWER_SERIES_AND_DERIVATIVE_0) THEN
9049   REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
9050   MAP_EVERY X_GEN_TAC [`g:complex->complex`; `g':complex->complex`] THEN
9051   DISCH_TAC THEN
9052   EXISTS_TAC `(\z. g(z - w)):complex->complex` THEN
9053   EXISTS_TAC `(\z. g'(z - w)):complex->complex` THEN
9054   REWRITE_TAC[IN_BALL; dist] THEN X_GEN_TAC `z:complex` THEN
9055   DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `z - w:complex`) THEN
9056   ANTS_TAC THENL [ASM_MESON_TAC[NORM_SUB]; ALL_TAC] THEN
9057   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
9058   GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
9059   GEN_REWRITE_TAC (RATOR_CONV o RAND_CONV) [GSYM COMPLEX_MUL_RID] THEN
9060   MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN ASM_REWRITE_TAC[] THEN
9061   COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_SUB_RZERO]);;
9062
9063 let POWER_SERIES_HOLOMORPHIC = prove
9064  (`!a k f z r. (!w. w IN ball(z,r) ==> ((\n. a(n) * (w - z) pow n) sums f w) k)
9065                ==> f holomorphic_on ball(z,r)`,
9066   REPEAT STRIP_TAC THEN SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
9067   X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_BALL; dist] THEN DISCH_TAC THEN
9068   MP_TAC(ISPECL [`k:num->bool`; `a:num->complex`;
9069                  `(norm(z - w:complex) + r) / &2`; `z:complex`]
9070                 POWER_SERIES_AND_DERIVATIVE) THEN
9071   ANTS_TAC THENL
9072    [FIRST_X_ASSUM(MP_TAC o SPEC `z + Cx((norm(z - w) + r) / &2)`) THEN
9073     REWRITE_TAC[IN_BALL; dist; COMPLEX_RING `(z + w) - z:complex = w`;
9074                 NORM_ARITH `norm(z - (z + w)) = norm w`; summable] THEN
9075     ANTS_TAC THENL [REWRITE_TAC[COMPLEX_NORM_CX]; MESON_TAC[]] THEN
9076     POP_ASSUM MP_TAC THEN NORM_ARITH_TAC;
9077     ALL_TAC] THEN
9078   DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` MP_TAC) THEN
9079   DISCH_THEN(X_CHOOSE_THEN `g':complex->complex` (LABEL_TAC "*")) THEN
9080   EXISTS_TAC `(g':complex->complex) w` THEN
9081   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_AT THEN
9082   MAP_EVERY EXISTS_TAC
9083    [`g:complex->complex`; `(r - norm(z - w:complex)) / &2`] THEN
9084   REPEAT CONJ_TAC THENL
9085    [UNDISCH_TAC `norm(z - w:complex) < r` THEN NORM_ARITH_TAC;
9086     ALL_TAC;
9087     REMOVE_THEN "*" (MP_TAC o SPEC `w:complex`) THEN ANTS_TAC THENL
9088      [ALL_TAC; SIMP_TAC[]] THEN REWRITE_TAC[IN_BALL] THEN
9089     UNDISCH_TAC `norm(z - w:complex) < r` THEN NORM_ARITH_TAC] THEN
9090   X_GEN_TAC `u:complex` THEN REWRITE_TAC[dist] THEN DISCH_TAC THEN
9091   MATCH_MP_TAC SERIES_UNIQUE THEN
9092   EXISTS_TAC `(\n. a(n) * (u - z) pow n):num->complex` THEN
9093   EXISTS_TAC `k:num->bool` THEN CONJ_TAC THENL
9094    [REMOVE_THEN "*" (MP_TAC o SPEC `u:complex`) THEN
9095     ANTS_TAC THENL [ALL_TAC; SIMP_TAC[]];
9096     FIRST_X_ASSUM MATCH_MP_TAC] THEN
9097   REWRITE_TAC[IN_BALL] THEN ASM_NORM_ARITH_TAC);;
9098
9099 let HOLOMORPHIC_IFF_POWER_SERIES = prove
9100  (`!f z r. f holomorphic_on ball(z,r) <=>
9101              !w. w IN ball(z,r)
9102                  ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
9103                        (w - z) pow n) sums
9104                       f w)
9105                      (from 0)`,
9106   REPEAT GEN_TAC THEN EQ_TAC THEN REPEAT STRIP_TAC THENL
9107    [ASM_MESON_TAC[HOLOMORPHIC_POWER_SERIES]; ALL_TAC] THEN
9108   MATCH_MP_TAC POWER_SERIES_HOLOMORPHIC THEN
9109   MAP_EVERY EXISTS_TAC
9110    [`\n. higher_complex_derivative n f z / Cx(&(FACT n))`;
9111     `from 0`] THEN
9112   ASM_REWRITE_TAC[]);;
9113
9114 let POWER_SERIES_ANALYTIC = prove
9115  (`!a k f z r. (!w. w IN ball(z,r) ==> ((\n. a(n) * (w - z) pow n) sums f w) k)
9116                ==> f analytic_on ball(z,r)`,
9117   SIMP_TAC[ANALYTIC_ON_OPEN; OPEN_BALL] THEN
9118   REWRITE_TAC[POWER_SERIES_HOLOMORPHIC]);;
9119
9120 let ANALYTIC_IFF_POWER_SERIES = prove
9121  (`!f z r. f analytic_on ball(z,r) <=>
9122              !w. w IN ball(z,r)
9123                  ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
9124                        (w - z) pow n) sums
9125                       f w)
9126                      (from 0)`,
9127   SIMP_TAC[ANALYTIC_ON_OPEN; OPEN_BALL] THEN
9128   REWRITE_TAC[HOLOMORPHIC_IFF_POWER_SERIES]);;
9129
9130 let HIGHER_COMPLEX_DERIVATIVE_POWER_SERIES = prove
9131  (`!f c r n.
9132         &0 < r /\ n IN k /\
9133         (!w. dist(w,z) < r ==> ((\i. c i * (w - z) pow i) sums f(w)) k)
9134         ==> higher_complex_derivative n f z / Cx(&(FACT n)) = c n`,
9135   REPEAT STRIP_TAC THEN
9136   SUBGOAL_THEN `f holomorphic_on ball(z,r)` ASSUME_TAC THENL
9137    [MATCH_MP_TAC POWER_SERIES_HOLOMORPHIC THEN
9138     REWRITE_TAC[IN_BALL] THEN ASM_MESON_TAC[DIST_SYM];
9139     ALL_TAC] THEN
9140   SUBGOAL_THEN
9141    `!i. i IN (:num)
9142         ==> higher_complex_derivative i f z / Cx(&(FACT i)) -
9143             (if i IN k then c i else vec 0) = Cx(&0)`
9144   MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[IN_UNIV; COMPLEX_SUB_0]] THEN
9145   MATCH_MP_TAC POWER_SERIES_LIMIT_POINT_OF_ZEROS THEN MAP_EVERY EXISTS_TAC
9146    [`\w:complex. Cx(&0)`; `r:real`; `ball(z:complex,r)`] THEN
9147   ASM_SIMP_TAC[LIMPT_BALL; CENTRE_IN_CBALL; REAL_LT_IMP_LE] THEN
9148   X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
9149   REWRITE_TAC[COMPLEX_SUB_RDISTRIB] THEN
9150   SUBST1_TAC(COMPLEX_RING `Cx(&0) = (f:complex->complex) w - f w`) THEN
9151   MATCH_MP_TAC SERIES_SUB THEN CONJ_TAC THENL
9152    [REWRITE_TAC[GSYM FROM_0] THEN MATCH_MP_TAC HOLOMORPHIC_POWER_SERIES THEN
9153     ASM_MESON_TAC[IN_BALL; DIST_SYM];
9154     REWRITE_TAC[COND_RAND; COND_RATOR; COMPLEX_VEC_0] THEN
9155     REWRITE_TAC[COMPLEX_MUL_LZERO] THEN
9156     ASM_SIMP_TAC[GSYM COMPLEX_VEC_0; SERIES_RESTRICT]]);;
9157
9158 (* ------------------------------------------------------------------------- *)
9159 (* Taylor series for arctan. So we can do term-by-term integration of        *)
9160 (* geometric series, this ends up quite late in the development.             *)
9161 (* ------------------------------------------------------------------------- *)
9162
9163 let CATAN_CONVERGS = prove
9164  (`!z. norm(z) < &1
9165        ==> ((\n. --(Cx(&1)) pow n / Cx(&(2 * n + 1)) * z pow (2 * n + 1))
9166             sums catn(z)) (from 0)`,
9167   MP_TAC(ISPECL
9168      [`\n z. --(Cx(&1)) pow n / Cx(&(2 * n + 1)) * z pow (2 * n + 1)`;
9169       `\n z. --(Cx(&1)) pow n * z pow (2 * n)`;
9170       `ball(Cx(&0),&1)`; `from 0`
9171      ] SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX) THEN
9172   REWRITE_TAC[OPEN_BALL; COMPLEX_IN_BALL_0] THEN ANTS_TAC THENL
9173    [CONJ_TAC THENL
9174      [REPEAT STRIP_TAC THEN
9175       COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_MUL_RID; ADD_SUB] THEN
9176       REWRITE_TAC[COMPLEX_MUL_ASSOC] THEN AP_THM_TAC THEN AP_TERM_TAC THEN
9177       REWRITE_TAC[GSYM CX_POW; GSYM CX_NEG; GSYM CX_MUL; GSYM CX_DIV; CX_INJ;
9178                   GSYM REAL_OF_NUM_ADD; GSYM REAL_OF_NUM_MUL] THEN
9179       CONV_TAC REAL_FIELD;
9180       X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9181       EXISTS_TAC `(&1 - norm(z:complex)) / &2` THEN
9182       EXISTS_TAC `\n. Cx((&1 + norm(z:complex)) / &2) pow (2 * n + 1)` THEN
9183       EXISTS_TAC `1` THEN REWRITE_TAC[o_DEF] THEN REPEAT CONJ_TAC THENL
9184        [ASM_REAL_ARITH_TAC;
9185         REWRITE_TAC[COMPLEX_POW_ADD; GSYM COMPLEX_POW_POW] THEN
9186         MATCH_MP_TAC SUMMABLE_COMPLEX_RMUL THEN MATCH_MP_TAC SUMMABLE_GP THEN
9187         REWRITE_TAC[COMPLEX_NORM_CX; COMPLEX_NORM_POW; ABS_SQUARE_LT_1] THEN
9188         POP_ASSUM MP_TAC THEN NORM_ARITH_TAC;
9189         SIMP_TAC[RE_CX; REAL_POW; REAL_CX; GSYM CX_POW] THEN
9190         SIMP_TAC[REAL_POW_LE; NORM_ARITH `&0 <= (&1 + norm(z:complex)) / &2`];
9191         REWRITE_TAC[IN_BALL] THEN REPEAT STRIP_TAC THEN
9192         SIMP_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_MUL] THEN
9193         REWRITE_TAC[COMPLEX_NORM_POW; NORM_NEG; COMPLEX_NORM_CX] THEN
9194         REWRITE_TAC[REAL_ABS_NUM; REAL_POW_ONE; real_div; REAL_MUL_LID] THEN
9195         GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
9196         MATCH_MP_TAC REAL_LE_MUL2 THEN
9197         SIMP_TAC[REAL_LE_INV_EQ; REAL_POS; NORM_POS_LE; REAL_POW_LE] THEN
9198         CONJ_TAC THENL
9199          [MATCH_MP_TAC REAL_INV_LE_1 THEN REWRITE_TAC[REAL_OF_NUM_LE] THEN
9200           ARITH_TAC;
9201           MATCH_MP_TAC REAL_POW_LE2 THEN
9202           UNDISCH_TAC `dist(z:complex,y) < (&1 - norm z) / &2` THEN
9203           CONV_TAC NORM_ARITH]]];
9204     REWRITE_TAC[LEFT_IMP_EXISTS_THM; GSYM COMPLEX_POW_POW] THEN
9205     MAP_EVERY X_GEN_TAC [`a:complex->complex`; `i:complex->complex`] THEN
9206     REWRITE_TAC[GSYM COMPLEX_POW_MUL; COMPLEX_MUL_LNEG; COMPLEX_MUL_LID] THEN
9207     REPEAT STRIP_TAC THEN
9208     MP_TAC(SPECL [`\z. a z - catn(z)`; `ball(Cx(&0),&1)`]
9209         HAS_COMPLEX_DERIVATIVE_ZERO_CONSTANT) THEN
9210     REWRITE_TAC[CONVEX_BALL; COMPLEX_IN_BALL_0] THEN ANTS_TAC THENL
9211      [X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
9212       SUBST1_TAC(COMPLEX_RING `Cx(&0) = i(w:complex) - i w`) THEN
9213       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
9214       ASM_SIMP_TAC[COMPLEX_SUB_REFL; HAS_COMPLEX_DERIVATIVE_AT_WITHIN] THEN
9215       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
9216       MP_TAC(ISPEC `w:complex` HAS_COMPLEX_DERIVATIVE_CATN) THEN ANTS_TAC THENL
9217        [ASM_MESON_TAC[COMPLEX_NORM_GE_RE_IM; REAL_LET_TRANS]; ALL_TAC] THEN
9218       MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
9219       MATCH_MP_TAC SERIES_UNIQUE THEN
9220       MAP_EVERY EXISTS_TAC [`\n. --(w pow 2) pow n`; `from 0`] THEN
9221       ASM_SIMP_TAC[] THEN
9222       MP_TAC(SPECL [`0`; `--((w:complex) pow 2)`] SUMS_GP) THEN
9223       ASM_SIMP_TAC[complex_pow; COMPLEX_NORM_POW; NORM_NEG; ABS_SQUARE_LT_1;
9224         REAL_ABS_NORM; complex_div; COMPLEX_MUL_LID; COMPLEX_SUB_RNEG];
9225       DISCH_THEN(X_CHOOSE_THEN `c:complex` (fun th ->
9226         MP_TAC th THEN MP_TAC(SPEC `Cx(&0)` th))) THEN
9227       ASM_SIMP_TAC[CATN_0; COMPLEX_NORM_0; REAL_LT_01; COMPLEX_SUB_RZERO] THEN
9228       FIRST_ASSUM(MP_TAC o SPEC `Cx(&0)`) THEN
9229       SIMP_TAC[COMPLEX_NORM_0; REAL_LT_01] THEN
9230       DISCH_THEN(MP_TAC o CONJUNCT1) THEN
9231       REWRITE_TAC[COMPLEX_POW_ADD; COMPLEX_POW_1; COMPLEX_MUL_RZERO] THEN
9232       MP_TAC(SPECL [`\n:num. Cx(&0)`; `from 0`] SUMS_COMPLEX_0) THEN
9233       REWRITE_TAC[] THEN ONCE_REWRITE_TAC[IMP_IMP] THEN
9234       DISCH_THEN(SUBST1_TAC o SYM o MATCH_MP SERIES_UNIQUE) THEN
9235       DISCH_THEN(SUBST1_TAC o SYM) THEN
9236       DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
9237       ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
9238       FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
9239       ASM_SIMP_TAC[COMPLEX_POW_ADD; COMPLEX_POW_1]]]);;
9240
9241 let TAYLOR_CATN = prove
9242  (`!n z. norm(z) < &1
9243           ==> norm(catn z -
9244                    vsum(0..n) (\k. --(Cx(&1)) pow k / Cx(&(2 * k + 1)) *
9245                                    z pow (2 * k + 1)))
9246               <= norm(z) pow (2 * n + 3) /
9247                  ((&2 * &n + &3) * (&1 - norm z pow 2))`,
9248   REPEAT STRIP_TAC THEN
9249   FIRST_ASSUM(MP_TAC o MATCH_MP CATAN_CONVERGS) THEN
9250   DISCH_THEN(MP_TAC o SPEC `n + 1` o MATCH_MP
9251    (ONCE_REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
9252   ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
9253   REWRITE_TAC[ARITH_RULE `0 < n + 1`; ADD_SUB] THEN
9254   MATCH_MP_TAC(MESON[]
9255     `(!l. (f sums l) k ==> norm l <= e) ==> (f sums a) k ==> norm a <= e`) THEN
9256   GEN_TAC THEN MATCH_MP_TAC(ONCE_REWRITE_RULE[IMP_CONJ_ALT] SERIES_BOUND) THEN
9257   EXISTS_TAC
9258     `\i. norm(z:complex)  / (&2 * &n + &3) * (norm(z) pow 2) pow i` THEN
9259   CONJ_TAC THENL
9260    [REWRITE_TAC[GSYM SERIES_CX_LIFT; o_DEF] THEN
9261     MP_TAC(ISPECL [`n + 1`; `Cx(norm(z:complex) pow 2)`] SUMS_GP) THEN
9262     ASM_REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_POW; REAL_ABS_NORM;
9263                     ABS_SQUARE_LT_1; REAL_ABS_ABS] THEN
9264     DISCH_THEN(MP_TAC o SPEC `Cx(norm(z:complex) / (&2 * &n + &3))` o
9265         MATCH_MP SERIES_COMPLEX_LMUL) THEN
9266     REWRITE_TAC[GSYM CX_POW; GSYM CX_SUB; GSYM CX_DIV; GSYM CX_MUL] THEN
9267     MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
9268     REWRITE_TAC[GSYM REAL_POW_POW; REAL_POW_ADD; REAL_POW_1; real_div;
9269                 REAL_INV_MUL] THEN
9270     REAL_ARITH_TAC;
9271     X_GEN_TAC `k:num` THEN REWRITE_TAC[IN_FROM] THEN STRIP_TAC THEN
9272     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_POW] THEN
9273     REWRITE_TAC[NORM_NEG; COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_POW_ONE] THEN
9274     GEN_REWRITE_TAC RAND_CONV
9275      [REAL_ARITH `a / b * c:real = inv b * (a * c)`] THEN
9276     REWRITE_TAC[GSYM(CONJUNCT2 real_pow); REAL_POW_POW; ADD1] THEN
9277     MATCH_MP_TAC REAL_LE_RMUL THEN SIMP_TAC[REAL_POW_LE; NORM_POS_LE] THEN
9278     REWRITE_TAC[REAL_MUL_LID; real_div] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
9279     REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_LE;
9280                 REAL_OF_NUM_LT; REAL_OF_NUM_MUL] THEN
9281     ASM_ARITH_TAC]);;
9282
9283 (* ------------------------------------------------------------------------- *)
9284 (* Taylor series for log. It's this late because we can more easily get      *)
9285 (* a good error bound given the convergence of the series.                   *)
9286 (* ------------------------------------------------------------------------- *)
9287
9288 let CLOG_CONVERGES = prove
9289  (`!z. norm(z) < &1
9290        ==> ((\n. --Cx(&1) pow (n + 1) * z pow n / Cx(&n)) sums clog(Cx(&1) + z))
9291            (from 1)`,
9292   REPEAT STRIP_TAC THEN
9293   MP_TAC(ISPECL [`clog o (\z. Cx(&1) + z)`; `Cx(&0)`; `&1`]
9294         HOLOMORPHIC_IFF_POWER_SERIES) THEN
9295   REWRITE_TAC[COMPLEX_IN_BALL_0; o_THM] THEN
9296   MATCH_MP_TAC(TAUT `p /\ (q ==> r) ==> (p <=> q) ==> r`) THEN CONJ_TAC THENL
9297    [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
9298      [REWRITE_TAC[HOLOMORPHIC_ON_DIFFERENTIABLE] THEN
9299       REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC;
9300       MATCH_MP_TAC HOLOMORPHIC_ON_CLOG THEN
9301       REWRITE_TAC[IMP_CONJ; FORALL_IN_IMAGE; RE_ADD; RE_CX] THEN
9302       REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
9303
9304       MATCH_MP_TAC(REAL_ARITH
9305        `abs(Re x) <= norm x /\ norm x < &1 ==> &0 < &1 + Re x`) THEN
9306       ASM_REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN ASM_REAL_ARITH_TAC];
9307     ALL_TAC] THEN
9308   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
9309   DISCH_THEN(MP_TAC o SPEC `1` o
9310     MATCH_MP (REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
9311   CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[VSUM_SING_NUMSEG] THEN
9312   REWRITE_TAC[o_DEF; higher_complex_derivative; CLOG_1; COMPLEX_ADD_RID] THEN
9313   REWRITE_TAC[complex_div; COMPLEX_MUL_LZERO; COMPLEX_SUB_RZERO] THEN
9314   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] SUMS_EQ) THEN
9315   REWRITE_TAC[COMPLEX_RING
9316    `(h * f) * z = p * z * g <=> z = Cx(&0) \/ h * f = p * g`] THEN
9317   SUBGOAL_THEN
9318    `!n w. 1 <= n /\ norm w < &1
9319           ==> higher_complex_derivative n (\z. clog(Cx(&1) + z)) w =
9320               --Cx(&1) pow (n + 1) * Cx(&(FACT(n - 1))) / (Cx(&1) + w) pow n`
9321    (fun th -> SIMP_TAC[IN_FROM; COMPLEX_NORM_0; REAL_LT_01; th])
9322   THENL
9323    [INDUCT_TAC THEN REWRITE_TAC[ARITH; higher_complex_derivative] THEN
9324     REPEAT STRIP_TAC THEN ASM_CASES_TAC `n = 0` THENL
9325      [ASM_REWRITE_TAC[higher_complex_derivative] THEN
9326       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
9327       CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[COMPLEX_POW_1] THEN
9328       COMPLEX_DIFF_TAC THEN
9329       REWRITE_TAC[complex_div; COMPLEX_POW_NEG; COMPLEX_ADD_LID] THEN
9330       REWRITE_TAC[COMPLEX_POW_ONE; ARITH; COMPLEX_MUL_LID] THEN
9331       DISCH_TAC THEN REWRITE_TAC[RE_ADD; RE_CX] THEN
9332       MATCH_MP_TAC(REAL_ARITH
9333         `abs(Re x) <= norm x /\ norm x < &1 ==> &0 < &1 + Re x`) THEN
9334       ASM_REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN ASM_REAL_ARITH_TAC;
9335
9336       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
9337       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
9338       MAP_EVERY EXISTS_TAC
9339        [`\w. --Cx(&1) pow (n + 1) * Cx(&(FACT(n - 1))) / (Cx(&1) + w) pow n`;
9340         `ball(Cx(&0),&1)`] THEN
9341       ASM_SIMP_TAC[OPEN_BALL; LE_1; COMPLEX_IN_BALL_0] THEN
9342       COMPLEX_DIFF_TAC THEN
9343       ASM_SIMP_TAC[FACT; ARITH_RULE `~(n = 0) ==> SUC n - 1 = SUC(n - 1)`] THEN
9344       REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_ADD_LID; COMPLEX_MUL_RID] THEN
9345       REWRITE_TAC[COMPLEX_POW_ADD; complex_pow; COMPLEX_POW_1] THEN
9346       REWRITE_TAC[COMPLEX_MUL_LNEG; COMPLEX_MUL_RNEG; complex_div;
9347                   COMPLEX_SUB_LZERO] THEN
9348       REWRITE_TAC[GSYM complex_div; COMPLEX_NEG_NEG; COMPLEX_MUL_RID] THEN
9349       REWRITE_TAC[COMPLEX_MUL_LID] THEN
9350       REWRITE_TAC[GSYM(CONJUNCT2 complex_pow); complex_div] THEN
9351       REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC] THEN
9352       ASM_REWRITE_TAC[GSYM complex_div; COMPLEX_POW_EQ_0] THEN
9353       ONCE_REWRITE_TAC[TAUT `p /\ q <=> p /\ (p ==> q)`] THEN
9354       SIMP_TAC[COMPLEX_DIV_POW2; COMPLEX_POW_POW] THEN
9355       ASM_REWRITE_TAC[ARITH_RULE `n * 2 <= n - 1 <=> n = 0`] THEN
9356       ASM_SIMP_TAC[ARITH_RULE `~(n = 0) ==> n * 2 - (n - 1) = SUC n`] THEN
9357       ASM_SIMP_TAC[ARITH_RULE `~(n = 0) ==> SUC(n - 1) = n`] THEN
9358       REWRITE_TAC[complex_div; CX_MUL; GSYM REAL_OF_NUM_MUL] THEN
9359       REWRITE_TAC[COMPLEX_MUL_AC] THEN
9360       MP_TAC(SPEC `&1` COMPLEX_NORM_CX) THEN
9361       UNDISCH_TAC `norm(w:complex) < &1` THEN
9362       REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN CONV_TAC NORM_ARITH];
9363     MATCH_MP_TAC num_INDUCTION THEN REWRITE_TAC[ARITH] THEN
9364     X_GEN_TAC `n:num` THEN REPEAT(DISCH_THEN(K ALL_TAC)) THEN DISJ2_TAC THEN
9365     REWRITE_TAC[FACT; ARITH_RULE `SUC n - 1 = n`; COMPLEX_ADD_RID] THEN
9366     REWRITE_TAC[COMPLEX_POW_ONE; COMPLEX_DIV_1; GSYM REAL_OF_NUM_MUL] THEN
9367     REWRITE_TAC[CX_MUL; COMPLEX_INV_MUL; COMPLEX_RING
9368      `(a * f) * i * n = a * i <=> f * n = Cx(&1) \/ a * i = Cx(&0)`] THEN
9369     SIMP_TAC[COMPLEX_MUL_RINV; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ]]);;
9370
9371 let TAYLOR_CLOG = prove
9372  (`!n z. norm(z) < &1
9373          ==> norm(clog(Cx(&1) + z) -
9374                   vsum(1..n) (\k. --Cx(&1) pow (k + 1) * z pow k / Cx(&k)))
9375              <= norm z pow (n + 1) / (&1 - norm z)`,
9376   REPEAT STRIP_TAC THEN MP_TAC(SPEC `z:complex` CLOG_CONVERGES) THEN
9377   ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o
9378     SPEC `n + 1` o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
9379   ANTS_TAC THENL [ASM_ARITH_TAC; REWRITE_TAC[ADD_SUB]] THEN
9380   DISCH_THEN(MATCH_MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
9381         SERIES_BOUND)) THEN
9382   EXISTS_TAC `\k. norm(z:complex) pow k` THEN
9383   REWRITE_TAC[GSYM SERIES_CX_LIFT; o_DEF; CX_POW; CX_DIV; CX_SUB] THEN
9384   ASM_SIMP_TAC[COMPLEX_NORM_CX; REAL_ABS_NORM; SUMS_GP] THEN
9385   X_GEN_TAC `m:num` THEN REWRITE_TAC[IN_FROM] THEN DISCH_TAC THEN
9386   REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_POW; NORM_NEG] THEN
9387   REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
9388   REWRITE_TAC[REAL_POW_ONE; REAL_MUL_LID; GSYM COMPLEX_NORM_POW] THEN
9389   SUBGOAL_THEN `0 < m` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
9390   ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
9391   MATCH_MP_TAC(REAL_ARITH `&0 <= x * (m - &1) ==> x <= x * m`) THEN
9392   MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[NORM_POS_LE; REAL_SUB_LE] THEN
9393   ASM_SIMP_TAC[REAL_OF_NUM_LE; LE_1]);;
9394
9395 let TAYLOR_CLOG_NEG = prove
9396  (`!n z. norm(z) < &1
9397          ==> norm(clog(Cx(&1) - z) + vsum(1..n) (\k. z pow k / Cx(&k)))
9398               <= norm z pow (n + 1) / (&1 - norm z)`,
9399   REPEAT STRIP_TAC THEN
9400   MP_TAC(ISPECL [`n:num`; `--z:complex`] TAYLOR_CLOG) THEN
9401   ASM_REWRITE_TAC[NORM_NEG] THEN
9402   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LE_TRANS) THEN
9403   MATCH_MP_TAC REAL_EQ_IMP_LE THEN AP_TERM_TAC THEN
9404   REWRITE_TAC[VECTOR_SUB; GSYM VSUM_NEG] THEN AP_TERM_TAC THEN
9405   REWRITE_TAC[COMPLEX_POW_ADD; COMPLEX_POW_ONE; complex_div] THEN
9406   REWRITE_TAC[COMPLEX_MUL_LNEG; COMPLEX_MUL_RNEG; COMPLEX_POW_1] THEN
9407   REWRITE_TAC[COMPLEX_MUL_RID; COMPLEX_NEG_NEG] THEN
9408   REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM COMPLEX_POW_MUL] THEN
9409   REWRITE_TAC[COMPLEX_MUL_LNEG; COMPLEX_MUL_LID; COMPLEX_NEG_NEG]);;
9410
9411 (* ------------------------------------------------------------------------- *)
9412 (* The classical limit for e and other useful limits.                        *)
9413 (* ------------------------------------------------------------------------- *)
9414
9415 let CEXP_LIMIT = prove
9416  (`!z. ((\n. (Cx(&1) + z / Cx(&n)) pow n) --> cexp(z)) sequentially`,
9417   GEN_TAC THEN MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
9418   EXISTS_TAC `\n. cexp(Cx(&n) * clog(Cx(&1) + z / Cx(&n)))` THEN
9419   CONJ_TAC THENL
9420    [REWRITE_TAC[CEXP_N; EVENTUALLY_SEQUENTIALLY] THEN
9421     MP_TAC(SPEC `norm(z:complex) + &1` REAL_ARCH_SIMPLE) THEN
9422     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
9423     DISCH_TAC THEN X_GEN_TAC `n:num` THEN ASM_CASES_TAC `n = 0` THENL
9424      [ASM_REWRITE_TAC[LE] THEN DISCH_THEN SUBST_ALL_TAC THEN
9425       ASM_MESON_TAC[NORM_ARITH `~(norm(z:complex) + &1 <= &0)`];
9426       DISCH_TAC] THEN
9427     AP_THM_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC CEXP_CLOG THEN
9428     ASM_SIMP_TAC[CX_INJ; REAL_OF_NUM_EQ; COMPLEX_FIELD
9429      `~(n = Cx(&0)) ==> (Cx(&1) + z / n = Cx(&0) <=> z = --n)`] THEN
9430     DISCH_THEN(MP_TAC o AP_TERM `norm:complex->real`) THEN
9431     REWRITE_TAC[NORM_NEG; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
9432     REPEAT(POP_ASSUM MP_TAC) THEN REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN
9433     CONV_TAC NORM_ARITH;
9434     MATCH_MP_TAC(ISPEC `cexp` LIM_CONTINUOUS_FUNCTION) THEN
9435     REWRITE_TAC[CONTINUOUS_AT_CEXP] THEN
9436     ONCE_REWRITE_TAC[LIM_NULL_COMPLEX] THEN
9437     MATCH_MP_TAC LIM_NULL_COMPARISON_COMPLEX THEN
9438     EXISTS_TAC `\n. Cx(&2 * norm(z:complex) pow 2) * inv(Cx(&n))` THEN
9439     SIMP_TAC[LIM_INV_N; LIM_NULL_COMPLEX_LMUL] THEN
9440     REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
9441     MP_TAC(SPEC `&2 * norm(z:complex) + &1` REAL_ARCH_SIMPLE) THEN
9442     DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN
9443     EXISTS_TAC `MAX N (MAX 1 2)` THEN X_GEN_TAC `n:num` THEN
9444     REWRITE_TAC[ARITH_RULE `MAX a b <= c <=> a <= c /\ b <= c`] THEN
9445     STRIP_TAC THEN
9446     ASM_SIMP_TAC[CX_INJ; REAL_OF_NUM_EQ; LE_1;
9447       COMPLEX_FIELD `~(n = Cx(&0)) ==> n * l - z = (l - z / n) * n`] THEN
9448     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; REAL_ABS_NUM;
9449                 COMPLEX_NORM_INV] THEN
9450     ASM_SIMP_TAC[GSYM REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
9451     REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC; GSYM REAL_INV_MUL] THEN
9452     REWRITE_TAC[GSYM REAL_POW_2] THEN
9453     MP_TAC(ISPECL [`1`; `z / Cx(&n)`] TAYLOR_CLOG) THEN
9454     REWRITE_TAC[GSYM CX_ADD; VSUM_SING_NUMSEG; COMPLEX_NORM_CX] THEN
9455     REWRITE_TAC[VSUM_CLAUSES_NUMSEG] THEN CONV_TAC NUM_REDUCE_CONV THEN
9456     REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
9457     REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM; COMPLEX_DIV_1] THEN
9458     ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN ANTS_TAC THENL
9459      [RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
9460       ASM_REAL_ARITH_TAC;
9461       ALL_TAC] THEN
9462     REWRITE_TAC[COMPLEX_POW_1; COMPLEX_POW_NEG; COMPLEX_POW_ONE; ARITH] THEN
9463     REWRITE_TAC[COMPLEX_MUL_LID; REAL_POW_DIV] THEN
9464     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
9465     REWRITE_TAC[REAL_ARITH `a / b / c:real = (a / c) * inv b`] THEN
9466     MATCH_MP_TAC REAL_LE_RMUL THEN
9467     SIMP_TAC[REAL_LE_INV_EQ; REAL_POW_LE; REAL_POS] THEN
9468     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
9469     REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NUM; REAL_ABS_NORM;
9470                 REAL_ABS_POW; real_div] THEN
9471     MATCH_MP_TAC REAL_LE_LMUL THEN SIMP_TAC[REAL_POW_LE; NORM_POS_LE] THEN
9472     GEN_REWRITE_TAC RAND_CONV [GSYM REAL_INV_INV] THEN
9473     MATCH_MP_TAC REAL_LE_INV2 THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
9474     REWRITE_TAC[REAL_ARITH
9475      `&1 / &2 <= &1 - x * &1 / n <=> x / n <= &1 / &2`] THEN
9476     ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
9477     RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
9478     ASM_REAL_ARITH_TAC]);;
9479
9480 let EXP_LIMIT = prove
9481  (`!x. ((\n. (&1 + x / &n) pow n) ---> exp(x)) sequentially`,
9482   REWRITE_TAC[REALLIM_COMPLEX; o_DEF; CX_POW; CX_ADD; CX_DIV; CX_EXP] THEN
9483   REWRITE_TAC[CEXP_LIMIT]);;
9484
9485 let LIM_LOGPLUS1_OVER_X = prove                         
9486  (`((\x. clog(Cx(&1) + x) / x) --> Cx(&1)) (at(Cx(&0)))`,            
9487   ONCE_REWRITE_TAC[LIM_NULL_COMPLEX] THEN
9488   MATCH_MP_TAC LIM_NULL_COMPARISON_COMPLEX THEN                                
9489   EXISTS_TAC `\x. Cx(&2) * x` THEN CONJ_TAC THENL     
9490    [ALL_TAC; LIM_TAC THEN REWRITE_TAC[COMPLEX_MUL_RZERO]] THEN              
9491   REWRITE_TAC[EVENTUALLY_AT] THEN EXISTS_TAC `&1 / &2` THEN     
9492   CONV_TAC REAL_RAT_REDUCE_CONV THEN
9493   REWRITE_TAC[dist; COMPLEX_SUB_RZERO; COMPLEX_NORM_NZ] THEN
9494   X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
9495   MATCH_MP_TAC REAL_LE_LCANCEL_IMP THEN EXISTS_TAC `norm(z:complex)` THEN
9496   ASM_REWRITE_TAC[GSYM COMPLEX_NORM_MUL; COMPLEX_NORM_NZ] THEN             
9497   ASM_SIMP_TAC[COMPLEX_FIELD              
9498     `~(z = Cx(&0)) ==> z * (l / z - Cx(&1)) = l - z`] THEN
9499   MP_TAC(ISPECL [`1`; `z:complex`] TAYLOR_CLOG) THEN          
9500   ANTS_TAC THENL [ASM_REAL_ARITH_TAC; REWRITE_TAC[VSUM_SING_NUMSEG]] THEN
9501   CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[COMPLEX_POW_1; COMPLEX_DIV_1] THEN
9502   REWRITE_TAC[COMPLEX_POW_NEG; ARITH_EVEN; COMPLEX_POW_ONE] THEN
9503   REWRITE_TAC[COMPLEX_MUL_LID] THEN                                    
9504   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
9505   REWRITE_TAC[COMPLEX_RING `z * Cx(&2) * z = z pow 2 * Cx(&2)`] THEN        
9506   REWRITE_TAC[COMPLEX_NORM_MUL; real_div; COMPLEX_NORM_CX] THEN
9507   REWRITE_TAC[GSYM COMPLEX_NORM_POW] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
9508   REWRITE_TAC[NORM_POS_LE] THEN                               
9509   GEN_REWRITE_TAC RAND_CONV [GSYM REAL_INV_INV] THEN                           
9510   MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REAL_ARITH_TAC);;
9511
9512 let LIM_N_MUL_SUB_CLOG = prove
9513  (`!w z. ((\n. Cx(&n) * (clog(Cx(&n) + w) - clog(Cx(&n) + z))) --> w - z)
9514          sequentially`,
9515   REPEAT GEN_TAC THEN ASM_CASES_TAC `w:complex = z` THEN
9516   ASM_REWRITE_TAC[COMPLEX_SUB_REFL; LIM_CONST; COMPLEX_MUL_RZERO] THEN
9517   MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
9518   EXISTS_TAC `\n. (Cx(&n) + z) / (Cx(&1) + z / Cx(&n)) *
9519                   clog(Cx(&1) + (w - z) / (Cx(&n) + z))` THEN
9520   REWRITE_TAC[] THEN CONJ_TAC THENL
9521    [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
9522     MP_TAC(SPEC `max (norm(w:complex)) (norm(z:complex)) + &1`
9523      REAL_ARCH_SIMPLE) THEN
9524     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN
9525     X_GEN_TAC `n:num` THEN DISCH_TAC THEN
9526     SUBGOAL_THEN `&0 < Re(Cx(&n) + w) /\ &0 < Re(Cx(&n) + z)` MP_TAC THENL
9527      [REWRITE_TAC[RE_ADD; RE_CX] THEN
9528       RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN CONJ_TAC THEN
9529       MATCH_MP_TAC(REAL_ARITH
9530        `norm z < n /\ abs(Re z) <= norm z ==> &0 < n + Re z`) THEN
9531       REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN ASM_REAL_ARITH_TAC;
9532       MAP_EVERY ASM_CASES_TAC
9533        [`Cx(&n) + w = Cx(&0)`; `Cx(&n) + z = Cx(&0)`] THEN
9534       ASM_REWRITE_TAC[RE_CX; REAL_LT_REFL] THEN STRIP_TAC] THEN
9535     SUBGOAL_THEN `~(Cx(&n) = Cx(&0))` ASSUME_TAC THENL
9536      [REWRITE_TAC[CX_INJ; REAL_OF_NUM_EQ] THEN DISCH_THEN SUBST_ALL_TAC THEN
9537       UNDISCH_TAC `max (norm(w:complex)) (norm (z:complex)) + &1 <= &N` THEN
9538       RULE_ASSUM_TAC(REWRITE_RULE[CONJUNCT1 LE]) THEN
9539       ASM_REWRITE_TAC[] THEN CONV_TAC NORM_ARITH;
9540       ASM_SIMP_TAC[COMPLEX_FIELD
9541        `~(n + z = Cx(&0)) /\ ~(n = Cx(&0))
9542         ==> (n + z) / (Cx(&1) + z / n) = n`] THEN
9543       AP_TERM_TAC THEN ASM_SIMP_TAC[COMPLEX_FIELD
9544        `~(n + z = Cx(&0))
9545         ==> Cx(&1) + (w - z) / (n + z) = (n + w) / (n + z)`] THEN
9546       REWRITE_TAC[complex_div] THEN IMP_REWRITE_TAC[CLOG_MUL_SIMPLE] THEN
9547       ASM_REWRITE_TAC[COMPLEX_INV_EQ_0] THEN ASM_SIMP_TAC[CLOG_INV] THEN
9548       CONJ_TAC THENL [CONV_TAC COMPLEX_RING; REWRITE_TAC[IM_NEG]] THEN
9549       MATCH_MP_TAC(REAL_ARITH
9550        `abs(x) < pi / &2 /\ abs(y) < pi / &2
9551         ==> --pi < x + --y /\ x + --y <= pi`) THEN
9552       ASM_SIMP_TAC[RE_CLOG_POS_LT]];
9553     REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a / b * c:complex = inv b * a * c`] THEN
9554     GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_MUL_LID] THEN
9555     MATCH_MP_TAC LIM_COMPLEX_MUL THEN CONJ_TAC THENL
9556      [GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_INV_1] THEN
9557       MATCH_MP_TAC LIM_COMPLEX_INV THEN
9558       CONJ_TAC THENL [ALL_TAC; CONV_TAC COMPLEX_RING] THEN
9559       GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_ADD_RID] THEN
9560       MATCH_MP_TAC LIM_ADD THEN REWRITE_TAC[LIM_CONST; complex_div] THEN
9561       SIMP_TAC[LIM_NULL_COMPLEX_LMUL; LIM_INV_N];
9562       ALL_TAC] THEN
9563     SUBGOAL_THEN
9564      `(\n. (Cx(&n) + z) * clog (Cx(&1) + (w - z) / (Cx(&n) + z))) =
9565       (\x. (w - z) * clog(Cx(&1) + x) / x) o (\n. (w - z) / (Cx(&n) + z))`
9566     SUBST1_TAC THENL
9567      [REWRITE_TAC[FUN_EQ_THM; o_THM; complex_div] THEN
9568       REWRITE_TAC[COMPLEX_INV_MUL; COMPLEX_INV_INV] THEN
9569       POP_ASSUM MP_TAC THEN CONV_TAC COMPLEX_FIELD;
9570       ALL_TAC] THEN
9571     MATCH_MP_TAC LIM_COMPOSE_AT THEN EXISTS_TAC `Cx(&0)` THEN
9572     REPEAT CONJ_TAC THENL
9573      [REWRITE_TAC[complex_div] THEN
9574       SIMP_TAC[LIM_INV_N_OFFSET; LIM_NULL_COMPLEX_LMUL];
9575       REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
9576       MP_TAC(SPEC `norm(z:complex) + &1` REAL_ARCH_SIMPLE) THEN
9577       MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN
9578       REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN X_GEN_TAC `n:num` THEN
9579       STRIP_TAC THEN MATCH_MP_TAC(TAUT `~p ==> p ==> q`) THEN
9580       ASM_REWRITE_TAC[COMPLEX_DIV_EQ_0; COMPLEX_SUB_0] THEN
9581       REWRITE_TAC[COMPLEX_RING `n + z = Cx(&0) <=> z = --n`] THEN
9582       DISCH_TAC THEN UNDISCH_TAC `norm(z:complex) + &1 <= &N` THEN
9583       ASM_REWRITE_TAC[NORM_NEG; COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
9584       GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_MUL_RID] THEN              
9585       SIMP_TAC[LIM_COMPLEX_LMUL; LIM_LOGPLUS1_OVER_X]]]);;
9586                      
9587 let LIM_SUB_CLOG = prove                                              
9588  (`!w z. ((\n. clog(Cx(&n) + w) - clog(Cx(&n) + z)) --> Cx(&0)) sequentially`,
9589   REPEAT GEN_TAC THEN MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
9590   SUBST1_TAC(COMPLEX_RING `Cx(&0) = Cx(&0) * (w - z)`) THEN EXISTS_TAC
9591    `\n. inv(Cx(&n)) * Cx(&n) * (clog(Cx(&n) + w) - clog(Cx(&n) + z))` THEN
9592   CONJ_TAC THENL                             
9593    [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
9594     REWRITE_TAC[ARITH_RULE `1 <= n <=> ~(n = 0)`; GSYM REAL_OF_NUM_EQ] THEN
9595     REWRITE_TAC[GSYM CX_INJ] THEN CONV_TAC COMPLEX_FIELD;              
9596     MATCH_MP_TAC LIM_COMPLEX_MUL THEN    
9597     REWRITE_TAC[LIM_INV_N; LIM_N_MUL_SUB_CLOG]]);;                        
9598                                      
9599 (* ------------------------------------------------------------------------- *)
9600 (* Equality between holomorphic functions, on open ball then connected set.  *)
9601 (* ------------------------------------------------------------------------- *)
9602
9603 let HOLOMORPHIC_FUN_EQ_ON_BALL = prove
9604  (`!f g z r w.
9605      f holomorphic_on ball(z,r) /\ g holomorphic_on ball(z,r) /\
9606      w IN ball(z,r) /\
9607      (!n. higher_complex_derivative n f z = higher_complex_derivative n g z)
9608      ==> f w = g w`,
9609   REPEAT STRIP_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
9610   EXISTS_TAC `(\n. higher_complex_derivative n f z /
9611                    Cx(&(FACT n)) * (w - z) pow n)` THEN
9612   EXISTS_TAC `(from 0)` THEN CONJ_TAC THENL [ALL_TAC; ASM_REWRITE_TAC []] THEN
9613   ASM_MESON_TAC [HOLOMORPHIC_POWER_SERIES]);;
9614
9615 let HOLOMORPHIC_FUN_EQ_0_ON_BALL = prove
9616  (`!f z r w.
9617      w IN ball(z,r) /\ f holomorphic_on ball(z,r) /\
9618      (!n. higher_complex_derivative n f z = Cx(&0))
9619      ==> f w = Cx(&0)`,
9620   REPEAT STRIP_TAC THEN
9621   SUBST1_TAC (GSYM (BETA_CONV `(\z:complex. Cx(&0)) w`)) THEN
9622   MATCH_MP_TAC HOLOMORPHIC_FUN_EQ_ON_BALL THEN
9623   REWRITE_TAC [HOLOMORPHIC_ON_CONST; HIGHER_COMPLEX_DERIVATIVE_CONST] THEN
9624   ASM_MESON_TAC []);;
9625
9626 let HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED = prove
9627  (`!f s z.
9628         open s /\ connected s /\ f holomorphic_on s /\
9629         z IN s /\ (!n. higher_complex_derivative n f z = Cx(&0))
9630         ==> !w. w IN s ==> f w = Cx(&0)`,
9631   REPEAT GEN_TAC THEN REWRITE_TAC[CONNECTED_CLOPEN] THEN STRIP_TAC THEN
9632   FIRST_X_ASSUM(MP_TAC o SPEC
9633    `{w | w IN s /\ !n. higher_complex_derivative n f w = Cx(&0)}`) THEN
9634   ANTS_TAC THENL [ALL_TAC; ASM SET_TAC[higher_complex_derivative]] THEN
9635   CONJ_TAC THENL
9636    [MATCH_MP_TAC OPEN_SUBSET THEN CONJ_TAC THENL [SET_TAC[]; ALL_TAC] THEN
9637     UNDISCH_TAC `open(s:complex->bool)` THEN
9638     REWRITE_TAC[OPEN_CONTAINS_BALL; IN_ELIM_THM] THEN
9639     MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `w:complex` THEN
9640     DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
9641     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
9642     REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN STRIP_TAC THEN ASM_SIMP_TAC[] THEN
9643     X_GEN_TAC `u:complex` THEN REPEAT STRIP_TAC THEN
9644     MATCH_MP_TAC HOLOMORPHIC_FUN_EQ_0_ON_BALL THEN
9645     MAP_EVERY EXISTS_TAC [`w:complex`; `e:real`] THEN
9646     ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
9647      [MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
9648       ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; OPEN_BALL; SUBSET];
9649       ASM_REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]];
9650     SUBGOAL_THEN
9651      `closed_in (subtopology euclidean s)
9652                 (INTERS (IMAGE
9653               (\n. {w | w IN s /\ higher_complex_derivative n f w = Cx(&0)})
9654                 (:num)))`
9655     MP_TAC THENL
9656      [MATCH_MP_TAC CLOSED_IN_INTERS THEN
9657       REWRITE_TAC[IMAGE_EQ_EMPTY; UNIV_NOT_EMPTY] THEN
9658       REWRITE_TAC[FORALL_IN_IMAGE; IN_UNIV] THEN X_GEN_TAC `n:num` THEN
9659       MATCH_MP_TAC CONTINUOUS_CLOSED_IN_PREIMAGE_CONSTANT THEN
9660       MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN SIMP_TAC[ETA_AX] THEN
9661       MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
9662       ASM_REWRITE_TAC[];
9663       MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
9664       SIMP_TAC[INTERS; IN_IMAGE; IN_UNIV; LEFT_IMP_EXISTS_THM; IN_ELIM_THM] THEN
9665       ONCE_REWRITE_TAC[SWAP_FORALL_THM] THEN
9666       REWRITE_TAC[LEFT_FORALL_IMP_THM; EXISTS_REFL] THEN SET_TAC[]]]);;
9667
9668 let HOLOMORPHIC_FUN_EQ_ON_CONNECTED = prove
9669  (`!f g z s w.
9670      open s /\ connected s /\ f holomorphic_on s /\ g holomorphic_on s /\
9671      w IN s /\ z IN s /\
9672      (!n. higher_complex_derivative n f z = higher_complex_derivative n g z)
9673      ==> f w = g w`,
9674   REPEAT STRIP_TAC THEN
9675   MP_TAC(ISPECL [`\z. (f:complex->complex) z - g z`; `s:complex->bool`;
9676                  `z:complex`] HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED) THEN
9677   ASM_REWRITE_TAC[RIGHT_IMP_FORALL_THM; HOLOMORPHIC_ON_SUB] THEN
9678   DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
9679   ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN DISCH_THEN MATCH_MP_TAC THEN
9680   ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB] THEN
9681   MP_TAC(ISPECL [`f:complex->complex`; `g:complex->complex`; `s:complex->bool`]
9682         HIGHER_COMPLEX_DERIVATIVE_SUB) THEN
9683   ASM_SIMP_TAC[COMPLEX_SUB_0]);;
9684
9685 let HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED = prove
9686  (`!f s z.
9687         open s /\
9688         connected s /\
9689         f holomorphic_on s /\
9690         z IN s /\
9691         (!n. 0 < n ==> higher_complex_derivative n f z = Cx(&0))
9692         ==> !w. w IN s ==> f w = f z`,
9693   REPEAT STRIP_TAC THEN MP_TAC(ISPECL
9694    [`\w. (f:complex->complex) w - f z`; `s:complex->bool`; `z:complex`]
9695    HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED) THEN
9696   ASM_REWRITE_TAC[COMPLEX_SUB_0; RIGHT_IMP_FORALL_THM; IMP_IMP] THEN
9697   DISCH_THEN MATCH_MP_TAC THEN
9698   ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST] THEN
9699   X_GEN_TAC `n:num` THEN ASM_CASES_TAC `n = 0` THEN
9700   ASM_REWRITE_TAC[higher_complex_derivative; COMPLEX_SUB_REFL] THEN
9701   MP_TAC(ISPECL
9702    [`f:complex->complex`; `(\w. f(z:complex)):complex->complex`;
9703     `s:complex->bool`; `n:num`; `z:complex`]
9704    HIGHER_COMPLEX_DERIVATIVE_SUB) THEN
9705   ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN DISCH_THEN SUBST1_TAC THEN
9706   ASM_SIMP_TAC[LE_1; HIGHER_COMPLEX_DERIVATIVE_CONST; COMPLEX_SUB_REFL]);;
9707
9708 (* ------------------------------------------------------------------------- *)
9709 (* Some basic lemmas about poles/singularities.                              *)
9710 (* ------------------------------------------------------------------------- *)
9711
9712 let POLE_LEMMA = prove
9713  (`!f s a.
9714         f holomorphic_on s /\ a IN interior(s)
9715         ==> (\z. if z = a then complex_derivative f a
9716                  else (f(z) - f(a)) / (z - a)) holomorphic_on s`,
9717   REPEAT STRIP_TAC THEN SUBGOAL_THEN `(a:complex) IN s` ASSUME_TAC THENL
9718    [ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET]; ALL_TAC] THEN
9719   SUBGOAL_THEN
9720    `!z. z IN s /\ ~(z = a)
9721         ==> (\z. if z = a then complex_derivative f a
9722                  else (f(z) - f(a)) / (z - a))
9723             complex_differentiable (at z within s)`
9724   ASSUME_TAC THENL
9725    [REPEAT STRIP_TAC THEN
9726     MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_WITHIN THEN
9727     EXISTS_TAC `\z:complex. (f(z) - f(a)) / (z - a)` THEN
9728     EXISTS_TAC `dist(a:complex,z)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
9729     CONJ_TAC THENL
9730      [X_GEN_TAC `w:complex` THEN COND_CASES_TAC THEN
9731       ASM_REWRITE_TAC[REAL_LT_REFL] THEN STRIP_TAC THEN
9732       FIRST_X_ASSUM(MP_TAC o SPEC `w:complex`) THEN ASM_REWRITE_TAC[] THEN
9733       REPEAT(POP_ASSUM MP_TAC) THEN CONV_TAC COMPLEX_FIELD;
9734       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_WITHIN THEN
9735       ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
9736       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
9737       REWRITE_TAC[COMPLEX_DIFFERENTIABLE_CONST; COMPLEX_DIFFERENTIABLE_ID] THEN
9738       ASM_MESON_TAC[holomorphic_on; complex_differentiable]];
9739     ALL_TAC] THEN
9740   REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
9741   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9742   ASM_CASES_TAC `z:complex = a` THENL [ALL_TAC; ASM_SIMP_TAC[]] THEN
9743   FIRST_X_ASSUM SUBST_ALL_TAC THEN
9744   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERIOR]) THEN
9745   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
9746   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_AT_WITHIN THEN
9747   SUBGOAL_THEN
9748    `(\z. if z = a then complex_derivative f a else (f z - f a) / (z - a))
9749     holomorphic_on ball(a,e)`
9750   MP_TAC THENL
9751    [ALL_TAC;
9752     ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; GSYM complex_differentiable;
9753                  CENTRE_IN_BALL; COMPLEX_DIFFERENTIABLE_AT_WITHIN]] THEN
9754   MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN
9755   EXISTS_TAC `{a:complex}` THEN SIMP_TAC[OPEN_BALL; FINITE_RULES] THEN
9756   MATCH_MP_TAC(TAUT `b /\ (b ==> a) ==> a /\ b`) THEN CONJ_TAC THENL
9757    [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
9758     EXISTS_TAC `s DELETE (a:complex)` THEN
9759     ASM_SIMP_TAC[SET_RULE `b SUBSET s ==> b DIFF {a} SUBSET s DELETE a`] THEN
9760     ASM_SIMP_TAC[holomorphic_on; GSYM complex_differentiable; IN_DELETE] THEN
9761     REPEAT STRIP_TAC THEN
9762     MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_WITHIN_SUBSET THEN
9763     EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[] THEN SET_TAC[];
9764     ALL_TAC] THEN
9765   SIMP_TAC[HOLOMORPHIC_ON_OPEN; CONTINUOUS_ON_EQ_CONTINUOUS_AT;
9766            OPEN_DIFF; FINITE_IMP_CLOSED; OPEN_BALL; FINITE_INSERT;
9767            FINITE_RULES; GSYM complex_differentiable] THEN
9768   REWRITE_TAC[IN_DIFF; IN_BALL; IN_SING] THEN
9769   MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `w:complex` THEN
9770   ASM_CASES_TAC `w:complex = a` THENL
9771    [ALL_TAC; ASM_SIMP_TAC[COMPLEX_DIFFERENTIABLE_IMP_CONTINUOUS_AT]] THEN
9772   FIRST_X_ASSUM SUBST_ALL_TAC THEN REWRITE_TAC[] THEN
9773   SUBGOAL_THEN `f holomorphic_on ball(a,e)` MP_TAC THENL
9774    [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
9775   ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
9776   REWRITE_TAC[GSYM complex_differentiable; IN_BALL] THEN
9777   DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN
9778   ASM_REWRITE_TAC[GSYM HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
9779   MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
9780   REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT; CONTINUOUS_AT] THEN
9781   MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
9782               LIM_TRANSFORM_AT) THEN
9783   EXISTS_TAC `&1` THEN REWRITE_TAC[GSYM DIST_NZ; REAL_LT_01] THEN
9784   X_GEN_TAC `u:complex` THEN STRIP_TAC THEN ASM_REWRITE_TAC[]);;
9785
9786 let POLE_LEMMA_OPEN = prove
9787  (`!f s a.
9788         open s /\ f holomorphic_on s
9789         ==> (\z. if z = a
9790                  then complex_derivative f a
9791                  else (f z - f a) / (z - a)) holomorphic_on s`,
9792   REPEAT STRIP_TAC THEN ASM_CASES_TAC `(a:complex) IN s` THENL
9793    [MATCH_MP_TAC POLE_LEMMA THEN ASM_SIMP_TAC[INTERIOR_OPEN];
9794     ALL_TAC] THEN
9795   REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
9796   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9797   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_WITHIN THEN
9798   MAP_EVERY EXISTS_TAC [`\z:complex. (f(z) - f(a)) / (z - a)`; `&1`] THEN
9799   ASM_REWRITE_TAC[REAL_LT_01] THEN
9800   CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
9801   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_WITHIN THEN
9802   ASM_REWRITE_TAC[COMPLEX_SUB_0; CONJ_ASSOC] THEN
9803   CONJ_TAC THENL [CONJ_TAC; ASM_MESON_TAC[]] THEN
9804   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
9805   REWRITE_TAC[COMPLEX_DIFFERENTIABLE_CONST; COMPLEX_DIFFERENTIABLE_ID] THEN
9806   ASM_MESON_TAC[holomorphic_on; complex_differentiable]);;
9807
9808 let POLE_THEOREM = prove
9809  (`!f g s a.
9810         g holomorphic_on s /\ a IN interior(s) /\
9811         (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z))
9812         ==> (\z. if z = a then complex_derivative g a
9813                  else f(z) - g(a) / (z - a)) holomorphic_on s`,
9814   REPEAT GEN_TAC THEN REWRITE_TAC[CONJ_ASSOC] THEN
9815   DISCH_THEN(CONJUNCTS_THEN ASSUME_TAC) THEN
9816   FIRST_ASSUM(MP_TAC o MATCH_MP POLE_LEMMA) THEN
9817   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9818   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9819   COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
9820   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex` o last o CONJUNCTS) THEN
9821   ASM_REWRITE_TAC[] THEN REPEAT(POP_ASSUM MP_TAC) THEN
9822   CONV_TAC COMPLEX_FIELD);;
9823
9824 let POLE_THEOREM_OPEN = prove
9825  (`!f g s a.
9826         open s /\ g holomorphic_on s /\
9827         (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z))
9828         ==> (\z. if z = a then complex_derivative g a
9829                  else f(z) - g(a) / (z - a)) holomorphic_on s`,
9830   REPEAT GEN_TAC THEN REWRITE_TAC[CONJ_ASSOC] THEN
9831   DISCH_THEN(CONJUNCTS_THEN ASSUME_TAC) THEN
9832   FIRST_ASSUM(MP_TAC o SPEC `a:complex` o MATCH_MP POLE_LEMMA_OPEN) THEN
9833   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9834   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9835   COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
9836   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex` o last o CONJUNCTS) THEN
9837   ASM_REWRITE_TAC[] THEN REPEAT(POP_ASSUM MP_TAC) THEN
9838   CONV_TAC COMPLEX_FIELD);;
9839
9840 let POLE_THEOREM_0 = prove
9841  (`!f g s a.
9842         g holomorphic_on s /\ a IN interior(s) /\
9843         (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z)) /\
9844         f a = complex_derivative g a /\ g(a) = Cx(&0)
9845         ==> f holomorphic_on s`,
9846   REPEAT STRIP_TAC THEN
9847   SUBGOAL_THEN
9848    `(\z. if z = a then complex_derivative g a
9849          else f(z) - g(a) / (z - a)) holomorphic_on s`
9850   MP_TAC THENL [ASM_SIMP_TAC[POLE_THEOREM]; ALL_TAC] THEN
9851   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9852   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9853   COND_CASES_TAC THEN ASM_REWRITE_TAC[complex_div] THEN
9854   CONV_TAC COMPLEX_RING);;
9855
9856 let POLE_THEOREM_OPEN_0 = prove
9857  (`!f g s a.
9858         open s /\ g holomorphic_on s /\
9859         (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z)) /\
9860         f a = complex_derivative g a /\ g(a) = Cx(&0)
9861         ==> f holomorphic_on s`,
9862   REPEAT STRIP_TAC THEN
9863   SUBGOAL_THEN
9864    `(\z. if z = a then complex_derivative g a
9865          else f(z) - g(a) / (z - a)) holomorphic_on s`
9866   MP_TAC THENL [ASM_SIMP_TAC[POLE_THEOREM_OPEN]; ALL_TAC] THEN
9867   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9868   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9869   COND_CASES_TAC THEN ASM_REWRITE_TAC[complex_div] THEN
9870   CONV_TAC COMPLEX_RING);;
9871
9872 let POLE_THEOREM_ANALYTIC = prove
9873  (`!f g s a.
9874         g analytic_on s /\
9875         (!z. z IN s
9876              ==> ?d. &0 < d /\
9877                      !w. w IN ball(z,d) /\ ~(w = a) ==> g(w) = (w - a) * f(w))
9878         ==> (\z. if z = a then complex_derivative g a
9879                  else f(z) - g(a) / (z - a)) analytic_on s`,
9880   REPEAT GEN_TAC THEN REWRITE_TAC[analytic_on] THEN
9881   DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "A") (LABEL_TAC "B")) THEN
9882   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9883   REMOVE_THEN "A" (MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
9884   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
9885   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
9886   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
9887   EXISTS_TAC `min (d:real) e` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
9888   MATCH_MP_TAC POLE_THEOREM_OPEN THEN
9889   ASM_SIMP_TAC[BALL_MIN_INTER; OPEN_BALL; IN_INTER] THEN
9890   ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; INTER_SUBSET]);;
9891
9892 let POLE_THEOREM_ANALYTIC_0 = prove
9893  (`!f g s a.
9894         g analytic_on s /\
9895         (!z. z IN s
9896              ==> ?d. &0 < d /\
9897                      !w. w IN ball(z,d) /\ ~(w = a)
9898                          ==> g(w) = (w - a) * f(w)) /\
9899         f a = complex_derivative g a /\ g(a) = Cx(&0)
9900         ==> f analytic_on s`,
9901   REPEAT STRIP_TAC THEN
9902   SUBGOAL_THEN
9903    `(\z. if z = a then complex_derivative g a
9904          else f(z) - g(a) / (z - a)) analytic_on s`
9905   MP_TAC THENL [ASM_SIMP_TAC[POLE_THEOREM_ANALYTIC]; ALL_TAC] THEN
9906   MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
9907   REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN COND_CASES_TAC THEN
9908   ASM_REWRITE_TAC[complex_div] THEN CONV_TAC COMPLEX_RING);;
9909
9910 let POLE_THEOREM_ANALYTIC_OPEN_SUPERSET = prove
9911  (`!f g s a t.
9912         s SUBSET t /\ open t /\ g analytic_on s /\
9913         (!z. z IN t /\ ~(z = a) ==> g(z) = (z - a) * f(z))
9914         ==> (\z. if z = a then complex_derivative g a
9915                  else f(z) - g(a) / (z - a)) analytic_on s`,
9916   REPEAT STRIP_TAC THEN MATCH_MP_TAC POLE_THEOREM_ANALYTIC THEN
9917   ASM_MESON_TAC[OPEN_CONTAINS_BALL; SUBSET]);;
9918
9919 let POLE_THEOREM_ANALYTIC_OPEN_SUPERSET_0 = prove
9920  (`!f g s a t.
9921         s SUBSET t /\ open t /\ g analytic_on s /\
9922         (!z. z IN t /\ ~(z = a) ==> g(z) = (z - a) * f(z)) /\
9923         f a = complex_derivative g a /\ g(a) = Cx(&0)
9924         ==> f analytic_on s`,
9925   REPEAT STRIP_TAC THEN
9926   SUBGOAL_THEN
9927    `(\z. if z = a then complex_derivative g a
9928          else f(z) - g(a) / (z - a)) analytic_on s`
9929   MP_TAC THENL
9930    [MATCH_MP_TAC POLE_THEOREM_ANALYTIC_OPEN_SUPERSET THEN ASM_MESON_TAC[];
9931     ALL_TAC] THEN
9932   MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
9933   REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN COND_CASES_TAC THEN
9934   ASM_REWRITE_TAC[complex_div] THEN CONV_TAC COMPLEX_RING);;
9935
9936 let HOLOMORPHIC_ON_EXTEND_LIM,HOLOMORPHIC_ON_EXTEND_BOUNDED =
9937  (CONJ_PAIR o prove)
9938  (`(!f a s.
9939       f holomorphic_on (s DELETE a) /\ a IN interior s
9940       ==> ((?g. g holomorphic_on s /\ (!z. z IN s DELETE a ==> g z = f z)) <=>
9941            ((\z. (z - a) * f(z)) --> Cx(&0)) (at a))) /\
9942    (!f a s.
9943       f holomorphic_on (s DELETE a) /\ a IN interior s
9944       ==> ((?g. g holomorphic_on s /\ (!z. z IN s DELETE a ==> g z = f z)) <=>
9945            (?B. eventually (\z. norm(f z) <= B) (at a))))`,
9946   REWRITE_TAC[AND_FORALL_THM] THEN
9947   REWRITE_TAC[TAUT `(p ==> q) /\ (p ==> r) <=> (p ==> q /\ r)`] THEN
9948   REPEAT GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC(TAUT
9949    `(p ==> r) /\ (r ==> q) /\ (q ==> p) ==> (p <=> q) /\ (p <=> r)`) THEN
9950   REPEAT CONJ_TAC THENL
9951    [REWRITE_TAC[IN_DELETE] THEN DISCH_THEN(X_CHOOSE_THEN `g:complex->complex`
9952      (CONJUNCTS_THEN2
9953        (MP_TAC o MATCH_MP HOLOMORPHIC_ON_IMP_CONTINUOUS_ON) ASSUME_TAC)) THEN
9954     DISCH_THEN(MP_TAC o SPEC `interior s:complex->bool` o
9955      MATCH_MP(REWRITE_RULE[IMP_CONJ] CONTINUOUS_ON_SUBSET)) THEN
9956     REWRITE_TAC[INTERIOR_SUBSET; CONTINUOUS_ON] THEN
9957     DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN
9958     ASM_SIMP_TAC[LIM_WITHIN_OPEN; OPEN_INTERIOR; tendsto] THEN
9959     DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN
9960     DISCH_THEN(fun th -> EXISTS_TAC `norm((g:complex->complex) a) + &1` THEN
9961                          MP_TAC th) THEN
9962     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MP) THEN
9963     FIRST_ASSUM(fun th ->
9964      REWRITE_TAC[GSYM(MATCH_MP EVENTUALLY_WITHIN_INTERIOR th)]) THEN
9965     ASM_SIMP_TAC[EVENTUALLY_WITHIN; GSYM DIST_NZ] THEN
9966     EXISTS_TAC `&1` THEN CONV_TAC NORM_ARITH;
9967     DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
9968     MATCH_MP_TAC LIM_NULL_COMPLEX_RMUL_BOUNDED THEN EXISTS_TAC `B:real` THEN
9969     SUBST1_TAC(COMPLEX_RING `Cx(&0) = a - a`) THEN
9970     SIMP_TAC[LIM_AT_ID; LIM_CONST; LIM_SUB] THEN
9971     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ_ALT]
9972         EVENTUALLY_MONO)) THEN
9973     SIMP_TAC[];
9974     DISCH_TAC THEN ABBREV_TAC `h = \z. (z - a) pow 2 * f z` THEN
9975     SUBGOAL_THEN `(h has_complex_derivative Cx(&0)) (at a)` ASSUME_TAC THENL
9976      [EXPAND_TAC "h" THEN REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT] THEN
9977       MATCH_MP_TAC LIM_TRANSFORM_AT THEN
9978       MAP_EVERY EXISTS_TAC [`\z:complex. (z - a) * f z`; `&1`] THEN
9979       ASM_SIMP_TAC[REAL_LT_01; GSYM DIST_NZ] THEN CONV_TAC COMPLEX_FIELD;
9980       ALL_TAC] THEN
9981     SUBGOAL_THEN `h holomorphic_on s` ASSUME_TAC THENL
9982      [REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
9983       X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9984       ASM_CASES_TAC `z:complex = a` THENL
9985        [ASM_MESON_TAC[complex_differentiable; COMPLEX_DIFFERENTIABLE_AT_WITHIN];
9986         ALL_TAC] THEN
9987       EXPAND_TAC "h" THEN MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_MUL_WITHIN THEN
9988       CONJ_TAC THENL [COMPLEX_DIFFERENTIABLE_TAC; ALL_TAC] THEN
9989       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
9990       DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
9991       ASM_REWRITE_TAC[IN_DELETE; complex_differentiable] THEN
9992       MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `b:complex` THEN
9993       REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN] THEN
9994       MATCH_MP_TAC EQ_IMP THEN MATCH_MP_TAC LIM_TRANSFORM_WITHIN_SET THEN
9995       REWRITE_TAC[EVENTUALLY_AT] THEN EXISTS_TAC `dist(a:complex,z)` THEN
9996       ASM_REWRITE_TAC[IN_DELETE; NORM_ARITH `&0 < dist(a,b) <=> ~(a = b)`] THEN
9997       MESON_TAC[REAL_LT_REFL];
9998       MP_TAC(SPECL [`h:complex->complex`; `s:complex->bool`; `a:complex`]
9999             POLE_LEMMA) THEN ASM_REWRITE_TAC[] THEN
10000       ABBREV_TAC
10001        `g = \z. if z = a then complex_derivative h a
10002                 else (h z - h a) / (z - a)` THEN
10003       DISCH_TAC THEN
10004       EXISTS_TAC
10005        `\z. if z = a then complex_derivative g a
10006             else (g z - g a) / (z - a)` THEN
10007       ASM_SIMP_TAC[POLE_LEMMA; IN_DELETE] THEN EXPAND_TAC "g" THEN
10008       FIRST_ASSUM(fun th ->
10009         REWRITE_TAC[MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE th]) THEN
10010       SIMP_TAC[COMPLEX_SUB_RZERO] THEN
10011       EXPAND_TAC "h" THEN SIMP_TAC[] THEN CONV_TAC COMPLEX_FIELD]]);;
10012
10013 (* ------------------------------------------------------------------------- *)
10014 (* General, homology form of Cauchy's theorem. Proof is based on Dixon's,    *)
10015 (* as presented in Lang's "Complex Analysis" book.                           *)
10016 (* ------------------------------------------------------------------------- *)
10017
10018 let CAUCHY_INTEGRAL_FORMULA_GLOBAL = prove
10019  (`!f s g z.
10020         open s /\ f holomorphic_on s /\ z IN s /\
10021         valid_path g /\ pathfinish g = pathstart g /\
10022         path_image g SUBSET s DELETE z /\
10023         (!w. ~(w IN s) ==> winding_number(g,w) = Cx(&0))
10024         ==> ((\w. f(w) / (w - z)) has_path_integral
10025              (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
10026   MATCH_MP_TAC(MESON[]
10027    `((!f s g. vector_polynomial_function g ==> P f s g) ==> !f s g. P f s g) /\
10028     (!f s g. vector_polynomial_function g ==> P f s g)
10029     ==> !f s g. P f s g`) THEN
10030   CONJ_TAC THENL
10031    [REPEAT STRIP_TAC THEN
10032     MP_TAC(ISPECL [`s DELETE (z:complex)`; `g:real^1->complex`]
10033       PATH_INTEGRAL_NEARBY_ENDS) THEN
10034     ASM_SIMP_TAC[VALID_PATH_IMP_PATH; OPEN_DELETE] THEN
10035     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
10036     MP_TAC(ISPECL [`g:real^1->complex`; `d:real`]
10037       PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
10038     ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
10039     DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
10040     FIRST_X_ASSUM(MP_TAC o SPECL
10041      [`g:real^1->complex`; `p:real^1->complex`]) THEN
10042     ASM_SIMP_TAC[VECTOR_SUB_REFL; NORM_0;
10043                  VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
10044     STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
10045      [`f:complex->complex`; `s:complex->bool`; `p:real^1->complex`]) THEN
10046     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
10047     SUBGOAL_THEN
10048      `winding_number(p,z) = winding_number(g,z) /\
10049       !w. ~(w IN s) ==> winding_number(p,w) = winding_number(g,w)`
10050      (fun th -> SIMP_TAC[th])
10051     THENL
10052      [FIRST_X_ASSUM(K ALL_TAC o SPEC `z:complex`) THEN
10053       REPEAT(FIRST_X_ASSUM(STRIP_ASSUME_TAC o MATCH_MP (SET_RULE
10054        `g SUBSET s DELETE z
10055         ==> ~(z IN g) /\ (!y. ~(y IN s) ==> ~(y IN g))`))) THEN
10056       ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH;
10057                    VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
10058       REPEAT STRIP_TAC THEN AP_TERM_TAC THEN
10059       FIRST_X_ASSUM MATCH_MP_TAC THEN
10060       REWRITE_TAC[complex_div; COMPLEX_MUL_LID] THEN
10061       MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN
10062       SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
10063                IN_DELETE; COMPLEX_SUB_0] THEN ASM SET_TAC[];
10064       ALL_TAC] THEN
10065     ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
10066     MATCH_MP_TAC(MESON[HAS_PATH_INTEGRAL_INTEGRAL; path_integrable_on;
10067                        PATH_INTEGRAL_UNIQUE]
10068      `f path_integrable_on g /\ path_integral p f = path_integral g f
10069       ==> (f has_path_integral y) p ==> (f has_path_integral y) g`) THEN
10070     CONJ_TAC THENL
10071      [MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
10072       EXISTS_TAC `s DELETE (z:complex)` THEN ASM_SIMP_TAC[OPEN_DELETE];
10073       FIRST_X_ASSUM MATCH_MP_TAC] THEN
10074     MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
10075     SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
10076              IN_DELETE; COMPLEX_SUB_0] THEN
10077     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; DELETE_SUBSET];
10078     ALL_TAC] THEN
10079   MAP_EVERY X_GEN_TAC
10080    [`f:complex->complex`; `u:complex->bool`; `g:real^1->complex`] THEN
10081   DISCH_TAC THEN X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
10082   FIRST_ASSUM(X_CHOOSE_THEN `g':real^1->complex` STRIP_ASSUME_TAC o
10083       MATCH_MP HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION) THEN
10084   SUBGOAL_THEN
10085    `bounded(IMAGE (g':real^1->complex) (interval[vec 0,vec 1]))`
10086   MP_TAC THENL
10087    [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
10088     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
10089     REWRITE_TAC[COMPACT_INTERVAL] THEN
10090     ASM_MESON_TAC[CONTINUOUS_VECTOR_POLYNOMIAL_FUNCTION;
10091                   CONTINUOUS_AT_IMP_CONTINUOUS_ON];
10092     REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
10093     DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC)] THEN
10094   FIRST_ASSUM(ASSUME_TAC o MATCH_MP VALID_PATH_IMP_PATH) THEN
10095   MAP_EVERY ABBREV_TAC
10096    [`d = \z w. if w = z then complex_derivative f z
10097               else (f(w) - f(z)) / (w - z)`;
10098     `v = {w | ~(w IN path_image g) /\ winding_number(g,w) = Cx(&0)}`] THEN
10099   SUBGOAL_THEN `open(v:complex->bool)` ASSUME_TAC THENL
10100    [EXPAND_TAC "v" THEN MATCH_MP_TAC OPEN_WINDING_NUMBER_LEVELSETS THEN
10101     ASM_REWRITE_TAC[];
10102     ALL_TAC] THEN
10103   SUBGOAL_THEN `u UNION v = (:complex)` ASSUME_TAC THENL
10104    [ASM SET_TAC[]; ALL_TAC] THEN
10105   SUBGOAL_THEN `!y:complex. y IN u ==> (d y) holomorphic_on u` ASSUME_TAC THENL
10106    [X_GEN_TAC `y:complex` THEN STRIP_TAC THEN EXPAND_TAC "d" THEN
10107     MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN EXISTS_TAC `{y:complex}` THEN
10108     ASM_REWRITE_TAC[FINITE_SING] THEN CONJ_TAC THENL
10109      [ASM_SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT] THEN
10110       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
10111       ASM_CASES_TAC `w:complex = y` THENL
10112        [UNDISCH_THEN `w:complex = y` SUBST_ALL_TAC THEN
10113         REWRITE_TAC[CONTINUOUS_AT] THEN
10114         MATCH_MP_TAC LIM_TRANSFORM_AWAY_AT THEN
10115         EXISTS_TAC `\w:complex. (f w - f y) / (w - y)` THEN SIMP_TAC[] THEN
10116         EXISTS_TAC `y + Cx(&1)` THEN
10117         CONJ_TAC THENL [CONV_TAC COMPLEX_RING; ALL_TAC] THEN
10118         REWRITE_TAC[GSYM HAS_COMPLEX_DERIVATIVE_AT] THEN
10119         REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
10120         ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT];
10121         MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_IMP_CONTINUOUS_AT];
10122       ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DELETE; IN_DELETE;
10123         SET_RULE `s DIFF {x} = s DELETE x`; GSYM complex_differentiable] THEN
10124       X_GEN_TAC `w:complex` THEN STRIP_TAC] THEN
10125      MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_AT THEN
10126      EXISTS_TAC `\w:complex. (f w - f y) / (w - y)` THEN
10127      EXISTS_TAC `dist(w:complex,y)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
10128      (CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC]) THEN
10129      MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
10130      ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
10131      MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
10132      ASM_SIMP_TAC[ETA_AX; COMPLEX_DIFFERENTIABLE_CONST;
10133                   COMPLEX_DIFFERENTIABLE_ID] THEN
10134      ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT];
10135      ALL_TAC] THEN
10136   SUBGOAL_THEN
10137    `!y. ~(y IN path_image g)
10138         ==> (\x. (f x - f y) / (x - y)) path_integrable_on g`
10139   ASSUME_TAC THENL
10140    [X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
10141     MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
10142     EXISTS_TAC `u DELETE (y:complex)` THEN ASM_SIMP_TAC[OPEN_DELETE] THEN
10143     CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
10144     MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
10145     SIMP_TAC[IN_DELETE; COMPLEX_SUB_0] THEN
10146     CONJ_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
10147     ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID] THEN
10148     MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
10149     EXISTS_TAC `u:complex->bool` THEN ASM_REWRITE_TAC[DELETE_SUBSET];
10150     ALL_TAC] THEN
10151   SUBGOAL_THEN
10152    `!y:complex. d y path_integrable_on g`
10153   ASSUME_TAC THENL
10154    [X_GEN_TAC `y:complex` THEN
10155     ASM_CASES_TAC `(y:complex) IN path_image g` THENL
10156      [MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
10157       EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[] THEN ASM SET_TAC[];
10158       MATCH_MP_TAC PATH_INTEGRABLE_EQ THEN
10159       EXISTS_TAC `\x:complex. (f x - f y) / (x - y)` THEN
10160       ASM_SIMP_TAC[] THEN EXPAND_TAC "d" THEN ASM_MESON_TAC[]];
10161     ALL_TAC] THEN
10162   SUBGOAL_THEN
10163    `?h. (!z. z IN u ==> ((d z) has_path_integral h(z)) g) /\
10164         (!z. z IN v ==> ((\w. f(w) / (w - z)) has_path_integral h(z)) g)`
10165    (CHOOSE_THEN (CONJUNCTS_THEN2 (LABEL_TAC "u") (LABEL_TAC "v")))
10166   THENL
10167    [EXISTS_TAC `\z. if z IN u then path_integral g (d z)
10168                     else path_integral g (\w. f(w) / (w - z))` THEN
10169     SIMP_TAC[] THEN CONJ_TAC THEN X_GEN_TAC `w:complex` THEN DISCH_TAC THENL
10170      [ASM_MESON_TAC[HAS_PATH_INTEGRAL_INTEGRAL]; ALL_TAC] THEN
10171     ASM_CASES_TAC `(w:complex) IN u` THEN ASM_REWRITE_TAC[] THENL
10172      [ALL_TAC;
10173       MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
10174       MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
10175       EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL
10176        [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
10177         ASM_SIMP_TAC[COMPLEX_SUB_0; HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST;
10178                      HOLOMORPHIC_ON_ID] THEN
10179         ASM_MESON_TAC[];
10180         ASM SET_TAC[]]] THEN
10181     MATCH_MP_TAC HAS_PATH_INTEGRAL_EQ THEN
10182     EXISTS_TAC `\x:complex. (f x - f w) / (x - w) + f(w) / (x - w)` THEN
10183     CONJ_TAC THENL
10184      [X_GEN_TAC `x:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
10185       SIMPLE_COMPLEX_ARITH_TAC;
10186       ALL_TAC] THEN
10187     GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_ADD_RID] THEN
10188     MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN
10189     UNDISCH_TAC `(w:complex) IN v` THEN EXPAND_TAC "v" THEN
10190     REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THENL
10191      [MATCH_MP_TAC(MESON[PATH_INTEGRAL_UNIQUE; HAS_PATH_INTEGRAL_INTEGRAL;
10192                    path_integrable_on; PATH_INTEGRAL_EQ; PATH_INTEGRABLE_EQ]
10193        `g path_integrable_on p /\
10194         (!x. x IN path_image p ==> f x = g x)
10195         ==> (f has_path_integral path_integral p g) p`) THEN
10196       ASM_REWRITE_TAC[] THEN EXPAND_TAC "d" THEN ASM_MESON_TAC[];
10197       SUBGOAL_THEN
10198        `Cx(&0) = (f w) * Cx(&2) * Cx pi * ii * winding_number(g,w)`
10199       SUBST1_TAC THENL [ASM_REWRITE_TAC[COMPLEX_MUL_RZERO]; ALL_TAC] THEN
10200       ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `x / y = x * Cx(&1) / y`] THEN
10201       MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_LMUL THEN
10202       MATCH_MP_TAC HAS_PATH_INTEGRAL_WINDING_NUMBER THEN
10203       ASM_REWRITE_TAC[]];
10204     ALL_TAC] THEN
10205   SUBGOAL_THEN `!z. (h:complex->complex) z = Cx(&0)` ASSUME_TAC THENL
10206    [ALL_TAC;
10207     REMOVE_THEN "u" (MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
10208     EXPAND_TAC "d" THEN REWRITE_TAC[] THEN
10209     DISCH_THEN(MP_TAC o SPEC `\w. (f w - f z) / (w - z)` o
10210      MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT] HAS_PATH_INTEGRAL_EQ)) THEN
10211     REWRITE_TAC[] THEN ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
10212     MP_TAC(SPECL [`g:real^1->complex`; `z:complex`]
10213       HAS_PATH_INTEGRAL_WINDING_NUMBER) THEN ASM_REWRITE_TAC[] THEN
10214     ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
10215     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_COMPLEX_RMUL) THEN
10216     DISCH_THEN(MP_TAC o SPEC `(f:complex->complex) z`) THEN
10217     REWRITE_TAC[IMP_IMP] THEN
10218     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_ADD) THEN
10219     REWRITE_TAC[complex_div; COMPLEX_ADD_RID; COMPLEX_RING
10220      `(Cx(&1) * i) * fz + (fx - fz) * i = fx * i`] THEN
10221     REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC]] THEN
10222   UNDISCH_THEN `(z:complex) IN u` (K ALL_TAC) THEN
10223   FIRST_X_ASSUM(ASSUME_TAC o MATCH_MP (SET_RULE
10224    `p SUBSET u DELETE z ==> p SUBSET u`)) THEN
10225   POP_ASSUM_LIST(MP_TAC o end_itlist CONJ o rev) THEN STRIP_TAC THEN
10226   MATCH_MP_TAC LIOUVILLE_WEAK THEN
10227   MATCH_MP_TAC(TAUT `b /\ (b ==> a) ==> a /\ b`) THEN CONJ_TAC THENL
10228    [SUBGOAL_THEN
10229      `?t:complex->bool.
10230         compact t /\ path_image g SUBSET interior t /\ t SUBSET u`
10231     STRIP_ASSUME_TAC THENL
10232      [SUBGOAL_THEN
10233        `?dd. &0 < dd /\
10234             {y + k | y IN path_image g /\ k IN ball(vec 0,dd)} SUBSET u`
10235       STRIP_ASSUME_TAC THENL
10236        [ASM_CASES_TAC `u = (:complex)` THENL
10237          [EXISTS_TAC `&1` THEN ASM_REWRITE_TAC[REAL_LT_01; SUBSET_UNIV];
10238           ALL_TAC] THEN
10239         MP_TAC(ISPECL [`path_image g:complex->bool`; `(:complex) DIFF u`]
10240           SEPARATE_COMPACT_CLOSED) THEN
10241         ASM_SIMP_TAC[COMPACT_PATH_IMAGE; GSYM OPEN_CLOSED] THEN
10242         ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
10243         DISCH_THEN(X_CHOOSE_THEN `dd:real` STRIP_ASSUME_TAC) THEN
10244         EXISTS_TAC `dd / &2` THEN ASM_REWRITE_TAC[REAL_HALF] THEN
10245         REWRITE_TAC[SUBSET; FORALL_IN_GSPEC] THEN
10246         MAP_EVERY X_GEN_TAC [`y:complex`; `k:complex`] THEN
10247         MATCH_MP_TAC(TAUT `(a /\ ~c ==> ~b) ==> a /\ b ==> c`) THEN
10248         STRIP_TAC THEN
10249         FIRST_X_ASSUM(MP_TAC o SPECL [`y:complex`; `y + k:complex`]) THEN
10250         ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; IN_BALL] THEN CONV_TAC NORM_ARITH;
10251         ALL_TAC] THEN
10252       EXISTS_TAC `{y + k:complex |
10253                    y IN path_image g /\ k IN cball(vec 0,dd / &2)}` THEN
10254       ASM_SIMP_TAC[COMPACT_SUMS; COMPACT_PATH_IMAGE; COMPACT_CBALL] THEN
10255       CONJ_TAC THENL
10256        [REWRITE_TAC[SUBSET; IN_INTERIOR; IN_ELIM_THM] THEN
10257         X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
10258         EXISTS_TAC `dd / &2` THEN ASM_REWRITE_TAC[REAL_HALF] THEN
10259         X_GEN_TAC `x:complex` THEN REWRITE_TAC[IN_BALL] THEN DISCH_TAC THEN
10260         MAP_EVERY EXISTS_TAC [`y:complex`; `x - y:complex`] THEN
10261         ASM_REWRITE_TAC[IN_CBALL] THEN
10262         UNDISCH_TAC `dist(y:complex,x) < dd / &2` THEN CONV_TAC NORM_ARITH;
10263         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
10264          `{x + y:real^N | x IN s /\ y IN t} SUBSET u
10265           ==> t' SUBSET t ==> {x + y | x IN s /\ y IN t'} SUBSET u`)) THEN
10266         REWRITE_TAC[SUBSET; IN_BALL; IN_CBALL] THEN
10267         UNDISCH_TAC `&0 < dd` THEN CONV_TAC NORM_ARITH];
10268       ALL_TAC] THEN
10269     MP_TAC(ISPECL [`interior t:complex->bool`; `g:real^1->complex`]
10270         PATH_INTEGRAL_BOUND_EXISTS) THEN
10271     ASM_REWRITE_TAC[OPEN_INTERIOR] THEN
10272     DISCH_THEN(X_CHOOSE_THEN `L:real` STRIP_ASSUME_TAC) THEN
10273     SUBGOAL_THEN `bounded(IMAGE (f:complex->complex) t)` MP_TAC THENL
10274      [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
10275       MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
10276       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; CONTINUOUS_ON_SUBSET];
10277       REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
10278       DISCH_THEN(X_CHOOSE_THEN `D:real` STRIP_ASSUME_TAC)] THEN
10279     FIRST_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_BOUNDED) THEN
10280     REWRITE_TAC[BOUNDED_POS] THEN
10281     DISCH_THEN(X_CHOOSE_THEN `C:real` STRIP_ASSUME_TAC) THEN
10282     REWRITE_TAC[LIM_AT_INFINITY] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
10283     EXISTS_TAC `(D * L) / (e / &2) + C:real` THEN REWRITE_TAC[real_ge] THEN
10284     X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
10285     REWRITE_TAC[dist; COMPLEX_SUB_RZERO] THEN
10286     SUBGOAL_THEN `h y = path_integral g (\w. f w / (w - y))` SUBST1_TAC THENL
10287      [CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10288       FIRST_X_ASSUM MATCH_MP_TAC THEN EXPAND_TAC "v" THEN
10289       REWRITE_TAC[IN_ELIM_THM] THEN CONJ_TAC THENL
10290        [DISCH_TAC THEN
10291         UNDISCH_TAC `(D * L) / (e / &2) + C <= norm(y:complex)` THEN
10292         MATCH_MP_TAC(REAL_ARITH `&0 < d /\ x <= c ==> d + c <= x ==> F`) THEN
10293         ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF] THEN
10294         ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET];
10295         MATCH_MP_TAC WINDING_NUMBER_ZERO_OUTSIDE THEN
10296         EXISTS_TAC `cball(Cx(&0),C)` THEN
10297         ASM_REWRITE_TAC[CONVEX_CBALL; SUBSET; IN_CBALL; dist;
10298                         COMPLEX_SUB_LZERO; NORM_NEG] THEN
10299         CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET]] THEN
10300         UNDISCH_TAC `(D * L) / (e / &2) + C <= norm(y:complex)` THEN
10301         MATCH_MP_TAC(REAL_ARITH `&0 < d ==> d + c <= x ==> ~(x <= c)`) THEN
10302         ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF]];
10303       ALL_TAC] THEN
10304     MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `L * (e / &2 / L)` THEN
10305     CONJ_TAC THENL
10306      [ALL_TAC;
10307       ASM_SIMP_TAC[REAL_DIV_LMUL; REAL_LT_IMP_NZ; REAL_HALF] THEN
10308       ASM_REAL_ARITH_TAC] THEN
10309     FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[] THEN CONJ_TAC THENL
10310      [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN CONJ_TAC THENL
10311        [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_TRANS; INTERIOR_SUBSET];
10312         SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID;
10313                  HOLOMORPHIC_ON_CONST; COMPLEX_SUB_0]] THEN
10314       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
10315       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
10316        `d + c <= norm y ==> &0 < d /\ norm w <= c ==> ~(w = y)`)) THEN
10317       ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF] THEN
10318       ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
10319       ALL_TAC] THEN
10320     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN SIMP_TAC[COMPLEX_NORM_DIV] THEN
10321     SUBGOAL_THEN `&0 < norm(w - y)` ASSUME_TAC THENL
10322      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
10323        `d + c <= norm y ==> &0 < d /\ norm w <= c ==> &0 < norm(w - y)`)) THEN
10324       ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF] THEN
10325       ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
10326       ASM_SIMP_TAC[REAL_LE_LDIV_EQ]] THEN
10327     MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `D:real` THEN CONJ_TAC THENL
10328      [ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET]; ALL_TAC] THEN
10329     REWRITE_TAC[REAL_ARITH `e / &2 / L * x = (x * (e / &2)) / L`] THEN
10330     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; GSYM REAL_LE_LDIV_EQ; REAL_HALF] THEN
10331     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
10332        `d + c <= norm y ==> norm w <= c ==> d <= norm(w - y)`)) THEN
10333     ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
10334     DISCH_TAC] THEN
10335   SUBGOAL_THEN
10336    `(\y. (d:complex->complex->complex) (fstcart y) (sndcart y)) continuous_on
10337     {pastecart x z | x IN u /\ z IN u}`
10338   ASSUME_TAC THENL
10339    [REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN EXPAND_TAC "d" THEN
10340     REWRITE_TAC[FORALL_IN_GSPEC; continuous_within; IMP_CONJ] THEN
10341     MAP_EVERY X_GEN_TAC [`x:complex`; `z:complex`] THEN REPEAT DISCH_TAC THEN
10342     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
10343     REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART; FORALL_PASTECART] THEN
10344     REWRITE_TAC[dist; IMP_IMP; GSYM CONJ_ASSOC; PASTECART_SUB] THEN
10345     ASM_CASES_TAC `z:complex = x` THEN ASM_REWRITE_TAC[] THENL
10346      [UNDISCH_THEN `z:complex = x` (SUBST_ALL_TAC o SYM);
10347       SUBGOAL_THEN
10348         `(\y. (f(sndcart y) - f(fstcart y)) / (sndcart y - fstcart y))
10349          continuous at (pastecart x z)`
10350       MP_TAC THENL
10351        [MATCH_MP_TAC CONTINUOUS_COMPLEX_DIV_AT THEN
10352         ASM_SIMP_TAC[FSTCART_PASTECART; SNDCART_PASTECART; COMPLEX_SUB_0] THEN
10353         CONJ_TAC THEN MATCH_MP_TAC CONTINUOUS_SUB THEN
10354         SIMP_TAC[LINEAR_CONTINUOUS_AT; LINEAR_FSTCART; LINEAR_SNDCART] THEN
10355         CONJ_TAC THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
10356         MATCH_MP_TAC CONTINUOUS_AT_COMPOSE THEN
10357         SIMP_TAC[LINEAR_CONTINUOUS_AT; LINEAR_FSTCART; LINEAR_SNDCART] THEN
10358         REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART] THEN
10359         ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
10360                       CONTINUOUS_ON_EQ_CONTINUOUS_AT];
10361         ALL_TAC] THEN
10362       REWRITE_TAC[continuous_at; dist; FORALL_PASTECART] THEN
10363       REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART; PASTECART_SUB] THEN
10364       DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
10365       DISCH_THEN(X_CHOOSE_THEN `k1:real` STRIP_ASSUME_TAC) THEN
10366       SUBGOAL_THEN
10367        `open({pastecart x z | x IN u /\ z IN u} DIFF
10368              {y | y IN UNIV /\ fstcart y - sndcart y = Cx(&0)})`
10369       MP_TAC THENL
10370        [MATCH_MP_TAC OPEN_DIFF THEN
10371         ASM_SIMP_TAC[REWRITE_RULE[PCROSS] OPEN_PCROSS] THEN
10372         MATCH_MP_TAC CONTINUOUS_CLOSED_PREIMAGE_CONSTANT THEN
10373         REWRITE_TAC[CLOSED_UNIV] THEN MATCH_MP_TAC CONTINUOUS_ON_SUB THEN
10374         SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_FSTCART; LINEAR_SNDCART];
10375         SIMP_TAC[OPEN_CONTAINS_BALL; IN_DIFF; IMP_CONJ; FORALL_IN_GSPEC] THEN
10376         DISCH_THEN(MP_TAC o SPECL [`x:complex`; `z:complex`]) THEN
10377         ASM_REWRITE_TAC[IN_ELIM_THM; IN_UNIV; COMPLEX_SUB_0] THEN
10378         ASM_REWRITE_TAC[SUBSET; IN_BALL; FORALL_PASTECART; IN_DIFF;
10379           IN_ELIM_PASTECART_THM; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10380         REWRITE_TAC[IN_ELIM_THM; IMP_IMP; GSYM CONJ_ASSOC] THEN
10381         REWRITE_TAC[ONCE_REWRITE_RULE[NORM_SUB] dist; PASTECART_SUB;
10382                FSTCART_PASTECART; SNDCART_PASTECART] THEN
10383         DISCH_THEN(X_CHOOSE_THEN `k2:real` STRIP_ASSUME_TAC)] THEN
10384       EXISTS_TAC `min k1 k2:real` THEN
10385       ASM_SIMP_TAC[REAL_LT_MIN; COMPLEX_NORM_NZ; COMPLEX_SUB_0]] THEN
10386     SUBGOAL_THEN `(complex_derivative f) continuous at z` MP_TAC THENL
10387      [MATCH_MP_TAC CONTINUOUS_ON_INTERIOR THEN
10388       EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[INTERIOR_OPEN] THEN
10389       MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
10390       MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10391       ASM_REWRITE_TAC[];
10392       REWRITE_TAC[continuous_at] THEN DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN
10393       ASM_REWRITE_TAC[dist; REAL_HALF]] THEN
10394     DISCH_THEN(X_CHOOSE_THEN `k1:real` STRIP_ASSUME_TAC) THEN
10395     MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_BALL) THEN
10396     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
10397     ASM_REWRITE_TAC[] THEN
10398     DISCH_THEN(X_CHOOSE_THEN `k2:real` STRIP_ASSUME_TAC) THEN
10399     EXISTS_TAC `min k1 k2:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
10400     MAP_EVERY X_GEN_TAC [`x':complex`; `z':complex`] THEN STRIP_TAC THEN
10401     MATCH_MP_TAC(REAL_ARITH `&0 < e /\ x <= e / &2 ==> x < e`) THEN
10402     COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL
10403      [ASM_MESON_TAC[NORM_LE_PASTECART; REAL_LET_TRANS; REAL_LT_IMP_LE];
10404       ALL_TAC] THEN
10405     SUBGOAL_THEN `e / &2 = e / &2 / norm(z' - x') * norm(z' - x':complex)`
10406     SUBST1_TAC THENL
10407      [ASM_SIMP_TAC[REAL_DIV_RMUL; NORM_EQ_0; VECTOR_SUB_EQ]; ALL_TAC] THEN
10408     MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
10409     EXISTS_TAC `\u. (complex_derivative f u - complex_derivative f z) /
10410                     (z' - x')` THEN
10411     ASM_SIMP_TAC[REAL_LE_DIV; NORM_POS_LE; REAL_LT_IMP_LE; REAL_HALF] THEN
10412     CONJ_TAC THENL
10413      [ASM_SIMP_TAC[COMPLEX_FIELD
10414        `~(z:complex = x)
10415          ==> a / (z - x) - b = (a - b * (z - x)) / (z - x)`] THEN
10416       MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_DIV THEN
10417       MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
10418       REWRITE_TAC[HAS_PATH_INTEGRAL_CONST_LINEPATH] THEN
10419       MP_TAC(ISPECL [`f:complex->complex`; `complex_derivative f`;
10420                      `linepath(x':complex,z')`; `u:complex->bool`]
10421                 PATH_INTEGRAL_PRIMITIVE) THEN
10422       REWRITE_TAC[ETA_AX; PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
10423       DISCH_THEN MATCH_MP_TAC THEN
10424       REWRITE_TAC[VALID_PATH_LINEPATH] THEN CONJ_TAC THENL
10425        [ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE;
10426                       GSYM HOLOMORPHIC_ON_DIFFERENTIABLE;
10427                       HAS_COMPLEX_DERIVATIVE_AT_WITHIN; HOLOMORPHIC_ON_OPEN;
10428                       complex_differentiable];
10429         MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,k2)`];
10430       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
10431       REWRITE_TAC[COMPLEX_NORM_DIV; real_div] THEN
10432       MATCH_MP_TAC REAL_LE_RMUL THEN
10433       REWRITE_TAC[REAL_LE_INV_EQ; NORM_POS_LE] THEN
10434       MATCH_MP_TAC(REAL_ARITH `x < e / &2 ==> x <= e * inv(&2)`) THEN
10435       FIRST_X_ASSUM MATCH_MP_TAC THEN
10436       REWRITE_TAC[REWRITE_RULE[ONCE_REWRITE_RULE[NORM_SUB] dist]
10437        (GSYM IN_BALL)] THEN
10438       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
10439        `w IN s ==> s SUBSET t ==> w IN t`))] THEN
10440     ASM_REWRITE_TAC[PATH_IMAGE_LINEPATH; SEGMENT_CONVEX_HULL] THEN
10441     MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
10442     REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_BALL; dist] THEN
10443     ONCE_REWRITE_TAC[NORM_SUB] THEN
10444     ASM_MESON_TAC[NORM_LE_PASTECART; REAL_LET_TRANS];
10445     ALL_TAC] THEN
10446   SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_UNIV; IN_UNIV;
10447            GSYM complex_differentiable] THEN
10448   X_GEN_TAC `z0:complex` THEN ASM_CASES_TAC `(z0:complex) IN v` THENL
10449    [MP_TAC(ISPECL
10450     [`f:complex->complex`; `h:complex->complex`; `g:real^1->complex`;
10451      `v:complex->bool`; `1`; `B:real`]
10452         CAUCHY_NEXT_DERIVATIVE) THEN
10453     ASM_SIMP_TAC[IN_DIFF; ARITH_EQ; COMPLEX_POW_1] THEN ANTS_TAC THENL
10454      [CONJ_TAC THENL
10455        [ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_UNIQUE_AT]; ALL_TAC] THEN
10456       MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
10457       MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
10458       EXISTS_TAC `u:complex->bool` THEN ASM SET_TAC[];
10459       DISCH_THEN(MP_TAC o SPEC `z0:complex`) THEN
10460       UNDISCH_TAC `(z0:complex) IN v` THEN EXPAND_TAC "v" THEN
10461       SIMP_TAC[IN_ELIM_THM; complex_differentiable] THEN MESON_TAC[]];
10462     ALL_TAC] THEN
10463   SUBGOAL_THEN `(z0:complex) IN u` ASSUME_TAC THENL
10464    [ASM SET_TAC[]; ALL_TAC] THEN
10465   MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_BALL) THEN
10466   ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `z0:complex`) THEN
10467   ASM_SIMP_TAC[] THEN DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
10468   MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
10469   EXISTS_TAC `ball(z0:complex,e)` THEN
10470   ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
10471   MATCH_MP_TAC ANALYTIC_IMP_HOLOMORPHIC THEN MATCH_MP_TAC MORERA_TRIANGLE THEN
10472   REWRITE_TAC[OPEN_BALL] THEN
10473   SUBGOAL_THEN `(h:complex->complex) continuous_on u` ASSUME_TAC THENL
10474    [REWRITE_TAC[CONTINUOUS_ON_SEQUENTIALLY] THEN
10475     MAP_EVERY X_GEN_TAC [`a:num->complex`; `x:complex`] THEN STRIP_TAC THEN
10476     MP_TAC(ISPECL
10477      [`sequentially`; `\n:num x. (d:complex->complex->complex) (a n) x`;
10478       `B:real`; `g:real^1->complex`; `(d:complex->complex->complex) x`]
10479       PATH_INTEGRAL_UNIFORM_LIMIT) THEN
10480     ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; ETA_AX; EVENTUALLY_TRUE] THEN
10481     ANTS_TAC THENL
10482      [ALL_TAC;
10483       MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN BINOP_TAC THEN
10484       REWRITE_TAC[FUN_EQ_THM; o_THM] THEN REPEAT GEN_TAC THEN
10485       MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10486       FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]] THEN
10487     CONJ_TAC THENL
10488      [ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_UNIQUE_AT]; ALL_TAC] THEN
10489     X_GEN_TAC `ee:real` THEN DISCH_TAC THEN
10490     MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_CBALL) THEN
10491     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
10492     ASM_SIMP_TAC[] THEN
10493     DISCH_THEN(X_CHOOSE_THEN `dd:real` STRIP_ASSUME_TAC) THEN
10494     SUBGOAL_THEN
10495      `(\y. (d:complex->complex->complex) (fstcart y) (sndcart y))
10496       uniformly_continuous_on
10497       {pastecart w z | w IN cball(x,dd) /\ z IN path_image g}`
10498     MP_TAC THENL
10499      [MATCH_MP_TAC COMPACT_UNIFORMLY_CONTINUOUS THEN
10500       ASM_SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS; COMPACT_CBALL;
10501                    COMPACT_VALID_PATH_IMAGE] THEN
10502       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10503         CONTINUOUS_ON_SUBSET)) THEN
10504       REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_ELIM_PASTECART_THM] THEN
10505       ASM SET_TAC[];
10506       ALL_TAC] THEN
10507     REWRITE_TAC[uniformly_continuous_on] THEN
10508     DISCH_THEN(MP_TAC o SPEC `ee:real`) THEN ASM_REWRITE_TAC[] THEN
10509     DISCH_THEN(X_CHOOSE_THEN `kk:real`
10510       (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
10511     DISCH_THEN(MP_TAC o GENL [`w:complex`; `z:complex`] o
10512      SPECL [`pastecart (x:complex) (z:complex)`;
10513             `pastecart (w:complex) (z:complex)`]) THEN
10514     SIMP_TAC[IN_ELIM_PASTECART_THM; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10515     ASM_SIMP_TAC[CENTRE_IN_CBALL; REAL_LT_IMP_LE; dist; PASTECART_SUB] THEN
10516     REWRITE_TAC[VECTOR_SUB_REFL; NORM_0; NORM_PASTECART] THEN
10517     CONV_TAC REAL_RAT_REDUCE_CONV THEN
10518     REWRITE_TAC[TAUT `b /\ (a /\ b) /\ c ==> d <=> a /\ b /\ c ==> d`] THEN
10519     SIMP_TAC[REAL_ADD_RID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
10520     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [LIM_SEQUENTIALLY]) THEN
10521     DISCH_THEN(MP_TAC o SPEC `min dd kk:real`) THEN
10522     ASM_REWRITE_TAC[EVENTUALLY_SEQUENTIALLY; REAL_LT_MIN] THEN
10523     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
10524     REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
10525     ASM_SIMP_TAC[ONCE_REWRITE_RULE[DIST_SYM] IN_CBALL; GSYM dist;
10526                  REAL_LT_IMP_LE];
10527     ALL_TAC] THEN
10528   CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
10529
10530   SUBGOAL_THEN
10531    `!w. w IN u ==> (\z. d z w) holomorphic_on u`
10532   ASSUME_TAC THENL
10533    [EXPAND_TAC "d" THEN X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
10534     MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN EXISTS_TAC `{y:complex}` THEN
10535     ASM_REWRITE_TAC[FINITE_SING] THEN CONJ_TAC THENL
10536      [SUBGOAL_THEN
10537        `((\y. (d:complex->complex->complex) (fstcart y) (sndcart y)) o
10538         (\z. pastecart y z))
10539         continuous_on u`
10540       MP_TAC THENL
10541        [MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
10542         SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
10543                  CONTINUOUS_ON_CONST] THEN
10544         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10545           CONTINUOUS_ON_SUBSET)) THEN
10546         ASM_SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM];
10547         EXPAND_TAC "d" THEN
10548         REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10549         MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] CONTINUOUS_ON_EQ) THEN
10550         GEN_TAC THEN REWRITE_TAC[] THEN COND_CASES_TAC THEN
10551         ASM_REWRITE_TAC[] THEN
10552         DISCH_TAC THEN REWRITE_TAC[complex_div] THEN MATCH_MP_TAC(COMPLEX_RING
10553          `x':complex = --x /\ y' = --y ==> x * y = x' * y'`) THEN
10554         REWRITE_TAC[GSYM COMPLEX_INV_NEG; COMPLEX_NEG_SUB]];
10555       ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DELETE; IN_DELETE;
10556         SET_RULE `s DIFF {x} = s DELETE x`; GSYM complex_differentiable] THEN
10557       X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
10558       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_AT THEN
10559       EXISTS_TAC `\w:complex. (f y - f w) / (y - w)` THEN
10560       EXISTS_TAC `dist(w:complex,y)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
10561       (CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC]) THEN
10562       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
10563       ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
10564       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
10565       ASM_SIMP_TAC[ETA_AX; COMPLEX_DIFFERENTIABLE_CONST;
10566                    COMPLEX_DIFFERENTIABLE_ID] THEN
10567       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]];
10568     ALL_TAC] THEN
10569   SUBGOAL_THEN
10570    `!w a b:complex. w IN u /\ segment[a,b] SUBSET u
10571                     ==> (\z. d z w) path_integrable_on (linepath(a,b))`
10572   ASSUME_TAC THENL
10573    [REPEAT STRIP_TAC THEN
10574     MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
10575     ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
10576     ALL_TAC] THEN
10577   SUBGOAL_THEN
10578    `!a b:complex.
10579         segment[a,b] SUBSET u
10580         ==> (\w. path_integral (linepath(a,b)) (\z. d z w))
10581             continuous_on u`
10582   ASSUME_TAC THENL
10583    [REPEAT STRIP_TAC THEN ASM_CASES_TAC `a:complex = b` THENL
10584      [ASM_SIMP_TAC[PATH_INTEGRAL_TRIVIAL; CONTINUOUS_ON_CONST]; ALL_TAC] THEN
10585     REWRITE_TAC[continuous_on] THEN X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
10586     X_GEN_TAC `ee:real` THEN DISCH_TAC THEN
10587     ASM_SIMP_TAC[dist; GSYM PATH_INTEGRAL_SUB] THEN
10588     MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_CBALL) THEN
10589     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
10590     ASM_SIMP_TAC[] THEN
10591     DISCH_THEN(X_CHOOSE_THEN `dd:real` STRIP_ASSUME_TAC) THEN
10592     SUBGOAL_THEN
10593      `(\y. (d:complex->complex->complex) (fstcart y) (sndcart y))
10594       uniformly_continuous_on
10595       {pastecart z t | z IN segment[a,b] /\ t IN cball(w,dd)}`
10596     MP_TAC THENL
10597      [MATCH_MP_TAC COMPACT_UNIFORMLY_CONTINUOUS THEN
10598       ASM_SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS;
10599                    COMPACT_CBALL; COMPACT_SEGMENT] THEN
10600       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10601         CONTINUOUS_ON_SUBSET)) THEN
10602       REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_ELIM_PASTECART_THM] THEN
10603       ASM SET_TAC[];
10604       ALL_TAC] THEN
10605     REWRITE_TAC[uniformly_continuous_on] THEN
10606     DISCH_THEN(MP_TAC o SPEC `ee / &2 / norm(b - a:complex)`) THEN
10607     ASM_SIMP_TAC[REAL_HALF; REAL_LT_DIV; COMPLEX_NORM_NZ; COMPLEX_SUB_0] THEN
10608     DISCH_THEN(X_CHOOSE_THEN `kk:real`
10609       (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
10610     DISCH_THEN(MP_TAC o GENL [`z:complex`; `r:complex`] o
10611      SPECL [`pastecart (r:complex) (z:complex)`;
10612             `pastecart (r:complex) (w:complex)`]) THEN
10613     SIMP_TAC[IN_ELIM_PASTECART_THM; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10614     ASM_SIMP_TAC[CENTRE_IN_CBALL; REAL_LT_IMP_LE; dist; PASTECART_SUB] THEN
10615     REWRITE_TAC[VECTOR_SUB_REFL; NORM_0; NORM_PASTECART] THEN
10616     CONV_TAC REAL_RAT_REDUCE_CONV THEN
10617     REWRITE_TAC[TAUT `(a /\ b) /\ a /\ c ==> d <=> a /\ b /\ c ==> d`] THEN
10618     SIMP_TAC[REAL_ADD_LID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
10619     EXISTS_TAC `min dd kk:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
10620     X_GEN_TAC `x:complex` THEN REPEAT STRIP_TAC THEN
10621     MATCH_MP_TAC(REAL_ARITH `&0 < e /\ x <= e / &2 ==> x < e`) THEN
10622     ASM_REWRITE_TAC[] THEN
10623     SUBGOAL_THEN `ee / &2 = ee / &2 / norm(b - a) * norm(b - a:complex)`
10624     SUBST1_TAC THENL
10625      [ASM_SIMP_TAC[REAL_DIV_RMUL; NORM_EQ_0; VECTOR_SUB_EQ]; ALL_TAC] THEN
10626     MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
10627     EXISTS_TAC `\r. (d:complex->complex->complex) r x - d r w` THEN
10628     ASM_SIMP_TAC[REAL_LE_DIV; NORM_POS_LE; REAL_LT_IMP_LE; REAL_HALF] THEN
10629     CONJ_TAC THENL
10630      [MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
10631       MATCH_MP_TAC PATH_INTEGRABLE_SUB THEN ASM_SIMP_TAC[];
10632       REPEAT STRIP_TAC THEN GEN_REWRITE_TAC LAND_CONV [NORM_SUB] THEN
10633       MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
10634       ASM_REWRITE_TAC[IN_CBALL; dist] THEN
10635       ASM_MESON_TAC[NORM_SUB; REAL_LT_IMP_LE]];
10636     ALL_TAC] THEN
10637   SUBGOAL_THEN
10638    `!a b. segment[a,b] SUBSET u
10639           ==> (\w. path_integral (linepath (a,b)) (\z. d z w))
10640               path_integrable_on g`
10641   ASSUME_TAC THENL
10642    [REPEAT STRIP_TAC THEN REWRITE_TAC[PATH_INTEGRABLE_ON] THEN
10643     MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
10644     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC THENL
10645      [SUBGOAL_THEN
10646        `((\w. path_integral (linepath(a,b)) (\z. d z w)) o (g:real^1->complex))
10647         continuous_on interval[vec 0,vec 1]`
10648       MP_TAC THENL
10649        [MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
10650         ASM_SIMP_TAC[GSYM path; VALID_PATH_IMP_PATH] THEN
10651         MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
10652         EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[GSYM path_image];
10653         REWRITE_TAC[o_DEF]];
10654       FIRST_ASSUM(fun th -> REWRITE_TAC
10655        [MATCH_MP HAS_VECTOR_DERIVATIVE_UNIQUE_AT (SPEC_ALL th)]) THEN
10656       ASM_SIMP_TAC[ETA_AX; GSYM path; VALID_PATH_IMP_PATH;
10657                    VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION]];
10658     ALL_TAC] THEN
10659   SUBGOAL_THEN
10660    `!a b. segment[a,b] SUBSET u
10661           ==> path_integral (linepath(a,b)) h =
10662               path_integral g (\w. path_integral (linepath (a,b)) (\z. d z w))`
10663   ASSUME_TAC THENL
10664    [ALL_TAC;
10665     MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`; `c:complex`] THEN
10666     DISCH_TAC THEN
10667     SUBGOAL_THEN
10668      `segment[a:complex,b] SUBSET u /\
10669       segment[b,c] SUBSET u /\ segment[c,a] SUBSET u`
10670     STRIP_ASSUME_TAC THENL
10671      [ASM_MESON_TAC[SEGMENTS_SUBSET_CONVEX_HULL; SUBSET_TRANS]; ALL_TAC] THEN
10672     ASM_SIMP_TAC[] THEN
10673     ASM_SIMP_TAC[GSYM PATH_INTEGRAL_ADD; PATH_INTEGRABLE_ADD] THEN
10674     MATCH_MP_TAC PATH_INTEGRAL_EQ_0 THEN
10675     X_GEN_TAC `w:complex` THEN REWRITE_TAC[] THEN DISCH_TAC THEN
10676     SUBGOAL_THEN `(w:complex) IN u` ASSUME_TAC THENL
10677      [ASM SET_TAC[]; ALL_TAC] THEN
10678     ASM_SIMP_TAC[GSYM PATH_INTEGRAL_JOIN; VALID_PATH_LINEPATH;
10679      VALID_PATH_JOIN; PATHSTART_JOIN;
10680      PATH_INTEGRABLE_JOIN; PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
10681     MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10682     MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE THEN
10683     MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `u:complex->bool` THEN
10684     ASM_SIMP_TAC[] THEN ASM SET_TAC[]] THEN
10685   MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`] THEN DISCH_TAC THEN
10686   MATCH_MP_TAC EQ_TRANS THEN
10687   EXISTS_TAC `path_integral (linepath(a,b)) (\z. path_integral g (d z))` THEN
10688   CONJ_TAC THENL
10689    [MATCH_MP_TAC PATH_INTEGRAL_EQ THEN
10690     REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
10691     REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
10692     MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10693     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[SUBSET];
10694     MATCH_MP_TAC(REWRITE_RULE[PCROSS] PATH_INTEGRAL_SWAP) THEN
10695     REWRITE_TAC[VALID_PATH_LINEPATH; VECTOR_DERIVATIVE_LINEPATH_AT;
10696                 CONTINUOUS_ON_CONST] THEN
10697     FIRST_ASSUM(fun th -> REWRITE_TAC
10698      [MATCH_MP HAS_VECTOR_DERIVATIVE_UNIQUE_AT (SPEC_ALL th)]) THEN
10699     ASM_SIMP_TAC[ETA_AX; CONTINUOUS_VECTOR_POLYNOMIAL_FUNCTION;
10700                  CONTINUOUS_AT_IMP_CONTINUOUS_ON] THEN
10701     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10702         CONTINUOUS_ON_SUBSET)) THEN
10703     REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_ELIM_PASTECART_THM] THEN
10704     REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN ASM SET_TAC[]]);;
10705
10706 let CAUCHY_THEOREM_GLOBAL = prove
10707  (`!f s g.
10708         open s /\ f holomorphic_on s /\
10709         valid_path g /\ pathfinish g = pathstart g /\ path_image g SUBSET s /\
10710         (!z. ~(z IN s) ==> winding_number(g,z) = Cx(&0))
10711         ==> (f has_path_integral Cx(&0)) g`,
10712   REPEAT STRIP_TAC THEN
10713   SUBGOAL_THEN `?z:complex. z IN s /\ ~(z IN path_image g)`
10714   STRIP_ASSUME_TAC THENL
10715    [MATCH_MP_TAC(SET_RULE
10716      `t SUBSET s /\ ~(t = s) ==> ?z. z IN s /\ ~(z IN t)`) THEN
10717     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(MESON
10718      [CLOPEN; COMPACT_EQ_BOUNDED_CLOSED; NOT_BOUNDED_UNIV]
10719      `open s /\ compact t /\ ~(t = {}) ==> ~(t = s)`) THEN
10720     ASM_SIMP_TAC[COMPACT_PATH_IMAGE; PATH_IMAGE_NONEMPTY; VALID_PATH_IMP_PATH];
10721     MP_TAC(ISPECL [`\w:complex. (w - z) * f(w)`; `s:complex->bool`;
10722                    `g:real^1->complex`; `z:complex`]
10723       CAUCHY_INTEGRAL_FORMULA_GLOBAL) THEN
10724     ASM_SIMP_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_LZERO; COMPLEX_MUL_RZERO;
10725                  HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_SUB;
10726                  HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST] THEN
10727     ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
10728     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_EQ) THEN
10729     X_GEN_TAC `w:complex` THEN ASM_CASES_TAC `w:complex = z` THEN
10730     ASM_SIMP_TAC[COMPLEX_FIELD
10731      `~(w:complex = z) ==> ((w - z) * f) / (w - z) = f`]]);;
10732
10733 let CAUCHY_THEOREM_GLOBAL_OUTSIDE = prove
10734  (`!f s g.
10735         open s /\ f holomorphic_on s /\
10736         valid_path g /\ pathfinish g = pathstart g /\
10737         (!z. ~(z IN s) ==> z IN outside(path_image g))
10738         ==> (f has_path_integral Cx(&0)) g`,
10739   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_GLOBAL THEN
10740   EXISTS_TAC `s:complex->bool` THEN
10741   ASM_SIMP_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE; VALID_PATH_IMP_PATH] THEN
10742   MP_TAC(ISPEC `path_image(g:real^1->complex)` OUTSIDE_NO_OVERLAP) THEN
10743   ASM SET_TAC[]);;
10744
10745 (* ------------------------------------------------------------------------- *)
10746 (* First Cartan Theorem.                                                     *)
10747 (* ------------------------------------------------------------------------- *)
10748
10749 let HIGHER_COMPLEX_DERIVATIVE_COMP_LEMMA = prove
10750  (`!f g z s t n i.
10751      open s /\ f holomorphic_on s /\ z IN s /\
10752      open t /\ g holomorphic_on t /\ (!w. w IN s ==> f w IN t) /\
10753      complex_derivative f z = Cx(&1) /\
10754      (!i. 1 < i /\ i <= n ==> higher_complex_derivative i f z = Cx(&0)) /\
10755      i <= n
10756      ==> higher_complex_derivative i (g o f) z =
10757          higher_complex_derivative i g (f z)`,
10758   REPEAT GEN_TAC  THEN
10759   SUBGOAL_THEN
10760    `open s /\ f holomorphic_on s /\ z IN s /\ open t /\
10761       (!w. w IN s ==> f w IN t) /\
10762       complex_derivative f z = Cx(&1) /\
10763       (!i. 1 < i /\ i <= n ==> higher_complex_derivative i f z = Cx(&0))
10764       ==> !i g. g holomorphic_on t /\ i <= n
10765           ==> higher_complex_derivative i (g o f) z =
10766               higher_complex_derivative i g (f z)`
10767     (fun th -> MESON_TAC [th])  THEN
10768   STRIP_TAC  THEN
10769   INDUCT_TAC THEN
10770   REWRITE_TAC [LE_SUC_LT; higher_complex_derivative_alt; o_THM]  THEN
10771   REPEAT STRIP_TAC  THEN
10772   EQ_TRANS_TAC `higher_complex_derivative i
10773              (\w. complex_derivative g (f w) * complex_derivative f w) z` THENL
10774    [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN  THEN
10775     EXISTS_TAC `s:complex->bool`  THEN
10776     ASM_REWRITE_TAC []  THEN
10777     REPEAT CONJ_TAC THENL
10778      [MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10779       ASM_REWRITE_TAC []  THEN
10780       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10781       EXISTS_TAC `t:complex->bool`  THEN
10782       ASM_SIMP_TAC [];
10783       MATCH_MP_TAC HOLOMORPHIC_ON_MUL  THEN
10784       CONJ_TAC THENL
10785        [REWRITE_TAC [GSYM o_DEF]  THEN
10786         MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10787         EXISTS_TAC `t:complex->bool`  THEN
10788         ASM_REWRITE_TAC []  THEN
10789         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10790         ASM_REWRITE_TAC [];
10791         ASM_REWRITE_TAC [ETA_AX]  THEN
10792         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10793         ASM_REWRITE_TAC []];
10794       REPEAT STRIP_TAC  THEN
10795       MATCH_MP_TAC COMPLEX_DERIVATIVE_CHAIN  THEN
10796       ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]];
10797     EQ_TRANS_TAC
10798      `vsum (0..i)
10799         (\j. Cx(&(binom (i,j))) *
10800              higher_complex_derivative j (\w. complex_derivative g (f w)) z *
10801              higher_complex_derivative (i - j) (complex_derivative f) z)` THENL
10802      [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_MUL  THEN
10803       EXISTS_TAC `s:complex->bool`  THEN
10804       ASM_REWRITE_TAC []  THEN
10805       ASM_SIMP_TAC [HOLOMORPHIC_COMPLEX_DERIVATIVE]  THEN
10806       REWRITE_TAC [GSYM o_DEF]  THEN
10807       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10808       EXISTS_TAC `t:complex->bool`  THEN
10809       ASM_REWRITE_TAC []  THEN
10810       ASM_SIMP_TAC [HOLOMORPHIC_COMPLEX_DERIVATIVE];
10811       REWRITE_TAC [GSYM higher_complex_derivative_alt]  THEN
10812       EQ_TRANS_TAC
10813         `vsum (i..i)
10814            (\j. Cx(&(binom (i,j))) *
10815                 higher_complex_derivative j
10816                   (\w. complex_derivative g (f w)) z *
10817                 higher_complex_derivative (SUC (i - j)) f z)` THENL
10818        [MATCH_MP_TAC VSUM_SUPERSET  THEN
10819         REWRITE_TAC[SUBSET_NUMSEG; LT_REFL; LE_0;
10820                     LE_REFL; IN_NUMSEG_0; NUMSEG_SING; IN_SING]  THEN
10821         X_GEN_TAC `j:num`  THEN
10822         REWRITE_TAC [ARITH_RULE `j:num <= i /\ ~(j = i) <=> j < i`]  THEN
10823         DISCH_TAC  THEN
10824         ASSERT_TAC `1 < SUC (i - j) /\ SUC (i - j) <= n`  THENL
10825          [ASM_SIMP_TAC [ARITH_RULE
10826            `i < n /\ j < i ==> 1 < SUC (i - j) /\ SUC (i - j) <= n`]  THEN
10827           MATCH_MP_TAC (ARITH_RULE `i < n /\ j < i ==> 1 < SUC (i - j)`)  THEN
10828           ASM_REWRITE_TAC [];
10829           ASM_SIMP_TAC [COMPLEX_MUL_RZERO; COMPLEX_VEC_0]];
10830         REWRITE_TAC [NUMSEG_SING; VSUM_SING; BINOM_REFL; SUB_REFL]  THEN
10831         ASM_REWRITE_TAC [COMPLEX_MUL_LID; COMPLEX_MUL_RID;
10832                          higher_complex_derivative]  THEN
10833         ASM_REWRITE_TAC [GSYM o_DEF]  THEN
10834         REWRITE_TAC [GSYM higher_complex_derivative;
10835                      higher_complex_derivative_alt]  THEN
10836         FIRST_X_ASSUM MATCH_MP_TAC  THEN
10837         ASM_SIMP_TAC [ARITH_RULE `i:num < n ==> i <= n`]  THEN
10838         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10839         ASM_REWRITE_TAC []]]]);;
10840
10841 let HIGHER_COMPLEX_DERIVATIVE_COMP_ITER_LEMMA = prove
10842  (`!f s z n m i.
10843      open s /\ f holomorphic_on s /\ (!w. w IN s ==> f w IN s) /\
10844      z IN s /\ f z = z /\ complex_derivative f z = Cx(&1) /\
10845      (!i. 1 < i /\ i <= n ==> higher_complex_derivative i f z = Cx(&0)) /\
10846      i <= n
10847      ==> higher_complex_derivative i (ITER m f) z =
10848          higher_complex_derivative i f z`,
10849   GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN GEN_TAC  THEN
10850   REWRITE_TAC [RIGHT_FORALL_IMP_THM; IMP_CONJ]  THEN
10851   REWRITE_TAC [IMP_IMP]  THEN
10852   STRIP_TAC  THEN
10853   ASSERT_TAC `!m. ITER m f z = z:complex`  THENL
10854    [INDUCT_TAC THEN ASM_REWRITE_TAC [ITER]; ALL_TAC] THEN
10855   ASSERT_TAC `!m (w:complex). w IN s ==> ITER m f w IN s`  THENL
10856    [INDUCT_TAC THEN ASM_SIMP_TAC [ITER]; ALL_TAC] THEN
10857   ASSERT_TAC `!m. ITER m f holomorphic_on s`  THENL
10858    [INDUCT_TAC THEN REWRITE_TAC [ITER_POINTLESS] THENL
10859      [ASM_SIMP_TAC [I_DEF; HOLOMORPHIC_ON_ID];
10860       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10861       EXISTS_TAC `s:complex ->bool`  THEN
10862       ASM_REWRITE_TAC []];
10863     ALL_TAC] THEN
10864   INDUCT_TAC  THENL
10865    [REWRITE_TAC [ITER_POINTLESS; I_DEF; HIGHER_COMPLEX_DERIVATIVE_ID]  THEN
10866     REPEAT STRIP_TAC THEN COND_CASES_TAC THENL
10867      [ASM_REWRITE_TAC [higher_complex_derivative]; ALL_TAC] THEN
10868     REPEAT STRIP_TAC THEN COND_CASES_TAC THENL
10869      [ASM_REWRITE_TAC [higher_complex_derivative; ONE]; ALL_TAC] THEN
10870     MATCH_MP_TAC EQ_SYM  THEN
10871     FIRST_X_ASSUM MATCH_MP_TAC  THEN
10872     ASM_SIMP_TAC [ARITH_RULE `~(i = 0) /\ ~(i = 1) ==> 1 < i`];
10873     GEN_TAC THEN DISCH_TAC  THEN
10874     REWRITE_TAC [ITER_ALT_POINTLESS]  THEN
10875     EQ_TRANS_TAC `higher_complex_derivative i (ITER m f) (f z)`  THENL
10876      [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_LEMMA  THEN
10877       EXISTS_TAC `s:complex ->bool`  THEN
10878       EXISTS_TAC `s:complex ->bool`  THEN
10879       EXISTS_TAC `n:num`  THEN
10880       ASM_REWRITE_TAC [];
10881       ASM_REWRITE_TAC []  THEN
10882       FIRST_X_ASSUM MATCH_MP_TAC  THEN
10883       ASM_REWRITE_TAC []]]);;
10884
10885 let HIGHER_COMPLEX_DERIVATIVE_ITER_TOP_LEMMA = prove
10886  (`!f s z n m.
10887      open s /\ f holomorphic_on s /\ (!w. w IN s ==> f w IN s) /\
10888      z IN s /\ f z = z /\ complex_derivative f z = Cx(&1) /\
10889      (!i. 1 < i /\ i < n ==> higher_complex_derivative i f z = Cx(&0)) /\
10890      1 < n
10891      ==> higher_complex_derivative n (ITER m f) z =
10892          Cx(&m) * higher_complex_derivative n f z`,
10893   GEN_TAC THEN GEN_TAC THEN GEN_TAC  THEN
10894   INDUCT_TAC THEN REWRITE_TAC [LT_SUC_LE] THEN REWRITE_TAC [LT]  THEN
10895   REWRITE_TAC [RIGHT_FORALL_IMP_THM]  THEN
10896   STRIP_TAC  THEN
10897   ASSERT_TAC `!m. ITER m f z = z:complex`  THENL
10898    [INDUCT_TAC THEN ASM_REWRITE_TAC [ITER]; ALL_TAC] THEN
10899   ASSERT_TAC `!m (w:complex). w IN s ==> ITER m f w IN s`  THENL
10900    [INDUCT_TAC THEN ASM_SIMP_TAC [ITER]; ALL_TAC] THEN
10901   ASSERT_TAC `!m. ITER m f holomorphic_on s`  THENL
10902    [INDUCT_TAC THEN REWRITE_TAC [ITER_POINTLESS]  THEN
10903     ASM_SIMP_TAC [I_DEF; HOLOMORPHIC_ON_ID]  THEN
10904     MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10905     EXISTS_TAC `s:complex ->bool`  THEN
10906     ASM_REWRITE_TAC [];
10907     ALL_TAC] THEN
10908   ASSERT_TAC `!w. w IN s ==> f complex_differentiable at w`  THENL
10909    [ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]; ALL_TAC] THEN
10910   ASSERT_TAC `!m w. w IN s ==> ITER m f complex_differentiable at w`  THENL
10911    [ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]; ALL_TAC] THEN
10912   ASSERT_TAC `!m. complex_derivative (ITER m f) z = Cx(&1)`  THENL
10913    [INDUCT_TAC THEN ASM_REWRITE_TAC [ITER_POINTLESS]  THENL
10914      [REWRITE_TAC [I_DEF; COMPLEX_DERIVATIVE_ID]; ALL_TAC] THEN
10915     ASM_SIMP_TAC [COMPLEX_DERIVATIVE_CHAIN;
10916                   HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]  THEN
10917     REWRITE_TAC [COMPLEX_MUL_LID];
10918     ALL_TAC] THEN
10919   INDUCT_TAC THEN
10920   REWRITE_TAC [higher_complex_derivative_alt; ITER_POINTLESS]  THENL
10921    [ASM_REWRITE_TAC [COMPLEX_MUL_LZERO; I_DEF; COMPLEX_DERIVATIVE_ID;
10922                      HIGHER_COMPLEX_DERIVATIVE_CONST;
10923                      ARITH_RULE `n = 0 <=> ~(1 <= n)`];
10924     ALL_TAC] THEN
10925   EQ_TRANS_TAC `higher_complex_derivative n
10926              (\w. complex_derivative f (ITER m f w) *
10927                   complex_derivative (ITER m f) w) z`  THENL
10928    [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN  THEN
10929     EXISTS_TAC `s:complex->bool`  THEN
10930     ASM_REWRITE_TAC[] THEN CONJ_TAC  THENL
10931      [REWRITE_TAC [o_DEF]  THEN
10932       MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10933       ASM_REWRITE_TAC []  THEN
10934       ONCE_REWRITE_TAC [GSYM o_DEF]  THEN
10935       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10936       EXISTS_TAC `s:complex->bool`  THEN
10937       ASM_REWRITE_TAC [ETA_AX];
10938       ALL_TAC] THEN
10939     CONJ_TAC  THENL
10940      [MATCH_MP_TAC HOLOMORPHIC_ON_MUL  THEN CONJ_TAC  THENL
10941        [ONCE_REWRITE_TAC [GSYM o_DEF]  THEN
10942         MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10943         EXISTS_TAC `s:complex->bool`  THEN
10944         ASM_REWRITE_TAC[ETA_AX]  THEN
10945         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10946         ASM_REWRITE_TAC[];
10947         ONCE_REWRITE_TAC [GSYM o_DEF]  THEN
10948         MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10949         EXISTS_TAC `s:complex->bool`  THEN
10950         ASM_REWRITE_TAC[HOLOMORPHIC_ON_ID]  THEN
10951         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10952         ASM_REWRITE_TAC[]];
10953       GEN_TAC THEN DISCH_TAC  THEN
10954       MATCH_MP_TAC COMPLEX_DERIVATIVE_CHAIN  THEN
10955       CONJ_TAC  THENL
10956        [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT  THEN
10957         ASM_MESON_TAC [];
10958         MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT  THEN
10959         ASM_MESON_TAC []]];
10960     ALL_TAC] THEN
10961   EQ_TRANS_TAC
10962    `vsum (0..n)
10963       (\i. Cx(&(binom (n,i))) *
10964            higher_complex_derivative i
10965              (\w. complex_derivative f (ITER m f w)) z *
10966            higher_complex_derivative (n - i)
10967              (complex_derivative (ITER m f)) z)`  THENL
10968    [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_MUL  THEN
10969     EXISTS_TAC `s:complex->bool`  THEN
10970     ASM_REWRITE_TAC[]  THEN CONJ_TAC  THENL
10971      [ONCE_REWRITE_TAC [GSYM o_DEF]  THEN
10972       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10973       EXISTS_TAC `s:complex->bool`  THEN
10974       ASM_REWRITE_TAC[ETA_AX]  THEN
10975       MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10976       ASM_REWRITE_TAC[];
10977       MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10978       ASM_REWRITE_TAC[]];
10979     ALL_TAC] THEN
10980   EQ_TRANS_TAC
10981    `vsum {0,n}
10982       (\i. Cx(&(binom (n,i))) *
10983            higher_complex_derivative i
10984              (\w. complex_derivative f (ITER m f w)) z *
10985            higher_complex_derivative (n - i)
10986              (complex_derivative (ITER m f)) z)`  THENL
10987    [MATCH_MP_TAC VSUM_SUPERSET  THEN
10988     REWRITE_TAC [INSERT_SUBSET; EMPTY_SUBSET; IN_NUMSEG_0; LE_0; LE_REFL;
10989                  IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM]  THEN
10990     X_GEN_TAC `i:num`  THEN
10991     STRIP_TAC  THEN
10992     REWRITE_TAC [GSYM higher_complex_derivative_alt]  THEN
10993     ASSERT_TAC `1 < SUC (n-i) /\ SUC (n-i) <= n`  THENL
10994      [ASM_SIMP_TAC [ARITH_RULE `i <= n /\ ~(i=0) /\ ~(i=n)
10995                                 ==> 1 < SUC (n-i) /\ SUC (n-i) <= n`];
10996       ALL_TAC] THEN
10997     ASM_SIMP_TAC []  THEN
10998     SUBGOAL_THEN
10999       `higher_complex_derivative (SUC (n - i)) (ITER m f) z = Cx(&0)`
11000       SUBST1_TAC  THENL
11001      [EQ_TRANS_TAC `higher_complex_derivative (SUC (n - i)) f z`  THENL
11002        [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_ITER_LEMMA  THEN
11003         EXISTS_TAC `s:complex->bool`  THEN
11004         ASM_REWRITE_TAC []  THEN
11005         EXISTS_TAC `n:num`  THEN
11006         ASM_REWRITE_TAC [];
11007         FIRST_X_ASSUM MATCH_MP_TAC  THEN
11008         ASM_REWRITE_TAC []];
11009       ASM_REWRITE_TAC [COMPLEX_MUL_RZERO; COMPLEX_VEC_0]];
11010     ALL_TAC] THEN
11011   SIMP_TAC [VSUM_CLAUSES; FINITE_RULES; IN_INSERT; NOT_IN_EMPTY]  THEN
11012   REWRITE_TAC [binom; BINOM_REFL; COMPLEX_MUL_LID;
11013                SUB_REFL; SUB; higher_complex_derivative]  THEN
11014   ASM_CASES_TAC `n = 0` THEN ASM_REWRITE_TAC []  THENL
11015    [REWRITE_TAC [higher_complex_derivative]  THEN
11016     POP_ASSUM SUBST_ALL_TAC  THEN
11017     RULE_ASSUM_TAC (REWRITE_RULE [higher_complex_derivative])  THEN
11018     ASM_REWRITE_TAC [COMPLEX_MUL_RID; COMPLEX_MUL_LID;
11019                      COMPLEX_VEC_0; COMPLEX_ADD_RID]  THEN
11020     ASM_MESON_TAC [ARITH_RULE `~(1 <= 0)`];
11021     ALL_TAC] THEN
11022   ASM_REWRITE_TAC [COMPLEX_MUL_LID; COMPLEX_VEC_0; COMPLEX_ADD_RID]  THEN
11023   ASM_REWRITE_TAC [COMPLEX_MUL_RID]  THEN
11024   ASM_REWRITE_TAC [GSYM higher_complex_derivative_alt]  THEN
11025   SUBGOAL_THEN
11026     `(\w. complex_derivative f (ITER m f w)) = complex_derivative f o ITER m f`
11027     SUBST1_TAC
11028   THENL [REWRITE_TAC [FUN_EQ_THM; o_THM]; ALL_TAC] THEN
11029   SUBGOAL_THEN
11030     `higher_complex_derivative n (complex_derivative f o ITER m f) z =
11031      higher_complex_derivative n (complex_derivative f) (ITER m f z)`
11032   SUBST1_TAC  THENL
11033    [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_LEMMA  THEN
11034     EXISTS_TAC `s:complex->bool`  THEN
11035     EXISTS_TAC `s:complex->bool`  THEN
11036     EXISTS_TAC `n:num`  THEN
11037     ASM_REWRITE_TAC[]  THEN
11038     ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; LE_REFL]  THEN
11039     REPEAT STRIP_TAC  THEN
11040     EQ_TRANS_TAC `higher_complex_derivative i f z`  THENL
11041      [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_ITER_LEMMA  THEN
11042       EXISTS_TAC `s:complex->bool`  THEN
11043       EXISTS_TAC `n:num`  THEN
11044       ASM_REWRITE_TAC[];
11045       ASM_SIMP_TAC[]];
11046     ALL_TAC] THEN
11047   ASSERT_TAC `Cx(&(SUC m)) = Cx(&m) +  Cx(&1)`  THENL
11048    [REWRITE_TAC [GSYM CX_ADD; REAL_OF_NUM_ADD; ONE; ADD_SUC; ADD_0];
11049     ASM_REWRITE_TAC[COMPLEX_POLY_CLAUSES;
11050                     GSYM higher_complex_derivative_alt]]);;
11051
11052 let CAUCHY_HIGHER_COMPLEX_DERIVATIVE_BOUND = prove
11053  (`!f z y r B0 n.
11054      &0 < r /\ 0 < n /\
11055      f holomorphic_on ball(z,r) /\
11056      f continuous_on cball(z,r) /\
11057      (!w. w IN ball(z,r) ==> f w IN ball(y,B0))
11058      ==> norm (higher_complex_derivative n f z) <= &(FACT n) * B0 / r pow n`,
11059   REPEAT STRIP_TAC  THEN
11060   SUBGOAL_THEN `higher_complex_derivative n f z =
11061                 higher_complex_derivative n (\w. f w - y) z`
11062   SUBST1_TAC  THENL
11063    [EQ_TRANS_TAC `higher_complex_derivative n (\w. f w) z -
11064              higher_complex_derivative n (\w. y) z`  THENL
11065      [ASM_SIMP_TAC
11066        [HIGHER_COMPLEX_DERIVATIVE_CONST; ARITH_RULE `0<n ==> ~(n=0)`]  THEN
11067       REWRITE_TAC [COMPLEX_SUB_RZERO; ETA_AX];
11068       MATCH_MP_TAC EQ_SYM  THEN
11069       REWRITE_TAC [ETA_AX]  THEN
11070       MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_SUB  THEN
11071       EXISTS_TAC `ball(z:complex,r)`  THEN
11072       ASM_SIMP_TAC [OPEN_BALL; HOLOMORPHIC_ON_CONST; CENTRE_IN_BALL]];
11073     ALL_TAC] THEN
11074   SUBGOAL_THEN
11075    `norm ((Cx(&2) * Cx pi * ii) / Cx(&(FACT n))
11076           * higher_complex_derivative n (\w. f w - y) z)
11077     <= (B0 / r pow (n + 1)) * &2 * pi * r`
11078   MP_TAC THENL
11079    [MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH  THEN
11080     EXISTS_TAC `(\u. (f u - y) / (u - z) pow (n + 1))`  THEN
11081     EXISTS_TAC `z:complex`  THEN STRIP_TAC  THENL
11082      [MATCH_MP_TAC CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH  THEN
11083       ASM_SIMP_TAC[CENTRE_IN_BALL]  THEN CONJ_TAC  THENL
11084        [MATCH_MP_TAC CONTINUOUS_ON_SUB  THEN
11085         ASM_REWRITE_TAC [CONTINUOUS_ON_CONST];
11086         MATCH_MP_TAC HOLOMORPHIC_ON_SUB  THEN
11087         ASM_REWRITE_TAC [HOLOMORPHIC_ON_CONST]];
11088       ALL_TAC] THEN
11089     ASM_SIMP_TAC[]  THEN STRIP_TAC  THENL
11090      [MATCH_MP_TAC REAL_LE_DIV  THEN STRIP_TAC  THENL
11091        [MATCH_MP_TAC REAL_LT_IMP_LE  THEN
11092         MATCH_MP_TAC
11093          (prove(`(?x. &0 <= x /\ x < B0) ==> &0 < B0`, REAL_ARITH_TAC))  THEN
11094         EXISTS_TAC `norm ((\u. (f:complex->complex) u - y) z)`  THEN
11095         SIMP_TAC[NORM_POS_LE]  THEN
11096         SUBGOAL_THEN
11097          `!w:complex. f w IN ball(y,B0) ==> norm (f w - y) < B0`
11098         MATCH_MP_TAC  THENL
11099          [ASM_MESON_TAC [dist; DIST_SYM; IN_BALL; CENTRE_IN_BALL];
11100           ALL_TAC] THEN
11101         FIRST_ASSUM MATCH_MP_TAC  THEN
11102         ASM_SIMP_TAC[CENTRE_IN_BALL];
11103         MATCH_MP_TAC(SPECL [`r:real`;`n + 1`] REAL_POW_LE)  THEN
11104         ASM_SIMP_TAC[REAL_LT_IMP_LE]];
11105       REPEAT STRIP_TAC  THEN
11106       ASM_REWRITE_TAC[COMPLEX_NORM_DIV;COMPLEX_NORM_POW]  THEN
11107       ASM_SIMP_TAC [REAL_LE_DIV2_EQ; REAL_POW_LT]  THEN
11108       ONCE_REWRITE_TAC[MESON[] `!(f:complex->complex).
11109         (f x - y) = (\w. f w - y) x`]  THEN
11110       MATCH_MP_TAC CONTINUOUS_ON_CLOSURE_NORM_LE  THEN
11111       EXISTS_TAC `ball(z:complex,r)`  THEN
11112       ASM_SIMP_TAC[CLOSURE_BALL]  THEN
11113       REPEAT STRIP_TAC  THENL
11114        [MATCH_MP_TAC CONTINUOUS_ON_SUB  THEN
11115         ASM_SIMP_TAC[CONTINUOUS_ON_CONST];
11116         SUBGOAL_THEN
11117         `!w:complex. f w IN ball(y,B0) ==> norm (f w - y) <= B0`
11118         MATCH_MP_TAC  THENL
11119          [REWRITE_TAC[GSYM dist;IN_BALL;DIST_SYM;REAL_LT_IMP_LE];
11120           ASM_MESON_TAC [dist; DIST_SYM; IN_BALL; CENTRE_IN_BALL]];
11121         ASM_REWRITE_TAC[cball;IN_ELIM_THM;dist;DIST_SYM]  THEN
11122         ASM_SIMP_TAC[REAL_EQ_IMP_LE]]];
11123       ALL_TAC] THEN
11124   REWRITE_TAC [COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_II;
11125                COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_ABS_PI;
11126                REAL_MUL_RID]  THEN
11127   STRIP_TAC  THEN
11128   ABBREV_TAC `a = (&2 * pi) / &(FACT n)`  THEN
11129   SUBGOAL_THEN `&0 < a` ASSUME_TAC  THENL
11130    [EXPAND_TAC "a"  THEN
11131     SIMP_TAC[REAL_LT_DIV; REAL_LT_MUL; REAL_OF_NUM_LT; FACT_LT; ARITH; PI_POS];
11132     ALL_TAC] THEN
11133   SUBGOAL_THEN
11134   `B0 / r pow (n + 1) * &2 * pi * r = a * (&(FACT n) * B0 / r pow n)`
11135   SUBST_ALL_TAC  THENL
11136    [EXPAND_TAC "a"  THEN
11137     REWRITE_TAC [GSYM ADD1; real_pow] THEN
11138     SUBGOAL_THEN `~(&(FACT n) = &0) /\ &0 < r` MP_TAC  THENL
11139      [ASM_REWRITE_TAC[FACT_NZ; REAL_OF_NUM_EQ];
11140       CONV_TAC REAL_FIELD];
11141    ASM_MESON_TAC [REAL_LE_LCANCEL_IMP]]);;
11142
11143 let FIRST_CARTAN_THM_DIM_1 = prove
11144   (`!f s z w.
11145       open s /\ connected s /\ bounded s /\
11146       (!w. w IN s ==> f w IN s) /\ f holomorphic_on s /\
11147       z IN s /\ f z = z /\
11148       complex_derivative f z = Cx(&1) /\ w IN s
11149       ==> f w = w`,
11150    REWRITE_TAC [RIGHT_FORALL_IMP_THM; IMP_CONJ] THEN REPEAT GEN_TAC THEN
11151    REPEAT DISCH_TAC THEN REPEAT STRIP_TAC THEN EQ_TRANS_TAC `I w:complex` THENL
11152    [MATCH_MP_TAC HOLOMORPHIC_FUN_EQ_ON_CONNECTED;
11153     REWRITE_TAC [I_THM]] THEN
11154    EXISTS_TAC `z:complex` THEN EXISTS_TAC `s:complex->bool` THEN
11155    ASM_REWRITE_TAC [I_DEF; HOLOMORPHIC_ON_ID] THEN
11156    GEN_TAC THEN STRIP_ASSUME_TAC (ARITH_RULE `n = 0 \/ n = 1 \/ 1 < n`) THENL
11157    [ASM_REWRITE_TAC [higher_complex_derivative];
11158     ASM_REWRITE_TAC [ONE; higher_complex_derivative; COMPLEX_DERIVATIVE_ID];
11159     ASM_REWRITE_TAC [HIGHER_COMPLEX_DERIVATIVE_ID]] THEN
11160    ASM_SIMP_TAC [ARITH_RULE `1 < n ==> ~(n=0) /\ ~(n=1)`] THEN
11161    POP_ASSUM MP_TAC THEN SPEC_TAC (`n:num`,`n:num`) THEN
11162    MATCH_MP_TAC num_WF THEN REPEAT STRIP_TAC THEN
11163    REWRITE_TAC [GSYM COMPLEX_NORM_ZERO] THEN
11164    MATCH_MP_TAC REAL_ARCH_RDIV_EQ_0 THEN REWRITE_TAC [NORM_POS_LE] THEN
11165    ASSERT_TAC `?c. s SUBSET ball(z:complex,c)` THENL
11166    [ASSERT_TAC `?c. !w:complex. w IN s ==> norm w <= c` THENL
11167     [ASM_REWRITE_TAC[GSYM bounded];
11168      EXISTS_TAC `&2 * c + &1` THEN REWRITE_TAC [SUBSET] THEN GEN_TAC THEN
11169      DISCH_TAC THEN
11170      SUBGOAL_THEN `norm (x:complex) <= c /\ norm (z:complex) <= c` MP_TAC THENL
11171      [ASM_MESON_TAC[]; REWRITE_TAC [IN_BALL] THEN NORM_ARITH_TAC]];
11172     ALL_TAC] THEN
11173    ASSERT_TAC `?r. &0 < r /\ cball(z:complex,r) SUBSET s` THENL
11174    [ASM_MESON_TAC [OPEN_CONTAINS_CBALL];
11175     EXISTS_TAC `&(FACT n) * c / r pow n`] THEN
11176    ASSERT_TAC `&0 < c` THENL
11177    [SUBGOAL_THEN `~(ball(z:complex,c) = {})` MP_TAC THENL
11178     [ASM SET_TAC[]; ASM_REWRITE_TAC [BALL_EQ_EMPTY; REAL_NOT_LE]];
11179     ALL_TAC] THEN
11180    ASSERT_TAC `ball(z:complex,r) SUBSET s` THENL
11181    [ASM_MESON_TAC [SUBSET_TRANS; BALL_SUBSET_CBALL]; ALL_TAC] THEN
11182    CONJ_TAC THENL
11183    [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL
11184     [MATCH_MP_TAC REAL_LT_IMP_LE THEN MATCH_MP_TAC REAL_LTE_TRANS THEN
11185      EXISTS_TAC `&1` THEN REWRITE_TAC [REAL_LT_01; FACT_LE; REAL_OF_NUM_LE];
11186      MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC [REAL_LT_IMP_LE; REAL_POW_LE]];
11187     ALL_TAC] THEN
11188    REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC [GSYM COMPLEX_NORM_NUM] THEN
11189    REWRITE_TAC [GSYM COMPLEX_NORM_MUL] THEN SUBGOAL_THEN
11190       `Cx(&m) * higher_complex_derivative n f z =
11191        higher_complex_derivative n (ITER m f) z`
11192      SUBST1_TAC THENL
11193    [MATCH_MP_TAC (GSYM HIGHER_COMPLEX_DERIVATIVE_ITER_TOP_LEMMA) THEN
11194     EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [];
11195     ALL_TAC] THEN
11196    REWRITE_TAC [COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_POS] THEN
11197    MATCH_MP_TAC CAUCHY_HIGHER_COMPLEX_DERIVATIVE_BOUND THEN
11198    EXISTS_TAC `z:complex` THEN ASM_SIMP_TAC [ARITH_RULE `1<n ==> 0 < n`] THEN
11199    ASSERT_TAC `!m w. w:complex IN s ==> ITER m f w IN s` THENL
11200    [INDUCT_TAC THEN ASM_SIMP_TAC [ITER];
11201     ASSERT_TAC `!m. ITER m f holomorphic_on s` THENL
11202     [INDUCT_TAC THEN REWRITE_TAC [ITER_POINTLESS] THENL
11203      [ASM_SIMP_TAC [I_DEF; HOLOMORPHIC_ON_ID];
11204       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
11205       EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC []];
11206      ASSERT_TAC `ITER m f holomorphic_on ball(z,r)` THENL
11207      [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN ASM SET_TAC [];
11208       ASM_REWRITE_TAC[]] THEN
11209      CONJ_TAC THENL
11210      [ASM_MESON_TAC [CONTINUOUS_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
11211       ASM SET_TAC []]]]);;
11212
11213 (* ------------------------------------------------------------------------- *)
11214 (* Second Cartan Theorem.                                                    *)
11215 (* ------------------------------------------------------------------------- *)
11216
11217 let SECOND_CARTAN_THM_DIM_1 = prove
11218  (`!g f r.
11219      &0 < r /\
11220      g holomorphic_on ball(Cx(&0),r) /\
11221      (!z. z IN ball(Cx(&0),r) ==> g z IN ball(Cx(&0),r)) /\
11222      g(Cx(&0)) = Cx(&0) /\
11223      f holomorphic_on ball(Cx(&0),r) /\
11224      (!z. z IN ball(Cx(&0),r) ==> f z IN ball(Cx(&0),r)) /\
11225      f (Cx(&0)) = Cx(&0) /\
11226      (!z. z IN ball(Cx(&0),r) ==> g (f z) = z) /\
11227      (!z. z IN ball(Cx(&0),r) ==> f (g z) = z)
11228      ==> ?t. !z. z IN ball(Cx(&0),r) ==> g z = cexp(ii * Cx t) * z`,
11229   let COMPLEX_DERIVATIVE_LEFT_INVERSE = prove
11230     (`!s t f g w.
11231        open s /\ open t /\
11232        (!z. z IN s ==> f z IN t) /\ f holomorphic_on s /\
11233        (!z. z IN t ==> g z IN s) /\ g holomorphic_on t /\
11234        (!z. z IN s ==> g (f z) = z) /\ w IN s
11235        ==> complex_derivative f w * complex_derivative g (f w) = Cx(&1)`,
11236      REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC [COMPLEX_MUL_SYM] THEN
11237      SUBGOAL_THEN `complex_derivative g (f w) * complex_derivative f w =
11238                    complex_derivative (g o f) w ` SUBST1_TAC THENL
11239      [ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT;
11240                      COMPLEX_DERIVATIVE_CHAIN];
11241       EQ_TRANS_TAC `complex_derivative (\u. u) w` THENL
11242       [MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
11243        EXISTS_TAC `s:complex->bool` THEN
11244        ASM_SIMP_TAC[HOLOMORPHIC_ON_ID;o_THM] THEN
11245        ASM_MESON_TAC [HOLOMORPHIC_ON_COMPOSE_GEN];
11246        ASM_SIMP_TAC[COMPLEX_DERIVATIVE_ID]]]) in
11247   let LEMMA_1 = prove
11248     (`!s f.
11249         open s /\ connected s /\ f holomorphic_on s /\ Cx(&0) IN s /\
11250         (!u z. norm u = &1 /\ z IN s ==> u * z IN s) /\
11251         (!u z. norm u = &1 /\ z IN s ==> f (u * z) = u * f z)
11252         ==> ?c. !z. z IN s ==> f z = c * z`,
11253      REPEAT STRIP_TAC THEN ABBREV_TAC `c = complex_derivative f (Cx(&0))` THEN
11254      EXISTS_TAC `c : complex` THEN
11255      SUBGOAL_THEN `f(Cx(&0)) = Cx(&0)` ASSUME_TAC THENL
11256      [FIRST_X_ASSUM (MP_TAC o SPECL [`--Cx(&1)`;`Cx(&0)`]) THEN
11257       ASM_REWRITE_TAC [NORM_NEG; COMPLEX_NORM_NUM; COMPLEX_MUL_RZERO] THEN
11258       CONV_TAC COMPLEX_RING; ALL_TAC] THEN
11259      SUBGOAL_THEN
11260        `!n u z.
11261           norm u = &1 /\ z IN s ==>
11262           u pow n * higher_complex_derivative n f (u * z) =
11263        u * higher_complex_derivative n f z`
11264        ASSUME_TAC THENL
11265      [REPEAT STRIP_TAC THEN
11266       EQ_TRANS_TAC `higher_complex_derivative n (\w. f (u * w)) z` THENL
11267       [MATCH_MP_TAC EQ_SYM THEN
11268        MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMPOSE_LINEAR THEN
11269        EXISTS_TAC `s:complex->bool` THEN EXISTS_TAC `s:complex->bool` THEN
11270        ASM_SIMP_TAC[]; ALL_TAC] THEN
11271       EQ_TRANS_TAC `higher_complex_derivative n (\w. u * f w) z` THENL
11272       [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
11273        EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL
11274        [MATCH_MP_TAC
11275          (REWRITE_RULE [o_DEF]
11276            (SPECL [`\w:complex. u*w`; `f:complex->complex`]
11277                HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
11278         EXISTS_TAC `s:complex->bool` THEN
11279         ASM_SIMP_TAC [HOLOMORPHIC_ON_LINEAR];
11280         MATCH_MP_TAC
11281           (REWRITE_RULE [o_DEF]
11282             (SPECL [`f:complex->complex`; `\w:complex. u*w`]
11283                    HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
11284         EXISTS_TAC `(:complex)` THEN
11285         ASM_REWRITE_TAC [HOLOMORPHIC_ON_LINEAR; IN_UNIV]];
11286         POP_ASSUM MP_TAC THEN SPEC_TAC (`z:complex`,`z:complex`) THEN
11287        SPEC_TAC (`n:num`,`n:num`) THEN INDUCT_TAC THEN
11288        REWRITE_TAC [higher_complex_derivative] THEN GEN_TAC THEN
11289        DISCH_TAC THEN EQ_TRANS_TAC
11290          `complex_derivative (\w. u * higher_complex_derivative n f w) z`
11291        THENL
11292        [MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
11293         EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
11294         [MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
11295          ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
11296          ASM_REWRITE_TAC [HOLOMORPHIC_ON_CONST];
11297          MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
11298          ASM_REWRITE_TAC [HOLOMORPHIC_ON_CONST; ETA_AX] THEN
11299          MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
11300          ASM_REWRITE_TAC[]];
11301         MATCH_MP_TAC COMPLEX_DERIVATIVE_LMUL THEN
11302         MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
11303         ASM_MESON_TAC [HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]]];
11304       SUBGOAL_THEN
11305         `!n. 2 <= n ==> higher_complex_derivative n f (Cx(&0)) = Cx(&0)`
11306         ASSUME_TAC THENL
11307       [GEN_TAC THEN  DISCH_TAC THEN SUBGOAL_THEN
11308          `!n z. 2 <= n /\
11309                 (!u. norm u = &1 ==> u pow n * z = u * z) ==> z = Cx(&0)`
11310          MATCH_MP_TAC THENL
11311        [REPEAT STRIP_TAC THEN MATCH_MP_TAC
11312          (COMPLEX_RING
11313            `!u. ~(u pow n' = u) /\ u pow n' * z = u * z ==> z = Cx(&0)`) THEN
11314         SUBGOAL_THEN `2 <= n' ==> ?u. norm u = &1 /\ ~(u pow n' = u)`
11315           (fun th -> ASM_MESON_TAC [th]) THEN
11316         STRUCT_CASES_TAC (SPEC `n':num` num_CASES) THEN
11317         REWRITE_TAC
11318           [ARITH_LE; ARITH_RULE `2 <= SUC n'' <=> 1 <= n''`; complex_pow] THEN
11319         DISCH_TAC THEN MP_TAC (SPEC `n'':num` COMPLEX_NOT_ROOT_UNITY) THEN
11320         ASM_REWRITE_TAC [] THEN STRIP_TAC THEN EXISTS_TAC `u:complex` THEN
11321         ASM_REWRITE_TAC [] THEN POP_ASSUM MP_TAC THEN
11322         REWRITE_TAC [CONTRAPOS_THM] THEN
11323         SUBGOAL_THEN `~(u = Cx(&0))` MP_TAC THENL
11324         [ASM_REWRITE_TAC [GSYM COMPLEX_NORM_ZERO; REAL_OF_NUM_EQ; ARITH_EQ];
11325          CONV_TAC COMPLEX_FIELD];
11326         EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
11327         FIRST_X_ASSUM (MP_TAC o SPECL [`n:num`;`u:complex`;`Cx(&0)`]) THEN
11328         ASM_REWRITE_TAC[COMPLEX_MUL_RZERO]];
11329        REPEAT STRIP_TAC THEN MATCH_MP_TAC
11330         (REWRITE_RULE []
11331           (SPECL [`f:complex->complex`; `\z. c*z`; `Cx(&0)`;
11332                   `s:complex->bool`]
11333              HOLOMORPHIC_FUN_EQ_ON_CONNECTED)) THEN
11334        ASM_REWRITE_TAC [COMPLEX_MUL_RZERO; HOLOMORPHIC_ON_LINEAR;
11335                         HIGHER_COMPLEX_DERIVATIVE_LINEAR] THEN
11336        GEN_TAC THEN FIRST_X_ASSUM (MP_TAC o SPEC `n:num`) THEN
11337        STRUCT_CASES_TAC (ARITH_RULE `n = 0 \/ n = 1 \/ 2 <= n`) THEN
11338        ASM_SIMP_TAC [higher_complex_derivative; ARITH_EQ; ARITH_LE; ONE] THEN
11339        ASM_SIMP_TAC [ARITH_RULE `2 <= n ==> ~(n=0)`] THEN
11340        ASM_SIMP_TAC [ARITH_RULE `2 <= n ==> ~(n=SUC 0)`]]]) in
11341   let LEMMA_2 = prove
11342     (`!r c. &0 < r /\ &0 <= c /\
11343             (!x. &0 <= x /\ x < r ==> c * x < r)
11344             ==> c <= &1`,
11345      REPEAT STRIP_TAC THEN REWRITE_TAC [GSYM REAL_NOT_LT] THEN STRIP_TAC THEN
11346      FIRST_X_ASSUM (MP_TAC o SPEC `r * (c + &1) / (&2 * c)`) THEN
11347      REWRITE_TAC [MESON [] `((a ==> b) ==> F) <=> (a /\ ~b)`] THEN
11348      CONJ_TAC THENL
11349      [CONJ_TAC THENL
11350       [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL
11351        [ASM_REAL_ARITH_TAC; MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC];
11352        ALL_TAC] THEN
11353       MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `r * &1` THEN
11354       CONJ_TAC THENL [ALL_TAC; REWRITE_TAC [REAL_MUL_RID; REAL_LE_REFL]] THEN
11355       MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[] THEN
11356       SUBGOAL_THEN `&0 < &2 * c` ASSUME_TAC THENL
11357       [ASM_REAL_ARITH_TAC;
11358        ASM_SIMP_TAC [REAL_LT_LDIV_EQ] THEN ASM_REAL_ARITH_TAC];
11359       REWRITE_TAC [REAL_NOT_LT] THEN
11360       ONCE_REWRITE_TAC [REAL_RING `!a b c:real. a * b * c = b * a * c`] THEN
11361       MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `r * &1` THEN CONJ_TAC THENL
11362       [REWRITE_TAC [REAL_MUL_RID; REAL_LE_REFL]; ALL_TAC] THEN
11363       MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL
11364       [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
11365       SUBGOAL_THEN `&0 < &2 * c` ASSUME_TAC THENL
11366       [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
11367        ASM_SIMP_TAC [REAL_ARITH `&0 < c ==> a * b / c = (a * b) / c`] THEN
11368        SUBGOAL_THEN `(c * (c + &1)) / (&2 * c) = (c + &1) / &2`
11369          SUBST1_TAC THENL
11370        [ASM_SIMP_TAC [RAT_LEMMA5; REAL_ARITH `&0 < &2`] THEN
11371         ASM_REAL_ARITH_TAC;
11372         ASM_REAL_ARITH_TAC]]) in
11373   REPEAT STRIP_TAC THEN SUBGOAL_THEN
11374     `!u z. norm u = &1 /\ z IN ball(Cx(&0),r) ==> u * g z = g (u * z)`
11375     ASSUME_TAC THENL
11376   [REPEAT STRIP_TAC THEN SUBGOAL_THEN `~(u = Cx(&0))` ASSUME_TAC THENL
11377    [ASM_REWRITE_TAC[GSYM COMPLEX_NORM_NZ] THEN REAL_ARITH_TAC; ALL_TAC] THEN
11378    SUBGOAL_THEN `!w. w IN ball(Cx(&0),r) ==> f (u * g w) / u = w`
11379      ASSUME_TAC THENL
11380    [REPEAT STRIP_TAC THEN MATCH_MP_TAC FIRST_CARTAN_THM_DIM_1 THEN
11381     EXISTS_TAC `ball(Cx(&0),r)` THEN EXISTS_TAC `Cx(&0)` THEN
11382     ASM_REWRITE_TAC [OPEN_BALL;CONNECTED_BALL;BOUNDED_BALL;
11383                     COMPLEX_MUL_RZERO; CENTRE_IN_BALL] THEN
11384     ASSERT_TAC `!z. norm (u * z) = norm z` THENL
11385     [ASM_REWRITE_TAC [COMPLEX_NORM_MUL; REAL_MUL_LID]; ALL_TAC] THEN
11386     ASSERT_TAC `!z. z IN ball(Cx(&0),r) ==> u * z IN ball(Cx(&0),r)` THENL
11387     [ASM_REWRITE_TAC [COMPLEX_IN_BALL_0]; ALL_TAC] THEN
11388     ASSERT_TAC `!z. z IN ball(Cx(&0),r) ==> z / u IN ball(Cx(&0),r)` THENL
11389     [ASM_REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_DIV; REAL_DIV_1];
11390      ALL_TAC] THEN
11391     CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN CONJ_TAC THENL
11392     [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN CONJ_TAC THENL
11393      [ALL_TAC; ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST]] THEN
11394      SUBGOAL_THEN `(\w:complex. f (u * g w) : complex) = f o (\w. u * g w)`
11395        SUBST1_TAC THENL
11396      [REWRITE_TAC [o_DEF]; MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN] THEN
11397      EXISTS_TAC `ball(Cx(&0),r)` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
11398      [MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
11399       ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST];
11400       ASM_SIMP_TAC[]];
11401      ALL_TAC] THEN
11402     CONJ_TAC THENL
11403     [REWRITE_TAC [complex_div; COMPLEX_MUL_LZERO]; ALL_TAC] THEN
11404     SUBGOAL_THEN `Cx(&1) = u / u` SUBST1_TAC THENL
11405     [ASM_SIMP_TAC [COMPLEX_DIV_REFL]; ALL_TAC] THEN
11406     MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
11407     MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_CDIV_AT THEN
11408     SUBGOAL_THEN `(\w:complex. f (u * g w) : complex) = f o (\w. u * g w)`
11409     SUBST1_TAC THENL [REWRITE_TAC [o_DEF]; ALL_TAC] THEN
11410     SUBGOAL_THEN
11411     `((\w. f (u * g w)) has_complex_derivative
11412       complex_derivative f (u * g(Cx(&0))) *
11413       (u * complex_derivative g (Cx(&0))))
11414      (at (Cx(&0)))` MP_TAC THENL
11415     [MATCH_MP_TAC (REWRITE_RULE [o_DEF]
11416       (SPECL [`\w:complex. u * g(w):complex`; `f:complex->complex`]
11417       COMPLEX_DIFF_CHAIN_AT)) THEN CONJ_TAC THENL
11418      [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_LMUL_AT THEN
11419       REWRITE_TAC [HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
11420       MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
11421       EXISTS_TAC `ball(Cx(&0),r)` THEN
11422       ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL];
11423       REWRITE_TAC [HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
11424       MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
11425       EXISTS_TAC `ball(Cx(&0),r)` THEN
11426       ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; COMPLEX_MUL_RZERO]];
11427      SUBGOAL_THEN
11428        `complex_derivative f (u * g (Cx(&0))) *
11429         (u * complex_derivative g (Cx(&0))) = u`
11430        SUBST1_TAC THENL
11431      [ALL_TAC; REWRITE_TAC[o_DEF]] THEN
11432      ABBREV_TAC `g' = complex_derivative g (Cx(&0))` THEN
11433      ABBREV_TAC `f' = complex_derivative f (Cx(&0))` THEN
11434      SUBGOAL_THEN `f' * g' = Cx(&1)` ASSUME_TAC THENL
11435      [EXPAND_TAC "g'" THEN EXPAND_TAC "f'" THEN
11436       SUBGOAL_THEN `complex_derivative g (Cx(&0)) =
11437                     complex_derivative g (f (Cx(&0)))` SUBST1_TAC THENL
11438       [ASM_REWRITE_TAC [];
11439        MATCH_MP_TAC COMPLEX_DERIVATIVE_LEFT_INVERSE THEN
11440        EXISTS_TAC `ball(Cx(&0),r)` THEN EXISTS_TAC `ball(Cx(&0),r)` THEN
11441        ASM_REWRITE_TAC [OPEN_BALL; CENTRE_IN_BALL]];
11442       ASM_REWRITE_TAC [COMPLEX_MUL_RZERO] THEN
11443       POP_ASSUM MP_TAC THEN CONV_TAC COMPLEX_RING]];
11444     SUBGOAL_THEN `f(u*g(z)) = f (g (u * z)) : complex` MP_TAC THENL
11445     [MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC `u * z:complex` THEN CONJ_TAC THENL
11446      [SUBGOAL_THEN `!x y:complex. x / u = y ==> x = u * y` MATCH_MP_TAC THENL
11447       [REWRITE_TAC [complex_div] THEN GEN_TAC THEN GEN_TAC THEN
11448        DISCH_THEN (SUBST1_TAC o GSYM) THEN
11449        SUBGOAL_THEN `x = (inv u * u) * x` MP_TAC THENL
11450        [ASM_SIMP_TAC [COMPLEX_MUL_LINV; COMPLEX_MUL_LID];
11451         REWRITE_TAC [COMPLEX_MUL_AC]];
11452        POP_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC []];
11453       MATCH_MP_TAC EQ_SYM THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
11454       ASM_REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_MUL; REAL_MUL_LID] THEN
11455       ASM_REWRITE_TAC [GSYM COMPLEX_IN_BALL_0]];
11456      DISCH_TAC THEN SUBGOAL_THEN
11457        `g (f (u * g z)) = g (f (g (u * z : complex))) : complex` MP_TAC THENL
11458      [POP_ASSUM SUBST1_TAC THEN REWRITE_TAC [];
11459       SUBGOAL_THEN `u * g z IN ball (Cx(&0),r) /\ u * z IN ball(Cx(&0),r)`
11460       MP_TAC THENL
11461       [ASM_REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_MUL; REAL_MUL_LID] THEN
11462        REWRITE_TAC [GSYM COMPLEX_IN_BALL_0] THEN ASM_SIMP_TAC[];
11463        ASM_SIMP_TAC[]]]]];
11464    SUBGOAL_THEN `?c. !z. z IN ball(Cx(&0),r) ==> g z = c * z`
11465      STRIP_ASSUME_TAC THENL
11466    [MATCH_MP_TAC LEMMA_1 THEN
11467     ASM_SIMP_TAC [OPEN_BALL; CONNECTED_BALL; CENTRE_IN_BALL] THEN
11468     SIMP_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_MUL; REAL_MUL_LID];
11469     ALL_TAC] THEN
11470    SUBGOAL_THEN `norm (c:complex) = &1` ASSUME_TAC THENL
11471    [ALL_TAC; ASM_MESON_TAC [COMPLEX_NORM_EQ_1_CEXP]] THEN
11472    SUBGOAL_THEN `~(norm (c:complex) = &0)` ASSUME_TAC THENL
11473    [REWRITE_TAC [COMPLEX_NORM_ZERO] THEN STRIP_TAC THEN
11474     SUBGOAL_THEN `Cx(&0) = Cx(r / &2)` MP_TAC THENL
11475     [ALL_TAC; REWRITE_TAC [CX_INJ] THEN ASM_REAL_ARITH_TAC] THEN
11476     SUBGOAL_THEN `Cx(r / &2) IN ball(Cx(&0),r)` ASSUME_TAC THENL
11477     [REWRITE_TAC [COMPLEX_IN_BALL_0; CX_DIV; COMPLEX_NORM_DIV;
11478                   COMPLEX_NORM_NUM] THEN
11479      REWRITE_TAC [COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
11480      EQ_TRANS_TAC `g (f (Cx(r / &2)):complex):complex` THENL
11481      [EQ_TRANS_TAC `c * (f (Cx(r / &2)):complex)` THENL
11482       [ASM_REWRITE_TAC [COMPLEX_MUL_LZERO]; ASM_MESON_TAC[]];
11483       ASM_MESON_TAC[]]];
11484     ALL_TAC] THEN SUBGOAL_THEN `&0 < norm (c:complex)` ASSUME_TAC THENL
11485    [POP_ASSUM MP_TAC THEN CONV_TAC NORM_ARITH; ALL_TAC] THEN
11486     REWRITE_TAC [GSYM REAL_LE_ANTISYM] THEN CONJ_TAC THENL
11487    [MATCH_MP_TAC LEMMA_2 THEN EXISTS_TAC `r : real` THEN
11488     ASM_REWRITE_TAC [NORM_POS_LE] THEN GEN_TAC THEN STRIP_TAC THEN
11489     ABBREV_TAC `p = Cx x` THEN
11490     SUBGOAL_THEN `x = norm (p:complex)` SUBST_ALL_TAC THENL
11491     [EXPAND_TAC "p" THEN REWRITE_TAC [COMPLEX_NORM_CX] THEN
11492      ASM_REAL_ARITH_TAC;
11493      REWRITE_TAC [GSYM COMPLEX_NORM_MUL] THEN
11494      SUBGOAL_THEN `c * p = g p` SUBST1_TAC THENL
11495      [ALL_TAC; ASM_MESON_TAC [COMPLEX_IN_BALL_0]] THEN
11496      FIRST_X_ASSUM (MATCH_MP_TAC o GSYM) THEN
11497      ASM_MESON_TAC [COMPLEX_IN_BALL_0]];
11498     ALL_TAC] THEN
11499    SUBST1_TAC (GSYM (SPEC `norm (c:complex)` REAL_INV_INV)) THEN
11500    MATCH_MP_TAC REAL_INV_1_LE THEN CONJ_TAC THENL
11501    [ASM_MESON_TAC [REAL_LT_INV]; ALL_TAC] THEN
11502    MATCH_MP_TAC LEMMA_2 THEN EXISTS_TAC `r:real` THEN ASM_REWRITE_TAC [] THEN
11503    CONJ_TAC THENL
11504    [MATCH_MP_TAC REAL_LE_INV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
11505    GEN_TAC THEN STRIP_TAC THEN
11506    SUBGOAL_THEN `x = norm (g (f (Cx x):complex):complex)` SUBST1_TAC THENL
11507    [SUBGOAL_THEN `g (f (Cx x):complex) = Cx x` SUBST1_TAC THENL
11508     [FIRST_X_ASSUM MATCH_MP_TAC THEN
11509      REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_CX] THEN
11510      ASM_REAL_ARITH_TAC;
11511      REWRITE_TAC [COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC];
11512     SUBGOAL_THEN `g (f (Cx x):complex) = c * f (Cx x) : complex`
11513       SUBST1_TAC THENL
11514     [FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
11515      REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_CX] THEN
11516      ASM_REAL_ARITH_TAC;
11517      REWRITE_TAC [COMPLEX_NORM_MUL; REAL_MUL_ASSOC] THEN
11518      ASM_SIMP_TAC [REAL_MUL_LINV; REAL_MUL_LID; GSYM COMPLEX_IN_BALL_0] THEN
11519      FIRST_X_ASSUM MATCH_MP_TAC THEN
11520      REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_CX] THEN
11521      ASM_REAL_ARITH_TAC]]]);;
11522
11523 (* ------------------------------------------------------------------------- *)
11524 (* Cauchy's inequality and more versions of Liouville.                       *)
11525 (* ------------------------------------------------------------------------- *)
11526
11527 let CAUCHY_INEQUALITY = prove
11528  (`!f z r (B:real) n.
11529      f continuous_on cball(z,r) /\
11530      f holomorphic_on ball(z,r) /\ &0 < r /\
11531      (!x:complex. norm(z-x) = r ==> norm(f x) <= B)
11532      ==> norm (higher_complex_derivative n f z) <= &(FACT n) * B / r pow n`,
11533   REPEAT STRIP_TAC THEN SUBGOAL_THEN `&0 <= B` ASSUME_TAC THENL
11534   [SUBGOAL_THEN `?x:complex. norm (z-x) = r` STRIP_ASSUME_TAC THENL [
11535   EXISTS_TAC `z + Cx r` THEN ASM_SIMP_TAC[COMPLEX_ADD_SUB2;NORM_NEG;
11536   COMPLEX_NORM_CX;REAL_ABS_REFL;REAL_LT_IMP_LE];ALL_TAC] THEN
11537   ASM_MESON_TAC [NORM_POS_LE;REAL_LE_TRANS];
11538   SUBGOAL_THEN `norm ((Cx(&2) * Cx pi * ii) / Cx(&(FACT n))
11539           * higher_complex_derivative n f z)
11540     <= (B / r pow (n + 1)) * &2 * pi * r` MP_TAC THENL[
11541   MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH THEN
11542   EXISTS_TAC `\u. (f:complex->complex) u / (u - z) pow (n + 1)` THEN
11543   EXISTS_TAC `z:complex` THEN CONJ_TAC THENL [MATCH_MP_TAC
11544   CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH THEN
11545   ASM_SIMP_TAC [CENTRE_IN_BALL]; ALL_TAC] THEN CONJ_TAC THENL
11546   [MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC
11547   [REAL_POW_LE;REAL_LT_IMP_LE];ALL_TAC]THEN ASM_REWRITE_TAC []
11548   THEN GEN_TAC THEN DISCH_TAC THEN
11549   ASM_REWRITE_TAC [COMPLEX_NORM_DIV;COMPLEX_NORM_POW] THEN MATCH_MP_TAC
11550   REAL_LE_TRANS THEN EXISTS_TAC `B:real / r pow (n+1)` THEN
11551   ASM_SIMP_TAC[ REAL_LE_DIV2_EQ; REAL_POW_LT;NORM_SUB;REAL_LE_REFL];
11552   REWRITE_TAC[COMPLEX_NORM_DIV;COMPLEX_NORM_MUL; COMPLEX_NORM_II;
11553   COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_ABS_PI; REAL_MUL_RID;REAL_ABS_NUM]
11554   THEN SUBGOAL_THEN `B / r pow (n + 1) * &2 * pi * r =
11555                 (&2 * pi) / &(FACT n) * (((&(FACT n) * B) * r/ r pow (n+1)))`
11556   SUBST1_TAC THENL [SUBGOAL_THEN `~(&(FACT n) = &0)` MP_TAC THENL
11557   [REWRITE_TAC [FACT_NZ;REAL_OF_NUM_EQ];ALL_TAC]
11558   THEN CONV_TAC REAL_FIELD;SUBGOAL_THEN `&0 < (&2 * pi) / &(FACT n)` ASSUME_TAC
11559   THENL[MATCH_MP_TAC REAL_LT_DIV THEN SIMP_TAC[FACT_LT;REAL_OF_NUM_LT] THEN
11560   MP_TAC PI_POS THEN REAL_ARITH_TAC;SUBGOAL_THEN `(&(FACT n) * B) * r / r pow
11561   (n + 1) = &(FACT n) * B / r pow n` SUBST1_TAC THENL
11562   [REWRITE_TAC[GSYM ADD1; real_pow] THEN MP_TAC (ASSUME `&0 < r`) THEN
11563   CONV_TAC REAL_FIELD; ASM_MESON_TAC [REAL_LE_LCANCEL_IMP]]]]]]);;
11564
11565 let LIOUVILLE_POLYNOMIAL = prove
11566  (`!f A B n.
11567         f holomorphic_on (:complex) /\
11568         (!z. A <= norm(z) ==> norm(f z) <= B * norm(z) pow n)
11569         ==> !z. f(z) = vsum (0..n)
11570                             (\k. higher_complex_derivative k f (Cx(&0)) /
11571                                  Cx(&(FACT k)) * z pow k)`,
11572   REPEAT STRIP_TAC THEN DISJ_CASES_TAC(REAL_ARITH `B <= &0 \/ &0 < B`) THENL
11573    [MP_TAC(ISPECL [`f:complex->complex`; `Cx(&0)`] LIOUVILLE_WEAK) THEN
11574     ANTS_TAC THENL
11575      [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC LIM_EVENTUALLY THEN
11576       REWRITE_TAC[EVENTUALLY_AT_INFINITY; real_ge] THEN
11577       EXISTS_TAC `A:real` THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
11578       FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
11579       REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC(NORM_ARITH
11580        `r <= &0 ==> norm z <= r ==> z = vec 0`) THEN
11581       MATCH_MP_TAC(REAL_ARITH `&0 <= --b * x ==> b * x <= &0`) THEN
11582       MATCH_MP_TAC REAL_LE_MUL THEN
11583       SIMP_TAC[NORM_POS_LE; REAL_POW_LE] THEN ASM_REAL_ARITH_TAC;
11584       GEN_REWRITE_TAC LAND_CONV [GSYM FUN_EQ_THM] THEN
11585       DISCH_THEN SUBST1_TAC THEN
11586       ASM_REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_CONST] THEN
11587       REWRITE_TAC[COND_ID; complex_div; COMPLEX_MUL_LZERO] THEN
11588       REWRITE_TAC[GSYM COMPLEX_VEC_0; VSUM_0]];
11589     ALL_TAC] THEN
11590   ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0] THEN
11591   SUBGOAL_THEN
11592    `((\n. higher_complex_derivative n f (Cx(&0)) / Cx(&(FACT n)) *
11593           (z - Cx(&0)) pow n) sums f(z)) (from 0)`
11594   MP_TAC THENL
11595    [MATCH_MP_TAC HOLOMORPHIC_POWER_SERIES THEN
11596     EXISTS_TAC `norm(z:complex) + &1` THEN
11597     REWRITE_TAC[COMPLEX_IN_BALL_0; REAL_ARITH `x < x + &1`] THEN
11598     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV];
11599     REWRITE_TAC[COMPLEX_SUB_RZERO] THEN DISCH_TAC] THEN
11600   FIRST_ASSUM(MP_TAC o SPEC `n + 1` o
11601     MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
11602   ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
11603   REWRITE_TAC[ADD_SUB; ARITH_RULE `0 < n + 1`] THEN
11604   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] SERIES_UNIQUE) THEN
11605   REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC SUMS_0 THEN
11606   X_GEN_TAC `k:num` THEN
11607   REWRITE_TAC[IN_FROM; ARITH_RULE `n + 1 <= k <=> n < k`] THEN
11608   DISCH_TAC THEN REWRITE_TAC[COMPLEX_VEC_0; COMPLEX_ENTIRE] THEN
11609   REWRITE_TAC[COMPLEX_DIV_EQ_0] THEN REPEAT DISJ1_TAC THEN
11610   MATCH_MP_TAC(MESON[COMPLEX_NORM_NZ] `~(&0 < norm w) ==> w = Cx(&0)`) THEN
11611   DISCH_TAC THEN ABBREV_TAC
11612     `w = Cx(&(FACT k) *
11613             B / norm(higher_complex_derivative k f (Cx(&0))) +
11614             abs A + &1)` THEN
11615   SUBGOAL_THEN `~(w = Cx(&0))` ASSUME_TAC THENL
11616    [EXPAND_TAC "w" THEN REWRITE_TAC[CX_INJ] THEN
11617     MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> ~(x + abs a + &1 = &0)`) THEN
11618     MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_POS] THEN
11619     MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE];
11620     ALL_TAC] THEN
11621   MP_TAC(SPECL
11622    [`f:complex->complex`; `Cx(&0)`; `norm(w:complex)`;
11623     `B * norm(w:complex) pow n`; `k:num`]
11624    CAUCHY_INEQUALITY) THEN
11625   REWRITE_TAC[NOT_IMP] THEN REPEAT CONJ_TAC THENL
11626    [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
11627                   SUBSET_UNIV];
11628     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV];
11629     ASM_REWRITE_TAC[COMPLEX_NORM_NZ];
11630     REWRITE_TAC[COMPLEX_SUB_LZERO; NORM_NEG] THEN
11631     X_GEN_TAC `x:complex` THEN DISCH_THEN(fun th ->
11632      SUBST1_TAC(SYM th) THEN ASSUME_TAC th) THEN
11633     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
11634     EXPAND_TAC "w" THEN REWRITE_TAC[COMPLEX_NORM_CX] THEN
11635     MATCH_MP_TAC(REAL_ARITH `&0 <= k ==> a <= abs(k + abs a + &1)`) THEN
11636     MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_POS] THEN
11637     MATCH_MP_TAC REAL_LE_DIV THEN
11638     ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE];
11639     REWRITE_TAC[REAL_ARITH
11640      `~(d:real <= f * (b * n) / k) <=> f * b * (n / k) < d`] THEN
11641     ASM_SIMP_TAC[REAL_DIV_POW2; COMPLEX_NORM_ZERO] THEN
11642     ASM_REWRITE_TAC[REAL_MUL_ASSOC; GSYM NOT_LT] THEN
11643     ASM_SIMP_TAC[GSYM real_div; REAL_LT_LDIV_EQ; COMPLEX_NORM_NZ;
11644                  REAL_POW_LT] THEN
11645     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
11646     ASM_SIMP_TAC[GSYM REAL_LT_LDIV_EQ; COMPLEX_NORM_NZ] THEN
11647     TRANS_TAC REAL_LTE_TRANS `norm(w:complex) pow 1` THEN CONJ_TAC THENL
11648      [EXPAND_TAC "w" THEN REWRITE_TAC[REAL_POW_1; COMPLEX_NORM_CX] THEN
11649       MATCH_MP_TAC(REAL_ARITH
11650        `&0 <= k * B / d ==> (B * k) / d < abs(k * B / d + abs a + &1)`);
11651       MATCH_MP_TAC REAL_POW_MONO THEN
11652       CONJ_TAC THENL [ALL_TAC; ASM_ARITH_TAC] THEN
11653       EXPAND_TAC "w" THEN REWRITE_TAC[REAL_POW_1; COMPLEX_NORM_CX] THEN
11654       MATCH_MP_TAC(REAL_ARITH
11655        `&0 <= k * B / d ==> &1 <= abs(k * B / d + abs a + &1)`)] THEN
11656     MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_POS] THEN
11657     MATCH_MP_TAC REAL_LE_DIV THEN
11658     ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE]]);;
11659
11660 let LIOUVILLE_THEOREM = prove
11661  (`!f. f holomorphic_on (:complex) /\ bounded (IMAGE f (:complex))
11662        ==> ?c. !z. f(z) = c`,
11663   REPEAT STRIP_TAC THEN
11664   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [bounded]) THEN
11665   REWRITE_TAC[FORALL_IN_IMAGE; IN_UNIV; LEFT_IMP_EXISTS_THM] THEN
11666   X_GEN_TAC `B:real` THEN STRIP_TAC THEN
11667   MP_TAC(ISPECL [`f:complex->complex`; `&0`; `B:real`; `0`]
11668         LIOUVILLE_POLYNOMIAL) THEN
11669   ASM_SIMP_TAC[VSUM_CLAUSES_NUMSEG; real_pow; REAL_MUL_RID; complex_pow] THEN
11670   MESON_TAC[]);;
11671
11672 (* ------------------------------------------------------------------------- *)
11673 (* A holomorphic function f has only isolated zeros unless f is 0.           *)
11674 (* ------------------------------------------------------------------------- *)
11675
11676 let ISOLATED_ZEROS = prove
11677  (`!f a z w.
11678      open a /\ connected a /\ f holomorphic_on a /\ z IN a /\ f z = Cx(&0) /\
11679      w IN a /\ ~(f w = Cx(&0))
11680      ==> (?r. &0 < r /\ ball(z,r) SUBSET a /\
11681               (!w. w IN ball(z,r) /\ ~(w=z) ==> ~(f w = Cx(&0))))`,
11682   REPEAT STRIP_TAC THEN ASSERT_TAC `?k.
11683          ~(higher_complex_derivative k f z = Cx(&0)) /\
11684          (!n. n < k ==> higher_complex_derivative n f z = Cx(&0))` THENL
11685   [EXISTS_TAC `minimal n. (~(higher_complex_derivative n f z = Cx(&0)))`
11686   THEN SUBGOAL_THEN `?k'. ~(higher_complex_derivative k' f z = Cx(&0))`
11687   (fun th-> ASM_MESON_TAC[th;MINIMAL]) THEN REWRITE_TAC[GSYM NOT_FORALL_THM]
11688   THEN STRIP_TAC THEN ASM_MESON_TAC[HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED];
11689   ALL_TAC] THEN SUBGOAL_THEN `~(k = 0)`ASSUME_TAC THENL
11690   [STRIP_TAC THEN MP_TAC(ASSUME `~(higher_complex_derivative k f z = Cx(&0))`)
11691   THEN ASM_MESON_TAC[higher_complex_derivative];
11692   STRIP_ASSUME_TAC (MESON [OPEN_CONTAINS_BALL;ASSUME `open (a:complex->bool)`;
11693   ASSUME `z:complex IN a`] `?s. &0 < s /\ ball (z:complex,s) SUBSET a`)
11694   THEN ASSUME_TAC (MESON [HOLOMORPHIC_POWER_SERIES;
11695   ASSUME `f holomorphic_on a`;ASSUME `ball (z:complex,s)
11696   SUBSET a`;HOLOMORPHIC_ON_SUBSET] `!w:complex. w IN ball(z,s) ==>
11697   ((\n. higher_complex_derivative n f z / Cx(&(FACT n))*(w -z) pow n) sums f w)
11698   (from 0)`) THEN ASSERT_TAC `?g:complex->complex. !x:complex.
11699                 x IN ball(z,s) ==>
11700         (((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11701           (x - z) pow (n-k))) sums g x) (from k)` THENL
11702   [EXISTS_TAC `\x:complex. lim sequentially
11703   (\m. vsum (k..m) (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11704   (x - z) pow (n-k)))` THEN GEN_TAC THEN DISCH_TAC THEN
11705   SUBGOAL_THEN `!m. k..m = (0..m) INTER from k` ASSUME_TAC THENL
11706   [REWRITE_TAC[EXTENSION; IN_FROM; IN_INTER; IN_ELIM_THM; IN_NUMSEG] THEN
11707   ARITH_TAC;ASM_REWRITE_TAC[] THEN REWRITE_TAC
11708   [SET_RULE `!m. (0..m) INTER from k = from k INTER (0..m)`;SUMS_LIM]] THEN
11709   ASM_CASES_TAC `x:complex = z` THENL
11710   [ASM_REWRITE_TAC[COMPLEX_SUB_REFL;summable] THEN
11711   EXISTS_TAC `higher_complex_derivative k f z / Cx(&(FACT k))` THEN
11712   MATCH_MP_TAC SUMS_EQ THEN EXISTS_TAC `\n. if n = k then
11713   higher_complex_derivative k f z / Cx(&(FACT k)) else Cx(&0)`
11714   THEN CONJ_TAC THENL [REWRITE_TAC [IN_FROM] THEN GEN_TAC THEN DISCH_TAC
11715   THEN COND_CASES_TAC THENL
11716   [ASM_REWRITE_TAC[COMPLEX_POW_ZERO;SUB_REFL;COMPLEX_MUL_RID];
11717   ASM_SIMP_TAC[COMPLEX_POW_ZERO; ARITH_RULE `k <= x' /\ ~(x' = k) ==>
11718   ~(x' - k = 0)`;COMPLEX_MUL_RZERO]]; MATCH_MP_TAC SERIES_VSUM THEN
11719   EXISTS_TAC `{k:num}` THEN SIMP_TAC [FINITE_SING;from;IN_SING;
11720   COMPLEX_VEC_0;VSUM_SING] THEN SET_TAC[LE_REFL]];
11721   MATCH_MP_TAC SUMMABLE_EQ THEN EXISTS_TAC
11722   `\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11723   (x - z) pow n / (x-z) pow k` THEN CONJ_TAC THENL [REWRITE_TAC [IN_FROM]
11724   THEN GEN_TAC THEN DISCH_TAC THEN SUBGOAL_THEN `(x:complex - z) pow (x' - k)
11725   = (x - z) pow x' / (x - z) pow k` (fun th->
11726   REWRITE_TAC[th;COMPLEX_EQ_MUL_LCANCEL]) THEN MATCH_MP_TAC
11727   COMPLEX_DIV_POW THEN ASM_SIMP_TAC [COMPLEX_SUB_0];
11728   SUBGOAL_THEN `(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11729   (x - z) pow n / (x - z) pow k) = (\n. (higher_complex_derivative n f z /
11730   Cx(&(FACT n)) *(x - z) pow n) / (x - z) pow k) ` SUBST1_TAC
11731   THENL [REWRITE_TAC [FUN_EQ_THM] THEN GEN_TAC THEN CONV_TAC COMPLEX_FIELD;
11732   MATCH_MP_TAC SUMMABLE_COMPLEX_DIV THEN MATCH_MP_TAC SUMMABLE_FROM_ELSEWHERE
11733   THEN EXISTS_TAC `0` THEN ASM_MESON_TAC[summable]]]];ALL_TAC] THEN
11734   ASSERT_TAC `~(g (z:complex) = Cx(&0)) /\
11735   (!x. x IN ball(z,s) ==> f x = (x - z) pow k * g(x))` THENL
11736   [CONJ_TAC THENL [MATCH_MP_TAC
11737   (COMPLEX_FIELD `!x y:complex. x = y /\ ~(y= Cx(&0)) ==> ~(x=Cx(&0))`) THEN
11738   EXISTS_TAC `higher_complex_derivative k f z / Cx(&(FACT k))` THEN
11739   CONJ_TAC THENL [ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0] THEN
11740   MATCH_MP_TAC SERIES_UNIQUE THEN EXISTS_TAC
11741   `(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11742   Cx(&0) pow (n-k))` THEN EXISTS_TAC `from (k +1)` THEN
11743   CONJ_TAC THENL [SUBST1_TAC (MESON [VSUM_SING_NUMSEG]
11744   `higher_complex_derivative k f z / Cx(&(FACT k)) =
11745   vsum (k..k) (\n. higher_complex_derivative n f z / Cx(&(FACT n))) `)
11746   THEN SUBGOAL_THEN  `vsum (k..k)  (\n. higher_complex_derivative n f z
11747   / Cx(&(FACT n))) = vsum (k..((k+1)-1)) (\n. higher_complex_derivative n f z
11748   / Cx(&(FACT n)) * Cx(&0) pow (n - k))` SUBST1_TAC THENL [
11749   REWRITE_TAC[VSUM_SING_NUMSEG; COMPLEX_POW_ZERO;SUB_REFL;COMPLEX_MUL_RID;
11750   ARITH_RULE `((k:num) + 1) -1 = k`];
11751   MATCH_MP_TAC SUMS_OFFSET THEN
11752   ASM_REWRITE_TAC[ARITH_RULE `k:num <= k+1 /\ 0 < k+1`]
11753   THEN POP_ASSUM (MP_TAC o SPEC `z:complex`) THEN
11754   ASM_REWRITE_TAC[CENTRE_IN_BALL;COMPLEX_SUB_REFL]];MATCH_MP_TAC
11755   SUMS_COMPLEX_0 THEN GEN_TAC THEN SIMP_TAC [IN_FROM;COMPLEX_POW_ZERO;
11756   ARITH_RULE `k + 1 <= n <=> ~(n-k= 0)`;COMPLEX_MUL_RZERO]];
11757   MATCH_MP_TAC (COMPLEX_FIELD `!x y. ~(x = Cx(&0)) /\ ~(y = Cx(&0))
11758   ==> ~(x / y = Cx(&0))`) THEN ASM_REWRITE_TAC[GSYM COMPLEX_NORM_ZERO] THEN
11759   SUBST1_TAC (MESON [COMPLEX_NORM_CX]
11760   `norm (Cx(&(FACT k))) = abs ((&(FACT k)))`) THEN
11761   SIMP_TAC [REAL_ABS_ZERO;FACT_LT;REAL_OF_NUM_LT;REAL_LT_IMP_NZ]]; ALL_TAC]
11762   THEN GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
11763   EXISTS_TAC `(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11764   (x - z) pow n)`THEN EXISTS_TAC `(from 0)` THEN
11765   CONJ_TAC  THENL [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[];
11766   ASM_CASES_TAC `x:complex = z` THENL [
11767   ASM_REWRITE_TAC[COMPLEX_SUB_REFL] THEN MATCH_MP_TAC SUMS_EQ THEN
11768   EXISTS_TAC `\n:num. Cx(&0)` THEN  CONJ_TAC THENL
11769   [REWRITE_TAC[IN_FROM;COMPLEX_POW_ZERO] THEN X_GEN_TAC `n:num` THEN
11770   DISCH_TAC THEN  COND_CASES_TAC THENL [
11771   ASM_REWRITE_TAC[higher_complex_derivative] THEN CONV_TAC COMPLEX_FIELD;
11772   REWRITE_TAC[COMPLEX_MUL_RZERO]];
11773   ASM_REWRITE_TAC[COMPLEX_POW_ZERO;COMPLEX_MUL_LZERO] THEN
11774   ASM_REWRITE_TAC[SERIES_0;GSYM COMPLEX_VEC_0]];ALL_TAC] THEN
11775   MATCH_MP_TAC SUMS_EQ THEN EXISTS_TAC `\n.(x-z) pow k *
11776   higher_complex_derivative n f z / Cx(&(FACT n)) *(x - z) pow (n - k)`
11777   THEN CONJ_TAC THENL [REWRITE_TAC[IN_FROM] THEN X_GEN_TAC `n:num`
11778   THEN DISCH_TAC THEN ASM_CASES_TAC `n:num < k` THENL [ASM_SIMP_TAC[]
11779   THEN CONV_TAC COMPLEX_FIELD;
11780   SUBGOAL_THEN `(x:complex-z) pow (n-k) = (x-z) pow n / (x-z) pow k`
11781   SUBST1_TAC THENL [MATCH_MP_TAC COMPLEX_DIV_POW THEN
11782   ASM_SIMP_TAC[COMPLEX_SUB_0; ARITH_RULE `~(n:num < k) ==> k <= n`];
11783   SUBST1_TAC (COMPLEX_FIELD `(x - z) pow k *
11784      higher_complex_derivative n f z / Cx(&(FACT n)) *
11785      (x - z) pow n / (x - z) pow k =
11786          higher_complex_derivative n f z / Cx(&(FACT n)) * (x-z) pow k *
11787      (x - z) pow n / (x - z) pow k`) THEN MESON_TAC [ASSUME `~(x:complex = z)`;
11788   COMPLEX_DIV_LMUL;COMPLEX_SUB_0;COMPLEX_POW_EQ_0]]];
11789   MATCH_MP_TAC SERIES_COMPLEX_LMUL THEN SUBST1_TAC
11790   (MESON [COMPLEX_ADD_RID] `(g:complex->complex) x = g x + Cx(&0)`) THEN
11791   SUBGOAL_THEN `Cx(&0) = vsum (0.. (k-1))
11792   (\n. higher_complex_derivative n f z / Cx(&(FACT n)) * (x - z) pow (n - k))`
11793   SUBST1_TAC THENL [ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
11794   REWRITE_TAC [GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC VSUM_EQ_0 THEN
11795   REWRITE_TAC [IN_NUMSEG] THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
11796   ASM_SIMP_TAC[ARITH_RULE ` ~(k = 0) /\ n <= k - 1 ==> n < k`] THEN
11797   REWRITE_TAC[COMPLEX_VEC_0] THEN CONV_TAC COMPLEX_FIELD;
11798   MATCH_MP_TAC SUMS_OFFSET_REV THEN
11799   ASM_SIMP_TAC[ARITH_RULE `0 <= k /\ ~(k = 0) ==> 0 < k`;LE_0]]]];ALL_TAC] THEN
11800   ASSERT_TAC `?r. &0 < r /\ (!x:complex. dist (z,x) < r ==>
11801                 ~((g:complex->complex) x = Cx(&0)))` THENL [
11802   MATCH_MP_TAC CONTINUOUS_ON_OPEN_AVOID THEN
11803   EXISTS_TAC `ball(z:complex, s)` THEN
11804   ASM_REWRITE_TAC[OPEN_BALL;CENTRE_IN_BALL]
11805   THEN MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
11806   MATCH_MP_TAC ANALYTIC_IMP_HOLOMORPHIC THEN MATCH_MP_TAC POWER_SERIES_ANALYTIC
11807   THEN EXISTS_TAC `\n. higher_complex_derivative (n+k) f z / Cx(&(FACT (n+k)))`
11808   THEN EXISTS_TAC `from 0` THEN REWRITE_TAC[] THEN GEN_TAC THEN DISCH_TAC
11809   THEN REWRITE_TAC[SERIES_FROM] THEN MATCH_MP_TAC LIM_TRANSFORM THEN
11810   EXISTS_TAC `(\n.vsum (k..(k+n))
11811   (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *(w' - z) pow (n-k)))`
11812   THEN CONJ_TAC THENL [SIMP_TAC [VSUM_OFFSET_0;ARITH_RULE
11813   `!k n :num.(k + n) - k = n`; ARITH_RULE `!k n:num. k <= k + n`;ADD_ASSOC;
11814   ARITH_RULE `!k n :num.(n + k) - k = n`] THEN
11815   SUBGOAL_THEN `(\x. vsum (0..x) (\i. higher_complex_derivative (i + k)
11816          f z / Cx(&(FACT (i + k))) * (w' - z) pow i)
11817          - vsum (0..x) (\n. higher_complex_derivative (n + k) f z
11818         / Cx(&(FACT (n + k))) * (w' - z) pow n)) = (\x. Cx(&0))`
11819         (fun th-> SIMP_TAC[th;COMPLEX_VEC_0;LIM_CONST]) THEN
11820   REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REWRITE_TAC[COMPLEX_SUB_0];
11821   SUBGOAL_THEN `(\n. vsum (k..k + n)
11822   (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *(w' - z) pow (n - k)))
11823   = (\n. vsum (k..n+k)(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11824   (w' - z) pow (n - k)))` SUBST1_TAC THENL [
11825   REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REWRITE_TAC[ADD_SYM];
11826   MP_TAC (ISPECL [`(\n. vsum (k..n)
11827         (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11828         (w' - z) pow (n - k)))`;`(g:complex->complex) w'`;`k:num`]
11829   SEQ_OFFSET) THEN ONCE_REWRITE_TAC[GSYM SERIES_FROM] THEN ASM_SIMP_TAC[]]];
11830   ALL_TAC] THEN EXISTS_TAC `min r s` THEN CONJ_TAC THENL
11831   [MP_TAC (CONJ (ASSUME `&0 < r`) (ASSUME `&0 < s`)) THEN REAL_ARITH_TAC;
11832   CONJ_TAC THENL [REWRITE_TAC[real_min] THEN COND_CASES_TAC
11833   THENL [MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,s)`
11834   THEN ASM_REWRITE_TAC[ball] THEN SET_TAC[ASSUME `r:real <= s`;REAL_LTE_TRANS];
11835   ASM_REWRITE_TAC[]];GEN_TAC THEN STRIP_TAC THEN
11836   SUBGOAL_THEN `(f:complex->complex) w' =
11837                 (w' - z) pow k * (g:complex->complex) w'` SUBST1_TAC
11838    THENL [FIRST_ASSUM MATCH_MP_TAC THEN
11839   MP_TAC (ASSUME `w':complex IN ball (z,min r s)`) THEN REWRITE_TAC [real_min]
11840   THEN COND_CASES_TAC THENL [ASM_MESON_TAC[IN_BALL;REAL_LTE_TRANS];
11841   REWRITE_TAC[]];SIMP_TAC [COMPLEX_ENTIRE;DE_MORGAN_THM] THEN
11842   CONJ_TAC THENL  [REWRITE_TAC[COMPLEX_POW_EQ_0;DE_MORGAN_THM]
11843   THEN DISJ1_TAC THEN ASM_REWRITE_TAC [COMPLEX_SUB_0];
11844   FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC (ASSUME `w':complex IN
11845   ball (z,min r s)`) THEN REWRITE_TAC [real_min] THEN COND_CASES_TAC
11846   THENL [REWRITE_TAC[IN_BALL];
11847   ASM_MESON_TAC[REAL_NOT_LE;IN_BALL;REAL_LT_TRANS]]]]]]]);;
11848
11849 (* ------------------------------------------------------------------------- *)
11850 (* Analytic continuation.                                                    *)
11851 (* ------------------------------------------------------------------------- *)
11852
11853 let ANALYTIC_CONTINUATION = prove
11854  (`!f a u z.
11855      open a /\ connected a /\ f holomorphic_on a /\ u SUBSET a /\ z IN a /\
11856      z limit_point_of u /\ (!w. w IN u ==> f w = Cx(&0))
11857      ==> (!w. w IN a ==> f w = Cx(&0))`,
11858   REPEAT GEN_TAC THEN STRIP_TAC THEN
11859   REWRITE_TAC[TAUT ` (p ==> q) <=> ~( p /\ (~ q))`;GSYM NOT_EXISTS_THM]
11860   THEN STRIP_TAC THEN SUBGOAL_THEN  `(f:complex->complex) z = Cx(&0)`
11861   ASSUME_TAC THENL [STRIP_ASSUME_TAC(MESON [OPEN_CONTAINS_CBALL;
11862   ASSUME `open (a:complex->bool)`; ASSUME `z:complex IN a`]
11863   `?e. &0 < e /\ cball (z:complex,e) SUBSET a`) THEN ABBREV_TAC
11864   `s = cball(z:complex,e) INTER (u:complex->bool)` THEN
11865   ASSERT_TAC `f:complex->complex continuous_on closure s /\
11866                 (!x:complex. x IN s ==> f x = Cx(&0)) /\
11867                 z:complex IN closure s`
11868   THENL [CONJ_TAC THENL [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
11869   EXISTS_TAC `a:complex->bool` THEN
11870   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN MATCH_MP_TAC
11871   SUBSET_TRANS THEN EXISTS_TAC `cball(z:complex,e)` THEN
11872   ASM_MESON_TAC[CLOSED_CBALL;INTER_SUBSET;CLOSURE_MINIMAL];
11873   CONJ_TAC THENL [ASM_MESON_TAC[INTER_SUBSET;SUBSET];
11874   ASM_SIMP_TAC[closure;IN_UNION] THEN DISJ2_TAC THEN SUBGOAL_THEN
11875   `z:complex limit_point_of s` (fun thm-> SET_TAC[thm]) THEN
11876   REWRITE_TAC [LIMPT_APPROACHABLE] THEN GEN_TAC THEN DISCH_TAC THEN
11877   ASSERT_TAC `?x:complex. x IN u /\ ~(x = z) /\ dist (x , z) < min e' e`
11878   THENL [MP_TAC (ISPECL [`z:complex`;`u:complex->bool`] LIMPT_APPROACHABLE)
11879   THEN ASM_SIMP_TAC[REAL_LT_MIN];EXISTS_TAC `x:complex` THEN ASM_REWRITE_TAC[]
11880   THEN CONJ_TAC THENL
11881   [REWRITE_TAC [GSYM (ASSUME `cball (z:complex,e) INTER u = s`);IN_INTER;
11882   ASSUME `x:complex IN u`;IN_CBALL] THEN ASM_MESON_TAC[REAL_LT_IMP_LE;
11883   REAL_LT_MIN;DIST_SYM]; ASM_MESON_TAC [REAL_LT_MIN]]]]];
11884   ASM_MESON_TAC [CONTINUOUS_CONSTANT_ON_CLOSURE]];
11885   MP_TAC(SPECL [`f:complex->complex`;`a:complex->bool`;`z:complex`;`w:complex`]
11886   ISOLATED_ZEROS) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
11887   SUBGOAL_THEN `?x:complex. x IN ball(z,r) /\ x IN u /\ ~(x=z) /\
11888     (f:complex->complex) x = Cx(&0)`(fun thm->ASM_MESON_TAC[thm]) THEN
11889   MP_TAC (ISPECL [`z:complex`;`u:complex->bool`] LIMPT_APPROACHABLE) THEN
11890   ASM_REWRITE_TAC [] THEN DISCH_TAC THEN POP_ASSUM (MP_TAC o SPEC `r:real`)
11891   THEN ASM_REWRITE_TAC [] THEN STRIP_TAC THEN EXISTS_TAC `x':complex`
11892   THEN ASM_MESON_TAC[IN_BALL;DIST_SYM]]);;
11893
11894 (* ------------------------------------------------------------------------- *)
11895 (* Open mapping theorem.                                                     *)
11896 (* ------------------------------------------------------------------------- *)
11897
11898 let OPEN_MAPPING_THM = prove
11899   (`!a f.
11900      open a /\ connected a /\ f holomorphic_on a /\
11901      ~(?c:complex. !z:complex. z IN a ==> f z = c)
11902      ==> (!u. open u /\ u SUBSET a ==> open(IMAGE f u))`,
11903   let LEMMA_ZERO = prove
11904   (`!f z r. f continuous_on cball(z,r) /\ f holomorphic_on ball(z,r) /\
11905       &0 < r /\ (!w. norm(z-w) =r ==> norm(f z) < norm(f w))
11906       ==> (?w. w IN ball(z,r) /\ f w = Cx(&0))`,
11907   REPEAT STRIP_TAC THEN SUBGOAL_THEN  ` ((!x:complex. x IN ball(z,r) ==>
11908   ~((f:complex->complex) x = Cx(&0))) ==> F ) ==> ( ?w:complex. w IN ball(z,r)
11909   /\ f w = Cx(&0))` MATCH_MP_TAC THENL [MESON_TAC[];
11910   STRIP_TAC THEN SUBGOAL_THEN `&0 < norm ((f:complex->complex) z)` ASSUME_TAC
11911   THENL [ASM_SIMP_TAC[COMPLEX_NORM_NZ; CENTRE_IN_BALL; SPEC `z:complex`
11912   (ASSUME`!x:complex. x IN ball(z,r) ==> ~((f:complex->complex) x = Cx(&0))`)];
11913   ALL_TAC] THEN SUBGOAL_THEN
11914     `(!x:complex. x IN cball(z,r) ==> ~((f:complex->complex) x = Cx(&0)))`
11915   ASSUME_TAC THENL [GEN_TAC THEN REWRITE_TAC [IN_CBALL;dist]
11916   THEN REWRITE_TAC[REAL_ARITH `a <= b <=> a < b \/ a = b`] THEN
11917   REWRITE_TAC [TAUT `((p \/ q) ==> r ) <=> ((p ==> r ) /\ (q ==> r))`] THEN
11918   CONJ_TAC THENL [ASM_MESON_TAC[IN_BALL;dist];
11919   DISCH_TAC THEN REWRITE_TAC[GSYM COMPLEX_NORM_ZERO] THEN MATCH_MP_TAC
11920   REAL_LT_IMP_NZ THEN MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC
11921   `norm ((f:complex->complex) z)` THEN
11922   ASM_SIMP_TAC [SPEC `z':complex` (ASSUME `!w:complex. norm (w - z) = r
11923                 ==> norm ((f:complex->complex) z) < norm (f w)`)]];
11924   ALL_TAC] THEN SUBGOAL_THEN `~(frontier(cball(z:complex,r))={})` ASSUME_TAC
11925   THENL [REWRITE_TAC[FRONTIER_CBALL;sphere;dist] THEN SUBGOAL_THEN `?x:complex.
11926   norm(z-x) = r` (fun th-> SET_TAC [MEMBER_NOT_EMPTY;th]) THEN EXISTS_TAC
11927   `z + Cx r` THEN ASM_SIMP_TAC[COMPLEX_ADD_SUB2;NORM_NEG;COMPLEX_NORM_CX;
11928   REAL_ABS_REFL;REAL_LT_IMP_LE];ALL_TAC] THEN
11929   ABBREV_TAC `g = \z. inv ((f:complex->complex) z)` THEN ASSERT_TAC
11930   `(g:complex->complex) continuous_on cball(z,r) /\ g holomorphic_on ball(z,r)`
11931    THENL [CONJ_TAC THENL [EXPAND_TAC "g" THEN
11932    REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN GEN_TAC THEN DISCH_TAC
11933   THEN MATCH_MP_TAC CONTINUOUS_COMPLEX_INV_WITHIN THEN ASM_MESON_TAC
11934   [CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN];EXPAND_TAC "g" THEN MATCH_MP_TAC
11935   HOLOMORPHIC_ON_INV THEN ASM_REWRITE_TAC[]];ALL_TAC] THEN
11936   SUBGOAL_THEN `?w:complex. w IN frontier(cball(z,r)) /\
11937                 (!x:complex. x IN frontier(cball(z,r)) ==>
11938                 norm ((f:complex->complex) w) <= norm (f x))`
11939   STRIP_ASSUME_TAC THENL [MATCH_MP_TAC CONTINUOUS_ATTAINS_INF
11940   THEN ASM_SIMP_TAC[COMPACT_FRONTIER;COMPACT_CBALL;CBALL_EQ_EMPTY;
11941   REAL_ARITH `!r:real. &0 < r ==> ~(r < &0)` ] THEN
11942   SUBGOAL_THEN `lift o (\x. norm ((f:complex->complex) x)) =
11943                  (lift o norm) o (\x. f x) ` SUBST1_TAC THENL
11944   [REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE
11945   THEN CONJ_TAC THENL [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC
11946   `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
11947   ASM_SIMP_TAC[SUBSET_TRANS;CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];
11948   ASM_MESON_TAC [CONTINUOUS_ON_LIFT_NORM; HOLOMORPHIC_ON_SUBSET;
11949   HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;SUBSET_TRANS;CLOSED_CBALL;
11950   FRONTIER_SUBSET_CLOSED]]];ALL_TAC] THEN
11951   SUBGOAL_THEN `?w:complex. norm (z-w) = r /\
11952                 norm ((f:complex->complex) w) <= norm (f z)`
11953                 (fun thm -> ASM_MESON_TAC[thm;REAL_NOT_LE])
11954   THEN EXISTS_TAC `w:complex` THEN CONJ_TAC
11955   THENL [MP_TAC (ASSUME `w:complex IN frontier (cball (z,r))`) THEN
11956   REWRITE_TAC[FRONTIER_CBALL;sphere;dist] THEN SET_TAC[];ALL_TAC] THEN
11957   SUBGOAL_THEN `&0 < norm ((f:complex->complex) w)` ASSUME_TAC THENL
11958   [REWRITE_TAC[NORM_POS_LT;COMPLEX_VEC_0] THEN MATCH_MP_TAC (ASSUME `!x.
11959   x:complex IN cball (z,r) ==> ~(f x = Cx(&0))`) THEN MATCH_MP_TAC
11960   (SET_RULE `!x:complex u s. x IN u /\ u SUBSET s ==> x IN s `) THEN
11961   EXISTS_TAC `frontier(cball(z:complex,r))` THEN
11962   ASM_SIMP_TAC[CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];ALL_TAC] THEN
11963   SUBGOAL_THEN `inv (norm ((f:complex-> complex) w)) = &1/ (norm (f w))`
11964   ASSUME_TAC THENL [MATCH_MP_TAC REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC
11965   REAL_DIV_LMUL THEN ASM_REWRITE_TAC[COMPLEX_NORM_ZERO;GSYM COMPLEX_NORM_NZ];
11966   ASSERT_TAC `?x:complex. x IN frontier(cball(z,r)) /\ (!y. y IN
11967   frontier(cball(z,r)) ==> norm ((g:complex->complex) y) <= norm (g x))`
11968   THENL [MATCH_MP_TAC CONTINUOUS_ATTAINS_SUP THEN
11969   ASM_SIMP_TAC[COMPACT_FRONTIER;
11970   COMPACT_CBALL;CBALL_EQ_EMPTY; REAL_ARITH `!r:real. &0 < r ==> ~(r < &0)`]
11971   THEN SUBGOAL_THEN `lift o (\x. norm ((g:complex->complex) x)) =
11972                           (lift o norm) o (\x. g x) ` SUBST1_TAC
11973   THENL [REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
11974   CONJ_TAC THENL [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
11975   EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX]
11976   THEN ASM_SIMP_TAC[SUBSET_TRANS;CLOSED_CBALL;
11977   FRONTIER_SUBSET_CLOSED]; ASM_MESON_TAC [CONTINUOUS_ON_LIFT_NORM;
11978   HOLOMORPHIC_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;SUBSET_TRANS;
11979   CLOSED_CBALL; FRONTIER_SUBSET_CLOSED]]];ALL_TAC] THEN SUBGOAL_THEN
11980   `&0 < norm ((f:complex->complex) x)` ASSUME_TAC THENL
11981   [REWRITE_TAC[NORM_POS_LT;COMPLEX_VEC_0] THEN MATCH_MP_TAC
11982   (ASSUME `!x. x:complex IN cball (z,r) ==> ~(f x = Cx(&0))`)
11983   THEN MATCH_MP_TAC (SET_RULE `!x:complex u s. x IN u /\ u SUBSET s
11984                 ==> x IN s `) THEN  EXISTS_TAC `frontier(cball(z:complex,r))`
11985   THEN ASM_SIMP_TAC[CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];
11986   ABBREV_TAC `B = norm ((g:complex->complex) x)`
11987   THEN SUBGOAL_THEN `norm (higher_complex_derivative 0 g z) <=
11988                 (&(FACT 0)) * B / (r pow 0) `
11989   MP_TAC THENL[MATCH_MP_TAC CAUCHY_INEQUALITY THEN
11990   ASM_REWRITE_TAC[] THEN MP_TAC
11991   (ASSUME `!y:complex. y IN frontier (cball (z,r)) ==>
11992                  norm ((g:complex ->complex) y) <= B`)
11993   THEN SIMP_TAC [FRONTIER_CBALL;sphere;dist] THEN SET_TAC[];
11994   REWRITE_TAC [higher_complex_derivative;FACT;real_pow;
11995   REAL_MUL_LID;REAL_DIV_1] THEN DISCH_TAC THEN SUBGOAL_THEN
11996         `inv (norm ((f:complex->complex) z)) <=
11997         inv (norm (f w)) ==> norm (f w) <= norm (f z)` MATCH_MP_TAC
11998   THENL [SUBGOAL_THEN `inv (norm ((f:complex-> complex) z)) =
11999                          &1/ (norm (f z))` SUBST1_TAC
12000   THENL [MATCH_MP_TAC REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC REAL_DIV_LMUL THEN
12001   ASM_SIMP_TAC[REAL_ARITH `&0 < norm ((f:complex->complex) z) ==>
12002   ~(norm (f z) = &0) `]; ASM_REWRITE_TAC[] THEN DISCH_TAC THEN SUBST1_TAC
12003   (REAL_ARITH `norm ((f:complex->complex) w)= &1 * norm (f w)`) THEN
12004    SUBST1_TAC(REAL_ARITH `norm ((f:complex->complex) z)=
12005                         &1 * norm (f z)`) THEN POP_ASSUM
12006   MP_TAC THEN MATCH_MP_TAC (TAUT `(p <=> q ) ==> ( p ==> q)`)
12007   THEN MATCH_MP_TAC RAT_LEMMA4 THEN ASM_REWRITE_TAC[]];
12008   REWRITE_TAC[GSYM COMPLEX_NORM_INV] THEN
12009   SUBGOAL_THEN `inv ((f:complex->complex) z) = g z /\ inv (f w) = g w`
12010                 (fun thm -> REWRITE_TAC[thm])
12011   THENL [ASM_MESON_TAC[];MATCH_MP_TAC (REAL_ARITH
12012   `!x y z:real. x <= y /\ y = z ==> x <= z`) THEN  EXISTS_TAC `B:real` THEN
12013   ASM_REWRITE_TAC[GSYM REAL_LE_ANTISYM] THEN CONJ_TAC THENL [EXPAND_TAC "B"
12014   THEN REWRITE_TAC[SYM (ASSUME`(\z. inv ((f:complex->complex) z)) =
12015   g`);COMPLEX_NORM_INV] THEN SUBGOAL_THEN `inv (norm ((f:complex->complex) x))
12016   = &1 / norm (f x)` (fun thm -> REWRITE_TAC[thm]) THENL [MATCH_MP_TAC
12017   REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC REAL_DIV_LMUL THEN
12018   ASM_SIMP_TAC[REAL_LT_IMP_NZ]; ASM_REWRITE_TAC[] THEN
12019   MP_TAC (SPEC `x:complex`(ASSUME`!x:complex. x IN frontier (cball (z,r))
12020                 ==> norm ((f:complex->complex) w) <= norm (f x)`))
12021   THEN REWRITE_TAC [ASSUME`x:complex IN frontier
12022   (cball (z,r))`] THEN SUBST1_TAC
12023   (REAL_ARITH `norm ((f:complex->complex) w)= &1* norm (f w)`) THEN
12024   SUBST1_TAC (REAL_ARITH `norm ((f:complex->complex) x)= &1 * norm (f x)`)
12025   THEN  DISCH_TAC THEN REWRITE_TAC[REAL_MUL_LID] THEN POP_ASSUM
12026   MP_TAC THEN MATCH_MP_TAC (TAUT `(q <=> p ) ==> ( p ==> q)`) THEN MATCH_MP_TAC
12027   (RAT_LEMMA4) THEN ASM_REWRITE_TAC[]];ASM_MESON_TAC[]]]]]]]]) in
12028   REPEAT STRIP_TAC THEN ASSUME_TAC (MESON [HOLOMORPHIC_ON_SUBSET;
12029   ASSUME `(u:complex->bool) SUBSET a`;ASSUME `f holomorphic_on a`]
12030   `f holomorphic_on u`) THEN ASM_CASES_TAC `(u:complex->bool)={}` THENL [
12031   ASM_MESON_TAC[SUBSET_EMPTY;IMAGE_EQ_EMPTY;OPEN_EMPTY];ALL_TAC] THEN
12032   SUBGOAL_THEN `!f u. ~(u={}) /\ open u /\ connected u /\
12033                  f holomorphic_on u /\
12034          ~(?c:complex. !z:complex. z IN u ==> f z=c) ==>
12035                          open (IMAGE f u)` ASSUME_TAC
12036   THENL [REPEAT STRIP_TAC THEN REWRITE_TAC[OPEN_CONTAINS_BALL;IN_IMAGE]
12037   THEN GEN_TAC THEN STRIP_TAC THEN
12038   ASSERT_TAC `(\z:complex.(f':complex->complex)z - f' x') holomorphic_on
12039   (u':complex->bool) /\ (\z:complex. f' z - f' x')x' = Cx(&0)` THENL [
12040   ASM_SIMP_TAC[HOLOMORPHIC_ON_CONST;HOLOMORPHIC_ON_SUB;
12041   BETA_THM;COMPLEX_SUB_REFL];ALL_TAC] THEN
12042   ASSERT_TAC `?s:real. &0 < s /\ ball(x',s) SUBSET u' /\
12043         (!z:complex. z IN ball(x',s) /\ ~(z = x') ==>
12044         ~((\z:complex.(f':complex->complex)z - f' x') z = Cx(&0)))` THENL [
12045   MATCH_MP_TAC ISOLATED_ZEROS THEN ASM_REWRITE_TAC[] THEN
12046     ASM_MESON_TAC[COMPLEX_SUB_0];
12047   ASSERT_TAC `?r. &0 < r /\ cball(x':complex,r) SUBSET ball(x',s)` THENL[
12048   EXISTS_TAC `s:real / &2` THEN ASM_SIMP_TAC [REAL_ARITH `&0 < s
12049   ==> &0 < s/ &2`;SUBSET;IN_CBALL;IN_BALL] THEN MP_TAC (ASSUME `&0 < s`)
12050   THEN REAL_ARITH_TAC;ALL_TAC] THEN
12051   ASSERT_TAC `cball(x',r) SUBSET u' /\
12052      (!z:complex. z IN cball(x',r) /\
12053         ~(z=x')==> ~((\z:complex.(f':complex->complex)z - f' x') z = Cx(&0)))`
12054   THENL [CONJ_TAC THENL [ASM_MESON_TAC[SUBSET_TRANS];
12055   MESON_TAC[ASSUME `!z:complex. z IN ball (x',s) /\ ~(z = x')
12056   ==> ~((\z. (f':complex->complex) z - f' x') z = Cx(&0))`;
12057   ASSUME `cball (x':complex,r) SUBSET ball (x',s)`;SUBSET]];ALL_TAC]
12058   THEN SUBGOAL_THEN `frontier (cball (x':complex,r)) SUBSET u'` ASSUME_TAC
12059   THENL [MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `cball(x':complex,r)`
12060   THEN ASM_MESON_TAC[CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];ALL_TAC] THEN
12061   ASSERT_TAC `?w. w IN frontier(cball(x':complex,r)) /\
12062         (!z. z IN frontier(cball(x',r)) ==>
12063         norm ((f':complex->complex)w - f' x') <= norm(f' z - f' x'))`
12064   THENL [MATCH_MP_TAC CONTINUOUS_ATTAINS_INF THEN
12065   ASM_SIMP_TAC[COMPACT_FRONTIER;COMPACT_CBALL;CBALL_EQ_EMPTY;
12066   REAL_ARITH `!r:real. &0 < r ==> ~(r < &0)` ] THEN
12067   CONJ_TAC THENL [REWRITE_TAC[REWRITE_RULE[sphere] FRONTIER_CBALL;dist] THEN
12068   SUBGOAL_THEN `?x:complex. norm(x'-x) = r` (fun th-> SET_TAC
12069    [MEMBER_NOT_EMPTY;th]) THEN EXISTS_TAC `x' + Cx r` THEN
12070   ASM_SIMP_TAC[COMPLEX_ADD_SUB2;NORM_NEG;COMPLEX_NORM_CX;
12071   REAL_ABS_REFL;REAL_LT_IMP_LE];
12072   SUBGOAL_THEN `lift o (\z. norm ((f':complex->complex) z - f' x')) =
12073         (lift o norm) o (\z. f' z - f' x') ` SUBST1_TAC THENL [
12074   REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
12075   ASM_MESON_TAC [CONTINUOUS_ON_LIFT_NORM; HOLOMORPHIC_ON_SUBSET;
12076   HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]]];ALL_TAC] THEN
12077   ABBREV_TAC `e = (norm ((f':complex->complex) w - f' x'))*(&1/ &3)`
12078   THEN SUBGOAL_THEN `&0<e` ASSUME_TAC THENL [
12079   EXPAND_TAC "e" THEN MATCH_MP_TAC REAL_LT_MUL THEN
12080   REWRITE_TAC [REAL_ARITH `&0 < &1 / &3`; COMPLEX_NORM_NZ] THEN
12081   SUBST1_TAC (MESON [BETA_THM] `(f':complex->complex) w - f' x' =
12082   (\w. f' w - f' x')w `) THEN FIRST_ASSUM MATCH_MP_TAC THEN
12083   CONJ_TAC THENL[MESON_TAC[ASSUME `w:complex IN frontier (cball (x',r))`;
12084   FRONTIER_SUBSET_CLOSED; CLOSED_CBALL;SET_RULE `!x:complex s t. x IN s /\
12085   s SUBSET t ==> x IN t` ];ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0] THEN
12086   REWRITE_TAC[GSYM COMPLEX_NORM_ZERO] THEN MATCH_MP_TAC REAL_LT_IMP_NZ
12087   THEN MATCH_MP_TAC (REAL_ARITH `&0 < r /\ r = norm (w:complex - x') ==>
12088   &0 < norm (w - x')`) THEN ASM_REWRITE_TAC[] THEN
12089   MP_TAC (ASSUME `w:complex IN frontier (cball (x',r))`) THEN
12090   SIMP_TAC[FRONTIER_CBALL; sphere; dist; IN_ELIM_THM; NORM_SUB]];
12091       ALL_TAC]
12092   THEN EXISTS_TAC `e:real` THEN REWRITE_TAC[ASSUME `&0<e`] THEN
12093   REWRITE_TAC[SUBSET;IN_IMAGE] THEN GEN_TAC THEN DISCH_TAC THEN
12094   ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0] THEN
12095   SUBGOAL_THEN `(?x:complex. x IN ball(x',r) /\
12096         x'' - (f':complex->complex) x = Cx(&0)) ==>
12097                 ?x. x'' - f' x = Cx(&0) /\ x IN u'` MATCH_MP_TAC THENL [
12098   STRIP_TAC THEN EXISTS_TAC `x''':complex` THEN
12099   ASM_REWRITE_TAC[] THEN
12100   MATCH_MP_TAC (SET_RULE `!x:complex u s. x IN u /\ u SUBSET s ==> x IN s`)
12101   THEN EXISTS_TAC `ball(x':complex,r)` THEN ASM_REWRITE_TAC[]
12102   THEN ASM_MESON_TAC[BALL_SUBSET_CBALL;SUBSET_TRANS];
12103   MATCH_MP_TAC LEMMA_ZERO THEN CONJ_TAC THENL
12104   [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
12105   MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN ASM_MESON_TAC
12106   [HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_SUBSET];
12107   CONJ_TAC THENL [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN ASM_MESON_TAC[
12108   HOLOMORPHIC_ON_CONST;HOLOMORPHIC_ON_SUBSET;BALL_SUBSET_CBALL];
12109   ASM_REWRITE_TAC[] THEN X_GEN_TAC `w':complex` THEN DISCH_TAC THEN
12110   MATCH_MP_TAC REAL_LTE_TRANS THEN
12111   EXISTS_TAC  `e:real` THEN CONJ_TAC THENL
12112   [MESON_TAC [NORM_SUB;dist;IN_BALL; ASSUME`x'':complex IN ball (x,e)`;
12113   ASSUME `x:complex = (f':complex->complex) x'`];
12114   MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2*e` THEN
12115   ASM_SIMP_TAC[REAL_ARITH `&0<e ==> e <= &2 * e`;NORM_SUB] THEN
12116   SUBST1_TAC (COMPLEX_RING `(f':complex->complex) w' - x'' =
12117                  f' w' -x + x - x''`) THEN
12118   MATCH_MP_TAC REAL_LE_TRANS THEN
12119   EXISTS_TAC `norm ((f':complex->complex) w' - x) - norm (x-x'')` THEN
12120   CONJ_TAC THENL [SUBST1_TAC (REAL_ARITH `&2 * e = &3 *e - e`) THEN
12121   MATCH_MP_TAC (REAL_ARITH `!x y z w:real. x<=y /\ z<w ==> x-w <= y-z`)
12122   THEN CONJ_TAC THENL [EXPAND_TAC "e" THEN
12123   ASM_REWRITE_TAC[REAL_ARITH `&3 * norm ((f':complex->complex) w - f' x') *
12124   &1 / &3 = norm (f' w - f' x')`] THEN FIRST_ASSUM MATCH_MP_TAC THEN
12125   POP_ASSUM MP_TAC THEN
12126   REWRITE_TAC[FRONTIER_CBALL; sphere; NORM_SUB; IN_ELIM_THM; dist];
12127   UNDISCH_TAC `x'':complex IN ball (x,e)` THEN
12128   REWRITE_TAC [IN_BALL;dist;ASSUME`x:complex = (f':complex->complex) x'`]];
12129   MATCH_MP_TAC (REAL_ARITH `!x y z:real. x<=y+z ==> x-z<=y`) THEN
12130   REWRITE_TAC[COMPLEX_NORM_TRIANGLE_SUB]]]]]]];ALL_TAC] THEN
12131   ASM_CASES_TAC `connected (u:complex->bool)` THENL [
12132   SUBGOAL_THEN `~(?c:complex. !z:complex. z IN u ==> f z=c)`
12133           (fun th-> ASM_MESON_TAC [th]) THEN
12134   ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0]
12135   THEN STRIP_TAC THEN ABBREV_TAC `w:complex= CHOICE u` THEN
12136   ASSUME_TAC (MESON [CHOICE_DEF;GSYM (ASSUME `CHOICE u = w:complex`);
12137   ASSUME `~(u:complex->bool = {})`] `w:complex IN u`) THEN
12138   ASSERT_TAC `w:complex limit_point_of u` THENL
12139   [MATCH_MP_TAC INTERIOR_LIMIT_POINT THEN ASM_SIMP_TAC [INTERIOR_OPEN];
12140   SUBGOAL_THEN `(\z. (f:complex->complex) z - c) holomorphic_on a` ASSUME_TAC
12141   THENL [ASM_SIMP_TAC [HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST];
12142   ASSUME_TAC (MESON [ASSUME `w:complex IN u`;ASSUME `u:complex->bool SUBSET a`;
12143   SET_RULE `w:complex IN u /\ u SUBSET a ==> w IN a`] `w:complex IN a`) THEN
12144   MP_TAC(SPECL [`\z:complex.(f:complex->complex)z - c`;
12145         `a:complex->bool`; `u:complex->bool`; `w:complex`]
12146          ANALYTIC_CONTINUATION) THEN
12147   ASM_REWRITE_TAC [] THEN MP_TAC (ASSUME `~(?c:complex. !z. z IN a ==>
12148   (f:complex->complex) z = c)`) THEN ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0;
12149   GSYM COMPLEX_SUB_RZERO] THEN ONCE_REWRITE_TAC [COMPLEX_SUB_RZERO] THEN
12150   MESON_TAC[]]];ALL_TAC] THEN SUBST1_TAC (MESON [UNIONS_COMPONENTS]
12151   `u:complex->bool = UNIONS ( components u)`) THEN
12152   REWRITE_TAC [IMAGE_UNIONS] THEN MATCH_MP_TAC OPEN_UNIONS THEN
12153   REWRITE_TAC[IN_IMAGE] THEN GEN_TAC THEN STRIP_TAC THEN
12154   FIRST_X_ASSUM SUBST1_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
12155   STRIP_ASSUME_TAC(MESON [IN_COMPONENTS;
12156   ASSUME `(x:complex->bool) IN components u`]
12157   `?w:complex. w IN u /\ x = connected_component u w`) THEN
12158   ASM_SIMP_TAC[CONNECTED_COMPONENT_EQ_EMPTY;OPEN_CONNECTED_COMPONENT;
12159   CONNECTED_CONNECTED_COMPONENT] THEN CONJ_TAC THENL
12160   [ASM_MESON_TAC [CONNECTED_COMPONENT_SUBSET;
12161   HOLOMORPHIC_ON_SUBSET]; ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0] THEN
12162   STRIP_TAC THEN ABBREV_TAC `y = CHOICE (x:complex->bool)` THEN
12163   SUBGOAL_THEN `y:complex IN x` ASSUME_TAC THENL
12164   [EXPAND_TAC "y" THEN MATCH_MP_TAC CHOICE_DEF THEN
12165   ASM_MESON_TAC [CONNECTED_COMPONENT_EQ_EMPTY];
12166   ASSUME_TAC (MESON [OPEN_COMPONENTS;ASSUME `open (u:complex->bool)`;
12167   ASSUME` x:complex->bool IN components u`] `open (x:complex->bool)`) THEN
12168   ASSERT_TAC `y:complex limit_point_of x` THENL [
12169   MATCH_MP_TAC INTERIOR_LIMIT_POINT THEN ASSUME_TAC
12170   (MESON [OPEN_COMPONENTS;ASSUME `open (u:complex->bool)`;
12171   ASSUME` x:complex->bool IN components u`] `open (x:complex->bool)`) THEN
12172   SIMP_TAC [INTERIOR_OPEN;ASSUME `open (x:complex->bool)`;
12173   ASSUME `y:complex IN x`]; SUBGOAL_THEN `(\z. (f:complex->complex) z - c)
12174   holomorphic_on a` ASSUME_TAC THENL [
12175   ASM_SIMP_TAC [HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST];
12176   SUBGOAL_THEN `x:complex->bool SUBSET a` ASSUME_TAC THENL [
12177   MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `u:complex->bool` THEN
12178   ASM_REWRITE_TAC[CONNECTED_COMPONENT_SUBSET];
12179   SUBGOAL_THEN `y:complex IN a` ASSUME_TAC THENL [
12180   MATCH_MP_TAC (SET_RULE `y:complex IN x /\ x SUBSET a ==> y IN a`)
12181   THEN ASM_REWRITE_TAC[]; MP_TAC(SPECL [`\z:complex.(f:complex->complex)z - c`;
12182   `a:complex->bool`; `x:complex->bool`; `y:complex`] ANALYTIC_CONTINUATION)
12183   THEN ASM_REWRITE_TAC [] THEN MP_TAC (ASSUME `~(?c:complex. !z. z IN a ==>
12184   (f:complex->complex) z = c)`) THEN
12185   ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0;GSYM COMPLEX_SUB_RZERO] THEN
12186   ONCE_REWRITE_TAC [COMPLEX_SUB_RZERO] THEN MESON_TAC[]]]]]]]);;
12187
12188 (* ------------------------------------------------------------------------- *)
12189 (* Maximum modulus principle.                                                *)
12190 (* ------------------------------------------------------------------------- *)
12191
12192 let MAXIMUM_MODULUS_PRINCIPLE = prove
12193   (`!f a u w.
12194       open a /\ connected a /\ f holomorphic_on a /\
12195       open u /\ u SUBSET a /\ w IN u /\
12196       (!z. z IN u ==> norm(f z) <= norm(f w))
12197       ==> (?c. !z. z IN a ==> f z = c)`,
12198   REPEAT STRIP_TAC THEN SUBGOAL_THEN
12199     `~(open (IMAGE (f:complex->complex) u))`
12200     (fun th -> ASM_MESON_TAC[th; OPEN_MAPPING_THM]) THEN
12201   REWRITE_TAC[OPEN_CONTAINS_BALL;NOT_FORALL_THM] THEN
12202   EXISTS_TAC `(f:complex->complex) w` THEN
12203   MATCH_MP_TAC (TAUT `!p q. (p /\ ~ q) ==> ~(p ==> q)`) THEN CONJ_TAC THENL
12204   [ASM_MESON_TAC[IN_IMAGE]; ALL_TAC] THEN
12205   REWRITE_TAC[NOT_EXISTS_THM;DE_MORGAN_THM;SUBSET] THEN
12206   GEN_TAC THEN ASM_CASES_TAC `~(&0 < e)` THENL
12207   [ASM_REWRITE_TAC[]; ALL_TAC] THEN POP_ASSUM MP_TAC THEN REWRITE_TAC[] THEN
12208   DISCH_TAC THEN DISJ2_TAC THEN REWRITE_TAC[NOT_FORALL_THM] THEN
12209   EXISTS_TAC `if &0 < Re((f:complex->complex) w)
12210               then f w + Cx(e / &2)
12211               else f w - Cx(e/ &2) ` THEN
12212   ABBREV_TAC `x = if &0<Re((f:complex->complex) w)
12213                   then f w + Cx(e / &2)
12214                   else f w - Cx(e / &2)` THEN
12215   MATCH_MP_TAC (TAUT `!p q. (p /\ ~ q) ==> ~(p ==> q)`) THEN CONJ_TAC THENL
12216   [REWRITE_TAC[IN_BALL;dist] THEN
12217   MATCH_MP_TAC (REAL_ARITH `!x y z:real. x = y /\ y < z ==> x < z `) THEN
12218   EXISTS_TAC `e / &2` THEN EXPAND_TAC "x" THEN COND_CASES_TAC THENL
12219   [ASM_SIMP_TAC [NORM_NEG;COMPLEX_ADD_SUB2;REAL_ARITH `&0 < e ==> e / &2 <e`;
12220                   COMPLEX_NORM_CX;REAL_ABS_REFL;
12221                   REAL_ARITH `&0 < e ==> &0 <= e / &2`];
12222   ASM_SIMP_TAC [COMPLEX_SUB_SUB2; REAL_ARITH `&0 < e ==> e / &2 <e`;
12223                   COMPLEX_NORM_CX; REAL_ABS_REFL;
12224                   REAL_ARITH `&0 < e ==> &0 <= e / &2`]]; ALL_TAC] THEN
12225   REWRITE_TAC[IN_IMAGE; NOT_EXISTS_THM; DE_MORGAN_THM] THEN
12226   GEN_TAC THEN ASM_CASES_TAC `~(x':complex IN u)` THENL
12227   [ASM_REWRITE_TAC[]; ALL_TAC] THEN DISJ1_TAC THEN POP_ASSUM MP_TAC THEN
12228   REWRITE_TAC[] THEN DISCH_TAC THEN
12229   MATCH_MP_TAC (NORM_ARITH `!x y:complex. ~(norm x=norm y) ==> ~(x=y)`) THEN
12230   REWRITE_TAC[REAL_NOT_EQ] THEN DISJ2_TAC THEN
12231   MATCH_MP_TAC REAL_LET_TRANS THEN
12232   EXISTS_TAC `norm ((f:complex->complex) w)` THEN ASM_SIMP_TAC[] THEN
12233   EXPAND_TAC "x" THEN COND_CASES_TAC THEN
12234   REWRITE_TAC [complex_norm;RE_ADD;IM_ADD; IM_CX;RE_CX;REAL_ADD_RID] THENL
12235   [MATCH_MP_TAC SQRT_MONO_LT THEN
12236   MATCH_MP_TAC (REAL_ARITH `!x:real y z. x < y ==> x + z < y + z`) THEN
12237   REWRITE_TAC[GSYM REAL_LT_SQUARE_ABS] THEN
12238   ASM_SIMP_TAC [REAL_ARITH `!x y. &0 < x /\ &0 < y
12239                           ==> abs (x+y) = abs x + abs y`;
12240                 REAL_ARITH `!x:real. &0 < x ==> &0 < x / &2`] THEN
12241   ASM_REAL_ARITH_TAC; ALL_TAC] THEN
12242   REWRITE_TAC [complex_norm;RE_SUB;IM_SUB; IM_CX;RE_CX;REAL_SUB_RZERO] THEN
12243   MATCH_MP_TAC SQRT_MONO_LT THEN
12244   MATCH_MP_TAC (REAL_ARITH `!x:real y z. x < y ==> x + z < y + z`) THEN
12245   REWRITE_TAC[GSYM REAL_LT_SQUARE_ABS] THEN POP_ASSUM MP_TAC THEN
12246   REWRITE_TAC[REAL_NOT_LT] THEN DISCH_TAC THEN
12247   ASM_SIMP_TAC [REAL_ARITH `!x y. x <= &0 /\ &0 < y
12248                             ==> abs (x - y) = abs x + abs y`;
12249               REAL_ARITH `!x. &0 < x ==> &0 < x/ &2`] THEN
12250   ASM_REAL_ARITH_TAC);;
12251
12252 let MAXIMUM_MODULUS_FRONTIER = prove
12253  (`!f s B.
12254         bounded s /\
12255         f holomorphic_on (interior s) /\
12256         f continuous_on (closure s) /\
12257         (!z. z IN frontier s ==> norm(f z) <= B)
12258         ==> !z. z IN s ==> norm(f z) <= B`,
12259   REPEAT GEN_TAC THEN STRIP_TAC THEN
12260   MP_TAC(ISPECL [`norm o (f:complex->complex)`; `closure s:complex->bool`]
12261         CONTINUOUS_ATTAINS_SUP) THEN
12262   ASM_REWRITE_TAC[COMPACT_CLOSURE; CLOSURE_EQ_EMPTY] THEN
12263   ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN
12264   ASM_SIMP_TAC[o_DEF; CONTINUOUS_ON_LIFT_NORM_COMPOSE] THEN
12265   DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC) THEN
12266   SUBGOAL_THEN `norm((f:complex->complex) z) <= B` ASSUME_TAC THENL
12267    [ALL_TAC; ASM_MESON_TAC[CLOSURE_SUBSET; SUBSET; REAL_LE_TRANS]] THEN
12268   ASM_CASES_TAC `(z:complex) IN frontier s` THEN ASM_SIMP_TAC[] THEN
12269   SUBGOAL_THEN `(z:complex) IN interior s` ASSUME_TAC THENL
12270    [ASM_MESON_TAC[frontier; IN_DIFF]; ALL_TAC] THEN
12271   MP_TAC(ISPECL [`f:complex->complex`;
12272                  `connected_component (interior s) (z:complex)`;
12273                  `connected_component (interior s) (z:complex)`;
12274                  `z:complex`]
12275         MAXIMUM_MODULUS_PRINCIPLE) THEN
12276   ASSUME_TAC(ISPECL [`interior s:complex->bool`; `z:complex`]
12277         CONNECTED_COMPONENT_SUBSET) THEN
12278   ASSUME_TAC(ISPEC `s:complex->bool` INTERIOR_SUBSET) THEN
12279   ASSUME_TAC(ISPEC `s:complex->bool` CLOSURE_SUBSET) THEN
12280   SUBGOAL_THEN `(z:complex) IN connected_component (interior s) z`
12281   ASSUME_TAC THENL [ASM_MESON_TAC[IN; CONNECTED_COMPONENT_REFL]; ALL_TAC] THEN
12282   SIMP_TAC[OPEN_CONNECTED_COMPONENT; OPEN_INTERIOR; SUBSET_REFL] THEN
12283   ASM_REWRITE_TAC[CONNECTED_CONNECTED_COMPONENT] THEN
12284   ANTS_TAC THENL
12285    [CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
12286     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_TRANS];
12287     DISCH_THEN(X_CHOOSE_TAC `c:complex`)] THEN
12288   SUBGOAL_THEN
12289    `!w. w IN closure(connected_component (interior s) z)
12290         ==> (f:complex->complex) w IN {c}`
12291   MP_TAC THENL
12292    [MATCH_MP_TAC FORALL_IN_CLOSURE THEN
12293     ASM_REWRITE_TAC[IN_SING; CLOSED_SING] THEN
12294     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
12295         CONTINUOUS_ON_SUBSET)) THEN
12296     MATCH_MP_TAC SUBSET_CLOSURE THEN
12297     ASM_MESON_TAC[CONNECTED_COMPONENT_SUBSET; SUBSET_TRANS];
12298     REWRITE_TAC[IN_SING]] THEN
12299   SUBGOAL_THEN
12300    `~(frontier(connected_component (interior s) (z:complex)) = {})`
12301   MP_TAC THENL
12302    [REWRITE_TAC[FRONTIER_EQ_EMPTY; DE_MORGAN_THM] THEN
12303     CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
12304     ASM_MESON_TAC[BOUNDED_SUBSET; NOT_BOUNDED_UNIV];
12305     REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; LEFT_IMP_EXISTS_THM]] THEN
12306   X_GEN_TAC `a:complex` THEN DISCH_TAC THEN
12307   DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN
12308   ASM_SIMP_TAC[CLOSURE_UNION_FRONTIER; IN_UNION] THEN
12309   DISCH_THEN(SUBST1_TAC o SYM) THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
12310   FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
12311    `a IN s ==> s SUBSET t ==> a IN t`)) THEN
12312   TRANS_TAC SUBSET_TRANS `frontier(interior s:complex->bool)` THEN
12313   SIMP_TAC[FRONTIER_INTERIOR_SUBSET; FRONTIER_OF_CONNECTED_COMPONENT_SUBSET]);;
12314
12315 let MAXIMUM_REAL_FRONTIER = prove
12316  (`!f s B.
12317         bounded s /\
12318         f holomorphic_on (interior s) /\
12319         f continuous_on (closure s) /\
12320         (!z. z IN frontier s ==> Re(f z) <= B)
12321         ==> !z. z IN s ==> Re(f z) <= B`,
12322   REPEAT GEN_TAC THEN STRIP_TAC THEN
12323   MP_TAC(ISPECL [`cexp o (f:complex->complex)`; `s:complex->bool`; `exp B`]
12324         MAXIMUM_MODULUS_FRONTIER) THEN
12325   ASM_SIMP_TAC[NORM_CEXP; o_THM; HOLOMORPHIC_ON_COMPOSE; HOLOMORPHIC_ON_CEXP;
12326                CONTINUOUS_ON_COMPOSE; CONTINUOUS_ON_CEXP] THEN
12327   ASM_REWRITE_TAC[REAL_EXP_MONO_LE]);;
12328
12329 (* ------------------------------------------------------------------------- *)
12330 (* Factoring out a zero according to its order.                              *)
12331 (* ------------------------------------------------------------------------- *)
12332
12333 let HOLOMORPHIC_FACTOR_ORDER_OF_ZERO = prove
12334  (`!f s n.
12335       open s /\ z IN s /\ f holomorphic_on s /\
12336       0 < n /\ ~(higher_complex_derivative n f z = Cx(&0)) /\
12337       (!m. 0 < m /\ m < n ==> higher_complex_derivative m f z = Cx(&0))
12338       ==> ?g r. &0 < r /\
12339                 g holomorphic_on ball(z,r) /\
12340                 (!w. w IN ball(z,r) ==> f(w) - f(z) = (w - z) pow n * g(w)) /\
12341                 (!w. w IN ball(z,r) ==> ~(g w = Cx(&0)))`,
12342   REPEAT STRIP_TAC THEN
12343   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12344   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12345   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12346   SUBGOAL_THEN
12347    `!w. w IN ball(z,r)
12348         ==> ((\m. higher_complex_derivative m f z / Cx(&(FACT m)) *
12349                   (w - z) pow m) sums f(w) - f(z)) (from n)`
12350   ASSUME_TAC THENL
12351    [GEN_TAC THEN DISCH_TAC THEN
12352     MP_TAC(ISPECL [`f:complex->complex`; `z:complex`; `w:complex`; `r:real`]
12353         HOLOMORPHIC_POWER_SERIES) THEN ASM_REWRITE_TAC[] THEN
12354     ANTS_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
12355     DISCH_THEN(MP_TAC o SPEC `1` o
12356       MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
12357     CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[VSUM_SING_NUMSEG] THEN
12358     REWRITE_TAC[FACT; higher_complex_derivative; COMPLEX_DIV_1] THEN
12359     REWRITE_TAC[complex_pow; COMPLEX_MUL_RID] THEN
12360     ASM_CASES_TAC `n = 1` THEN ASM_REWRITE_TAC[] THEN
12361     DISCH_THEN(MP_TAC o SPEC `n:num` o
12362       MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
12363     ANTS_TAC THENL [ASM_ARITH_TAC; MATCH_MP_TAC EQ_IMP] THEN
12364     AP_THM_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC(COMPLEX_RING
12365      `p = Cx(&0) ==> w - z - p = w - z`) THEN
12366     REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC VSUM_EQ_0 THEN
12367     REWRITE_TAC[IN_NUMSEG; COMPLEX_VEC_0] THEN REPEAT STRIP_TAC THEN
12368     REWRITE_TAC[COMPLEX_ENTIRE; complex_div] THEN REPEAT DISJ1_TAC THEN
12369     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC;
12370     ALL_TAC] THEN
12371   ABBREV_TAC
12372    `g = \w. infsum (from 0)
12373                    (\m. higher_complex_derivative (m + n) f z /
12374                         Cx(&(FACT(m + n))) * (w - z) pow m)` THEN
12375   SUBGOAL_THEN
12376    `!w. w IN ball(z,r)
12377         ==> ((\m. higher_complex_derivative (m + n) f z /
12378                   Cx(&(FACT(m + n))) * (w - z) pow m)
12379              sums g(w)) (from 0)`
12380   (LABEL_TAC "*") THENL
12381    [REPEAT STRIP_TAC THEN EXPAND_TAC "g" THEN REWRITE_TAC[SUMS_INFSUM] THEN
12382     ASM_CASES_TAC `w:complex = z` THENL
12383      [MATCH_MP_TAC SUMMABLE_FROM_ELSEWHERE THEN EXISTS_TAC `1` THEN
12384       MATCH_MP_TAC SUMMABLE_EQ THEN EXISTS_TAC `\n:num. Cx(&0)` THEN
12385       REWRITE_TAC[SUMMABLE_0; GSYM COMPLEX_VEC_0] THEN
12386       ASM_SIMP_TAC[IN_FROM; COMPLEX_VEC_0; COMPLEX_SUB_REFL;
12387                    COMPLEX_POW_ZERO; LE_1; COMPLEX_MUL_RZERO];
12388       SUBGOAL_THEN
12389        `!x:complex m. x * (w - z) pow m =
12390                       (x * (w - z) pow (m + n)) / (w - z) pow n`
12391        (fun th -> ONCE_REWRITE_TAC[th])
12392       THENL
12393        [REPEAT GEN_TAC THEN
12394         SIMP_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC; COMPLEX_POW_ADD] THEN
12395         ASM_SIMP_TAC[COMPLEX_MUL_RINV; COMPLEX_POW_EQ_0; COMPLEX_SUB_0] THEN
12396         REWRITE_TAC[COMPLEX_MUL_RID];
12397         MATCH_MP_TAC SUMMABLE_COMPLEX_DIV THEN
12398         MP_TAC(GEN `a:num->complex`
12399           (ISPECL [`n:num`; `a:num->complex`] SUMMABLE_REINDEX)) THEN
12400         DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN
12401         REWRITE_TAC[summable; ADD_CLAUSES] THEN ASM_MESON_TAC[]]];
12402     ALL_TAC] THEN
12403   SUBGOAL_THEN `g holomorphic_on ball(z,r)` ASSUME_TAC THENL
12404    [MATCH_MP_TAC POWER_SERIES_HOLOMORPHIC THEN
12405     EXISTS_TAC `\m. higher_complex_derivative (m + n) f z /
12406                     Cx(&(FACT (m + n)))` THEN
12407     EXISTS_TAC `from 0` THEN ASM_SIMP_TAC[];
12408     ALL_TAC] THEN
12409   SUBGOAL_THEN
12410    `!w. w IN ball(z,r) ==> f w - f z = (w - z) pow n * g(w)`
12411   ASSUME_TAC THENL
12412    [REPEAT STRIP_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
12413     EXISTS_TAC `\m. higher_complex_derivative m f z / Cx(&(FACT m)) *
12414                     (w - z) pow m` THEN
12415     EXISTS_TAC `from n` THEN ASM_SIMP_TAC[] THEN
12416     GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [ARITH_RULE `n = 0 + n`] THEN
12417     REWRITE_TAC[GSYM SUMS_REINDEX] THEN REWRITE_TAC[COMPLEX_POW_ADD] THEN
12418     ONCE_REWRITE_TAC[COMPLEX_RING `a * b * c:complex = c * a * b`] THEN
12419     MATCH_MP_TAC SERIES_COMPLEX_LMUL THEN ASM_SIMP_TAC[];
12420     ALL_TAC] THEN
12421   EXISTS_TAC `g:complex->complex` THEN
12422   SUBGOAL_THEN `(g:complex->complex) continuous_on ball(z,r)` MP_TAC THENL
12423    [ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]; ALL_TAC] THEN
12424   REWRITE_TAC[continuous_on] THEN
12425   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
12426   ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN DISCH_THEN(MP_TAC o SPEC
12427    `norm((g:complex->complex) z)`) THEN
12428   ANTS_TAC THENL
12429    [REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
12430     ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN
12431     DISCH_THEN(MP_TAC o SPEC `1` o
12432       MATCH_MP (REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
12433     ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
12434     CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[VSUM_SING_NUMSEG] THEN
12435     DISCH_THEN(MP_TAC o SPEC `Cx(&0)` o
12436         MATCH_MP(REWRITE_RULE[IMP_CONJ] SERIES_UNIQUE)) THEN
12437     REWRITE_TAC[complex_pow; ADD_CLAUSES; COMPLEX_MUL_RID] THEN ANTS_TAC THENL
12438      [REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC SUMS_0 THEN
12439       SIMP_TAC[IN_FROM; LE_1; COMPLEX_SUB_REFL; COMPLEX_POW_ZERO] THEN
12440       REWRITE_TAC[COMPLEX_VEC_0; COMPLEX_MUL_RZERO];
12441       SIMP_TAC[COMPLEX_SUB_0; NORM_POS_LT] THEN DISCH_THEN(K ALL_TAC) THEN
12442       ASM_REWRITE_TAC[COMPLEX_VEC_0; complex_div; COMPLEX_ENTIRE] THEN
12443       REWRITE_TAC[COMPLEX_INV_EQ_0; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ]];
12444     ALL_TAC] THEN
12445   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
12446   EXISTS_TAC `min d r:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
12447   SUBGOAL_THEN `ball(z,min d r) SUBSET ball(z:complex,r)` ASSUME_TAC THENL
12448    [SIMP_TAC[SUBSET_BALL; REAL_ARITH `min d r <= r`]; ALL_TAC] THEN
12449   CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
12450   CONJ_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
12451   REWRITE_TAC[IN_BALL; REAL_LT_MIN; GSYM COMPLEX_VEC_0] THEN
12452   RULE_ASSUM_TAC(REWRITE_RULE[IN_BALL]) THEN
12453   ASM_MESON_TAC[DIST_SYM; NORM_ARITH `dist(x,y) < norm y ==> ~(x = vec 0)`]);;
12454
12455 let HOLOMORPHIC_FACTOR_ORDER_OF_ZERO_STRONG = prove
12456  (`!f s n z.
12457       open s /\ z IN s /\ f holomorphic_on s /\
12458       0 < n /\ ~(higher_complex_derivative n f z = Cx(&0)) /\
12459       (!m. 0 < m /\ m < n ==> higher_complex_derivative m f z = Cx(&0))
12460       ==> ?g r. &0 < r /\
12461                 g holomorphic_on ball(z,r) /\
12462                 (!w. w IN ball(z,r)
12463                      ==> f(w) - f(z) = ((w - z) * g w) pow n) /\
12464                 (!w. w IN ball(z,r) ==> ~(g w = Cx(&0)))`,
12465   REPEAT STRIP_TAC THEN
12466   MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`]
12467         HOLOMORPHIC_FACTOR_ORDER_OF_ZERO) THEN
12468   ASM_REWRITE_TAC[] THEN
12469   ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN MATCH_MP_TAC MONO_EXISTS THEN
12470   X_GEN_TAC `r:real` THEN
12471   DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
12472   MP_TAC(ISPECL
12473    [`\z. complex_derivative g z / g z`; `ball(z:complex,r)`;
12474     `{}:complex->bool`] HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
12475   REWRITE_TAC[CONVEX_BALL; FINITE_RULES; DIFF_EMPTY] THEN ANTS_TAC THENL
12476    [SIMP_TAC[GSYM HOLOMORPHIC_ON_OPEN; OPEN_BALL;
12477              INTERIOR_OPEN; complex_differentiable] THEN
12478     MATCH_MP_TAC(TAUT `q /\ (q ==> p) ==> p /\ q`) THEN
12479     REWRITE_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
12480     ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_BALL;
12481                  HOLOMORPHIC_ON_DIV; ETA_AX];
12482     SIMP_TAC[OPEN_BALL; HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN] THEN
12483     DISCH_THEN(X_CHOOSE_THEN `h:complex->complex` STRIP_ASSUME_TAC)] THEN
12484   MP_TAC(ISPECL [`\z:complex. cexp(h z) / g z`; `ball(z:complex,r)`]
12485     HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
12486   REWRITE_TAC[OPEN_BALL; CONNECTED_BALL] THEN ANTS_TAC THENL
12487    [X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
12488     SUBGOAL_THEN
12489      `Cx(&0) = ((complex_derivative g w / g w * cexp(h w)) * g w -
12490                 cexp(h w) * complex_derivative g w) / g w pow 2`
12491     SUBST1_TAC THENL
12492      [ASM_SIMP_TAC[COMPLEX_FIELD
12493        `~(z = Cx(&0)) ==> (d / z * e) * z = e * d`] THEN
12494       SIMPLE_COMPLEX_ARITH_TAC;
12495       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DIV_AT THEN
12496       ASM_SIMP_TAC[] THEN CONJ_TAC THENL
12497        [GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
12498         ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
12499         MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
12500         ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_CEXP];
12501         ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; complex_differentiable;
12502           OPEN_BALL; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE]]];
12503     DISCH_THEN(X_CHOOSE_THEN `c:complex` MP_TAC) THEN
12504     ASM_CASES_TAC `c = Cx(&0)` THENL
12505      [ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
12506        `~(x = Cx(&0)) /\ ~(y = Cx(&0)) ==> ~(x / y = Cx(&0))`] THEN
12507       ASM_MESON_TAC[];
12508       ASM_SIMP_TAC[COMPLEX_FIELD
12509        `~(y = Cx(&0)) /\ ~(z = Cx(&0))
12510         ==> (x / y = z <=> y = inv(z) * x)`] THEN
12511       DISCH_TAC THEN EXISTS_TAC
12512        `\z:complex. cexp((clog(inv c) + h z) / Cx(&n))` THEN
12513       REWRITE_TAC[CEXP_NZ; GSYM CEXP_N; COMPLEX_POW_MUL] THEN
12514       ASM_SIMP_TAC[COMPLEX_DIV_LMUL; CX_INJ; REAL_OF_NUM_EQ; LE_1] THEN
12515       ASM_SIMP_TAC[CEXP_ADD; CEXP_CLOG; COMPLEX_INV_EQ_0] THEN
12516       GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
12517       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
12518       REWRITE_TAC[HOLOMORPHIC_ON_CEXP] THEN
12519       MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
12520       ASM_SIMP_TAC[HOLOMORPHIC_ON_CONST; CX_INJ; REAL_OF_NUM_EQ; LE_1] THEN
12521       MATCH_MP_TAC HOLOMORPHIC_ON_ADD THEN
12522       REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
12523       ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL]]]);;
12524
12525 let HOLOMORPHIC_FACTOR_ZERO_NONCONSTANT = prove
12526  (`!f s z.
12527         open s /\ connected s /\ z IN s /\
12528         f holomorphic_on s /\ f(z) = Cx(&0) /\ ~(?c. !w. w IN s ==> f w = c)
12529         ==> ?g r n.
12530                 0 < n /\ &0 < r /\ ball(z,r) SUBSET s /\
12531                 g holomorphic_on ball(z,r) /\
12532                 (!w. w IN ball(z,r) ==> f w = (w - z) pow n * g w) /\
12533                 (!w. w IN ball(z,r) ==> ~(g w = Cx(&0)))`,
12534   REPEAT STRIP_TAC THEN
12535   ASM_CASES_TAC `!n. 0 < n ==> higher_complex_derivative n f z = Cx(&0)` THENL
12536    [MP_TAC(ISPECL
12537      [`f:complex->complex`; `s:complex->bool`; `z:complex`]
12538      HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED) THEN
12539     ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[];
12540     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12541     DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12542     DISCH_THEN(X_CHOOSE_THEN `r0:real` STRIP_ASSUME_TAC) THEN
12543     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN
12544     GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
12545     REWRITE_TAC[NOT_IMP; GSYM IMP_CONJ_ALT] THEN
12546     DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN
12547     MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`]
12548         HOLOMORPHIC_FACTOR_ORDER_OF_ZERO) THEN
12549     ASM_REWRITE_TAC[COMPLEX_SUB_RZERO] THEN MATCH_MP_TAC MONO_EXISTS THEN
12550     X_GEN_TAC `g:complex->complex` THEN
12551     DISCH_THEN(X_CHOOSE_THEN `r1:real` STRIP_ASSUME_TAC) THEN
12552     EXISTS_TAC `min r0 r1:real` THEN EXISTS_TAC `n:num` THEN
12553     ASM_SIMP_TAC[BALL_MIN_INTER; IN_INTER; REAL_LT_MIN] THEN CONJ_TAC THENL
12554      [ASM SET_TAC[];
12555       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
12556         HOLOMORPHIC_ON_SUBSET)) THEN
12557       ASM SET_TAC[]]]);;
12558
12559 let HOLOMORPHIC_LOWER_BOUND_DIFFERENCE = prove
12560  (`!f s z.
12561         open s /\ connected s /\ z IN s /\ f holomorphic_on s /\
12562         ~(!w. w IN s ==> f w = f z)
12563         ==> ?k n r. &0 < k /\ &0 < r /\ ball(z,r) SUBSET s /\
12564                     !w. w IN ball(z,r)
12565                         ==> k * norm(w - z) pow n <= norm(f w - f z)`,
12566   REPEAT STRIP_TAC THEN
12567   MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `z:complex`]
12568         HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED) THEN
12569   ASM_REWRITE_TAC[NOT_FORALL_THM] THEN GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
12570   REWRITE_TAC[NOT_IMP; IMP_IMP] THEN ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
12571   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:num` THEN STRIP_TAC THEN
12572   MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`]
12573         HOLOMORPHIC_FACTOR_ORDER_OF_ZERO) THEN
12574   ASM_SIMP_TAC[LEFT_IMP_EXISTS_THM] THEN
12575   MAP_EVERY X_GEN_TAC [`g:complex->complex`; `r:real`] THEN STRIP_TAC THEN
12576   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12577   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12578   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
12579   ABBREV_TAC `d = min e r / &2` THEN
12580   SUBGOAL_THEN `ball(z,d) SUBSET cball(z,d) /\
12581                 cball(z:complex,d) SUBSET ball(z,r) /\
12582                 cball(z,d) SUBSET ball(z,e)` ASSUME_TAC THENL
12583    [REWRITE_TAC[SUBSET_BALLS; DIST_REFL] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
12584   MP_TAC(ISPECL [`IMAGE (g:complex->complex) (cball(z,d))`; `Cx(&0)`]
12585         DISTANCE_ATTAINS_INF) THEN
12586   REWRITE_TAC[EXISTS_IN_IMAGE; FORALL_IN_IMAGE; IMAGE_EQ_EMPTY] THEN
12587   REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_SUB; CBALL_EQ_EMPTY] THEN
12588   ANTS_TAC THENL
12589    [CONJ_TAC THENL [MATCH_MP_TAC COMPACT_IMP_CLOSED; ASM_REAL_ARITH_TAC] THEN
12590     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN REWRITE_TAC[COMPACT_CBALL] THEN
12591     ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
12592                   SUBSET_TRANS];
12593     REWRITE_TAC[COMPLEX_SUB_RZERO] THEN
12594     DISCH_THEN(X_CHOOSE_THEN `p:complex` STRIP_ASSUME_TAC)] THEN
12595   MAP_EVERY EXISTS_TAC [`norm((g:complex->complex) p)`; `d:real`] THEN
12596   ASM_REWRITE_TAC[COMPLEX_NORM_NZ] THEN REPEAT CONJ_TAC THENL
12597    [ASM SET_TAC[]; ASM_REAL_ARITH_TAC; ASM SET_TAC[]; ALL_TAC] THEN
12598   X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
12599   RULE_ASSUM_TAC(REWRITE_RULE[SUBSET]) THEN ASM_SIMP_TAC[] THEN
12600   ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
12601   REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_POW] THEN
12602   MATCH_MP_TAC REAL_LE_LMUL THEN SIMP_TAC[REAL_POW_LE; NORM_POS_LE] THEN
12603   FIRST_X_ASSUM MATCH_MP_TAC THEN ASM SET_TAC[]);;
12604
12605 let POLE_AT_INFINITY = prove
12606  (`!f l. f holomorphic_on (:complex) /\ ((inv o f) --> l) at_infinity
12607          ==> ?a n. !z. f(z) = vsum(0..n) (\i. a i * z pow i)`,
12608   REPEAT GEN_TAC THEN ASM_CASES_TAC `l = Cx(&0)` THENL
12609    [FIRST_X_ASSUM SUBST1_TAC THEN STRIP_TAC;
12610     REPEAT STRIP_TAC THEN FIRST_ASSUM(MP_TAC o MATCH_MP
12611      (REWRITE_RULE[IMP_CONJ] LIM_COMPLEX_INV)) THEN
12612     ASM_REWRITE_TAC[o_THM; COMPLEX_INV_INV; ETA_AX] THEN DISCH_TAC THEN
12613     MP_TAC(ISPECL [`f:complex->complex`; `inv(l:complex)`]
12614         LIOUVILLE_WEAK) THEN
12615     ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
12616     EXISTS_TAC `(\n. inv l):num->complex` THEN EXISTS_TAC `0` THEN
12617     REWRITE_TAC[VSUM_CLAUSES_NUMSEG; complex_pow; COMPLEX_MUL_RID]] THEN
12618   ASM_CASES_TAC
12619    `?r. &0 < r /\
12620         !z. z IN ball(Cx(&0),r) DELETE Cx(&0) ==> ~(f(inv z) = Cx(&0))`
12621   THENL
12622    [FIRST_X_ASSUM(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12623     MP_TAC(ISPECL [`inv o (f:complex->complex) o inv`; `Cx(&0)`;
12624                    `ball(Cx(&0),r)`] HOLOMORPHIC_ON_EXTEND_BOUNDED) THEN
12625     ASM_SIMP_TAC[INTERIOR_OPEN; OPEN_BALL; CENTRE_IN_BALL] THEN ANTS_TAC THENL
12626      [REWRITE_TAC[o_DEF] THEN MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN
12627       ASM_REWRITE_TAC[] THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
12628       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
12629        [ALL_TAC; ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV]] THEN
12630       GEN_REWRITE_TAC LAND_CONV [GSYM ETA_AX] THEN
12631       MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN
12632       REWRITE_TAC[HOLOMORPHIC_ON_ID] THEN SET_TAC[];
12633       ALL_TAC] THEN
12634     MATCH_MP_TAC(TAUT `q /\ (p ==> r) ==> (p <=> q) ==> r`) THEN CONJ_TAC THENL
12635      [EXISTS_TAC `&1` THEN FIRST_X_ASSUM(MP_TAC o
12636         GEN_REWRITE_RULE I [LIM_AT_INFINITY_COMPLEX_0]) THEN
12637       REWRITE_TAC[tendsto] THEN DISCH_THEN(MP_TAC o SPEC `&1`) THEN
12638       REWRITE_TAC[REAL_LT_01] THEN
12639       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
12640       REWRITE_TAC[o_THM; dist; COMPLEX_SUB_RZERO] THEN CONV_TAC NORM_ARITH;
12641       REWRITE_TAC[o_THM] THEN
12642       DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC)] THEN
12643     SUBGOAL_THEN `(g:complex->complex)(Cx(&0)) = Cx(&0)` ASSUME_TAC THENL
12644      [MATCH_MP_TAC(ISPEC `at(Cx(&0))` LIM_UNIQUE) THEN
12645       EXISTS_TAC `g:complex->complex` THEN REWRITE_TAC[TRIVIAL_LIMIT_AT] THEN
12646       CONJ_TAC THENL
12647        [REWRITE_TAC[GSYM CONTINUOUS_AT] THEN
12648         ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; OPEN_BALL;
12649                       CENTRE_IN_BALL; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
12650         MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
12651         EXISTS_TAC `inv o (f:complex->complex) o inv` THEN
12652         EXISTS_TAC `ball(Cx(&0),r)` THEN
12653         ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; o_ASSOC; o_THM;
12654                         GSYM LIM_AT_INFINITY_COMPLEX_0] THEN
12655         ASM SET_TAC[]];
12656       ALL_TAC] THEN
12657     EXISTS_TAC`\k. higher_complex_derivative k f (Cx(&0)) / Cx(&(FACT k))` THEN
12658     MP_TAC(ISPECL [`g:complex->complex`; `ball(Cx(&0),r)`; `Cx(&0)`]
12659         HOLOMORPHIC_LOWER_BOUND_DIFFERENCE) THEN
12660     ASM_REWRITE_TAC[OPEN_BALL; CONNECTED_BALL; CENTRE_IN_BALL] THEN
12661     ANTS_TAC THENL
12662      [SUBGOAL_THEN `~(ball(Cx(&0),r) DELETE Cx(&0) = {})` MP_TAC THENL
12663        [ALL_TAC; ASM SET_TAC[COMPLEX_INV_EQ_0]] THEN
12664       REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; COMPLEX_IN_BALL_0; IN_DELETE] THEN
12665       EXISTS_TAC `Cx(r / &2)` THEN REWRITE_TAC[COMPLEX_NORM_CX; CX_INJ] THEN
12666       ASM_REAL_ARITH_TAC;
12667       REWRITE_TAC[COMPLEX_SUB_RZERO]] THEN
12668     ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN MATCH_MP_TAC MONO_EXISTS THEN
12669     X_GEN_TAC `n:num` THEN DISCH_TAC THEN
12670     MATCH_MP_TAC LIOUVILLE_POLYNOMIAL THEN
12671     FIRST_X_ASSUM(X_CHOOSE_THEN `B:real` (X_CHOOSE_THEN `e:real`
12672         STRIP_ASSUME_TAC)) THEN
12673     MAP_EVERY EXISTS_TAC [`&2 / e`; `inv(B:real)`] THEN
12674     ASM_REWRITE_TAC[] THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
12675     SUBGOAL_THEN `inv(z) IN ball(Cx(&0),e) DELETE Cx(&0)` ASSUME_TAC THENL
12676      [REWRITE_TAC[IN_DELETE; COMPLEX_INV_EQ_0; COMPLEX_IN_BALL_0] THEN
12677       REWRITE_TAC[COMPLEX_NORM_INV] THEN CONJ_TAC THENL
12678        [MATCH_MP_TAC REAL_LT_LINV THEN ASM_REWRITE_TAC[] THEN
12679         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
12680          `&2 / e <= z ==> &0 < inv e ==> inv e < z`)) THEN
12681         ASM_REWRITE_TAC[REAL_LT_INV_EQ];
12682         UNDISCH_TAC `&2 / e <= norm(z:complex)` THEN
12683         ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
12684         SIMP_TAC[COMPLEX_NORM_0; REAL_NOT_LE] THEN
12685         ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]];
12686       ALL_TAC] THEN
12687     SUBGOAL_THEN `inv(z) IN ball(Cx(&0),r) DELETE Cx(&0)` ASSUME_TAC THENL
12688      [ASM SET_TAC[]; ALL_TAC] THEN
12689     SUBGOAL_THEN `(f:complex->complex) z = inv(g(inv z))` SUBST1_TAC THENL
12690      [ASM_SIMP_TAC[COMPLEX_INV_INV]; ALL_TAC] THEN
12691     GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o RAND_CONV)
12692      [GSYM COMPLEX_INV_INV] THEN
12693     ONCE_REWRITE_TAC[COMPLEX_NORM_INV] THEN
12694     REWRITE_TAC[REAL_POW_INV; GSYM REAL_INV_MUL] THEN
12695     MATCH_MP_TAC REAL_LE_INV2 THEN
12696     CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
12697     MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[] THEN
12698     MATCH_MP_TAC REAL_POW_LT THEN REWRITE_TAC[COMPLEX_NORM_NZ] THEN
12699     ASM SET_TAC[];
12700     FIRST_X_ASSUM(MP_TAC o
12701       GEN_REWRITE_RULE I [LIM_AT_INFINITY_COMPLEX_0]) THEN
12702     REWRITE_TAC[LIM_AT; o_THM; dist; COMPLEX_SUB_RZERO] THEN
12703     DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN
12704     DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12705     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN
12706     DISCH_THEN(MP_TAC o SPEC `r:real`) THEN ASM_REWRITE_TAC[] THEN
12707     REWRITE_TAC[NOT_FORALL_THM; NOT_IMP; IN_DELETE; COMPLEX_IN_BALL_0] THEN
12708     DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC) THEN
12709     MP_TAC(ISPECL [`f:complex->complex`; `Cx(&0)`] LIOUVILLE_WEAK) THEN
12710     ANTS_TAC THENL
12711      [ASM_REWRITE_TAC[];
12712       DISCH_TAC THEN MAP_EVERY EXISTS_TAC [`\n:num. Cx(&0)`; `0`] THEN
12713       ASM_REWRITE_TAC[VSUM_CLAUSES_NUMSEG; COMPLEX_MUL_LZERO]] THEN
12714     REWRITE_TAC[LIM_AT_INFINITY_COMPLEX_0] THEN
12715     MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
12716     EXISTS_TAC `r:real` THEN ASM_REWRITE_TAC[dist; COMPLEX_SUB_RZERO] THEN
12717     X_GEN_TAC `w:complex` THEN REWRITE_TAC[o_THM; COMPLEX_NORM_NZ] THEN
12718     STRIP_TAC THEN
12719     MP_TAC(ISPEC
12720      `IMAGE ((f:complex->complex) o inv) (ball(Cx(&0),r) DELETE Cx(&0))`
12721         CONNECTED_CLOSED) THEN
12722     MATCH_MP_TAC(TAUT `p /\ (q ==> r) ==> (p <=> q) ==> r`) THEN
12723     CONJ_TAC THENL
12724      [MATCH_MP_TAC CONNECTED_CONTINUOUS_IMAGE THEN
12725       SIMP_TAC[CONNECTED_OPEN_DELETE; OPEN_BALL; CONNECTED_BALL;
12726                DIMINDEX_2; LE_REFL] THEN
12727       MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
12728        [GEN_REWRITE_TAC LAND_CONV [GSYM ETA_AX] THEN
12729         MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_INV THEN
12730         REWRITE_TAC[CONTINUOUS_ON_ID] THEN SET_TAC[];
12731         ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
12732                       HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV]];
12733       ALL_TAC] THEN
12734     REWRITE_TAC[NOT_EXISTS_THM] THEN DISCH_THEN(MP_TAC o SPECL
12735      [`{Cx(&0)}`; `(:complex) DIFF ball(Cx(&0),&1)`]) THEN
12736     SIMP_TAC[CLOSED_SING; CLOSED_DIFF; CLOSED_UNIV; OPEN_BALL] THEN
12737     SIMP_TAC[CENTRE_IN_BALL; REAL_LT_01; SET_RULE
12738       `a IN s ==> {a} INTER (UNIV DIFF s) INTER t = {}`] THEN
12739     REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; SET_RULE
12740      `s INTER IMAGE f t = {} <=> !x. x IN t ==> ~(f x IN s)`] THEN
12741     REWRITE_TAC[IN_SING; IN_DIFF; IN_UNIV; IN_UNION] THEN
12742     ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN DISCH_TAC THEN
12743     REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL
12744      [REWRITE_TAC[IN_DELETE; COMPLEX_IN_BALL_0; GSYM COMPLEX_NORM_NZ] THEN
12745       X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
12746       FIRST_X_ASSUM(MP_TAC o SPEC `x:complex`) THEN
12747       MATCH_MP_TAC(TAUT `(~q /\ ~r ==> ~p)   ==> p ==> q \/ r`) THEN
12748       ASM_REWRITE_TAC[COMPLEX_NORM_INV; REAL_NOT_LT] THEN
12749       STRIP_TAC THEN MATCH_MP_TAC REAL_INV_1_LE THEN
12750       ASM_SIMP_TAC[REAL_LT_IMP_LE; COMPLEX_NORM_NZ];
12751       REWRITE_TAC[COMPLEX_IN_BALL_0; IN_DELETE] THEN ASM SET_TAC[];
12752       DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
12753       ASM_REWRITE_TAC[COMPLEX_IN_BALL_0; IN_DELETE] THEN DISCH_TAC THEN
12754       FIRST_X_ASSUM(MP_TAC o SPEC `w:complex`) THEN
12755       ASM_REWRITE_TAC[COMPLEX_NORM_NZ; REAL_NOT_LT; COMPLEX_NORM_INV] THEN
12756       MATCH_MP_TAC REAL_INV_1_LE THEN
12757       ASM_SIMP_TAC[REAL_LT_IMP_LE; COMPLEX_NORM_NZ]]]);;
12758
12759 (* ------------------------------------------------------------------------- *)
12760 (* Entire proper functions C->C are precisely the non-trivial polynomials.   *)
12761 (* ------------------------------------------------------------------------- *)
12762
12763 let PROPER_MAP_COMPLEX_POLYFUN = prove
12764  (`!s k c n. closed s /\ compact k /\ (?i. i IN 1..n /\ ~(c i = Cx(&0)))
12765              ==> compact {z | z IN s /\ vsum(0..n) (\i. c i * z pow i) IN k}`,
12766   REPEAT STRIP_TAC THEN
12767   MP_TAC(ISPECL [`c:num->complex`; `n:num`] COMPLEX_POLYFUN_EXTREMAL) THEN
12768   DISCH_THEN DISJ_CASES_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
12769   REWRITE_TAC[SET_RULE `{x | x IN s /\ P x} = s INTER {x | P x}`] THEN
12770   MATCH_MP_TAC CLOSED_INTER_COMPACT THEN ASM_REWRITE_TAC[] THEN
12771   REWRITE_TAC[COMPACT_EQ_BOUNDED_CLOSED] THEN CONJ_TAC THENL
12772    [FIRST_X_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_BOUNDED) THEN
12773     REWRITE_TAC[BOUNDED_POS] THEN DISCH_THEN(X_CHOOSE_TAC `B:real`) THEN
12774     FIRST_X_ASSUM(MP_TAC o SPEC `B + &1`) THEN
12775     REWRITE_TAC[EVENTUALLY_AT_INFINITY_POS; real_ge; IN_ELIM_THM] THEN
12776     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `c:real` THEN
12777     MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
12778     MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `z:complex` THEN
12779     DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
12780     FIRST_X_ASSUM(MP_TAC o SPEC
12781       `vsum(0..n) (\i. c i * z pow i)` o CONJUNCT2) THEN
12782     ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC;
12783     MATCH_MP_TAC CONTINUOUS_CLOSED_PREIMAGE_UNIV THEN
12784     ASM_SIMP_TAC[COMPACT_IMP_CLOSED] THEN
12785     GEN_TAC THEN MATCH_MP_TAC CONTINUOUS_VSUM THEN
12786     REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN REPEAT STRIP_TAC THEN
12787     MATCH_MP_TAC CONTINUOUS_COMPLEX_LMUL THEN
12788     MATCH_MP_TAC CONTINUOUS_COMPLEX_POW THEN
12789     REWRITE_TAC[CONTINUOUS_AT_ID]]);;
12790
12791 let PROPER_MAP_COMPLEX_POLYFUN_UNIV = prove
12792  (`!k c n. compact k /\ (?i. i IN 1..n /\ ~(c i = Cx(&0)))
12793            ==> compact {z | vsum(0..n) (\i. c i * z pow i) IN k}`,
12794   MP_TAC(SPEC `(:complex)` PROPER_MAP_COMPLEX_POLYFUN) THEN
12795   REWRITE_TAC[IN_UNIV; CLOSED_UNIV]);;
12796
12797 let PROPER_MAP_COMPLEX_POLYFUN_EQ = prove
12798  (`!f. f holomorphic_on (:complex)
12799        ==> ((!k. compact k ==> compact {z | f z IN k}) <=>
12800             ?c n. 0 < n /\ ~(c n = Cx(&0)) /\
12801                   f = \z. vsum(0..n) (\i. c i * z pow i))`,
12802   REPEAT STRIP_TAC THEN EQ_TAC THEN STRIP_TAC THENL
12803    [ALL_TAC;
12804     REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
12805     MATCH_MP_TAC PROPER_MAP_COMPLEX_POLYFUN_UNIV THEN
12806     ASM_REWRITE_TAC[IN_NUMSEG] THEN ASM_MESON_TAC[LE_REFL; LE_1]] THEN
12807   MP_TAC(ISPECL [`f:complex->complex`; `Cx(&0)`] POLE_AT_INFINITY) THEN
12808   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
12809    [REWRITE_TAC[LIM_AT_INFINITY; real_ge] THEN X_GEN_TAC `e:real` THEN
12810     DISCH_TAC THEN REWRITE_TAC[GSYM COMPLEX_VEC_0; DIST_0; o_THM] THEN
12811     FIRST_X_ASSUM(MP_TAC o SPEC `cball(vec 0:complex,inv e)`) THEN
12812     REWRITE_TAC[COMPACT_CBALL] THEN
12813     DISCH_THEN(MP_TAC o MATCH_MP COMPACT_IMP_BOUNDED) THEN
12814     REWRITE_TAC[BOUNDED_POS; IN_ELIM_THM; IN_CBALL_0] THEN
12815     DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
12816     EXISTS_TAC `B + &1` THEN ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_01] THEN
12817     X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
12818     FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
12819     ASM_SIMP_TAC[REAL_ARITH `B + &1 <= x ==> ~(x <= B)`; REAL_NOT_LE] THEN
12820     ASM_SIMP_TAC[COMPLEX_NORM_INV; REAL_LT_LINV];
12821     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `a:num->complex` THEN
12822     DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN
12823     ASM_CASES_TAC `!i. i IN 1..n ==> a i = Cx(&0)` THENL
12824      [FIRST_X_ASSUM(MP_TAC o SPEC `{a 0:complex}`) THEN
12825       ASM_SIMP_TAC[VSUM_CLAUSES_LEFT; LE_0; ADD_CLAUSES; COMPACT_SING] THEN
12826       SIMP_TAC[IN_SING; COMPLEX_MUL_LZERO; complex_pow; COMPLEX_MUL_RID] THEN
12827       REWRITE_TAC[GSYM COMPLEX_VEC_0; VSUM_0; VECTOR_ADD_RID; UNIV_GSPEC] THEN
12828       MESON_TAC[COMPACT_IMP_BOUNDED; NOT_BOUNDED_UNIV];
12829       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN
12830       DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
12831         (fst(EQ_IMP_RULE(SPEC_ALL num_MAX))))) THEN
12832       REWRITE_TAC[NOT_IMP; IN_NUMSEG] THEN
12833       ANTS_TAC THENL [MESON_TAC[]; MATCH_MP_TAC MONO_EXISTS] THEN
12834       X_GEN_TAC `m:num` THEN STRIP_TAC THEN ASM_SIMP_TAC[LE_1; FUN_EQ_THM] THEN
12835       GEN_TAC THEN MATCH_MP_TAC VSUM_EQ_SUPERSET THEN
12836       ASM_REWRITE_TAC[SUBSET_NUMSEG; FINITE_NUMSEG; IN_NUMSEG; LE_0] THEN
12837       X_GEN_TAC `j:num` THEN REWRITE_TAC[COMPLEX_VEC_0; NOT_LE] THEN
12838       STRIP_TAC THEN REWRITE_TAC[COMPLEX_ENTIRE] THEN DISJ1_TAC THEN
12839       MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN
12840       FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN ASM_REWRITE_TAC[] THEN
12841       ASM_ARITH_TAC]]);;
12842
12843 (* ------------------------------------------------------------------------- *)
12844 (* Relating invertibility and nonvanishing of derivative.                    *)
12845 (* ------------------------------------------------------------------------- *)
12846
12847 let HAS_COMPLEX_DERIVATIVE_LOCALLY_INJECTIVE = prove
12848  (`!f s z.
12849         f holomorphic_on s /\ open s /\ z IN s /\
12850         ~(complex_derivative f z = Cx(&0))
12851         ==> ?t. z IN t /\
12852                 open t /\
12853                 (!x x'. x IN t /\ x' IN t /\ f x' = f x ==> x' = x)`,
12854   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_DERIVATIVE_LOCALLY_INJECTIVE THEN
12855   EXISTS_TAC `\z h. complex_derivative f z * h` THEN
12856   ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN EXISTS_TAC `s:complex->bool` THEN
12857   ASM_REWRITE_TAC[GSYM has_complex_derivative] THEN
12858   REWRITE_TAC[CONJ_ASSOC; LEFT_EXISTS_AND_THM] THEN
12859   ASM_REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
12860   REPEAT CONJ_TAC THENL
12861    [MATCH_MP_TAC LINEAR_INJECTIVE_LEFT_INVERSE THEN
12862     ASM_SIMP_TAC[LINEAR_COMPLEX_MUL; COMPLEX_EQ_MUL_LCANCEL];
12863     ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT];
12864     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
12865     SUBGOAL_THEN `(complex_derivative f) continuous_on s` MP_TAC THENL
12866      [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
12867       ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE];
12868       ALL_TAC] THEN
12869     ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[continuous_on] THEN
12870     DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12871     DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN
12872     ASM_REWRITE_TAC[dist; REAL_HALF] THEN
12873     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
12874     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12875     DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
12876     ASM_REWRITE_TAC[SUBSET; IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
12877     DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12878     EXISTS_TAC `min d r:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
12879     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
12880     MATCH_MP_TAC(REAL_ARITH `&0 < e /\ x <= e / &2 ==> x < e`) THEN
12881     ASM_REWRITE_TAC[GSYM COMPLEX_SUB_RDISTRIB] THEN MATCH_MP_TAC
12882      (CONJUNCT2(MATCH_MP ONORM (SPEC_ALL LINEAR_COMPLEX_MUL))) THEN
12883     GEN_TAC THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
12884     MATCH_MP_TAC REAL_LE_RMUL THEN
12885     ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE]]);;
12886
12887 let HAS_COMPLEX_DERIVATIVE_LOCALLY_INVERTIBLE = prove
12888  (`!f s z.
12889         f holomorphic_on s /\ open s /\ z IN s /\
12890         ~(complex_derivative f z = Cx(&0))
12891         ==> ?t g. z IN t /\ open t /\ open(IMAGE f t) /\ t SUBSET s /\
12892                   (!w. w IN t ==> g(f w) = w) /\
12893                   (!y. y IN (IMAGE f t) ==> f(g y) = y)`,
12894   REPEAT GEN_TAC THEN DISCH_TAC THEN
12895   FIRST_ASSUM(MP_TAC o MATCH_MP HAS_COMPLEX_DERIVATIVE_LOCALLY_INJECTIVE) THEN
12896   DISCH_THEN(X_CHOOSE_THEN `t:complex->bool` MP_TAC) THEN
12897   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
12898   GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] THEN
12899   REWRITE_TAC[INJECTIVE_ON_LEFT_INVERSE] THEN
12900   DISCH_THEN(X_CHOOSE_TAC `g:complex->complex`) THEN
12901   EXISTS_TAC `s INTER t:complex->bool` THEN
12902   EXISTS_TAC `g:complex->complex` THEN
12903   ASM_SIMP_TAC[OPEN_INTER; IN_INTER; INTER_SUBSET; FORALL_IN_IMAGE] THEN
12904   MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
12905   ASM_SIMP_TAC[OPEN_INTER; IN_INTER] THEN
12906   ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
12907                 HOLOMORPHIC_ON_SUBSET; INTER_SUBSET]);;
12908
12909 let HOLOMORPHIC_INJECTIVE_IMP_REGULAR = prove
12910  (`!f s.
12911         f holomorphic_on s /\ open s /\
12912         (!w z. w IN s /\ z IN s /\ f w = f z ==> w = z)
12913         ==> !z. z IN s ==> ~(complex_derivative f z = Cx(&0))`,
12914   REPEAT STRIP_TAC THEN
12915   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12916   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12917   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12918   ASM_CASES_TAC `!n. 0 < n ==> higher_complex_derivative n f z = Cx(&0)` THENL
12919    [MP_TAC(ISPECL
12920      [`f:complex->complex`; `ball(z:complex,r)`; `z:complex`]
12921      HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED) THEN
12922     ASM_SIMP_TAC[OPEN_BALL; CONNECTED_BALL; CENTRE_IN_BALL; NOT_IMP] THEN
12923     CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
12924     DISCH_THEN(MP_TAC o SPEC `z + Cx(r / &2)`) THEN
12925     REWRITE_TAC[IN_BALL; NORM_ARITH `dist(z,z + r) = norm r`] THEN
12926     REWRITE_TAC[COMPLEX_NORM_CX; NOT_IMP] THEN
12927     CONJ_TAC THENL [ASM_REAL_ARITH_TAC; DISCH_TAC] THEN
12928     FIRST_X_ASSUM(MP_TAC o SPECL [`z:complex`; `z + Cx(r / &2)`]) THEN
12929     ASM_REWRITE_TAC[COMPLEX_RING `z = z + a <=> a = Cx(&0)`] THEN
12930     REWRITE_TAC[NOT_IMP; CX_INJ] THEN
12931     CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
12932     FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
12933     REWRITE_TAC[IN_BALL; NORM_ARITH `dist(z,z + r) = norm r`] THEN
12934     REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
12935     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM])] THEN
12936   GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
12937   REWRITE_TAC[NOT_IMP; GSYM IMP_CONJ_ALT] THEN
12938   DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN
12939   MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`; `z:complex`]
12940      HOLOMORPHIC_FACTOR_ORDER_OF_ZERO_STRONG) THEN
12941   ASM_REWRITE_TAC[NOT_EXISTS_THM] THEN
12942   MAP_EVERY X_GEN_TAC [`g:complex->complex`; `k:real`] THEN STRIP_TAC THEN
12943   ASM_CASES_TAC `n = 1` THENL
12944    [ASM_MESON_TAC[HIGHER_COMPLEX_DERIVATIVE_1]; ALL_TAC] THEN
12945   MP_TAC(ISPECL[`\w:complex. (w - z) * g(w)`; `ball(z:complex,min r k)`;
12946                 `z:complex`] HAS_COMPLEX_DERIVATIVE_LOCALLY_INVERTIBLE) THEN
12947   ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; NOT_IMP; REAL_LT_MIN] THEN
12948   CONJ_TAC THENL
12949    [SUBGOAL_THEN
12950      `!w. w IN ball(z,min r k)
12951           ==> ((\w. (w - z) * g w) has_complex_derivative
12952                ((w - z) * complex_derivative g w + (Cx(&1) - Cx(&0)) * g w))
12953               (at w)`
12954     (LABEL_TAC "*")
12955     THENL
12956      [REPEAT STRIP_TAC THEN
12957       SUBGOAL_THEN `w IN ball(z:complex,k)` ASSUME_TAC THENL
12958        [ASM_MESON_TAC[SUBSET; SUBSET_BALL; REAL_ARITH `min r k <= k`];
12959         ALL_TAC] THEN
12960       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_MUL_AT THEN
12961       SIMP_TAC[HAS_COMPLEX_DERIVATIVE_ID; HAS_COMPLEX_DERIVATIVE_SUB;
12962        HAS_COMPLEX_DERIVATIVE_CONST; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
12963       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_BALL];
12964       SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
12965       CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
12966       REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
12967       ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_LT_MIN] THEN
12968       DISCH_THEN(SUBST1_TAC o  MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
12969       REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_LZERO; COMPLEX_ADD_LID;
12970                   COMPLEX_SUB_RZERO; COMPLEX_MUL_LID] THEN
12971       FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[CENTRE_IN_BALL]];
12972     REWRITE_TAC[NOT_EXISTS_THM] THEN
12973     MAP_EVERY X_GEN_TAC [`t:complex->bool`; `h:complex->complex`] THEN
12974     ABBREV_TAC `u = IMAGE (\w:complex. (w - z) * g w) t` THEN STRIP_TAC THEN
12975     MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_CBALL) THEN
12976     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `Cx(&0)`) THEN
12977     ANTS_TAC THENL
12978      [EXPAND_TAC "u" THEN REWRITE_TAC[IN_IMAGE] THEN
12979       EXISTS_TAC `z:complex` THEN ASM_REWRITE_TAC[] THEN
12980       CONV_TAC COMPLEX_RING;
12981       ALL_TAC] THEN
12982     REWRITE_TAC[NOT_EXISTS_THM; SUBSET; IN_CBALL; dist;
12983                 COMPLEX_SUB_LZERO; NORM_NEG] THEN
12984     X_GEN_TAC `e:real` THEN
12985     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
12986     DISCH_THEN(fun th ->
12987      MP_TAC(ISPEC `Cx(e) * cexp(Cx(&2) * Cx pi * ii * Cx(&0 / &n))` th) THEN
12988      MP_TAC(ISPEC `Cx(e) * cexp(Cx(&2) * Cx pi * ii * Cx(&1 / &n))` th)) THEN
12989     REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP; RE_MUL_CX; RE_MUL_II] THEN
12990     REWRITE_TAC[IM_CX; REAL_NEG_0; REAL_MUL_RZERO; REAL_EXP_0] THEN
12991     REWRITE_TAC[COMPLEX_NORM_CX; REAL_MUL_RID] THEN
12992     SIMP_TAC[REAL_ARITH `&0 < e ==> abs e <= e`; ASSUME `&0 < e`] THEN
12993     EXPAND_TAC "u" THEN REWRITE_TAC[IN_IMAGE] THEN
12994     DISCH_THEN(X_CHOOSE_THEN `y1:complex` (STRIP_ASSUME_TAC o GSYM)) THEN
12995     DISCH_THEN(X_CHOOSE_THEN `y0:complex` (STRIP_ASSUME_TAC o GSYM)) THEN
12996     UNDISCH_THEN `!w. w IN ball (z,k) ==> f w - f z = ((w - z) * g w) pow n`
12997       (fun th -> MP_TAC(SPEC `y1:complex` th) THEN
12998                  MP_TAC(SPEC `y0:complex` th)) THEN
12999     MATCH_MP_TAC(TAUT `(p1 /\ p2) /\ ~(q1 /\ q2)
13000                        ==> (p1 ==> q1) ==> (p2 ==> q2) ==> F`) THEN
13001     CONJ_TAC THENL
13002      [ASM_MESON_TAC[SUBSET; SUBSET_BALL; REAL_ARITH `min r k <= k`];
13003       MATCH_MP_TAC(MESON[] `x' = y' /\ ~(x = y) ==> ~(x = x' /\ y = y')`)] THEN
13004     CONJ_TAC THENL
13005      [RULE_ASSUM_TAC(REWRITE_RULE[INJECTIVE_ON_LEFT_INVERSE]) THEN
13006       ASM_SIMP_TAC[] THEN REWRITE_TAC[COMPLEX_POW_MUL] THEN
13007       ASM_SIMP_TAC[COMPLEX_ROOT_UNITY; LE_1];
13008       REWRITE_TAC[COMPLEX_RING `x - a:complex = y - a <=> x = y`] THEN
13009       DISCH_TAC THEN UNDISCH_THEN
13010        `!w z. w IN s /\ z IN s /\ (f:complex->complex) w = f z ==> w = z`
13011        (MP_TAC o SPECL [`y0:complex`; `y1:complex`]) THEN
13012       ASM_REWRITE_TAC[NOT_IMP] THEN CONJ_TAC THENL
13013        [ASM_MESON_TAC[SUBSET; SUBSET_BALL; REAL_ARITH `min r k <= r`];
13014         DISCH_THEN SUBST_ALL_TAC] THEN
13015       MP_TAC(ISPECL [`n:num`; `0`; `1`] COMPLEX_ROOT_UNITY_EQ) THEN
13016       ASM_SIMP_TAC[LE_1] THEN MATCH_MP_TAC(TAUT `a /\ ~b ==> ~(a <=> b)`) THEN
13017       CONJ_TAC THENL
13018        [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (COMPLEX_RING
13019          `z = e * y ==> z = e * x /\ ~(e = Cx(&0)) ==> x = y`)) THEN
13020         ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ];
13021         REWRITE_TAC[num_congruent; int_congruent] THEN
13022         DISCH_THEN(X_CHOOSE_THEN `d:int`
13023          (MP_TAC o AP_TERM `abs:int->int` o SYM)) THEN
13024         REWRITE_TAC[INT_ABS_NUM; INT_SUB_LZERO; INT_ABS_NEG] THEN
13025         ASM_REWRITE_TAC[INT_ABS_MUL_1; INT_OF_NUM_EQ; INT_ABS_NUM]]]]);;
13026
13027 (* ------------------------------------------------------------------------- *)
13028 (* Hence a nice clean inverse function theorem.                              *)
13029 (* ------------------------------------------------------------------------- *)
13030
13031 let HOLOMORPHIC_ON_INVERSE = prove
13032  (`!f s. f holomorphic_on s /\ open s /\
13033          (!w z. w IN s /\ z IN s /\ f w = f z ==> w = z)
13034          ==> open(IMAGE f s) /\
13035              ?g. g holomorphic_on (IMAGE f s) /\
13036                  (!z. z IN s
13037                       ==> complex_derivative f z * complex_derivative g (f z) =
13038                           Cx(&1)) /\
13039                  (!z. z IN s ==> g(f z) = z) /\
13040                  (!y. y IN (IMAGE f s) ==> f(g y) = y)`,
13041   REPEAT GEN_TAC THEN STRIP_TAC THEN
13042   MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
13043    [MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
13044     ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
13045     DISCH_TAC] THEN
13046   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [INJECTIVE_ON_LEFT_INVERSE]) THEN
13047   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
13048   STRIP_TAC THEN ASM_SIMP_TAC[FORALL_IN_IMAGE] THEN
13049   ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; FORALL_IN_IMAGE] THEN
13050   REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `z:complex` THEN
13051   ASM_CASES_TAC `(z:complex) IN s` THEN ASM_REWRITE_TAC[] THEN
13052   MP_TAC(ISPECL
13053    [`f:complex->complex`; `g:complex->complex`;
13054     `complex_derivative f z`; `s:complex->bool`;
13055     `z:complex`] HAS_COMPLEX_DERIVATIVE_INVERSE_STRONG) THEN
13056   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; IMP_CONJ] THEN
13057   ANTS_TAC THENL
13058    [ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE; HOLOMORPHIC_ON_OPEN;
13059                         complex_differentiable];
13060     ALL_TAC] THEN
13061   MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`]
13062         HOLOMORPHIC_INJECTIVE_IMP_REGULAR) THEN
13063   ANTS_TAC THENL [ASM_MESON_TAC[]; DISCH_THEN(MP_TAC o SPEC `z:complex`)] THEN
13064   ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
13065   ASM_SIMP_TAC[COMPLEX_FIELD
13066    `~(z = Cx(&0)) ==> (z * w = Cx(&1) <=> w = inv z)`] THEN
13067   MESON_TAC[HAS_COMPLEX_DERIVATIVE_DERIVATIVE]);;
13068
13069 (* ------------------------------------------------------------------------- *)
13070 (* Holomorphism of covering maps and lifts.                                  *)
13071 (* ------------------------------------------------------------------------- *)
13072
13073 let COVERING_SPACE_LIFT_IS_HOLOMORPHIC = prove
13074  (`!p c s f g u.
13075         covering_space (c,p) s /\ open c /\ p holomorphic_on c /\
13076         f holomorphic_on u /\ IMAGE f u SUBSET s /\ IMAGE g u SUBSET c /\
13077         g continuous_on u /\ (!x. x IN u ==> p(g x) = f x)
13078         ==> g holomorphic_on u`,
13079   REPEAT STRIP_TAC THEN
13080   REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
13081   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
13082   FIRST_ASSUM(MP_TAC o SPEC `(f:complex->complex) z` o last o CONJUNCTS o
13083               GEN_REWRITE_RULE I [covering_space]) THEN
13084   ANTS_TAC THENL [ASM SET_TAC[]; ASM_SIMP_TAC[OPEN_IN_OPEN_EQ]] THEN
13085   DISCH_THEN(X_CHOOSE_THEN `t:complex->bool` MP_TAC) THEN
13086   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
13087   DISCH_THEN(X_CHOOSE_THEN `vv:(complex->bool)->bool` STRIP_ASSUME_TAC) THEN
13088   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [EXTENSION]) THEN
13089   DISCH_THEN(MP_TAC o snd o EQ_IMP_RULE o SPEC `(g:complex->complex) z`) THEN
13090   ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[IN_UNIONS]] THEN
13091   DISCH_THEN(X_CHOOSE_THEN `v:complex->bool` STRIP_ASSUME_TAC) THEN
13092   MP_TAC(ISPECL [`p:complex->complex`; `v:complex->bool`]
13093         HOLOMORPHIC_ON_INVERSE) THEN
13094   ANTS_TAC THENL
13095    [CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
13096     RULE_ASSUM_TAC(REWRITE_RULE[homeomorphism]) THEN ASM SET_TAC[];
13097     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
13098     DISCH_THEN(X_CHOOSE_THEN `p':complex->complex` STRIP_ASSUME_TAC)] THEN
13099   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_WITHIN THEN
13100   EXISTS_TAC `(p':complex->complex) o (f:complex->complex)` THEN
13101   MP_TAC(ISPECL
13102    [`g:complex->complex`; `u:complex->bool`; `c:complex->bool`;
13103     `v:complex->bool`] CONTINUOUS_OPEN_IN_PREIMAGE_GEN) THEN
13104   ASM_SIMP_TAC[OPEN_IN_OPEN_EQ] THEN REWRITE_TAC[open_in] THEN
13105   DISCH_THEN(MP_TAC o SPEC `z:complex` o CONJUNCT2) THEN
13106   ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[o_THM; IN_ELIM_THM]] THEN
13107   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
13108   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
13109   CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
13110   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_COMPOSE_WITHIN THEN CONJ_TAC THENL
13111    [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_WITHIN THEN
13112     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET];
13113     MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_AT_WITHIN THEN
13114     MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
13115     EXISTS_TAC `IMAGE (p:complex->complex) v` THEN
13116     ASM_REWRITE_TAC[] THEN ASM SET_TAC[]]);;
13117
13118 let COVERING_SPACE_LIFT_HOLOMORPHIC = prove
13119  (`!p c s f u.
13120         covering_space (c,p) s /\ p holomorphic_on c /\ open c /\
13121         simply_connected u /\ locally path_connected u /\
13122         f holomorphic_on u /\ IMAGE f u SUBSET s
13123         ==> ?g. g holomorphic_on u /\ IMAGE g u SUBSET c /\
13124                 !y. y IN u ==> p(g y) = f y`,
13125   REPEAT STRIP_TAC THEN MP_TAC(ISPECL
13126    [`p:complex->complex`; `c:complex->bool`; `s:complex->bool`;
13127     `f:complex->complex`; `u:complex->bool`] COVERING_SPACE_LIFT) THEN
13128     ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
13129     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
13130   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
13131   FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
13132         COVERING_SPACE_LIFT_IS_HOLOMORPHIC)) THEN
13133   EXISTS_TAC `f:complex->complex` THEN ASM_REWRITE_TAC[]);;
13134
13135 (* ------------------------------------------------------------------------- *)
13136 (* The Schwarz lemma.                                                        *)
13137 (* ------------------------------------------------------------------------- *)
13138
13139 let SCHWARZ_LEMMA = prove
13140  (`!f. f holomorphic_on ball(Cx(&0),&1) /\
13141        (!z:complex. norm z < &1 ==> norm (f z) < &1) /\
13142        f(Cx(&0)) = Cx(&0)
13143        ==> (!z. norm z < &1 ==> norm(f z) <= norm z) /\
13144            norm(complex_derivative f(Cx(&0))) <= &1 /\
13145            ((?z. norm z < &1 /\ ~(z= Cx(&0)) /\ norm(f z) = norm z) \/
13146             norm(complex_derivative f (Cx(&0))) = &1
13147             ==> ?c. (!z. norm z < &1 ==> f z = c*z) /\ norm c = &1)`,
13148   let LEMMA1 = prove
13149   (`!f a. open a /\ connected a /\ bounded a /\ ~(a = {}) /\
13150          f holomorphic_on a /\ f continuous_on (closure a)
13151          ==> (?w. w IN (frontier a) /\
13152                   (!z. z IN (closure a) ==> norm (f z) <= norm (f w)))`,
13153   REPEAT STRIP_TAC THEN ASSERT_TAC
13154     `?x. x IN closure a /\
13155          (!z. z IN closure a ==>
13156               norm((f:complex->complex) z) <= norm(f x))` THENL
13157   [MATCH_MP_TAC CONTINUOUS_ATTAINS_SUP THEN
13158   ASM_SIMP_TAC [COMPACT_CLOSURE;CLOSURE_EQ_EMPTY] THEN
13159   SUBGOAL_THEN `lift o (\x. norm((f:complex->complex) x)) =
13160                  (lift o norm) o (\x. f x) ` SUBST1_TAC THENL
13161   [REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
13162   ASM_REWRITE_TAC [CONTINUOUS_ON_LIFT_NORM;ETA_AX]]; ALL_TAC] THEN
13163   ASM_CASES_TAC `x:complex IN frontier a` THENL
13164   [EXISTS_TAC `x:complex` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN
13165   SUBGOAL_THEN `x:complex IN interior a` MP_TAC THENL
13166   [POP_ASSUM MP_TAC THEN REWRITE_TAC[frontier;DIFF] THEN
13167   SET_TAC[ASSUME `x:complex IN closure a`]; ALL_TAC] THEN
13168   ASM_SIMP_TAC[INTERIOR_OPEN] THEN DISCH_TAC THEN
13169   SUBGOAL_THEN `?c. !z. z IN a ==> (f:complex->complex) z = c`
13170   STRIP_ASSUME_TAC THENL
13171   [MATCH_MP_TAC MAXIMUM_MODULUS_PRINCIPLE THEN
13172   EXISTS_TAC `a:complex->bool` THEN
13173   EXISTS_TAC `x:complex` THEN ASM_REWRITE_TAC[SUBSET_REFL] THEN GEN_TAC THEN
13174   DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[closure;UNION] THEN
13175   SET_TAC[ASSUME `z:complex IN a`]; ALL_TAC] THEN
13176   SUBGOAL_THEN `CHOICE(frontier(a:complex->bool)) IN frontier a`
13177   ASSUME_TAC THENL
13178   [MATCH_MP_TAC CHOICE_DEF THEN MATCH_MP_TAC FRONTIER_NOT_EMPTY THEN
13179    CONJ_TAC THENL [ASM SET_TAC[]; ASM_MESON_TAC[NOT_BOUNDED_UNIV]];
13180    ALL_TAC] THEN
13181   EXISTS_TAC `CHOICE(frontier(a:complex->bool))` THEN ASM_REWRITE_TAC[] THEN
13182   REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_EQ_IMP_LE THEN
13183   SUBGOAL_THEN `!z. z IN closure a ==> (f:complex->complex) z = c`
13184   ASSUME_TAC THENL
13185   [MP_TAC (ISPECL [`f:complex->complex`; `closure (a:complex->bool)`;
13186   `{c:complex}`] CONTINUOUS_CLOSED_PREIMAGE) THEN
13187   ASM_REWRITE_TAC [CLOSED_CLOSURE; CLOSED_SING] THEN
13188   ABBREV_TAC `s = {x | x IN closure(a:complex->bool) /\
13189   (f:complex->complex) x IN {c}}` THEN DISCH_TAC THEN
13190   SUBGOAL_THEN `closure a SUBSET (s:complex->bool)` ASSUME_TAC THENL
13191   [MATCH_MP_TAC CLOSURE_MINIMAL THEN CONJ_TAC THENL
13192   [REWRITE_TAC[SUBSET] THEN EXPAND_TAC "s" THEN
13193    ASSUME_TAC (MESON [CLOSURE_SUBSET;GSYM SUBSET]
13194        `!x:complex. x IN a ==> x IN closure a`) THEN
13195   SET_TAC [ASSUME `!x:complex. x IN a ==> x IN closure a`;
13196               ASSUME `!z:complex. z IN a ==> f z = c:complex`];
13197   ASM_REWRITE_TAC[]];
13198   POP_ASSUM MP_TAC THEN EXPAND_TAC "s" THEN SET_TAC[]];
13199   EQ_TRANS_TAC `norm(c:complex)` THENL
13200   [ASM_SIMP_TAC[]; ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN
13201   MATCH_MP_TAC (NORM_ARITH `!x y:complex. x = y ==> norm x = norm y`) THEN
13202   FIRST_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[frontier;IN_DIFF]]])
13203   in
13204   let LEMMA2 = prove
13205   (`!(f:complex->complex) r w s.
13206       &0 < r /\ f holomorphic_on ball(Cx(&0),r) /\
13207       &0 < s /\ ball(w,s) SUBSET ball(Cx(&0),r) /\
13208       (!z. norm (w-z) < s ==> norm(f z) <= norm(f w))
13209       ==> (?c. !z. norm z < r ==> f z = c)`,
13210   REPEAT STRIP_TAC THEN
13211   MP_TAC (SPECL[`f:complex->complex`;`ball (Cx(&0),r)`; `ball (w:complex,s)`;
13212                 `w:complex`] MAXIMUM_MODULUS_PRINCIPLE) THEN
13213   ASM_REWRITE_TAC[OPEN_BALL; CONNECTED_BALL; IN_BALL;DIST_REFL] THEN
13214   ASM_REWRITE_TAC[dist;COMPLEX_SUB_LZERO;NORM_NEG])
13215   in
13216   let LEMMA3 = prove
13217   (`!r:real f. f holomorphic_on (ball(Cx(&0),r)) /\ f (Cx(&0))=Cx(&0)
13218    ==> (?h. h holomorphic_on (ball(Cx(&0),r)) /\
13219   ((!z. norm z < r ==> f z=z*(h z)) /\
13220   (complex_derivative f (Cx(&0)))= h (Cx(&0))))`,
13221   REPEAT STRIP_TAC THEN ABBREV_TAC `h = \z. if z = Cx(&0) then
13222   complex_derivative f (Cx(&0)) else f z/z` THEN EXISTS_TAC
13223   `h:complex->complex` THEN ASSERT_TAC `(!z:complex. norm z < r ==>
13224   (f:complex->complex) z = z * h z) /\ complex_derivative f (Cx(&0))
13225   = h (Cx(&0))` THENL [CONJ_TAC THENL
13226   [GEN_TAC THEN DISCH_TAC THEN EXPAND_TAC "h" THEN
13227   COND_CASES_TAC THENL [ASM_REWRITE_TAC[COMPLEX_MUL_LZERO];
13228   POP_ASSUM MP_TAC THEN CONV_TAC COMPLEX_FIELD];
13229   EXPAND_TAC "h" THEN ASM_REWRITE_TAC[]];ALL_TAC] THEN ASM_REWRITE_TAC[]
13230   THEN MATCH_MP_TAC  POLE_THEOREM_OPEN_0 THEN  EXISTS_TAC `(f:complex->complex)`
13231   THEN EXISTS_TAC `Cx(&0)` THEN
13232   ASM_SIMP_TAC[OPEN_BALL;IN_BALL;COMPLEX_SUB_RZERO;
13233    dist;COMPLEX_SUB_LZERO;NORM_NEG])
13234   in
13235   GEN_TAC THEN STRIP_TAC THEN
13236   MP_TAC (SPECL [`&1`;`f:complex->complex`] LEMMA3) THEN ASM_REWRITE_TAC[] THEN
13237   STRIP_TAC THEN SUBGOAL_THEN
13238     `!z. norm z < &1 ==> norm ((h:complex->complex) z) <= &1`
13239     ASSUME_TAC THENL
13240   [GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC
13241   (prove
13242   (`!x y:real. (!a. y<a ==> x<a) ==> x <= y`,
13243   REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LT] THEN
13244   ONCE_REWRITE_TAC[REAL_LT_BETWEEN] THEN REWRITE_TAC[NOT_EXISTS_THM;
13245   DE_MORGAN_THM] THEN X_GEN_TAC `z:real` THEN
13246   POP_ASSUM (MP_TAC o SPEC `z:real`) THEN REAL_ARITH_TAC)) THEN
13247   X_GEN_TAC `a:real` THEN
13248   DISCH_TAC THEN SUBGOAL_THEN
13249    `?r. norm (z:complex) < r /\ inv r < a /\ r < &1` MP_TAC THENL
13250   [SUBGOAL_THEN `max (inv a) (norm(z:complex)) < &1` MP_TAC THENL
13251   [ASM_SIMP_TAC[REAL_MAX_LT; REAL_INV_LT_1];
13252   GEN_REWRITE_TAC LAND_CONV [REAL_LT_BETWEEN] THEN
13253   DISCH_THEN (X_CHOOSE_TAC `r:real`) THEN EXISTS_TAC `r:real` THEN
13254   POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[REAL_MAX_LT] THEN STRIP_TAC THEN
13255   ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_LINV THEN
13256   ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; ALL_TAC] THEN
13257   STRIP_TAC THEN
13258   SUBGOAL_THEN `&0 < r` ASSUME_TAC THENL
13259   [ASM_MESON_TAC[REAL_LET_TRANS; NORM_POS_LE]; ALL_TAC] THEN
13260   SUBGOAL_THEN `inv (r:real) = &1/r` ASSUME_TAC THENL
13261   [MATCH_MP_TAC REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC REAL_DIV_LMUL THEN
13262   ASM_SIMP_TAC[REAL_LT_IMP_NZ]; ALL_TAC] THEN
13263   SUBGOAL_THEN `?w. norm w = r /\ (!z. norm z < r
13264                     ==> norm((h:complex->complex) z) <= norm(h w))`
13265                   STRIP_ASSUME_TAC THENL
13266   [MATCH_MP_TAC(prove (`!f r. &0 < r /\ f holomorphic_on ball(Cx(&0),r) /\
13267          f continuous_on cball(Cx(&0),r)
13268          ==> (?w. norm w = r /\ (!z. norm z < r ==> norm(f z) <= norm(f w)))`,
13269   REPEAT GEN_TAC THEN STRIP_TAC THEN
13270   MP_TAC(SPECL[`f:complex->complex`; `ball(Cx(&0),r)`] LEMMA1) THEN
13271   ASM_REWRITE_TAC[OPEN_BALL; CONNECTED_BALL; BOUNDED_BALL; BALL_EQ_EMPTY;
13272                   REAL_ARITH `!r:real. ~(r <= &0) <=> &0 < r`] THEN
13273   ASM_SIMP_TAC[CLOSURE_BALL] THEN STRIP_TAC THEN EXISTS_TAC `w:complex` THEN
13274   CONJ_TAC THENL
13275   [UNDISCH_TAC `w:complex IN frontier(ball(Cx(&0),r))` THEN
13276   ASM_SIMP_TAC[FRONTIER_BALL;sphere;dist;COMPLEX_SUB_LZERO;NORM_NEG] THEN
13277   SET_TAC[];
13278   POP_ASSUM MP_TAC THEN
13279   REWRITE_TAC[IN_CBALL;dist;COMPLEX_SUB_LZERO;NORM_NEG] THEN
13280   MESON_TAC [REAL_LT_IMP_LE]])) THEN ASM_REWRITE_TAC[] THEN
13281   CONJ_TAC THENL [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET
13282   THEN EXISTS_TAC `ball(Cx(&0),&1)` THEN
13283   ASM_SIMP_TAC [SUBSET_BALL;REAL_LT_IMP_LE];
13284   MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
13285   MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `ball(Cx(&0),&1)` THEN
13286   ASM_REWRITE_TAC[SUBSET; IN_CBALL; IN_BALL] THEN
13287   ASM_MESON_TAC[REAL_LET_TRANS]]; ALL_TAC] THEN
13288   MATCH_MP_TAC REAL_LET_TRANS THEN
13289   EXISTS_TAC `norm(h(w:complex):complex)` THEN CONJ_TAC THENL
13290   [ASM_SIMP_TAC[]; ALL_TAC] THEN
13291   SUBGOAL_THEN `h w:complex = f w / w` SUBST1_TAC THENL
13292   [ASM_SIMP_TAC[] THEN
13293   MP_TAC (MESON [GSYM COMPLEX_NORM_ZERO;REAL_NOT_EQ;
13294                     ASSUME `norm(w:complex) =r`;
13295                     ASSUME `&0 < r`] `~(w=Cx(&0))`) THEN
13296   CONV_TAC(COMPLEX_FIELD);
13297   ASM_REWRITE_TAC[COMPLEX_NORM_DIV] THEN MATCH_MP_TAC REAL_LT_TRANS THEN
13298   EXISTS_TAC `&1/(r:real)` THEN ASM_SIMP_TAC [REAL_LT_DIV2_EQ] THEN
13299   MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `inv (r:real)` THEN
13300   ASM_REWRITE_TAC[REAL_LE_REFL]]; ALL_TAC] THEN
13301   CONJ_TAC THENL
13302   [GEN_TAC THEN DISCH_TAC THEN ASM_CASES_TAC `z = Cx(&0)` THENL
13303   [ASM_SIMP_TAC[COMPLEX_MUL_LZERO;REAL_LE_REFL];
13304   SUBST1_TAC (REAL_ARITH `norm (z:complex) = norm z * &1`) THEN
13305   ASM_SIMP_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
13306   ASM_SIMP_TAC[NORM_POS_LE]]; ALL_TAC] THEN CONJ_TAC THENL
13307   [ASM_MESON_TAC [COMPLEX_NORM_ZERO;REAL_LT_01]; ALL_TAC] THEN
13308   REWRITE_TAC[TAUT `((p \/ q) ==> r) <=> ((p ==> r) /\ (q ==> r))`] THEN
13309   CONJ_TAC THENL [STRIP_TAC THEN SUBGOAL_THEN
13310    `norm ((h:complex->complex) z) = &1` ASSUME_TAC THENL
13311   [SUBGOAL_THEN `(h:complex->complex) z = f z/z` SUBST1_TAC THENL
13312   [UNDISCH_THEN `!z:complex. norm z < &1  ==> f z = z * h z`
13313   (MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
13314   UNDISCH_TAC `~(z = Cx(&0))` THEN CONV_TAC(COMPLEX_FIELD);
13315   ASM_SIMP_TAC[COMPLEX_NORM_ZERO;REAL_DIV_REFL;COMPLEX_NORM_DIV]];
13316   SUBGOAL_THEN `?c. (!z. norm z < &1 ==> (h:complex->complex) z = c)`
13317   STRIP_ASSUME_TAC THENL [MATCH_MP_TAC LEMMA2
13318   THEN EXISTS_TAC `z:complex` THEN EXISTS_TAC `&1 - norm(z:complex)`
13319   THEN ASM_REWRITE_TAC[REAL_LT_01] THEN CONJ_TAC THENL
13320   [ASM_MESON_TAC[REAL_SUB_LT]; CONJ_TAC THENL
13321   [REWRITE_TAC[SUBSET;IN_BALL] THEN GEN_TAC THEN DISCH_TAC THEN
13322   MATCH_MP_TAC REAL_LET_TRANS THEN
13323   EXISTS_TAC `dist(Cx(&0), z) + dist(z,x)` THEN
13324   REWRITE_TAC[DIST_TRIANGLE] THEN POP_ASSUM MP_TAC THEN
13325   REWRITE_TAC[dist;COMPLEX_SUB_LZERO;NORM_NEG] THEN REAL_ARITH_TAC;
13326   GEN_TAC THEN DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN
13327   MATCH_MP_TAC REAL_LET_TRANS THEN
13328   EXISTS_TAC `norm(z:complex) + norm(z' - z)` THEN
13329   REWRITE_TAC[NORM_TRIANGLE_SUB] THEN REWRITE_TAC[NORM_SUB] THEN
13330   POP_ASSUM MP_TAC THEN REWRITE_TAC[NORM_SUB] THEN REAL_ARITH_TAC]];
13331   EXISTS_TAC `c:complex` THEN CONJ_TAC THENL
13332   [ASM_SIMP_TAC[COMPLEX_MUL_SYM];
13333   POP_ASSUM (MP_TAC o SPEC `z:complex`) THEN ASM_MESON_TAC[]]]];
13334   ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
13335   SUBGOAL_THEN `?c. (!z. norm z < &1 ==> (h:complex->complex) z = c)`
13336   STRIP_ASSUME_TAC THENL[MATCH_MP_TAC LEMMA2 THEN EXISTS_TAC `Cx(&0)`
13337   THEN EXISTS_TAC `&1` THEN ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`;
13338   SUBSET_REFL; COMPLEX_SUB_LZERO; NORM_NEG];
13339   EXISTS_TAC `c:complex` THEN CONJ_TAC THENL
13340   [ASM_SIMP_TAC[COMPLEX_MUL_SYM];POP_ASSUM (MP_TAC o SPEC `Cx(&0)`) THEN
13341   ASM_MESON_TAC[COMPLEX_NORM_0; REAL_LT_01]]]]);;
13342
13343 (* ------------------------------------------------------------------------- *)
13344 (* The Schwarz reflection principle.                                         *)
13345 (* ------------------------------------------------------------------------- *)
13346
13347 let HOLOMORPHIC_ON_PASTE_ACROSS_LINE = prove
13348  (`!f s a k.
13349         open s /\ ~(a = vec 0) /\
13350         f holomorphic_on {z | z IN s /\ k < a dot z} /\
13351         f holomorphic_on {z | z IN s /\ a dot z < k} /\
13352         f continuous_on s
13353         ==> f holomorphic_on s`,
13354   let lemma0 = prove
13355    (`!d a b:real^N k.
13356           d dot a <= k /\ k <= d dot b
13357           ==> ?c. c IN segment[a,b] /\ d dot c = k /\
13358                   (!z. z IN segment[a,c] ==> d dot z <= k) /\
13359                   (!z. z IN segment[c,b] ==> k <= d dot z)`,
13360     REPEAT STRIP_TAC THEN
13361     MP_TAC(ISPECL [`segment[a:real^N,b]`; `a:real^N`; `b:real^N`;
13362                    `d:real^N`; `k:real`] CONNECTED_IVT_HYPERPLANE) THEN
13363     ASM_REWRITE_TAC[CONNECTED_SEGMENT; ENDS_IN_SEGMENT] THEN
13364     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `c:real^N` THEN STRIP_TAC THEN
13365     ASM_REWRITE_TAC[SET_RULE
13366      `(!z. z IN s ==> P z) <=> s SUBSET {x | P x}`] THEN
13367     REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN CONJ_TAC THEN
13368     MATCH_MP_TAC HULL_MINIMAL THEN
13369     REWRITE_TAC[CONVEX_HALFSPACE_LE; REWRITE_RULE[real_ge] CONVEX_HALFSPACE_GE;
13370                 SUBSET; FORALL_IN_INSERT; NOT_IN_EMPTY] THEN
13371     ASM_REWRITE_TAC[IN_ELIM_THM; REAL_LE_REFL]) in
13372   let lemma1 = prove
13373    (`!f s d k a b c.
13374           convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
13375           d dot a <= k /\ d dot b <= k /\ d dot c <= k /\
13376           f holomorphic_on {z | z IN s /\ d dot z < k} /\
13377           f holomorphic_on {z | z IN s /\ k < d dot z} /\
13378           f continuous_on s
13379           ==> path_integral (linepath (a,b)) f +
13380               path_integral (linepath (b,c)) f +
13381               path_integral (linepath (c,a)) f = Cx(&0)`,
13382     REPEAT STRIP_TAC THEN
13383     MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `b:complex`; `c:complex`]
13384           CAUCHY_THEOREM_TRIANGLE_INTERIOR) THEN
13385     ANTS_TAC THENL
13386      [CONJ_TAC THENL
13387        [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
13388         EXISTS_TAC `s:complex->bool` THEN
13389         ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
13390         MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13391         EXISTS_TAC `{z:complex | z IN s /\ d dot z < k}` THEN
13392         ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SUBSET_TRANS THEN
13393         EXISTS_TAC `interior(s INTER {x:complex | d dot x <= k})` THEN
13394         CONJ_TAC THENL
13395          [MATCH_MP_TAC SUBSET_INTERIOR THEN MATCH_MP_TAC HULL_MINIMAL THEN
13396           ASM_SIMP_TAC[CONVEX_INTER; CONVEX_HALFSPACE_LE] THEN ASM SET_TAC[];
13397           ASM_SIMP_TAC[INTERIOR_INTER; INTERIOR_HALFSPACE_LE;
13398                        INTERIOR_OPEN] THEN
13399           SET_TAC[]]];
13400       REWRITE_TAC[HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL]]) in
13401   let lemma2 = prove
13402    (`!f s d k a b c.
13403           convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
13404           d dot a <= k /\ d dot b <= k /\
13405           f holomorphic_on {z | z IN s /\ d dot z < k} /\
13406           f holomorphic_on {z | z IN s /\ k < d dot z} /\
13407           f continuous_on s
13408           ==> path_integral (linepath (a,b)) f +
13409               path_integral (linepath (b,c)) f +
13410               path_integral (linepath (c,a)) f = Cx(&0)`,
13411     REPEAT STRIP_TAC THEN ASM_CASES_TAC `(d:complex) dot c <= k` THENL
13412      [MATCH_MP_TAC lemma1 THEN ASM_MESON_TAC[]; ALL_TAC] THEN
13413     RULE_ASSUM_TAC(REWRITE_RULE[REAL_NOT_LE]) THEN
13414     MP_TAC(ISPECL [`d:complex`; `b:complex`; `c:complex`; `k:real`]
13415           lemma0) THEN
13416     MP_TAC(ISPECL [`d:complex`; `a:complex`; `c:complex`; `k:real`]
13417           lemma0) THEN
13418     ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN
13419     DISCH_THEN(X_CHOOSE_THEN `a':complex` STRIP_ASSUME_TAC) THEN
13420     DISCH_THEN(X_CHOOSE_THEN `b':complex` STRIP_ASSUME_TAC) THEN
13421     SUBGOAL_THEN `(a':complex) IN s /\ b' IN s` STRIP_ASSUME_TAC THENL
13422      [ASM_MESON_TAC[CONVEX_CONTAINS_SEGMENT; SEGMENT_SYM; SUBSET];
13423       ALL_TAC] THEN
13424     MP_TAC(SPECL
13425      [`f:complex->complex`; `c:complex`; `a:complex`; `a':complex`]
13426           PATH_INTEGRAL_SPLIT_LINEPATH) THEN
13427     MP_TAC(SPECL
13428      [`f:complex->complex`; `b:complex`; `c:complex`; `b':complex`]
13429           PATH_INTEGRAL_SPLIT_LINEPATH) THEN
13430     ASM_REWRITE_TAC[] THEN REPEAT(ANTS_TAC THENL
13431      [ASM_MESON_TAC[CONVEX_CONTAINS_SEGMENT; SEGMENT_SYM;
13432                     CONTINUOUS_ON_SUBSET];
13433       ONCE_REWRITE_TAC[TAUT `p ==> q ==> r <=> q ==> p ==> r`]]) THEN
13434     MP_TAC(ISPECL [`f:complex->complex`; `linepath(a':complex,b')`]
13435           PATH_INTEGRAL_REVERSEPATH) THEN
13436     REWRITE_TAC[REVERSEPATH_LINEPATH; VALID_PATH_LINEPATH] THEN ANTS_TAC THENL
13437      [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
13438       ASM_MESON_TAC[CONVEX_CONTAINS_SEGMENT; CONTINUOUS_ON_SUBSET];
13439       ALL_TAC] THEN
13440     MP_TAC(ISPECL [`f:complex->complex`; `s INTER {x:complex | d dot x <= k}`;
13441                    `{}:complex->bool`;
13442                    `linepath(a:complex,b) ++ linepath(b,b') ++
13443                     linepath(b',a') ++ linepath(a',a)`]
13444           CAUCHY_THEOREM_CONVEX) THEN
13445     MP_TAC(ISPECL [`f:complex->complex`; `s INTER {x:complex | k <= d dot x}`;
13446                    `{}:complex->bool`;
13447                    `linepath(b':complex,c) ++ linepath(c,a') ++
13448                     linepath(a',b')`]
13449           CAUCHY_THEOREM_CONVEX) THEN
13450     MATCH_MP_TAC(TAUT
13451      `(q /\ q' ==> r) /\ (p /\ p') ==> (p ==> q) ==> (p' ==> q') ==> r`) THEN
13452     CONJ_TAC THENL
13453      [DISCH_THEN(CONJUNCTS_THEN
13454        (fun th -> MP_TAC(MATCH_MP PATH_INTEGRAL_UNIQUE th) THEN
13455                   MP_TAC(MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE th)));
13456       ASM_SIMP_TAC[DIFF_EMPTY; INTERIOR_INTER; INTERIOR_HALFSPACE_LE;
13457                    REWRITE_RULE[real_ge] INTERIOR_HALFSPACE_GE] THEN
13458       ASM_SIMP_TAC[CONVEX_INTER; CONVEX_HALFSPACE_LE; FINITE_EMPTY;
13459                    REWRITE_RULE[real_ge] CONVEX_HALFSPACE_GE]] THEN
13460     SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN_EQ;
13461              PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_JOIN;
13462              VALID_PATH_LINEPATH; PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
13463              PATH_INTEGRAL_JOIN]
13464     THENL [CONV_TAC COMPLEX_RING; ALL_TAC] THEN
13465     REWRITE_TAC[PATH_IMAGE_LINEPATH; UNION_SUBSET; SUBSET_INTER] THEN
13466     ASM_SIMP_TAC[fst(EQ_IMP_RULE(SPEC_ALL CONVEX_CONTAINS_SEGMENT_EQ));
13467                CONVEX_HALFSPACE_LE; REWRITE_RULE[real_ge] CONVEX_HALFSPACE_GE;
13468                  IN_ELIM_THM; REAL_LT_IMP_LE; REAL_LE_REFL] THEN
13469     ASM_SIMP_TAC[complex_differentiable; GSYM HOLOMORPHIC_ON_OPEN;
13470                  OPEN_INTER; INTERIOR_OPEN; OPEN_HALFSPACE_LT;
13471                  OPEN_HALFSPACE_GT] THEN
13472     RULE_ASSUM_TAC(REWRITE_RULE[SET_RULE
13473      `{x | x IN s /\ P x} = s INTER {x | P x}`]) THEN
13474     ASM_REWRITE_TAC[real_gt] THEN
13475     ASM_MESON_TAC[INTER_SUBSET; CONTINUOUS_ON_SUBSET]) in
13476   let lemma3 = prove
13477    (`!f s d k a b c.
13478           convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
13479           d dot a <= k /\
13480           f holomorphic_on {z | z IN s /\ d dot z < k} /\
13481           f holomorphic_on {z | z IN s /\ k < d dot z} /\
13482           f continuous_on s
13483           ==> path_integral (linepath (a,b)) f +
13484               path_integral (linepath (b,c)) f +
13485               path_integral (linepath (c,a)) f = Cx(&0)`,
13486     REPEAT STRIP_TAC THEN ASM_CASES_TAC `(d:complex) dot b <= k` THENL
13487      [MATCH_MP_TAC lemma2 THEN ASM_MESON_TAC[]; ALL_TAC] THEN
13488     ASM_CASES_TAC `(d:complex) dot c <= k` THENL
13489      [ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = c + a + b`] THEN
13490       MATCH_MP_TAC(GEN_ALL lemma2) THEN ASM_MESON_TAC[];
13491       ALL_TAC] THEN
13492     ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = b + c + a`] THEN
13493     MATCH_MP_TAC(GEN_ALL lemma2) THEN
13494     MAP_EVERY EXISTS_TAC
13495      [`s:complex->bool`; `--d:real^2`; `--k:real`] THEN
13496     ASM_REWRITE_TAC[DOT_LNEG; REAL_LE_NEG2; REAL_LT_NEG2; VECTOR_NEG_EQ_0] THEN
13497     ASM_REAL_ARITH_TAC) in
13498   let lemma4 = prove
13499    (`!f s d k a b c.
13500           convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
13501           f holomorphic_on {z | z IN s /\ d dot z < k} /\
13502           f holomorphic_on {z | z IN s /\ k < d dot z} /\
13503           f continuous_on s
13504           ==> path_integral (linepath (a,b)) f +
13505               path_integral (linepath (b,c)) f +
13506               path_integral (linepath (c,a)) f = Cx(&0)`,
13507     REPEAT STRIP_TAC THEN ASM_CASES_TAC `(d:complex) dot a <= k` THENL
13508      [MATCH_MP_TAC lemma3 THEN ASM_MESON_TAC[]; ALL_TAC] THEN
13509     MATCH_MP_TAC lemma3 THEN
13510     MAP_EVERY EXISTS_TAC
13511      [`s:complex->bool`; `--d:real^2`; `--k:real`] THEN
13512     ASM_REWRITE_TAC[DOT_LNEG; REAL_LE_NEG2; REAL_LT_NEG2; VECTOR_NEG_EQ_0] THEN
13513     ASM_REAL_ARITH_TAC) in
13514   REPEAT STRIP_TAC THEN MATCH_MP_TAC ANALYTIC_IMP_HOLOMORPHIC THEN
13515   MATCH_MP_TAC MORERA_LOCAL_TRIANGLE THEN
13516   X_GEN_TAC `p:complex` THEN DISCH_TAC THEN
13517   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
13518   DISCH_THEN(MP_TAC o SPEC `p:complex`) THEN ASM_REWRITE_TAC[] THEN
13519   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
13520   EXISTS_TAC `ball(p:complex,e)` THEN
13521   ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
13522   CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
13523   MAP_EVERY X_GEN_TAC [`u:complex`; `v:complex`; `w:complex`] THEN
13524   SIMP_TAC[SUBSET_HULL; CONVEX_BALL; INSERT_SUBSET; EMPTY_SUBSET] THEN
13525   STRIP_TAC THEN MATCH_MP_TAC lemma4 THEN
13526   MAP_EVERY EXISTS_TAC [`ball(p:complex,e)`; `a:complex`; `k:real`] THEN
13527   ASM_REWRITE_TAC[CONVEX_BALL; OPEN_BALL] THEN REPEAT CONJ_TAC THENL
13528    [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13529     EXISTS_TAC `{z:complex | z IN s /\ a dot z < k}`;
13530     MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13531     EXISTS_TAC `{z:complex | z IN s /\ k < a dot z}`;
13532     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
13533     EXISTS_TAC `s:complex->bool`] THEN
13534   ASM_REWRITE_TAC[] THEN ASM SET_TAC[]);;
13535
13536 let SCHWARZ_REFLECTION = prove
13537  (`!f s. open s /\ (!z. z IN s ==> cnj z IN s) /\
13538          f holomorphic_on {z | z IN s /\ &0 < Im z} /\
13539          f continuous_on {z | z IN s /\ &0 <= Im z} /\
13540          (!z. z IN s /\ real z ==> real(f z))
13541          ==> (\z. if &0 <= Im z then f(z) else cnj(f(cnj z)))
13542              holomorphic_on s`,
13543   REPEAT STRIP_TAC THEN
13544   MATCH_MP_TAC HOLOMORPHIC_ON_PASTE_ACROSS_LINE THEN
13545   MAP_EVERY EXISTS_TAC [`basis 2:complex`; `&0`] THEN
13546   ASM_SIMP_TAC[BASIS_NONZERO; DOT_BASIS; DIMINDEX_2; ARITH] THEN
13547   REWRITE_TAC[GSYM IM_DEF] THEN REPEAT CONJ_TAC THENL
13548    [UNDISCH_TAC `f holomorphic_on {z | z IN s /\ &0 < Im z}` THEN
13549     MATCH_MP_TAC EQ_IMP THEN MATCH_MP_TAC HOLOMORPHIC_EQ THEN
13550     SIMP_TAC[IN_ELIM_THM; REAL_LT_IMP_LE];
13551     SUBGOAL_THEN
13552      `(cnj o f o cnj) holomorphic_on {z | z IN s /\ Im z < &0}`
13553     MP_TAC THENL
13554      [ALL_TAC;
13555       MATCH_MP_TAC EQ_IMP THEN MATCH_MP_TAC HOLOMORPHIC_EQ THEN
13556       SIMP_TAC[IN_ELIM_THM; GSYM REAL_NOT_LE; o_THM]] THEN
13557     UNDISCH_TAC `f holomorphic_on {z | z IN s /\ &0 < Im z}` THEN
13558     REWRITE_TAC[holomorphic_on; IN_ELIM_THM] THEN DISCH_TAC THEN
13559     X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
13560     FIRST_X_ASSUM(MP_TAC o SPEC `cnj z`) THEN
13561     ASM_SIMP_TAC[IM_CNJ; REAL_ARITH `&0 < --x <=> x < &0`] THEN
13562     DISCH_THEN(X_CHOOSE_THEN `w:complex`
13563       (fun th -> EXISTS_TAC `cnj w` THEN MP_TAC th)) THEN
13564     REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN; LIM_WITHIN] THEN
13565     GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [GSYM FORALL_CNJ] THEN
13566     REWRITE_TAC[IN_ELIM_THM; dist; GSYM CNJ_SUB; o_THM] THEN
13567     GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [GSYM COMPLEX_NORM_CNJ] THEN
13568     REWRITE_TAC[CNJ_SUB; CNJ_DIV; CNJ_CNJ] THEN
13569     MATCH_MP_TAC MONO_FORALL THEN GEN_TAC THEN
13570     MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
13571     MATCH_MP_TAC MONO_EXISTS THEN REPEAT STRIP_TAC THEN
13572     ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
13573     ASM_SIMP_TAC[IM_CNJ] THEN ASM_REAL_ARITH_TAC;
13574     SUBGOAL_THEN
13575      `s = {z | z IN s /\ &0 <= Im z} UNION
13576           {z | z IN s /\ Im z <= &0}`
13577      (fun th -> SUBST1_TAC th THEN ASSUME_TAC(SYM th))
13578     THENL [SET_TAC[REAL_LE_TOTAL]; ALL_TAC] THEN
13579     MATCH_MP_TAC CONTINUOUS_ON_CASES_LOCAL THEN
13580     ASM_REWRITE_TAC[IN_ELIM_THM] THEN
13581     REWRITE_TAC[SET_RULE `{z | z IN s /\ P z} = s INTER {z | P z}`] THEN
13582     SIMP_TAC[CLOSED_IN_CLOSED_INTER; CLOSED_HALFSPACE_IM_LE;
13583              REWRITE_RULE[real_ge] CLOSED_HALFSPACE_IM_GE] THEN
13584     CONJ_TAC THENL
13585      [REPLICATE_TAC 2
13586        (MATCH_MP_TAC(REWRITE_RULE[o_DEF] CONTINUOUS_ON_COMPOSE) THEN
13587         REWRITE_TAC[CONTINUOUS_ON_CNJ]) THEN
13588       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13589           CONTINUOUS_ON_SUBSET)) THEN
13590       ASM_SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM; IN_INTER; IM_CNJ] THEN
13591       REAL_ARITH_TAC;
13592       X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
13593       SUBGOAL_THEN `real z` ASSUME_TAC THENL
13594        [REWRITE_TAC[real] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13595       RULE_ASSUM_TAC(REWRITE_RULE[REAL_CNJ]) THEN ASM_MESON_TAC[]]]);;
13596
13597 (* ------------------------------------------------------------------------- *)
13598 (* Bloch's theorem.                                                          *)
13599 (* ------------------------------------------------------------------------- *)
13600
13601 let BLOCH_LEMMA = prove
13602  (`!f a r.
13603     &0 < r /\ f holomorphic_on cball(a,r) /\
13604     (!z. z IN ball(a,r)
13605          ==> norm(complex_derivative f z) <= &2 * norm(complex_derivative f a))
13606     ==> ball(f(a),(&3 - &2 * sqrt(&2)) * r * norm(complex_derivative f a))
13607         SUBSET IMAGE f (ball(a,r))`,
13608   SUBGOAL_THEN
13609    `!f r.
13610         &0 < r /\ f holomorphic_on cball(Cx(&0),r) /\ f(Cx(&0)) = Cx(&0) /\
13611         (!z. z IN ball(Cx(&0),r)
13612              ==> norm(complex_derivative f z)
13613                  <= &2 * norm(complex_derivative f (Cx(&0))))
13614         ==> ball(Cx(&0),
13615                  (&3 - &2 * sqrt(&2)) *
13616                  r * norm(complex_derivative f (Cx(&0))))
13617             SUBSET IMAGE f (ball(Cx(&0),r))`
13618   ASSUME_TAC THENL
13619    [ALL_TAC;
13620     REPEAT STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
13621      [`\z. (f:complex->complex)(a + z) - f(a)`; `r:real`]) THEN
13622     ASM_REWRITE_TAC[COMPLEX_ADD_RID; COMPLEX_SUB_REFL] THEN
13623     SUBGOAL_THEN
13624      `!z. z IN ball(Cx(&0),r)
13625           ==> complex_derivative (\w. f (a + w) - f a) z =
13626               complex_derivative f (a + z)`
13627      (fun th -> ASM_SIMP_TAC[CENTRE_IN_BALL; COMPLEX_ADD_RID; th])
13628     THENL
13629      [REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
13630       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
13631       ONCE_REWRITE_TAC [COMPLEX_RING
13632        `complex_derivative f z =
13633         complex_derivative f z * (Cx(&0) + Cx(&1)) - Cx(&0)`] THEN
13634       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
13635       REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_CONST] THEN
13636       GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
13637       MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
13638       SIMP_TAC[HAS_COMPLEX_DERIVATIVE_ADD; HAS_COMPLEX_DERIVATIVE_CONST;
13639         HAS_COMPLEX_DERIVATIVE_ID; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
13640       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
13641       DISCH_THEN(MP_TAC o SPEC `a + z:complex`) THEN
13642       ASM_SIMP_TAC[IN_CBALL; NORM_ARITH `norm z < r ==> dist(a,a+z) <= r`] THEN
13643       REWRITE_TAC[GSYM complex_differentiable] THEN
13644       DISCH_THEN(MP_TAC o SPEC `ball(a:complex,r)` o
13645         MATCH_MP (REWRITE_RULE[IMP_CONJ]
13646         COMPLEX_DIFFERENTIABLE_WITHIN_SUBSET)) THEN
13647       ASM_REWRITE_TAC[BALL_SUBSET_CBALL] THEN MATCH_MP_TAC EQ_IMP THEN
13648       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_WITHIN_OPEN THEN
13649       ASM_REWRITE_TAC[IN_BALL; OPEN_BALL; NORM_ARITH `dist(a,a + z) = norm z`];
13650       ANTS_TAC THENL
13651        [CONJ_TAC THENL
13652          [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
13653           REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
13654           GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
13655           MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
13656           EXISTS_TAC `cball(a:complex,r)` THEN
13657           ASM_SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_ID;
13658                        HOLOMORPHIC_ON_CONST; COMPLEX_IN_CBALL_0] THEN
13659           REWRITE_TAC[IN_CBALL] THEN NORM_ARITH_TAC;
13660           X_GEN_TAC `z:complex` THEN REWRITE_TAC[COMPLEX_IN_BALL_0] THEN
13661           STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
13662           ASM_REWRITE_TAC[IN_BALL; NORM_ARITH `dist(a,a + z) = norm z`]];
13663         REWRITE_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_IMAGE] THEN
13664         REWRITE_TAC[IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
13665         DISCH_THEN(fun th ->
13666          X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
13667          MP_TAC(SPEC `z - (f:complex->complex) a` th)) THEN
13668         ASM_REWRITE_TAC[COMPLEX_RING `z - a:complex = w - a <=> z = w`] THEN
13669         DISCH_THEN(X_CHOOSE_TAC `x:complex`) THEN
13670         EXISTS_TAC `a + x:complex` THEN
13671         ASM_REWRITE_TAC[COMPLEX_ADD_SUB]]]] THEN
13672   REPEAT GEN_TAC THEN
13673   SUBGOAL_THEN `&0 < &3 - &2 * sqrt(&2)` ASSUME_TAC THENL
13674    [REWRITE_TAC[REAL_ARITH `&0 < a - &2 * b <=> b < a / &2`] THEN
13675     MATCH_MP_TAC REAL_LT_LSQRT THEN REAL_ARITH_TAC;
13676     ALL_TAC] THEN
13677   ASM_CASES_TAC `&0 < r` THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
13678   ASM_CASES_TAC `complex_derivative f (Cx(&0)) = Cx(&0)` THEN
13679   ASM_SIMP_TAC[COMPLEX_NORM_0; REAL_MUL_RZERO; BALL_TRIVIAL; EMPTY_SUBSET] THEN
13680   ABBREV_TAC `C = &2 * norm(complex_derivative f (Cx(&0)))` THEN
13681   SUBGOAL_THEN `&0 < C` ASSUME_TAC THENL
13682    [ASM_MESON_TAC[COMPLEX_NORM_NZ; REAL_ARITH `&0 < &2 * x <=> &0 < x`];
13683     ALL_TAC] THEN
13684   SUBGOAL_THEN
13685    `!z. z IN ball(Cx(&0),r)
13686         ==> norm(complex_derivative f z - complex_derivative f (Cx(&0)))
13687             <= norm(z) / (r - norm(z)) * C`
13688   (LABEL_TAC "+") THENL
13689    [REPEAT STRIP_TAC THEN
13690     SUBGOAL_THEN
13691      `!R. norm z < R /\ R < r
13692           ==> norm(complex_derivative f z - complex_derivative f (Cx(&0)))
13693               <= norm(z) / (R - norm(z)) * C`
13694     MP_TAC THENL
13695      [REPEAT STRIP_TAC THEN
13696       MP_TAC(ISPECL
13697        [`complex_derivative f`;
13698         `cball(Cx(&0),R)`;
13699         `circlepath(Cx(&0),R)`]
13700         CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE) THEN
13701       REWRITE_TAC[CONVEX_CBALL; VALID_PATH_CIRCLEPATH; INTERIOR_CBALL;
13702                   PATHSTART_CIRCLEPATH; PATHFINISH_CIRCLEPATH] THEN
13703       SUBGOAL_THEN `&0 < R` ASSUME_TAC THENL
13704        [ASM_MESON_TAC[REAL_LET_TRANS; NORM_POS_LE]; ALL_TAC] THEN
13705       ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
13706       REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
13707       REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_CBALL; IN_BALL; IN_DELETE] THEN
13708       SIMP_TAC[WINDING_NUMBER_CIRCLEPATH; COMPLEX_SUB_RZERO; COMPLEX_SUB_LZERO;
13709                dist; NORM_NEG;  REAL_LE_REFL; MESON[REAL_LT_REFL]
13710           `norm z < R /\ (!w. norm w = R ==> ~(w = z)) <=> norm z < R`] THEN
13711       REWRITE_TAC[RIGHT_FORALL_IMP_THM; IMP_CONJ] THEN ANTS_TAC THENL
13712        [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13713         EXISTS_TAC `ball(Cx(&0),r)` THEN CONJ_TAC THENL
13714          [MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
13715           REWRITE_TAC[OPEN_BALL] THEN
13716           MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13717           EXISTS_TAC `cball(Cx(&0),r)` THEN ASM_REWRITE_TAC[BALL_SUBSET_CBALL];
13718           ASM_REWRITE_TAC[SUBSET_BALLS; DIST_REFL; REAL_ADD_LID]];
13719         REWRITE_TAC[COMPLEX_MUL_LID]] THEN
13720       DISCH_THEN(fun th ->
13721         MP_TAC (CONJ (SPEC `z:complex` th) (SPEC `Cx(&0)` th))) THEN
13722       ASM_REWRITE_TAC[COMPLEX_NORM_0; COMPLEX_SUB_RZERO] THEN
13723       DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
13724       DISCH_THEN(MP_TAC o SPEC `C * norm(z) / (R * (R - norm(z:complex)))` o
13725         MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
13726           HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH)) THEN
13727       ASM_REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB] THEN
13728       REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
13729       REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_LID; REAL_ABS_PI] THEN
13730       ASM_SIMP_TAC[REAL_FIELD
13731        `&0 < R /\ z < R
13732         ==> (C * z / (R * (R - z))) * &2 * pi * R =
13733             &2 * pi * z / (R - z) * C`] THEN
13734       ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH `&0 < &2`; PI_POS] THEN
13735       DISCH_THEN MATCH_MP_TAC THEN
13736       ASM_SIMP_TAC[REAL_LE_MUL_EQ; REAL_LE_DIV; REAL_LE_MUL; REAL_SUB_LE;
13737                    REAL_LT_IMP_LE; NORM_POS_LE; COMPLEX_SUB_RZERO] THEN
13738       X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
13739       SUBGOAL_THEN `~(x = Cx(&0)) /\ ~(x = z)` STRIP_ASSUME_TAC THENL
13740        [ASM_MESON_TAC[REAL_LT_REFL; COMPLEX_NORM_0]; ALL_TAC] THEN
13741       ASM_SIMP_TAC[COMPLEX_FIELD
13742        `~(x = Cx(&0)) /\ ~(x = z)
13743         ==> d / (x - z) - d / x = d * z / (x * (x - z))`] THEN
13744       REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
13745       ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE; IN_BALL; dist; NORM_NEG;
13746                    COMPLEX_SUB_LZERO] THEN
13747       REWRITE_TAC[COMPLEX_NORM_DIV; real_div] THEN
13748       MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
13749       MATCH_MP_TAC REAL_LE_INV2 THEN
13750       ASM_SIMP_TAC[REAL_LT_MUL; REAL_SUB_LT; COMPLEX_NORM_MUL] THEN
13751       ASM_SIMP_TAC[REAL_LE_LMUL_EQ] THEN
13752       UNDISCH_TAC `norm(x:complex) = R` THEN CONV_TAC NORM_ARITH;
13753       DISCH_TAC THEN MP_TAC(ISPECL
13754        [`\x. lift(norm(z:complex) / (drop x - norm z) * C)`;
13755         `interval(lift((norm(z:complex) + r) / &2),lift r)`; `lift r`;
13756         `norm(complex_derivative f z - complex_derivative f (Cx(&0)))`;
13757         `1`] CONTINUOUS_ON_CLOSURE_COMPONENT_GE) THEN
13758       REWRITE_TAC[GSYM drop; LIFT_DROP; CLOSURE_INTERVAL] THEN
13759       DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[INTERVAL_EQ_EMPTY_1] THEN
13760       FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
13761       REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN DISCH_TAC THEN
13762       ASM_SIMP_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; LIFT_DROP; REAL_ARITH
13763         `z < r ==> ~(r <= (z + r) / &2) /\ ~(r < (z + r) / &2)`] THEN
13764       REWRITE_TAC[FORALL_LIFT; LIFT_DROP; IN_INTERVAL_1] THEN
13765       CONJ_TAC THENL
13766        [ALL_TAC;
13767         ASM_MESON_TAC[REAL_ARITH `(z + r) / &2 < R /\ R < r ==> z < R`]] THEN
13768       REWRITE_TAC[LIFT_CMUL; real_div] THEN
13769       MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
13770       REWRITE_TAC[CONTINUOUS_ON_CONST; o_DEF; LIFT_CMUL] THEN
13771       MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
13772       REWRITE_TAC[CONTINUOUS_ON_CONST; o_DEF; LIFT_CMUL] THEN
13773       MATCH_MP_TAC(REWRITE_RULE[o_DEF] CONTINUOUS_ON_INV) THEN
13774       SIMP_TAC[LIFT_SUB; CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; LIFT_DROP;
13775                CONTINUOUS_ON_LIFT_NORM_COMPOSE; CONTINUOUS_ON_ID] THEN
13776       REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; LIFT_DROP] THEN
13777       ASM_REAL_ARITH_TAC];
13778     ALL_TAC] THEN
13779   SUBGOAL_THEN
13780    `!z.  z IN ball(Cx(&0),r)
13781          ==> (norm(z) - norm(z) pow 2 / (r - norm(z))) *
13782              norm(complex_derivative f (Cx(&0)))
13783              <= norm(f z)`
13784   (LABEL_TAC "*") THENL
13785    [REPEAT STRIP_TAC THEN
13786     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
13787     REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN DISCH_TAC THEN
13788     MP_TAC(ISPECL[`\z. f(z) - complex_derivative f (Cx(&0)) * z`;
13789                   `\z. complex_derivative f z - complex_derivative f (Cx(&0))`;
13790                   `linepath(Cx(&0),z)`; `ball(Cx(&0),r)`]
13791         PATH_INTEGRAL_PRIMITIVE) THEN
13792     REWRITE_TAC[PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN ANTS_TAC THENL
13793      [REWRITE_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
13794       ONCE_REWRITE_TAC[COMPLEX_RING
13795        `a - complex_derivative f b = a - complex_derivative f b * Cx(&1)`] THEN
13796       CONJ_TAC THENL
13797        [X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
13798         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
13799         SIMP_TAC[HAS_COMPLEX_DERIVATIVE_LMUL_WITHIN;
13800                  HAS_COMPLEX_DERIVATIVE_ID] THEN
13801         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
13802         REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
13803         FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
13804         DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
13805         ASM_SIMP_TAC[REWRITE_RULE[SUBSET] BALL_SUBSET_CBALL] THEN
13806         REWRITE_TAC[GSYM complex_differentiable] THEN
13807         DISCH_THEN(MP_TAC o SPEC `ball(Cx(&0),r)` o
13808           MATCH_MP (REWRITE_RULE[IMP_CONJ]
13809           COMPLEX_DIFFERENTIABLE_WITHIN_SUBSET)) THEN
13810         ASM_SIMP_TAC[COMPLEX_DIFFERENTIABLE_WITHIN_OPEN; OPEN_BALL] THEN
13811         REWRITE_TAC[BALL_SUBSET_CBALL];
13812         MATCH_MP_TAC(REWRITE_RULE[CONVEX_CONTAINS_SEGMENT] CONVEX_BALL) THEN
13813         ASM_REWRITE_TAC[CENTRE_IN_BALL]];
13814       ALL_TAC] THEN
13815     SIMP_TAC[HAS_INTEGRAL_INTEGRABLE_INTEGRAL; HAS_PATH_INTEGRAL_LINEPATH] THEN
13816     REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_MUL_RZERO] THEN
13817     REWRITE_TAC[linepath; COMPLEX_CMUL; COMPLEX_MUL_RZERO; LIFT_DROP] THEN
13818     REWRITE_TAC[COMPLEX_ADD_LID; FORALL_LIFT; IN_INTERVAL_1; LIFT_DROP] THEN
13819     STRIP_TAC THEN FIRST_ASSUM(MP_TAC o
13820      SPEC `\t. lift(norm(z:complex) pow 2 * drop t / (r - norm(z)) * C)` o
13821       MATCH_MP (REWRITE_RULE[IMP_CONJ] INTEGRAL_NORM_BOUND_INTEGRAL)) THEN
13822     REWRITE_TAC[linepath; COMPLEX_CMUL; COMPLEX_MUL_RZERO; LIFT_DROP] THEN
13823     REWRITE_TAC[COMPLEX_ADD_LID; FORALL_LIFT; IN_INTERVAL_1; LIFT_DROP] THEN
13824     REWRITE_TAC[REAL_ARITH `a * b / c * d:real = (a / c * d) * b`] THEN
13825     REWRITE_TAC[LIFT_CMUL; LIFT_DROP; DROP_VEC] THEN
13826     MP_TAC(ISPECL
13827      [`\x. inv(&2) * x pow 2`; `\x:real. x`; `&0`; `&1`]
13828         REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN
13829     REWRITE_TAC[REAL_POS] THEN ANTS_TAC THENL
13830      [REPEAT STRIP_TAC THEN REAL_DIFF_TAC THEN CONV_TAC NUM_REDUCE_CONV THEN
13831       REAL_ARITH_TAC;
13832       REWRITE_TAC[has_real_integral; o_DEF; IMAGE_LIFT_REAL_INTERVAL] THEN
13833       CONV_TAC REAL_RAT_REDUCE_CONV THEN REWRITE_TAC[LIFT_DROP; LIFT_NUM] THEN
13834       DISCH_THEN(MP_TAC o SPEC `norm(z:complex) pow 2 / (r - norm z) * C` o
13835         MATCH_MP HAS_INTEGRAL_CMUL) THEN
13836       REWRITE_TAC[HAS_INTEGRAL_INTEGRABLE_INTEGRAL] THEN
13837       STRIP_TAC THEN ASM_REWRITE_TAC[]] THEN
13838     ANTS_TAC THENL
13839      [X_GEN_TAC `t:real` THEN STRIP_TAC THEN
13840       REWRITE_TAC[REAL_ARITH
13841         `(z pow 2 / y * c) * t:real = (z / y * t * c) * z`] THEN
13842       REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
13843       REWRITE_TAC[NORM_POS_LE] THEN
13844       REMOVE_THEN "+" (MP_TAC o SPEC `Cx(t) * z`) THEN
13845       REWRITE_TAC[IN_BALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
13846       SUBGOAL_THEN `norm(Cx t * z) <= norm z` ASSUME_TAC THENL
13847        [GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
13848         REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
13849         REWRITE_TAC[NORM_POS_LE; COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
13850         ALL_TAC] THEN
13851       ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13852       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
13853       ASM_SIMP_TAC[REAL_LE_RMUL_EQ; REAL_MUL_ASSOC; real_div] THEN
13854       ASM_REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; real_abs] THEN
13855       GEN_REWRITE_TAC LAND_CONV
13856        [REAL_ARITH `(t * z) * w:real = (z * w) * t`] THEN
13857       MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN
13858       MATCH_MP_TAC REAL_LE_MUL2 THEN
13859       REWRITE_TAC[NORM_POS_LE; REAL_LE_INV_EQ; REAL_SUB_LE] THEN
13860       REWRITE_TAC[REAL_LE_REFL] THEN CONJ_TAC THENL
13861        [ALL_TAC; MATCH_MP_TAC REAL_LE_INV2] THEN
13862       ASM_REWRITE_TAC[REAL_SUB_LT] THEN FIRST_X_ASSUM(MP_TAC o
13863         GEN_REWRITE_RULE LAND_CONV [COMPLEX_NORM_MUL]) THEN
13864       REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
13865       REWRITE_TAC[COMPLEX_SUB_RZERO]] THEN
13866     MATCH_MP_TAC(NORM_ARITH
13867      `abc <= norm d - e ==> norm(f - d) <= e ==> abc <= norm f`) THEN
13868     REWRITE_TAC[REAL_SUB_RDISTRIB;
13869                 ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] COMPLEX_NORM_MUL] THEN
13870     MATCH_MP_TAC(REAL_ARITH `y <= x ==> a - x <= a - y`) THEN
13871     REWRITE_TAC[DROP_CMUL; GSYM REAL_MUL_ASSOC; LIFT_DROP] THEN
13872     MATCH_MP_TAC REAL_LE_LMUL THEN
13873     ASM_SIMP_TAC[REAL_LE_DIV; REAL_SUB_LE; REAL_LT_IMP_LE; REAL_LE_POW_2] THEN
13874     EXPAND_TAC "C" THEN REAL_ARITH_TAC;
13875     ALL_TAC] THEN
13876   MATCH_MP_TAC SUBSET_TRANS THEN
13877   EXISTS_TAC `IMAGE (f:complex->complex)
13878                     (ball(Cx(&0),(&1 - sqrt(&2) / &2) * r))` THEN
13879   SUBGOAL_THEN `&0 < &1 - sqrt(&2) / &2 /\  &1 - sqrt(&2) / &2 < &1`
13880   STRIP_ASSUME_TAC THENL
13881    [REWRITE_TAC[REAL_ARITH
13882      `&0 < &1 - s / &2 /\  &1 - s / &2 < &1 <=> &0 < s /\ s < &2`] THEN
13883     CONJ_TAC THENL
13884      [MATCH_MP_TAC REAL_LT_RSQRT; MATCH_MP_TAC REAL_LT_LSQRT] THEN
13885     REAL_ARITH_TAC;
13886     ALL_TAC] THEN
13887   CONJ_TAC THENL
13888    [ALL_TAC;
13889     MATCH_MP_TAC IMAGE_SUBSET THEN MATCH_MP_TAC SUBSET_BALL THEN
13890     REWRITE_TAC[REAL_ARITH `x * r <= r <=> &0 <= r * (&1 - x)`] THEN
13891     MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC] THEN
13892   FIRST_ASSUM(fun th ->
13893     GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o LAND_CONV) [SYM th]) THEN
13894   MATCH_MP_TAC BALL_SUBSET_OPEN_MAP_IMAGE THEN
13895   ASM_SIMP_TAC[REAL_LT_MUL; BOUNDED_BALL; CLOSURE_BALL; CENTRE_IN_BALL] THEN
13896   REPEAT CONJ_TAC THENL
13897    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
13898     EXISTS_TAC `cball(Cx(&0),r)` THEN
13899     ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
13900     MATCH_MP_TAC SUBSET_CBALL THEN
13901     REWRITE_TAC[REAL_ARITH `x * r <= r <=> &0 <= r * (&1 - x)`] THEN
13902     MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC;
13903     MATCH_MP_TAC(REWRITE_RULE[RIGHT_IMP_FORALL_THM; IMP_IMP]
13904         OPEN_MAPPING_THM) THEN
13905     EXISTS_TAC `ball(Cx(&0),r)` THEN
13906     ASM_SIMP_TAC[OPEN_BALL; CONNECTED_BALL; INTERIOR_OPEN; SUBSET_REFL] THEN
13907     REPEAT CONJ_TAC THENL
13908      [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; BALL_SUBSET_CBALL];
13909       ALL_TAC;
13910       MATCH_MP_TAC SUBSET_BALL THEN
13911       REWRITE_TAC[REAL_ARITH `x * r <= r <=> &0 <= r * (&1 - x)`] THEN
13912       MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC] THEN
13913     DISCH_THEN(X_CHOOSE_TAC `y:complex`) THEN
13914     MP_TAC(ISPECL
13915      [`f:complex->complex`; `(\x. y):complex->complex`;
13916       `ball(Cx(&0),r)`; `Cx(&0)`]
13917      COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN) THEN
13918     ASM_REWRITE_TAC[OPEN_BALL; HOLOMORPHIC_ON_CONST; COMPLEX_DERIVATIVE_CONST;
13919                     CENTRE_IN_BALL] THEN
13920     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; BALL_SUBSET_CBALL];
13921     REPEAT(MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC) THEN
13922     ASM_REWRITE_TAC[REAL_ARITH `&0 < &3 - &2 * s <=> s < &3 / &2`] THEN
13923     ASM_REAL_ARITH_TAC;
13924     ALL_TAC] THEN
13925   ASM_SIMP_TAC[FRONTIER_BALL; sphere; REAL_LT_MUL; dist; IN_ELIM_THM] THEN
13926   X_GEN_TAC `z:complex` THEN REWRITE_TAC[COMPLEX_SUB_LZERO; NORM_NEG] THEN
13927   DISCH_TAC THEN REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
13928   ASM_REWRITE_TAC[IN_BALL; dist; COMPLEX_SUB_LZERO; COMPLEX_SUB_RZERO] THEN
13929   ASM_REWRITE_TAC[NORM_NEG] THEN ANTS_TAC THENL
13930    [REWRITE_TAC[REAL_ARITH `x * r < r <=> &0 < r * (&1 - x)`] THEN
13931     MATCH_MP_TAC REAL_LT_MUL THEN ASM_REAL_ARITH_TAC;
13932     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LE_TRANS)] THEN
13933   REWRITE_TAC[REAL_MUL_ASSOC] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
13934   REWRITE_TAC[NORM_POS_LE; REAL_ARITH `r - (&1 - s) * r = s * r`] THEN
13935   REWRITE_TAC[real_div; REAL_INV_MUL; REAL_INV_INV] THEN
13936   ASM_SIMP_TAC[REAL_LE_RMUL_EQ; REAL_FIELD
13937    `&0 < r
13938     ==> a * r - (b * r) pow 2 * x * inv r =  (a - b pow 2 * x) * r`] THEN
13939   MATCH_MP_TAC REAL_EQ_IMP_LE THEN
13940   MP_TAC(SPEC `&2` SQRT_WORKS) THEN CONV_TAC REAL_FIELD);;
13941
13942 let BLOCH_UNIT = prove
13943  (`!f a. f holomorphic_on ball(a,&1) /\
13944        complex_derivative f a = Cx(&1)
13945        ==> ?b r. &1 / &12 < r /\ ball(b,r) SUBSET IMAGE f (ball(a,&1))`,
13946   REPEAT STRIP_TAC THEN ABBREV_TAC `r = &249 / &256` THEN
13947   SUBGOAL_THEN `&0 < r` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13948   ABBREV_TAC `g = \z. complex_derivative f z * Cx(r - norm(z - a))` THEN
13949   MP_TAC(ISPECL [`IMAGE (g:complex->complex) (cball(a,r))`; `Cx(&0)`]
13950         DISTANCE_ATTAINS_SUP) THEN
13951   ANTS_TAC THENL
13952    [ASM_REWRITE_TAC[IMAGE_EQ_EMPTY; CBALL_EQ_EMPTY] THEN
13953     CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
13954     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN REWRITE_TAC[COMPACT_CBALL] THEN
13955     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `ball(a:complex,&1)` THEN
13956     REWRITE_TAC[SUBSET_BALLS; DIST_REFL] THEN
13957     CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN EXPAND_TAC "g" THEN
13958     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC THENL
13959      [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
13960       ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; ETA_AX; OPEN_BALL];
13961       REWRITE_TAC[CONTINUOUS_ON_CX_LIFT; LIFT_SUB] THEN
13962       MATCH_MP_TAC CONTINUOUS_ON_SUB THEN REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
13963       MATCH_MP_TAC CONTINUOUS_ON_LIFT_NORM_COMPOSE THEN
13964       SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_ID; CONTINUOUS_ON_CONST]];
13965     REWRITE_TAC[EXISTS_IN_IMAGE; FORALL_IN_IMAGE; IN_CBALL] THEN
13966     REWRITE_TAC[NORM_ARITH `dist(a,b) = norm(b - a)`] THEN
13967     REWRITE_TAC[COMPLEX_SUB_RZERO] THEN
13968     DISCH_THEN(X_CHOOSE_THEN `p:complex` STRIP_ASSUME_TAC)] THEN
13969   SUBGOAL_THEN `norm(p - a:complex) < r` ASSUME_TAC THENL
13970    [ASM_REWRITE_TAC[REAL_LT_LE] THEN DISCH_TAC THEN
13971     FIRST_X_ASSUM(MP_TAC o SPEC `a:complex`) THEN
13972     ASM_SIMP_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; REAL_LT_IMP_LE] THEN
13973     EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
13974     ASM_REWRITE_TAC[REAL_SUB_REFL; COMPLEX_SUB_RZERO; COMPLEX_NORM_CX] THEN
13975     REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0] THEN ASM_REAL_ARITH_TAC;
13976     ALL_TAC] THEN
13977   ABBREV_TAC `t = (r - norm(p - a:complex)) / &2` THEN
13978   SUBGOAL_THEN `&0 < t` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13979   EXISTS_TAC `(f:complex->complex) p` THEN
13980   EXISTS_TAC `(&3 - &2 * sqrt (&2)) * t * norm (complex_derivative f p)` THEN
13981   MP_TAC(ISPECL [`f:complex->complex`; `p:complex`; `t:real`]
13982         BLOCH_LEMMA) THEN
13983   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
13984    [CONJ_TAC THENL
13985      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13986         HOLOMORPHIC_ON_SUBSET)) THEN
13987       REWRITE_TAC[SUBSET_BALLS; dist; COMPLEX_SUB_RZERO] THEN
13988       ASM_REAL_ARITH_TAC;
13989       X_GEN_TAC `z:complex` THEN REWRITE_TAC[IN_BALL] THEN DISCH_TAC THEN
13990       SUBGOAL_THEN `norm(z - a:complex) < r` ASSUME_TAC THENL
13991        [REPEAT(POP_ASSUM MP_TAC) THEN NORM_ARITH_TAC; ALL_TAC] THEN
13992       FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
13993       ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN EXPAND_TAC "g" THEN
13994       REWRITE_TAC[COMPLEX_NORM_MUL] THEN
13995       ASM_SIMP_TAC[COMPLEX_NORM_CX; GSYM REAL_LE_RDIV_EQ;
13996                    REAL_ARITH `z < r ==> &0 < abs(r - z)`] THEN
13997       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
13998       GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
13999       REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
14000       MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
14001       ASM_SIMP_TAC[GSYM real_div; REAL_LE_LDIV_EQ; REAL_ARITH
14002        `z < r ==> &0 < abs(r - z)`] THEN
14003       REPEAT(POP_ASSUM MP_TAC) THEN NORM_ARITH_TAC];
14004     DISCH_TAC THEN CONJ_TAC THENL
14005      [FIRST_X_ASSUM(MP_TAC o SPEC `a:complex`) THEN
14006       ASM_SIMP_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; REAL_LT_IMP_LE] THEN
14007       EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
14008       ASM_REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_MUL_LID] THEN
14009       ASM_SIMP_TAC[REAL_SUB_RZERO; real_abs; REAL_SUB_LE; REAL_LT_IMP_LE;
14010                    COMPLEX_SUB_REFL; COMPLEX_NORM_0] THEN
14011       EXPAND_TAC "t" THEN
14012       REWRITE_TAC[REAL_ARITH
14013        `a < b * c / &2 * d <=> a < (d * c) * (b / &2)`] THEN
14014       SUBGOAL_THEN `sqrt (&2) < &2113 / &1494` ASSUME_TAC THENL
14015        [MATCH_MP_TAC REAL_LT_LSQRT THEN CONV_TAC REAL_RAT_REDUCE_CONV;
14016         ALL_TAC] THEN
14017       SUBGOAL_THEN `&0 < &3 - &2 * sqrt(&2)` ASSUME_TAC THENL
14018        [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
14019       ASM_SIMP_TAC[GSYM REAL_LT_LDIV_EQ; REAL_HALF] THEN
14020       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LTE_TRANS) THEN
14021       ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_HALF] THEN
14022       EXPAND_TAC "r" THEN ASM_REAL_ARITH_TAC;
14023       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14024         SUBSET_TRANS)) THEN
14025       MATCH_MP_TAC IMAGE_SUBSET THEN
14026       REWRITE_TAC[SUBSET_BALLS; dist; COMPLEX_SUB_RZERO] THEN
14027       REPEAT(POP_ASSUM MP_TAC) THEN NORM_ARITH_TAC]]);;
14028
14029 let BLOCH = prove
14030  (`!f a r r'.
14031       &0 < r /\ f holomorphic_on ball(a,r) /\
14032       r' <= r * norm(complex_derivative f a) / &12
14033       ==> ?b. ball(b,r') SUBSET IMAGE f (ball(a,r))`,
14034   REPEAT GEN_TAC THEN
14035   ASM_CASES_TAC `complex_derivative f a = Cx(&0)` THENL
14036    [ASM_SIMP_TAC[COMPLEX_NORM_0; real_div; REAL_MUL_RZERO; REAL_MUL_LZERO;
14037                  BALL_EMPTY; EMPTY_SUBSET];
14038     ALL_TAC] THEN
14039   ABBREV_TAC `C = complex_derivative f a` THEN
14040   SUBGOAL_THEN `&0 < norm(C:complex)` ASSUME_TAC THENL
14041    [ASM_MESON_TAC[COMPLEX_NORM_NZ]; STRIP_TAC] THEN
14042   MP_TAC(ISPECL
14043    [`\z. (f:complex->complex)(a + Cx r * z) / (C * Cx r)`; `Cx(&0)`]
14044    BLOCH_UNIT) THEN
14045   SUBGOAL_THEN
14046    `!z. z IN ball(Cx(&0),&1)
14047         ==> ((\z. f (a + Cx r * z) / (C * Cx r)) has_complex_derivative
14048              (complex_derivative f (a + Cx r * z) / C)) (at z)`
14049   ASSUME_TAC THENL
14050    [REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
14051     SUBGOAL_THEN
14052      `complex_derivative f (a + Cx r * z) / C =
14053       (complex_derivative f (a + Cx r * z) * Cx r) / (C * Cx r)`
14054     SUBST1_TAC THENL
14055      [ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ; COMPLEX_FIELD
14056         `~(r = Cx(&0)) /\ ~(c = Cx(&0)) ==> (d * r) / (c * r) = d / c`];
14057       ALL_TAC] THEN
14058     MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_CDIV_AT THEN
14059     GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
14060     MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN CONJ_TAC THENL
14061      [COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING; ALL_TAC] THEN
14062     REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14063     FIRST_ASSUM(MATCH_MP_TAC o
14064      MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
14065        HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT)) THEN
14066     REWRITE_TAC[OPEN_BALL; IN_BALL; NORM_ARITH `dist(a,a + b) = norm b`] THEN
14067     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
14068     ASM_SIMP_TAC[REAL_ARITH `&0 < r ==> (abs r * z < r <=> &0 < r * (&1 - z))`;
14069                  REAL_LT_MUL; REAL_SUB_LT];
14070     ALL_TAC] THEN
14071   ANTS_TAC THENL
14072    [SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
14073     CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
14074     FIRST_X_ASSUM(MP_TAC o SPEC `Cx(&0)`) THEN
14075     ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_LT_01] THEN
14076     DISCH_THEN(SUBST1_TAC o MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
14077     ASM_SIMP_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_RID; COMPLEX_DIV_REFL];
14078     ALL_TAC] THEN
14079   REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
14080   MAP_EVERY X_GEN_TAC [`b:complex`; `t:real`] THEN STRIP_TAC THEN
14081   EXISTS_TAC `(C * Cx r) * b` THEN
14082   FIRST_ASSUM(MP_TAC o ISPEC `\z. (C * Cx r) * z` o MATCH_MP IMAGE_SUBSET) THEN
14083   REWRITE_TAC[GSYM IMAGE_o; o_DEF] THEN
14084   ASM_SIMP_TAC[COMPLEX_DIV_LMUL; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
14085   GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o LAND_CONV) [GSYM o_DEF] THEN
14086   REWRITE_TAC[IMAGE_o] THEN MATCH_MP_TAC(SET_RULE
14087    `v SUBSET s /\ t SUBSET w
14088     ==> s SUBSET IMAGE f t ==> v SUBSET IMAGE f w`) THEN
14089   CONJ_TAC THENL
14090    [REWRITE_TAC[SUBSET; IN_IMAGE; IN_BALL; dist] THEN
14091     X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
14092     EXISTS_TAC `x / (C * Cx r)` THEN
14093     ASM_SIMP_TAC[COMPLEX_DIV_LMUL; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
14094     MATCH_MP_TAC REAL_LT_LCANCEL_IMP THEN EXISTS_TAC `norm(C * Cx r)` THEN
14095     ASM_SIMP_TAC[COMPLEX_NORM_NZ; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
14096     REWRITE_TAC[GSYM COMPLEX_NORM_MUL; COMPLEX_SUB_LDISTRIB] THEN
14097     ASM_SIMP_TAC[COMPLEX_DIV_LMUL; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
14098     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14099       REAL_LTE_TRANS)) THEN
14100     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14101       REAL_LE_TRANS)) THEN
14102     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
14103     ASM_SIMP_TAC[REAL_ARITH `&0 < r ==> a * abs r = r * a`] THEN
14104     ASM_REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
14105     ASM_SIMP_TAC[REAL_LE_LMUL_EQ; COMPLEX_NORM_NZ] THEN ASM_REAL_ARITH_TAC;
14106     REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0] THEN
14107     REWRITE_TAC[OPEN_BALL; IN_BALL; NORM_ARITH `dist(a,a + b) = norm b`] THEN
14108     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
14109     ASM_SIMP_TAC[REAL_ARITH `&0 < r ==> (abs r * z < r <=> &0 < r * (&1 - z))`;
14110                  REAL_LT_MUL; REAL_SUB_LT]]);;
14111
14112 let BLOCH_COROLLARY = prove
14113  (`!f s a t r.
14114       f holomorphic_on s /\ a IN s /\
14115       (!z. z IN frontier s ==> t <= dist(a,z)) /\
14116       r <= t * norm(complex_derivative f a) / &12
14117       ==> ?b. ball(b,r) SUBSET IMAGE f s`,
14118   REPEAT STRIP_TAC THEN FIRST_ASSUM(DISJ_CASES_THEN MP_TAC o
14119     MATCH_MP (REAL_ARITH `r <= t ==> r <= &0 \/ &0 < t`)) THEN
14120   SIMP_TAC[BALL_EMPTY; EMPTY_SUBSET] THEN
14121   ASM_CASES_TAC `complex_derivative f a = Cx(&0)` THEN
14122   ASM_REWRITE_TAC[COMPLEX_NORM_0] THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
14123   ASM_SIMP_TAC[REAL_LT_MUL_EQ; REAL_ARITH `&0 < x / &12 <=> &0 < x`;
14124                COMPLEX_NORM_NZ] THEN
14125   DISCH_TAC THEN
14126   SUBGOAL_THEN `ball(a:complex,t) SUBSET s` ASSUME_TAC THENL
14127    [MP_TAC(ISPECL [`ball(a:complex,t)`; `s:complex->bool`]
14128           CONNECTED_INTER_FRONTIER) THEN
14129     REWRITE_TAC[CONNECTED_BALL; SET_RULE `s DIFF t = {} <=> s SUBSET t`] THEN
14130     MATCH_MP_TAC(TAUT `~p /\ r ==> (~p /\ ~q ==> ~r) ==> q`) THEN
14131     CONJ_TAC THENL
14132      [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `a:complex` THEN
14133
14134       ASM_REWRITE_TAC[IN_INTER; CENTRE_IN_BALL];
14135       REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_BALL] THEN
14136       ASM_MESON_TAC[REAL_NOT_LE]];
14137     ALL_TAC] THEN
14138   MP_TAC(ISPECL
14139    [`f:complex->complex`; `a:complex`; `t:real`; `r:real`] BLOCH) THEN
14140   ASM_REWRITE_TAC[] THEN
14141   ANTS_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
14142   MATCH_MP_TAC MONO_EXISTS THEN ASM SET_TAC[]);;
14143
14144 (* ------------------------------------------------------------------------- *)
14145 (* Schottky's theorem.                                                       *)
14146 (* ------------------------------------------------------------------------- *)
14147
14148 let SCHOTTKY = prove
14149  (`!f r. f holomorphic_on cball(Cx(&0),&1) /\ norm(f(Cx(&0))) <= r /\
14150          (!z. z IN cball(Cx(&0),&1) ==> ~(f z = Cx(&0) \/ f z = Cx(&1)))
14151          ==> !t z. &0 < t /\ t < &1 /\ norm(z) <= t
14152                    ==> norm(f z)
14153                        <= exp(pi * exp(pi *
14154                                        (&2 + &2 * r + &12 * t / (&1 - t))))`,
14155   let lemma0 = prove
14156    (`!f s a.
14157           f holomorphic_on s /\
14158           contractible s /\
14159           a IN s /\
14160           (!z. z IN s ==> ~(f z = Cx(&1)) /\ ~(f z = --Cx(&1)))
14161           ==> (?g. g holomorphic_on s /\
14162                    norm(g a) <= &1 + norm(f a) / &3 /\
14163                    (!z. z IN s ==> f z = ccos(Cx pi * g z)))`,
14164     REPEAT GEN_TAC THEN
14165     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC o MATCH_MP
14166           CONTRACTIBLE_IMP_HOLOMORPHIC_ACS_BOUNDED) THEN
14167     EXISTS_TAC `\z:complex. g z / Cx pi` THEN
14168     ASM_SIMP_TAC[COMPLEX_DIV_LMUL; CX_INJ; PI_NZ; COMPLEX_NORM_DIV;
14169                  HOLOMORPHIC_ON_DIV; HOLOMORPHIC_ON_CONST; REAL_LE_LDIV_EQ;
14170                  COMPLEX_NORM_CX; REAL_ABS_PI; PI_POS] THEN
14171     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
14172      `x <= pi + a ==> a * &3 <= n * pi ==> x <= (&1 + n / &3) * pi`)) THEN
14173     MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
14174     MP_TAC PI_APPROX_32 THEN REAL_ARITH_TAC) in
14175   let lemma1 = prove
14176    (`!n. 0 < n ==> &0 < &n + sqrt(&n pow 2 - &1)`,
14177     MESON_TAC[REAL_LTE_ADD; REAL_OF_NUM_LT; SQRT_POS_LE; REAL_POW_LE_1;
14178               REAL_SUB_LE; REAL_OF_NUM_LE; LE_1]) in
14179   let lemma2 = prove
14180    (`!x. &0 <= x
14181          ==> ?n. 0 < n /\
14182                  abs(x - log(&n + sqrt(&n pow 2 - &1)) / pi) < &1 / &2`,
14183     REPEAT STRIP_TAC THEN MP_TAC(SPEC
14184      `\n. 0 < n /\ log(&n + sqrt(&n pow 2 - &1)) / pi <= x` num_MAX) THEN
14185     SIMP_TAC[] THEN
14186     MATCH_MP_TAC(TAUT `p /\ (q ==> r) ==> (p <=> q) ==> r`) THEN
14187     REPEAT CONJ_TAC THENL
14188      [EXISTS_TAC `1` THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
14189       ASM_REWRITE_TAC[ARITH; SQRT_0; REAL_ADD_RID; LOG_1] THEN
14190       REWRITE_TAC[real_div; REAL_MUL_LZERO] THEN ASM_REAL_ARITH_TAC;
14191       MP_TAC(ISPEC `exp(x * pi)` REAL_ARCH_SIMPLE) THEN
14192       MATCH_MP_TAC MONO_EXISTS THEN
14193       X_GEN_TAC `n:num` THEN DISCH_TAC THEN X_GEN_TAC `m:num` THEN
14194       DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
14195       SIMP_TAC[REAL_LE_LDIV_EQ; PI_POS] THEN
14196       GEN_REWRITE_TAC LAND_CONV [GSYM REAL_EXP_MONO_LE] THEN
14197       ASM_SIMP_TAC[lemma1; EXP_LOG] THEN
14198       REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN MATCH_MP_TAC(REAL_ARITH
14199        `e <= n /\ &0 <= x ==> m + x <= e ==> m <= n`) THEN
14200       ASM_SIMP_TAC[SQRT_POS_LE; REAL_POW_LE_1; REAL_SUB_LE;
14201                    REAL_OF_NUM_LE; LE_1];
14202       DISCH_THEN(X_CHOOSE_THEN `n:num`
14203        (CONJUNCTS_THEN2 (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)
14204                         (MP_TAC o SPEC `n + 1`))) THEN
14205       REWRITE_TAC[ARITH_RULE `~(n + 1 <= n) /\ 0 < n + 1`] THEN
14206       REWRITE_TAC[REAL_NOT_LE; IMP_IMP] THEN
14207       DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
14208        `x < b /\ a <= x ==> b - a < &1
14209         ==> abs(x - a) < &1 / &2 \/ abs(x - b) < &1 / &2`)) THEN
14210       ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[ARITH_RULE `0 < n + 1`]] THEN
14211       REWRITE_TAC[REAL_ARITH `x / pi - y / pi = (x - y) / pi`] THEN
14212       SIMP_TAC[PI_POS; REAL_LT_LDIV_EQ; REAL_MUL_LID] THEN
14213       MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&3` THEN
14214       CONJ_TAC THENL [ALL_TAC; MP_TAC PI_APPROX_32 THEN REAL_ARITH_TAC] THEN
14215       ASM_SIMP_TAC[lemma1; GSYM LOG_DIV; ARITH_RULE `0 < n + 1`] THEN
14216       FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP (ARITH_RULE
14217        `0 < n ==> n = 1 \/ 2 <= n`))
14218       THENL
14219        [ASM_REWRITE_TAC[] THEN CONV_TAC NUM_REDUCE_CONV THEN
14220         CONV_TAC REAL_RAT_REDUCE_CONV THEN
14221         REWRITE_TAC[SQRT_0; REAL_ADD_RID; REAL_DIV_1] THEN
14222         ONCE_REWRITE_TAC[GSYM REAL_EXP_MONO_LE] THEN
14223         SIMP_TAC[EXP_LOG; REAL_LTE_ADD; SQRT_POS_LE; REAL_POS; REAL_OF_NUM_LT;
14224                  ARITH] THEN
14225         MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&1 + &3` THEN
14226         SIMP_TAC[REAL_EXP_LE_X; REAL_POS] THEN
14227         REWRITE_TAC[REAL_ARITH `&2 + s <= a <=> s <= a - &2`] THEN
14228         MATCH_MP_TAC REAL_LE_LSQRT THEN CONV_TAC REAL_RAT_REDUCE_CONV;
14229         MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `log(&2)` THEN
14230         CONJ_TAC THENL
14231          [MATCH_MP_TAC LOG_MONO_LE_IMP THEN
14232           ASM_SIMP_TAC[lemma1; ARITH_RULE `0 < n + 1`; REAL_LT_DIV;
14233                        REAL_LE_LDIV_EQ] THEN
14234           REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN MATCH_MP_TAC(REAL_ARITH
14235            `&1 <= n /\ s <= &2 * t ==> (n + &1) + s <= &2 * (n + t)`) THEN
14236           ASM_SIMP_TAC[REAL_OF_NUM_LE; LE_1] THEN
14237           MATCH_MP_TAC REAL_LE_LSQRT THEN
14238           ASM_SIMP_TAC[REAL_SUB_LE; REAL_POW_LE_1; REAL_ARITH `&1 <= &n + &1`;
14239             REAL_ARITH `&0 <= &2 * x <=> &0 <= x`; REAL_POW_MUL; SQRT_POW_2;
14240             REAL_LE_MUL; REAL_POS; SQRT_POS_LE; REAL_OF_NUM_LE; LE_1] THEN
14241           MATCH_MP_TAC(REAL_ARITH
14242            `&2 <= n /\ &2 * n <= n * n
14243             ==> (n + &1) pow 2 - &1 <= &2 pow 2 * (n pow 2 - &1)`) THEN
14244           ASM_SIMP_TAC[REAL_LE_RMUL; REAL_OF_NUM_LE; LE_0];
14245           ONCE_REWRITE_TAC[GSYM REAL_EXP_MONO_LE] THEN
14246           SIMP_TAC[EXP_LOG; REAL_OF_NUM_LT; ARITH] THEN
14247           MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&1 + &3` THEN
14248           SIMP_TAC[REAL_EXP_LE_X; REAL_POS] THEN REAL_ARITH_TAC]]]) in
14249   let lemma3 = prove
14250    (`!z.
14251       z IN
14252        ({complex(m,log(&n + sqrt(&n pow 2 - &1)) / pi) | integer m /\ 0 < n}
14253         UNION
14254         {complex(m,--log(&n + sqrt(&n pow 2 - &1)) / pi) | integer m /\ 0 < n})
14255          ==> ccos(Cx(pi) * ccos(Cx pi * z)) = Cx(&1) \/
14256              ccos(Cx(pi) * ccos(Cx pi * z)) = --Cx(&1)`,
14257     REWRITE_TAC[COMPLEX_RING
14258      `x = Cx(&1) \/ x = --Cx(&1) <=> Cx(&1) - x pow 2 = Cx(&0)`] THEN
14259     REWRITE_TAC[COMPLEX_POW_EQ_0; ARITH_EQ; CSIN_EQ_0;
14260      REWRITE_RULE[COMPLEX_RING
14261      `s pow 2 + c pow 2 = Cx(&1) <=>
14262       Cx(&1) - c pow 2 = s pow 2`] CSIN_CIRCLE] THEN
14263     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[CX_MUL] THEN
14264     REWRITE_TAC[COMPLEX_EQ_MUL_LCANCEL; CX_INJ; PI_NZ] THEN
14265     REWRITE_TAC[IN_UNION; TAUT `p \/ q ==> r <=> (p ==> r) /\ (q ==> r)`] THEN
14266     REWRITE_TAC[FORALL_AND_THM; FORALL_IN_GSPEC] THEN
14267     REWRITE_TAC[complex_mul; RE; IM; RE_CX; IM_CX; REAL_MUL_LZERO] THEN
14268     ASM_SIMP_TAC[REAL_DIV_LMUL; PI_NZ; REAL_ADD_RID; REAL_SUB_RZERO] THEN
14269     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
14270     REWRITE_TAC[ccos; COMPLEX_MUL_LNEG; CEXP_NEG] THEN CONJ_TAC THENL
14271      [ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
14272        `~(e = Cx(&0))
14273         ==> ((e + inv e) / Cx(&2) = n <=>
14274              inv e pow 2 - Cx(&2) * n * inv e + Cx(&1) = Cx(&0))`];
14275       ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
14276        `~(e = Cx(&0))
14277         ==> ((e + inv e) / Cx(&2) = n <=>
14278              e pow 2 - Cx(&2) * n * e + Cx(&1) = Cx(&0))`]] THEN
14279     SIMP_TAC[COMPLEX_TRAD; COMPLEX_RING
14280       `ii * (a + ii * b) = --b + ii * a`] THEN
14281     REWRITE_TAC[GSYM COMPLEX_TRAD; GSYM CX_NEG; CEXP_COMPLEX] THEN
14282     SIMP_TAC[REAL_EXP_NEG; EXP_LOG; lemma1] THEN
14283     SIMP_TAC[SIN_INTEGER_PI; REAL_INV_INV] THEN
14284     REWRITE_TAC[COMPLEX_TRAD; COMPLEX_MUL_RZERO; COMPLEX_ADD_RID] THEN
14285     REWRITE_TAC[GSYM CX_POW; GSYM CX_MUL; GSYM CX_ADD; GSYM CX_ADD;
14286                 GSYM CX_SUB; GSYM CX_INV; CX_INJ] THEN
14287     REWRITE_TAC[REAL_INV_MUL; REAL_INV_INV; REAL_POW_MUL] THEN
14288     ONCE_REWRITE_TAC[GSYM COS_ABS] THEN REWRITE_TAC[REAL_ABS_MUL] THEN
14289     MAP_EVERY X_GEN_TAC [`i:real`; `n:num`] THEN REWRITE_TAC[integer] THEN
14290     DISCH_THEN(CONJUNCTS_THEN2
14291      (X_CHOOSE_THEN `m:num` SUBST_ALL_TAC) ASSUME_TAC) THEN
14292     REWRITE_TAC[GSYM integer] THEN REWRITE_TAC[real_abs; PI_POS_LE] THEN
14293     REWRITE_TAC[COS_NPI; REAL_POW_INV; REAL_POW_POW] THEN
14294     REWRITE_TAC[REAL_POW_NEG; EVEN_MULT; ARITH; REAL_POW_ONE] THEN
14295     (ASM_CASES_TAC `EVEN m` THEN
14296      ASM_REWRITE_TAC[REAL_INV_NEG; REAL_INV_1; REAL_MUL_RID] THEN
14297      REWRITE_TAC[REAL_ARITH `a - &2 * n * x * --(&1) = a - &2 * --n * x`] THENL
14298       [EXISTS_TAC `&n:real`; EXISTS_TAC `--(&n):real`] THEN
14299      REWRITE_TAC[REAL_NEG_NEG; REAL_RING
14300      `(n + s) pow 2 - &2 * n * (n + s) + &1 = &0 <=>
14301       s pow 2 = n pow 2 - &1`] THEN
14302      SIMP_TAC[INTEGER_CLOSED] THEN MATCH_MP_TAC SQRT_POW_2 THEN
14303      ASM_SIMP_TAC[REAL_SUB_LE; REAL_POW_LE_1; REAL_OF_NUM_LE; LE_1])) in
14304   REPEAT GEN_TAC THEN STRIP_TAC THEN
14305   MP_TAC(ISPECL
14306    [`\z:complex. Cx(&2) * f z - Cx(&1)`; `cball(Cx(&0),&1)`; `Cx(&0)`]
14307         lemma0) THEN
14308   ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_MUL;
14309                HOLOMORPHIC_ON_CONST; CENTRE_IN_CBALL; REAL_POS;
14310                COMPLEX_RING `Cx(&2) * z - Cx(&1) = Cx(&1) <=> z = Cx(&1)`;
14311                COMPLEX_RING `Cx(&2) * z - Cx(&1) = --Cx(&1) <=> z = Cx(&0)`;
14312                CONVEX_IMP_CONTRACTIBLE; CONVEX_CBALL] THEN
14313   ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
14314   DISCH_THEN(X_CHOOSE_THEN `h:complex->complex` STRIP_ASSUME_TAC) THEN
14315   MP_TAC(ISPECL
14316    [`h:complex->complex`; `cball(Cx(&0),&1)`; `Cx(&0)`]
14317         lemma0) THEN
14318   ASM_SIMP_TAC[CENTRE_IN_CBALL; REAL_POS; CONVEX_IMP_CONTRACTIBLE;
14319                CONVEX_CBALL] THEN
14320   ANTS_TAC THENL
14321    [X_GEN_TAC `z:complex` THEN REPEAT STRIP_TAC THEN
14322     REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`)) THEN
14323     ASM_REWRITE_TAC[COMPLEX_MUL_RID; COMPLEX_MUL_RNEG; CCOS_NEG;
14324                     GSYM CX_COS; COS_PI; CX_NEG] THEN
14325     CONV_TAC COMPLEX_RING;
14326     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC)] THEN
14327   MAP_EVERY UNDISCH_TAC
14328    [`!z. z IN cball (Cx(&0),&1)
14329           ==> Cx(&2) * f z - Cx(&1) = ccos(Cx pi * h z)`;
14330     `!z. z IN cball(Cx(&0),&1) ==> h z = ccos(Cx pi * g z)`] THEN
14331   SIMP_TAC[] THEN DISCH_THEN(K ALL_TAC) THEN DISCH_TAC THEN
14332   SUBGOAL_THEN
14333    `norm(g(Cx(&0)):complex) <= &2 + norm(f(Cx(&0)):complex)`
14334   ASSUME_TAC THENL
14335    [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14336       REAL_LE_TRANS)) THEN
14337     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
14338      `h <= p ==> p / &3 <= &1 + f ==> &1 + h / &3 <= &2 + f`)) THEN
14339     MP_TAC(ISPEC `&1` COMPLEX_NORM_CX) THEN
14340     REWRITE_TAC[GSYM COMPLEX_CMUL] THEN CONV_TAC NORM_ARITH;
14341     MAP_EVERY (C UNDISCH_THEN (K ALL_TAC))
14342      [`h holomorphic_on cball(Cx(&0),&1)`;
14343       `norm(g(Cx(&0)):complex) <= &1 + norm(h(Cx(&0)):complex) / &3`;
14344       `norm(h(Cx(&0)):complex) <=
14345        &1 + norm(Cx(&2) * f(Cx(&0)) - Cx(&1)) / &3`]] THEN
14346   MAP_EVERY X_GEN_TAC [`t:real`; `z:complex`] THEN STRIP_TAC THEN
14347   SUBGOAL_THEN `z IN ball(Cx(&0),&1)` ASSUME_TAC THENL
14348    [REWRITE_TAC[COMPLEX_IN_BALL_0] THEN ASM_REAL_ARITH_TAC;
14349     FIRST_ASSUM(ASSUME_TAC o MATCH_MP
14350       (REWRITE_RULE[SUBSET] BALL_SUBSET_CBALL))] THEN
14351   SUBGOAL_THEN
14352    `norm(g(z) - g(Cx(&0))) <= &12 * t / (&1 - t)`
14353   ASSUME_TAC THENL
14354    [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
14355     REWRITE_TAC[RIGHT_IMP_EXISTS_THM; SKOLEM_THM] THEN
14356     DISCH_THEN(X_CHOOSE_TAC `g':complex->complex`) THEN
14357     MP_TAC(ISPECL [`g:complex->complex`; `g':complex->complex`;
14358                    `linepath(Cx(&0),z)`; `cball(Cx(&0),&1)`]
14359         PATH_INTEGRAL_PRIMITIVE) THEN
14360     ASM_REWRITE_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH;
14361                     PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
14362     ASM_SIMP_TAC[CONVEX_CONTAINS_SEGMENT_IMP; CONVEX_CBALL] THEN
14363     REWRITE_TAC[CENTRE_IN_CBALL; REAL_POS] THEN
14364     DISCH_THEN(MP_TAC o SPEC `&12 / (&1 - t)` o MATCH_MP
14365      (ONCE_REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_BOUND_LINEPATH)) THEN
14366     ANTS_TAC THENL
14367      [ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_SUB_LT; REAL_LT_IMP_LE] THEN
14368       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
14369       MP_TAC(ISPECL [`Cx(&0)`; `z:complex`; `w:complex`] SEGMENT_BOUND) THEN
14370       ASM_REWRITE_TAC[COMPLEX_SUB_RZERO] THEN STRIP_TAC THEN
14371       MP_TAC(ISPECL
14372        [`g:complex->complex`; `cball(Cx(&0),&1)`; `w:complex`;
14373         `&1 - t`; `&1`] BLOCH_COROLLARY) THEN
14374       ASM_REWRITE_TAC[FRONTIER_CBALL; COMPLEX_IN_CBALL_0;
14375                       COMPLEX_IN_SPHERE_0] THEN
14376       MATCH_MP_TAC(TAUT
14377        `p /\ q /\ ~s /\ (~r ==> t) ==> (p /\ q /\ r ==> s) ==> t`) THEN
14378       REWRITE_TAC[REAL_NOT_LE] THEN REPEAT CONJ_TAC THENL
14379        [ASM_REAL_ARITH_TAC;
14380         MAP_EVERY UNDISCH_TAC
14381          [`norm(w:complex) <= norm(z:complex)`; `norm(z:complex) <= t`] THEN
14382         CONV_TAC NORM_ARITH;
14383         MATCH_MP_TAC(SET_RULE
14384          `!t u. (!b. (?w. w IN t /\ w IN ball(b,&1)) \/
14385                      (?w. w IN u /\ w IN ball(b,&1))) /\
14386                 (!x. x IN d ==> ~(g x IN t UNION u))
14387                 ==> ~(?b. ball(b,&1) SUBSET IMAGE g d)`) THEN
14388         MAP_EVERY EXISTS_TAC
14389          [`{ complex(m,log(&n + sqrt(&n pow 2 - &1)) / pi) |
14390               integer m /\ 0 < n}`;
14391           `{ complex(m,--log(&n + sqrt(&n pow 2 - &1)) / pi) |
14392              integer m /\ 0 < n}`] THEN
14393         REWRITE_TAC[EXISTS_IN_GSPEC] THEN CONJ_TAC THENL
14394          [X_GEN_TAC `b:complex` THEN REWRITE_TAC[OR_EXISTS_THM] THEN
14395           MP_TAC(ISPEC `Re b` INTEGER_ROUND) THEN
14396           MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `m:real` THEN
14397           STRIP_TAC THEN ASM_REWRITE_TAC[IN_BALL] THEN
14398           DISJ_CASES_TAC(REAL_ARITH `&0 <= Im b \/ &0 <= --(Im b)`) THENL
14399            [MP_TAC(SPEC `Im b` lemma2); MP_TAC(SPEC `--(Im b)` lemma2)] THEN
14400           ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
14401           X_GEN_TAC `n:num` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THENL
14402            [DISJ1_TAC; DISJ2_TAC] THEN
14403           REWRITE_TAC[dist] THEN
14404           W(MP_TAC o PART_MATCH lhand COMPLEX_NORM_LE_RE_IM o lhand o snd) THEN
14405           MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LET_TRANS) THEN
14406           MATCH_MP_TAC(REAL_ARITH
14407            `x <= &1 / &2 /\ y < &1 / &2 ==> x + y < &1`) THEN
14408           ASM_REWRITE_TAC[RE_SUB; IM_SUB; RE; IM] THEN ASM_REAL_ARITH_TAC;
14409           X_GEN_TAC `v:complex` THEN DISCH_TAC THEN
14410           DISCH_THEN(DISJ_CASES_TAC o MATCH_MP lemma3) THEN
14411           REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `v:complex`)) THEN
14412           ASM_REWRITE_TAC[] THEN CONV_TAC COMPLEX_RING];
14413           REWRITE_TAC[REAL_ARITH `a * c / &12 < &1 <=> c * a < &12`] THEN
14414           ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_SUB_LT] THEN MATCH_MP_TAC
14415            (NORM_ARITH `x = y ==> norm(x) < d ==> norm(y) <= d`) THEN
14416           MATCH_MP_TAC COMPLEX_DERIVATIVE_UNIQUE_AT THEN
14417           MAP_EVERY EXISTS_TAC [`g:complex->complex`; `w:complex`] THEN
14418           REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14419           MATCH_MP_TAC(TAUT `(q ==> p) /\ q ==> p /\ q`) THEN
14420           CONJ_TAC THENL [MESON_TAC[complex_differentiable]; ALL_TAC] THEN
14421           MATCH_MP_TAC(MESON[]
14422            `!s. (g has_complex_derivative g') (at x within s) /\
14423                 ((g has_complex_derivative g') (at x within s) <=>
14424                  (g has_complex_derivative g') (at x))
14425                 ==> (g has_complex_derivative g') (at x)`) THEN
14426           EXISTS_TAC `cball(Cx(&0),&1)` THEN CONJ_TAC THENL
14427            [FIRST_X_ASSUM MATCH_MP_TAC THEN
14428             REWRITE_TAC[COMPLEX_IN_CBALL_0] THEN ASM_REAL_ARITH_TAC;
14429             REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN;
14430                         HAS_COMPLEX_DERIVATIVE_AT] THEN
14431             MATCH_MP_TAC LIM_WITHIN_INTERIOR THEN
14432             REWRITE_TAC[INTERIOR_CBALL; COMPLEX_IN_BALL_0] THEN
14433             ASM_REAL_ARITH_TAC]];
14434       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
14435       ONCE_REWRITE_TAC[REAL_ARITH `&12 * t / s = &12 / s * t`] THEN
14436       MATCH_MP_TAC REAL_LE_LMUL THEN
14437       ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_SUB_LT; REAL_LT_IMP_LE] THEN
14438       ASM_REWRITE_TAC[COMPLEX_SUB_RZERO]];
14439     GEN_REWRITE_TAC (LAND_CONV o RAND_CONV)
14440      [COMPLEX_RING `y = (Cx(&1) + (Cx(&2) * y - Cx(&1))) / Cx(&2)`] THEN
14441     ASM_SIMP_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
14442     ONCE_REWRITE_TAC[REAL_ARITH `x / &2 <= y <=> x <= &2 * y`] THEN
14443     W(MP_TAC o PART_MATCH lhand NORM_CCOS_PLUS1_LE o lhand o snd) THEN
14444     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
14445     MATCH_MP_TAC REAL_LE_LMUL THEN
14446     REWRITE_TAC[REAL_POS; REAL_EXP_MONO_LE; COMPLEX_NORM_MUL] THEN
14447     REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_PI] THEN
14448     MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[PI_POS_LE] THEN
14449     W(MP_TAC o PART_MATCH lhand NORM_CCOS_LE o lhand o snd) THEN
14450     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
14451     REWRITE_TAC[REAL_EXP_MONO_LE; COMPLEX_NORM_MUL] THEN
14452     REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_PI] THEN
14453     MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[PI_POS_LE] THEN
14454     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
14455      `norm(z - w) <= c ==> norm w <= a + b ==> norm z <= a + b + c`)) THEN
14456     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14457         REAL_LE_TRANS)) THEN
14458     UNDISCH_TAC `norm(f(Cx(&0)):complex) <= r` THEN
14459     CONV_TAC NORM_ARITH]);;
14460
14461 (* ------------------------------------------------------------------------- *)
14462 (* The Little Picard Theorem.                                                *)
14463 (* ------------------------------------------------------------------------- *)
14464
14465 let LANDAU_PICARD = prove
14466  (`?R. (!z. &0 < R z) /\
14467        !f. f holomorphic_on cball(Cx(&0),R(f(Cx(&0)))) /\
14468            (!z. z IN cball(Cx(&0),R(f(Cx(&0))))
14469                 ==> ~(f(z) = Cx(&0)) /\ ~(f(z) = Cx(&1)))
14470            ==> norm(complex_derivative f (Cx(&0))) < &1`,
14471   ABBREV_TAC
14472    `R = \z:complex. &3 * exp(pi * exp(pi * (&2 + &2 * norm(z) + &12)))` THEN
14473   EXISTS_TAC `R:complex->real` THEN
14474   MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
14475    [EXPAND_TAC "R" THEN
14476     REWRITE_TAC[REAL_EXP_POS_LT; REAL_ARITH `&0 < &3 * x <=> &0 < x`];
14477     DISCH_TAC] THEN
14478   REPEAT STRIP_TAC THEN
14479   ABBREV_TAC `r = (R:complex->real)(f(Cx(&0)))` THEN
14480   SUBGOAL_THEN `&0 < r` ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
14481   ABBREV_TAC `g = \z. (f:complex->complex)(Cx r * z)` THEN
14482   SUBGOAL_THEN
14483    `!z. z IN cball(Cx(&0),&1) ==> (Cx r * z) IN cball(Cx(&0),r)`
14484   ASSUME_TAC THENL
14485    [REWRITE_TAC[COMPLEX_IN_CBALL_0; COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
14486     ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH
14487      `&0 < r ==> (abs r * z <= r <=> r * z <= r * &1)`];
14488     ALL_TAC] THEN
14489   SUBGOAL_THEN `g holomorphic_on cball(Cx(&0),&1)` ASSUME_TAC THENL
14490    [EXPAND_TAC "g" THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
14491     MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
14492     SIMP_TAC[HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST] THEN
14493     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14494       HOLOMORPHIC_ON_SUBSET)) THEN
14495     ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE];
14496     ALL_TAC] THEN
14497   MP_TAC(ISPECL [`g:complex->complex`; `norm(f(Cx(&0)):complex)`]
14498     SCHOTTKY) THEN
14499   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
14500    [EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_MUL_RZERO; REAL_LE_REFL] THEN
14501     GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[DE_MORGAN_THM] THEN
14502     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC[];
14503     ALL_TAC] THEN
14504   DISCH_THEN(MP_TAC o SPEC `&1 / &2`) THEN
14505   CONV_TAC REAL_RAT_REDUCE_CONV THEN
14506   MP_TAC(ASSUME `(R:complex->real)(f(Cx(&0))) = r`) THEN
14507   EXPAND_TAC "R" THEN
14508   SIMP_TAC[REAL_ARITH `&3 * x = r <=> x = r / &3`] THEN
14509   DISCH_THEN SUBST1_TAC THEN DISCH_THEN(LABEL_TAC "*") THEN
14510   MP_TAC(ISPECL
14511    [`g:complex->complex`; `Cx(&0)`; `&1 / &2`; `r / &3`; `1`]
14512         CAUCHY_INEQUALITY) THEN
14513   CONV_TAC NUM_REDUCE_CONV THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
14514   REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_1] THEN
14515   ASM_SIMP_TAC[COMPLEX_SUB_LZERO; NORM_NEG; REAL_EQ_IMP_LE] THEN
14516   ANTS_TAC THENL
14517    [CONJ_TAC THENL
14518      [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; ALL_TAC] THEN
14519     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14520       HOLOMORPHIC_ON_SUBSET)) THEN
14521     REWRITE_TAC[SUBSET_BALLS; DIST_REFL] THEN CONV_TAC REAL_RAT_REDUCE_CONV;
14522     ALL_TAC] THEN
14523   SUBGOAL_THEN
14524    `complex_derivative g (Cx(&0)) = Cx r * complex_derivative f (Cx(&0))`
14525   SUBST1_TAC THENL
14526    [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN EXPAND_TAC "g" THEN
14527     REWRITE_TAC[] THEN ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
14528     ONCE_REWRITE_TAC[GSYM o_DEF] THEN MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
14529     CONJ_TAC THENL
14530      [COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_MUL_LID]; ALL_TAC] THEN
14531     REWRITE_TAC[COMPLEX_MUL_LZERO; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14532     MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
14533     EXISTS_TAC `ball(Cx(&0),r)` THEN
14534     ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
14535     ASM_MESON_TAC[BALL_SUBSET_CBALL; HOLOMORPHIC_ON_SUBSET];
14536     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
14537     ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH
14538      `&0 < r ==> (abs r * z <= &1 * r / &3 / (&1 / &2) <=>
14539                   r * z <= r * &2 / &3)`] THEN
14540     REAL_ARITH_TAC]);;
14541
14542 let LITTLE_PICARD = prove
14543  (`!f a b.
14544       f holomorphic_on (:complex) /\
14545       ~(a = b) /\ IMAGE f (:complex) INTER {a,b} = {}
14546       ==> ?c. f = \x. c`,
14547   let lemma = prove
14548    (`!f. f holomorphic_on (:complex) /\
14549          (!z. ~(f z = Cx(&0)) /\ ~(f z = Cx(&1)))
14550          ==> ?c. f = \x. c`,
14551     X_CHOOSE_THEN `R:complex->real` MP_TAC LANDAU_PICARD THEN
14552     REPEAT STRIP_TAC THEN
14553     MP_TAC(ISPECL [`f:complex->complex`; `(:complex)`]
14554       HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
14555     REWRITE_TAC[IN_UNIV; FUN_EQ_THM; CONNECTED_UNIV; OPEN_UNIV] THEN
14556     DISCH_THEN MATCH_MP_TAC THEN X_GEN_TAC `w:complex` THEN
14557     ASM_CASES_TAC `complex_derivative f w = Cx(&0)` THENL
14558      [FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
14559       REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14560       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_UNIV; IN_UNIV];
14561       MATCH_MP_TAC(TAUT `F ==> p`)] THEN
14562     FIRST_X_ASSUM(MP_TAC o SPEC
14563      `\z. (f:complex->complex)(w + z / complex_derivative f w)`) THEN
14564     ASM_REWRITE_TAC[NOT_IMP] THEN CONJ_TAC THENL
14565      [GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
14566       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
14567        [ALL_TAC; ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV]] THEN
14568       REWRITE_TAC[HOLOMORPHIC_ON_DIFFERENTIABLE] THEN
14569       REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC;
14570       SUBGOAL_THEN
14571        `complex_derivative (\z. f (w + z / complex_derivative f w)) (Cx(&0)) =
14572         complex_derivative f w * inv(complex_derivative f w)`
14573       SUBST1_TAC THENL
14574        [ALL_TAC;
14575         ASM_SIMP_TAC[COMPLEX_MUL_RINV; COMPLEX_NORM_CX; REAL_ABS_NUM;
14576                      REAL_LT_REFL]] THEN
14577       ONCE_REWRITE_TAC[GSYM o_DEF] THEN
14578       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
14579       MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN CONJ_TAC THENL
14580        [COMPLEX_DIFF_TAC THEN
14581         REWRITE_TAC[COMPLEX_ADD_LID; COMPLEX_MUL_LID; complex_div];
14582         REWRITE_TAC[complex_div; COMPLEX_MUL_LZERO; COMPLEX_ADD_RID] THEN
14583         REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14584         ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_UNIV;
14585                       IN_UNIV]]]) in
14586   REPEAT STRIP_TAC THEN
14587   MP_TAC(SPEC `\x:complex. Cx(&1) / (b - a) * (f x - b) + Cx(&1)` lemma) THEN
14588   ASM_SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_SUB;
14589                HOLOMORPHIC_ON_CONST] THEN
14590   ASM_SIMP_TAC[FUN_EQ_THM; COMPLEX_FIELD
14591    `~(a = b)
14592     ==> (Cx(&1) / (b - a) * (f - b) + Cx(&1) = c <=>
14593          f = b + (b - a) / Cx(&1) * (c - Cx(&1)))`] THEN
14594   ANTS_TAC THENL [ALL_TAC; MESON_TAC[]] THEN
14595   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I
14596    [SET_RULE `IMAGE f UNIV INTER t = {} <=> !x. ~(f x IN t)`]) THEN
14597   MATCH_MP_TAC MONO_FORALL THEN
14598   REWRITE_TAC[CONTRAPOS_THM; IN_INSERT; NOT_IN_EMPTY] THEN
14599   CONV_TAC COMPLEX_RING);;
14600
14601 (* ------------------------------------------------------------------------- *)
14602 (* A couple of little applications of Little Picard.                         *)
14603 (* ------------------------------------------------------------------------- *)
14604
14605 let HOLOMORPHIC_PERIODIC_FIXPOINT = prove
14606  (`!f p. f holomorphic_on (:complex) /\ ~(p = Cx(&0)) /\ (!z. f(z + p) = f(z))
14607          ==> ?x. f(x) = x`,
14608   REWRITE_TAC[MESON[] `(?x. P x) <=> ~(!x. ~P x)`] THEN REPEAT STRIP_TAC THEN
14609   MP_TAC(ISPECL
14610    [`\z:complex. f(z) - z`; `Cx(&0)`; `p:complex`] LITTLE_PICARD) THEN
14611   ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; NOT_IMP] THEN
14612   REWRITE_TAC[SET_RULE `IMAGE f UNIV INTER {a,b} = {} <=>
14613                           !x. ~(f x = a) /\ ~(f x = b)`] THEN
14614   CONJ_TAC THENL
14615    [REWRITE_TAC[COMPLEX_RING `a - b:complex = c <=> a = b + c`;
14616                 COMPLEX_ADD_RID] THEN
14617     ASM_MESON_TAC[];
14618     REWRITE_TAC[NOT_EXISTS_THM; FUN_EQ_THM] THEN GEN_TAC THEN
14619     DISCH_THEN(fun th ->
14620      MP_TAC(SPEC `p + p:complex` th) THEN
14621      MP_TAC(SPEC `p:complex` th)) THEN
14622     ASM_REWRITE_TAC[] THEN
14623     UNDISCH_TAC `~(p = Cx(&0))` THEN CONV_TAC COMPLEX_RING]);;
14624
14625 let HOLOMORPHIC_INVOLUTION_POINT = prove
14626  (`!f. f holomorphic_on (:complex) /\ ~(?a. f = \x. a + x) ==> ?x. f(f x) = x`,
14627   REWRITE_TAC[MESON[] `(?x. P x) <=> ~(!x. ~P x)`] THEN REPEAT STRIP_TAC THEN
14628   SUBGOAL_THEN `!z:complex. ~(f z = z)` ASSUME_TAC THENL
14629    [ASM_MESON_TAC[]; ALL_TAC] THEN
14630   MP_TAC(ISPECL [`\x. (f(f x) - x) / (f x - x)`; `Cx(&0)`; `Cx(&1)`]
14631         LITTLE_PICARD) THEN
14632   REWRITE_TAC[NOT_IMP; CX_INJ; REAL_OF_NUM_EQ; ARITH_EQ] THEN
14633   REWRITE_TAC[SET_RULE `IMAGE f UNIV INTER {a,b} = {} <=>
14634                           !x. ~(f x = a) /\ ~(f x = b)`] THEN
14635   ASM_SIMP_TAC[FUN_EQ_THM; COMPLEX_FIELD
14636      `~(a:complex = b) ==> (x / (a - b) = c <=> x = c * (a - b))`] THEN
14637   REPEAT CONJ_TAC THENL
14638    [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
14639     ASM_SIMP_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
14640     MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
14641     ASM_REWRITE_TAC[HOLOMORPHIC_ON_ID] THEN
14642     GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
14643     MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
14644     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV];
14645     ASM_REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_MUL_LID; COMPLEX_SUB_0] THEN
14646     REWRITE_TAC[COMPLEX_RING `x - a:complex = y - a <=> x = y`] THEN
14647     ASM_MESON_TAC[];
14648     DISCH_THEN(X_CHOOSE_THEN `c:complex` MP_TAC)] THEN
14649   ASM_CASES_TAC `c = Cx(&0)` THEN
14650   ASM_REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_SUB_0] THEN
14651   ASM_CASES_TAC `c = Cx(&1)` THEN
14652   ASM_REWRITE_TAC[COMPLEX_RING `ffx - x = Cx(&1) * (fx - x) <=> ffx = fx`] THEN
14653   REWRITE_TAC[COMPLEX_RING
14654    `ffx - x = c * (fx - x) <=> (ffx - c * fx) = x * (Cx(&1) - c)`] THEN
14655   DISCH_TAC THEN
14656   MP_TAC(SPECL
14657    [`complex_derivative f o f`; `Cx(&0)`; `c:complex`] LITTLE_PICARD) THEN
14658   REWRITE_TAC[SET_RULE `IMAGE f UNIV INTER {a,b} = {} <=>
14659                           !x. ~(f x = a) /\ ~(f x = b)`] THEN
14660   ASM_REWRITE_TAC[o_THM; NOT_IMP] THEN REPEAT CONJ_TAC THENL
14661    [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
14662     ASM_MESON_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_UNIV; SUBSET_UNIV;
14663                   HOLOMORPHIC_ON_SUBSET];
14664     MP_TAC(MATCH_MP MONO_FORALL (GEN `z:complex` (SPECL
14665      [`\x:complex. f(f x) - c * f x`; `z:complex`;
14666       `complex_derivative f z * (complex_derivative f (f z) - c)`;
14667       `Cx(&1) * (Cx(&1) - c)`] COMPLEX_DERIVATIVE_UNIQUE_AT))) THEN
14668     ANTS_TAC THENL
14669      [REPEAT STRIP_TAC THENL
14670        [REWRITE_TAC[COMPLEX_RING `a * (b - c):complex = b * a - c * a`] THEN
14671         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN CONJ_TAC THENL
14672          [ONCE_REWRITE_TAC[GSYM o_DEF] THEN MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT;
14673           MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_LMUL_AT] THEN
14674         REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14675         ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; IN_UNIV; OPEN_UNIV];
14676         ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_RMUL_AT THEN
14677         REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_ID]];
14678       DISCH_THEN(fun th -> X_GEN_TAC `z:complex` THEN REPEAT STRIP_TAC THEN
14679                         MP_TAC th)
14680       THENL [DISCH_THEN(MP_TAC o SPEC `(f:complex->complex) z`);
14681              DISCH_THEN(MP_TAC o SPEC `z:complex`)] THEN
14682       ASM_REWRITE_TAC[] THEN
14683       UNDISCH_TAC `~(c = Cx(&1))` THEN CONV_TAC COMPLEX_RING];
14684       REWRITE_TAC[FUN_EQ_THM; o_THM] THEN
14685       DISCH_THEN(X_CHOOSE_TAC `k:complex`) THEN
14686       SUBGOAL_THEN `open(IMAGE (f:complex->complex) (:complex))`
14687       ASSUME_TAC THENL
14688        [MATCH_MP_TAC(REWRITE_RULE[RIGHT_IMP_FORALL_THM; IMP_IMP]
14689          OPEN_MAPPING_THM) THEN
14690         EXISTS_TAC `(:complex)` THEN
14691         ASM_REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; SUBSET_UNIV; IN_UNIV] THEN
14692         ASM_MESON_TAC[];
14693         ALL_TAC] THEN
14694       MP_TAC(ISPECL
14695         [`\z. complex_derivative f z - k`; `(:complex)`;
14696          `IMAGE (f:complex->complex) (:complex)`; `(f:complex->complex) z`]
14697         ANALYTIC_CONTINUATION) THEN
14698       REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; SUBSET_UNIV; IN_UNIV] THEN
14699       ASM_REWRITE_TAC[FORALL_IN_IMAGE; COMPLEX_SUB_0; NOT_IMP] THEN
14700       REPEAT CONJ_TAC THENL
14701        [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN REWRITE_TAC[ETA_AX] THEN
14702         ASM_MESON_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_UNIV; SUBSET_UNIV;
14703                       HOLOMORPHIC_ON_SUBSET; HOLOMORPHIC_ON_CONST];
14704         MATCH_MP_TAC LIMPT_OF_OPEN THEN ASM_REWRITE_TAC[] THEN SET_TAC[];
14705         DISCH_TAC] THEN
14706       MP_TAC(ISPECL
14707        [`\x:complex. f x - k * x`; `(:complex)`]
14708         HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
14709       REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; IN_UNIV; NOT_IMP] THEN
14710       CONJ_TAC THENL
14711        [X_GEN_TAC `z:complex` THEN
14712         SUBST1_TAC(COMPLEX_RING `Cx(&0) = k - k * Cx(&1)`) THEN
14713         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN CONJ_TAC THENL
14714          [ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE;
14715                         HOLOMORPHIC_ON_OPEN; OPEN_UNIV; IN_UNIV;
14716                         complex_differentiable];
14717           COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING];
14718         DISCH_THEN(X_CHOOSE_THEN `l:complex` MP_TAC) THEN
14719         REWRITE_TAC[COMPLEX_RING `a - b:complex = c <=> a = b + c`] THEN
14720         DISCH_THEN(fun th -> RULE_ASSUM_TAC(REWRITE_RULE[th; FUN_EQ_THM])) THEN
14721         ASM_CASES_TAC `k = Cx(&1)` THENL
14722          [UNDISCH_TAC `!a:complex. ~(!x. k * x + l = a + x)` THEN
14723           ASM_REWRITE_TAC[COMPLEX_MUL_LID] THEN MESON_TAC[COMPLEX_ADD_SYM];
14724           UNDISCH_TAC `!z:complex. ~(k * z + l = z)` THEN
14725           ASM_SIMP_TAC[COMPLEX_FIELD
14726            `~(k = Cx(&1)) ==> (k * z + l = z <=> z = l / (Cx(&1) - k))`] THEN
14727           MESON_TAC[]]]]);;
14728
14729 (* ------------------------------------------------------------------------- *)
14730 (* Montel's theorem: a sequence of holomorphic functions uniformly bounded   *)
14731 (* on compact subsets of an open set S has a subsequence that converges to a *)
14732 (* holomorphic function, and converges *uniformly* on compact subsets of S.  *)
14733 (* ------------------------------------------------------------------------- *)
14734
14735 let MONTEL = prove
14736  (`!(f:num->complex->complex) p s.
14737     open s /\ (!h. h IN p ==> h holomorphic_on s) /\
14738     (!k. compact k /\ k SUBSET s
14739          ==> ?b. !h z. h IN p /\ z IN k ==> norm(h z) <= b) /\
14740     (!n. (f n) IN p)
14741     ==> ?g r. g holomorphic_on s /\
14742               (!m n:num. m < n ==> r m < r n) /\
14743               (!x. x IN s ==> ((\n. f (r n) x) --> g(x)) sequentially) /\
14744               (!k e. compact k /\ k SUBSET s /\ &0 < e
14745                      ==> ?N. !n x. n >= N /\ x IN k
14746                                    ==> norm(f (r n) x - g x) < e)`,
14747   REPEAT GEN_TAC THEN
14748   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
14749   SPEC_TAC(`f:num->complex->complex`,`f:num->complex->complex`) THEN
14750   REWRITE_TAC[LIM_SEQUENTIALLY] THEN
14751   REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP; GSYM GE; dist] THEN
14752   FIRST_ASSUM(MP_TAC o MATCH_MP OPEN_UNION_COMPACT_SUBSETS) THEN
14753   DISCH_THEN(X_CHOOSE_THEN `k:num->complex->bool`
14754    (fun th -> FIRST_X_ASSUM(MP_TAC o GEN `i:num `o
14755                 SPEC `(k:num->complex->bool) i`) THEN
14756               STRIP_ASSUME_TAC th)) THEN
14757   ASM_REWRITE_TAC[SKOLEM_THM; LEFT_IMP_EXISTS_THM] THEN
14758   X_GEN_TAC `B:num->real` THEN DISCH_TAC THEN
14759   SUBGOAL_THEN
14760    `!(f:num->complex->complex) (i:num).
14761         (!n. f n IN p)
14762         ==>  ?r g. (!m n:num. m < n ==> r m < r n) /\
14763                    (!e. &0 < e ==> ?N. !n x. n >= N /\ x IN k i
14764                                              ==> norm((f o r) n x - g x) < e)`
14765   MP_TAC THENL
14766    [REPEAT STRIP_TAC THEN REWRITE_TAC[o_THM] THEN
14767     MP_TAC(ISPECL [`f:num->complex->complex`; `(k:num->complex->bool) i`;
14768                    `(B:num->real) i`] ARZELA_ASCOLI) THEN
14769     ANTS_TAC THENL [ASM_SIMP_TAC[]; MESON_TAC[]] THEN
14770     MAP_EVERY X_GEN_TAC [`z:complex`; `e:real`] THEN STRIP_TAC THEN
14771     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
14772     DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
14773     ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[SUBSET; IN_CBALL]] THEN
14774     DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
14775     SUBGOAL_THEN
14776      `?M. &0 < M /\
14777           !n w. dist(z,w) <= &2 / &3 * r
14778                 ==> norm((f:num->complex->complex) n w) <= M`
14779     STRIP_ASSUME_TAC THENL
14780      [FIRST_X_ASSUM(MP_TAC o SPEC `cball(z:complex,&2 / &3 * r)`) THEN
14781       ASM_SIMP_TAC[SUBSET; IN_CBALL; COMPACT_CBALL;
14782               NORM_ARITH `dist(a,b) <= &2 / &3 * r ==> dist(a,b) <= r`] THEN
14783       DISCH_THEN(X_CHOOSE_THEN `N:num` (MP_TAC o SPEC `N:num`)) THEN
14784       REWRITE_TAC[GE; LE_REFL] THEN DISCH_TAC THEN
14785       EXISTS_TAC `abs(B(N:num)) + &1` THEN
14786       REWRITE_TAC[REAL_ARITH `&0 < abs x + &1`] THEN
14787       ASM_MESON_TAC[SUBSET; REAL_ARITH `x <= b ==> x <= abs b + &1`];
14788       ALL_TAC] THEN
14789     EXISTS_TAC `min (r / &3) ((e * r) / (&6 * M))` THEN
14790     ASM_SIMP_TAC[REAL_LT_MIN; REAL_LT_DIV;
14791                  REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
14792     MAP_EVERY X_GEN_TAC [`n:num`; `y:complex`] THEN STRIP_TAC THEN
14793     MP_TAC
14794      (ISPECL [`(f:num->complex->complex) n`;  `cball(z:complex,&2 / &3 * r)`;
14795               `circlepath(z:complex,&2 / &3 * r)`]
14796         CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE) THEN
14797     REWRITE_TAC[CONVEX_CBALL; VALID_PATH_CIRCLEPATH] THEN
14798     REWRITE_TAC[PATHSTART_CIRCLEPATH; PATHFINISH_CIRCLEPATH] THEN
14799     SIMP_TAC[INTERIOR_CBALL; IN_BALL; WINDING_NUMBER_CIRCLEPATH;
14800              NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
14801     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH;
14802                  REAL_ARITH `&0 < r ==> &0 <= &2 / &3 * r`] THEN
14803     REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
14804     SIMP_TAC[SUBSET; IN_CBALL; IN_DELETE; IN_ELIM_THM; REAL_LE_REFL;
14805              NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
14806     ONCE_REWRITE_TAC[TAUT `p ==> ~q <=> q ==> ~p`] THEN
14807     SIMP_TAC[FORALL_UNWIND_THM2; IMP_CONJ; REAL_LT_IMP_NE] THEN
14808     REWRITE_TAC[RIGHT_FORALL_IMP_THM; COMPLEX_MUL_LID] THEN ANTS_TAC THENL
14809      [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
14810       EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[SUBSET; IN_CBALL] THEN
14811       ASM_SIMP_TAC[NORM_ARITH `dist(a,b) <= &2 / &3 * r ==> dist(a,b) <= r`];
14812       ALL_TAC] THEN
14813     DISCH_THEN(fun th ->
14814       MP_TAC(SPEC `y:complex` th) THEN MP_TAC(SPEC `z:complex` th)) THEN
14815     ASM_SIMP_TAC[VECTOR_SUB_REFL; NORM_0; REAL_LT_MUL; REAL_LT_DIV;
14816       REAL_OF_NUM_LT; ARITH; NORM_ARITH
14817        `norm(z - y) < r / &3 ==> norm(y - z) < &2 / &3 * r`] THEN
14818     REWRITE_TAC[IMP_IMP] THEN
14819     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
14820     DISCH_THEN(MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
14821         HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH)) THEN
14822     REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB; COMPLEX_NORM_MUL] THEN
14823     REWRITE_TAC[COMPLEX_NORM_II; COMPLEX_NORM_CX; REAL_ABS_PI;
14824                 REAL_ABS_NUM; REAL_MUL_LID] THEN
14825     DISCH_THEN(MP_TAC o SPEC `e / r:real`) THEN
14826     ASM_SIMP_TAC[REAL_FIELD
14827      `&0 < r ==> e / r * &2 * pi * c * r = &2 * pi * e * c`] THEN
14828     SIMP_TAC[REAL_LE_LMUL_EQ; REAL_OF_NUM_LT; ARITH; PI_POS] THEN
14829     ANTS_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
14830     ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH;
14831                  REAL_LT_MUL] THEN
14832     X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
14833     SUBGOAL_THEN `~(w:complex = z) /\ ~(w = y)` STRIP_ASSUME_TAC THENL
14834      [CONJ_TAC THEN DISCH_THEN SUBST_ALL_TAC THEN
14835       RULE_ASSUM_TAC(REWRITE_RULE[NORM_0; VECTOR_SUB_REFL]) THEN
14836       RULE_ASSUM_TAC(REWRITE_RULE[NORM_SUB]) THEN ASM_REAL_ARITH_TAC;
14837       ALL_TAC] THEN
14838     ASM_SIMP_TAC[COMPLEX_FIELD
14839      `~(w:complex = z) /\ ~(w = y)
14840       ==> (a / (w - z) - a / (w - y) =
14841            (a * (z - y)) / ((w - z) * (w - y)))`] THEN
14842     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV] THEN
14843     ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LT_MUL; NORM_POS_LT; VECTOR_SUB_EQ;
14844      REAL_FIELD `&0 < r ==> e / r * (&2 / &3 * r) * x = &2 / &3 * e * x`] THEN
14845     MATCH_MP_TAC REAL_LE_TRANS THEN
14846     EXISTS_TAC `M * (e * r) / (&6 * M)` THEN CONJ_TAC THENL
14847      [MATCH_MP_TAC REAL_LE_MUL2 THEN
14848       ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE] THEN
14849       FIRST_X_ASSUM MATCH_MP_TAC THEN
14850       ASM_REWRITE_TAC[NORM_ARITH `dist(x,y) = norm(y - x)`; REAL_LE_REFL];
14851       ASM_SIMP_TAC[REAL_FIELD `&0 < M ==> M * e / (&6 * M) = e / &6`] THEN
14852       MATCH_MP_TAC(REAL_ARITH
14853        `&0 < x /\ x <= y * &3 ==> x / &6 <= &2 / &3 * y`) THEN
14854       ASM_SIMP_TAC[REAL_LT_MUL; GSYM REAL_MUL_ASSOC; REAL_LE_LMUL_EQ] THEN
14855       MAP_EVERY UNDISCH_TAC
14856        [`norm(w - z:complex) = &2 / &3 * r`;
14857         `norm(z - y:complex) < r / &3`] THEN
14858       CONV_TAC NORM_ARITH];
14859     ALL_TAC] THEN
14860   REWRITE_TAC[RIGHT_EXISTS_AND_THM] THEN
14861   DISCH_THEN(fun th -> X_GEN_TAC `f:num->complex->complex` THEN
14862                        DISCH_TAC THEN MP_TAC th) THEN
14863   DISCH_THEN(MP_TAC o GENL [`i:num`; `r:num->num`] o
14864     SPECL [`(f:num->complex->complex) o (r:num->num)`; `i:num`]) THEN
14865   GEN_REWRITE_TAC
14866    (LAND_CONV o funpow 2 BINDER_CONV o LAND_CONV o ONCE_DEPTH_CONV)
14867    [o_THM] THEN ASM_REWRITE_TAC[GSYM o_ASSOC] THEN
14868   DISCH_THEN(MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
14869     SUBSEQUENCE_DIAGONALIZATION_LEMMA)) THEN
14870   ANTS_TAC THENL
14871    [SIMP_TAC[o_THM; GE] THEN REPEAT GEN_TAC THEN
14872     DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
14873     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
14874     MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `e:real` THEN
14875     MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
14876     DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN
14877     EXISTS_TAC `MAX M N` THEN
14878     REWRITE_TAC[ARITH_RULE `MAX m n <= x <=> m <= x /\ n <= x`] THEN
14879     ASM_MESON_TAC[LE_TRANS];
14880     ALL_TAC] THEN
14881   DISCH_THEN(MP_TAC o SPEC `I:num->num`) THEN
14882   REWRITE_TAC[I_O_ID; RIGHT_AND_EXISTS_THM] THEN
14883   ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
14884   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `r:num->num` THEN
14885   REWRITE_TAC[o_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
14886   SUBGOAL_THEN
14887    `!x. x IN s
14888         ==> ?l. !e. &0 < e
14889                     ==> ?N:num. !n. n >= N
14890                                 ==> norm((f:num->complex->complex) (r n) x - l)
14891                                     < e`
14892   MP_TAC THENL
14893    [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
14894     FIRST_X_ASSUM(MP_TAC o SPEC `{z:complex}`) THEN
14895     ASM_REWRITE_TAC[COMPACT_SING; SING_SUBSET] THEN
14896     DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
14897     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SKOLEM_THM]) THEN
14898     DISCH_THEN(X_CHOOSE_THEN `G:num->complex->complex` MP_TAC) THEN
14899     DISCH_THEN(LABEL_TAC "*" o SPEC `N:num`) THEN
14900     EXISTS_TAC `(G:num->complex->complex) N z` THEN
14901     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
14902     REMOVE_THEN "*" (MP_TAC o SPEC `e:real`) THEN
14903     ASM_REWRITE_TAC[] THEN
14904     DISCH_THEN(X_CHOOSE_THEN `M:num` STRIP_ASSUME_TAC) THEN
14905     EXISTS_TAC `MAX M N` THEN
14906     REWRITE_TAC[ARITH_RULE `a >= MAX m n <=> a >= m /\ a >= n`] THEN
14907     ASM_MESON_TAC[GE_REFL];
14908     ALL_TAC] THEN
14909   GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [RIGHT_IMP_EXISTS_THM] THEN
14910   REWRITE_TAC[SKOLEM_THM; RIGHT_IMP_FORALL_THM; IMP_IMP] THEN
14911   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
14912   DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
14913   MATCH_MP_TAC(TAUT `b /\ (b ==> a) ==> a /\ b`) THEN CONJ_TAC THENL
14914    [MAP_EVERY X_GEN_TAC [`t:complex->bool`; `e:real`] THEN STRIP_TAC THEN
14915     FIRST_X_ASSUM(MP_TAC o SPEC `t:complex->bool`) THEN ASM_REWRITE_TAC[] THEN
14916     DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN
14917     FIRST_X_ASSUM(X_CHOOSE_THEN `h:complex->complex` (LABEL_TAC "*") o
14918       SPEC `N:num`) THEN
14919     SUBGOAL_THEN
14920      `!w. w IN t ==> g w = (h:complex->complex) w`
14921      (fun th -> ASM_MESON_TAC[GE_REFL; SUBSET; th]) THEN
14922     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
14923     MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN
14924     EXISTS_TAC `\n:num. (f:num->complex->complex)(r n) w` THEN
14925     ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; LIM_SEQUENTIALLY] THEN
14926     REWRITE_TAC[GSYM GE; dist; o_THM] THEN
14927     ASM_MESON_TAC[SUBSET; GE_REFL];
14928     DISCH_THEN(LABEL_TAC "*")] THEN
14929   MATCH_MP_TAC HOLOMORPHIC_UNIFORM_SEQUENCE THEN
14930   EXISTS_TAC `(f:num->complex->complex) o (r:num->num)` THEN
14931   ASM_SIMP_TAC[o_THM] THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
14932   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
14933   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
14934   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
14935   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
14936   REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN ASM_MESON_TAC[COMPACT_CBALL; GE]);;
14937
14938 (* ------------------------------------------------------------------------- *)
14939 (* Moebius functions are biholomorphisms of the unit disc.                   *)
14940 (* ------------------------------------------------------------------------- *)
14941
14942 let moebius_function = new_definition
14943   `!t w z. moebius_function t w z =
14944            cexp(ii * Cx t) * (z - w) / (Cx(&1) - cnj w * z)`;;
14945
14946 let MOEBIUS_FUNCTION_SIMPLE = prove
14947  (`!w z. moebius_function (&0) w z = (z - w) / (Cx(&1) - cnj w * z)`,
14948   REWRITE_TAC[moebius_function; COMPLEX_MUL_RZERO; CEXP_0; COMPLEX_MUL_LID]);;
14949
14950 let MOEBIUS_FUNCTION_EQ_ZERO = prove
14951   (`!t w. moebius_function t w w = Cx(&0)`,
14952    REWRITE_TAC [moebius_function] THEN CONV_TAC COMPLEX_FIELD);;
14953
14954 let MOEBIUS_FUNCTION_OF_ZERO = prove
14955   (`!t w. moebius_function t w (Cx(&0)) = -- cexp(ii * Cx t) * w`,
14956    REWRITE_TAC [moebius_function] THEN CONV_TAC COMPLEX_FIELD);;
14957
14958 let MOEBIUS_FUNCTION_NORM_LT_1 = prove
14959   (`!t w z. norm w < &1 /\ norm z < &1
14960             ==> norm (moebius_function t w z) < &1`,
14961    REPEAT STRIP_TAC THEN SUBGOAL_THEN
14962      `!a. &0 <= a /\ &0 < &1 - a pow 2 ==> a < &1` MATCH_MP_TAC THENL
14963    [GEN_TAC THEN ASM_CASES_TAC `&0 <= a` THEN
14964     ASM_REWRITE_TAC [REAL_FIELD `&1 - a pow 2 = (&1 - a) * (&1 + a)`;
14965                      REAL_MUL_POS_LT] THEN
14966     REAL_ARITH_TAC;
14967     ALL_TAC] THEN
14968    REWRITE_TAC [NORM_POS_LE] THEN
14969    SUBGOAL_THEN `~(Cx(&1) - cnj w * z = Cx(&0))` ASSUME_TAC THENL
14970    [REWRITE_TAC [COMPLEX_SUB_0] THEN
14971     SUBGOAL_THEN `~(norm (Cx(&1)) = norm (cnj w * z))`
14972      (fun th -> MESON_TAC [th]) THEN
14973     REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL; COMPLEX_NORM_CNJ] THEN
14974     MATCH_MP_TAC (REAL_ARITH `a * b < &1  ==> ~(&1 = a * b)`) THEN
14975     STRIP_ASSUME_TAC (NORM_ARITH `norm (z:complex) = &0 \/ &0 < norm z`) THENL
14976     [ASM_REWRITE_TAC [REAL_MUL_RZERO; REAL_LT_01];
14977      MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (z:complex)` THEN
14978      ASM_SIMP_TAC[REAL_LT_RMUL; REAL_MUL_LID]];
14979    ALL_TAC] THEN
14980    SUBGOAL_THEN
14981     `&1 - norm (moebius_function t w z) pow 2 =
14982      ((&1 - norm w pow 2) / (norm (Cx(&1) - cnj w * z) pow 2)) *
14983      (&1 - norm z pow 2)`
14984    SUBST1_TAC THENL
14985    [REWRITE_TAC [moebius_function;
14986                  GSYM CX_INJ; CX_SUB; CX_MUL; CX_DIV; CX_POW; CNJ_SUB; CNJ_CX;
14987                  CNJ_MUL; CNJ_DIV; CNJ_CNJ; COMPLEX_NORM_POW_2] THEN
14988     SUBGOAL_THEN
14989       `cnj (cexp(ii * Cx t)) * (cexp(ii * Cx t)) = Cx(&1) /\
14990        ~(Cx(&1) - cnj w * z = Cx(&0)) /\ ~(Cx(&1) - w * cnj z = Cx(&0))`
14991      MP_TAC THENL [ALL_TAC; CONV_TAC COMPLEX_FIELD] THEN
14992     REWRITE_TAC [CNJ_CEXP; CNJ_MUL; CNJ_II; CNJ_CX;
14993                   COMPLEX_MUL_LNEG; CEXP_NEG_LMUL] THEN ASM_REWRITE_TAC [] THEN
14994     SUBGOAL_THEN `~(cnj (Cx(&1) - cnj w * z) = Cx(&0))` MP_TAC THENL
14995     [ASM_REWRITE_TAC [CNJ_EQ_0];
14996      REWRITE_TAC [CNJ_SUB; CNJ_CX; CNJ_MUL; CNJ_CNJ]];
14997     SUBGOAL_THEN `!u:complex. norm u < &1 ==> &0 < &1 - norm u pow 2`
14998       ASSUME_TAC THENL
14999     [REWRITE_TAC [REAL_FIELD `!a. &1 - a pow 2 = (&1 - a) * (&1 + a)`] THEN
15000      ASM_SIMP_TAC [REAL_LT_MUL; REAL_SUB_LT; REAL_LTE_ADD; REAL_LT_01;
15001                    NORM_POS_LE];
15002      SUBGOAL_THEN `&0 < norm (Cx(&1) - cnj w * z) pow 2`
15003       (fun th -> ASM_MESON_TAC [th; REAL_LT_MUL; REAL_LT_DIV]) THEN
15004      ASM_REWRITE_TAC [REAL_RING `!a:real. a pow 2 =  a * a`;
15005                       REAL_LT_SQUARE; COMPLEX_NORM_ZERO]]]);;
15006
15007 let MOEBIUS_FUNCTION_HOLOMORPHIC = prove
15008   (`!t w. norm w < &1 ==> moebius_function t w holomorphic_on ball(Cx(&0),&1)`,
15009    let LEMMA_1 = prove
15010     (`!a b:complex. norm a < &1 /\ norm b < &1 ==> ~(Cx(&1) - a * b = Cx(&0))`,
15011      GEN_TAC THEN GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC [COMPLEX_SUB_0] THEN
15012      SUBGOAL_THEN `~(norm (Cx(&1)) = norm (a * b))`
15013        (fun th -> MESON_TAC[th]) THEN
15014      REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL] THEN
15015      MATCH_MP_TAC (REAL_ARITH `!x y. y < x ==> ~(x = y)`) THEN
15016      ASM_CASES_TAC `b = Cx(&0)` THEN
15017      ASM_REWRITE_TAC [COMPLEX_NORM_NUM; REAL_MUL_RZERO; REAL_LT_01] THEN
15018      MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (b:complex)` THEN
15019      CONJ_TAC THENL
15020      [MATCH_MP_TAC REAL_LT_RMUL THEN ASM_REWRITE_TAC [COMPLEX_NORM_NZ];
15021       ASM_REWRITE_TAC [REAL_MUL_LID]]) in
15022    REPEAT STRIP_TAC THEN
15023    SUBST1_TAC (GSYM (ISPEC `moebius_function t w` ETA_AX)) THEN
15024    REWRITE_TAC [moebius_function] THEN
15025    MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN  CONJ_TAC THENL
15026    [MATCH_MP_TAC (REWRITE_RULE [o_DEF] HOLOMORPHIC_ON_COMPOSE_GEN) THEN
15027     EXISTS_TAC `(:complex)` THEN REWRITE_TAC [HOLOMORPHIC_ON_CEXP; IN_UNIV] THEN
15028     SIMP_TAC [HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_CONST];
15029     MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
15030     SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST;
15031              HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_MUL] THEN
15032     ASM_SIMP_TAC[COMPLEX_IN_BALL_0; LEMMA_1; COMPLEX_NORM_CNJ]]);;
15033
15034 let MOEBIUS_FUNCTION_COMPOSE = prove
15035  (`!w1 w2 z.
15036      -- w1 = w2  /\ norm w1 < &1 /\ norm z < &1
15037      ==> moebius_function (&0) w1 (moebius_function (&0) w2 z) = z`,
15038   let LEMMA_1 = prove
15039    (`!a b:complex. norm a < &1 /\ norm b < &1
15040                    ==> ~(Cx(&1) - a * b = Cx(&0))`,
15041     GEN_TAC THEN GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC [COMPLEX_SUB_0] THEN
15042     SUBGOAL_THEN `~(norm (Cx(&1)) = norm (a * b))`
15043       (fun th -> MESON_TAC[th]) THEN
15044     REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL] THEN
15045     MATCH_MP_TAC (REAL_ARITH `!x y. y < x ==> ~(x = y)`) THEN
15046     ASM_CASES_TAC `b = Cx(&0)` THEN
15047     ASM_REWRITE_TAC [COMPLEX_NORM_NUM; REAL_MUL_RZERO; REAL_LT_01] THEN
15048     MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (b:complex)` THEN
15049     CONJ_TAC THENL
15050     [MATCH_MP_TAC REAL_LT_RMUL THEN ASM_REWRITE_TAC [COMPLEX_NORM_NZ];
15051      ASM_REWRITE_TAC [REAL_MUL_LID]]) in
15052   let LEMMA_1_ALT = prove
15053     (`!a b:complex. norm a < &1 /\ norm b < &1
15054                     ==> ~(Cx(&1) + a * b = Cx(&0))`,
15055      REPEAT GEN_TAC THEN STRIP_TAC THEN
15056      SUBST1_TAC (COMPLEX_RING `a : complex = -- (-- a)`) THEN
15057      ABBREV_TAC `u : complex= -- a` THEN
15058      REWRITE_TAC [COMPLEX_MUL_LNEG; GSYM complex_sub] THEN
15059      MATCH_MP_TAC LEMMA_1 THEN EXPAND_TAC "u" THEN
15060      ASM_REWRITE_TAC[NORM_NEG]) in
15061   REPEAT STRIP_TAC THEN
15062   SUBGOAL_THEN `norm (w2:complex) < &1` ASSUME_TAC THENL
15063    [EXPAND_TAC "w2" THEN ASM_REWRITE_TAC [NORM_NEG]; ALL_TAC] THEN
15064   REWRITE_TAC [moebius_function; COMPLEX_MUL_RZERO;
15065                CEXP_0; COMPLEX_MUL_LID] THEN
15066   MATCH_MP_TAC (COMPLEX_FIELD
15067      `!a b c. ~(b = Cx(&0)) /\ a = b * c ==> a / b = c`) THEN
15068   CONJ_TAC THENL
15069    [ALL_TAC; MP_TAC (SPECL [`cnj w2`;`z:complex`] LEMMA_1) THEN
15070     ASM_REWRITE_TAC [COMPLEX_NORM_CNJ] THEN EXPAND_TAC "w2" THEN
15071     REWRITE_TAC [CNJ_NEG] THEN CONV_TAC COMPLEX_FIELD] THEN
15072   MATCH_MP_TAC (COMPLEX_FIELD
15073       `!a b c d. ~(d = Cx(&0)) /\ ~(d * a - b * c  = Cx(&0))
15074                  ==> ~(a - b * c / d  = Cx(&0))`) THEN
15075   ASM_SIMP_TAC [LEMMA_1; COMPLEX_NORM_CNJ] THEN
15076   ASM_REWRITE_TAC [COMPLEX_MUL_RID] THEN
15077   SUBGOAL_THEN
15078       `Cx(&1) - cnj w2 * z - cnj w1 * (z - w2) =
15079        Cx(&1) + cnj w1 * w2` SUBST1_TAC THENL
15080    [EXPAND_TAC "w2" THEN REWRITE_TAC [CNJ_NEG] THEN CONV_TAC COMPLEX_RING;
15081     ASM_SIMP_TAC [LEMMA_1_ALT; COMPLEX_NORM_CNJ]]);;
15082
15083 let BALL_BIHOLOMORPHISM_EXISTS = prove
15084  (`!a. a IN ball(Cx(&0),&1)
15085        ==> ?f g. f(a) = Cx(&0) /\
15086                  f holomorphic_on ball (Cx(&0),&1) /\
15087                  (!z. z IN ball (Cx(&0),&1) ==> f z IN ball (Cx(&0),&1)) /\
15088                  g holomorphic_on ball (Cx(&0),&1) /\
15089                  (!z. z IN ball (Cx(&0),&1) ==> g z IN ball (Cx(&0),&1)) /\
15090                  (!z. z IN ball (Cx(&0),&1) ==> f (g z) = z) /\
15091                  (!z. z IN ball (Cx(&0),&1) ==> g (f z) = z)`,
15092   REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
15093   EXISTS_TAC `moebius_function (&0) a` THEN
15094   EXISTS_TAC `moebius_function (&0) (--a)` THEN
15095   ASM_SIMP_TAC[COMPLEX_IN_BALL_0; MOEBIUS_FUNCTION_COMPOSE; COMPLEX_NEG_NEG;
15096                NORM_NEG] THEN
15097   ASM_SIMP_TAC[MOEBIUS_FUNCTION_NORM_LT_1; NORM_NEG;
15098                MOEBIUS_FUNCTION_HOLOMORPHIC; MOEBIUS_FUNCTION_EQ_ZERO]);;
15099
15100 let BALL_BIHOLOMORPHISM_MOEBIUS_FUNCTION = prove
15101   (`!f g.
15102       f holomorphic_on ball (Cx(&0),&1) /\
15103       (!z. z IN ball (Cx(&0),&1) ==> f z IN ball (Cx(&0),&1)) /\
15104       g holomorphic_on ball (Cx(&0),&1) /\
15105       (!z. z IN ball (Cx(&0),&1) ==> g z IN ball (Cx(&0),&1)) /\
15106       (!z. z IN ball (Cx(&0),&1) ==> f (g z) = z) /\
15107       (!z. z IN ball (Cx(&0),&1) ==> g (f z) = z)
15108       ==> ?t w. w IN ball (Cx(&0),&1) /\
15109                 (!z. z IN ball (Cx(&0),&1) ==> f z = moebius_function t w z)`,
15110    let LEMMA_1 = prove
15111      (`!a b:complex. norm a < &1 /\ norm b < &1
15112                      ==> ~(Cx(&1) - a * b = Cx(&0))`,
15113       GEN_TAC THEN GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC [COMPLEX_SUB_0] THEN
15114       SUBGOAL_THEN `~(norm (Cx(&1)) = norm (a * b))`
15115         (fun th -> MESON_TAC[th]) THEN
15116       REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL] THEN
15117       MATCH_MP_TAC (REAL_ARITH `!x y. y < x ==> ~(x = y)`) THEN
15118       ASM_CASES_TAC `b = Cx(&0)` THEN
15119       ASM_REWRITE_TAC [COMPLEX_NORM_NUM; REAL_MUL_RZERO; REAL_LT_01] THEN
15120       MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (b:complex)` THEN
15121       CONJ_TAC THENL
15122       [MATCH_MP_TAC REAL_LT_RMUL THEN ASM_REWRITE_TAC [COMPLEX_NORM_NZ];
15123        ASM_REWRITE_TAC [REAL_MUL_LID]]) in
15124    let LEMMA_2 = prove
15125      (`!t w s z. norm w < &1 /\ norm z < &1
15126                  ==> moebius_function t w (cexp(ii * Cx s) * z) =
15127                      moebius_function (t + s) (cexp(-- (ii * Cx s)) * w) z`,
15128       REPEAT STRIP_TAC THEN
15129       REWRITE_TAC[moebius_function; CX_ADD; COMPLEX_ADD_LDISTRIB; CEXP_ADD;
15130                   GSYM COMPLEX_MUL_ASSOC; COMPLEX_EQ_MUL_LCANCEL; CEXP_NZ;
15131                CNJ_MUL] THEN
15132       MATCH_MP_TAC (COMPLEX_FIELD
15133         `!a b c d e. ~(b = Cx(&0)) /\ ~(e = Cx(&0)) /\ e * a = b * c * d
15134                      ==> a / b = c * d / e`) THEN CONJ_TAC THENL
15135       [MATCH_MP_TAC LEMMA_1 THEN
15136        ASM_REWRITE_TAC [COMPLEX_NORM_CNJ; COMPLEX_NORM_MUL; NORM_CEXP_II;
15137                         REAL_MUL_LID];
15138        ALL_TAC] THEN
15139       CONJ_TAC THENL
15140       [REWRITE_TAC [COMPLEX_MUL_ASSOC] THEN MATCH_MP_TAC LEMMA_1 THEN
15141        ASM_REWRITE_TAC [COMPLEX_NORM_MUL; COMPLEX_NORM_CNJ; COMPLEX_NEG_RMUL;
15142                         GSYM CX_NEG; NORM_CEXP_II; REAL_MUL_LID];
15143        REWRITE_TAC [CNJ_CEXP; CNJ_NEG; CNJ_MUL; CNJ_II; CNJ_CX;
15144                     COMPLEX_MUL_LNEG; COMPLEX_NEG_NEG; CEXP_NEG] THEN
15145        ABBREV_TAC `a = cexp(ii * Cx s)` THEN
15146        SUBGOAL_THEN `inv a * a = Cx(&1)` MP_TAC THENL
15147        [ALL_TAC; CONV_TAC COMPLEX_RING] THEN
15148        MATCH_MP_TAC COMPLEX_MUL_LINV THEN EXPAND_TAC "a" THEN
15149        REWRITE_TAC [CEXP_NZ]]) in
15150    REWRITE_TAC [COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
15151    ABBREV_TAC `w:complex = f (Cx(&0))` THEN
15152    SUBGOAL_THEN `norm(w:complex) < &1` ASSUME_TAC THENL
15153    [ASM_MESON_TAC [COMPLEX_NORM_NUM; REAL_LT_01]; ALL_TAC] THEN
15154    SUBGOAL_THEN
15155     `?t. !z. z IN ball (Cx(&0),&1)
15156              ==> moebius_function (&0) w (f z) = cexp(ii * Cx t) * z`
15157     STRIP_ASSUME_TAC THENL
15158    [ALL_TAC;
15159     EXISTS_TAC `t:real` THEN EXISTS_TAC `-- (cexp(-- (ii * Cx t)) * w)` THEN
15160     ASM_REWRITE_TAC [NORM_NEG; COMPLEX_NORM_MUL; COMPLEX_NEG_RMUL;
15161                      GSYM CX_NEG; NORM_CEXP_II; REAL_MUL_LID] THEN
15162     GEN_TAC THEN DISCH_TAC THEN EQ_TRANS_TAC
15163       `moebius_function (&0) (--w)
15164          (moebius_function (&0) w (f (z:complex)))` THENL
15165     [MATCH_MP_TAC EQ_SYM THEN MATCH_MP_TAC MOEBIUS_FUNCTION_COMPOSE THEN
15166      ASM_SIMP_TAC [COMPLEX_NEG_NEG; NORM_NEG];
15167      ASM_SIMP_TAC[COMPLEX_IN_BALL_0] THEN ASM_SIMP_TAC[LEMMA_2; NORM_NEG] THEN
15168      REWRITE_TAC [REAL_ADD_LID; CX_NEG; COMPLEX_MUL_RNEG]]] THEN
15169    MATCH_MP_TAC SECOND_CARTAN_THM_DIM_1 THEN EXISTS_TAC
15170      `\z. g (moebius_function (&0) (--w) z) : complex` THEN
15171    REWRITE_TAC [COMPLEX_IN_BALL_0] THEN REWRITE_TAC [REAL_LT_01] THEN
15172    CONJ_TAC THENL
15173    [MATCH_MP_TAC (REWRITE_RULE [o_DEF] HOLOMORPHIC_ON_COMPOSE_GEN) THEN
15174     EXISTS_TAC `ball(Cx(&0),&1)` THEN
15175     ASM_SIMP_TAC [ETA_AX; MOEBIUS_FUNCTION_HOLOMORPHIC; COMPLEX_IN_BALL_0];
15176     ALL_TAC] THEN CONJ_TAC THENL [ASM_SIMP_TAC [MOEBIUS_FUNCTION_NORM_LT_1];
15177     ALL_TAC] THEN
15178    CONJ_TAC THENL [ASM_REWRITE_TAC [MOEBIUS_FUNCTION_EQ_ZERO]; ALL_TAC] THEN
15179    CONJ_TAC THENL
15180    [MATCH_MP_TAC (REWRITE_RULE [o_DEF] HOLOMORPHIC_ON_COMPOSE_GEN) THEN
15181     EXISTS_TAC `ball(Cx(&0),&1)` THEN
15182     ASM_SIMP_TAC [COMPLEX_IN_BALL_0; MOEBIUS_FUNCTION_NORM_LT_1;
15183                   NORM_NEG] THEN
15184     ASM_SIMP_TAC [ETA_AX; MOEBIUS_FUNCTION_HOLOMORPHIC; NORM_NEG];
15185     ALL_TAC] THEN CONJ_TAC THENL
15186    [ASM_SIMP_TAC [MOEBIUS_FUNCTION_NORM_LT_1; NORM_NEG]; ALL_TAC] THEN
15187    CONJ_TAC THENL
15188    [ASM_REWRITE_TAC [MOEBIUS_FUNCTION_OF_ZERO; COMPLEX_MUL_RZERO; CEXP_0;
15189                      GSYM COMPLEX_NEG_LMUL; COMPLEX_MUL_LID;
15190                       COMPLEX_NEG_NEG] THEN
15191     ASM_MESON_TAC [COMPLEX_NORM_0; REAL_LT_01];
15192     ALL_TAC] THEN CONJ_TAC THENL
15193    [ALL_TAC;
15194     ASM_SIMP_TAC [REWRITE_RULE [COMPLEX_NEG_NEG; NORM_NEG]
15195          (SPECL [`--w:complex`;`w:complex`] MOEBIUS_FUNCTION_COMPOSE)]] THEN
15196     REPEAT STRIP_TAC THEN SUBGOAL_THEN
15197      `f (g (moebius_function (&0) (--w) z) : complex) =
15198       (moebius_function (&0) (--w) z)`
15199      SUBST1_TAC THENL
15200    [FIRST_X_ASSUM MATCH_MP_TAC THEN
15201     ASM_SIMP_TAC [MOEBIUS_FUNCTION_NORM_LT_1; NORM_NEG];
15202     MATCH_MP_TAC MOEBIUS_FUNCTION_COMPOSE THEN ASM_REWRITE_TAC []]);;
15203
15204 (* ------------------------------------------------------------------------- *)
15205 (* Some simple but useful cases of Hurwitz's theorem.                        *)
15206 (* ------------------------------------------------------------------------- *)
15207
15208 let HURWITZ_NO_ZEROS = prove
15209  (`!f:num->complex->complex g s.
15210         open s /\ connected s /\
15211         (!n. (f n) holomorphic_on s) /\ g holomorphic_on s /\
15212         (!k e. compact k /\ k SUBSET s /\ &0 < e
15213                ==> ?N. !n x. n >= N /\ x IN k ==> norm(f n x - g x) < e) /\
15214         ~(?c. !z. z IN s ==> g z = c) /\
15215         (!n z. z IN s ==> ~(f n z = Cx(&0)))
15216         ==> (!z. z IN s ==> ~(g z = Cx(&0)))`,
15217   REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `z0:complex` THEN
15218   REPEAT DISCH_TAC THEN
15219   MP_TAC(ISPECL [`g:complex->complex`; `s:complex->bool`; `z0:complex`]
15220    HOLOMORPHIC_FACTOR_ZERO_NONCONSTANT) THEN ASM_REWRITE_TAC[] THEN
15221   REWRITE_TAC[NOT_EXISTS_THM] THEN
15222   MAP_EVERY X_GEN_TAC [`h:complex->complex`; `r:real`; `m:num`] THEN
15223   STRIP_TAC THEN
15224   MP_TAC(ISPECL
15225    [`sequentially`; `\n:num z. complex_derivative (f n) z / f n z`;
15226     `\z. complex_derivative g z / g z`;  `z0:complex`; `r / &2`]
15227    PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH) THEN
15228   ASM_REWRITE_TAC[REAL_HALF; TRIVIAL_LIMIT_SEQUENTIALLY; NOT_IMP] THEN
15229   SUBGOAL_THEN
15230    `!n:num. ((\z. complex_derivative (f n) z / f n z)
15231              has_path_integral (Cx(&0))) (circlepath(z0,r / &2))`
15232   ASSUME_TAC THENL
15233    [X_GEN_TAC `n:num` THEN MATCH_MP_TAC CAUCHY_THEOREM_DISC_SIMPLE THEN
15234     MAP_EVERY EXISTS_TAC [`z0:complex`; `r:real`] THEN
15235     ASM_SIMP_TAC[VALID_PATH_CIRCLEPATH; PATHSTART_CIRCLEPATH;
15236                  PATHFINISH_CIRCLEPATH; PATH_IMAGE_CIRCLEPATH;
15237                  REAL_HALF; REAL_LT_IMP_LE] THEN
15238     REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
15239     REWRITE_TAC[SUBSET; IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
15240     ASM_SIMP_TAC[IN_ELIM_THM; REAL_ARITH `&0 < r ==> r / &2 < r`] THEN
15241     MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN REPEAT CONJ_TAC THENL
15242      [REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
15243       REWRITE_TAC[OPEN_BALL];
15244       REWRITE_TAC[ETA_AX];
15245       ASM_MESON_TAC[SUBSET]] THEN
15246     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET];
15247     ALL_TAC] THEN
15248   REPEAT CONJ_TAC THENL
15249    [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
15250     REWRITE_TAC[path_integrable_on] THEN ASM_MESON_TAC[];
15251     MATCH_MP_TAC UNIFORM_LIM_COMPLEX_DIV THEN
15252     REWRITE_TAC[LEFT_EXISTS_AND_THM; CONJ_ASSOC] THEN
15253     REWRITE_TAC[RIGHT_EXISTS_AND_THM; GSYM CONJ_ASSOC] THEN
15254     REWRITE_TAC[LEFT_EXISTS_AND_THM] THEN
15255     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_HALF; REAL_LT_IMP_LE] THEN
15256     REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
15257     REWRITE_TAC[IN_ELIM_THM] THEN REPEAT CONJ_TAC THENL
15258      [MP_TAC(ISPEC `IMAGE (complex_derivative g) {w | norm(w - z0) = r / &2}`
15259         COMPACT_IMP_BOUNDED) THEN
15260       ANTS_TAC THENL
15261        [MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
15262         REWRITE_TAC[o_DEF;
15263          REWRITE_RULE[sphere; NORM_ARITH `dist(w:real^N,z) = norm(z - w)`]
15264                     COMPACT_SPHERE] THEN
15265         MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
15266         MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
15267         EXISTS_TAC `s:complex->bool` THEN
15268         ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE] THEN
15269         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15270           SUBSET_TRANS)) THEN
15271         REWRITE_TAC[SUBSET; IN_BALL; IN_ELIM_THM] THEN
15272         UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH;
15273         REWRITE_TAC[bounded; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
15274         MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN DISCH_TAC THEN
15275         MATCH_MP_TAC ALWAYS_EVENTUALLY THEN ASM_SIMP_TAC[]];
15276       MP_TAC(ISPEC `IMAGE (norm o (g:complex->complex))
15277           {w | norm(w - z0) = r / &2}`
15278           COMPACT_ATTAINS_INF) THEN
15279       REWRITE_TAC[EXISTS_IN_IMAGE; FORALL_IN_IMAGE; IMAGE_EQ_EMPTY] THEN
15280       REWRITE_TAC[GSYM IMAGE_o; FORALL_IN_GSPEC; EXISTS_IN_GSPEC; o_THM] THEN
15281       ANTS_TAC THENL
15282        [CONJ_TAC THENL
15283          [MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
15284           REWRITE_TAC[o_DEF;
15285             REWRITE_RULE[sphere; NORM_ARITH `dist(w:real^N,z) = norm(z - w)`]
15286                         COMPACT_SPHERE] THEN
15287           MATCH_MP_TAC CONTINUOUS_ON_LIFT_NORM_COMPOSE THEN
15288           MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
15289           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
15290             HOLOMORPHIC_ON_SUBSET)) THEN
15291           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15292             SUBSET_TRANS)) THEN
15293           REWRITE_TAC[SUBSET; IN_BALL; IN_ELIM_THM] THEN
15294           UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH;
15295           REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN
15296           EXISTS_TAC `z0 + Cx(r / &2)` THEN
15297           REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^N = b`] THEN
15298           REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC];
15299         DISCH_THEN(X_CHOOSE_THEN `ww:complex` MP_TAC) THEN
15300         STRIP_TAC THEN EXISTS_TAC `norm((g:complex->complex) ww)` THEN
15301         ASM_SIMP_TAC[ALWAYS_EVENTUALLY; COMPLEX_NORM_NZ] THEN
15302         DISCH_THEN(ASSUME_TAC o REWRITE_RULE[COMPLEX_NORM_ZERO]) THEN
15303         UNDISCH_TAC `!w. w IN ball(z0,r) ==> g w = (w - z0) pow m * h w` THEN
15304         DISCH_THEN(MP_TAC o SPEC `ww:complex`) THEN
15305         CONV_TAC(ONCE_DEPTH_CONV SYM_CONV) THEN
15306         ASM_SIMP_TAC[COMPLEX_ENTIRE; COMPLEX_POW_EQ_0] THEN
15307         REWRITE_TAC[IN_BALL; GSYM COMPLEX_NORM_ZERO] THEN
15308         ASM_REWRITE_TAC[ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
15309         ASM_REAL_ARITH_TAC];
15310       X_GEN_TAC `e:real` THEN DISCH_TAC THEN
15311       FIRST_ASSUM(MP_TAC o SPECL
15312        [`cball(z0:complex,&3 * r / &4)`; `r / &4 * e / &2`]) THEN
15313       REWRITE_TAC[COMPACT_CBALL] THEN ANTS_TAC THENL
15314        [ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
15315         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15316           SUBSET_TRANS)) THEN
15317         REWRITE_TAC[SUBSET; IN_BALL; IN_CBALL; IN_ELIM_THM] THEN
15318         UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH;
15319         REWRITE_TAC[GE; EVENTUALLY_SEQUENTIALLY; IN_CBALL; dist] THEN
15320         MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
15321         MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `n:num` THEN
15322         DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
15323         ASM_REWRITE_TAC[] THEN DISCH_TAC] THEN
15324       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
15325       MP_TAC(ISPECL
15326        [`\z. (f:num->complex->complex) n z - g z`;
15327         `w:complex`; `Cx(&0)`; `r / &4`; `r / &4 * e / &2`; `1`]
15328         CAUCHY_HIGHER_COMPLEX_DERIVATIVE_BOUND) THEN
15329       REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_1; COMPLEX_IN_BALL_0] THEN
15330       ANTS_TAC THENL
15331        [CONJ_TAC THENL [ASM_REAL_ARITH_TAC; CONV_TAC NUM_REDUCE_CONV] THEN
15332         REPEAT CONJ_TAC THENL
15333          [ALL_TAC;
15334           MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
15335           X_GEN_TAC `y:complex` THEN REWRITE_TAC[IN_BALL] THEN
15336           DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15337           MAP_EVERY UNDISCH_TAC
15338            [`norm(w - z0:complex) = r / &2`; `dist(w:complex,y) < r / &4`] THEN
15339           CONV_TAC NORM_ARITH] THEN
15340         (MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
15341          CONJ_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
15342          EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[ETA_AX] THEN
15343          FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15344           SUBSET_TRANS)) THEN
15345          REWRITE_TAC[SUBSET; IN_BALL; IN_CBALL; IN_ELIM_THM] THEN
15346          UNDISCH_TAC `norm(w - z0:complex) = r / &2` THEN
15347          UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH);
15348         CONV_TAC NUM_REDUCE_CONV THEN
15349         ASM_SIMP_TAC[REAL_FIELD
15350          `&0 < r /\ &0 < e
15351           ==> &1 * (r / &4 * e / &2) / (r / &4) pow 1 = e / &2`] THEN
15352         MATCH_MP_TAC(NORM_ARITH
15353          `x = y /\ &0 < e ==> norm(x) <= e / &2 ==> norm(y) < e`) THEN
15354         ASM_REWRITE_TAC[] THEN
15355         MATCH_MP_TAC COMPLEX_DERIVATIVE_SUB THEN CONJ_TAC THEN
15356         MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
15357         EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
15358         FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
15359         ASM_REWRITE_TAC[IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
15360         ASM_REAL_ARITH_TAC];
15361       X_GEN_TAC `e:real` THEN DISCH_TAC THEN
15362       REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
15363       FIRST_X_ASSUM(MP_TAC o SPECL
15364        [`{w:complex | norm(w - z0) = r / &2}`; `e:real`]) THEN
15365       ASM_REWRITE_TAC[GE; IN_ELIM_THM;
15366          REWRITE_RULE[sphere; NORM_ARITH `dist(w:real^N,z) = norm(z - w)`]
15367                     COMPACT_SPHERE] THEN
15368       ANTS_TAC THENL [ALL_TAC; MESON_TAC[]] THEN
15369       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15370           SUBSET_TRANS)) THEN
15371       REWRITE_TAC[SUBSET; IN_BALL; IN_ELIM_THM] THEN
15372       UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH];
15373     FIRST_ASSUM(ASSUME_TAC o GEN `n:num` o MATCH_MP PATH_INTEGRAL_UNIQUE o
15374         SPEC `n:num`) THEN
15375     DISCH_THEN(MP_TAC o CONJUNCT2) THEN
15376     ASM_REWRITE_TAC[LIM_CONST_EQ; TRIVIAL_LIMIT_SEQUENTIALLY] THEN
15377     MATCH_MP_TAC(COMPLEX_RING
15378      `!q r. p = q /\ q = r /\ ~(r = Cx(&0)) ==> ~(Cx(&0) = p)`) THEN
15379     MAP_EVERY EXISTS_TAC
15380      [`path_integral (circlepath(z0,r / &2))
15381                      (\z. Cx(&m) / (z - z0) +
15382                           complex_derivative h z / h z)`;
15383       `Cx(&2) * Cx pi * ii * Cx(&m)`] THEN
15384     REPEAT CONJ_TAC THENL
15385      [MATCH_MP_TAC PATH_INTEGRAL_EQ THEN X_GEN_TAC `w:complex` THEN
15386       ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; IN_ELIM_THM; REAL_HALF;
15387         REAL_LT_IMP_LE; sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
15388       ASM_CASES_TAC `w:complex = z0` THEN
15389       ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THENL
15390        [ASM_REAL_ARITH_TAC; DISCH_TAC] THEN
15391       SUBGOAL_THEN `w IN ball(z0:complex,r)` ASSUME_TAC THENL
15392        [REWRITE_TAC[IN_BALL] THEN
15393         MAP_EVERY UNDISCH_TAC [`norm (w - z0) = r / &2`; `&0 < r`] THEN
15394         CONV_TAC NORM_ARITH;
15395         ALL_TAC] THEN
15396       ASM_SIMP_TAC[] THEN
15397       ASM_SIMP_TAC[COMPLEX_ENTIRE; COMPLEX_POW_EQ_0; COMPLEX_SUB_0;
15398             COMPLEX_FIELD `~(y = Cx(&0)) ==> (x / y = w <=> x = y * w)`] THEN
15399       ASM_SIMP_TAC[COMPLEX_FIELD
15400        `~(h = Cx(&0)) ==> (m * h) * (x + y / h) = m * y + m * h * x`] THEN
15401       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
15402       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
15403       EXISTS_TAC `\w:complex. (w - z0) pow m * h w` THEN
15404       EXISTS_TAC `ball(z0:complex,r)` THEN ASM_SIMP_TAC[OPEN_BALL] THEN
15405       SUBGOAL_THEN
15406        `(w - z0) pow m * h w * Cx(&m) / (w - z0) =
15407         (Cx(&m) * (w - z0) pow (m - 1)) * h w`
15408       SUBST1_TAC THENL
15409        [MATCH_MP_TAC(COMPLEX_FIELD
15410          `w * mm = z /\ ~(w = Cx(&0))
15411           ==> z * h * m / w = (m * mm) * h`) THEN
15412         ASM_REWRITE_TAC[COMPLEX_SUB_0; GSYM(CONJUNCT2 complex_pow)] THEN
15413         AP_TERM_TAC THEN ASM_ARITH_TAC;
15414         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_MUL_AT THEN CONJ_TAC THENL
15415          [COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING;
15416           REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
15417           ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_BALL]]];
15418       GEN_REWRITE_TAC RAND_CONV [GSYM COMPLEX_ADD_RID] THEN
15419       MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
15420       MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN CONJ_TAC THENL
15421        [MATCH_MP_TAC CAUCHY_INTEGRAL_CIRCLEPATH_SIMPLE THEN
15422         ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_HALF; HOLOMORPHIC_ON_CONST];
15423         MATCH_MP_TAC CAUCHY_THEOREM_DISC_SIMPLE THEN
15424         MAP_EVERY EXISTS_TAC [`z0:complex`; `r:real`] THEN
15425         ASM_SIMP_TAC[VALID_PATH_CIRCLEPATH; PATHSTART_CIRCLEPATH;
15426                      PATHFINISH_CIRCLEPATH; PATH_IMAGE_CIRCLEPATH;
15427                      REAL_HALF; REAL_LT_IMP_LE] THEN
15428         REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
15429         REWRITE_TAC[SUBSET; IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
15430         ASM_SIMP_TAC[IN_ELIM_THM; REAL_ARITH `&0 < r ==> r / &2 < r`] THEN
15431         MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN ASM_REWRITE_TAC[ETA_AX] THEN
15432         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
15433         ASM_REWRITE_TAC[OPEN_BALL]];
15434       REWRITE_TAC[COMPLEX_ENTIRE; CX_INJ; PI_NZ; II_NZ; REAL_OF_NUM_EQ] THEN
15435       ASM_SIMP_TAC[LE_1; ARITH_EQ] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15436       ASM_REWRITE_TAC[CENTRE_IN_BALL]]]);;
15437
15438 let HURWITZ_INJECTIVE = prove
15439  (`!f:num->complex->complex g s.
15440     open s /\ connected s /\
15441     (!n. (f n) holomorphic_on s) /\ g holomorphic_on s /\
15442     (!k e. compact k /\ k SUBSET s /\ &0 < e
15443            ==> ?N. !n x. n >= N /\ x IN k ==> norm(f n x - g x) < e) /\
15444     ~(?c. !z. z IN s ==> g z = c) /\
15445     (!n w z. w IN s /\ z IN s /\ f n w = f n z ==> w = z)
15446     ==> (!w z. w IN s /\ z IN s /\ g w = g z ==> w = z)`,
15447   REPEAT GEN_TAC THEN STRIP_TAC THEN
15448   MAP_EVERY X_GEN_TAC [`z1:complex`; `z2:complex`] THEN
15449   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
15450   ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN REPEAT DISCH_TAC THEN
15451   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN
15452   DISCH_THEN(MP_TAC o SPEC `(g:complex->complex) z2`) THEN
15453   REWRITE_TAC[] THEN X_GEN_TAC `z0:complex` THEN
15454   ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN REPEAT DISCH_TAC THEN
15455   RULE_ASSUM_TAC(REWRITE_RULE[MESON[]
15456    `(!x y. x IN s /\ y IN s /\ g x = g y ==> x = y) <=>
15457     (!x y. x IN s /\ y IN s ==> (g x = g y <=> x = y))`]) THEN
15458   MP_TAC(ISPECL
15459    [`\z. (g:complex->complex) z - g z1`; `s:complex->bool`;
15460     `z2:complex`; `z0:complex`]
15461         ISOLATED_ZEROS) THEN
15462   ASM_SIMP_TAC[COMPLEX_SUB_0; HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID;
15463                HOLOMORPHIC_ON_CONST] THEN
15464   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
15465   MP_TAC(ISPECL
15466    [`\n z. (f:num->complex->complex) n z - f n z1`;
15467     `\z. (g:complex->complex) z - g z1`; `s DELETE (z1:complex)`]
15468         HURWITZ_NO_ZEROS) THEN
15469   REWRITE_TAC[NOT_IMP; COMPLEX_SUB_0] THEN REPEAT CONJ_TAC THENL
15470    [ASM_SIMP_TAC[OPEN_DELETE];
15471     ASM_SIMP_TAC[CONNECTED_OPEN_DELETE; DIMINDEX_2; LE_REFL];
15472     GEN_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
15473     EXISTS_TAC `s:complex->bool` THEN
15474     ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; ETA_AX; HOLOMORPHIC_ON_CONST] THEN
15475     SET_TAC[];
15476     MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
15477     EXISTS_TAC `s:complex->bool` THEN
15478     ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; ETA_AX; HOLOMORPHIC_ON_CONST] THEN
15479     SET_TAC[];
15480     MAP_EVERY X_GEN_TAC [`k:complex->bool`; `e:real`] THEN STRIP_TAC THEN
15481     FIRST_ASSUM(ASSUME_TAC o MATCH_MP (SET_RULE
15482      `k SUBSET s DELETE z ==> k SUBSET s`)) THEN
15483     FIRST_X_ASSUM(fun th ->
15484      MP_TAC(SPECL [`k:complex->bool`; `e / &2`] th) THEN
15485      MP_TAC(SPECL [`{z1:complex}`; `e / &2`] th)) THEN
15486     ASM_REWRITE_TAC[COMPACT_SING; SING_SUBSET; REAL_HALF] THEN
15487     SIMP_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; IN_SING; FORALL_UNWIND_THM2] THEN
15488     REWRITE_TAC[IMP_IMP; RIGHT_IMP_FORALL_THM] THEN DISCH_THEN(CONJUNCTS_THEN2
15489      (X_CHOOSE_TAC `N1:num`) (X_CHOOSE_TAC `N2:num`)) THEN
15490     EXISTS_TAC `MAX N1 N2` THEN REPEAT STRIP_TAC THEN
15491     UNDISCH_THEN `(g:complex->complex) z1 = g z2` (SUBST1_TAC o SYM) THEN
15492     MATCH_MP_TAC(NORM_ARITH
15493      `norm(x1 - x2) < e / &2 /\ norm(y1 - y2) < e / &2
15494       ==> norm(x1 - y1 - (x2 - y2)) < e`) THEN
15495     ASM_MESON_TAC[ARITH_RULE `x >= MAX m n <=> x >= m /\ x >= n`];
15496     REWRITE_TAC[IN_DELETE; COMPLEX_EQ_SUB_RADD] THEN DISCH_THEN(CHOOSE_THEN
15497      (fun th -> MAP_EVERY (MP_TAC o C SPEC th)
15498                  [`z0:complex`; `z1:complex`; `z2:complex`])) THEN
15499     ASM_MESON_TAC[];
15500     REWRITE_TAC[IN_DELETE] THEN ASM_MESON_TAC[];
15501     REWRITE_TAC[IN_DELETE] THEN ASM_MESON_TAC[]]);;
15502
15503 (* ------------------------------------------------------------------------- *)
15504 (* The Great Picard theorem.                                                 *)
15505 (* ------------------------------------------------------------------------- *)
15506
15507 let GREAT_PICARD = prove
15508  (`!f n a b z.
15509         open n /\ z IN n /\ ~(a = b) /\ f holomorphic_on (n DELETE z) /\
15510         (!w. w IN n DELETE z ==> ~(f w = a) /\ ~(f w = b))
15511         ==> ?l. (f --> l) (at z) \/ ((inv o f) --> l) (at z)`,
15512   let lemma1 = prove
15513    (`!p q r s w.
15514           open s /\ connected s /\ w IN s /\ &0 < r /\
15515           (!h. h IN p
15516                ==> h holomorphic_on s /\
15517                    !z. z IN s ==> ~(h z = Cx(&0)) /\ ~(h z = Cx(&1))) /\
15518           (!h. h IN q ==> h IN p /\ norm(h w) <= r)
15519           ==> ?B n. &0 < B /\ open n /\ w IN n /\ n SUBSET s /\
15520                     !h z. h IN q /\ z IN n ==> norm(h z) <= B`,
15521     REPEAT STRIP_TAC THEN
15522     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
15523     DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN ASM_REWRITE_TAC[] THEN
15524     DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
15525     MAP_EVERY EXISTS_TAC
15526      [`exp(pi * exp(pi * (&2 + &2 * r + &12)))`;
15527       `ball(w:complex,e / &2)`] THEN
15528     ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; REAL_HALF] THEN
15529     REWRITE_TAC[REAL_EXP_POS_LT] THEN CONJ_TAC THENL
15530      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15531           SUBSET_TRANS)) THEN
15532       REWRITE_TAC[SUBSET_BALLS; DIST_REFL] THEN ASM_REAL_ARITH_TAC;
15533       ALL_TAC] THEN
15534     MAP_EVERY X_GEN_TAC [`f:complex->complex`; `z:complex`] THEN
15535     STRIP_TAC THEN
15536     REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`)) THEN
15537     ASM_CASES_TAC `(f:complex->complex) IN p` THEN ASM_REWRITE_TAC[] THEN
15538     REPEAT STRIP_TAC THEN
15539     MP_TAC(ISPECL
15540      [`\z. (f:complex->complex) (w + Cx e * z)`; `r:real`]
15541      SCHOTTKY) THEN
15542     ASM_REWRITE_TAC[DE_MORGAN_THM; COMPLEX_MUL_RZERO; COMPLEX_ADD_RID] THEN
15543     ANTS_TAC THENL
15544      [CONJ_TAC THENL
15545        [GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
15546         MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
15547         SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_MUL;
15548                  HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID] THEN
15549         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
15550           HOLOMORPHIC_ON_SUBSET)) THEN
15551         REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
15552         X_GEN_TAC `u:complex` THEN DISCH_TAC;
15553         X_GEN_TAC `u:complex` THEN DISCH_TAC THEN
15554         FIRST_X_ASSUM MATCH_MP_TAC] THEN
15555       FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
15556       REWRITE_TAC[IN_CBALL; NORM_ARITH `dist(w,w + z) = norm z`] THEN
15557       REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
15558       ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH
15559        `&0 < e ==> (abs e * u <= e <=> e * u <= e * &1)`] THEN
15560       ASM_MESON_TAC[COMPLEX_IN_CBALL_0];
15561       DISCH_THEN(MP_TAC o SPECL [`&1 / &2`; `Cx(inv e) * (z - w)`]) THEN
15562       REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM CX_MUL] THEN
15563       ASM_SIMP_TAC[REAL_MUL_RINV; COMPLEX_NORM_MUL; REAL_LT_IMP_NZ] THEN
15564       REWRITE_TAC[COMPLEX_RING `w + Cx(&1) * (z - w) = z`] THEN
15565       CONV_TAC REAL_RAT_REDUCE_CONV THEN DISCH_THEN MATCH_MP_TAC THEN
15566       REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_INV] THEN
15567       ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE] THEN
15568       ONCE_REWRITE_TAC[REAL_ARITH `inv e * x:real = x / e`] THEN
15569       ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
15570       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
15571       CONV_TAC NORM_ARITH]) in
15572   let lemma2 = prove
15573    (`!s t:real^N->bool.
15574           connected t /\ ~(s = {}) /\ s SUBSET t /\ open s /\
15575           (!x. x limit_point_of s /\ x IN t ==> x IN s)
15576           ==> s = t`,
15577     REPEAT STRIP_TAC THEN
15578     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [CONNECTED_CLOPEN]) THEN
15579     DISCH_THEN(MP_TAC o SPEC `s:real^N->bool`) THEN
15580     ASM_REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN
15581     ASM_REWRITE_TAC[CLOSED_IN_LIMPT] THEN ASM_SIMP_TAC[OPEN_SUBSET]) in
15582   let lemma3 = prove
15583    (`!p s w q.
15584           open s /\ connected s /\ w IN s /\
15585           (!h. h IN p
15586                ==> h holomorphic_on s /\
15587                    !z. z IN s ==> ~(h z = Cx(&0)) /\ ~(h z = Cx(&1))) /\
15588           (!h. h IN q ==> h IN p /\ norm(h w) <= &1)
15589           ==> !k. compact k /\ k SUBSET s
15590                   ==> ?b. !h z. h IN q /\ z IN k ==> norm(h z) <= b`,
15591     REPEAT GEN_TAC THEN STRIP_TAC THEN
15592     ABBREV_TAC
15593      `u = {z | z IN s /\
15594                ?B n. &0 < B /\ open n /\ z IN n /\ n SUBSET s /\
15595                      !h:complex->complex z'.
15596                        h IN q /\ z' IN n ==> norm(h z') <= B}` THEN
15597     SUBGOAL_THEN `(u:complex->bool) SUBSET s` ASSUME_TAC THENL
15598      [EXPAND_TAC "u" THEN REWRITE_TAC[SUBSET_RESTRICT]; ALL_TAC] THEN
15599     SUBGOAL_THEN `u:complex->bool = s` ASSUME_TAC THENL
15600      [MATCH_MP_TAC lemma2 THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
15601        [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `w:complex` THEN
15602         EXPAND_TAC "u" THEN REWRITE_TAC[IN_ELIM_THM] THEN
15603         ASM_REWRITE_TAC[] THEN MATCH_MP_TAC lemma1 THEN
15604         MAP_EVERY EXISTS_TAC [`p:(complex->complex)->bool`; `&1`] THEN
15605         ASM_REWRITE_TAC[REAL_LT_01];
15606         ALL_TAC] THEN
15607       CONJ_TAC THENL
15608        [ONCE_REWRITE_TAC[OPEN_SUBOPEN] THEN X_GEN_TAC `z:complex` THEN
15609         EXPAND_TAC "u" THEN REWRITE_TAC[IN_ELIM_THM] THEN
15610         DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
15611         DISCH_THEN(X_CHOOSE_THEN `B:real` MP_TAC) THEN
15612         MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:complex->bool` THEN
15613         STRIP_TAC THEN ASM_REWRITE_TAC[] THEN EXPAND_TAC "u" THEN
15614         ONCE_REWRITE_TAC[SUBSET] THEN REWRITE_TAC[IN_ELIM_THM] THEN
15615         X_GEN_TAC `v:complex` THEN DISCH_TAC THEN
15616         CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
15617         MAP_EVERY EXISTS_TAC [`B:real`; `n:complex->bool`] THEN
15618         ASM_REWRITE_TAC[];
15619         ALL_TAC] THEN
15620       REWRITE_TAC[SUBSET] THEN X_GEN_TAC `v:complex` THEN STRIP_TAC THEN
15621       EXPAND_TAC "u" THEN REWRITE_TAC[IN_ELIM_THM] THEN
15622       ASM_REWRITE_TAC[] THEN MATCH_MP_TAC lemma1 THEN
15623       EXISTS_TAC `p:(complex->complex)->bool` THEN
15624       ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[MESON[]
15625        `(?r. P r /\ Q r) <=> ~(!r. P r ==> ~Q r)`] THEN
15626       DISCH_THEN(MP_TAC o GEN `n:num` o SPEC `&n + &1:real`) THEN
15627       REWRITE_TAC[REAL_ARITH `&0 < &n + &1`] THEN
15628       GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [NOT_FORALL_THM] THEN
15629       ASM_SIMP_TAC[SKOLEM_THM] THEN
15630       REWRITE_TAC[NOT_IMP; GSYM CONJ_ASSOC; REAL_NOT_LE] THEN
15631       REWRITE_TAC[FORALL_AND_THM] THEN
15632       DISCH_THEN(X_CHOOSE_THEN `f:num->complex->complex` STRIP_ASSUME_TAC) THEN
15633       ABBREV_TAC `g:num->complex->complex = \n z. inv(f n z)` THEN
15634       SUBGOAL_THEN `!n:num. (g n) holomorphic_on s` ASSUME_TAC THENL
15635        [GEN_TAC THEN EXPAND_TAC "g" THEN MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN
15636         REWRITE_TAC[ETA_AX] THEN ASM SET_TAC[];
15637         ALL_TAC] THEN
15638       SUBGOAL_THEN
15639        `!n:num z:complex. z IN s ==> ~(g n z = Cx(&0)) /\ ~(g n z = Cx(&1))`
15640       STRIP_ASSUME_TAC THENL
15641        [X_GEN_TAC `n:num` THEN EXPAND_TAC "g" THEN
15642         REWRITE_TAC[COMPLEX_INV_EQ_0; COMPLEX_INV_EQ_1] THEN
15643         ASM SET_TAC[];
15644         ALL_TAC] THEN
15645       SUBGOAL_THEN
15646        `?B n. &0 < B /\
15647               open n /\
15648               v IN n /\
15649               n SUBSET s /\
15650               !h z. h IN {(g:num->complex->complex) n | n IN (:num)} /\ z IN n
15651                      ==> norm(h z) <= B`
15652       MP_TAC THENL
15653        [MATCH_MP_TAC lemma1 THEN
15654         EXISTS_TAC `{h |  h holomorphic_on s /\
15655                        !z. z IN s ==> ~(h z = Cx(&0)) /\ ~(h z = Cx(&1))}` THEN
15656         ASM_REWRITE_TAC[FORALL_IN_GSPEC] THEN EXISTS_TAC `&1` THEN
15657         ASM_REWRITE_TAC[IN_ELIM_THM; IN_UNIV; REAL_LT_01] THEN
15658         X_GEN_TAC `n:num` THEN EXPAND_TAC "g" THEN
15659         REWRITE_TAC[COMPLEX_NORM_INV] THEN MATCH_MP_TAC REAL_INV_LE_1 THEN
15660         ASM_MESON_TAC[REAL_ARITH `&n + &1 < f ==> &1 <= f`];
15661         REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_IN_GSPEC] THEN
15662         REWRITE_TAC[IN_UNIV] THEN STRIP_TAC] THEN
15663       UNDISCH_TAC `open(n:complex->bool)` THEN
15664       REWRITE_TAC[OPEN_CONTAINS_BALL] THEN
15665       DISCH_THEN(MP_TAC o SPEC `v:complex`) THEN ASM_REWRITE_TAC[] THEN
15666       DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
15667       MP_TAC(ISPECL [`g:num->complex->complex`;
15668                      `{(g:num->complex->complex) n | n IN (:num)}`;
15669                      `ball(v:complex,e)`] MONTEL) THEN
15670       ASM_REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_IN_GSPEC] THEN
15671       REWRITE_TAC[IN_UNIV; IMP_IMP; OPEN_BALL; GSYM CONJ_ASSOC] THEN
15672       REWRITE_TAC[NOT_IMP] THEN CONJ_TAC THENL
15673        [CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ASM SET_TAC[]];
15674         ALL_TAC] THEN
15675       REWRITE_TAC[NOT_EXISTS_THM] THEN
15676       MAP_EVERY X_GEN_TAC [`h:complex->complex`; `j:num->num`] THEN
15677       STRIP_TAC THEN
15678       SUBGOAL_THEN `h(v:complex) = Cx(&0)` ASSUME_TAC THENL
15679        [MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN
15680         EXISTS_TAC `\n:num. (g:num->complex->complex) (j n) v` THEN
15681         ASM_SIMP_TAC[CENTRE_IN_BALL; TRIVIAL_LIMIT_SEQUENTIALLY] THEN
15682         REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN
15683         MATCH_MP_TAC LIM_NULL_COMPARISON THEN EXISTS_TAC `\n. inv(&n)` THEN
15684         REWRITE_TAC[SEQ_HARMONIC] THEN
15685         REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
15686         X_GEN_TAC `i:num` THEN DISCH_TAC THEN EXPAND_TAC "g" THEN
15687         REWRITE_TAC[COMPLEX_NORM_INV] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
15688         ASM_SIMP_TAC[REAL_OF_NUM_LT; LE_1] THEN
15689         TRANS_TAC REAL_LE_TRANS `&i + &1` THEN
15690         CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN
15691         TRANS_TAC REAL_LE_TRANS `&((j:num->num) i) + &1` THEN
15692         ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LE_RADD; REAL_OF_NUM_LE] THEN
15693         ASM_MESON_TAC[MONOTONE_BIGGER];
15694         ALL_TAC] THEN
15695       MP_TAC(ISPECL
15696        [`(g:num->complex->complex) o (j:num->num)`;
15697         `h:complex->complex`; `ball(v:complex,e)`]
15698           HURWITZ_NO_ZEROS) THEN
15699       ASM_REWRITE_TAC[OPEN_BALL; CONNECTED_BALL] THEN
15700       ASM_REWRITE_TAC[NOT_IMP; o_THM] THEN REPEAT CONJ_TAC THENL
15701        [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_TRANS];
15702         ASM_MESON_TAC[];
15703         ALL_TAC;
15704         ASM SET_TAC[];
15705         DISCH_THEN(MP_TAC o SPEC `v:complex`) THEN
15706         ASM_REWRITE_TAC[CENTRE_IN_BALL]] THEN
15707       DISCH_THEN(X_CHOOSE_THEN `c:complex` (fun th ->
15708         MP_TAC th THEN MP_TAC(SPEC `v:complex` th))) THEN
15709       ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
15710       DISCH_TAC THEN
15711       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [LIMPT_APPROACHABLE]) THEN
15712       DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
15713       DISCH_THEN(X_CHOOSE_THEN `y:complex` STRIP_ASSUME_TAC) THEN
15714       SUBGOAL_THEN `y IN ball(v:complex,e)` ASSUME_TAC THENL
15715        [REWRITE_TAC[IN_BALL] THEN ASM_MESON_TAC[DIST_SYM]; ALL_TAC] THEN
15716       UNDISCH_TAC `(y:complex) IN u` THEN EXPAND_TAC "u" THEN
15717       REWRITE_TAC[IN_ELIM_THM] THEN
15718       DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC
15719         (X_CHOOSE_THEN `C:real` MP_TAC)) THEN
15720       DISCH_THEN(X_CHOOSE_THEN `nn:complex->bool` MP_TAC) THEN
15721       REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
15722       DISCH_THEN(MP_TAC o GEN `n:num` o
15723         SPECL [`(f:num->complex->complex) n`; `y:complex`]) THEN
15724       ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
15725       FIRST_X_ASSUM(MP_TAC o SPEC `{y:complex}`) THEN
15726       ASM_REWRITE_TAC[COMPACT_SING; SING_SUBSET] THEN
15727       DISCH_THEN(MP_TAC o SPEC `inv(C:real)`) THEN
15728       ASM_REWRITE_TAC[REAL_LT_INV_EQ; FORALL_IN_INSERT; NOT_IN_EMPTY] THEN
15729       DISCH_THEN(X_CHOOSE_THEN `n:num` (MP_TAC o SPEC `n:num`)) THEN
15730       ASM_SIMP_TAC[GE; LE_REFL; COMPLEX_SUB_RZERO; REAL_NOT_LT] THEN
15731       EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_NORM_INV] THEN
15732       MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REWRITE_TAC[COMPLEX_NORM_NZ] THEN
15733       ASM SET_TAC[];
15734       X_GEN_TAC `k:complex->bool` THEN STRIP_TAC THEN
15735       SUBGOAL_THEN
15736        `!x:complex. x IN k ==> x IN u` MP_TAC
15737       THENL [ASM SET_TAC[]; ALL_TAC] THEN
15738       EXPAND_TAC "u" THEN REWRITE_TAC[IN_ELIM_THM] THEN
15739       DISCH_THEN(MP_TAC o MATCH_MP (MESON[]
15740       `(!x. P x ==> Q x /\ ?y z. R x y z) ==> !x. ?y z. P x ==> R x y z`)) THEN
15741       REWRITE_TAC[SKOLEM_THM; LEFT_IMP_EXISTS_THM] THEN
15742       MAP_EVERY X_GEN_TAC [`b:complex->real`; `n:complex->complex->bool`] THEN
15743       DISCH_TAC THEN FIRST_ASSUM(MP_TAC o
15744         MATCH_MP COMPACT_IMP_HEINE_BOREL) THEN
15745       DISCH_THEN(MP_TAC o SPEC `IMAGE (n:complex->complex->bool) k`) THEN
15746       ASM_SIMP_TAC[FORALL_IN_IMAGE; UNIONS_IMAGE] THEN
15747       ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
15748       ONCE_REWRITE_TAC[TAUT `p /\ q /\ r <=> q /\ p /\ r`] THEN
15749       REWRITE_TAC[EXISTS_FINITE_SUBSET_IMAGE] THEN
15750       DISCH_THEN(X_CHOOSE_THEN `j:complex->bool` MP_TAC) THEN
15751       ASM_CASES_TAC `j:complex->bool = {}` THEN
15752       ASM_REWRITE_TAC[IMAGE_CLAUSES; UNIONS_0] THENL
15753        [SET_TAC[]; STRIP_TAC] THEN
15754       EXISTS_TAC `sup(IMAGE (b:complex->real) j)` THEN
15755       ASM_SIMP_TAC[REAL_LE_SUP_FINITE; IMAGE_EQ_EMPTY; FINITE_IMAGE] THEN
15756       REWRITE_TAC[EXISTS_IN_IMAGE] THEN ASM SET_TAC[]]) in
15757   let lemma4 = prove
15758    (`!f k B.
15759           &0 < k /\ f holomorphic_on ball(Cx(&0),k) DELETE Cx(&0) /\
15760           (!e. &0 < e /\ e < k
15761                ==> ?d. &0 < d /\ d < e /\
15762                        !z. z IN sphere(Cx(&0),d) ==> norm(f z) <= B)
15763           ==> ?e. &0 < e /\ e < k /\
15764                   !z. z IN ball(Cx(&0),e) DELETE Cx(&0) ==> norm(f z) <= B`,
15765     REPEAT STRIP_TAC THEN
15766     FIRST_ASSUM(MP_TAC o SPEC `k / &2`) THEN
15767     ANTS_TAC THENL [ASM_REAL_ARITH_TAC; MATCH_MP_TAC MONO_EXISTS] THEN
15768     X_GEN_TAC `e:real` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
15769     CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
15770     REWRITE_TAC[IN_DELETE; COMPLEX_IN_BALL_0] THEN
15771     X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
15772     FIRST_ASSUM(MP_TAC o SPEC `norm(z:complex)`) THEN
15773     REWRITE_TAC[COMPLEX_NORM_NZ] THEN ASM_REWRITE_TAC[] THEN
15774     ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
15775     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
15776     SUBGOAL_THEN
15777      `!w. w IN cball(Cx(&0),e) DIFF ball(Cx(&0),d) ==> norm(f w:complex) <= B`
15778     MATCH_MP_TAC THENL
15779      [MATCH_MP_TAC MAXIMUM_MODULUS_FRONTIER;
15780       ASM_REWRITE_TAC[IN_DIFF; COMPLEX_IN_BALL_0; COMPLEX_IN_CBALL_0] THEN
15781       ASM_REAL_ARITH_TAC] THEN
15782     SIMP_TAC[BOUNDED_CBALL; BOUNDED_DIFF; CONJ_ASSOC] THEN CONJ_TAC THENL
15783      [SIMP_TAC[CLOSURE_CLOSED; CLOSED_DIFF; CLOSED_CBALL; OPEN_BALL] THEN
15784       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
15785        (MESON[INTERIOR_SUBSET; HOLOMORPHIC_ON_SUBSET; SUBSET_TRANS;
15786               HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]
15787          `f holomorphic_on t ==> s SUBSET t
15788           ==> f holomorphic_on interior s /\ f continuous_on s`)) THEN
15789       MATCH_MP_TAC(SET_RULE
15790        `s SUBSET t /\ a IN u ==> s DIFF u SUBSET t DELETE a`) THEN
15791       ASM_REWRITE_TAC[CENTRE_IN_BALL; SUBSET_BALLS; DIST_REFL] THEN
15792       ASM_REAL_ARITH_TAC;
15793       X_GEN_TAC `w:complex` THEN
15794       ONCE_REWRITE_TAC[GSYM FRONTIER_COMPLEMENT] THEN
15795       REWRITE_TAC[SET_RULE `UNIV DIFF (s DIFF t) = (UNIV DIFF s) UNION t`] THEN
15796       DISCH_THEN(MP_TAC o MATCH_MP
15797        (REWRITE_RULE[SUBSET] FRONTIER_UNION_SUBSET)) THEN
15798       ASM_SIMP_TAC[FRONTIER_COMPLEMENT; FRONTIER_BALL; FRONTIER_CBALL] THEN
15799       ASM SET_TAC[]]) in
15800   let lemma5 = prove
15801    (`!f. f holomorphic_on (ball(Cx(&0),&1) DELETE (Cx(&0))) /\
15802          (!z. z IN ball(Cx(&0),&1) DELETE Cx(&0)
15803               ==> ~(f z = Cx(&0)) /\ ~(f z = Cx(&1)))
15804          ==> ?e b. &0 < e /\ e < &1 /\ &0 < b /\
15805                    ((!z. z IN ball(Cx(&0),e) DELETE Cx(&0)
15806                          ==> norm(f z) <= b) \/
15807                     (!z. z IN ball(Cx(&0),e) DELETE Cx(&0)
15808                               ==> norm(f z) >= b))`,
15809     REPEAT STRIP_TAC THEN
15810     ABBREV_TAC `h = \n z. (f:complex->complex) (z / Cx(&n + &1))` THEN
15811     SUBGOAL_THEN
15812      `(!n:num. (h n) holomorphic_on ball(Cx(&0),&1) DELETE Cx(&0)) /\
15813       (!n z. z IN ball(Cx(&0),&1) DELETE Cx(&0)
15814              ==> ~(h n z = Cx(&0)) /\ ~(h n z = Cx(&1)))`
15815     STRIP_ASSUME_TAC THENL
15816      [CONJ_TAC THEN X_GEN_TAC `n:num` THEN EXPAND_TAC "h" THEN SIMP_TAC[] THENL
15817        [ONCE_REWRITE_TAC[GSYM o_DEF] THEN
15818         MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
15819          [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
15820           REWRITE_TAC[HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST; CX_INJ] THEN
15821           REAL_ARITH_TAC;
15822           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
15823             HOLOMORPHIC_ON_SUBSET))];
15824         SUBGOAL_THEN
15825          `!z. z IN ball (Cx(&0),&1) DELETE Cx(&0)
15826               ==> z / Cx(&n + &1) IN ball (Cx(&0),&1) DELETE Cx(&0)`
15827          (fun th -> ASM_MESON_TAC[th])] THEN
15828       REWRITE_TAC[IN_DELETE; FORALL_IN_IMAGE; SUBSET; COMPLEX_IN_BALL_0] THEN
15829       SIMP_TAC[COMPLEX_DIV_EQ_0; CX_INJ; REAL_ARITH `~(&n + &1 = &0)`] THEN
15830       SIMP_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ARITH `&0 < &n + &1`;
15831                REAL_ARITH `abs(&n + &1) = &n + &1`; REAL_LT_LDIV_EQ] THEN
15832       REAL_ARITH_TAC;
15833       ALL_TAC] THEN
15834     SUBGOAL_THEN `?w. w IN ball(Cx(&0),&1) DELETE Cx(&0)`
15835     STRIP_ASSUME_TAC THENL
15836      [EXISTS_TAC `Cx(&1 / &2)` THEN
15837       REWRITE_TAC[IN_DELETE; COMPLEX_IN_BALL_0; COMPLEX_NORM_CX; CX_INJ] THEN
15838       CONV_TAC REAL_RAT_REDUCE_CONV;
15839       ALL_TAC] THEN
15840     MP_TAC(ISPECL
15841      [`{g | g holomorphic_on ball(Cx(&0),&1) DELETE Cx(&0) /\
15842             !z. z IN ball(Cx(&0),&1) DELETE Cx(&0)
15843                 ==> ~(g z = Cx(&0)) /\ ~(g z = Cx(&1))}`;
15844       `ball(Cx(&0),&1) DELETE Cx(&0)`; `w:complex`] lemma3) THEN
15845     ASM_REWRITE_TAC[FORALL_IN_GSPEC] THEN
15846     SIMP_TAC[OPEN_BALL; OPEN_DELETE; CONNECTED_BALL; DIMINDEX_2; LE_REFL;
15847              CONNECTED_OPEN_DELETE; IN_ELIM_THM] THEN
15848     SUBGOAL_THEN
15849      `INFINITE {n | norm((h:num->complex->complex) n w) <= &1} \/
15850       INFINITE {n | &1 <= norm((h:num->complex->complex) n w)}`
15851     MP_TAC THENL
15852      [MP_TAC num_INFINITE THEN
15853       REWRITE_TAC[INFINITE; GSYM DE_MORGAN_THM; GSYM FINITE_UNION] THEN
15854       REWRITE_TAC[CONTRAPOS_THM] THEN MATCH_MP_TAC EQ_IMP THEN
15855       AP_TERM_TAC THEN SIMP_TAC[EXTENSION; IN_UNIV; IN_UNION; IN_ELIM_THM] THEN
15856       REAL_ARITH_TAC;
15857       ALL_TAC] THEN
15858     STRIP_TAC THEN FIRST_ASSUM(MP_TAC o MATCH_MP INFINITE_ENUMERATE_WEAK) THEN
15859     REWRITE_TAC[LEFT_IMP_EXISTS_THM; IN_ELIM_THM] THEN
15860     X_GEN_TAC `r:num->num` THEN STRIP_TAC THENL
15861      [DISCH_THEN(MP_TAC o SPEC
15862        `{(h:num->complex->complex) (r n) | n IN (:num)}`);
15863       DISCH_THEN(MP_TAC o SPEC
15864        `{inv o (h:num->complex->complex) (r n) | n IN (:num)}`)] THEN
15865     ASM_REWRITE_TAC[FORALL_IN_GSPEC; IN_UNIV] THEN
15866     ASM_SIMP_TAC[o_DEF; COMPLEX_INV_EQ_0; COMPLEX_INV_EQ_1] THEN
15867     ASM_SIMP_TAC[COMPLEX_NORM_INV; REAL_INV_LE_1] THEN
15868     ASM_SIMP_TAC[HOLOMORPHIC_ON_INV; ETA_AX] THEN
15869     DISCH_THEN(MP_TAC o SPEC `sphere(Cx(&0),&1 / &2)`) THEN
15870     (ANTS_TAC THENL
15871       [REWRITE_TAC[SUBSET; COMPLEX_IN_SPHERE_0; IN_DELETE; COMPLEX_IN_BALL_0;
15872                    COMPACT_SPHERE; GSYM COMPLEX_NORM_NZ] THEN
15873        SIMP_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV;
15874        ALL_TAC]) THEN
15875     REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_IN_GSPEC] THEN
15876     EXPAND_TAC "h" THEN REWRITE_TAC[] THEN
15877     DISCH_THEN(X_CHOOSE_TAC `b:real`) THEN
15878     ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THENL
15879      [EXISTS_TAC `abs b + &1`; EXISTS_TAC `inv(abs b + &1)`] THEN
15880     REWRITE_TAC[REAL_LT_INV_EQ; REAL_ARITH `&0 < abs b + &1`] THEN
15881     REWRITE_TAC[LEFT_OR_DISTRIB; EXISTS_OR_THM] THENL
15882      [DISJ1_TAC THEN MATCH_MP_TAC lemma4 THEN
15883       ASM_REWRITE_TAC[REAL_LT_01];
15884       DISJ2_TAC THEN
15885       MP_TAC(ISPECL [`inv o (f:complex->complex)`; `&1`; `abs b + &1`]
15886           lemma4) THEN
15887       ASM_SIMP_TAC[HOLOMORPHIC_ON_INV; ETA_AX; o_DEF; REAL_LT_01] THEN
15888       ANTS_TAC THENL
15889        [ALL_TAC;
15890         MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
15891         REWRITE_TAC[COMPLEX_NORM_INV; real_ge;
15892                     IN_DELETE; COMPLEX_IN_BALL_0] THEN
15893         REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
15894         GEN_REWRITE_TAC RAND_CONV [GSYM REAL_INV_INV] THEN
15895         MATCH_MP_TAC REAL_LE_INV2 THEN ASM_SIMP_TAC[REAL_LT_INV_EQ] THEN
15896         REWRITE_TAC[COMPLEX_NORM_NZ] THEN
15897         MATCH_MP_TAC(TAUT `!q. ~p /\ ~q ==> ~p`) THEN
15898         EXISTS_TAC `f(z:complex) = Cx(&1)` THEN
15899         FIRST_X_ASSUM MATCH_MP_TAC THEN
15900         ASM_REWRITE_TAC[IN_DELETE; COMPLEX_IN_BALL_0] THEN
15901         ASM_REAL_ARITH_TAC]] THEN
15902     (X_GEN_TAC `e:real` THEN STRIP_TAC THEN
15903      MP_TAC(ISPEC `e:real` REAL_ARCH_INV) THEN
15904      ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
15905      X_GEN_TAC `n:num` THEN STRIP_TAC THEN
15906      EXISTS_TAC `inv(&2 * (&(r(n:num)) + &1))` THEN
15907      REWRITE_TAC[REAL_LT_INV_EQ] THEN
15908      CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN CONJ_TAC THENL
15909       [TRANS_TAC REAL_LET_TRANS `inv(&n)` THEN ASM_REWRITE_TAC[] THEN
15910        MATCH_MP_TAC REAL_LE_INV2 THEN
15911        ASM_SIMP_TAC[REAL_OF_NUM_LT; LE_1; REAL_OF_NUM_ADD] THEN
15912        REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN
15913        MATCH_MP_TAC(ARITH_RULE `m <= n ==> m <= 2 * (n + 1)`) THEN
15914        ASM_MESON_TAC[MONOTONE_BIGGER];
15915        ALL_TAC] THEN
15916      X_GEN_TAC `z:complex` THEN REWRITE_TAC[COMPLEX_IN_SPHERE_0] THEN
15917      DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
15918       [`n:num`; `Cx(&(r(n:num)) + &1) * z`]) THEN
15919      ASM_REWRITE_TAC[COMPLEX_IN_SPHERE_0; COMPLEX_NORM_MUL; COMPLEX_NORM_CX;
15920                      REAL_ARITH `abs(&n + &1) = &n + &1`] THEN
15921      ANTS_TAC THENL [CONV_TAC REAL_FIELD; ALL_TAC] THEN
15922      MATCH_MP_TAC(NORM_ARITH
15923        `x = y ==> norm x <= b ==> norm y <= abs b + &1`) THEN
15924      REPEAT AP_TERM_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
15925       `~(z = Cx(&0)) ==> (z * w) / z = w`) THEN
15926      REWRITE_TAC[CX_INJ] THEN REAL_ARITH_TAC)) in
15927   let lemma6 = prove
15928    (`!f n a z.
15929           open n /\ z IN n /\ ~(a = Cx(&0)) /\ f holomorphic_on (n DELETE z) /\
15930           (!w. w IN n DELETE z ==> ~(f w = Cx(&0)) /\ ~(f w = a))
15931           ==> ?r. &0 < r /\ ball(z,r) SUBSET n /\
15932                   (bounded(IMAGE f (ball (z,r) DELETE z)) \/
15933                    bounded(IMAGE (inv o f) (ball (z,r) DELETE z)))`,
15934     REPEAT STRIP_TAC THEN
15935     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
15936     DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
15937     DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
15938     MP_TAC(ISPEC
15939      `\w. (f:complex->complex) (z + Cx r * w) / a` lemma5) THEN
15940     REWRITE_TAC[] THEN ANTS_TAC THENL
15941      [CONJ_TAC THENL
15942        [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
15943         ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
15944         GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
15945         MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
15946         SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_MUL;
15947                  HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST] THEN
15948         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
15949             HOLOMORPHIC_ON_SUBSET)) THEN
15950         REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0; IN_DELETE] THEN
15951         GEN_TAC THEN STRIP_TAC;
15952         ASM_SIMP_TAC[COMPLEX_FIELD
15953          `~(a = Cx(&0)) ==> (x / a = z <=> x = a * z)`] THEN
15954         ASM_REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_MUL_RID] THEN
15955         REWRITE_TAC[COMPLEX_IN_BALL_0; IN_DELETE] THEN GEN_TAC THEN
15956         STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15957         REWRITE_TAC[IN_DELETE]] THEN
15958       ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ; COMPLEX_RING
15959        `z + a * b = z <=> a = Cx(&0) \/ b = Cx(&0)`] THEN
15960       FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
15961       REWRITE_TAC[IN_BALL; NORM_ARITH `dist(a,a + b) = norm b`] THEN
15962       ASM_SIMP_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; real_abs; REAL_LT_IMP_LE;
15963                    REAL_ARITH `r * x < r <=> &0 < r * (&1 - x)`] THEN
15964       MATCH_MP_TAC REAL_LT_MUL THEN ASM_REAL_ARITH_TAC;
15965       REWRITE_TAC[LEFT_IMP_EXISTS_THM; bounded; FORALL_IN_IMAGE; o_THM]] THEN
15966     MAP_EVERY X_GEN_TAC [`e:real`; `b:real`] THEN
15967     DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
15968     EXISTS_TAC `e * r:real` THEN ASM_SIMP_TAC[REAL_LT_MUL] THEN
15969     MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
15970      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15971          SUBSET_TRANS)) THEN
15972       ASM_SIMP_TAC[SUBSET_BALLS; REAL_ADD_LID; DIST_REFL; REAL_LT_MUL;
15973        REAL_SUB_LT; REAL_ARITH `&0 < r * (&1 - e) ==> e * r <= r`];
15974       DISCH_TAC] THEN
15975     FIRST_X_ASSUM(DISJ_CASES_THEN (LABEL_TAC "*")) THENL
15976      [DISJ1_TAC THEN EXISTS_TAC `norm(a:complex) * b`;
15977       DISJ2_TAC THEN EXISTS_TAC `inv(norm(a:complex) * b)`] THEN
15978     X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_BALL; IN_DELETE] THEN
15979     STRIP_TAC THEN
15980     REMOVE_THEN "*" (MP_TAC o SPEC `(w - z) / Cx r`) THEN
15981     ASM_SIMP_TAC[IN_DELETE; COMPLEX_IN_BALL_0; COMPLEX_DIV_EQ_0;
15982                  COMPLEX_SUB_0; CX_INJ; REAL_LT_IMP_NZ; COMPLEX_NORM_DIV;
15983                  COMPLEX_NORM_CX; real_abs; REAL_LT_IMP_LE; REAL_LT_LDIV_EQ;
15984                  NORM_ARITH `norm(w - z) = dist(z,w)`; COMPLEX_DIV_LMUL] THEN
15985     REWRITE_TAC[real_ge; COMPLEX_RING `z + w - z:complex = w`] THEN
15986     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
15987     ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; COMPLEX_NORM_NZ] THEN
15988     DISCH_TAC THEN REWRITE_TAC[COMPLEX_NORM_INV] THEN
15989     MATCH_MP_TAC REAL_LE_INV2 THEN
15990     ASM_SIMP_TAC[REAL_LT_MUL; COMPLEX_NORM_NZ]) in
15991   REPEAT STRIP_TAC THEN
15992   MP_TAC(ISPECL [`\z. (f:complex->complex) z - a`; `n:complex->bool`;
15993                  `b - a:complex`; `z:complex`]
15994         lemma6) THEN
15995   ASM_SIMP_TAC[COMPLEX_SUB_0; HOLOMORPHIC_ON_SUB; ETA_AX; HOLOMORPHIC_ON_CONST;
15996                COMPLEX_RING `x - a:complex = y - a <=> x = y`] THEN
15997   DISCH_THEN(X_CHOOSE_THEN `r:real` MP_TAC) THEN
15998   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
15999   REWRITE_TAC[EXISTS_OR_THM] THEN MATCH_MP_TAC(TAUT
16000    `(p ==> r) /\ (~r /\ q ==> s) ==> p \/ q ==> r \/ s`) THEN
16001   REPEAT STRIP_TAC THENL
16002    [MP_TAC(ISPECL [`f:complex->complex`; `z:complex`; `ball(z:complex,r)`]
16003         HOLOMORPHIC_ON_EXTEND_BOUNDED) THEN
16004     ASM_SIMP_TAC[INTERIOR_OPEN; OPEN_BALL; CENTRE_IN_BALL] THEN ANTS_TAC THENL
16005      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
16006           HOLOMORPHIC_ON_SUBSET)) THEN
16007       ASM SET_TAC[];
16008       MATCH_MP_TAC(TAUT `q /\ (p ==> r) ==> (p <=> q) ==> r`)] THEN
16009     CONJ_TAC THENL
16010      [REWRITE_TAC[EVENTUALLY_AT; FORALL_IN_IMAGE; IN_BALL; IN_DELETE] THEN
16011       ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN EXISTS_TAC `r:real` THEN
16012       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [bounded]) THEN
16013       REWRITE_TAC[FORALL_IN_IMAGE; IN_BALL; DIST_NZ; IN_DELETE] THEN
16014       ASM_MESON_TAC[NORM_ARITH `norm(x - y) <= B ==> norm(x) <= norm(y) + B`;
16015                     DIST_SYM];
16016       DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16017       EXISTS_TAC `(g:complex->complex) z` THEN
16018       MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
16019       MAP_EVERY EXISTS_TAC [`g:complex->complex`; `ball(z:complex,r)`] THEN
16020       ASM_SIMP_TAC[OPEN_BALL; CENTRE_IN_BALL; IN_DELETE] THEN
16021       ASM_SIMP_TAC[GSYM CONTINUOUS_AT] THEN
16022       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; OPEN_BALL;
16023                     CONTINUOUS_ON_EQ_CONTINUOUS_AT; CENTRE_IN_BALL]];
16024     MP_TAC(ISPECL [`\z. inv((f:complex->complex) z - a)`;
16025                    `z:complex`; `ball(z:complex,r)`]
16026         HOLOMORPHIC_ON_EXTEND_BOUNDED) THEN
16027     ASM_SIMP_TAC[INTERIOR_OPEN; OPEN_BALL; CENTRE_IN_BALL] THEN ANTS_TAC THENL
16028      [MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN REWRITE_TAC[COMPLEX_SUB_0] THEN
16029       CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
16030       MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
16031       REWRITE_TAC[HOLOMORPHIC_ON_CONST; ETA_AX] THEN
16032       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
16033           HOLOMORPHIC_ON_SUBSET)) THEN
16034       ASM SET_TAC[];
16035       MATCH_MP_TAC(TAUT `q /\ (p ==> r) ==> (p <=> q) ==> r`)] THEN
16036     CONJ_TAC THENL
16037      [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [bounded]) THEN
16038       SIMP_TAC[EVENTUALLY_AT; o_DEF; FORALL_IN_IMAGE; IN_BALL; IN_DELETE] THEN
16039       MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `B:real` THEN STRIP_TAC THEN
16040       EXISTS_TAC `r:real` THEN ASM_MESON_TAC[DIST_NZ; DIST_SYM];
16041       DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC)] THEN
16042     SUBGOAL_THEN `((g:complex->complex) --> g z) (at z)` ASSUME_TAC THENL
16043      [ASM_SIMP_TAC[GSYM CONTINUOUS_AT] THEN
16044       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; OPEN_BALL;
16045                     CONTINUOUS_ON_EQ_CONTINUOUS_AT; CENTRE_IN_BALL];
16046       ALL_TAC] THEN
16047     ASM_CASES_TAC `(g:complex->complex) z = Cx(&0)` THENL
16048      [EXISTS_TAC `Cx(&0)` THEN
16049       MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
16050       EXISTS_TAC `\w:complex. g(w) / (Cx(&1) + a * g w)` THEN
16051       EXISTS_TAC `ball(z:complex,r)` THEN
16052       ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; o_DEF] THEN CONJ_TAC THENL
16053        [X_GEN_TAC `w:complex` THEN
16054         DISCH_TAC THEN ONCE_REWRITE_TAC[GSYM COMPLEX_INV_DIV] THEN
16055         AP_TERM_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
16056          `~(g = Cx(&0)) /\ inv(g) = f - a
16057           ==> (Cx(&1) + a * g) / g = f`) THEN
16058         ASM_SIMP_TAC[IN_DELETE; COMPLEX_INV_INV; COMPLEX_INV_EQ_0] THEN
16059         REWRITE_TAC[COMPLEX_SUB_0] THEN ASM SET_TAC[];
16060         SUBST1_TAC(COMPLEX_FIELD
16061          `Cx(&0) = Cx(&0) / (Cx(&1) + a * Cx(&0))`) THEN
16062         MATCH_MP_TAC LIM_COMPLEX_DIV THEN REPEAT CONJ_TAC THENL
16063          [ASM_MESON_TAC[]; ALL_TAC; CONV_TAC COMPLEX_RING] THEN
16064         MATCH_MP_TAC LIM_ADD THEN REWRITE_TAC[LIM_CONST] THEN
16065         MATCH_MP_TAC LIM_COMPLEX_MUL THEN REWRITE_TAC[LIM_CONST] THEN
16066         ASM_MESON_TAC[]];
16067       EXISTS_TAC `g(z:complex) / (Cx(&1) + a * g z)` THEN
16068       MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
16069       EXISTS_TAC `\w:complex. g(w) / (Cx(&1) + a * g w)` THEN
16070       EXISTS_TAC `ball(z:complex,r)` THEN
16071       ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; o_DEF] THEN CONJ_TAC THENL
16072        [X_GEN_TAC `w:complex` THEN
16073         DISCH_TAC THEN ONCE_REWRITE_TAC[GSYM COMPLEX_INV_DIV] THEN
16074         AP_TERM_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
16075          `~(g = Cx(&0)) /\ inv(g) = f - a
16076           ==> (Cx(&1) + a * g) / g = f`) THEN
16077         ASM_SIMP_TAC[IN_DELETE; COMPLEX_INV_INV; COMPLEX_INV_EQ_0] THEN
16078         REWRITE_TAC[COMPLEX_SUB_0] THEN ASM SET_TAC[];
16079         ALL_TAC] THEN
16080       MATCH_MP_TAC LIM_COMPLEX_DIV THEN
16081       ASM_SIMP_TAC[LIM_ADD; LIM_COMPLEX_MUL; LIM_CONST] THEN DISCH_TAC THEN
16082       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN
16083       DISCH_THEN(MP_TAC o SPEC `Cx(&0) / g(z:complex)`) THEN REWRITE_TAC[] THEN
16084       MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
16085       EXISTS_TAC `\w:complex. (Cx(&1) + a * g w) / g w` THEN
16086       EXISTS_TAC `ball(z:complex,r)` THEN
16087       ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; o_DEF] THEN CONJ_TAC THENL
16088        [X_GEN_TAC `w:complex` THEN
16089         DISCH_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
16090          `~(g = Cx(&0)) /\ inv(g) = f - a
16091           ==> (Cx(&1) + a * g) / g = f`) THEN
16092         ASM_SIMP_TAC[IN_DELETE; COMPLEX_INV_INV; COMPLEX_INV_EQ_0] THEN
16093         REWRITE_TAC[COMPLEX_SUB_0] THEN ASM SET_TAC[];
16094         ALL_TAC] THEN
16095       MATCH_MP_TAC LIM_COMPLEX_DIV THEN ASM_REWRITE_TAC[] THEN
16096       FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
16097       ASM_SIMP_TAC[LIM_ADD; LIM_CONST; LIM_COMPLEX_MUL]]]);;
16098
16099 let GREAT_PICARD_ALT = prove
16100  (`!f n z.
16101         open n /\ z IN n /\ f holomorphic_on (n DELETE z) /\
16102         ~(?l. (f --> l) (at z) \/ ((inv o f) --> l) (at z))
16103         ==> ?a. (:complex) DELETE a SUBSET IMAGE f (n DELETE z)`,
16104   REPEAT STRIP_TAC THEN
16105   MP_TAC(GENL [`a:complex`; `b:complex`]
16106    (ISPECL [`f:complex->complex`; `n:complex->bool`; `a:complex`; `b:complex`;
16107             `z:complex`] GREAT_PICARD)) THEN
16108   ASM_REWRITE_TAC[IN_DELETE; SUBSET; IN_UNIV; IN_IMAGE] THEN MESON_TAC[]);;
16109
16110 let GREAT_PICARD_INFINITE = prove
16111  (`!f n z.
16112         open n /\ z IN n /\ f holomorphic_on (n DELETE z) /\
16113         ~(?l. (f --> l) (at z) \/ ((inv o f) --> l) (at z))
16114         ==> ?a. !w. ~(w = a) ==> INFINITE {x | x IN n DELETE z /\ f x = w}`,
16115   REPEAT STRIP_TAC THEN MATCH_MP_TAC(MESON[]
16116    `(!a b. ~(a = b) /\ ~(P a) /\ ~(P b) ==> F)
16117     ==> ?a. !w. ~(w = a) ==> P w`) THEN
16118   MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`] THEN
16119   REWRITE_TAC[INFINITE; GSYM FINITE_UNION; SET_RULE
16120    `{x | x IN s /\ f x = a} UNION {x | x IN s /\ f x = b} =
16121     {x | x IN s /\ f x IN {a,b}}`] THEN
16122   STRIP_TAC THEN
16123   SUBGOAL_THEN
16124    `?r. &0 < r /\ ball(z:complex,r) SUBSET n /\
16125         !x. x IN n DELETE z /\ f x IN {a:complex, b} ==> ~(x IN ball(z,r))`
16126   STRIP_ASSUME_TAC THENL
16127    [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
16128     DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
16129     DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
16130     ASM_CASES_TAC
16131      `{x | x IN n DELETE z /\ (f:complex->complex) x IN {a, b}} = {}`
16132     THENL [EXISTS_TAC `r:real` THEN ASM SET_TAC[]; ALL_TAC] THEN
16133     EXISTS_TAC `min r (inf (IMAGE (\x. dist(z,x))
16134                                        {x | x IN n DELETE z /\
16135                                  (f:complex->complex) x IN {a, b}}))` THEN
16136     REWRITE_TAC[IN_BALL; REAL_LT_MIN] THEN
16137     ASM_SIMP_TAC[REAL_LT_INF_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY] THEN
16138     ASM_REWRITE_TAC[FORALL_IN_IMAGE; FORALL_IN_GSPEC] THEN
16139     SIMP_TAC[IN_DELETE; DIST_NZ; DIST_SYM] THEN
16140     CONJ_TAC THENL [ALL_TAC; MESON_TAC[REAL_LT_REFL]] THEN
16141     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
16142         SUBSET_TRANS)) THEN
16143     REWRITE_TAC[SUBSET_BALLS; REAL_MIN_LE; DIST_REFL; REAL_ADD_LID;
16144                 REAL_LE_REFL];
16145     MP_TAC(ISPECL [`f:complex->complex`; `ball(z:complex,r)`;
16146                    `a:complex`; `b:complex`; `z:complex`] GREAT_PICARD) THEN
16147     ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
16148     CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
16149     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
16150       HOLOMORPHIC_ON_SUBSET)) THEN
16151     ASM SET_TAC[]]);;
16152
16153 let CASORATI_WEIERSTRASS = prove
16154  (`!f n z.
16155         open n /\ z IN n /\ f holomorphic_on (n DELETE z) /\
16156         ~(?l. (f --> l) (at z) \/ ((inv o f) --> l) (at z))
16157         ==> closure(IMAGE f (n DELETE z)) = (:complex)`,
16158   REPEAT GEN_TAC THEN
16159   DISCH_THEN(X_CHOOSE_TAC `a:complex` o MATCH_MP GREAT_PICARD_ALT) THEN
16160   MATCH_MP_TAC(SET_RULE
16161    `!t. t SUBSET s /\ t = UNIV ==> s = UNIV`) THEN
16162   EXISTS_TAC `closure((:complex) DELETE a)` THEN
16163   ASM_SIMP_TAC[SUBSET_CLOSURE] THEN
16164   REWRITE_TAC[SET_RULE `s DELETE a = s DIFF {a}`] THEN
16165   REWRITE_TAC[CLOSURE_COMPLEMENT; INTERIOR_SING; DIFF_EMPTY]);;
16166
16167 (* ------------------------------------------------------------------------- *)
16168 (* A big chain of equivalents of simple connectedness for an open set.       *)
16169 (* ------------------------------------------------------------------------- *)
16170
16171 let [SIMPLY_CONNECTED_EQ_WINDING_NUMBER_ZERO;
16172      SIMPLY_CONNECTED_EQ_PATH_INTEGRAL_ZERO;
16173      SIMPLY_CONNECTED_EQ_GLOBAL_PRIMITIVE;
16174      SIMPLY_CONNECTED_EQ_HOLOMORPHIC_LOG;
16175      SIMPLY_CONNECTED_EQ_HOLOMORPHIC_SQRT;
16176      SIMPLY_CONNECTED_EQ_INJECTIVE_HOLOMORPHIC_SQRT;
16177      SIMPLY_CONNECTED_EQ_BIHOLOMORPHIC_TO_DISC;
16178      SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] =
16179  (CONJUNCTS o prove)
16180  (`(!s. open s
16181         ==> (simply_connected s <=>
16182              connected s /\
16183              !g z. path g /\ path_image g SUBSET s /\
16184                    pathfinish g = pathstart g /\ ~(z IN s)
16185                    ==> winding_number(g,z) = Cx(&0))) /\
16186    (!s. open s
16187         ==> (simply_connected s <=>
16188              connected s /\
16189              !g f. valid_path g /\ path_image g SUBSET s /\
16190                    pathfinish g = pathstart g /\ f holomorphic_on s
16191                  ==> (f has_path_integral Cx(&0)) g)) /\
16192    (!s. open s
16193         ==> (simply_connected s <=>
16194              connected s /\
16195              !f. f holomorphic_on s
16196                  ==> ?h. !z. z IN s
16197                              ==> (h has_complex_derivative f(z)) (at z))) /\
16198    (!s. open s
16199         ==> (simply_connected s <=>
16200              connected s /\
16201              !f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0)))
16202                  ==> ?g. g holomorphic_on s /\
16203                          !z. z IN s ==> f z = cexp(g z))) /\
16204    (!s. open s
16205         ==> (simply_connected s <=>
16206              connected s /\
16207              !f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0)))
16208                  ==> ?g. g holomorphic_on s /\
16209                          !z. z IN s ==> f z = g z pow 2)) /\
16210    (!s. open s
16211         ==> (simply_connected s <=>
16212              connected s /\
16213              !f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0))) /\
16214                  (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
16215                  ==> ?g. g holomorphic_on s /\
16216                          !z. z IN s ==> f z = g z pow 2)) /\
16217    (!s. open s
16218         ==> (simply_connected s <=>
16219              s = {} \/ s = (:complex) \/
16220              ?f g. f holomorphic_on s /\ g holomorphic_on ball(Cx(&0),&1) /\
16221                    (!z. z IN s ==> f(z) IN ball(Cx(&0),&1) /\ g(f z) = z) /\
16222                    (!z. z IN ball(Cx(&0),&1) ==> g(z) IN s /\ f(g z) = z))) /\
16223    (!s. open s
16224         ==> (simply_connected(s:complex->bool) <=>
16225              s = {} \/ s homeomorphic ball(Cx(&0),&1)))`,
16226   REWRITE_TAC[AND_FORALL_THM; TAUT
16227    `(p ==> q) /\ (p ==> r) <=> p ==> q /\ r`] THEN
16228   X_GEN_TAC `s:complex->bool` THEN DISCH_TAC THEN MATCH_MP_TAC(TAUT
16229    `(p0 ==> p1) /\ (p1 ==> p2) /\ (p2 ==> p3) /\ (p3 ==> p4) /\
16230     (p4 ==> p5) /\ (p5 ==> p6) /\ (p6 ==> p7) /\ (p7 ==> p8) /\ (p8 ==> p0)
16231     ==> (p0 <=> p1) /\ (p0 <=> p2) /\
16232         (p0 <=> p3) /\ (p0 <=> p4) /\
16233         (p0 <=> p5) /\ (p0 <=> p6) /\ (p0 <=> p7) /\ (p0 <=> p8)`) THEN
16234   REPEAT CONJ_TAC THENL
16235    [SIMP_TAC[SIMPLY_CONNECTED_IMP_CONNECTED] THEN
16236     MESON_TAC[SIMPLY_CONNECTED_IMP_WINDING_NUMBER_ZERO];
16237
16238     REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
16239     MATCH_MP_TAC CAUCHY_THEOREM_GLOBAL THEN
16240     EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
16241     REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16242     ASM_SIMP_TAC[VALID_PATH_IMP_PATH];
16243
16244     STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `f:complex->complex` THEN
16245     ASM_CASES_TAC `s:complex->bool = {}` THENL
16246      [ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN ASM_MESON_TAC[]; DISCH_TAC] THEN
16247     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
16248     DISCH_THEN(X_CHOOSE_TAC `a:complex`) THEN EXISTS_TAC
16249      `\z. path_integral
16250            (@g. vector_polynomial_function g /\ path_image g SUBSET s /\
16251                 pathstart g = a /\ pathfinish g = z)
16252            f` THEN
16253     X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
16254     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
16255     DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN ASM_REWRITE_TAC[] THEN
16256     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
16257     REWRITE_TAC[has_complex_derivative] THEN
16258     REWRITE_TAC[has_derivative_at; LINEAR_COMPLEX_MUL] THEN
16259     MATCH_MP_TAC LIM_TRANSFORM THEN
16260     EXISTS_TAC `\y. inv(norm(y - x)) % (path_integral(linepath(x,y)) f -
16261                      f x * (y - x))` THEN
16262     REWRITE_TAC[VECTOR_ARITH
16263      `i % (x - a) - i % (y - (z + a)) = i % (x + z - y)`] THEN
16264     CONJ_TAC THENL
16265      [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
16266       EXISTS_TAC `d:real` THEN ASM_REWRITE_TAC[] THEN
16267       X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
16268       REWRITE_TAC[VECTOR_MUL_EQ_0] THEN DISJ2_TAC THEN MP_TAC(ISPEC
16269         `s:complex->bool` CONNECTED_OPEN_VECTOR_POLYNOMIAL_CONNECTED) THEN
16270       ASM_REWRITE_TAC[] THEN
16271       DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[] THEN
16272       SUBGOAL_THEN `(y:complex) IN s` ASSUME_TAC THENL
16273        [ASM_MESON_TAC[SUBSET; IN_CBALL; REAL_LT_IMP_LE; DIST_SYM];
16274         ALL_TAC] THEN
16275       DISCH_THEN(fun th ->
16276         MP_TAC(SPEC `y:complex` th) THEN MP_TAC(SPEC `x:complex` th)) THEN
16277       ASM_REWRITE_TAC[] THEN MAP_EVERY ABBREV_TAC
16278        [`g1 = @g. vector_polynomial_function g /\ path_image g SUBSET s /\
16279                   pathstart g = (a:complex) /\ pathfinish g = x`;
16280         `g2 = @g. vector_polynomial_function g /\ path_image g SUBSET s /\
16281                   pathstart g = (a:complex) /\ pathfinish g = y`] THEN
16282       DISCH_THEN(MP_TAC o SELECT_RULE) THEN ASM_REWRITE_TAC[] THEN
16283       STRIP_TAC THEN DISCH_THEN(MP_TAC o SELECT_RULE) THEN
16284       ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
16285       FIRST_X_ASSUM(MP_TAC o SPECL
16286        [`g1 ++ linepath (x:complex,y) ++ reversepath g2`;
16287         `f:complex->complex`]) THEN
16288       ASM_REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATHFINISH_REVERSEPATH;
16289                       PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
16290       SUBGOAL_THEN `segment[x:complex,y] SUBSET s` ASSUME_TAC THENL
16291        [MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `cball(x:complex,d)` THEN
16292         ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
16293         MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_CBALL] THEN
16294         REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET] THEN
16295         ASM_SIMP_TAC[IN_CBALL; DIST_REFL] THEN
16296         ASM_MESON_TAC[REAL_LT_IMP_LE; DIST_SYM];
16297         ALL_TAC] THEN
16298       SUBGOAL_THEN
16299        `f path_integrable_on g1 /\ f path_integrable_on g2 /\
16300         f path_integrable_on linepath(x,y)`
16301       STRIP_ASSUME_TAC THENL
16302        [REPEAT CONJ_TAC THEN
16303         MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
16304         EXISTS_TAC `s:complex->bool` THEN
16305         ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
16306         ASM_REWRITE_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH];
16307         ALL_TAC] THEN
16308       ANTS_TAC THENL
16309        [ALL_TAC; DISCH_THEN(MP_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE)] THEN
16310       ASM_SIMP_TAC[VALID_PATH_JOIN_EQ; PATHSTART_JOIN; PATHFINISH_JOIN;
16311                    PATHFINISH_REVERSEPATH; PATHSTART_LINEPATH;
16312                    PATHFINISH_LINEPATH; VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION;
16313                    PATH_IMAGE_JOIN; PATH_IMAGE_LINEPATH;
16314                    PATH_IMAGE_REVERSEPATH; PATHSTART_REVERSEPATH;
16315                    VALID_PATH_LINEPATH; VALID_PATH_REVERSEPATH; UNION_SUBSET;
16316                    PATH_INTEGRAL_JOIN; PATH_INTEGRABLE_JOIN;
16317                    PATH_INTEGRABLE_REVERSEPATH; PATH_INTEGRAL_REVERSEPATH] THEN
16318       REWRITE_TAC[COMPLEX_VEC_0] THEN CONV_TAC COMPLEX_RING;
16319       REWRITE_TAC[LIM_AT] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
16320       SUBGOAL_THEN `(f:complex->complex) continuous at x` MP_TAC THENL
16321        [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
16322                       CONTINUOUS_ON_EQ_CONTINUOUS_AT];
16323         ALL_TAC] THEN
16324       REWRITE_TAC[continuous_at; dist; VECTOR_SUB_RZERO] THEN
16325       DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
16326       DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
16327       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
16328       DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
16329       ASM_REWRITE_TAC[SUBSET; IN_BALL; dist] THEN
16330       DISCH_THEN(X_CHOOSE_THEN `d2:real` STRIP_ASSUME_TAC) THEN
16331       EXISTS_TAC `min d1 d2` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
16332       X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
16333       SUBGOAL_THEN `f path_integrable_on linepath(x,y)` MP_TAC THENL
16334        [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
16335         MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
16336         EXISTS_TAC `s:complex->bool` THEN CONJ_TAC THENL
16337          [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
16338                         CONTINUOUS_ON_EQ_CONTINUOUS_AT];
16339           MATCH_MP_TAC SUBSET_TRANS THEN
16340           EXISTS_TAC `ball(x:complex,d2)` THEN CONJ_TAC THENL
16341            [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
16342             MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
16343             REWRITE_TAC[SUBSET; IN_BALL; IN_INSERT; NOT_IN_EMPTY; dist] THEN
16344             REPEAT STRIP_TAC THEN
16345             ASM_REWRITE_TAC[dist; NORM_0; VECTOR_SUB_REFL] THEN
16346             ASM_MESON_TAC[NORM_SUB];
16347             ASM_REWRITE_TAC[SUBSET; dist; IN_BALL]]];
16348         ALL_TAC] THEN
16349       REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
16350       X_GEN_TAC `z:complex` THEN
16351       MP_TAC(SPECL [`x:complex`; `y:complex`; `(f:complex->complex) x`]
16352                     HAS_PATH_INTEGRAL_CONST_LINEPATH) THEN
16353       REWRITE_TAC[IMP_IMP] THEN
16354       DISCH_THEN(fun th -> ASSUME_TAC(CONJUNCT2 th) THEN MP_TAC th) THEN
16355       FIRST_ASSUM(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
16356       DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
16357       DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_NEG) THEN
16358       REWRITE_TAC[COMPLEX_NEG_SUB] THEN STRIP_TAC THEN
16359       MATCH_MP_TAC(REAL_ARITH `x <= e / &2 /\ &0 < e ==> x < e`) THEN
16360       ASM_REWRITE_TAC[NORM_MUL; REAL_ABS_INV; REAL_ABS_NORM] THEN
16361       ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
16362       ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
16363       MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
16364       EXISTS_TAC `\w. (f:complex->complex) w - f x` THEN
16365       ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> &0 <= e / &2`] THEN
16366       X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
16367       MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16368       ASM_MESON_TAC[REAL_LET_TRANS; SEGMENT_BOUND]];
16369
16370     STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `f:complex->complex` THEN
16371     ASM_CASES_TAC `s:complex->bool = {}` THENL
16372      [ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN ASM_MESON_TAC[]; STRIP_TAC] THEN
16373     FIRST_X_ASSUM(MP_TAC o SPEC `\z. complex_derivative f z / f z`) THEN
16374     ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE;
16375                  HOLOMORPHIC_ON_DIV; ETA_AX] THEN
16376     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16377     MP_TAC(ISPECL [`\z:complex. cexp(g z) / f z`; `s:complex->bool`]
16378         HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
16379     ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
16380      [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16381       SUBGOAL_THEN
16382        `Cx(&0) = ((complex_derivative f z / f z * cexp(g z)) * f z -
16383                   cexp(g z) * complex_derivative f z) / f z pow 2`
16384       SUBST1_TAC THENL
16385        [ASM_SIMP_TAC[COMPLEX_FIELD
16386          `~(z = Cx(&0)) ==> (d / z * e) * z = e * d`] THEN
16387         SIMPLE_COMPLEX_ARITH_TAC;
16388         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DIV_AT THEN
16389         ASM_SIMP_TAC[] THEN CONJ_TAC THENL
16390          [GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
16391           ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
16392           MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
16393           ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_CEXP];
16394           ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; complex_differentiable;
16395                         HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE]]];
16396       DISCH_THEN(X_CHOOSE_THEN `c:complex` MP_TAC) THEN
16397       ASM_CASES_TAC `c = Cx(&0)` THENL
16398        [ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
16399          `~(x = Cx(&0)) /\ ~(y = Cx(&0)) ==> ~(x / y = Cx(&0))`] THEN
16400         ASM_MESON_TAC[];
16401       ASM_SIMP_TAC[COMPLEX_FIELD
16402        `~(y = Cx(&0)) /\ ~(z = Cx(&0))
16403         ==> (x / y = z <=> y = inv(z) * x)`] THEN
16404       DISCH_TAC THEN EXISTS_TAC `\z:complex. clog(inv c) + g z` THEN
16405       ASM_SIMP_TAC[CEXP_CLOG; CEXP_ADD; COMPLEX_INV_EQ_0] THEN
16406       MATCH_MP_TAC HOLOMORPHIC_ON_ADD THEN
16407       REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
16408       ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN]]];
16409
16410     STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
16411     X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
16412     FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`) THEN
16413     ASM_REWRITE_TAC[] THEN
16414     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16415     EXISTS_TAC `\z:complex. cexp(g z / Cx(&2))` THEN
16416     ASM_SIMP_TAC[GSYM CEXP_N; COMPLEX_RING `Cx(&2) * z / Cx(&2) = z`] THEN
16417     GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
16418     MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
16419     REWRITE_TAC[HOLOMORPHIC_ON_CEXP] THEN
16420     MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
16421     ASM_SIMP_TAC[HOLOMORPHIC_ON_CONST] THEN
16422     CONV_TAC COMPLEX_RING;
16423
16424     MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
16425     MATCH_MP_TAC MONO_FORALL THEN MESON_TAC[];
16426
16427     POP_ASSUM MP_TAC THEN SPEC_TAC(`s:complex->bool`,`s:complex->bool`) THEN
16428     REWRITE_TAC[IMP_IMP; GSYM CONJ_ASSOC; FORALL_AND_THM] THEN
16429     SUBGOAL_THEN
16430      `!s:complex->bool.
16431           open s /\ connected s /\ Cx(&0) IN s /\ s SUBSET ball(Cx(&0),&1) /\
16432           (!f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0))) /\
16433                (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
16434                ==> ?g. g holomorphic_on s /\ (!z. z IN s ==> f z = g z pow 2))
16435           ==> ?f g. f holomorphic_on s /\
16436                     g holomorphic_on ball(Cx(&0),&1) /\
16437                     (!z. z IN s ==> f z IN ball(Cx(&0),&1) /\ g(f z) = z) /\
16438                     (!z. z IN ball(Cx(&0),&1) ==> g z IN s /\ f(g z) = z)`
16439     ASSUME_TAC THENL
16440      [ALL_TAC;
16441       REPEAT STRIP_TAC THEN
16442       ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[] THEN
16443       ASM_CASES_TAC `s = (:complex)` THEN ASM_REWRITE_TAC[] THEN
16444       SUBGOAL_THEN `?a b:complex. a IN s /\ ~(b IN s)` STRIP_ASSUME_TAC THENL
16445        [ASM SET_TAC[]; ALL_TAC] THEN
16446       SUBGOAL_THEN
16447        `?f. f holomorphic_on s /\
16448             f(a) = Cx(&0) /\
16449             IMAGE f s SUBSET ball(Cx(&0),&1) /\
16450             (!w z. w IN s /\ z IN s /\ f w = f z ==> w = z)`
16451       MP_TAC THENL
16452        [FIRST_X_ASSUM(K ALL_TAC o SPEC `(:complex)`) THEN
16453         FIRST_X_ASSUM(MP_TAC o SPEC `\z:complex. z - b`) THEN ANTS_TAC THENL
16454          [SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID;
16455                    COMPLEX_RING `x - b:complex = y - b <=> x = y`] THEN
16456           ASM_MESON_TAC[COMPLEX_SUB_0];
16457          ALL_TAC] THEN
16458         REWRITE_TAC[COMPLEX_EQ_SUB_RADD] THEN
16459         DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16460         MP_TAC(ISPECL [`s:complex->bool`; `g:complex->complex`]
16461           OPEN_MAPPING_THM) THEN ASM_REWRITE_TAC[] THEN
16462         FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
16463         DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[SUBSET] THEN
16464         DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN ANTS_TAC THENL
16465          [SUBGOAL_THEN `a IN ball(a,d) /\ (a + Cx(d / &2)) IN ball(a,d) /\
16466                         ~(a + Cx(d / &2) = a)`
16467           MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
16468           ASM_REWRITE_TAC[CENTRE_IN_BALL;
16469                           COMPLEX_EQ_ADD_LCANCEL_0; CX_INJ] THEN
16470           REWRITE_TAC[IN_BALL; NORM_ARITH `dist(a,a + d) = norm d`] THEN
16471           REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
16472           ALL_TAC] THEN
16473         DISCH_THEN(MP_TAC o SPEC `ball(a:complex,d)`) THEN
16474         ASM_REWRITE_TAC[OPEN_BALL] THEN REWRITE_TAC[OPEN_CONTAINS_BALL] THEN
16475         DISCH_THEN(MP_TAC o SPEC `(g:complex->complex) a`) THEN
16476         ASM_SIMP_TAC[FUN_IN_IMAGE; CENTRE_IN_BALL] THEN
16477         DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
16478         SUBGOAL_THEN `!z:complex. z IN s ==> ~(g(z) IN ball(--(g a),r))`
16479         MP_TAC THENL
16480          [REWRITE_TAC[IN_BALL] THEN X_GEN_TAC `z:complex` THEN
16481           REPEAT DISCH_TAC THEN
16482           FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
16483           DISCH_THEN(MP_TAC o SPEC `--((g:complex->complex) z)`) THEN
16484           ASM_REWRITE_TAC[IN_BALL; NORM_ARITH `dist(w,--z) = dist(--w,z)`] THEN
16485           REWRITE_TAC[IN_IMAGE; NOT_EXISTS_THM] THEN X_GEN_TAC `w:complex` THEN
16486           ASM_CASES_TAC `w:complex = z` THENL
16487            [ASM_REWRITE_TAC[COMPLEX_RING `--z = z <=> z = Cx(&0)`] THEN
16488             ASM_MESON_TAC[COMPLEX_RING `Cx(&0) pow 2 + b = b`];
16489             ASM_MESON_TAC[COMPLEX_RING `(--z:complex) pow 2 = z pow 2`]];
16490           REWRITE_TAC[IN_BALL; NORM_ARITH `dist(--a,b) = norm(b + a)`] THEN
16491           ASM_CASES_TAC `!z:complex. z IN s ==> ~(g z + g a = Cx(&0))` THENL
16492            [REWRITE_TAC[REAL_NOT_LT] THEN DISCH_TAC;
16493             ASM_MESON_TAC[COMPLEX_NORM_0]] THEN
16494           EXISTS_TAC `\z:complex.
16495             Cx(r / &3) / (g z + g a) - Cx(r / &3) / (g a + g a)` THEN
16496           REWRITE_TAC[COMPLEX_SUB_REFL] THEN CONJ_TAC THENL
16497            [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
16498             REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
16499             MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
16500             ASM_SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_CONST; ETA_AX];
16501             ASM_SIMP_TAC[IMP_CONJ; CX_INJ; REAL_LT_IMP_NZ;
16502              REAL_ARITH `&0 < r ==> ~(r / &3 = &0)`;
16503              COMPLEX_FIELD
16504              `~(a = Cx(&0)) /\ ~(x + k = Cx(&0)) /\ ~(y + k = Cx(&0))
16505               ==> (a / (x + k) - c = a / (y + k) - c <=> x = y)`] THEN
16506             CONJ_TAC THENL [REWRITE_TAC[dist]; ASM_MESON_TAC[]] THEN
16507             REWRITE_TAC[FORALL_IN_IMAGE; COMPLEX_SUB_LZERO; NORM_NEG] THEN
16508             X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16509             MATCH_MP_TAC(NORM_ARITH
16510              `norm(x) <= &1 / &3 /\ norm(y) <= &1 / &3
16511               ==> norm(x - y) < &1`) THEN
16512             REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_DIV] THEN
16513             ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE; REAL_POS] THEN
16514             REWRITE_TAC[REAL_ARITH
16515              `r / &3 / x <= &1 / &3 <=> r / x <= &1`] THEN
16516             ASM_SIMP_TAC[REAL_LE_LDIV_EQ; NORM_POS_LT; COMPLEX_NORM_NZ] THEN
16517             ASM_SIMP_TAC[REAL_MUL_LID]]];
16518         REWRITE_TAC[MESON[]
16519          `(!x y. P x /\ P y /\ f x = f y ==> x = y) <=>
16520           (!x y. P x /\ P y ==> (f x = f y <=> x = y))`] THEN
16521         DISCH_THEN(X_CHOOSE_THEN `h:complex->complex` STRIP_ASSUME_TAC) THEN
16522         MP_TAC(ISPECL [`h:complex->complex`; `s:complex->bool`]
16523             HOLOMORPHIC_ON_INVERSE) THEN
16524         ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
16525         DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC
16526          (X_CHOOSE_THEN `k:complex->complex` STRIP_ASSUME_TAC)) THEN
16527         FIRST_X_ASSUM(MP_TAC o SPEC `IMAGE (h:complex->complex) s`) THEN
16528         ANTS_TAC THENL
16529          [ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL
16530            [MATCH_MP_TAC CONNECTED_CONTINUOUS_IMAGE THEN
16531             ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
16532             ASM SET_TAC[];
16533             REWRITE_TAC[FORALL_IN_IMAGE]] THEN
16534           X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
16535           FIRST_X_ASSUM(MP_TAC o SPEC
16536            `(f:complex->complex) o (h:complex->complex)`) THEN
16537           ANTS_TAC THENL
16538            [CONJ_TAC THENL
16539              [ASM_MESON_TAC[HOLOMORPHIC_ON_COMPOSE]; ALL_TAC] THEN
16540             ASM_REWRITE_TAC[o_THM] THEN ASM SET_TAC[];
16541             ALL_TAC] THEN
16542           REWRITE_TAC[o_THM] THEN
16543           DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16544           EXISTS_TAC `(g:complex->complex) o (k:complex->complex)` THEN
16545           ASM_SIMP_TAC[o_THM] THEN MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
16546           ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16547            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN ASM SET_TAC[];
16548           ALL_TAC] THEN
16549         REWRITE_TAC[FORALL_IN_IMAGE] THEN
16550         DISCH_THEN(X_CHOOSE_THEN `f:complex->complex`
16551           (X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC)) THEN
16552         EXISTS_TAC `(f:complex->complex) o (h:complex->complex)` THEN
16553         EXISTS_TAC `(k:complex->complex) o (g:complex->complex)` THEN
16554         ASM_SIMP_TAC[o_THM; HOLOMORPHIC_ON_COMPOSE] THEN CONJ_TAC THENL
16555          [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE; ASM SET_TAC[]] THEN
16556         ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16557            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
16558         ASM SET_TAC[]]] THEN
16559     X_GEN_TAC `s:complex->bool` THEN STRIP_TAC THEN
16560     ABBREV_TAC
16561      `ff = { h | h holomorphic_on s /\
16562                  IMAGE h s SUBSET ball(Cx(&0),&1) /\
16563                  h(Cx(&0)) = Cx(&0) /\
16564                  (!x y. x IN s /\ y IN s ==> (h x = h y <=> x = y))}` THEN
16565     SUBGOAL_THEN `(\z:complex. z) IN ff` MP_TAC THENL
16566      [EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM; IMAGE_ID] THEN
16567       ASM_REWRITE_TAC[HOLOMORPHIC_ON_ID];
16568       ASM_CASES_TAC `ff:(complex->complex)->bool = {}` THEN
16569       ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN DISCH_TAC] THEN
16570     SUBGOAL_THEN `!h. h IN ff ==> h holomorphic_on s` ASSUME_TAC THENL
16571      [EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM]; ALL_TAC] THEN
16572     SUBGOAL_THEN
16573      `?f:complex->complex.
16574           f IN ff /\
16575           (!h. h IN ff
16576                ==> norm(complex_derivative h (Cx(&0)))
16577                    <= norm(complex_derivative f (Cx(&0))))`
16578     MP_TAC THENL
16579      [MP_TAC(ISPEC
16580        `{ norm(complex_derivative h (Cx(&0))) | h IN ff}` SUP) THEN
16581       ANTS_TAC THENL
16582        [ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
16583         ASM_REWRITE_TAC[IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
16584         FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
16585         DISCH_THEN(MP_TAC o SPEC `Cx(&0)`) THEN
16586         ASM_REWRITE_TAC[SUBSET; IN_BALL; COMPLEX_SUB_LZERO;
16587                         dist; NORM_NEG] THEN
16588         DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
16589         EXISTS_TAC `inv(r):real` THEN X_GEN_TAC `f:complex->complex` THEN
16590         EXPAND_TAC "ff" THEN
16591         REWRITE_TAC[IN_ELIM_THM; FORALL_IN_IMAGE; SUBSET] THEN
16592         ASM_REWRITE_TAC[SUBSET; IN_BALL; COMPLEX_SUB_LZERO;
16593                         dist; NORM_NEG] THEN
16594         STRIP_TAC THEN
16595         MP_TAC(ISPEC `\z. (f:complex->complex) (Cx(r) * z)`
16596           SCHWARZ_LEMMA) THEN
16597         ASM_REWRITE_TAC[COMPLEX_MUL_RZERO] THEN
16598         SUBGOAL_THEN
16599          `!z. z IN ball(Cx(&0),&1)
16600               ==> ((\z. f (Cx r * z)) has_complex_derivative
16601                    complex_derivative f (Cx(r) * z) * Cx(r)) (at z)`
16602          (LABEL_TAC "*")
16603         THENL
16604          [REPEAT STRIP_TAC THEN MATCH_MP_TAC
16605            (REWRITE_RULE[o_DEF] COMPLEX_DIFF_CHAIN_AT) THEN
16606           CONJ_TAC THENL
16607            [COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_MUL_RID];
16608             REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE]] THEN
16609           MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
16610           EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
16611           FIRST_X_ASSUM MATCH_MP_TAC THEN
16612           REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
16613           ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE] THEN
16614           GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
16615           ASM_SIMP_TAC[GSYM COMPLEX_IN_BALL_0; REAL_LT_LMUL_EQ];
16616           ALL_TAC] THEN
16617         ANTS_TAC THENL
16618          [CONJ_TAC THENL
16619            [REWRITE_TAC[holomorphic_on] THEN
16620             ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
16621             REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16622             FIRST_X_ASSUM MATCH_MP_TAC THEN
16623             REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
16624             ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE] THEN
16625             GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
16626             ASM_SIMP_TAC[GSYM COMPLEX_IN_BALL_0; REAL_LT_LMUL_EQ]];
16627           REMOVE_THEN "*" (MP_TAC o SPEC `Cx(&0)`) THEN
16628           REWRITE_TAC[CENTRE_IN_BALL; REAL_LT_01] THEN
16629           DISCH_THEN(SUBST1_TAC o
16630             MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
16631           DISCH_THEN(MP_TAC o CONJUNCT1 o CONJUNCT2) THEN
16632           REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_NORM_MUL] THEN
16633           ASM_SIMP_TAC[COMPLEX_NORM_CX; real_abs; REAL_LT_IMP_LE] THEN
16634           ASM_SIMP_TAC[GSYM REAL_LE_RDIV_EQ; real_div; REAL_MUL_LID]];
16635         ALL_TAC] THEN
16636       ABBREV_TAC
16637        `l = sup { norm(complex_derivative h (Cx(&0))) | h IN ff}` THEN
16638       REWRITE_TAC[FORALL_IN_GSPEC] THEN DISCH_TAC THEN
16639       SUBGOAL_THEN
16640        `?f. (!n. (f n) IN ff) /\
16641             ((\n. Cx(norm(complex_derivative (f n) (Cx(&0))))) --> Cx(l))
16642             sequentially`
16643       STRIP_ASSUME_TAC THENL
16644        [SUBGOAL_THEN
16645          `!n. ?f. f IN ff /\
16646                   abs(norm(complex_derivative f (Cx(&0))) - l) < inv(&n + &1)`
16647         MP_TAC THENL
16648          [X_GEN_TAC `n:num` THEN
16649           FIRST_ASSUM(MP_TAC o SPEC `l - inv(&n + &1)` o CONJUNCT2) THEN
16650           REWRITE_TAC[REAL_ARITH `l <= l - i <=> ~(&0 < i)`; REAL_LT_INV_EQ;
16651              REAL_ARITH `&0 < &n + &1`; NOT_FORALL_THM; NOT_IMP] THEN
16652           MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `f:complex->complex` THEN
16653           ASM_CASES_TAC `(f:complex->complex) IN ff` THEN
16654           ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(REAL_ARITH
16655            `n <= l ==> ~(n <= l - e) ==> abs(n - l) < e`) THEN
16656           ASM_SIMP_TAC[];
16657           REWRITE_TAC[SKOLEM_THM; FORALL_AND_THM] THEN
16658           MATCH_MP_TAC MONO_EXISTS THEN
16659           X_GEN_TAC `f:num->complex->complex` THEN
16660           STRIP_TAC THEN ASM_REWRITE_TAC[LIM_SEQUENTIALLY] THEN
16661           X_GEN_TAC `e:real` THEN
16662           DISCH_THEN(MP_TAC o GEN_REWRITE_RULE I [REAL_ARCH_INV]) THEN
16663           MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN STRIP_TAC THEN
16664           X_GEN_TAC `m:num` THEN DISCH_TAC THEN REWRITE_TAC[dist] THEN
16665           MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `inv(&m + &1)` THEN
16666           ASM_REWRITE_TAC[COMPLEX_NORM_CX; GSYM CX_SUB] THEN
16667           MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `inv(&N)` THEN
16668           ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_INV2 THEN
16669           ASM_REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_ADD] THEN ASM_ARITH_TAC];
16670         ALL_TAC] THEN
16671       MP_TAC(ISPECL [`f:num->complex->complex`; `ff:(complex->complex)->bool`;
16672                      `s:complex->bool`] MONTEL) THEN
16673       ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
16674        [EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM] THEN
16675         REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_BALL; COMPLEX_SUB_LZERO;
16676                     dist; NORM_NEG] THEN
16677         MESON_TAC[REAL_LT_IMP_LE];
16678         ALL_TAC] THEN
16679       MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
16680       DISCH_THEN(X_CHOOSE_THEN `r:num->num` STRIP_ASSUME_TAC) THEN
16681       SUBGOAL_THEN
16682        `g complex_differentiable (at(Cx(&0))) /\
16683         norm(complex_derivative g (Cx(&0))) = l`
16684       STRIP_ASSUME_TAC THENL
16685        [MP_TAC(ISPECL [`(f:num->complex->complex) o (r:num->num)`;
16686                        `(\n:num z. complex_derivative (f n) z) o (r:num->num)`;
16687                        `g:complex->complex`; `s:complex->bool`]
16688                     HAS_COMPLEX_DERIVATIVE_UNIFORM_SEQUENCE) THEN
16689         ASM_REWRITE_TAC[o_THM] THEN ANTS_TAC THENL
16690          [CONJ_TAC THENL
16691            [REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
16692             REPEAT STRIP_TAC THEN
16693             MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
16694             EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[];
16695             ALL_TAC] THEN
16696           X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16697           FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
16698           DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
16699           MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
16700           STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `e:real` THEN
16701           DISCH_TAC THEN REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
16702           FIRST_X_ASSUM(MP_TAC o SPECL [`cball(z:complex,d)`; `e:real`]) THEN
16703           ASM_REWRITE_TAC[COMPACT_CBALL; GE] THEN
16704           MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[];
16705           DISCH_THEN(X_CHOOSE_THEN `g':complex->complex` MP_TAC) THEN
16706           DISCH_THEN(MP_TAC o SPEC `Cx(&0)`) THEN
16707           ASM_REWRITE_TAC[IMP_CONJ_ALT] THEN
16708           DISCH_THEN(MP_TAC o ISPEC `\z:complex. Cx(norm z)` o MATCH_MP
16709            (REWRITE_RULE[IMP_CONJ_ALT] LIM_CONTINUOUS_FUNCTION)) THEN
16710           REWRITE_TAC[CONTINUOUS_AT_CX_NORM] THEN DISCH_TAC THEN DISCH_TAC THEN
16711           CONJ_TAC THENL [ASM_MESON_TAC[complex_differentiable]; ALL_TAC] THEN
16712           GEN_REWRITE_TAC I [GSYM CX_INJ] THEN
16713           FIRST_ASSUM(SUBST1_TAC o
16714             MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
16715           MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN EXISTS_TAC
16716            `\n. Cx(norm(complex_derivative(f((r:num->num) n)) (Cx(&0))))` THEN
16717           ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN MP_TAC(ISPECL
16718            [`\n:num. Cx(norm(complex_derivative (f n) (Cx(&0))))`;
16719             `r:num->num`; `Cx l`] LIM_SUBSEQUENCE) THEN
16720           ASM_REWRITE_TAC[o_DEF]];
16721         ALL_TAC] THEN
16722       ASM_SIMP_TAC[] THEN
16723       SUBGOAL_THEN `~(?c. !z. z IN s ==> (g:complex->complex) z = c)`
16724       ASSUME_TAC THENL
16725        [DISCH_THEN(X_CHOOSE_TAC `c:complex`) THEN
16726         SUBGOAL_THEN `complex_derivative g (Cx(&0)) = Cx(&0)` MP_TAC THENL
16727          [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
16728           MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
16729           MAP_EVERY EXISTS_TAC
16730            [`(\z. c):complex->complex`; `s:complex->bool`] THEN
16731           ASM_REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_CONST] THEN ASM_MESON_TAC[];
16732           DISCH_THEN(MP_TAC o AP_TERM `norm:complex->real`) THEN
16733           ASM_REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
16734           DISCH_THEN SUBST_ALL_TAC THEN
16735           FIRST_ASSUM(MP_TAC o SPEC `\z:complex. z` o CONJUNCT1) THEN
16736           ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
16737           REWRITE_TAC[COMPLEX_DERIVATIVE_ID; COMPLEX_NORM_CX] THEN
16738           REAL_ARITH_TAC];
16739         ALL_TAC] THEN
16740       EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN
16741       REPEAT CONJ_TAC THENL
16742        [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0] THEN
16743         SUBGOAL_THEN `!z. z IN s ==> norm((g:complex->complex) z) <= &1`
16744         ASSUME_TAC THENL
16745          [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16746           MATCH_MP_TAC(ISPEC `sequentially` LIM_NORM_UBOUND) THEN
16747           EXISTS_TAC `\n:num. (f:num->complex->complex) (r n) z` THEN
16748           ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN
16749           MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN
16750           SUBGOAL_THEN
16751            `(f:num->complex->complex) (r(n:num)) IN ff`
16752           MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
16753           EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM] THEN
16754           ASM_SIMP_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0;
16755                        REAL_LT_IMP_LE];
16756           X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16757           ASM_SIMP_TAC[REAL_LT_LE] THEN DISCH_TAC THEN MP_TAC(ISPECL
16758            [`g:complex->complex`; `s:complex->bool`; `s:complex->bool`;
16759             `z:complex`] MAXIMUM_MODULUS_PRINCIPLE) THEN
16760           ASM_REWRITE_TAC[SUBSET_REFL]];
16761         MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN
16762         EXISTS_TAC `\n:num. (f:num->complex->complex) (r n) (Cx(&0))` THEN
16763         ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN
16764         MATCH_MP_TAC LIM_EVENTUALLY THEN MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
16765         X_GEN_TAC `n:num` THEN
16766         SUBGOAL_THEN `(f:num->complex->complex) (r(n:num)) IN ff`
16767         MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
16768         EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM];
16769         MATCH_MP_TAC(REWRITE_RULE
16770          [MESON[] `(!x y. P x /\ P y /\ f x = f y ==> x = y) <=>
16771                    (!x y. P x /\ P y ==> (f x = f y <=> x = y))`]
16772          HURWITZ_INJECTIVE) THEN
16773         EXISTS_TAC `(f:num->complex->complex) o (r:num->num)` THEN
16774         ASM_SIMP_TAC[o_THM] THEN X_GEN_TAC `n:num` THEN
16775         SUBGOAL_THEN `(f:num->complex->complex) (r(n:num)) IN ff`
16776         MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
16777         EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM]];
16778       ALL_TAC] THEN
16779     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `f:complex->complex` THEN
16780     STRIP_TAC THEN
16781     MP_TAC(SPECL [`f:complex->complex`; `s:complex->bool`]
16782           HOLOMORPHIC_ON_INVERSE) THEN
16783     ANTS_TAC THENL
16784      [UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16785       REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[];
16786       DISCH_THEN(MP_TAC o CONJUNCT2)] THEN
16787     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
16788     ASM_CASES_TAC `IMAGE (f:complex->complex) s = ball(Cx(&0),&1)` THENL
16789      [ASM_SIMP_TAC[] THEN ASM SET_TAC[]; ALL_TAC] THEN
16790     STRIP_TAC THEN
16791     UNDISCH_TAC `~(IMAGE (f:complex->complex) s = ball(Cx(&0),&1))` THEN
16792     MATCH_MP_TAC(TAUT `p ==> ~p ==> q`) THEN
16793     MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
16794      [UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16795       REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[];
16796       ALL_TAC] THEN
16797     REWRITE_TAC[SUBSET; COMPLEX_IN_BALL_0] THEN
16798     X_GEN_TAC `a:complex` THEN DISCH_TAC THEN
16799     REWRITE_TAC[IN_IMAGE; MESON[]
16800       `(?x. a = f x /\ x IN s) <=> ~(!x. x IN s ==> ~(f x = a))`] THEN
16801     DISCH_TAC THEN
16802     MP_TAC(ISPEC `a:complex` BALL_BIHOLOMORPHISM_EXISTS) THEN
16803     ASM_REWRITE_TAC[COMPLEX_IN_BALL_0; NOT_EXISTS_THM] THEN
16804     MAP_EVERY X_GEN_TAC [`t:complex->complex`; `t':complex->complex`] THEN
16805     STRIP_TAC THEN
16806     SUBGOAL_THEN
16807      `!z. z IN s ==> norm((f:complex->complex) z) < &1`
16808     ASSUME_TAC THENL
16809      [UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16810       SIMP_TAC[IN_ELIM_THM; SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0];
16811       ALL_TAC] THEN
16812     SUBGOAL_THEN
16813      `?sq. sq holomorphic_on (IMAGE (t o f) s) /\
16814            !z. z IN s
16815                ==> sq((t:complex->complex) ((f:complex->complex) z)) pow 2 =
16816                    t(f z)`
16817     STRIP_ASSUME_TAC THENL
16818      [UNDISCH_TAC
16819        `!f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0))) /\
16820             (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
16821             ==> ?g. g holomorphic_on s /\
16822                     (!z. z IN s ==> f z = g z pow 2)` THEN
16823       DISCH_THEN(MP_TAC o SPEC
16824        `(t:complex->complex) o (f:complex->complex)`) THEN
16825       ASM_REWRITE_TAC[FORALL_IN_IMAGE; o_THM] THEN ANTS_TAC THENL
16826        [REPEAT CONJ_TAC THENL
16827          [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN ASM_SIMP_TAC[] THEN
16828           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16829            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
16830           UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16831           REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[];
16832           UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16833           REWRITE_TAC[IN_ELIM_THM; SUBSET; FORALL_IN_IMAGE] THEN
16834           RULE_ASSUM_TAC(REWRITE_RULE[SUBSET; COMPLEX_IN_BALL_0]) THEN
16835           REWRITE_TAC[COMPLEX_IN_BALL_0] THEN STRIP_TAC THEN
16836           GEN_TAC THEN DISCH_TAC THEN
16837           DISCH_THEN(MP_TAC o AP_TERM `t':complex->complex`) THEN
16838           ASM_SIMP_TAC[] THEN ASM_MESON_TAC[];
16839           UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16840           REWRITE_TAC[IN_ELIM_THM] THEN
16841           REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0] THEN
16842           REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
16843           REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN ASM_MESON_TAC[]];
16844         DISCH_THEN(X_CHOOSE_THEN `q:complex->complex` STRIP_ASSUME_TAC) THEN
16845         EXISTS_TAC `(q:complex->complex) o (g:complex->complex) o
16846                     (t':complex->complex)` THEN
16847         ASM_REWRITE_TAC[o_THM] THEN CONJ_TAC THENL
16848          [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
16849            [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC;
16850             ALL_TAC] THEN
16851           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16852            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
16853           REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0; o_THM] THENL
16854            [ASM_MESON_TAC[]; ASM SET_TAC[]; ASM_MESON_TAC[]];
16855           X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16856           MATCH_MP_TAC EQ_TRANS THEN
16857           EXISTS_TAC `(q:complex->complex) z pow 2` THEN
16858           CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
16859           AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
16860           UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16861           REWRITE_TAC[IN_ELIM_THM; SUBSET; FORALL_IN_IMAGE] THEN
16862           REWRITE_TAC[COMPLEX_IN_BALL_0] THEN ASM_MESON_TAC[]]];
16863       ALL_TAC] THEN
16864     SUBGOAL_THEN
16865      `!z. z IN s
16866           ==> norm((sq:complex->complex)
16867                    ((t:complex->complex)((f:complex->complex) z))) < &1`
16868     ASSUME_TAC THENL
16869      [REPEAT STRIP_TAC THEN
16870       GEN_REWRITE_TAC LAND_CONV [GSYM REAL_ABS_NORM] THEN
16871       REWRITE_TAC[GSYM ABS_SQUARE_LT_1; GSYM COMPLEX_NORM_POW] THEN
16872       ASM_SIMP_TAC[];
16873       ALL_TAC] THEN
16874     MP_TAC(ISPEC
16875      `(sq:complex->complex)
16876       ((t:complex->complex)((f:complex->complex) (Cx(&0))))`
16877       BALL_BIHOLOMORPHISM_EXISTS) THEN
16878     ASM_SIMP_TAC[COMPLEX_IN_BALL_0; NOT_IMP; NOT_EXISTS_THM] THEN
16879     MAP_EVERY X_GEN_TAC [`r:complex->complex`; `r':complex->complex`] THEN
16880     STRIP_TAC THEN UNDISCH_TAC
16881      `!h. h IN ff
16882           ==> norm(complex_derivative h (Cx(&0))) <=
16883               norm(complex_derivative f (Cx(&0)))` THEN
16884     DISCH_THEN(fun th -> MP_TAC(SPEC
16885      `(r:complex->complex) o (sq:complex->complex) o
16886       (t:complex->complex) o (f:complex->complex)` th) THEN
16887      MP_TAC(SPEC `\z:complex. z` th)) THEN
16888     ASM_REWRITE_TAC[COMPLEX_DERIVATIVE_ID; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
16889     DISCH_TAC THEN REWRITE_TAC[NOT_IMP; REAL_NOT_LE] THEN
16890     EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM] THEN
16891     MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN REPEAT CONJ_TAC THENL
16892      [REPEAT(MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC) THEN
16893       ASM_SIMP_TAC[] THEN
16894       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16895            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
16896       REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
16897       ASM_SIMP_TAC[];
16898       REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
16899       ASM_SIMP_TAC[];
16900       ASM_SIMP_TAC[o_THM];
16901       MAP_EVERY X_GEN_TAC [`w:complex`; `z:complex`] THEN STRIP_TAC THEN
16902       EQ_TAC THEN SIMP_TAC[] THEN
16903       DISCH_THEN(MP_TAC o AP_TERM `r':complex->complex`) THEN
16904       ASM_SIMP_TAC[o_THM] THEN
16905       DISCH_THEN(MP_TAC o AP_TERM `\z:complex. z pow 2`) THEN
16906       ASM_SIMP_TAC[] THEN
16907       DISCH_THEN(MP_TAC o AP_TERM `t':complex->complex`) THEN
16908       ASM_SIMP_TAC[] THEN ASM_MESON_TAC[];
16909       STRIP_TAC] THEN
16910     MP_TAC(ISPEC
16911      `(t':complex->complex) o (\z. z pow 2) o (r':complex->complex)`
16912      SCHWARZ_LEMMA) THEN
16913     REWRITE_TAC[] THEN ANTS_TAC THENL
16914      [REPEAT CONJ_TAC THENL
16915        [REPEAT(MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC) THEN
16916         SIMP_TAC[HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_ID] THEN
16917         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16918            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
16919         REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
16920         ASM_SIMP_TAC[COMPLEX_NORM_POW; ABS_SQUARE_LT_1; REAL_ABS_NORM];
16921         ASM_SIMP_TAC[COMPLEX_NORM_POW; ABS_SQUARE_LT_1; REAL_ABS_NORM; o_THM];
16922         UNDISCH_THEN `(r:complex->complex) ((sq:complex->complex)
16923                       ((t:complex->complex) (f(Cx(&0))))) = Cx(&0)`
16924          (fun th -> GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [SYM th]) THEN
16925         ASM_SIMP_TAC[o_THM] THEN
16926         UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16927         SIMP_TAC[IN_ELIM_THM]];
16928       DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN MATCH_MP_TAC
16929        (TAUT `~r /\ (p /\ ~q ==> s) ==> p /\ (q' \/ q ==> r) ==> s`) THEN
16930       CONJ_TAC THENL
16931        [REWRITE_TAC[NOT_EXISTS_THM] THEN X_GEN_TAC `c:complex` THEN
16932         ASM_CASES_TAC `c = Cx(&0)` THEN
16933         ASM_SIMP_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_OF_NUM_EQ; ARITH] THEN
16934         DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
16935         DISCH_THEN(fun th ->
16936           MP_TAC(ISPEC `(r:complex->complex) (--(Cx(&1) / Cx(&2)))` th) THEN
16937           MP_TAC(ISPEC `(r:complex->complex) (Cx(&1) / Cx(&2))` th)) THEN
16938         MATCH_MP_TAC(TAUT `(p1 /\ p2) /\ (q1 /\ q2 ==> r)
16939                            ==> (p1 ==> q1) ==> (p2 ==> q2) ==> r`) THEN
16940         CONJ_TAC THENL
16941          [CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16942           REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
16943           REAL_ARITH_TAC;
16944           ALL_TAC] THEN
16945         MATCH_MP_TAC(MESON[]
16946          `~(b1 = b2) /\ a1 = a2 ==> (a1 = b1 /\ a2 = b2 ==> F)`) THEN
16947         CONJ_TAC THENL
16948          [ASM_REWRITE_TAC[COMPLEX_EQ_MUL_LCANCEL] THEN
16949           DISCH_THEN(MP_TAC o AP_TERM `r':complex->complex`) THEN
16950           FIRST_ASSUM(fun th ->
16951             W(MP_TAC o PART_MATCH (lhand o rand) th o
16952                lhand o lhand o snd)) THEN
16953           REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
16954           CONV_TAC REAL_RAT_REDUCE_CONV THEN DISCH_THEN SUBST1_TAC THEN
16955           MATCH_MP_TAC(COMPLEX_RING
16956            `x = --(Cx(&1) / Cx(&2)) ==> ~(Cx(&1) / Cx(&2) = x)`) THEN
16957           FIRST_X_ASSUM MATCH_MP_TAC THEN
16958           REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
16959           CONV_TAC REAL_RAT_REDUCE_CONV;
16960           REWRITE_TAC[o_DEF] THEN AP_TERM_TAC THEN
16961           MATCH_MP_TAC(COMPLEX_RING
16962            `x = Cx(&1) / Cx(&2) /\ y = --(Cx(&1) / Cx(&2))
16963             ==> x pow 2 = y pow 2`) THEN
16964           CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16965           REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
16966           CONV_TAC REAL_RAT_REDUCE_CONV];
16967         REWRITE_TAC[GSYM REAL_LT_LE] THEN DISCH_TAC THEN
16968         UNDISCH_TAC `&1 <= norm (complex_derivative f (Cx(&0)))` THEN
16969         SUBGOAL_THEN
16970          `complex_derivative f (Cx(&0)) =
16971           complex_derivative (t' o (\z:complex. z pow 2) o r') (Cx(&0)) *
16972           complex_derivative
16973             (r o (sq:complex->complex) o (t:complex->complex) o f) (Cx(&0))`
16974          (fun th -> REWRITE_TAC[th; COMPLEX_NORM_MUL])
16975         THENL
16976          [ALL_TAC;
16977           REWRITE_TAC[REAL_ARITH `a * b < b <=> &0 < (&1 - a) * b`] THEN
16978           DISCH_THEN(MP_TAC o MATCH_MP
16979            (REAL_ARITH `&1 <= x ==> ~(x = &0)`)) THEN
16980           SIMP_TAC[REAL_ENTIRE; NORM_EQ_0; GSYM NORM_POS_LT; DE_MORGAN_THM] THEN
16981           ASM_SIMP_TAC[REAL_LT_MUL_EQ] THEN ASM_REAL_ARITH_TAC] THEN
16982         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
16983         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
16984         EXISTS_TAC `((t':complex->complex) o
16985                      (\z:complex. z pow 2) o (r':complex->complex)) o
16986                     ((r:complex->complex) o (sq:complex->complex) o
16987                      (t:complex->complex) o (f:complex->complex))` THEN
16988         EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
16989          [ASM_SIMP_TAC[o_THM]; ALL_TAC] THEN
16990         MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
16991         ASM_REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
16992         CONJ_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THENL
16993          [EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[];
16994           EXISTS_TAC `ball(Cx(&0),&1)` THEN
16995           ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; REAL_LT_01] THEN
16996           REPEAT(MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC) THEN
16997           SIMP_TAC[HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_ID] THEN
16998           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16999            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
17000           REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
17001           ASM_SIMP_TAC[COMPLEX_NORM_POW; ABS_SQUARE_LT_1; REAL_ABS_NORM]]]];
17002     ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[] THEN
17003     ASM_CASES_TAC `s = (:complex)` THEN ASM_REWRITE_TAC[] THENL
17004      [ONCE_REWRITE_TAC[HOMEOMORPHIC_SYM] THEN
17005       MATCH_MP_TAC HOMEOMORPHIC_BALL_UNIV THEN REWRITE_TAC[REAL_LT_01];
17006       REWRITE_TAC[HOMEOMORPHIC_MINIMAL] THEN
17007       REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN
17008       MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]];
17009     STRIP_TAC THEN ASM_REWRITE_TAC[SIMPLY_CONNECTED_EMPTY] THEN
17010     FIRST_ASSUM(MP_TAC o MATCH_MP HOMEOMORPHIC_SIMPLY_CONNECTED_EQ) THEN
17011     SIMP_TAC[CONVEX_IMP_SIMPLY_CONNECTED; CONVEX_BALL]]);;
17012
17013 let CONTRACTIBLE_EQ_SIMPLY_CONNECTED_2D = prove
17014  (`!s:real^2->bool. open s ==> (contractible s <=> simply_connected s)`,
17015   REPEAT STRIP_TAC THEN EQ_TAC THEN
17016   REWRITE_TAC[CONTRACTIBLE_IMP_SIMPLY_CONNECTED] THEN
17017   ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] THEN
17018   STRIP_TAC THEN ASM_REWRITE_TAC[CONTRACTIBLE_EMPTY] THEN
17019   ASM_MESON_TAC[HOMEOMORPHIC_CONTRACTIBLE_EQ; CONVEX_IMP_CONTRACTIBLE;
17020                 CONVEX_BALL]);;
17021
17022 (* ------------------------------------------------------------------------- *)
17023 (* A further chain of equivalents about components of the complement of a    *)
17024 (* simply connected set (following 1.35 in Burckel's book).                  *)
17025 (* ------------------------------------------------------------------------- *)
17026
17027 let [SIMPLY_CONNECTED_EQ_FRONTIER_PROPERTIES;
17028      SIMPLY_CONNECTED_EQ_UNBOUNDED_COMPLEMENT_COMPONENTS;
17029      SIMPLY_CONNECTED_EQ_EMPTY_INSIDE] = (CONJUNCTS o prove)
17030  (`(!s:complex->bool.
17031         open s
17032         ==> (simply_connected s <=>
17033              connected s /\
17034              if bounded s then connected(frontier s)
17035              else !c. c IN components(frontier s) ==> ~bounded c)) /\
17036    (!s. open s
17037         ==> (simply_connected s <=>
17038              connected s /\
17039              !c. c IN components ((:complex) DIFF s) ==> ~bounded c)) /\
17040    (!s:complex->bool.
17041         open s ==> (simply_connected s <=> connected s /\ inside s = {}))`,
17042   REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `s:complex->bool` THEN
17043   ASM_CASES_TAC `open(s:complex->bool)` THEN ASM_REWRITE_TAC[] THEN
17044   MATCH_MP_TAC(TAUT
17045    `(q3 ==> p) /\ (q2 ==> q3) /\ (q1 ==> q2) /\ (p ==> q1)
17046     ==> (p <=> q1) /\ (p <=> q2) /\ (p <=> q3)`) THEN
17047   REPEAT CONJ_TAC THENL
17048    [REWRITE_TAC[INSIDE_OUTSIDE] THEN
17049     REWRITE_TAC[SET_RULE `UNIV DIFF (s UNION t) = {} <=>
17050                           !x. ~(x IN s) ==> x IN t`] THEN
17051     STRIP_TAC THEN ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_WINDING_NUMBER_ZERO] THEN
17052     GEN_TAC THEN X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
17053     MATCH_MP_TAC WINDING_NUMBER_ZERO_IN_OUTSIDE THEN ASM_REWRITE_TAC[] THEN
17054     FIRST_ASSUM(MP_TAC o MATCH_MP OUTSIDE_MONO) THEN ASM SET_TAC[];
17055     REWRITE_TAC[components; FORALL_IN_GSPEC; inside] THEN SET_TAC[];
17056     ASM_CASES_TAC `connected(s:complex->bool)` THEN ASM_REWRITE_TAC[] THEN
17057     COND_CASES_TAC THENL
17058      [DISCH_TAC THEN
17059       REWRITE_TAC[components; FORALL_IN_GSPEC; IN_DIFF; IN_UNIV] THEN
17060       ASM_CASES_TAC `s:complex->bool = {}` THEN
17061       ASM_SIMP_TAC[DIFF_EMPTY; CONNECTED_COMPONENT_EQ_SELF;
17062                    CONNECTED_UNIV; IN_UNIV; NOT_BOUNDED_UNIV] THEN
17063       ASM_CASES_TAC `s = (:complex)` THENL
17064        [ASM_MESON_TAC[NOT_BOUNDED_UNIV]; ALL_TAC] THEN
17065       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
17066       FIRST_ASSUM(MP_TAC o MATCH_MP OUTSIDE_BOUNDED_NONEMPTY) THEN
17067       REWRITE_TAC[outside; GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN
17068       DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC) THEN
17069       SUBGOAL_THEN
17070        `connected_component ((:complex) DIFF s) w =
17071         connected_component ((:complex) DIFF s) z`
17072        (fun th -> ASM_REWRITE_TAC[th]) THEN
17073       MATCH_MP_TAC JOINABLE_CONNECTED_COMPONENT_EQ THEN
17074       EXISTS_TAC `frontier s :complex->bool` THEN ASM_REWRITE_TAC[] THEN
17075       CONJ_TAC THENL
17076        [REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
17077          `i = s ==> s' DIFF i SUBSET UNIV DIFF s`) THEN
17078         ASM_REWRITE_TAC[INTERIOR_EQ];
17079         ALL_TAC] THEN
17080       ONCE_REWRITE_TAC[GSYM FRONTIER_COMPLEMENT] THEN CONJ_TAC THEN
17081       MATCH_MP_TAC(SET_RULE
17082        `frontier c SUBSET c /\ frontier c SUBSET f /\ ~(frontier c = {})
17083         ==> ~(c INTER f = {})`) THEN
17084       REWRITE_TAC[FRONTIER_OF_CONNECTED_COMPONENT_SUBSET] THEN
17085       ASM_REWRITE_TAC[FRONTIER_EQ_EMPTY; CONNECTED_COMPONENT_EQ_EMPTY;
17086                       IN_DIFF; IN_UNIV; CONNECTED_COMPONENT_EQ_UNIV;
17087                       SET_RULE `UNIV DIFF s = UNIV <=> s = {}`] THEN
17088       REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
17089        `c = s ==> c DIFF i SUBSET s`) THEN
17090       ASM_REWRITE_TAC[CLOSURE_EQ] THEN
17091       MATCH_MP_TAC CLOSED_CONNECTED_COMPONENT THEN
17092       ASM_REWRITE_TAC[GSYM OPEN_CLOSED];
17093       DISCH_TAC THEN REWRITE_TAC[components; FORALL_IN_GSPEC] THEN
17094       X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_DIFF; IN_UNIV] THEN
17095       DISCH_TAC THEN
17096       SUBGOAL_THEN
17097        `?z:complex. z IN frontier s /\
17098                     z IN connected_component ((:real^2) DIFF s) w`
17099       STRIP_ASSUME_TAC THENL
17100        [ONCE_REWRITE_TAC[GSYM FRONTIER_COMPLEMENT] THEN
17101         MATCH_MP_TAC(SET_RULE
17102          `frontier c SUBSET c /\ frontier c SUBSET f /\ ~(frontier c = {})
17103           ==> ?z. z IN f /\ z IN c`) THEN
17104         ASM_REWRITE_TAC[FRONTIER_OF_CONNECTED_COMPONENT_SUBSET] THEN
17105         CONJ_TAC THENL
17106          [REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
17107            `c = s ==> c DIFF i SUBSET s`) THEN
17108           ASM_REWRITE_TAC[CLOSURE_EQ] THEN
17109           MATCH_MP_TAC CLOSED_CONNECTED_COMPONENT THEN
17110           ASM_REWRITE_TAC[GSYM OPEN_CLOSED];
17111           ASM_REWRITE_TAC[FRONTIER_EQ_EMPTY; CONNECTED_COMPONENT_EQ_EMPTY;
17112                           CONNECTED_COMPONENT_EQ_UNIV; IN_DIFF; IN_UNIV] THEN
17113           REWRITE_TAC[SET_RULE `UNIV DIFF s = UNIV <=> s = {}`] THEN
17114           ASM_MESON_TAC[BOUNDED_EMPTY]];
17115         FIRST_X_ASSUM(MP_TAC o SPEC
17116          `connected_component (frontier s) (z:complex)`) THEN
17117         REWRITE_TAC[components; IN_ELIM_THM] THEN
17118         ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[CONTRAPOS_THM]] THEN
17119         MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] BOUNDED_SUBSET) THEN
17120         SUBGOAL_THEN
17121          `connected_component ((:complex) DIFF s) w =
17122           connected_component ((:complex) DIFF s) z`
17123         SUBST1_TAC THENL
17124          [ASM_MESON_TAC[CONNECTED_COMPONENT_EQ];
17125           MATCH_MP_TAC CONNECTED_COMPONENT_MAXIMAL THEN
17126           ASM_REWRITE_TAC[IN; CONNECTED_COMPONENT_REFL_EQ] THEN
17127           REWRITE_TAC[CONNECTED_CONNECTED_COMPONENT] THEN
17128           MATCH_MP_TAC SUBSET_TRANS THEN
17129           EXISTS_TAC `frontier s :complex->bool` THEN
17130           REWRITE_TAC[CONNECTED_COMPONENT_SUBSET] THEN
17131           REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
17132             `i = s ==> s' DIFF i SUBSET UNIV DIFF s`) THEN
17133           ASM_REWRITE_TAC[INTERIOR_EQ]]]];
17134     ALL_TAC] THEN
17135   DISCH_THEN(fun th ->
17136    ASSUME_TAC(MATCH_MP SIMPLY_CONNECTED_IMP_CONNECTED th) THEN MP_TAC th) THEN
17137   ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] THEN STRIP_TAC THEN
17138   ASM_REWRITE_TAC[BOUNDED_EMPTY; FRONTIER_EMPTY; CONNECTED_EMPTY] THEN
17139   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homeomorphic]) THEN
17140   REWRITE_TAC[LEFT_IMP_EXISTS_THM; homeomorphism] THEN
17141   MAP_EVERY X_GEN_TAC [`g:real^2->real^2`; `f:real^2->real^2`] THEN
17142   STRIP_TAC THEN MAP_EVERY ABBREV_TAC
17143    [`D = \n. ball(vec 0:real^2,&1 - inv(&n + &2))`;
17144     `A = \n. {z:real^2 | &1 - inv(&n + &2) < norm z /\ norm z < &1}`;
17145     `X = \n:num. closure(IMAGE (f:real^2->real^2) (A n))`] THEN
17146   SUBGOAL_THEN
17147    `frontier s = INTERS {X n:real^2->bool | n IN (:num)}`
17148   SUBST1_TAC THENL
17149    [ASM_SIMP_TAC[frontier; INTERIOR_OPEN; INTERS_GSPEC; IN_UNIV] THEN
17150     MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
17151      [REWRITE_TAC[SUBSET; IN_DIFF] THEN X_GEN_TAC `x:real^2` THEN
17152       STRIP_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN X_GEN_TAC `n:num` THEN
17153       UNDISCH_TAC `(x:real^2) IN closure s` THEN
17154       SUBGOAL_THEN
17155        `s = IMAGE (f:real^2->real^2) (closure (D(n:num))) UNION IMAGE f (A n)`
17156       SUBST1_TAC THENL
17157        [EXPAND_TAC "s" THEN MATCH_MP_TAC(SET_RULE
17158          `t UNION u = s /\ (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
17159           ==> IMAGE f s = IMAGE f t UNION IMAGE f u`) THEN
17160         CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
17161         MAP_EVERY EXPAND_TAC ["A"; "D"] THEN
17162         SIMP_TAC[CLOSURE_BALL; REAL_SUB_LT; REAL_INV_LT_1;
17163                  REAL_ARITH `&1 < &n + &2`] THEN
17164         REWRITE_TAC[EXTENSION; IN_UNION; COMPLEX_IN_BALL_0; IN_CBALL_0;
17165                    IN_ELIM_THM] THEN GEN_TAC THEN
17166         MATCH_MP_TAC(REAL_ARITH
17167          `&0 < e /\ e <= &1
17168           ==> (x <= &1 - e \/ &1 - e < x /\ x < &1 <=> x < &1)`) THEN
17169         SIMP_TAC[REAL_LT_INV_EQ; REAL_INV_LE_1; REAL_ARITH `&1 <= &n + &2`;
17170                  REAL_ARITH `&0 < &n + &2`];
17171         EXPAND_TAC "X" THEN REWRITE_TAC[CLOSURE_UNION] THEN
17172         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
17173          `~(x IN s) ==> t SUBSET s ==> x IN t UNION u ==> x IN u`)) THEN
17174         EXPAND_TAC "D" THEN
17175         SIMP_TAC[CLOSURE_BALL; REAL_SUB_LT; REAL_INV_LT_1;
17176                  REAL_ARITH `&1 < &n + &2`; COMPACT_CBALL] THEN
17177         MATCH_MP_TAC(SET_RULE
17178          `closure s = s /\ s SUBSET t ==> closure s SUBSET t`) THEN
17179         CONJ_TAC THENL
17180          [MATCH_MP_TAC CLOSURE_CLOSED THEN MATCH_MP_TAC COMPACT_IMP_CLOSED THEN
17181           MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
17182           REWRITE_TAC[COMPACT_CBALL] THEN
17183           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
17184             CONTINUOUS_ON_SUBSET));
17185           EXPAND_TAC "s" THEN MATCH_MP_TAC IMAGE_SUBSET] THEN
17186         REWRITE_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_CBALL_0] THEN GEN_TAC THEN
17187         MATCH_MP_TAC(REAL_ARITH `&0 < x ==> a <= &1 - x ==> a < &1`) THEN
17188         REWRITE_TAC[REAL_LT_INV_EQ] THEN REAL_ARITH_TAC];
17189       MATCH_MP_TAC(SET_RULE
17190        `s SUBSET t /\ s INTER u = {} ==> s SUBSET t DIFF u`) THEN
17191       CONJ_TAC THENL
17192        [EXPAND_TAC "X" THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN
17193         X_GEN_TAC `x:real^2` THEN DISCH_THEN(MP_TAC o SPEC `0`) THEN
17194         SPEC_TAC(`x:real^2`,`x:real^2`) THEN REWRITE_TAC[GSYM SUBSET] THEN
17195         MATCH_MP_TAC SUBSET_CLOSURE THEN EXPAND_TAC "s" THEN
17196         MATCH_MP_TAC IMAGE_SUBSET THEN EXPAND_TAC "A" THEN
17197         REWRITE_TAC[SUBSET; IN_ELIM_THM; COMPLEX_IN_BALL_0] THEN
17198         REAL_ARITH_TAC;
17199         REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM; NOT_IN_EMPTY] THEN
17200         MAP_EVERY EXPAND_TAC ["s"; "X"] THEN
17201         REWRITE_TAC[TAUT `~(a /\ b) <=> b ==> ~a`; FORALL_IN_IMAGE] THEN
17202         X_GEN_TAC `x:real^2` THEN REWRITE_TAC[COMPLEX_IN_BALL_0] THEN
17203         DISCH_TAC THEN MP_TAC(SPEC `&1 - norm(x:real^2)` REAL_ARCH_INV) THEN
17204         ASM_REWRITE_TAC[REAL_SUB_LT; NOT_FORALL_THM] THEN
17205         MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:num` THEN STRIP_TAC THEN
17206         MATCH_MP_TAC(SET_RULE
17207          `!s. y IN s /\ (s INTER t = {}) ==> ~(y IN t)`) THEN
17208         EXISTS_TAC `IMAGE (f:real^2->real^2) (D(n:num))` THEN CONJ_TAC THENL
17209          [MATCH_MP_TAC FUN_IN_IMAGE THEN EXPAND_TAC "D" THEN
17210           REWRITE_TAC[IN_BALL_0] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
17211            (REAL_ARITH `n < &1 - x ==> m < n ==> x < &1 - m`)) THEN
17212           MATCH_MP_TAC REAL_LT_INV2 THEN
17213           ASM_SIMP_TAC[REAL_OF_NUM_LT; LE_1] THEN REAL_ARITH_TAC;
17214           SUBGOAL_THEN `open(IMAGE (f:real^2->real^2) (D(n:num)))` MP_TAC THENL
17215            [MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
17216             SUBGOAL_THEN `(D:num->real^2->bool) n SUBSET ball(Cx(&0),&1)`
17217             ASSUME_TAC THENL
17218              [EXPAND_TAC "D" THEN REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN
17219               MATCH_MP_TAC SUBSET_BALL THEN
17220               REWRITE_TAC[REAL_ARITH `&1 - x <= &1 <=> &0 <= x`] THEN
17221               REWRITE_TAC[REAL_LE_INV_EQ] THEN REAL_ARITH_TAC;
17222               REPEAT CONJ_TAC THENL
17223                [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17224                 EXPAND_TAC "D" THEN REWRITE_TAC[OPEN_BALL];
17225                 ASM SET_TAC[]]];
17226             SIMP_TAC[OPEN_INTER_CLOSURE_EQ_EMPTY] THEN DISCH_TAC THEN
17227             MATCH_MP_TAC(SET_RULE
17228              `!u. (!x y. x IN u /\ y IN u /\ f x = f y ==> x = y) /\
17229                   s UNION t SUBSET u /\ s INTER t = {}
17230                   ==> IMAGE f s INTER IMAGE f t = {}`) THEN
17231             EXISTS_TAC `ball(Cx(&0),&1)` THEN
17232             CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
17233             MAP_EVERY EXPAND_TAC ["D"; "A"] THEN
17234             REWRITE_TAC[COMPLEX_IN_BALL_0; IN_BALL_0; SUBSET; NOT_IN_EMPTY;
17235               IN_UNION; IN_ELIM_THM; IN_INTER; EXTENSION] THEN
17236             CONJ_TAC THENL [GEN_TAC; REAL_ARITH_TAC] THEN
17237             MATCH_MP_TAC(REAL_ARITH
17238              `&0 < e ==> x < &1 - e \/ &1 - e < x /\ x < &1 ==> x < &1`) THEN
17239             REWRITE_TAC[REAL_LT_INV_EQ] THEN REAL_ARITH_TAC]]]];
17240     ALL_TAC] THEN
17241   SUBGOAL_THEN `!n. closed((X:num->complex->bool) n)` ASSUME_TAC THENL
17242    [EXPAND_TAC "X" THEN REWRITE_TAC[CLOSED_CLOSURE]; ALL_TAC] THEN
17243   SUBGOAL_THEN `!n. connected((X:num->complex->bool) n)` ASSUME_TAC THENL
17244    [X_GEN_TAC `n:num` THEN EXPAND_TAC "X" THEN
17245     MATCH_MP_TAC CONNECTED_CLOSURE THEN
17246     MATCH_MP_TAC CONNECTED_CONTINUOUS_IMAGE THEN
17247     EXPAND_TAC "A" THEN CONJ_TAC THENL
17248      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
17249             CONTINUOUS_ON_SUBSET)) THEN
17250       SIMP_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_ELIM_THM];
17251       ONCE_REWRITE_TAC[NORM_ARITH `norm z = norm(z - vec 0)`] THEN
17252       SIMP_TAC[CONNECTED_ANNULUS; DIMINDEX_2; LE_REFL]];
17253     ALL_TAC] THEN
17254   SUBGOAL_THEN
17255    `!n. ((X:num->complex->bool) n) SUBSET closure s`
17256   ASSUME_TAC THENL
17257    [GEN_TAC THEN EXPAND_TAC "X" THEN REWRITE_TAC[] THEN
17258     MATCH_MP_TAC SUBSET_CLOSURE THEN EXPAND_TAC "s" THEN
17259     MATCH_MP_TAC IMAGE_SUBSET THEN  EXPAND_TAC "A" THEN
17260     SIMP_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_ELIM_THM];
17261     ALL_TAC] THEN
17262   SUBGOAL_THEN `!m n. m <= n ==> (X:num->complex->bool) n SUBSET X m`
17263   ASSUME_TAC THENL
17264    [MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN STRIP_TAC THEN
17265     EXPAND_TAC "X" THEN MATCH_MP_TAC SUBSET_CLOSURE THEN
17266     MATCH_MP_TAC IMAGE_SUBSET THEN EXPAND_TAC "A" THEN
17267     REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN GEN_TAC THEN
17268     MATCH_MP_TAC(REAL_ARITH
17269      `n <= m ==> &1 - n < x /\ x < &1 ==> &1 - m < x /\ x < &1`) THEN
17270     MATCH_MP_TAC REAL_LE_INV2 THEN
17271     ASM_REWRITE_TAC[REAL_LE_RADD; REAL_OF_NUM_LE] THEN REAL_ARITH_TAC;
17272     ALL_TAC] THEN
17273   COND_CASES_TAC THENL
17274    [MATCH_MP_TAC CONNECTED_NEST THEN
17275     ASM_REWRITE_TAC[COMPACT_EQ_BOUNDED_CLOSED] THEN
17276     ASM_MESON_TAC[BOUNDED_SUBSET; BOUNDED_CLOSURE];
17277     ALL_TAC] THEN
17278   SUBGOAL_THEN `!n. ~(bounded((X:num->complex->bool) n))` ASSUME_TAC THENL
17279    [X_GEN_TAC `n:num` THEN DISCH_TAC THEN
17280     UNDISCH_TAC `~bounded(s:complex->bool)` THEN EXPAND_TAC "s" THEN
17281     REWRITE_TAC[] THEN MATCH_MP_TAC BOUNDED_SUBSET THEN EXISTS_TAC
17282       `IMAGE (f:complex->complex)
17283              (cball(Cx(&0),&1 - inv(&n + &2)) UNION A n)` THEN
17284     CONJ_TAC THENL
17285      [REWRITE_TAC[IMAGE_UNION; BOUNDED_UNION] THEN CONJ_TAC THENL
17286        [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
17287         MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN SIMP_TAC[COMPACT_CBALL] THEN
17288         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
17289             CONTINUOUS_ON_SUBSET)) THEN
17290         SIMP_TAC[SUBSET; COMPLEX_IN_CBALL_0; COMPLEX_IN_BALL_0] THEN
17291         GEN_TAC THEN MATCH_MP_TAC(REAL_ARITH
17292          `&0 < e ==> x <= &1 - e ==> x < &1`) THEN
17293         ASM_REWRITE_TAC[REAL_LT_INV_EQ] THEN REAL_ARITH_TAC;
17294         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
17295               BOUNDED_SUBSET)) THEN EXPAND_TAC "X" THEN
17296         REWRITE_TAC[CLOSURE_SUBSET]];
17297       MATCH_MP_TAC IMAGE_SUBSET THEN EXPAND_TAC "A" THEN
17298       REWRITE_TAC[SUBSET; IN_UNION; COMPLEX_IN_BALL_0; COMPLEX_IN_CBALL_0;
17299                   IN_ELIM_THM] THEN REAL_ARITH_TAC];
17300     ALL_TAC] THEN
17301   X_GEN_TAC `c:complex->bool` THEN REPEAT DISCH_TAC THEN
17302   SUBGOAL_THEN `closed(INTERS {X n:complex->bool | n IN (:num)})`
17303   ASSUME_TAC THENL
17304    [ASM_SIMP_TAC[CLOSED_INTERS; FORALL_IN_GSPEC]; ALL_TAC] THEN
17305   SUBGOAL_THEN `closed(c:complex->bool)` ASSUME_TAC THENL
17306    [ASM_MESON_TAC[CLOSED_COMPONENTS]; ALL_TAC] THEN
17307   SUBGOAL_THEN `compact(c:complex->bool)` ASSUME_TAC THENL
17308    [ASM_REWRITE_TAC[COMPACT_EQ_BOUNDED_CLOSED]; ALL_TAC] THEN
17309   SUBGOAL_THEN
17310    `?k:complex->bool.
17311         c SUBSET k /\ compact k /\
17312         k SUBSET INTERS {X n | n IN (:num)} /\
17313         closed(INTERS {X n | n IN (:num)} DIFF k)`
17314   STRIP_ASSUME_TAC THENL
17315    [MP_TAC(ISPECL[`INTERS {X n:complex->bool | n IN (:num)}`;`c:complex->bool`]
17316         SURA_BURA) THEN
17317     ASM_SIMP_TAC[OPEN_IN_CLOSED_IN_EQ; TOPSPACE_EUCLIDEAN_SUBTOPOLOGY;
17318                  CLOSED_IMP_LOCALLY_COMPACT] THEN
17319     MATCH_MP_TAC(MESON[]
17320      `~(c = i {}) /\ (~(f = {}) ==> P)
17321       ==> c = i f ==> P`) THEN
17322     CONJ_TAC THENL
17323      [REWRITE_TAC[INTERS_0] THEN ASM_MESON_TAC[NOT_BOUNDED_UNIV];
17324       REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN MATCH_MP_TAC MONO_EXISTS THEN
17325       X_GEN_TAC `k:complex->bool` THEN REWRITE_TAC[IN_ELIM_THM] THEN
17326       ASM_MESON_TAC[CLOSED_IN_CLOSED_TRANS]];
17327     ALL_TAC] THEN
17328   MP_TAC(ISPECL [`k:complex->bool`;
17329                  `INTERS {X n:complex->bool | n IN (:num)} DIFF k`]
17330         SEPARATION_NORMAL_COMPACT) THEN
17331   ASM_SIMP_TAC[NOT_EXISTS_THM; SET_RULE `k INTER (s DIFF k) = {}`] THEN
17332   MAP_EVERY X_GEN_TAC [`v:complex->bool`; `v':complex->bool`] THEN
17333   STRIP_TAC THEN
17334   SUBGOAL_THEN `v INTER (INTERS {X n:complex->bool | n IN (:num)} DIFF k) = {}`
17335   ASSUME_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
17336   MP_TAC(ISPECL
17337    [`closure(v) DIFF v:complex->bool`;
17338     `{X n INTER closure(v:complex->bool) | n IN (:num)}`]
17339    COMPACT_IMP_FIP) THEN
17340   ASM_SIMP_TAC[COMPACT_DIFF; FORALL_IN_GSPEC; CLOSED_INTER; CLOSED_CLOSURE;
17341                NOT_IMP] THEN
17342   CONJ_TAC THENL
17343    [ALL_TAC;
17344     SUBGOAL_THEN
17345      `INTERS {X n INTER closure v :complex->bool | n IN (:num)} =
17346       INTERS {X n | n IN (:num)} INTER closure v`
17347     SUBST1_TAC THENL
17348      [REWRITE_TAC[INTERS_GSPEC; EXTENSION; IN_ELIM_THM; IN_INTER; IN_UNIV] THEN
17349       MESON_TAC[];
17350       MP_TAC(ISPECL [`v':complex->bool`; `v:complex->bool`]
17351         OPEN_INTER_CLOSURE_EQ_EMPTY) THEN
17352       ASM_REWRITE_TAC[] THEN ASM SET_TAC[]]] THEN
17353   ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
17354   REWRITE_TAC[FINITE_SUBSET_IMAGE; SUBSET_UNIV; LEFT_IMP_EXISTS_THM] THEN
17355   ONCE_REWRITE_TAC[SWAP_FORALL_THM] THEN
17356   REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_UNWIND_THM2] THEN
17357   X_GEN_TAC `i:num->bool` THEN STRIP_TAC THEN
17358   FIRST_ASSUM(MP_TAC o SPEC `\n:num. n` o MATCH_MP UPPER_BOUND_FINITE_SET) THEN
17359   REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
17360   ASM_CASES_TAC `i:num->bool = {}` THENL
17361    [ASM_REWRITE_TAC[IMAGE_CLAUSES; INTERS_0; INTER_UNIV] THEN
17362     MP_TAC(ISPEC `v:complex->bool` FRONTIER_EQ_EMPTY) THEN
17363     ASM_SIMP_TAC[frontier; INTERIOR_OPEN] THEN DISCH_THEN SUBST1_TAC THEN
17364     DISCH_THEN(DISJ_CASES_THEN SUBST_ALL_TAC) THENL
17365      [FIRST_ASSUM(MP_TAC o MATCH_MP IN_COMPONENTS_NONEMPTY) THEN
17366       ASM SET_TAC[];
17367       ASM_MESON_TAC[CLOSURE_UNIV; COMPACT_IMP_BOUNDED; NOT_BOUNDED_UNIV]];
17368     ALL_TAC] THEN
17369   SUBGOAL_THEN `?n:num. n IN i /\ !m. m IN i ==> m <= n`
17370    (X_CHOOSE_TAC `p:num`) THENL
17371    [MAP_EVERY UNDISCH_TAC [`~(i:num->bool = {})`; `FINITE(i:num->bool)`] THEN
17372     POP_ASSUM_LIST(K ALL_TAC) THEN SPEC_TAC(`i:num->bool`,`i:num->bool`) THEN
17373     MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
17374     REWRITE_TAC[EXISTS_IN_INSERT; FORALL_IN_INSERT; NOT_INSERT_EMPTY] THEN
17375     MAP_EVERY X_GEN_TAC [`n:num`; `i:num->bool`] THEN
17376     ASM_CASES_TAC `i:num->bool = {}` THEN
17377     ASM_REWRITE_TAC[LE_REFL; NOT_IN_EMPTY] THEN
17378     DISCH_THEN(X_CHOOSE_THEN `p:num` STRIP_ASSUME_TAC o CONJUNCT1) THEN
17379     DISJ_CASES_TAC(ARITH_RULE `n:num <= p \/ p <= n`) THEN
17380     ASM_MESON_TAC[LE_TRANS];
17381     ALL_TAC] THEN
17382   SUBGOAL_THEN
17383    `INTERS (IMAGE (\n:num. X n INTER closure v) i):complex->bool =
17384     X p INTER closure v`
17385   SUBST1_TAC THENL
17386    [REWRITE_TAC[EXTENSION; INTERS_IMAGE; IN_ELIM_THM; IN_INTER] THEN
17387     ASM SET_TAC[];
17388     ALL_TAC] THEN
17389   DISCH_THEN(ASSUME_TAC o MATCH_MP (SET_RULE
17390     `(c DIFF v) INTER (x INTER c) = {} ==> x INTER c SUBSET v`)) THEN
17391   SUBGOAL_THEN `connected((X:num->complex->bool) p)` MP_TAC THENL
17392    [ASM_MESON_TAC[]; ALL_TAC] THEN
17393   REWRITE_TAC[CONNECTED_CLOPEN] THEN
17394   DISCH_THEN(MP_TAC o SPEC `(X:num->complex->bool) p INTER closure v`) THEN
17395   REWRITE_TAC[NOT_IMP; DE_MORGAN_THM] THEN REPEAT CONJ_TAC THENL
17396    [SUBGOAL_THEN `(X:num->complex->bool) p INTER closure v = X p INTER v`
17397     SUBST1_TAC THENL
17398      [MP_TAC(ISPEC `v:complex->bool` CLOSURE_SUBSET) THEN ASM SET_TAC[];
17399       MATCH_MP_TAC OPEN_IN_OPEN_INTER THEN ASM_REWRITE_TAC[]];
17400     MATCH_MP_TAC CLOSED_IN_CLOSED_INTER THEN REWRITE_TAC[CLOSED_CLOSURE];
17401     MATCH_MP_TAC(SET_RULE `!k. k SUBSET s /\ ~(k = {}) ==> ~(s = {})`) THEN
17402     EXISTS_TAC `k:complex->bool` THEN CONJ_TAC THENL
17403      [MP_TAC(ISPEC `v:complex->bool` CLOSURE_SUBSET) THEN ASM SET_TAC[];
17404       FIRST_ASSUM(MP_TAC o MATCH_MP IN_COMPONENTS_NONEMPTY) THEN
17405       ASM SET_TAC[]];
17406     DISCH_THEN(MP_TAC o AP_TERM `bounded:(complex->bool)->bool`) THEN
17407     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC BOUNDED_SUBSET THEN
17408     EXISTS_TAC `closure v:complex->bool` THEN
17409     ASM_SIMP_TAC[COMPACT_IMP_BOUNDED] THEN SET_TAC[]]);;
17410
17411 let SIMPLY_CONNECTED_IFF_SIMPLE = prove
17412  (`!s:real^2->bool.
17413         open s /\ bounded s
17414         ==> (simply_connected s <=>
17415              connected s /\ connected((:real^2) DIFF s))`,
17416   REPEAT STRIP_TAC THEN
17417   ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_UNBOUNDED_COMPLEMENT_COMPONENTS] THEN
17418   ASM_CASES_TAC `connected(s:real^2->bool)` THEN ASM_REWRITE_TAC[] THEN
17419   EQ_TAC THENL
17420    [REWRITE_TAC[CONNECTED_EQ_CONNECTED_COMPONENTS_EQ] THEN
17421     REPEAT STRIP_TAC THEN
17422     MATCH_MP_TAC COBOUNDED_UNIQUE_UNBOUNDED_COMPONENTS THEN
17423     EXISTS_TAC `(:real^2) DIFF s` THEN
17424     ASM_SIMP_TAC[SET_RULE `UNIV DIFF (UNIV DIFF s) = s`] THEN
17425     REWRITE_TAC[LE_REFL; DIMINDEX_2];
17426     DISCH_TAC THEN
17427     ASM_CASES_TAC `(:real^2) DIFF s = {}` THEN
17428     ASM_REWRITE_TAC[COMPONENTS_EMPTY; NOT_IN_EMPTY] THEN
17429     SUBGOAL_THEN `components((:real^2) DIFF s) = {(:real^2) DIFF s}`
17430     SUBST1_TAC THENL [ASM_REWRITE_TAC[COMPONENTS_EQ_SING]; ALL_TAC] THEN
17431     GEN_TAC THEN SIMP_TAC[IN_SING] THEN DISCH_TAC THEN
17432     MATCH_MP_TAC COBOUNDED_IMP_UNBOUNDED THEN
17433     ASM_REWRITE_TAC[SET_RULE `UNIV DIFF (UNIV DIFF s) = s`]]);;
17434
17435 let CONNECTED_COMPLEMENT_IFF_SIMPLY_CONNECTED_COMPONENTS = prove
17436  (`!s:real^2->bool.
17437         open s /\ bounded s
17438         ==> (connected((:real^2) DIFF s) <=>
17439              !c. c IN components s ==> simply_connected c)`,
17440   REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
17441   EXISTS_TAC `!c. c IN components s ==> connected((:real^2) DIFF c)` THEN
17442   CONJ_TAC THENL [ASM_SIMP_TAC[NONSEPARATION_BY_COMPONENT_EQ]; ALL_TAC] THEN
17443   ASM_MESON_TAC[SIMPLY_CONNECTED_IFF_SIMPLE; OPEN_COMPONENTS;
17444             IN_COMPONENTS_SUBSET; BOUNDED_SUBSET; IN_COMPONENTS_CONNECTED]);;
17445
17446 (* ------------------------------------------------------------------------- *)
17447 (* Yet another set of equivalences based on *continuous* logs and sqrts.     *)
17448 (* ------------------------------------------------------------------------- *)
17449
17450 let SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG,SIMPLY_CONNECTED_EQ_CONTINUOUS_SQRT =
17451   (CONJ_PAIR o prove)
17452  (`(!s. open s
17453         ==> (simply_connected s <=>
17454              connected s /\
17455              !f. f continuous_on s /\ (!z:complex. z IN s ==> ~(f z = Cx(&0)))
17456                  ==> ?g. g continuous_on s /\
17457                          !z. z IN s ==> f z = cexp(g z))) /\
17458    (!s. open s
17459         ==> (simply_connected s <=>
17460              connected s /\
17461              !f. f continuous_on s /\ (!z:complex. z IN s ==> ~(f z = Cx(&0)))
17462                  ==> ?g. g continuous_on s /\
17463                          !z. z IN s ==> f z = g z pow 2))`,
17464   REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `s:complex->bool` THEN
17465   ASM_CASES_TAC `open(s:complex->bool)` THEN ASM_REWRITE_TAC[] THEN
17466   ASM_CASES_TAC `connected(s:complex->bool)` THEN ASM_REWRITE_TAC[] THENL
17467    [ALL_TAC; ASM_MESON_TAC[SIMPLY_CONNECTED_IMP_CONNECTED]] THEN
17468   MATCH_MP_TAC(TAUT
17469    `(p ==> q) /\ (q ==> r) /\ (r ==> p) ==> (p <=> q) /\ (p <=> r)`) THEN
17470   REPEAT CONJ_TAC THENL
17471    [ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] THEN
17472     STRIP_TAC THEN ASM_REWRITE_TAC[CONTINUOUS_ON_EMPTY; NOT_IN_EMPTY] THEN
17473     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homeomorphic]) THEN
17474     REWRITE_TAC[homeomorphism; LEFT_IMP_EXISTS_THM] THEN
17475     MAP_EVERY X_GEN_TAC [`k:complex->complex`; `h:complex->complex`] THEN
17476     STRIP_TAC THEN X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
17477     MP_TAC(ISPECL
17478      [`(f:complex->complex) o (h:complex->complex)`; `Cx(&0)`; `&1`]
17479         CONTINUOUS_LOGARITHM_ON_BALL) THEN
17480     ASM_REWRITE_TAC[o_THM] THEN ANTS_TAC THENL
17481      [CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
17482       MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
17483       ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17484       DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
17485       EXISTS_TAC `(g:complex->complex) o (k:complex->complex)` THEN
17486       REWRITE_TAC[o_THM] THEN CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
17487       MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
17488       ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]];
17489     DISCH_TAC THEN X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
17490     FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`) THEN ASM_SIMP_TAC[] THEN
17491     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
17492     EXISTS_TAC `\z:complex. cexp(g z / Cx(&2))` THEN
17493     ASM_SIMP_TAC[GSYM CEXP_N; COMPLEX_RING `Cx(&2) * z / Cx(&2) = z`] THEN
17494     GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
17495     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
17496     REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
17497     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN
17498     ASM_SIMP_TAC[CONTINUOUS_ON_CONST] THEN
17499     CONV_TAC COMPLEX_RING;
17500     DISCH_TAC THEN ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOLOMORPHIC_SQRT] THEN
17501     X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
17502     FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`) THEN
17503     ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
17504     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
17505     STRIP_TAC THEN ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN] THEN
17506     X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
17507     SUBGOAL_THEN `~((g:complex->complex) z = Cx(&0))` ASSUME_TAC THENL
17508      [ASM_MESON_TAC[COMPLEX_RING `Cx(&0) pow 2 = Cx(&0)`]; ALL_TAC] THEN
17509     EXISTS_TAC `complex_derivative f z / (Cx(&2) * g z)` THEN
17510     REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT] THEN
17511     MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
17512     EXISTS_TAC `\x:complex. (f(x) - f(z)) / (x - z) / (g(x) + g(z))` THEN
17513     SUBGOAL_THEN
17514       `?d. &0 < d /\
17515            !w:complex. w IN s /\ w IN ball(z,d) ==> ~(g w + g z = Cx(&0))`
17516     STRIP_ASSUME_TAC THENL
17517      [FIRST_ASSUM(MP_TAC o SPEC `z:complex` o
17518       GEN_REWRITE_RULE I [continuous_on]) THEN ASM_REWRITE_TAC[] THEN
17519       DISCH_THEN(MP_TAC o SPEC `norm((g:complex->complex) z)`) THEN
17520       ASM_REWRITE_TAC[COMPLEX_NORM_NZ] THEN MATCH_MP_TAC MONO_EXISTS THEN
17521       ONCE_REWRITE_TAC[DIST_SYM] THEN
17522       REWRITE_TAC[IN_BALL; GSYM COMPLEX_VEC_0] THEN
17523       MESON_TAC[NORM_ARITH `dist(z,x) < norm z ==> ~(x + z = vec 0)`];
17524       ALL_TAC] THEN
17525     EXISTS_TAC `ball(z:complex,d) INTER s` THEN
17526     ASM_REWRITE_TAC[IN_INTER; CENTRE_IN_BALL] THEN REPEAT CONJ_TAC THENL
17527      [ASM_SIMP_TAC[OPEN_INTER; OPEN_BALL];
17528       ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
17529        `~(x = z) /\ ~(gx + gz = Cx(&0))
17530         ==> (gx pow 2 - gz pow 2) / (x - z) / (gx + gz) =
17531              (gx - gz) / (x - z)`) THEN
17532       ASM_SIMP_TAC[];
17533       MATCH_MP_TAC LIM_COMPLEX_DIV THEN
17534       ASM_REWRITE_TAC[COMPLEX_ENTIRE; GSYM HAS_COMPLEX_DERIVATIVE_AT] THEN
17535       REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE; CX_INJ] THEN
17536       REWRITE_TAC[COMPLEX_MUL_2; REAL_OF_NUM_EQ; ARITH_EQ] THEN CONJ_TAC THENL
17537        [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]; ALL_TAC] THEN
17538       MATCH_MP_TAC LIM_ADD THEN REWRITE_TAC[LIM_CONST; GSYM CONTINUOUS_AT] THEN
17539       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
17540                     CONTINUOUS_ON_INTERIOR; INTERIOR_OPEN]]]);;
17541
17542 (* ------------------------------------------------------------------------- *)
17543 (* Relations to the borsukian property.                                      *)
17544 (* ------------------------------------------------------------------------- *)
17545
17546 let SIMPLY_CONNECTED_EQ_BORSUKIAN = prove
17547  (`!s:real^2->bool.
17548         open s ==> (simply_connected s <=> connected s /\ borsukian s)`,
17549   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG] THEN
17550   AP_TERM_TAC THEN REWRITE_TAC[BORSUKIAN_CONTINUOUS_LOGARITHM] THEN
17551   AP_TERM_TAC THEN ABS_TAC THEN SET_TAC[]);;
17552
17553 let BORSUKIAN_EQ_SIMPLY_CONNECTED = prove
17554  (`!s:real^2->bool.
17555         open s
17556         ==> (borsukian s <=> !c. c IN components s ==> simply_connected c)`,
17557   ASM_SIMP_TAC[BORSUKIAN_COMPONENTWISE_EQ; OPEN_IMP_LOCALLY_CONNECTED] THEN
17558   REPEAT STRIP_TAC THEN FIRST_ASSUM
17559    (ASSUME_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] OPEN_COMPONENTS)) THEN
17560   ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_BORSUKIAN] THEN
17561   ASM_MESON_TAC[IN_COMPONENTS_CONNECTED]);;
17562
17563 let BORSUKIAN_SEPARATION_OPEN_CLOSED = prove
17564  (`!s:real^2->bool.
17565         (open s \/ closed s) /\ bounded s
17566         ==> (borsukian s <=> connected((:real^2) DIFF s))`,
17567   REPEAT STRIP_TAC THEN
17568   ASM_SIMP_TAC[BORSUKIAN_SEPARATION_COMPACT; COMPACT_EQ_BOUNDED_CLOSED] THEN
17569   ASM_SIMP_TAC[BORSUKIAN_EQ_SIMPLY_CONNECTED;
17570                CONNECTED_COMPLEMENT_IFF_SIMPLY_CONNECTED_COMPONENTS]);;
17571
17572 (* ------------------------------------------------------------------------- *)
17573 (* A per-function version for continuous logs, a kind of monodromy.          *)
17574 (* ------------------------------------------------------------------------- *)
17575
17576 let WINDING_NUMBER_COMPOSE_CEXP = prove
17577  (`!p. path p
17578        ==> winding_number(cexp o p,Cx(&0)) =
17579            Cx(&1) / (Cx(&2) * Cx pi * ii) * (pathfinish p - pathstart p)`,
17580   REPEAT STRIP_TAC THEN
17581   SUBGOAL_THEN
17582    `?e. &0 < e /\
17583        !t:real^1. t IN interval[vec 0,vec 1] ==> e <= norm(cexp(p t))`
17584   STRIP_ASSUME_TAC THENL
17585    [EXISTS_TAC `setdist({Cx(&0)},path_image (cexp o p))` THEN
17586     REWRITE_TAC[SETDIST_POS_LE; REAL_ARITH
17587      `&0 < x <=> &0 <= x /\ ~(x = &0)`] THEN
17588     ASM_SIMP_TAC[PATH_CONTINUOUS_IMAGE; CONTINUOUS_ON_CEXP; CLOSED_SING;
17589      SETDIST_EQ_0_CLOSED_COMPACT; COMPACT_PATH_IMAGE; PATH_IMAGE_NONEMPTY] THEN
17590     REWRITE_TAC[NOT_INSERT_EMPTY; path_image; IMAGE_o] THEN CONJ_TAC THENL
17591      [MP_TAC CEXP_NZ THEN SET_TAC[]; REPEAT STRIP_TAC] THEN
17592     ONCE_REWRITE_TAC[GSYM NORM_NEG] THEN
17593     REWRITE_TAC[COMPLEX_RING `--x = Cx(&0) - x`] THEN
17594     REWRITE_TAC[GSYM dist] THEN MATCH_MP_TAC SETDIST_LE_DIST THEN
17595     ASM SET_TAC[];
17596     ALL_TAC] THEN
17597   MP_TAC(ISPECL [`path_image(p:real^1->complex)`; `Cx(&0)`]
17598         BOUNDED_SUBSET_CBALL) THEN
17599   ASM_SIMP_TAC[BOUNDED_PATH_IMAGE; LEFT_IMP_EXISTS_THM] THEN
17600   X_GEN_TAC `B:real` THEN REWRITE_TAC[SUBSET; COMPLEX_IN_CBALL_0] THEN
17601   STRIP_TAC THEN
17602   MP_TAC(ISPECL [`cexp`; `cball(Cx(&0),B + &1)`]
17603         COMPACT_UNIFORMLY_CONTINUOUS) THEN
17604   REWRITE_TAC[CONTINUOUS_ON_CEXP; COMPACT_CBALL] THEN
17605   REWRITE_TAC[uniformly_continuous_on] THEN
17606   DISCH_THEN(MP_TAC o SPEC `e:real`) THEN
17607   ASM_REWRITE_TAC[COMPLEX_IN_CBALL_0] THEN
17608   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
17609   MP_TAC(ISPECL [`p:real^1->complex`; `min (&1) d`]
17610       PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
17611   ASM_REWRITE_TAC[REAL_LT_MIN; REAL_LT_01; LEFT_IMP_EXISTS_THM] THEN
17612   X_GEN_TAC `g:real^1->complex` THEN STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
17613   EXISTS_TAC `winding_number(cexp o g,Cx(&0))` THEN CONJ_TAC THENL
17614    [CONV_TAC SYM_CONV THEN MATCH_MP_TAC WINDING_NUMBER_NEARBY_PATHS_EQ THEN
17615     ASM_SIMP_TAC[PATH_CONTINUOUS_IMAGE; CONTINUOUS_ON_CEXP;
17616                  PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
17617     ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
17618     REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_SUB_RZERO; o_THM] THEN
17619     REWRITE_TAC[GSYM dist] THEN MATCH_MP_TAC REAL_LTE_TRANS THEN
17620     EXISTS_TAC `e:real` THEN ASM_SIMP_TAC[] THEN
17621     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC[dist] THEN
17622     MATCH_MP_TAC(NORM_ARITH
17623      `norm(g - p) < &1 /\ norm(p) <= B
17624       ==> norm(p) <= B + &1 /\ norm(g) <= B + &1`) THEN
17625     ASM_SIMP_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
17626     REWRITE_TAC[path_image] THEN ASM SET_TAC[];
17627     W(MP_TAC o
17628       PART_MATCH (lhs o rand) WINDING_NUMBER_VALID_PATH o lhs o snd) THEN
17629     REWRITE_TAC[PATH_INTEGRAL_INTEGRAL; COMPLEX_SUB_RZERO] THEN ANTS_TAC THENL
17630      [REWRITE_TAC[path_image; IN_IMAGE; o_THM; CEXP_NZ] THEN
17631       REWRITE_TAC[valid_path] THEN
17632       MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
17633       MATCH_MP_TAC DIFFERENTIABLE_ON_COMPOSE THEN
17634       REWRITE_TAC[differentiable_on] THEN REPEAT STRIP_TAC THENL
17635        [MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
17636         REWRITE_TAC[differentiable] THEN
17637         ASM_MESON_TAC[has_vector_derivative;
17638                         HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION];
17639         GEN_REWRITE_TAC LAND_CONV [GSYM ETA_AX] THEN
17640         MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_IMP_DIFFERENTIABLE THEN
17641         COMPLEX_DIFFERENTIABLE_TAC];
17642       DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
17643       EXISTS_TAC `integral (interval [vec 0,vec 1])
17644                     (\x. vector_derivative (g:real^1->complex) (at x))` THEN
17645       CONJ_TAC THENL
17646        [MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
17647         REWRITE_TAC[o_THM] THEN MATCH_MP_TAC(COMPLEX_FIELD
17648          `~(e = Cx(&0)) /\ v' = e * v ==> Cx(&1) / e * v' = v`) THEN
17649         REWRITE_TAC[CEXP_NZ] THEN
17650         MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_UNIQUE_AT THEN
17651         MP_TAC(ISPECL [`g:real^1->complex`; `cexp`;
17652          `\h. drop h % vector_derivative (g:real^1->complex) (at t)`;
17653          `\w. cexp(g(t:real^1)) * w`; `t:real^1`]
17654         DIFF_CHAIN_AT) THEN
17655         REWRITE_TAC[GSYM has_vector_derivative; GSYM has_complex_derivative;
17656                     GSYM VECTOR_DERIVATIVE_WORKS;
17657                     HAS_COMPLEX_DERIVATIVE_CEXP; differentiable] THEN
17658         ANTS_TAC THENL
17659          [ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION;
17660                         has_vector_derivative];
17661           REWRITE_TAC[has_vector_derivative; o_DEF] THEN
17662           MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
17663           REWRITE_TAC[FUN_EQ_THM; COMPLEX_CMUL] THEN
17664           CONV_TAC COMPLEX_RING];
17665         MP_TAC(ISPECL [`g:real^1->complex`;
17666                         `\x. vector_derivative (g:real^1->complex) (at x)`;
17667                        `vec 0:real^1`; `vec 1:real^1`]
17668           FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN
17669         ASM_REWRITE_TAC[DROP_VEC; REAL_POS] THEN ANTS_TAC THENL
17670          [REPEAT STRIP_TAC THEN
17671           MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_AT_WITHIN THEN
17672           REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
17673           REWRITE_TAC[differentiable] THEN
17674           ASM_MESON_TAC[has_vector_derivative;
17675                         HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION];
17676           DISCH_THEN(SUBST1_TAC o MATCH_MP INTEGRAL_UNIQUE) THEN
17677           RULE_ASSUM_TAC(REWRITE_RULE[pathstart; pathfinish]) THEN
17678           ASM_REWRITE_TAC[pathstart; pathfinish]]]]]);;
17679
17680 let MONODROMY_CONTINUOUS_LOG = prove
17681  (`!f:complex->complex s.
17682         open s /\ f continuous_on s /\
17683         (!z. z IN s ==> ~(f z = Cx(&0)))
17684         ==> ((!p. path p /\ path_image p SUBSET s /\
17685                   pathfinish p = pathstart p
17686                   ==> winding_number(f o p,Cx(&0)) = Cx(&0)) <=>
17687              (?g. g continuous_on s /\ !z. z IN s ==> f(z) = cexp(g z)))`,
17688   let lemma = prove
17689    (`!f g s p.
17690            f continuous_on s /\ g continuous_on s /\
17691            (!z:complex. z IN s ==> f(z) = cexp(g z)) /\
17692            path p /\ path_image p SUBSET s
17693            ==> winding_number(f o p,Cx(&0)) =
17694                Cx(&1) / (Cx(&2) * Cx pi * ii) *
17695                (pathfinish(g o p) - pathstart(g o p))`,
17696     REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
17697     EXISTS_TAC `winding_number(cexp o g o (p:real^1->complex),Cx(&0))` THEN
17698     CONJ_TAC THENL
17699      [MATCH_MP_TAC WINDING_NUMBER_NEARBY_PATHS_EQ THEN
17700       REPEAT CONJ_TAC THENL
17701        [MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
17702         REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
17703         MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
17704         ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17705         MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
17706         ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17707         REWRITE_TAC[PATHSTART_COMPOSE] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
17708         ASM_MESON_TAC[SUBSET; PATHSTART_IN_PATH_IMAGE];
17709         REWRITE_TAC[PATHFINISH_COMPOSE] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
17710         ASM_MESON_TAC[SUBSET; PATHFINISH_IN_PATH_IMAGE];
17711         GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[o_THM; COMPLEX_SUB_RZERO] THEN
17712         MATCH_MP_TAC(NORM_ARITH
17713          `x = y /\ ~(z = vec 0) ==> norm(x - y) < norm z`) THEN
17714         REWRITE_TAC[COMPLEX_VEC_0; CEXP_NZ] THEN
17715         FIRST_X_ASSUM MATCH_MP_TAC THEN
17716         ASM_MESON_TAC[SUBSET; path_image; IN_IMAGE]];
17717       MATCH_MP_TAC WINDING_NUMBER_COMPOSE_CEXP THEN
17718       ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
17719       MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
17720       ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]]) in
17721   REPEAT STRIP_TAC THEN EQ_TAC THENL
17722    [ALL_TAC;
17723     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
17724     X_GEN_TAC `p:real^1->complex` THEN STRIP_TAC THEN
17725     MP_TAC(ISPECL [`f:complex->complex`; `g:complex->complex`;
17726                    `s:complex->bool`; `p:real^1->complex`]
17727         lemma) THEN
17728     ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
17729     REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_RZERO]] THEN
17730   DISCH_TAC THEN
17731   EXISTS_TAC `\z. let c = connected_component s (z:complex) in
17732                   let z0 = (@) c in
17733                   let p = @p. path p /\ path_image p SUBSET c /\
17734                               pathstart p = z0 /\ pathfinish p = z in
17735                   Cx(&2) * Cx(pi) * ii * winding_number(f o p,Cx(&0)) +
17736                   clog(f z0)` THEN
17737
17738   CONJ_TAC THENL
17739    [ALL_TAC;
17740     X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
17741     REPEAT LET_TAC THEN
17742     SUBGOAL_THEN `(z:complex) IN c` ASSUME_TAC THENL
17743      [ASM_MESON_TAC[CONNECTED_COMPONENT_REFL; IN]; ALL_TAC] THEN
17744     SUBGOAL_THEN `(z0:complex) IN c` ASSUME_TAC THENL
17745      [EXPAND_TAC "z0" THEN REWRITE_TAC[IN] THEN MATCH_MP_TAC SELECT_AX THEN
17746       ASM_MESON_TAC[IN];
17747       ALL_TAC] THEN
17748     SUBGOAL_THEN `(c:complex->bool) SUBSET s` ASSUME_TAC THENL
17749      [ASM_MESON_TAC[CONNECTED_COMPONENT_SUBSET]; ALL_TAC] THEN
17750     SUBGOAL_THEN `connected(c:complex->bool)` ASSUME_TAC THENL
17751      [ASM_MESON_TAC[CONNECTED_CONNECTED_COMPONENT]; ALL_TAC] THEN
17752     SUBGOAL_THEN `open(c:complex->bool)` ASSUME_TAC THENL
17753      [ASM_MESON_TAC[OPEN_CONNECTED_COMPONENT]; ALL_TAC] THEN
17754     SUBGOAL_THEN `path_connected(c:complex->bool)` ASSUME_TAC THENL
17755      [ASM_MESON_TAC[CONNECTED_OPEN_PATH_CONNECTED]; ALL_TAC] THEN
17756     SUBGOAL_THEN
17757      `path p /\ path_image p SUBSET c /\
17758       pathstart p = z0 /\ pathfinish p = (z:complex)`
17759     STRIP_ASSUME_TAC THENL
17760      [EXPAND_TAC "p" THEN CONV_TAC SELECT_CONV THEN
17761       FIRST_X_ASSUM(MATCH_MP_TAC o REWRITE_RULE[path_connected]) THEN
17762       ASM_REWRITE_TAC[];
17763       ALL_TAC] THEN
17764     MP_TAC(ISPECL [`(f:complex->complex) o (p:real^1->complex)`; `Cx(&0)`]
17765       WINDING_NUMBER_AHLFORS_FULL) THEN
17766     REWRITE_TAC[CEXP_ADD] THEN ANTS_TAC THENL
17767      [CONJ_TAC THENL
17768        [MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
17769         ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17770         REWRITE_TAC[path_image; IMAGE_o] THEN
17771         REWRITE_TAC[GSYM path_image] THEN ASM SET_TAC[]];
17772       ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
17773       REWRITE_TAC[COMPLEX_SUB_RZERO] THEN DISCH_THEN SUBST1_TAC THEN
17774       AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN MATCH_MP_TAC CEXP_CLOG THEN
17775       ASM SET_TAC[]]] THEN
17776   MATCH_MP_TAC CONTINUOUS_ON_COMPONENTS_OPEN THEN
17777   ASM_REWRITE_TAC[] THEN X_GEN_TAC `c:complex->bool` THEN DISCH_TAC THEN
17778   ABBREV_TAC `z0:complex = (@) c` THEN
17779   MATCH_MP_TAC CONTINUOUS_ON_EQ THEN
17780   ABBREV_TAC
17781    `g = \z. let p = @p. path p /\ path_image p SUBSET c /\
17782                         pathstart p = z0 /\ pathfinish p = z in
17783             Cx(&2) * Cx(pi) * ii * winding_number(f o p,Cx(&0)) +
17784             clog(f(z0:complex))` THEN
17785   EXISTS_TAC `g:complex->complex` THEN REWRITE_TAC[] THEN CONJ_TAC THENL
17786    [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN EXPAND_TAC "g" THEN
17787     CONV_TAC(TOP_DEPTH_CONV let_CONV) THEN EXPAND_TAC "z0" THEN
17788     SUBGOAL_THEN `connected_component s (z:complex) = c`
17789      (fun th -> REWRITE_TAC[th]) THEN
17790     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_COMPONENTS]) THEN
17791     ASM_MESON_TAC[CONNECTED_COMPONENT_EQ];
17792     ALL_TAC] THEN
17793   SUBGOAL_THEN `(z0:complex) IN c` ASSUME_TAC THENL
17794    [EXPAND_TAC "z0" THEN REWRITE_TAC[IN] THEN MATCH_MP_TAC SELECT_AX THEN
17795     FIRST_ASSUM(MP_TAC o MATCH_MP IN_COMPONENTS_NONEMPTY) THEN SET_TAC[];
17796     ALL_TAC] THEN
17797   SUBGOAL_THEN `(c:complex->bool) SUBSET s` ASSUME_TAC THENL
17798    [ASM_MESON_TAC[IN_COMPONENTS_SUBSET]; ALL_TAC] THEN
17799   SUBGOAL_THEN `connected(c:complex->bool)` ASSUME_TAC THENL
17800    [ASM_MESON_TAC[IN_COMPONENTS_CONNECTED]; ALL_TAC] THEN
17801   SUBGOAL_THEN `open(c:complex->bool)` ASSUME_TAC THENL
17802    [ASM_MESON_TAC[OPEN_COMPONENTS]; ALL_TAC] THEN
17803   SUBGOAL_THEN `path_connected(c:complex->bool)` ASSUME_TAC THENL
17804    [ASM_MESON_TAC[CONNECTED_OPEN_PATH_CONNECTED]; ALL_TAC] THEN
17805   SUBGOAL_THEN
17806    `!x. x IN c
17807         ==> ?p. path (p:real^1->complex) /\ path_image p SUBSET c /\
17808                 pathstart p = z0 /\ pathfinish p = x /\
17809                 g(x) = Cx(&2) * Cx pi * ii * winding_number(f o p,Cx(&0)) +
17810                        clog (f z0)`
17811    (LABEL_TAC "*")
17812   THENL
17813    [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN EXPAND_TAC "g" THEN
17814     ABBREV_TAC `p = @p. path p /\ path_image p SUBSET c /\
17815                         pathstart p = z0 /\ pathfinish p = (z:complex)` THEN
17816     EXISTS_TAC `p:real^1->complex` THEN
17817     CONV_TAC(TOP_DEPTH_CONV let_CONV) THEN REWRITE_TAC[] THEN
17818     EXPAND_TAC "p" THEN CONV_TAC SELECT_CONV THEN
17819     FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [path_connected]) THEN
17820     ASM_REWRITE_TAC[];
17821     ALL_TAC] THEN
17822   ASM_SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT] THEN
17823   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
17824   FIRST_ASSUM(MP_TAC o SPEC `z:complex` o GEN_REWRITE_RULE I
17825    [OPEN_CONTAINS_BALL]) THEN
17826   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `e:real` THEN
17827   STRIP_TAC THEN
17828   MP_TAC(SPEC `ball(z:complex,e)` SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG) THEN
17829   SIMP_TAC[OPEN_BALL; CONVEX_BALL; CONVEX_IMP_SIMPLY_CONNECTED] THEN
17830   DISCH_THEN(MP_TAC o SPEC `f:complex->complex` o CONJUNCT2) THEN
17831   ANTS_TAC THENL
17832    [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; SUBSET];
17833     DISCH_THEN(X_CHOOSE_THEN `l:complex->complex` STRIP_ASSUME_TAC)] THEN
17834   REWRITE_TAC[CONTINUOUS_AT] THEN ONCE_REWRITE_TAC[LIM_NULL] THEN
17835   MATCH_MP_TAC LIM_TRANSFORM_AT THEN
17836   ONCE_REWRITE_TAC[DIST_SYM] THEN EXISTS_TAC
17837    `\w. Cx(&2) * Cx pi * ii *
17838         winding_number((f:complex->complex) o linepath(z,w),Cx(&0))` THEN
17839   EXISTS_TAC `e:real` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
17840    [X_GEN_TAC `w:complex` THEN STRIP_TAC THEN REMOVE_THEN "*"
17841      (fun th -> MP_TAC(SPEC `w:complex` th) THEN
17842                 MP_TAC(SPEC `z:complex` th)) THEN
17843     ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
17844     X_GEN_TAC `p:real^1->complex` THEN STRIP_TAC THEN
17845     ANTS_TAC THENL [ASM_MESON_TAC[SUBSET; IN_BALL; DIST_SYM]; ALL_TAC] THEN
17846     DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
17847     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(COMPLEX_RING
17848      `(z + x) - y = Cx(&0)
17849       ==> a * b * c * x = (a * b * c * y + l) - (a * b * c * z + l)`) THEN
17850     FIRST_X_ASSUM(MP_TAC o SPEC
17851      `p ++ linepath(z:complex,w) ++ reversepath q`) THEN
17852     ASM_SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
17853                  PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
17854                  PATH_JOIN_EQ; PATH_LINEPATH; PATH_REVERSEPATH;
17855                  PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_JOIN] THEN
17856     ASM_REWRITE_TAC[UNION_SUBSET; PATH_IMAGE_REVERSEPATH] THEN ANTS_TAC THENL
17857      [REPEAT STRIP_TAC THEN
17858       MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `c:complex->bool` THEN
17859       ASM_REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
17860       MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,e)` THEN
17861       ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
17862       ASM_REWRITE_TAC[INSERT_SUBSET; CENTRE_IN_BALL; EMPTY_SUBSET] THEN
17863       ASM_REWRITE_TAC[IN_BALL; CONVEX_BALL];
17864       DISCH_THEN(fun th -> GEN_REWRITE_TAC RAND_CONV [GSYM th]) THEN
17865       REWRITE_TAC[PATH_COMPOSE_JOIN; PATH_COMPOSE_REVERSEPATH] THEN
17866       W(MP_TAC o PART_MATCH (lhand o rand) WINDING_NUMBER_JOIN o
17867         rand o snd) THEN
17868       ANTS_TAC THENL
17869        [ALL_TAC;
17870         DISCH_THEN SUBST1_TAC THEN
17871         REWRITE_TAC[VECTOR_SUB; GSYM VECTOR_ADD_ASSOC] THEN
17872         AP_TERM_TAC THEN
17873         W(MP_TAC o PART_MATCH (lhand o rand) WINDING_NUMBER_JOIN o
17874           rand o snd) THEN
17875         ANTS_TAC THENL
17876          [ALL_TAC;
17877           DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN
17878           MATCH_MP_TAC(GSYM WINDING_NUMBER_REVERSEPATH)]] THEN
17879       ASM_SIMP_TAC[PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
17880                  PATHSTART_COMPOSE; PATHFINISH_COMPOSE; PATH_IMAGE_REVERSEPATH;
17881                  PATHSTART_JOIN; PATHFINISH_JOIN; PATH_REVERSEPATH;
17882                  PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_JOIN;
17883                  PATH_IMAGE_JOIN; IN_UNION; DE_MORGAN_THM] THEN
17884       REWRITE_TAC[PATH_IMAGE_COMPOSE; SET_RULE
17885        `~(z IN IMAGE f s) <=> !x. x IN s ==> ~(f x = z)`] THEN
17886       REPEAT CONJ_TAC THEN
17887       ((MATCH_MP_TAC PATH_CONTINUOUS_IMAGE)
17888        ORELSE
17889        (X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
17890         FIRST_X_ASSUM MATCH_MP_TAC)) THEN
17891       ASM_REWRITE_TAC[PATH_LINEPATH] THEN
17892       TRY(FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
17893             CONTINUOUS_ON_SUBSET)) THEN
17894           REWRITE_TAC[SUBSET] THEN X_GEN_TAC `x:complex` THEN STRIP_TAC) THEN
17895       FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
17896       TRY(FIRST_X_ASSUM(fun th ->
17897             MATCH_MP_TAC(GEN_REWRITE_RULE I [SUBSET] th) THEN
17898             FIRST_X_ASSUM ACCEPT_TAC)) THEN
17899       UNDISCH_TAC `(x:complex) IN path_image(linepath(z,w))` THEN
17900       SPEC_TAC(`x:complex`,`x:complex`) THEN
17901       REWRITE_TAC[GSYM SUBSET; PATH_IMAGE_LINEPATH; SEGMENT_CONVEX_HULL] THEN
17902       MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,e)` THEN
17903       ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
17904       ASM_REWRITE_TAC[INSERT_SUBSET; CENTRE_IN_BALL; EMPTY_SUBSET] THEN
17905       ASM_REWRITE_TAC[IN_BALL; CONVEX_BALL]];
17906     MATCH_MP_TAC LIM_TRANSFORM THEN
17907     EXISTS_TAC `\w. Cx(&2) * Cx pi * ii *
17908                     Cx(&1) / (Cx(&2) * Cx pi * ii) *
17909                     (pathfinish(l o linepath(z:complex,w)) -
17910                      pathstart (l o linepath(z,w)))` THEN
17911     REWRITE_TAC[] THEN CONJ_TAC THENL
17912      [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
17913       EXISTS_TAC `e:real` THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
17914       ASM_REWRITE_TAC[] THEN X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
17915       REWRITE_TAC[VECTOR_ARITH `x - y = vec 0 <=> y = x`] THEN
17916       REPLICATE_TAC 3 AP_TERM_TAC THEN MATCH_MP_TAC lemma THEN
17917       EXISTS_TAC `ball(z:complex,e)` THEN ASM_REWRITE_TAC[PATH_LINEPATH] THEN
17918       CONJ_TAC THENL[ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; SUBSET]; ALL_TAC] THEN
17919       REWRITE_TAC[PATH_IMAGE_LINEPATH; SEGMENT_CONVEX_HULL] THEN
17920       MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
17921       ASM_REWRITE_TAC[INSERT_SUBSET; CENTRE_IN_BALL; EMPTY_SUBSET] THEN
17922       ASM_REWRITE_TAC[IN_BALL];
17923       REWRITE_TAC[COMPLEX_VEC_0] THEN
17924       REPEAT(MATCH_MP_TAC LIM_NULL_COMPLEX_LMUL) THEN
17925       REWRITE_TAC[PATHSTART_COMPOSE; PATHSTART_LINEPATH;
17926                   PATHFINISH_COMPOSE; PATHFINISH_LINEPATH] THEN
17927       REWRITE_TAC[GSYM COMPLEX_VEC_0; GSYM LIM_NULL; GSYM CONTINUOUS_AT] THEN
17928       ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; OPEN_BALL;
17929                     CENTRE_IN_BALL]]]);;
17930
17931 (* ------------------------------------------------------------------------- *)
17932 (* The winding number defines a continuous logarithm for the path itself.    *)
17933 (* ------------------------------------------------------------------------- *)
17934
17935 let WINDING_NUMBER_AS_CONTINUOUS_LOGARITHM = prove
17936  (`!p z.
17937       path p /\ ~(z IN path_image p)
17938       ==> ?q. path q /\
17939               pathfinish q - pathstart q =
17940               Cx(&2) * Cx pi * ii * winding_number(p,z) /\
17941               !t. t IN interval[vec 0,vec 1] ==> p(t) = z + cexp(q t)`,
17942   REPEAT STRIP_TAC THEN EXISTS_TAC
17943   `\t:real^1. Cx(&2) * Cx pi * ii * winding_number(subpath (vec 0) t p,z) +
17944               clog(pathstart p - z)` THEN
17945   REPEAT CONJ_TAC THENL
17946    [REWRITE_TAC[path] THEN MATCH_MP_TAC CONTINUOUS_ON_ADD THEN
17947     REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
17948     REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
17949            REWRITE_TAC[CONTINUOUS_ON_CONST]) THEN
17950     REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN
17951     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
17952     SUBGOAL_THEN `~((p:real^1->complex) t = z)` ASSUME_TAC THENL
17953      [ASM_MESON_TAC[path_image; IN_IMAGE]; ALL_TAC] THEN
17954     MP_TAC(SPEC `ball((p:real^1->complex) t,norm(p t - z))`
17955       SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG) THEN
17956     SIMP_TAC[OPEN_BALL; CONVEX_BALL; CONVEX_IMP_SIMPLY_CONNECTED] THEN
17957     DISCH_THEN(MP_TAC o SPEC `\w:complex. w - z` o CONJUNCT2) THEN
17958     SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_ID; CONTINUOUS_ON_CONST] THEN
17959     REWRITE_TAC[COMPLEX_SUB_0] THEN ANTS_TAC THENL
17960      [GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
17961       SIMP_TAC[IN_BALL; dist; REAL_LT_REFL];
17962       DISCH_THEN(X_CHOOSE_THEN `l:complex->complex` STRIP_ASSUME_TAC)] THEN
17963     ONCE_REWRITE_TAC[WINDING_NUMBER_OFFSET] THEN
17964     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [path]) THEN
17965     GEN_REWRITE_TAC LAND_CONV [continuous_on] THEN
17966     DISCH_THEN(MP_TAC o SPEC `t:real^1`) THEN ASM_REWRITE_TAC[] THEN
17967     DISCH_THEN(MP_TAC o SPEC `norm((p:real^1->complex) t - z)`) THEN
17968     ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_SUB_EQ] THEN
17969     ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL] THEN
17970     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
17971     REWRITE_TAC[CONTINUOUS_WITHIN] THEN ONCE_REWRITE_TAC[LIM_NULL] THEN
17972     MATCH_MP_TAC LIM_TRANSFORM_WITHIN THEN EXISTS_TAC
17973      `\u. Cx(&1) / (Cx(&2) * Cx pi * ii) *
17974           (pathfinish((l:complex->complex) o subpath t u p) -
17975            pathstart(l o subpath t u p))` THEN
17976     EXISTS_TAC `d:real` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
17977      [X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN
17978       SUBGOAL_THEN
17979        `path_image(subpath t u p) SUBSET ball(p t:complex,norm (p t - z))`
17980       ASSUME_TAC THENL
17981        [REWRITE_TAC[PATH_IMAGE_SUBPATH_GEN] THEN
17982         REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
17983         SUBGOAL_THEN
17984          `segment[t,u] SUBSET interval[vec 0,vec 1] /\
17985           segment[t,u] SUBSET ball(t:real^1,d)`
17986         MP_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
17987         CONJ_TAC THEN REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
17988         MATCH_MP_TAC HULL_MINIMAL THEN
17989         REWRITE_TAC[CONVEX_BALL; CONVEX_INTERVAL] THEN
17990         ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; CENTRE_IN_BALL] THEN
17991         ASM_REWRITE_TAC[ONCE_REWRITE_RULE[DIST_SYM] IN_BALL];
17992         ALL_TAC] THEN
17993       W(MP_TAC o PART_MATCH (rand o rand) WINDING_NUMBER_COMPOSE_CEXP o
17994         lhand o snd) THEN
17995       ANTS_TAC THENL
17996        [MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN ASM_SIMP_TAC[PATH_SUBPATH] THEN
17997         ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17998         DISCH_THEN(SUBST1_TAC o SYM)] THEN
17999       MATCH_MP_TAC EQ_TRANS THEN
18000       EXISTS_TAC `winding_number((\w. subpath t u p w - z),Cx(&0))` THEN
18001       CONJ_TAC THENL
18002        [MATCH_MP_TAC WINDING_NUMBER_EQUAL THEN
18003         REWRITE_TAC[o_THM; GSYM path_image; SET_RULE
18004          `(!x. x IN s ==> cexp(l(subpath t u p x)) = subpath t u p x - z) <=>
18005           (!y. y IN IMAGE (subpath t u p) s ==> cexp(l y) = y - z)`] THEN
18006         ASM SET_TAC[];
18007         ONCE_REWRITE_TAC[GSYM WINDING_NUMBER_OFFSET] THEN
18008         REWRITE_TAC[ETA_AX] THEN
18009         MP_TAC(ISPECL [`p:real^1->complex`; `vec 0:real^1`; `t:real^1`;
18010                        `u:real^1`; `z:complex`]
18011           WINDING_NUMBER_SUBPATH_COMBINE) THEN
18012         ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL] THEN
18013         CONV_TAC COMPLEX_RING];
18014       REWRITE_TAC[COMPLEX_VEC_0] THEN MATCH_MP_TAC LIM_NULL_COMPLEX_LMUL THEN
18015       REWRITE_TAC[PATHSTART_COMPOSE; PATHSTART_SUBPATH;
18016                   PATHFINISH_COMPOSE; PATHFINISH_SUBPATH] THEN
18017       REWRITE_TAC[GSYM COMPLEX_VEC_0; GSYM LIM_NULL] THEN
18018       REWRITE_TAC[GSYM CONTINUOUS_WITHIN] THEN
18019       GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
18020       MATCH_MP_TAC CONTINUOUS_WITHIN_COMPOSE THEN CONJ_TAC THENL
18021        [ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN; path];
18022         MATCH_MP_TAC CONTINUOUS_AT_WITHIN THEN
18023         UNDISCH_TAC `(l:complex->complex) continuous_on
18024                      ball(p(t:real^1),norm(p t - z))` THEN
18025         SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; OPEN_BALL] THEN
18026         DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[CENTRE_IN_BALL] THEN
18027         ASM_REWRITE_TAC[VECTOR_SUB_EQ; NORM_POS_LT]]];
18028     REWRITE_TAC[pathstart; pathfinish; SUBPATH_REFL; SUBPATH_TRIVIAL] THEN
18029     MATCH_MP_TAC(COMPLEX_FIELD
18030      `w' = Cx(&0)
18031       ==> (a * b * c * w + l) - (a * b * c * w' + l) = a * b * c * w`) THEN
18032     MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
18033     MP_TAC(ISPEC `p:real^1->complex` PATHSTART_IN_PATH_IMAGE) THEN
18034     REWRITE_TAC[pathstart] THEN ASM_MESON_TAC[];
18035     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
18036     MP_TAC(ISPECL [`subpath (vec 0) t (p:real^1->complex)`; `z:complex`]
18037         WINDING_NUMBER_AHLFORS_FULL) THEN
18038     REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
18039     ASM_SIMP_TAC[ENDS_IN_UNIT_INTERVAL; PATH_SUBPATH; CEXP_ADD;
18040       REWRITE_RULE[SET_RULE `s SUBSET t <=> !x. ~(x IN t) ==> ~(x IN s)`]
18041                   PATH_IMAGE_SUBPATH_SUBSET] THEN
18042     MATCH_MP_TAC(COMPLEX_RING
18043      `t:complex = s ==> p - z = e * s ==> p = z + e * t`) THEN
18044     REWRITE_TAC[pathstart] THEN MATCH_MP_TAC CEXP_CLOG THEN
18045     REWRITE_TAC[COMPLEX_SUB_0] THEN
18046     ASM_MESON_TAC[pathstart; PATHSTART_IN_PATH_IMAGE]]);;
18047
18048 (* ------------------------------------------------------------------------- *)
18049 (* Winding number equality is the same as path/loop homotopy in C - {0}.     *)
18050 (* ------------------------------------------------------------------------- *)
18051
18052 let WINDING_NUMBER_HOMOTOPIC_LOOPS_NULL_EQ = prove
18053  (`!p z. path p /\ ~(z IN path_image p)
18054          ==> (winding_number(p,z) = Cx(&0) <=>
18055               ?a. homotopic_loops ((:complex) DELETE z) p (\t. a))`,
18056   REPEAT STRIP_TAC THEN EQ_TAC THEN STRIP_TAC THENL
18057    [REPEAT STRIP_TAC THEN
18058     MP_TAC(SPECL [`p:real^1->complex`; `z:complex`]
18059           WINDING_NUMBER_AS_CONTINUOUS_LOGARITHM) THEN
18060     ASM_REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_LID; COMPLEX_SUB_0] THEN
18061     DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
18062     EXISTS_TAC `z + Cx(&1)` THEN
18063     MP_TAC(ISPECL [`\r:real^1->complex. pathfinish r = pathstart r`;
18064                    `q:real^1->complex`; `\t:real^1. Cx(&0)`;
18065                    `\w. z + cexp w`;
18066                    `interval[vec 0:real^1,vec 1]`; `(:complex)`;
18067                    `(:complex) DELETE z`]
18068      HOMOTOPIC_WITH_COMPOSE_CONTINUOUS_LEFT) THEN
18069     ASM_SIMP_TAC[CONTINUOUS_ON_CEXP; CONTINUOUS_ON_ADD; CONTINUOUS_ON_CONST;
18070                  CEXP_0; homotopic_loops; o_DEF] THEN
18071     ANTS_TAC THENL
18072      [REWRITE_TAC[CEXP_NZ; COMPLEX_EQ_ADD_LCANCEL_0; SET_RULE
18073        `IMAGE f UNIV SUBSET UNIV DELETE z <=> !x. ~(f x = z)`] THEN
18074       MATCH_MP_TAC HOMOTOPIC_WITH_MONO THEN
18075       EXISTS_TAC `\r:real^1->complex. pathfinish r = pathstart r` THEN
18076       CONJ_TAC THENL
18077        [REWRITE_TAC[GSYM homotopic_loops] THEN
18078         MATCH_MP_TAC HOMOTOPIC_LOOPS_LINEAR THEN
18079         ASM_REWRITE_TAC[SUBSET_UNIV] THEN
18080         REWRITE_TAC[path; pathstart; pathfinish; CONTINUOUS_ON_CONST];
18081         SIMP_TAC[pathstart; pathfinish]];
18082       MATCH_MP_TAC(ONCE_REWRITE_RULE[IMP_CONJ_ALT] HOMOTOPIC_WITH_EQ) THEN
18083      ASM_SIMP_TAC[o_THM; pathstart; pathfinish; ENDS_IN_UNIT_INTERVAL]];
18084    FIRST_ASSUM(MP_TAC o MATCH_MP WINDING_NUMBER_HOMOTOPIC_LOOPS) THEN
18085    ASM_REWRITE_TAC[GSYM LINEPATH_REFL] THEN
18086    DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
18087    FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_SUBSET) THEN
18088    REWRITE_TAC[GSYM LINEPATH_REFL; PATH_IMAGE_LINEPATH; SEGMENT_REFL] THEN
18089    SET_TAC[]]);;
18090
18091 let WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EXPLICIT_EQ = prove
18092  (`!p z. path p /\ ~(z IN path_image p)
18093          ==> (winding_number(p,z) = Cx(&0) <=>
18094               homotopic_paths ((:complex) DELETE z)
18095                               p (linepath(pathstart p,pathstart p)))`,
18096   REPEAT STRIP_TAC THEN EQ_TAC THENL
18097    [ASM_SIMP_TAC[WINDING_NUMBER_HOMOTOPIC_LOOPS_NULL_EQ] THEN
18098     REWRITE_TAC[GSYM LINEPATH_REFL; HOMOTOPIC_LOOPS_IMP_HOMOTOPIC_PATHS_NULL;
18099                 LEFT_IMP_EXISTS_THM];
18100     STRIP_TAC THEN
18101     FIRST_ASSUM(MP_TAC o MATCH_MP WINDING_NUMBER_HOMOTOPIC_PATHS) THEN
18102     ASM_REWRITE_TAC[GSYM LINEPATH_REFL] THEN
18103     DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
18104     ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE]]);;
18105
18106 let WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EQ = prove
18107  (`!p z. path p /\ ~(z IN path_image p)
18108          ==> (winding_number(p,z) = Cx(&0) <=>
18109               ?a. homotopic_paths ((:complex) DELETE z) p (\t. a))`,
18110   REPEAT STRIP_TAC THEN EQ_TAC THENL
18111    [ASM_SIMP_TAC[WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EXPLICIT_EQ] THEN
18112     REWRITE_TAC[GSYM LINEPATH_REFL] THEN MESON_TAC[];
18113     STRIP_TAC THEN
18114     FIRST_ASSUM(MP_TAC o MATCH_MP WINDING_NUMBER_HOMOTOPIC_PATHS) THEN
18115     ASM_REWRITE_TAC[GSYM LINEPATH_REFL] THEN
18116     DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
18117     FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_SUBSET) THEN
18118     REWRITE_TAC[GSYM LINEPATH_REFL; PATH_IMAGE_LINEPATH; SEGMENT_REFL] THEN
18119     SET_TAC[]]);;
18120
18121 let WINDING_NUMBER_HOMOTOPIC_PATHS_EQ = prove
18122  (`!p q z.
18123         path p /\ ~(z IN path_image p) /\
18124         path q /\ ~(z IN path_image q) /\
18125         pathstart q = pathstart p /\ pathfinish q = pathfinish p
18126         ==> (winding_number(p,z) = winding_number(q,z) <=>
18127              homotopic_paths ((:complex) DELETE z) p q)`,
18128   REPEAT STRIP_TAC THEN EQ_TAC THEN
18129   REWRITE_TAC[WINDING_NUMBER_HOMOTOPIC_PATHS] THEN DISCH_TAC THEN
18130   MP_TAC(ISPECL [`p ++ reversepath q:real^1->complex`; `z:complex`]
18131         WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EQ) THEN
18132   ASM_SIMP_TAC[PATH_JOIN; PATH_REVERSEPATH; PATH_IMAGE_JOIN; IN_UNION;
18133                PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
18134                 PATH_IMAGE_REVERSEPATH; WINDING_NUMBER_JOIN;
18135                WINDING_NUMBER_REVERSEPATH; COMPLEX_ADD_RINV] THEN
18136   REWRITE_TAC[GSYM LINEPATH_REFL] THEN STRIP_TAC THEN
18137   FIRST_ASSUM(MP_TAC o MATCH_MP
18138    (REWRITE_RULE[IMP_CONJ] HOMOTOPIC_PATHS_IMP_HOMOTOPIC_LOOPS)) THEN
18139   FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_PATHSTART) THEN
18140   ASM_REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
18141                   PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
18142                   PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
18143   DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
18144   DISCH_THEN(MP_TAC o MATCH_MP
18145     (REWRITE_RULE[IMP_CONJ] HOMOTOPIC_PATHS_LOOP_PARTS)) THEN
18146   ASM_REWRITE_TAC[]);;
18147
18148 let WINDING_NUMBER_HOMOTOPIC_LOOPS_EQ = prove
18149  (`!p q z.
18150         path p /\ pathfinish p = pathstart p /\ ~(z IN path_image p) /\
18151         path q /\ pathfinish q = pathstart q /\ ~(z IN path_image q)
18152         ==> (winding_number(p,z) = winding_number(q,z) <=>
18153              homotopic_loops ((:complex) DELETE z) p q)`,
18154   REPEAT STRIP_TAC THEN EQ_TAC THEN
18155   REWRITE_TAC[WINDING_NUMBER_HOMOTOPIC_LOOPS] THEN DISCH_TAC THEN
18156   SUBGOAL_THEN `~(pathstart p:complex = z) /\ ~(pathstart q = z)`
18157   STRIP_ASSUME_TAC THENL
18158    [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE];
18159     ALL_TAC] THEN
18160   MP_TAC(ISPECL [`(:complex)`; `z:complex`]
18161         PATH_CONNECTED_OPEN_DELETE) THEN
18162   REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; DIMINDEX_2; LE_REFL] THEN
18163   REWRITE_TAC[path_connected] THEN DISCH_THEN(MP_TAC o SPECL
18164    [`pathstart p:complex`; `pathstart q:complex`]) THEN
18165   ASM_REWRITE_TAC[IN_UNIV; IN_DELETE; LEFT_IMP_EXISTS_THM] THEN
18166   X_GEN_TAC `r:real^1->complex` THEN
18167   REWRITE_TAC[SET_RULE `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
18168   STRIP_TAC THEN SUBGOAL_THEN `~(pathstart r:complex = z)`
18169   STRIP_ASSUME_TAC THENL
18170    [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE];
18171     ALL_TAC] THEN
18172   MATCH_MP_TAC HOMOTOPIC_LOOPS_TRANS THEN
18173   EXISTS_TAC `r ++ q ++ reversepath r:real^1->complex` THEN
18174   ASM_SIMP_TAC[HOMOTOPIC_LOOPS_CONJUGATE; SET_RULE
18175     `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
18176   MATCH_MP_TAC HOMOTOPIC_PATHS_IMP_HOMOTOPIC_LOOPS THEN
18177   ASM_REWRITE_TAC[PATHFINISH_JOIN; PATHFINISH_REVERSEPATH] THEN
18178   W(MP_TAC o PART_MATCH (rand o rand) WINDING_NUMBER_HOMOTOPIC_PATHS_EQ o
18179     snd) THEN
18180   ASM_SIMP_TAC[PATH_JOIN; PATH_REVERSEPATH; PATHSTART_JOIN; PATHFINISH_JOIN;
18181                PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
18182                PATH_IMAGE_JOIN; IN_UNION; PATH_IMAGE_REVERSEPATH;
18183                WINDING_NUMBER_JOIN; WINDING_NUMBER_REVERSEPATH] THEN
18184   DISCH_THEN(SUBST1_TAC o SYM) THEN SIMPLE_COMPLEX_ARITH_TAC);;
18185
18186 (* ------------------------------------------------------------------------- *)
18187 (* A few simple corollaries from the various equivalences.                   *)
18188 (* ------------------------------------------------------------------------- *)
18189
18190 let SIMPLY_CONNECTED_INSIDE_SIMPLE_PATH = prove
18191  (`!p:real^1->real^2.
18192      simple_path p ==> simply_connected(inside(path_image p))`,
18193   REPEAT STRIP_TAC THEN
18194   FIRST_ASSUM(ASSUME_TAC o MATCH_MP SIMPLE_PATH_IMP_PATH) THEN
18195   ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_EMPTY_INSIDE;
18196                OPEN_INSIDE; CLOSED_PATH_IMAGE; INSIDE_INSIDE_EQ_EMPTY;
18197                CONNECTED_PATH_IMAGE] THEN
18198   ASM_CASES_TAC `pathstart(p):real^2 = pathfinish p` THEN
18199   ASM_SIMP_TAC[JORDAN_INSIDE_OUTSIDE; INSIDE_ARC_EMPTY; ARC_SIMPLE_PATH] THEN
18200   REWRITE_TAC[CONNECTED_EMPTY]);;
18201
18202 let SIMPLY_CONNECTED_INTER = prove
18203  (`!s t:real^2->bool.
18204         open s /\ open t /\ simply_connected s /\ simply_connected t /\
18205         connected (s INTER t)
18206         ==> simply_connected (s INTER t)`,
18207   REPEAT GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
18208   SIMP_TAC[SIMPLY_CONNECTED_EQ_WINDING_NUMBER_ZERO; OPEN_INTER] THEN
18209   REWRITE_TAC[SUBSET; IN_INTER] THEN MESON_TAC[]);;
18210
18211 (* ------------------------------------------------------------------------- *)
18212 (* Pick out the Riemann Mapping Theorem from the earlier chain.              *)
18213 (* ------------------------------------------------------------------------- *)
18214
18215 let RIEMANN_MAPPING_THEOREM = prove
18216  (`!s. open s /\ simply_connected s <=>
18217        s = {} \/
18218        s = (:real^2) \/
18219        ?f g. f holomorphic_on s /\
18220              g holomorphic_on ball(Cx(&0),&1) /\
18221              (!z. z IN s ==> f z IN ball(Cx(&0),&1) /\ g(f z) = z) /\
18222              (!z. z IN ball(Cx(&0),&1) ==> g z IN s /\ f(g z) = z)`,
18223   GEN_TAC THEN MATCH_MP_TAC(TAUT
18224    `(a ==> (b <=> c)) /\ (c ==> a) ==> (a /\ b <=> c)`) THEN
18225   REWRITE_TAC[SIMPLY_CONNECTED_EQ_BIHOLOMORPHIC_TO_DISC] THEN STRIP_TAC THEN
18226   ASM_REWRITE_TAC[OPEN_EMPTY; OPEN_UNIV] THEN
18227   SUBGOAL_THEN `s = IMAGE (g:complex->complex) (ball(Cx(&0),&1))`
18228   SUBST1_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
18229   MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
18230   ASM_SIMP_TAC[OPEN_BALL; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
18231   ASM_MESON_TAC[]);;