Update from HH
[Multivariate Analysis/.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/realanalysis.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 MIDPOINTS_IN_CONVEX_HULL = prove
1323  (`!x:real^N s. x IN convex hull s /\ y IN convex hull s
1324          ==> midpoint(x,y) IN convex hull s`,
1325   REPEAT STRIP_TAC THEN REWRITE_TAC[midpoint; VECTOR_ARITH
1326     `inv(&2) % (x + y):real^N = (&1 - inv(&2)) % x + inv(&2) % y`] THEN
1327   MATCH_MP_TAC IN_CONVEX_SET THEN
1328   ASM_REWRITE_TAC[CONVEX_CONVEX_HULL] THEN REAL_ARITH_TAC);;
1329
1330 let POINTS_IN_CONVEX_HULL = prove
1331  (`!x s. x IN s ==> x IN convex hull s`,
1332   MESON_TAC[SUBSET; HULL_SUBSET]);;
1333
1334 let CONVEX_HULL_SUBSET = prove
1335  (`(!x. x IN s ==> x IN convex hull t)
1336    ==> (convex hull s) SUBSET (convex hull t)`,
1337   REPEAT STRIP_TAC THEN MATCH_MP_TAC HULL_MINIMAL THEN
1338   ASM_REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET]);;
1339
1340 let NOT_IN_INTERIOR_CONVEX_HULL_3 = prove
1341  (`!a b c:complex. ~(a IN interior(convex hull {a,b,c})) /\
1342                    ~(b IN interior(convex hull {a,b,c})) /\
1343                    ~(c IN interior(convex hull {a,b,c}))`,
1344   REPEAT GEN_TAC THEN REPEAT CONJ_TAC THEN
1345   MATCH_MP_TAC NOT_IN_INTERIOR_CONVEX_HULL THEN
1346   ASM_SIMP_TAC[CARD_CLAUSES; FINITE_INSERT; FINITE_EMPTY; IN_INSERT] THEN
1347   REWRITE_TAC[DIMINDEX_2] THEN ARITH_TAC);;
1348
1349 (* ------------------------------------------------------------------------- *)
1350 (* Cauchy's theorem where there's a primitive.                               *)
1351 (* ------------------------------------------------------------------------- *)
1352
1353 let PATH_INTEGRAL_PRIMITIVE_LEMMA = prove
1354  (`!f f' g a b s.
1355         ~(interval[a,b] = {}) /\
1356         (!x. x IN s ==> (f has_complex_derivative f'(x)) (at x within s)) /\
1357         g piecewise_differentiable_on interval[a,b] /\
1358         (!x. x IN interval[a,b] ==> g(x) IN s)
1359         ==> ((\x. f'(g x) * vector_derivative g (at x within interval[a,b]))
1360              has_integral (f(g b) - f(g a))) (interval[a,b])`,
1361   REPEAT GEN_TAC THEN REWRITE_TAC[valid_path; piecewise_differentiable_on] THEN
1362   REWRITE_TAC[INTERVAL_EQ_EMPTY_1; REAL_NOT_LT] THEN
1363   DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
1364   FIRST_X_ASSUM(X_CHOOSE_THEN `k:real^1->bool` STRIP_ASSUME_TAC) THEN
1365   MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR_STRONG THEN
1366   EXISTS_TAC `k:real^1->bool` THEN ASM_REWRITE_TAC[DROP_VEC; REAL_POS] THEN
1367   ASM_SIMP_TAC[FINITE_IMP_COUNTABLE; GSYM o_DEF] THEN CONJ_TAC THENL
1368    [MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN ASM_REWRITE_TAC[] THEN
1369     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
1370     ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
1371     MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
1372     ASM_MESON_TAC[holomorphic_on];
1373     ALL_TAC] THEN
1374   X_GEN_TAC `x:real^1` THEN
1375   REPEAT STRIP_TAC THEN REWRITE_TAC[has_vector_derivative; COMPLEX_CMUL] THEN
1376   SUBGOAL_THEN `(f has_complex_derivative f'(g x))
1377                 (at (g x) within (IMAGE g (interval[a:real^1,b])))`
1378   MP_TAC THENL
1379    [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_WITHIN_SUBSET THEN
1380     EXISTS_TAC `s:complex->bool` THEN
1381     ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
1382     FIRST_X_ASSUM MATCH_MP_TAC THEN
1383     ASM_MESON_TAC[INTERVAL_OPEN_SUBSET_CLOSED; SUBSET; IN_DIFF];
1384     ALL_TAC] THEN
1385   SUBGOAL_THEN
1386    `(g:real^1->complex) differentiable (at x within interval[a,b])`
1387   MP_TAC THENL
1388    [MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
1389     FIRST_X_ASSUM MATCH_MP_TAC THEN
1390     ASM_MESON_TAC[INTERVAL_OPEN_SUBSET_CLOSED; SUBSET; IN_DIFF];
1391     ALL_TAC] THEN
1392   GEN_REWRITE_TAC LAND_CONV [VECTOR_DERIVATIVE_WORKS] THEN
1393   REWRITE_TAC[has_vector_derivative; IMP_IMP; has_complex_derivative] THEN
1394   DISCH_THEN(MP_TAC o MATCH_MP DIFF_CHAIN_WITHIN) THEN
1395   DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1396     HAS_DERIVATIVE_WITHIN_SUBSET)) THEN
1397   DISCH_THEN(MP_TAC o SPEC `interval(a:real^1,b)`) THEN
1398   RULE_ASSUM_TAC(REWRITE_RULE[IN_DIFF]) THEN
1399   ASM_SIMP_TAC[INTERVAL_OPEN_SUBSET_CLOSED; OPEN_INTERVAL;
1400                HAS_DERIVATIVE_WITHIN_OPEN] THEN
1401   REWRITE_TAC[o_DEF; COMPLEX_CMUL] THEN REWRITE_TAC[COMPLEX_MUL_AC]);;
1402
1403 let PATH_INTEGRAL_PRIMITIVE = prove
1404  (`!f f' g s.
1405         (!x. x IN s ==> (f has_complex_derivative f'(x)) (at x within s)) /\
1406         valid_path g /\ (path_image g) SUBSET s
1407         ==> (f' has_path_integral (f(pathfinish g) - f(pathstart g))) (g)`,
1408   REWRITE_TAC[valid_path; path_image; pathfinish; pathstart] THEN
1409   REWRITE_TAC[has_path_integral] THEN
1410   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_PRIMITIVE_LEMMA THEN
1411   ASM_REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC; REAL_POS; REAL_NOT_LT] THEN
1412   RULE_ASSUM_TAC(REWRITE_RULE[SUBSET; FORALL_IN_IMAGE]) THEN
1413   ASM_MESON_TAC[]);;
1414
1415 let CAUCHY_THEOREM_PRIMITIVE = prove
1416  (`!f f' g s.
1417         (!x. x IN s ==> (f has_complex_derivative f'(x)) (at x within s)) /\
1418         valid_path g /\ (path_image g) SUBSET s /\
1419         pathfinish g = pathstart g
1420         ==> (f' has_path_integral Cx(&0)) (g)`,
1421   MESON_TAC[PATH_INTEGRAL_PRIMITIVE; COMPLEX_SUB_REFL]);;
1422
1423 (* ------------------------------------------------------------------------- *)
1424 (* Existence of path integral for continuous function.                       *)
1425 (* ------------------------------------------------------------------------- *)
1426
1427 let PATH_INTEGRABLE_CONTINUOUS_LINEPATH = prove
1428  (`!f a b. f continuous_on segment[a,b]
1429            ==> f path_integrable_on (linepath(a,b))`,
1430   REPEAT GEN_TAC THEN REWRITE_TAC[path_integrable_on; has_path_integral] THEN
1431   DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
1432   REWRITE_TAC[GSYM integrable_on] THEN MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
1433   MATCH_MP_TAC CONTINUOUS_ON_EQ THEN
1434   EXISTS_TAC `\x. f(linepath(a,b) x) * (b - a)` THEN
1435   SIMP_TAC[VECTOR_DERIVATIVE_LINEPATH_WITHIN] THEN
1436   ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
1437   MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_LMUL THEN
1438   GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
1439   MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
1440   ASM_REWRITE_TAC[GSYM path_image; ETA_AX; PATH_IMAGE_LINEPATH] THEN
1441   REWRITE_TAC[CONTINUOUS_ON_LINEPATH]);;
1442
1443 (* ------------------------------------------------------------------------- *)
1444 (* A complex-specific theorem for integrals.                                 *)
1445 (* ------------------------------------------------------------------------- *)
1446
1447 let HAS_INTEGRAL_COMPLEX_CMUL = prove
1448  (`!f y i c. (f has_integral y) i ==> ((\x. c * f(x)) has_integral (c * y)) i`,
1449   REPEAT STRIP_TAC THEN MATCH_MP_TAC
1450    (REWRITE_RULE[o_DEF] HAS_INTEGRAL_LINEAR) THEN
1451   ASM_REWRITE_TAC[linear; COMPLEX_CMUL] THEN CONV_TAC COMPLEX_RING);;
1452
1453 (* ------------------------------------------------------------------------- *)
1454 (* Arithmetical combining theorems.                                          *)
1455 (* ------------------------------------------------------------------------- *)
1456
1457 let HAS_PATH_INTEGRAL_CONST_LINEPATH = prove
1458  (`!a b c. ((\x. c) has_path_integral (c * (b - a))) (linepath(a,b))`,
1459   REPEAT GEN_TAC THEN REWRITE_TAC[HAS_PATH_INTEGRAL_LINEPATH] THEN
1460   MP_TAC(ISPECL [`vec 0:real^1`; `vec 1:real^1`; `c * (b - a):complex`]
1461          HAS_INTEGRAL_CONST) THEN
1462   REWRITE_TAC[CONTENT_UNIT; VECTOR_MUL_LID]);;
1463
1464 let HAS_PATH_INTEGRAL_NEG = prove
1465  (`!f i g. (f has_path_integral i) g
1466            ==> ((\x. --(f x)) has_path_integral (--i)) g`,
1467   REWRITE_TAC[has_path_integral; COMPLEX_MUL_LNEG; HAS_INTEGRAL_NEG]);;
1468
1469 let HAS_PATH_INTEGRAL_ADD = prove
1470  (`!f1 i1 f2 i2 g.
1471         (f1 has_path_integral i1) g /\ (f2 has_path_integral i2) g
1472         ==> ((\x. f1(x) + f2(x)) has_path_integral (i1 + i2)) g`,
1473   REWRITE_TAC[has_path_integral; COMPLEX_ADD_RDISTRIB] THEN
1474   SIMP_TAC[HAS_INTEGRAL_ADD]);;
1475
1476 let HAS_PATH_INTEGRAL_SUB = prove
1477  (`!f1 i1 f2 i2 g.
1478         (f1 has_path_integral i1) g /\ (f2 has_path_integral i2) g
1479          ==> ((\x. f1(x) - f2(x)) has_path_integral (i1 - i2)) g`,
1480   REWRITE_TAC[has_path_integral; COMPLEX_SUB_RDISTRIB] THEN
1481   SIMP_TAC[HAS_INTEGRAL_SUB]);;
1482
1483 let HAS_PATH_INTEGRAL_COMPLEX_LMUL = prove
1484  (`!f g i c. (f has_path_integral i) g
1485              ==> ((\x. c * f x) has_path_integral (c * i)) g`,
1486   REWRITE_TAC[has_path_integral; HAS_INTEGRAL_COMPLEX_CMUL;
1487               GSYM COMPLEX_MUL_ASSOC]);;
1488
1489 let HAS_PATH_INTEGRAL_COMPLEX_RMUL = prove
1490  (`!f g i c. (f has_path_integral i) g
1491              ==> ((\x. f x * c) has_path_integral (i * c)) g`,
1492   ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
1493   REWRITE_TAC[HAS_PATH_INTEGRAL_COMPLEX_LMUL]);;
1494
1495 let HAS_PATH_INTEGRAL_COMPLEX_DIV = prove
1496  (`!f g i c. (f has_path_integral i) g
1497              ==> ((\x. f x / c) has_path_integral (i / c)) g`,
1498   REWRITE_TAC[complex_div; HAS_PATH_INTEGRAL_COMPLEX_RMUL]);;
1499
1500 let HAS_PATH_INTEGRAL_EQ = prove
1501  (`!f g p y.
1502         (!x. x IN path_image p ==> f x = g x) /\
1503         (f has_path_integral y) p
1504         ==> (g has_path_integral y) p`,
1505   REPEAT GEN_TAC THEN
1506   REWRITE_TAC[path_image; IN_IMAGE; has_path_integral; IMP_CONJ] THEN
1507   DISCH_TAC THEN MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_EQ) THEN
1508   ASM_SIMP_TAC[] THEN ASM_MESON_TAC[]);;
1509
1510 let HAS_PATH_INTEGRAL_BOUND_LINEPATH = prove
1511  (`!f i a b B.
1512         (f has_path_integral i) (linepath(a,b)) /\
1513         &0 <= B /\ (!x. x IN segment[a,b] ==> norm(f x) <= B)
1514         ==> norm(i) <= B * norm(b - a)`,
1515   REPEAT GEN_TAC THEN REWRITE_TAC[has_path_integral] THEN STRIP_TAC THEN
1516   GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
1517   REWRITE_TAC[GSYM CONTENT_UNIT_1] THEN MATCH_MP_TAC HAS_INTEGRAL_BOUND THEN
1518   EXISTS_TAC `\x. f (linepath (a,b) x) *
1519                     vector_derivative (linepath (a,b))
1520                        (at x within interval [vec 0,vec 1])` THEN
1521   ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE;
1522                VECTOR_DERIVATIVE_LINEPATH_WITHIN] THEN
1523   REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
1524   MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
1525   FIRST_X_ASSUM MATCH_MP_TAC THEN
1526   REWRITE_TAC[GSYM PATH_IMAGE_LINEPATH; path_image] THEN
1527   ASM SET_TAC[]);;
1528
1529 let HAS_PATH_INTEGRAL_BOUND_LINEPATH_STRONG = prove
1530  (`!f i a b B k.
1531         FINITE k /\
1532         (f has_path_integral i) (linepath(a,b)) /\
1533         &0 <= B /\ (!x. x IN segment[a,b] DIFF k ==> norm(f x) <= B)
1534         ==> norm(i) <= B * norm(b - a)`,
1535   REPEAT GEN_TAC THEN ASM_CASES_TAC `b:complex = a` THENL
1536    [ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0; REAL_MUL_RZERO] THEN
1537     STRIP_TAC THEN SUBGOAL_THEN `i = Cx(&0)`
1538       (fun th -> REWRITE_TAC[th; COMPLEX_NORM_0; REAL_LE_REFL]) THEN
1539     MATCH_MP_TAC HAS_PATH_INTEGRAL_UNIQUE THEN
1540     ASM_MESON_TAC[HAS_PATH_INTEGRAL_TRIVIAL];
1541     STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
1542     EXISTS_TAC `\x. if x IN k then Cx(&0) else (f:complex->complex) x` THEN
1543     ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
1544      [ALL_TAC; ASM SET_TAC[COMPLEX_NORM_0]] THEN
1545     UNDISCH_TAC `(f has_path_integral i) (linepath (a,b))` THEN
1546     MATCH_MP_TAC EQ_IMP THEN REWRITE_TAC[has_path_integral] THEN
1547     MATCH_MP_TAC HAS_INTEGRAL_SPIKE_EQ THEN
1548     EXISTS_TAC `{t | t IN interval[vec 0,vec 1] /\
1549                      linepath(a:complex,b) t IN k}` THEN
1550     CONJ_TAC THENL [MATCH_MP_TAC NEGLIGIBLE_FINITE; SET_TAC[]] THEN
1551     MATCH_MP_TAC FINITE_FINITE_PREIMAGE_GENERAL THEN ASM_REWRITE_TAC[] THEN
1552     X_GEN_TAC `c:complex` THEN DISCH_TAC THEN
1553     MATCH_MP_TAC(MESON[FINITE_SING; FINITE_SUBSET]
1554      `(?a. s SUBSET {a}) ==> FINITE s`) THEN
1555     MATCH_MP_TAC(SET_RULE
1556      `(!a b. a IN s /\ b IN s ==> a = b) ==> (?a. s SUBSET {a})`) THEN
1557     MAP_EVERY X_GEN_TAC [`s:real^1`; `t:real^1`] THEN
1558     REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
1559     FIRST_X_ASSUM(MP_TAC o SYM) THEN FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
1560     REWRITE_TAC[linepath; VECTOR_ARITH
1561      `(&1 - s) % a + s % b:real^N = (&1 - t) % a + t % b <=>
1562       (s - t) % (b - a) = vec 0`] THEN
1563     ASM_REWRITE_TAC[VECTOR_MUL_EQ_0; VECTOR_SUB_EQ; REAL_SUB_0] THEN
1564     REWRITE_TAC[DROP_EQ]]);;
1565
1566 let HAS_PATH_INTEGRAL_0 = prove
1567  (`!g. ((\x. Cx(&0)) has_path_integral Cx(&0)) g`,
1568   REWRITE_TAC[has_path_integral; COMPLEX_MUL_LZERO] THEN
1569   REWRITE_TAC[GSYM COMPLEX_VEC_0; HAS_INTEGRAL_0]);;
1570
1571 let HAS_PATH_INTEGRAL_IS_0 = prove
1572  (`!f g. (!z. z IN path_image g ==> f(z) = Cx(&0))
1573          ==> (f has_path_integral Cx(&0)) g`,
1574   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_EQ THEN
1575   EXISTS_TAC `\z:complex. Cx(&0)` THEN
1576   ASM_REWRITE_TAC[HAS_PATH_INTEGRAL_0] THEN ASM_MESON_TAC[]);;
1577
1578 let HAS_PATH_INTEGRAL_VSUM = prove
1579  (`!f p s. FINITE s /\ (!a. a IN s ==> (f a has_path_integral i a) p)
1580            ==> ((\x. vsum s (\a. f a x)) has_path_integral vsum s i) p`,
1581   GEN_TAC THEN GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
1582   MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
1583   SIMP_TAC[VSUM_CLAUSES; HAS_PATH_INTEGRAL_0; COMPLEX_VEC_0; IN_INSERT] THEN
1584   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN
1585   ASM_REWRITE_TAC[ETA_AX] THEN CONJ_TAC THEN
1586   FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC[]);;
1587
1588 (* ------------------------------------------------------------------------- *)
1589 (* Same thing non-relationally.                                              *)
1590 (* ------------------------------------------------------------------------- *)
1591
1592 let PATH_INTEGRAL_CONST_LINEPATH = prove
1593  (`!a b c. path_integral (linepath(a,b)) (\x. c) = c * (b - a)`,
1594   REPEAT GEN_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1595   REWRITE_TAC[HAS_PATH_INTEGRAL_CONST_LINEPATH]);;
1596
1597 let PATH_INTEGRAL_NEG = prove
1598  (`!f g. f path_integrable_on g
1599          ==> path_integral g (\x. --(f x)) = --(path_integral g f)`,
1600   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1601   MATCH_MP_TAC HAS_PATH_INTEGRAL_NEG THEN
1602   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1603
1604 let PATH_INTEGRAL_ADD = prove
1605  (`!f1 f2 g.
1606         f1 path_integrable_on g /\ f2 path_integrable_on g
1607         ==> path_integral g (\x. f1(x) + f2(x)) =
1608                 path_integral g f1 + path_integral g f2`,
1609   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1610   MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN
1611   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1612
1613 let PATH_INTEGRAL_SUB = prove
1614  (`!f1 f2 g.
1615         f1 path_integrable_on g /\ f2 path_integrable_on g
1616         ==> path_integral g (\x. f1(x) - f2(x)) =
1617                 path_integral g f1 - path_integral g f2`,
1618   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1619   MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
1620   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1621
1622 let PATH_INTEGRAL_COMPLEX_LMUL = prove
1623  (`!f g c.  f path_integrable_on g
1624            ==> path_integral g (\x. c * f x) = c * path_integral g f`,
1625   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1626   MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_LMUL THEN
1627   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1628
1629 let PATH_INTEGRAL_COMPLEX_RMUL = prove
1630  (`!f g c.  f path_integrable_on g
1631            ==> path_integral g (\x. f x * c) = path_integral g f * c`,
1632   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1633   MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_RMUL THEN
1634   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1635
1636 let PATH_INTEGRAL_COMPLEX_DIV = prove
1637  (`!f g c.  f path_integrable_on g
1638            ==> path_integral g (\x. f x / c) = path_integral g f / c`,
1639    REWRITE_TAC[complex_div; PATH_INTEGRAL_COMPLEX_RMUL]);;
1640
1641 let PATH_INTEGRAL_EQ = prove
1642  (`!f g p.
1643         (!x. x IN path_image p ==> f x = g x)
1644         ==> path_integral p f = path_integral p g`,
1645   REPEAT STRIP_TAC THEN REWRITE_TAC[path_integral] THEN
1646   AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN
1647   ASM_MESON_TAC[HAS_PATH_INTEGRAL_EQ]);;
1648
1649 let PATH_INTEGRAL_EQ_0 = prove
1650  (`!f g. (!z. z IN path_image g ==> f(z) = Cx(&0))
1651          ==> path_integral g f = Cx(&0)`,
1652   MESON_TAC[HAS_PATH_INTEGRAL_IS_0; PATH_INTEGRAL_UNIQUE]);;
1653
1654 let PATH_INTEGRAL_BOUND_LINEPATH = prove
1655  (`!f a b.
1656         f path_integrable_on (linepath(a,b)) /\
1657         &0 <= B /\ (!x. x IN segment[a,b] ==> norm(f x) <= B)
1658         ==> norm(path_integral (linepath(a,b)) f) <= B * norm(b - a)`,
1659   REPEAT STRIP_TAC THEN
1660   MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
1661   EXISTS_TAC `f:complex->complex` THEN
1662   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1663
1664 let PATH_INTEGRAL_0 = prove
1665  (`!g. path_integral g (\x. Cx(&0)) = Cx(&0)`,
1666   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1667   REWRITE_TAC[HAS_PATH_INTEGRAL_0]);;
1668
1669 let PATH_INTEGRAL_VSUM = prove
1670  (`!f p s. FINITE s /\ (!a. a IN s ==> (f a) path_integrable_on p)
1671            ==> path_integral p (\x. vsum s (\a. f a x)) =
1672                 vsum s (\a. path_integral p (f a))`,
1673   REPEAT STRIP_TAC THEN
1674   MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1675   MATCH_MP_TAC HAS_PATH_INTEGRAL_VSUM THEN
1676   ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1677
1678 let PATH_INTEGRABLE_EQ = prove
1679  (`!f g p. (!x. x IN path_image p ==> f x = g x) /\ f path_integrable_on p
1680            ==> g path_integrable_on p`,
1681   REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_EQ]);;
1682
1683 (* ------------------------------------------------------------------------- *)
1684 (* Arithmetic theorems for path integrability.                               *)
1685 (* ------------------------------------------------------------------------- *)
1686
1687 let PATH_INTEGRABLE_NEG = prove
1688  (`!f g. f path_integrable_on g
1689            ==> (\x. --(f x)) path_integrable_on g`,
1690   REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_NEG]);;
1691
1692 let PATH_INTEGRABLE_ADD = prove
1693  (`!f1 f2 g.
1694         f1 path_integrable_on g /\ f2 path_integrable_on g
1695         ==> (\x. f1(x) + f2(x)) path_integrable_on g`,
1696   REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_ADD]);;
1697
1698 let PATH_INTEGRABLE_SUB = prove
1699  (`!f1 f2 g.
1700         f1 path_integrable_on g /\ f2 path_integrable_on g
1701         ==> (\x. f1(x) - f2(x)) path_integrable_on g`,
1702   REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_SUB]);;
1703
1704 let PATH_INTEGRABLE_COMPLEX_LMUL = prove
1705  (`!f g c. f path_integrable_on g
1706              ==> (\x. c * f x) path_integrable_on g`,
1707   REWRITE_TAC[path_integrable_on] THEN
1708   MESON_TAC[HAS_PATH_INTEGRAL_COMPLEX_LMUL]);;
1709
1710 let PATH_INTEGRABLE_COMPLEX_RMUL = prove
1711  (`!f g c. f path_integrable_on g
1712              ==> (\x. f x * c) path_integrable_on g`,
1713   ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
1714   REWRITE_TAC[PATH_INTEGRABLE_COMPLEX_LMUL]);;
1715
1716 let PATH_INTEGRABLE_COMPLEX_DIV = prove
1717  (`!f g c. f path_integrable_on g
1718              ==> (\x. f x / c) path_integrable_on g`,
1719   REWRITE_TAC[path_integrable_on] THEN
1720   MESON_TAC[HAS_PATH_INTEGRAL_COMPLEX_DIV]);;
1721
1722 let PATH_INTEGRABLE_VSUM = prove
1723  (`!f g s. FINITE s /\ (!a. a IN s ==> f a path_integrable_on g)
1724            ==> (\x. vsum s (\a. f a x)) path_integrable_on g`,
1725   REWRITE_TAC[path_integrable_on] THEN
1726   MESON_TAC[HAS_PATH_INTEGRAL_VSUM]);;
1727
1728 (* ------------------------------------------------------------------------- *)
1729 (* Considering a path integral "backwards".                                  *)
1730 (* ------------------------------------------------------------------------- *)
1731
1732 let HAS_PATH_INTEGRAL_REVERSE_LINEPATH = prove
1733  (`!f a b i.
1734         (f has_path_integral i) (linepath(a,b))
1735         ==> (f has_path_integral (--i)) (linepath(b,a))`,
1736   MESON_TAC[REVERSEPATH_LINEPATH; VALID_PATH_LINEPATH;
1737             HAS_PATH_INTEGRAL_REVERSEPATH]);;
1738
1739 let PATH_INTEGRAL_REVERSE_LINEPATH = prove
1740  (`!f a b.
1741         f continuous_on (segment[a,b])
1742         ==> path_integral(linepath(a,b)) f =
1743             --(path_integral(linepath(b,a)) f)`,
1744   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1745   MATCH_MP_TAC HAS_PATH_INTEGRAL_REVERSE_LINEPATH THEN
1746   MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
1747   MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
1748   ASM_MESON_TAC[SEGMENT_SYM]);;
1749
1750 (* ------------------------------------------------------------------------- *)
1751 (* Splitting a path integral in a flat way.                                  *)
1752 (* ------------------------------------------------------------------------- *)
1753
1754 let HAS_PATH_INTEGRAL_SPLIT = prove
1755  (`!f a b c i j k.
1756         &0 <= k /\ k <= &1 /\ c - a = k % (b - a) /\
1757         (f has_path_integral i) (linepath(a,c)) /\
1758         (f has_path_integral j) (linepath(c,b))
1759         ==> (f has_path_integral (i + j)) (linepath(a,b))`,
1760   REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1761   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1762   ASM_CASES_TAC `k = &0` THENL
1763    [ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ] THEN
1764     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
1765     ASM_MESON_TAC[HAS_PATH_INTEGRAL_TRIVIAL; PATH_INTEGRAL_UNIQUE;
1766                   COMPLEX_ADD_LID];
1767     ALL_TAC] THEN
1768   ASM_CASES_TAC `k = &1` THEN ASM_REWRITE_TAC[VECTOR_MUL_LID] THENL
1769    [REWRITE_TAC[VECTOR_ARITH `c - a = b - a <=> c = b:real^N`] THEN
1770     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
1771     ASM_MESON_TAC[HAS_PATH_INTEGRAL_TRIVIAL; PATH_INTEGRAL_UNIQUE;
1772                   COMPLEX_ADD_RID];
1773     ALL_TAC] THEN
1774   REWRITE_TAC[HAS_PATH_INTEGRAL_LINEPATH] THEN
1775   REWRITE_TAC[linepath] THEN REPEAT GEN_TAC THEN
1776   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1777   DISCH_THEN(CONJUNCTS_THEN
1778    (MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_AFFINITY))) THEN
1779   DISCH_THEN(ASSUME_TAC o SPECL
1780     [`inv(&1 - k):real`; `--(k / (&1 - k)) % vec 1:real^1`]) THEN
1781   DISCH_THEN(MP_TAC o SPECL [`inv(k):real`; `vec 0:real^1`]) THEN
1782   POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[REAL_INV_EQ_0; REAL_SUB_0] THEN
1783   REWRITE_TAC[REAL_INV_INV; DIMINDEX_1; REAL_POW_1; REAL_ABS_INV] THEN
1784   REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
1785   REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
1786   ASM_REWRITE_TAC[REAL_SUB_LE; REAL_ARITH `~(&1 < &0)`] THEN
1787   REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_NEG_0; VECTOR_ADD_RID] THEN
1788   REWRITE_TAC[VECTOR_MUL_ASSOC; VECTOR_MUL_LNEG] THEN
1789   ASM_SIMP_TAC[REAL_FIELD
1790     `~(k = &1) ==> (&1 - k) * --(k / (&1 - k)) = --k`] THEN
1791   REWRITE_TAC[VECTOR_ADD_LID; VECTOR_MUL_LNEG; VECTOR_NEG_NEG;
1792               VECTOR_ARITH `(&1 - k) % x + k % x:real^1 = x`] THEN
1793   REWRITE_TAC[DROP_ADD; DROP_CMUL; DROP_NEG; DROP_VEC; REAL_MUL_RID] THEN
1794   FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP (VECTOR_ARITH
1795     `c - a = x ==> c = x + a`)) THEN
1796   REWRITE_TAC[VECTOR_ARITH `b - (k % (b - a) + a) = (&1 - k) % (b - a)`] THEN
1797   SUBGOAL_THEN
1798    `!x. (&1 - (inv (&1 - k) * drop x + --(k / (&1 - k)))) % (k % (b - a) + a) +
1799         (inv (&1 - k) * drop x + --(k / (&1 - k))) % b =
1800         (&1 - drop x) % a + drop x % b`
1801    (fun th -> REWRITE_TAC[th]) THENL
1802    [REWRITE_TAC[VECTOR_ARITH
1803      `x % (k % (b - a) + a) + y % b =
1804       (x * (&1 - k)) % a + (y + x * k) % b`] THEN
1805     GEN_TAC THEN BINOP_TAC THEN BINOP_TAC THEN REWRITE_TAC[] THEN
1806     REPEAT(POP_ASSUM MP_TAC) THEN CONV_TAC REAL_FIELD;
1807     ALL_TAC] THEN
1808   SUBGOAL_THEN
1809    `!x. (&1 - inv k * drop x) % a + (inv k * drop x) % (k % (b - a) + a) =
1810         (&1 - drop x) % a + drop x % b`
1811    (fun th -> REWRITE_TAC[th]) THENL
1812    [REWRITE_TAC[VECTOR_ARITH
1813      `x % a + y % (k % (b - a) + a) =
1814       (x + y * (&1 - k)) % a + (y * k) % b`] THEN
1815     GEN_TAC THEN BINOP_TAC THEN BINOP_TAC THEN REWRITE_TAC[] THEN
1816     REPEAT(POP_ASSUM MP_TAC) THEN CONV_TAC REAL_FIELD;
1817     ALL_TAC] THEN
1818   DISCH_TAC THEN
1819   DISCH_THEN(MP_TAC o SPEC `inv(k:real)` o MATCH_MP HAS_INTEGRAL_CMUL) THEN
1820   FIRST_ASSUM(MP_TAC o SPEC `inv(&1 - k)` o MATCH_MP HAS_INTEGRAL_CMUL) THEN
1821   ASM_SIMP_TAC[REAL_ARITH `&0 <= k ==> abs k = k`;
1822                REAL_ARITH `k <= &1 ==> abs(&1 - k) = &1 - k`] THEN
1823   ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_MUL_LINV; REAL_SUB_0] THEN
1824   REWRITE_TAC[IMP_IMP; VECTOR_MUL_LID] THEN
1825   REWRITE_TAC[COMPLEX_CMUL] THEN
1826   ONCE_REWRITE_TAC[COMPLEX_RING
1827    `Cx(inv a) * b * Cx(a) * c = (Cx(inv a) * Cx a) * b * c`] THEN
1828   ASM_SIMP_TAC[GSYM CX_MUL; REAL_MUL_LINV; REAL_SUB_0; COMPLEX_MUL_LID] THEN
1829   STRIP_TAC THEN
1830   MATCH_MP_TAC HAS_INTEGRAL_COMBINE THEN EXISTS_TAC `k % vec 1:real^1` THEN
1831   ASM_REWRITE_TAC[DROP_CMUL; DROP_VEC; REAL_MUL_RID]);;
1832
1833 let PATH_INTEGRAL_SPLIT = prove
1834  (`!f a b c k.
1835         &0 <= k /\ k <= &1 /\ c - a = k % (b - a) /\
1836         f continuous_on (segment[a,b])
1837         ==> path_integral(linepath(a,b)) f =
1838             path_integral(linepath(a,c)) f +
1839             path_integral(linepath(c,b)) f`,
1840   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1841   MATCH_MP_TAC HAS_PATH_INTEGRAL_SPLIT THEN
1842   MAP_EVERY EXISTS_TAC [`c:complex`; `k:real`] THEN ASM_REWRITE_TAC[] THEN
1843   CONJ_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
1844   MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
1845   MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
1846   EXISTS_TAC `segment[a:complex,b]` THEN ASM_REWRITE_TAC[] THEN
1847   REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
1848   REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
1849   ASM_SIMP_TAC[POINTS_IN_CONVEX_HULL; IN_INSERT] THEN
1850   FIRST_ASSUM(SUBST1_TAC o MATCH_MP (VECTOR_ARITH
1851    `c - a = k % (b - a) ==> c = (&1 - k) % a + k % b`)) THEN
1852   MATCH_MP_TAC IN_CONVEX_SET THEN
1853   ASM_SIMP_TAC[CONVEX_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT]);;
1854
1855 let PATH_INTEGRAL_SPLIT_LINEPATH = prove
1856  (`!f a b c.
1857         f continuous_on segment[a,b] /\ c IN segment[a,b]
1858         ==> path_integral(linepath (a,b)) f =
1859             path_integral(linepath (a,c)) f +
1860             path_integral(linepath (c,b)) f`,
1861   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_SPLIT THEN
1862   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_SEGMENT]) THEN
1863   MATCH_MP_TAC MONO_EXISTS THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
1864   VECTOR_ARITH_TAC);;
1865
1866 (* ------------------------------------------------------------------------- *)
1867 (* The special case of midpoints used in the main quadrisection.             *)
1868 (* ------------------------------------------------------------------------- *)
1869
1870 let HAS_PATH_INTEGRAL_MIDPOINT = prove
1871  (`!f a b i j.
1872         (f has_path_integral i) (linepath(a,midpoint(a,b))) /\
1873         (f has_path_integral j) (linepath(midpoint(a,b),b))
1874         ==> (f has_path_integral (i + j)) (linepath(a,b))`,
1875   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_SPLIT THEN
1876   MAP_EVERY EXISTS_TAC [`midpoint(a:complex,b)`; `&1 / &2`] THEN
1877   ASM_REWRITE_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
1878   REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);;
1879
1880 let PATH_INTEGRAL_MIDPOINT = prove
1881  (`!f a b.
1882         f continuous_on (segment[a,b])
1883         ==> path_integral(linepath(a,b)) f =
1884             path_integral(linepath(a,midpoint(a,b))) f +
1885             path_integral(linepath(midpoint(a,b),b)) f`,
1886   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_SPLIT THEN
1887   EXISTS_TAC `&1 / &2` THEN
1888   ASM_REWRITE_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
1889   REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);;
1890
1891 (* ------------------------------------------------------------------------- *)
1892 (* A couple of special case lemmas that are useful below.                    *)
1893 (* ------------------------------------------------------------------------- *)
1894
1895 let TRIANGLE_LINEAR_HAS_CHAIN_INTEGRAL = prove
1896  (`!a b c m d. ((\x. m * x + d) has_path_integral Cx(&0))
1897          (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`,
1898   REPEAT GEN_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_PRIMITIVE THEN
1899   MAP_EVERY EXISTS_TAC [`\x. m / Cx(&2) * x pow 2 + d * x`; `(:complex)`] THEN
1900   SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH; SUBSET_UNIV;
1901            PATHFINISH_LINEPATH; VALID_PATH_JOIN; VALID_PATH_LINEPATH] THEN
1902   REPEAT STRIP_TAC THEN COMPLEX_DIFF_TAC THEN CONV_TAC NUM_REDUCE_CONV THEN
1903   CONV_TAC COMPLEX_RING);;
1904
1905 let HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL = prove
1906  (`!f i a b c d.
1907         (f has_path_integral i)
1908         (linepath(a,b) ++ linepath(b,c) ++ linepath(c,d))
1909         ==> path_integral (linepath(a,b)) f +
1910             path_integral (linepath(b,c)) f +
1911             path_integral (linepath(c,d)) f = i`,
1912   REPEAT STRIP_TAC THEN
1913   FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
1914   FIRST_X_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE) THEN
1915   SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_LINEPATH; VALID_PATH_JOIN;
1916            PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
1917            PATHFINISH_LINEPATH] THEN
1918   STRIP_TAC THEN CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1919   REPEAT(MATCH_MP_TAC HAS_PATH_INTEGRAL_JOIN THEN
1920          SIMP_TAC[VALID_PATH_LINEPATH; VALID_PATH_JOIN;
1921                   PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
1922                   PATHFINISH_LINEPATH] THEN
1923          CONJ_TAC) THEN
1924   MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN ASM_REWRITE_TAC[]);;
1925
1926 (* ------------------------------------------------------------------------- *)
1927 (* Reversing the order in a double path integral. The condition is           *)
1928 (* stronger than needed but it's often true in typical situations.           *)
1929 (* ------------------------------------------------------------------------- *)
1930
1931 let PATH_INTEGRAL_SWAP = prove
1932  (`!f g h.
1933     (\y. f (fstcart y) (sndcart y)) continuous_on
1934     (path_image g PCROSS path_image h) /\
1935     valid_path g /\ valid_path h /\
1936     (\t. vector_derivative g (at t)) continuous_on interval[vec 0,vec 1] /\
1937     (\t. vector_derivative h (at t)) continuous_on interval[vec 0,vec 1]
1938     ==> path_integral g (\w. path_integral h (f w)) =
1939         path_integral h (\z. path_integral g (\w. f w z))`,
1940   REWRITE_TAC[PCROSS] THEN REPEAT STRIP_TAC THEN
1941   ONCE_REWRITE_TAC[PATH_INTEGRAL_INTEGRAL] THEN MATCH_MP_TAC EQ_TRANS THEN
1942   EXISTS_TAC
1943    `integral (interval[vec 0,vec 1])
1944              (\x. path_integral h
1945                     (\y. f (g x) y * vector_derivative g (at x)))` THEN
1946   CONJ_TAC THENL
1947    [MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `x:real^1` THEN
1948     DISCH_TAC THEN REWRITE_TAC[] THEN
1949     CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_COMPLEX_RMUL THEN
1950     REWRITE_TAC[PATH_INTEGRABLE_ON] THEN
1951     MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
1952     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN ASM_REWRITE_TAC[] THEN
1953     SUBGOAL_THEN
1954      `(\t:real^1. (f:complex->complex->complex) (g x) (h t)) =
1955       (\y. f (fstcart y) (sndcart y)) o
1956       (\t. pastecart (g(x:real^1)) (h t))`
1957     SUBST1_TAC THENL
1958      [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART];
1959       ALL_TAC] THEN
1960     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
1961      [MATCH_MP_TAC CONTINUOUS_ON_PASTECART THEN
1962       ASM_SIMP_TAC[CONTINUOUS_ON_CONST; GSYM path; VALID_PATH_IMP_PATH];
1963       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1964          CONTINUOUS_ON_SUBSET)) THEN
1965       REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM] THEN
1966       ASM_SIMP_TAC[path_image; FUN_IN_IMAGE]];
1967     ALL_TAC] THEN
1968   MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
1969    `integral (interval[vec 0,vec 1])
1970              (\y. path_integral g
1971                     (\x. f x (h y) * vector_derivative h (at y)))` THEN
1972   CONJ_TAC THENL
1973    [ALL_TAC;
1974     MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `y:real^1` THEN
1975     DISCH_TAC THEN REWRITE_TAC[] THEN
1976     MATCH_MP_TAC PATH_INTEGRAL_COMPLEX_RMUL THEN
1977     REWRITE_TAC[PATH_INTEGRABLE_ON] THEN
1978     MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
1979     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN ASM_REWRITE_TAC[] THEN
1980     SUBGOAL_THEN
1981      `(\t:real^1. (f:complex->complex->complex) (g t) (h y)) =
1982       (\z. f (fstcart z) (sndcart z)) o
1983       (\t. pastecart (g t) (h(y:real^1)))`
1984     SUBST1_TAC THENL
1985      [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART];
1986       ALL_TAC] THEN
1987     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
1988      [MATCH_MP_TAC CONTINUOUS_ON_PASTECART THEN
1989       ASM_SIMP_TAC[CONTINUOUS_ON_CONST; GSYM path; VALID_PATH_IMP_PATH];
1990       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1991          CONTINUOUS_ON_SUBSET)) THEN
1992       REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM] THEN
1993       ASM_SIMP_TAC[path_image; FUN_IN_IMAGE]]] THEN
1994   REWRITE_TAC[PATH_INTEGRAL_INTEGRAL] THEN
1995   W(MP_TAC o PART_MATCH (lhand o rand)
1996      INTEGRAL_SWAP_CONTINUOUS o lhs o snd) THEN
1997   REWRITE_TAC[] THEN ANTS_TAC THENL
1998    [ALL_TAC;
1999     DISCH_THEN(fun th -> GEN_REWRITE_TAC LAND_CONV [th]) THEN
2000     REPEAT(MATCH_MP_TAC INTEGRAL_EQ THEN
2001            REWRITE_TAC[] THEN REPEAT STRIP_TAC) THEN
2002     REWRITE_TAC[COMPLEX_MUL_AC]] THEN
2003   REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC) THENL
2004    [ALL_TAC;
2005     SUBGOAL_THEN
2006      `(\z:real^(1,1)finite_sum. vector_derivative g (at (fstcart z))) =
2007       (\t. vector_derivative (g:real^1->complex) (at t)) o fstcart`
2008     SUBST1_TAC THENL [REWRITE_TAC[o_DEF]; ALL_TAC] THEN
2009     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
2010     SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_FSTCART] THEN
2011     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
2012         CONTINUOUS_ON_SUBSET)) THEN
2013     SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM; PCROSS;
2014              FORALL_PASTECART; GSYM PCROSS_INTERVAL; FSTCART_PASTECART];
2015     SUBGOAL_THEN
2016      `(\z:real^(1,1)finite_sum. vector_derivative h (at (sndcart z))) =
2017       (\t. vector_derivative (h:real^1->complex) (at t)) o sndcart`
2018     SUBST1_TAC THENL [REWRITE_TAC[o_DEF]; ALL_TAC] THEN
2019     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
2020     SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_SNDCART] THEN
2021     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
2022         CONTINUOUS_ON_SUBSET)) THEN
2023     SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM; PCROSS;
2024           FORALL_PASTECART; GSYM PCROSS_INTERVAL; SNDCART_PASTECART]] THEN
2025   SUBGOAL_THEN
2026    `(\z. f (g (fstcart z)) (h (sndcart z))) =
2027     (\y. (f:complex->complex->complex) (fstcart y) (sndcart y)) o
2028     (\p. pastecart (g(fstcart p:real^1)) (h(sndcart p:real^1)))`
2029   SUBST1_TAC THENL
2030    [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART]; ALL_TAC] THEN
2031   MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
2032    [MATCH_MP_TAC CONTINUOUS_ON_PASTECART THEN
2033     CONJ_TAC THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
2034     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
2035     SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_FSTCART; LINEAR_SNDCART] THEN
2036     REWRITE_TAC[GSYM PCROSS_INTERVAL; PCROSS; GSYM SIMPLE_IMAGE] THEN
2037     REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART;
2038                 SET_RULE `{f x | x IN {g a b | P a /\ Q b}} =
2039                           {f(g a b) | P a /\ Q b}`] THEN
2040     REPEAT(FIRST_X_ASSUM(ASSUME_TAC o REWRITE_RULE[path] o
2041         MATCH_MP VALID_PATH_IMP_PATH)) THEN
2042     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
2043       CONTINUOUS_ON_SUBSET)) THEN
2044     SIMP_TAC[SUBSET; FORALL_IN_GSPEC];
2045     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
2046       CONTINUOUS_ON_SUBSET)) THEN
2047     REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM;
2048                 FORALL_PASTECART; GSYM PCROSS_INTERVAL; PCROSS;
2049                 path_image; FSTCART_PASTECART; SNDCART_PASTECART] THEN
2050     SIMP_TAC[FUN_IN_IMAGE]]);;
2051
2052 (* ------------------------------------------------------------------------- *)
2053 (* The key quadrisection step.                                               *)
2054 (* ------------------------------------------------------------------------- *)
2055
2056 let NORM_SUM_LEMMA = prove
2057  (`norm(a + b + c + d:complex) >= e
2058    ==> norm(a) >= e / &4 \/
2059        norm(b) >= e / &4 \/
2060        norm(c) >= e / &4 \/
2061        norm(d) >= e / &4`,
2062   NORM_ARITH_TAC);;
2063
2064 let CAUCHY_THEOREM_QUADRISECTION = prove
2065  (`!f a b c e K.
2066         f continuous_on (convex hull {a,b,c}) /\
2067         dist (a,b) <= K /\
2068         dist (b,c) <= K /\
2069         dist (c,a) <= K /\
2070         norm(path_integral(linepath(a,b)) f +
2071              path_integral(linepath(b,c)) f +
2072              path_integral(linepath(c,a)) f) >= e * K pow 2
2073         ==> ?a' b' c'. a' IN convex hull {a,b,c} /\
2074                        b' IN convex hull {a,b,c} /\
2075                        c' IN convex hull {a,b,c} /\
2076                        dist(a',b') <= K / &2 /\
2077                        dist(b',c') <= K / &2 /\
2078                        dist(c',a') <= K / &2 /\
2079                        norm(path_integral(linepath(a',b')) f +
2080                             path_integral(linepath(b',c')) f +
2081                             path_integral(linepath(c',a')) f)
2082                         >= e * (K / &2) pow 2`,
2083   REPEAT STRIP_TAC THEN MAP_EVERY ABBREV_TAC
2084    [`a':complex = midpoint(b,c)`;
2085     `b':complex = midpoint(c,a)`;
2086     `c':complex = midpoint(a,b)`] THEN
2087   SUBGOAL_THEN
2088    `path_integral(linepath(a,b)) f +
2089     path_integral(linepath(b,c)) f +
2090     path_integral(linepath(c,a)) f =
2091     (path_integral(linepath(a,c')) f +
2092      path_integral(linepath(c',b')) f +
2093      path_integral(linepath(b',a)) f) +
2094     (path_integral(linepath(a',c')) f +
2095      path_integral(linepath(c',b)) f +
2096      path_integral(linepath(b,a')) f) +
2097     (path_integral(linepath(a',c)) f +
2098      path_integral(linepath(c,b')) f +
2099      path_integral(linepath(b',a')) f) +
2100     (path_integral(linepath(a',b')) f +
2101      path_integral(linepath(b',c')) f +
2102      path_integral(linepath(c',a')) f)`
2103   SUBST_ALL_TAC THENL
2104    [MP_TAC(SPEC `f:complex->complex` PATH_INTEGRAL_MIDPOINT) THEN DISCH_THEN
2105      (fun th -> MP_TAC(SPECL [`a:complex`; `b:complex`] th) THEN
2106                 MP_TAC(SPECL [`b:complex`; `c:complex`] th) THEN
2107                 MP_TAC(SPECL [`c:complex`; `a:complex`] th)) THEN
2108     MP_TAC(SPEC `f:complex->complex` PATH_INTEGRAL_REVERSE_LINEPATH) THEN DISCH_THEN
2109      (fun th -> MP_TAC(SPECL [`a':complex`; `b':complex`] th) THEN
2110                 MP_TAC(SPECL [`b':complex`; `c':complex`] th) THEN
2111                 MP_TAC(SPECL [`c':complex`; `a':complex`] th)) THEN
2112     ASM_REWRITE_TAC[] THEN
2113     REPEAT(MATCH_MP_TAC(TAUT
2114      `((a /\ c ==> b /\ d) ==> e) ==> (a ==> b) ==> (c ==> d) ==> e`)) THEN
2115     ANTS_TAC THENL [ALL_TAC; CONV_TAC COMPLEX_RING] THEN
2116     REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2117     REPEAT CONJ_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2118     EXISTS_TAC `convex hull {a:complex,b,c}` THEN ASM_REWRITE_TAC[] THEN
2119     MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2120     SIMP_TAC[IN_INSERT; NOT_IN_EMPTY;
2121              TAUT `(a \/ b ==> c) <=> (a ==> c) /\ (b ==> c)`] THEN
2122     MAP_EVERY EXPAND_TAC ["a'"; "b'"; "c'"] THEN
2123     SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT];
2124     ALL_TAC] THEN
2125   REWRITE_TAC[REAL_ARITH `e * (K / &2) pow 2 = (e * K pow 2) / &4`] THEN
2126   FIRST_X_ASSUM(MP_TAC o MATCH_MP NORM_SUM_LEMMA) THEN STRIP_TAC THENL
2127    [MAP_EVERY EXISTS_TAC [`a:complex`; `c':complex`; `b':complex`];
2128     MAP_EVERY EXISTS_TAC [`a':complex`; `c':complex`; `b:complex`];
2129     MAP_EVERY EXISTS_TAC [`a':complex`; `c:complex`; `b':complex`];
2130     MAP_EVERY EXISTS_TAC [`a':complex`; `b':complex`; `c':complex`]] THEN
2131   ASM_REWRITE_TAC[] THEN
2132   MAP_EVERY EXPAND_TAC ["a'"; "b'"; "c'"] THEN
2133   SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT] THEN
2134   REWRITE_TAC[midpoint; dist; GSYM VECTOR_SUB_LDISTRIB;
2135               VECTOR_ARITH `a - inv(&2) % (a + b) = inv(&2) % (a - b)`;
2136               VECTOR_ARITH `inv(&2) % (c + a) - a = inv(&2) % (c - a)`;
2137               VECTOR_ARITH `(a + b) - (c + a) = b - c`;
2138               VECTOR_ARITH `(b + c) - (c + a) = b - a`] THEN
2139   SIMP_TAC[NORM_MUL; REAL_ARITH `abs(inv(&2)) * x <= k / &2 <=> x <= k`] THEN
2140   ASM_REWRITE_TAC[GSYM dist] THEN ASM_MESON_TAC[DIST_SYM]);;
2141
2142 (* ------------------------------------------------------------------------- *)
2143 (* Yet at small enough scales this cannot be the case.                       *)
2144 (* ------------------------------------------------------------------------- *)
2145
2146 let TRIANGLE_POINTS_CLOSER = prove
2147  (`!a b c x y:real^N.
2148         x IN convex hull {a,b,c} /\
2149         y IN convex hull {a,b,c}
2150         ==> norm(x - y) <= norm(a - b) \/
2151             norm(x - y) <= norm(b - c) \/
2152             norm(x - y) <= norm(c - a)`,
2153   REPEAT STRIP_TAC THEN MP_TAC(ISPEC `{a:real^N,b,c}` SIMPLEX_EXTREMAL_LE) THEN
2154   REWRITE_TAC[FINITE_INSERT; FINITE_RULES; NOT_INSERT_EMPTY] THEN
2155   REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2156   REPEAT STRIP_TAC THEN
2157   FIRST_X_ASSUM(MP_TAC o SPECL [`x:real^N`; `y:real^N`]) THEN
2158   ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
2159   ASM_MESON_TAC[NORM_POS_LE; REAL_LE_TRANS; NORM_SUB]);;
2160
2161 let HOLOMORPHIC_POINT_SMALL_TRIANGLE = prove
2162  (`!f s x e.
2163         x IN s /\ f continuous_on s /\
2164         f complex_differentiable (at x within s) /\
2165         &0 < e
2166         ==> ?k. &0 < k /\
2167                 !a b c. dist(a,b) <= k /\ dist(b,c) <= k /\ dist(c,a) <= k /\
2168                         x IN convex hull {a,b,c} /\ convex hull {a,b,c} SUBSET s
2169                         ==> norm(path_integral(linepath(a,b)) f +
2170                                  path_integral(linepath(b,c)) f +
2171                                  path_integral(linepath(c,a)) f)
2172                             <= e * (dist(a,b) + dist(b,c) + dist(c,a)) pow 2`,
2173   REPEAT STRIP_TAC THEN
2174   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [complex_differentiable]) THEN
2175   DISCH_THEN(X_CHOOSE_THEN `f':complex` MP_TAC) THEN
2176   GEN_REWRITE_TAC LAND_CONV [has_complex_derivative] THEN
2177   REWRITE_TAC[HAS_DERIVATIVE_WITHIN_ALT] THEN
2178   DISCH_THEN(MP_TAC o SPEC `e:real` o CONJUNCT2) THEN
2179   ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
2180   GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV)
2181    [TAUT `a /\ b ==> c <=> b ==> a ==> c`] THEN
2182   REWRITE_TAC[APPROACHABLE_LT_LE] THEN
2183   ONCE_REWRITE_TAC[TAUT `b ==> a ==> c <=> a /\ b ==> c`] THEN
2184   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN STRIP_TAC THEN
2185   ASM_REWRITE_TAC[dist] THEN
2186   MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`; `c:complex`] THEN
2187   STRIP_TAC THEN
2188   SUBGOAL_THEN
2189    `path_integral (linepath(a,b)) f +
2190     path_integral (linepath(b,c)) f +
2191     path_integral (linepath(c,a)) f =
2192     path_integral (linepath(a,b)) (\y. f y - f x - f' * (y - x)) +
2193     path_integral (linepath(b,c)) (\y. f y - f x - f' * (y - x)) +
2194     path_integral (linepath(c,a)) (\y. f y - f x - f' * (y - x))`
2195   SUBST1_TAC THENL
2196    [SUBGOAL_THEN
2197      `path_integral (linepath(a,b)) (\y. f y - f x - f' * (y - x)) =
2198       path_integral (linepath(a,b)) f -
2199       path_integral (linepath(a,b)) (\y. f x + f' * (y - x)) /\
2200       path_integral (linepath(b,c)) (\y. f y - f x - f' * (y - x)) =
2201       path_integral (linepath(b,c)) f -
2202       path_integral (linepath(b,c)) (\y. f x + f' * (y - x)) /\
2203       path_integral (linepath(c,a)) (\y. f y - f x - f' * (y - x)) =
2204       path_integral (linepath(c,a)) f -
2205       path_integral (linepath(c,a)) (\y. f x + f' * (y - x))`
2206     (REPEAT_TCL CONJUNCTS_THEN SUBST1_TAC) THENL
2207      [REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a - b - c = a - (b + c)`] THEN
2208       REPEAT CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
2209       MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
2210       CONJ_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
2211       MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2212       MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2213       EXISTS_TAC `s:complex->bool` THEN
2214       ASM_SIMP_TAC[CONTINUOUS_ON_ID; CONTINUOUS_ON_ADD; CONTINUOUS_ON_CONST;
2215                    CONTINUOUS_ON_COMPLEX_MUL; CONTINUOUS_ON_SUB] THEN
2216       MATCH_MP_TAC SUBSET_TRANS THEN
2217       EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2218       ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2219       MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2220       REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
2221       ASM_SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT];
2222       ALL_TAC] THEN
2223     REWRITE_TAC[COMPLEX_RING
2224      `x + y + z = (x - x') + (y - y') + (z - z') <=>
2225       x' + y' + z' = Cx(&0)`] THEN
2226     MP_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`;
2227                    `f':complex`; `f x - f' * x`]
2228            TRIANGLE_LINEAR_HAS_CHAIN_INTEGRAL) THEN
2229     REWRITE_TAC[COMPLEX_RING
2230      `f' * x' + f x - f' * x = f x + f' * (x' - x)`] THEN
2231     DISCH_THEN(MP_TAC o MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2232     REWRITE_TAC[];
2233     ALL_TAC] THEN
2234   ONCE_REWRITE_TAC[NORM_SUB] THEN MATCH_MP_TAC(REAL_ARITH
2235    `&0 <= x * y /\ &0 <= x * z /\ &0 <= y * z /\
2236     a <= (e * (x + y + z)) * x +
2237          (e * (x + y + z)) * y +
2238          (e * (x + y + z)) * z
2239     ==> a <= e * (x + y + z) pow 2`) THEN
2240   SIMP_TAC[REAL_LE_MUL; NORM_POS_LE] THEN
2241   REPEAT(MATCH_MP_TAC NORM_TRIANGLE_LE THEN
2242          MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC) THEN
2243   (MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
2244    EXISTS_TAC `\y:complex. f y - f x - f' * (y - x)` THEN
2245    ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_ADD; REAL_LT_IMP_LE; NORM_POS_LE] THEN
2246    CONJ_TAC THENL
2247     [MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
2248      MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2249      MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
2250      ASM_SIMP_TAC[CONTINUOUS_ON_SUB; ETA_AX; CONTINUOUS_ON_COMPLEX_MUL;
2251                  CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
2252      MATCH_MP_TAC SUBSET_TRANS THEN
2253      EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2254      ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2255      MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2256      REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
2257      ASM_SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT];
2258      ALL_TAC] THEN
2259    X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
2260    MATCH_MP_TAC REAL_LE_TRANS THEN
2261    EXISTS_TAC `e * norm(y - x:complex)` THEN CONJ_TAC THENL
2262     [FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL
2263       [MATCH_MP_TAC(SET_RULE `!t. y IN t /\ t SUBSET s ==> y IN s`) THEN
2264        EXISTS_TAC `convex hull {a:complex,b,c}` THEN ASM_REWRITE_TAC[];
2265        MATCH_MP_TAC(REAL_ARITH
2266         `!n1 n2 n3. n1 <= d /\ n2 <= d /\ n3 <= d /\
2267                     (n <= n1 \/ n <= n2 \/ n <= n3)
2268                     ==> n <= d`) THEN
2269        MAP_EVERY EXISTS_TAC
2270         [`norm(a - b:complex)`; `norm(b - c:complex)`;
2271          `norm(c - a:complex)`] THEN
2272        ASM_REWRITE_TAC[] THEN MATCH_MP_TAC TRIANGLE_POINTS_CLOSER];
2273      ASM_SIMP_TAC[REAL_LE_LMUL_EQ] THEN
2274      ONCE_REWRITE_TAC[NORM_SUB] THEN
2275      MATCH_MP_TAC(REAL_ARITH
2276       `(x <= a \/ x <= b \/ x <= c) /\ (&0 <= a /\ &0 <= b /\ &0 <= c)
2277        ==> x <= a + b + c`) THEN
2278      REWRITE_TAC[NORM_POS_LE] THEN MATCH_MP_TAC TRIANGLE_POINTS_CLOSER THEN
2279      ASM_REWRITE_TAC[]] THEN
2280     REPEAT CONJ_TAC THEN
2281     FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
2282      `x IN s ==> s SUBSET t ==> x IN t`)) THEN
2283     REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2284     REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
2285     ASM_SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL;
2286                  IN_INSERT]));;
2287
2288 (* ------------------------------------------------------------------------- *)
2289 (* Hence the most basic theorem for a triangle.                              *)
2290 (* ------------------------------------------------------------------------- *)
2291
2292 let CAUCHY_THEOREM_TRIANGLE = prove
2293  (`!f a b c.
2294         f holomorphic_on (convex hull {a,b,c})
2295         ==> (f has_path_integral Cx(&0))
2296             (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`,
2297   let lemma1 = prove
2298    (`!P Q abc.
2299           P abc 0 /\
2300           (!abc:A n. P abc n ==> ?abc'. P abc' (SUC n) /\ Q abc' abc)
2301           ==> ?ABC. ABC 0 = abc /\ !n. P (ABC n) n /\ Q (ABC(SUC n)) (ABC n)`,
2302     REPEAT STRIP_TAC THEN
2303     (MP_TAC o prove_recursive_functions_exist num_RECURSION)
2304       `ABC 0 = abc:A /\
2305        !n. ABC(SUC n) = @abc. P abc (SUC n) /\ Q abc (ABC n)` THEN
2306     MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN
2307     STRIP_TAC THEN CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
2308     REWRITE_TAC[FORALL_AND_THM] THEN
2309     MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
2310      [INDUCT_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; ALL_TAC] THEN
2311     DISCH_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]) in
2312   let lemma3 = prove
2313    (`!P Q a:A b:A c:A.
2314           P a b c 0 /\
2315           (!a b c n. P a b c n
2316                      ==> ?a' b' c'. P a' b' c' (SUC n) /\ Q a' b' c' a b c)
2317           ==> ?A B C. A 0 = a /\ B 0 = b /\ C 0 = c /\
2318                       !n. P (A n) (B n) (C n) n /\
2319                           Q (A(SUC n)) (B(SUC n)) (C(SUC n)) (A n) (B n) (C n)`,
2320     REPEAT STRIP_TAC THEN
2321     MP_TAC(ISPECL
2322      [`\(a,b,c). (P:A->A->A->num->bool) a b c`;
2323       `\(a,b,c) (a',b',c'). (Q:A->A->A->A->A->A->bool) a b c a' b' c'`;
2324       `(a:A,b:A,c:A)`]
2325           lemma1) THEN
2326     REWRITE_TAC[FORALL_PAIR_THM; EXISTS_PAIR_THM] THEN
2327     ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
2328     DISCH_THEN(X_CHOOSE_THEN `ABC:num->A#A#A` STRIP_ASSUME_TAC) THEN
2329     MAP_EVERY EXISTS_TAC
2330      [`(\(a,b,c). a) o (ABC:num->A#A#A)`;
2331       `(\(a,b,c). b) o (ABC:num->A#A#A)`;
2332       `(\(a,b,c). c) o (ABC:num->A#A#A)`] THEN
2333     REWRITE_TAC[o_THM] THEN
2334     REPEAT(CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC]) THEN
2335     X_GEN_TAC `n:num` THEN
2336     FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN
2337     SPEC_TAC(`(ABC:num->A#A#A) (SUC n)`,`y:A#A#A`) THEN
2338     SPEC_TAC(`(ABC:num->A#A#A) n`,`x:A#A#A`) THEN
2339     REWRITE_TAC[FORALL_PAIR_THM]) in
2340   REPEAT STRIP_TAC THEN
2341   STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2342                 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2343   FIRST_ASSUM(ASSUME_TAC o MATCH_MP HOLOMORPHIC_ON_IMP_CONTINUOUS_ON) THEN
2344   SUBGOAL_THEN
2345    `f path_integrable_on (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`
2346   MP_TAC THENL
2347    [SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN; VALID_PATH_LINEPATH;
2348              PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
2349              PATHFINISH_LINEPATH] THEN
2350     ASM_MESON_TAC[PATH_INTEGRABLE_CONTINUOUS_LINEPATH; CONTINUOUS_ON_SUBSET];
2351     ALL_TAC] THEN
2352   SIMP_TAC[path_integrable_on] THEN DISCH_THEN(X_CHOOSE_TAC `y:complex`) THEN
2353   ASM_CASES_TAC `y = Cx(&0)` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
2354   ABBREV_TAC
2355    `K = &1 + max (dist(a:complex,b)) (max (dist(b,c)) (dist(c,a)))` THEN
2356   SUBGOAL_THEN `&0 < K` ASSUME_TAC THENL
2357    [EXPAND_TAC "K" THEN MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < &1 + x`) THEN
2358     REWRITE_TAC[REAL_LE_MAX; DIST_POS_LE];
2359     ALL_TAC] THEN
2360   ABBREV_TAC `e = norm(y:complex) / K pow 2` THEN
2361   SUBGOAL_THEN `&0 < e` ASSUME_TAC THENL
2362    [EXPAND_TAC "e" THEN
2363     ASM_SIMP_TAC[REAL_LT_DIV; REAL_POW_LT; COMPLEX_NORM_NZ];
2364     ALL_TAC] THEN
2365   SUBGOAL_THEN
2366    `?A B C. A 0 = a /\ B 0 = b /\ C 0 = c /\
2367             !n. (convex hull {A n,B n,C n} SUBSET convex hull {a,b,c} /\
2368                  dist(A n,B n) <= K / &2 pow n /\
2369                  dist(B n,C n) <= K / &2 pow n /\
2370                  dist(C n,A n) <= K / &2 pow n /\
2371                  norm(path_integral(linepath (A n,B n)) f +
2372                       path_integral(linepath (B n,C n)) f +
2373                       path_integral(linepath (C n,A n)) f) >=
2374                  e * (K / &2 pow n) pow 2) /\
2375                 convex hull {A(SUC n),B(SUC n),C(SUC n)} SUBSET
2376                 convex hull {A n,B n,C n}`
2377   MP_TAC THENL
2378    [MATCH_MP_TAC lemma3 THEN CONJ_TAC THENL
2379      [ASM_REWRITE_TAC[real_pow; REAL_DIV_1; CONJ_ASSOC; SUBSET_REFL] THEN
2380       CONJ_TAC THENL [EXPAND_TAC "K" THEN REAL_ARITH_TAC; ALL_TAC] THEN
2381       EXPAND_TAC "e" THEN
2382       ASM_SIMP_TAC[REAL_DIV_RMUL; REAL_LT_IMP_NZ; REAL_POW_LT] THEN
2383       MATCH_MP_TAC(REAL_ARITH `x = y ==> x >= y`) THEN AP_TERM_TAC THEN
2384       FIRST_ASSUM(SUBST1_TAC o SYM o
2385         MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2386       REWRITE_TAC[];
2387       ALL_TAC] THEN
2388     MAP_EVERY X_GEN_TAC
2389      [`a':complex`; `b':complex`; `c':complex`; `n:num`] THEN
2390     REPEAT STRIP_TAC THEN
2391     MP_TAC(SPECL [`f:complex->complex`; `a':complex`; `b':complex`;
2392        `c':complex`; `e:real`; `K / &2 pow n`]
2393        CAUCHY_THEOREM_QUADRISECTION) THEN
2394     ASM_REWRITE_TAC[] THEN
2395     ANTS_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2396     REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN STRIP_TAC THEN
2397     ASM_REWRITE_TAC[real_pow; REAL_FIELD `x / (&2 * y) = x / y / &2`] THEN
2398     MATCH_MP_TAC(SET_RULE
2399      `s SUBSET t /\ t SUBSET u ==> s SUBSET u /\ s SUBSET t`) THEN
2400     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2401     ASM SET_TAC[];
2402     ALL_TAC] THEN
2403   REWRITE_TAC[FORALL_AND_THM] THEN STRIP_TAC THEN
2404   SUBGOAL_THEN
2405    `?x:complex. !n:num. x IN convex hull {A n,B n,C n}`
2406   STRIP_ASSUME_TAC THENL
2407    [MATCH_MP_TAC BOUNDED_CLOSED_NEST THEN REPEAT CONJ_TAC THENL
2408      [GEN_TAC THEN MATCH_MP_TAC COMPACT_IMP_CLOSED;
2409       REWRITE_TAC[CONVEX_HULL_EQ_EMPTY; NOT_INSERT_EMPTY];
2410       MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN ASM_REWRITE_TAC[] THEN
2411       MESON_TAC[SUBSET_REFL; SUBSET_TRANS];
2412       MATCH_MP_TAC COMPACT_IMP_BOUNDED] THEN
2413     MATCH_MP_TAC FINITE_IMP_COMPACT_CONVEX_HULL THEN
2414     REWRITE_TAC[FINITE_INSERT; FINITE_RULES];
2415     ALL_TAC] THEN
2416   MP_TAC(ISPECL [`f:complex->complex`; `convex hull {a:complex,b,c}`;
2417                  `x:complex`; `e / &10`] HOLOMORPHIC_POINT_SMALL_TRIANGLE) THEN
2418   ANTS_TAC THENL
2419    [ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; complex_differentiable] THEN
2420     ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
2421     ASM_MESON_TAC[holomorphic_on; SUBSET];
2422     ALL_TAC] THEN
2423   DISCH_THEN(X_CHOOSE_THEN `k:real` STRIP_ASSUME_TAC) THEN
2424   MP_TAC(SPEC `K:real / k` REAL_ARCH_POW2) THEN
2425   ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN
2426   ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2427   SIMP_TAC[GSYM REAL_LT_LDIV_EQ; REAL_POW_LT; REAL_OF_NUM_LT; ARITH] THEN
2428   DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN FIRST_X_ASSUM(MP_TAC o SPECL
2429    [`(A:num->complex) n`; `(B:num->complex) n`; `(C:num->complex) n`]) THEN
2430   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
2431    [ASM_MESON_TAC[REAL_LE_TRANS; REAL_LT_IMP_LE]; ALL_TAC] THEN
2432   ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN DISCH_THEN(K ALL_TAC) THEN
2433   REWRITE_TAC[REAL_NOT_LE] THEN
2434   MATCH_MP_TAC REAL_LTE_TRANS THEN
2435   EXISTS_TAC `e * (K / &2 pow n) pow 2` THEN
2436   CONJ_TAC THENL [ALL_TAC; ASM_REWRITE_TAC[GSYM real_ge]] THEN
2437   ASM_SIMP_TAC[real_div; GSYM REAL_MUL_ASSOC; REAL_LT_LMUL_EQ] THEN
2438   MATCH_MP_TAC(REAL_ARITH
2439    `&0 < x /\ y <= &9 * x ==> inv(&10) * y < x`) THEN
2440   ASM_SIMP_TAC[REAL_POW_LT; REAL_LT_MUL; REAL_LT_INV_EQ;
2441                 REAL_OF_NUM_LT; ARITH] THEN
2442   REWRITE_TAC[REAL_ARITH `&9 * x pow 2 = (&3 * x) pow 2`] THEN
2443   MATCH_MP_TAC REAL_POW_LE2 THEN
2444   SIMP_TAC[REAL_LE_ADD; DIST_POS_LE; GSYM real_div] THEN
2445   MATCH_MP_TAC(REAL_ARITH
2446    `x <= a /\ y <= a /\ z <= a ==> x + y + z <= &3 * a`) THEN
2447   ASM_REWRITE_TAC[]);;
2448
2449 (* ------------------------------------------------------------------------- *)
2450 (* Version needing function holomorphic in interior only.                    *)
2451 (* ------------------------------------------------------------------------- *)
2452
2453 let CAUCHY_THEOREM_FLAT_LEMMA = prove
2454  (`!f a b c k.
2455         f continuous_on convex hull {a,b,c} /\ c - a = k % (b - a) /\ &0 <= k
2456         ==> path_integral (linepath(a,b)) f +
2457             path_integral (linepath(b,c)) f +
2458             path_integral (linepath(c,a)) f = Cx(&0)`,
2459   REPEAT STRIP_TAC THEN
2460   STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2461                 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2462   ASM_CASES_TAC `k <= &1` THENL
2463    [MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `b:complex`; `c:complex`;
2464                   `k:real`] PATH_INTEGRAL_SPLIT) THEN
2465     ASM_REWRITE_TAC[] THEN
2466     ANTS_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2467     DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC(COMPLEX_RING
2468      `x = --b /\ y = --a ==> (x + y) + (a + b) = Cx(&0)`) THEN
2469     CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_REVERSE_LINEPATH THEN
2470     ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
2471     MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `c:complex`; `b:complex`;
2472                   `inv k:real`] PATH_INTEGRAL_SPLIT) THEN
2473     ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_LE_INV_EQ; REAL_MUL_LINV; REAL_INV_LE_1;
2474       VECTOR_MUL_LID; REAL_ARITH `~(k <= &1) ==> ~(k = &0) /\ &1 <= k`] THEN
2475     ANTS_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2476     MATCH_MP_TAC(COMPLEX_RING
2477      `ac = --ca ==> ac = ab + bc ==> ab + bc + ca = Cx(&0)`) THEN
2478     MATCH_MP_TAC PATH_INTEGRAL_REVERSE_LINEPATH THEN
2479     ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]]);;
2480
2481 let CAUCHY_THEOREM_FLAT = prove
2482  (`!f a b c k.
2483         f continuous_on convex hull {a,b,c} /\ c - a = k % (b - a)
2484         ==> path_integral (linepath(a,b)) f +
2485             path_integral (linepath(b,c)) f +
2486             path_integral (linepath(c,a)) f = Cx(&0)`,
2487   REPEAT STRIP_TAC THEN ASM_CASES_TAC `&0 <= k` THENL
2488    [ASM_MESON_TAC[CAUCHY_THEOREM_FLAT_LEMMA]; ALL_TAC] THEN
2489   STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2490                 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2491   MP_TAC(ISPECL [`f:complex->complex`; `b:complex`; `a:complex`; `c:complex`;
2492                  `&1 - k`] CAUCHY_THEOREM_FLAT_LEMMA) THEN
2493   ANTS_TAC THENL
2494    [ASM_MESON_TAC[INSERT_AC; REAL_ARITH `~(&0 <= k) ==> &0 <= &1 - k`;
2495          VECTOR_ARITH `b - a = k % (c - a) ==> (b - c) = (&1 - k) % (a - c)`];
2496     ALL_TAC] THEN
2497   MATCH_MP_TAC(COMPLEX_RING
2498      `ab = --ba /\ ac = --ca /\ bc = --cb
2499       ==> ba + ac + cb = Cx(&0) ==> ab + bc + ca = Cx(&0)`) THEN
2500   REPEAT CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_REVERSE_LINEPATH THEN
2501   ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]);;
2502
2503 let CAUCHY_THEOREM_TRIANGLE_INTERIOR = prove
2504  (`!f a b c.
2505         f continuous_on (convex hull {a,b,c}) /\
2506         f holomorphic_on interior (convex hull {a,b,c})
2507         ==> (f has_path_integral Cx(&0))
2508             (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`,
2509   REPEAT STRIP_TAC THEN
2510   STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2511                 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2512   SUBGOAL_THEN
2513     `?B. &0 < B /\
2514          !y. y IN IMAGE (f:complex->complex) (convex hull {a,b,c})
2515              ==> norm(y) <= B`
2516   MP_TAC THENL
2517    [REWRITE_TAC[GSYM BOUNDED_POS] THEN MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
2518     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
2519     ASM_SIMP_TAC[FINITE_IMP_COMPACT_CONVEX_HULL; FINITE_INSERT; FINITE_RULES];
2520     REWRITE_TAC[FORALL_IN_IMAGE] THEN STRIP_TAC] THEN
2521   SUBGOAL_THEN
2522     `?C. &0 < C /\ !x:complex. x IN convex hull {a,b,c} ==> norm(x) <= C`
2523   MP_TAC THENL
2524    [REWRITE_TAC[GSYM BOUNDED_POS] THEN
2525     MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
2526     ASM_SIMP_TAC[FINITE_IMP_COMPACT_CONVEX_HULL; FINITE_INSERT; FINITE_RULES];
2527     STRIP_TAC] THEN
2528   SUBGOAL_THEN
2529    `(f:complex->complex) uniformly_continuous_on (convex hull {a,b,c})`
2530   MP_TAC THENL
2531    [MATCH_MP_TAC COMPACT_UNIFORMLY_CONTINUOUS THEN
2532     ASM_SIMP_TAC[FINITE_IMP_COMPACT_CONVEX_HULL; FINITE_RULES; FINITE_INSERT];
2533     ALL_TAC] THEN
2534   REWRITE_TAC[uniformly_continuous_on] THEN DISCH_TAC THEN
2535   SUBGOAL_THEN
2536    `f path_integrable_on
2537     (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`
2538   MP_TAC THENL
2539    [SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN; VALID_PATH_LINEPATH;
2540              PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
2541              PATHFINISH_LINEPATH] THEN
2542     ASM_MESON_TAC[PATH_INTEGRABLE_CONTINUOUS_LINEPATH; CONTINUOUS_ON_SUBSET];
2543     ALL_TAC] THEN
2544   SIMP_TAC[path_integrable_on] THEN DISCH_THEN(X_CHOOSE_TAC `y:complex`) THEN
2545   ASM_CASES_TAC `y = Cx(&0)` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
2546   UNDISCH_TAC `~(y = Cx(&0))` THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
2547   DISCH_THEN(K ALL_TAC) THEN REWRITE_TAC[] THEN
2548   FIRST_ASSUM(ASSUME_TAC o SYM o MATCH_MP
2549      HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2550   ASM_REWRITE_TAC[] THEN
2551   ASM_CASES_TAC `c:complex = a` THENL
2552    [MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2553     EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ];
2554     ALL_TAC] THEN
2555   ASM_CASES_TAC `b:complex = c` THENL
2556    [ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = c + a + b`] THEN
2557     MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2558     EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ] THEN
2559     ASM_MESON_TAC[INSERT_AC];
2560     ALL_TAC] THEN
2561   ASM_CASES_TAC `a:complex = b` THENL
2562    [ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = b + c + a`] THEN
2563     MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2564     EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ] THEN
2565     ASM_MESON_TAC[INSERT_AC];
2566     ALL_TAC] THEN
2567   ASM_CASES_TAC `interior(convex hull {a:complex,b,c}) = {}` THENL
2568    [MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2569     SUBGOAL_THEN `{a:complex,b,c} HAS_SIZE (dimindex(:2) + 1)`
2570     MP_TAC THENL
2571      [ASM_SIMP_TAC[HAS_SIZE; CARD_CLAUSES; FINITE_INSERT; FINITE_EMPTY] THEN
2572       ASM_REWRITE_TAC[DIMINDEX_2; ARITH; IN_INSERT; NOT_IN_EMPTY];
2573       ALL_TAC] THEN
2574     DISCH_THEN(MP_TAC o MATCH_MP INTERIOR_CONVEX_HULL_EQ_EMPTY) THEN
2575     ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
2576     SUBGOAL_THEN `collinear{a:complex,b,c}` MP_TAC THENL
2577      [ASM_REWRITE_TAC[COLLINEAR_3_EQ_AFFINE_DEPENDENT]; ALL_TAC] THEN
2578     ONCE_REWRITE_TAC[SET_RULE `{a,b,c} = {b,a,c}`] THEN
2579     ONCE_REWRITE_TAC[COLLINEAR_3] THEN
2580     ASM_REWRITE_TAC[COLLINEAR_LEMMA; VECTOR_SUB_EQ];
2581     ALL_TAC] THEN
2582   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
2583   DISCH_THEN(X_CHOOSE_TAC `d:complex`) THEN FIRST_X_ASSUM(MP_TAC o SYM) THEN
2584   DISCH_TAC THEN
2585   ASM_REWRITE_TAC[] THEN ASM_CASES_TAC `y = Cx(&0)` THEN ASM_REWRITE_TAC[] THEN
2586   FIRST_X_ASSUM(MP_TAC o SPEC `norm(y:complex) / &24 / C`) THEN
2587   SUBGOAL_THEN `&0 < norm(y:complex) / &24 / C` ASSUME_TAC THENL
2588    [ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH; NORM_POS_LE; REAL_LTE_ADD;
2589                  COMPLEX_NORM_NZ; COMPLEX_SUB_0];
2590     ASM_REWRITE_TAC[dist]] THEN
2591   DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN ABBREV_TAC
2592    `e = min (&1)
2593             (min (d1 / (&4 * C))
2594                  ((norm(y:complex) / &24 / C) / B))` THEN
2595   SUBGOAL_THEN `&0 < e` ASSUME_TAC THENL
2596    [EXPAND_TAC "e" THEN
2597     ASM_SIMP_TAC[REAL_HALF; REAL_LT_MIN; REAL_LT_DIV; COMPLEX_NORM_NZ;
2598                  REAL_LT_MUL; REAL_OF_NUM_LT; ARITH];
2599     ALL_TAC] THEN
2600   ABBREV_TAC `shrink = \x:complex. x - e % (x - d)` THEN
2601   SUBGOAL_THEN `shrink (a:complex) IN interior(convex hull {a,b,c}) /\
2602                 shrink b IN interior(convex hull {a,b,c}) /\
2603                 shrink c IN interior(convex hull {a,b,c})`
2604   STRIP_ASSUME_TAC THENL
2605    [REPEAT CONJ_TAC THEN EXPAND_TAC "shrink" THEN
2606     MATCH_MP_TAC IN_INTERIOR_CONVEX_SHRINK THEN
2607     ASM_REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
2608     (CONJ_TAC THENL [ALL_TAC; EXPAND_TAC "e" THEN REAL_ARITH_TAC]) THEN
2609     MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2610     REWRITE_TAC[IN_INSERT];
2611     ALL_TAC] THEN
2612   SUBGOAL_THEN
2613    `norm((path_integral(linepath(shrink a,shrink b)) f -
2614           path_integral(linepath(a,b)) f) +
2615          (path_integral(linepath(shrink b,shrink c)) f -
2616           path_integral(linepath(b,c)) f) +
2617          (path_integral(linepath(shrink c,shrink a)) f -
2618           path_integral(linepath(c,a)) f)) <= norm(y:complex) / &2`
2619   MP_TAC THENL
2620    [ALL_TAC;
2621     ASM_REWRITE_TAC[COMPLEX_RING
2622      `(ab' - ab) + (bc' - bc) + (ca' - ca) =
2623       (ab' + bc' + ca') - (ab + bc + ca)`] THEN
2624     SUBGOAL_THEN
2625      `(f has_path_integral (Cx(&0)))
2626       (linepath (shrink a,shrink b) ++
2627        linepath (shrink b,shrink c) ++
2628        linepath (shrink c,shrink (a:complex)))`
2629     MP_TAC THENL
2630      [MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE THEN
2631       MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
2632       EXISTS_TAC `interior(convex hull {a:complex,b,c})` THEN
2633       ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HULL_MINIMAL THEN
2634       SIMP_TAC[CONVEX_INTERIOR; CONVEX_CONVEX_HULL] THEN
2635       ASM SET_TAC[];
2636       ALL_TAC] THEN
2637     DISCH_THEN(MP_TAC o MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2638     SIMP_TAC[] THEN DISCH_THEN(K ALL_TAC) THEN
2639     REWRITE_TAC[COMPLEX_SUB_LZERO; NORM_NEG] THEN
2640     MATCH_MP_TAC(REAL_ARITH `&0 <= y /\ ~(y = &0) ==> ~(y <= y / &2)`) THEN
2641     ASM_REWRITE_TAC[COMPLEX_NORM_ZERO; NORM_POS_LE]] THEN
2642   SUBGOAL_THEN
2643    `!x y. x IN convex hull {a,b,c} /\ y IN convex hull {a,b,c}
2644           ==> norm(x - y) <= &2 * C`
2645   ASSUME_TAC THENL
2646    [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_MUL_2; VECTOR_SUB] THEN
2647     MATCH_MP_TAC NORM_TRIANGLE_LE THEN REWRITE_TAC[NORM_NEG] THEN
2648     MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_SIMP_TAC[];
2649     ALL_TAC] THEN
2650   REWRITE_TAC[REAL_ARITH `x / &2 = x / &6 + x / &6 + x / &6`] THEN
2651   REPEAT(MATCH_MP_TAC NORM_TRIANGLE_LE THEN
2652          MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC) THEN
2653   GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
2654   GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM CONTENT_UNIT_1] THEN
2655   MATCH_MP_TAC HAS_INTEGRAL_BOUND THENL
2656    [EXISTS_TAC `\x. f(linepath(shrink a,shrink b) x) *
2657                     (shrink b - shrink a) -
2658                     f(linepath(a,b) x) * (b - a)`;
2659     EXISTS_TAC `\x. f(linepath(shrink b,shrink c) x) *
2660                     (shrink c - shrink b) -
2661                     f(linepath(b,c) x) * (c - b)`;
2662     EXISTS_TAC `\x. f(linepath(shrink c,shrink a) x) *
2663                     (shrink a - shrink c) -
2664                     f(linepath(c,a) x) * (a - c)`] THEN
2665   ASM_SIMP_TAC[COMPLEX_NORM_NZ; REAL_ARITH `&0 < x ==> &0 <= x / &6`] THEN
2666   (CONJ_TAC THENL
2667     [MATCH_MP_TAC HAS_INTEGRAL_SUB THEN
2668      REWRITE_TAC[GSYM HAS_PATH_INTEGRAL_LINEPATH] THEN
2669      CONJ_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
2670      MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2671      MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2672      EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2673      ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2674      MATCH_MP_TAC HULL_MINIMAL THEN
2675      REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET; IN_INSERT; NOT_IN_EMPTY] THEN
2676      ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
2677      ALL_TAC] THEN
2678    REPEAT STRIP_TAC THEN
2679    ONCE_REWRITE_TAC[COMPLEX_RING
2680     `f' * x' - f * x = f' * (x' - x) + x * (f' - f):complex`] THEN
2681    MATCH_MP_TAC NORM_TRIANGLE_LE THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
2682    MATCH_MP_TAC REAL_LE_TRANS THEN
2683    EXISTS_TAC `B * (norm(y:complex) / &24 / C / B) * &2 * C +
2684                (&2 * C) * (norm y / &24 / C)` THEN
2685    CONJ_TAC THENL
2686     [ALL_TAC;
2687      MATCH_MP_TAC REAL_EQ_IMP_LE THEN
2688      MAP_EVERY UNDISCH_TAC [`&0 < B`; `&0 < C`] THEN CONV_TAC REAL_FIELD] THEN
2689    MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THEN
2690    MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THENL
2691     [CONJ_TAC THENL
2692       [FIRST_X_ASSUM MATCH_MP_TAC THEN
2693        W(fun (asl,w) ->
2694          MP_TAC(PART_MATCH (lhand o rand) LINEPATH_IN_PATH (lhand w))) THEN
2695        ASM_REWRITE_TAC[] THEN
2696        W(fun (asl,w) -> SPEC_TAC(lhand(rand w),`x:complex`)) THEN
2697        REWRITE_TAC[GSYM SUBSET; SEGMENT_CONVEX_HULL] THEN
2698        MATCH_MP_TAC HULL_MINIMAL THEN
2699        REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET; IN_INSERT; NOT_IN_EMPTY] THEN
2700        ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
2701        ALL_TAC] THEN
2702      EXPAND_TAC "shrink" THEN
2703      REWRITE_TAC[VECTOR_ARITH `(b - e % (b - d)) - (a - e % (a - d)) -
2704                            (b - a) = e % (a - b)`] THEN
2705      REWRITE_TAC[NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
2706      ASM_SIMP_TAC[NORM_POS_LE; REAL_ARITH `&0 < x ==> abs x = x`;
2707                   REAL_ABS_POS] THEN
2708      CONJ_TAC THENL [EXPAND_TAC "e" THEN REAL_ARITH_TAC; ALL_TAC] THEN
2709      FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THEN
2710      MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2711      REWRITE_TAC[IN_INSERT];
2712      ALL_TAC] THEN
2713    CONJ_TAC THENL
2714     [FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THEN
2715      MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2716      REWRITE_TAC[IN_INSERT];
2717      ALL_TAC] THEN
2718    MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2719    CONJ_TAC THENL
2720     [W(fun (asl,w) ->
2721        MP_TAC(PART_MATCH (lhand o rand) LINEPATH_IN_PATH (lhand w))) THEN
2722      ASM_MESON_TAC[SUBSET];
2723      ALL_TAC] THEN
2724    CONJ_TAC THENL
2725     [W(fun (asl,w) ->
2726        MP_TAC(PART_MATCH (lhand o rand) LINEPATH_IN_PATH (lhand w))) THEN
2727      ASM_REWRITE_TAC[] THEN
2728      W(fun (asl,w) -> SPEC_TAC(lhand(rand w),`x:complex`)) THEN
2729      REWRITE_TAC[GSYM SUBSET; SEGMENT_CONVEX_HULL] THEN
2730      MATCH_MP_TAC HULL_MINIMAL THEN
2731      REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET; IN_INSERT; NOT_IN_EMPTY] THEN
2732      ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
2733      ALL_TAC] THEN
2734    REWRITE_TAC[linepath] THEN REWRITE_TAC[VECTOR_ARITH
2735      `((&1 - x) % a' + x % b') - ((&1 - x) % a + x % b) =
2736       (&1 - x) % (a' - a) + x % (b' - b)`] THEN
2737    EXPAND_TAC "shrink" THEN REWRITE_TAC[VECTOR_ARITH `a - b - a = --b`] THEN
2738    MATCH_MP_TAC NORM_TRIANGLE_LT THEN REWRITE_TAC[NORM_MUL; NORM_NEG] THEN
2739    MATCH_MP_TAC REAL_CONVEX_BOUND_LT THEN ONCE_REWRITE_TAC[TAUT
2740     `a /\ b /\ c /\ d /\ e <=> (c /\ d /\ e) /\ a /\ b`] THEN
2741    CONJ_TAC THENL
2742     [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
2743      REWRITE_TAC[DROP_VEC] THEN REAL_ARITH_TAC;
2744      ALL_TAC] THEN
2745    CONJ_TAC THEN
2746    MATCH_MP_TAC REAL_LET_TRANS THEN
2747    EXISTS_TAC `e * &2 * C` THEN
2748    ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH `&0 < x ==> abs x = x`] THEN
2749    (CONJ_TAC THENL
2750      [FIRST_X_ASSUM MATCH_MP_TAC THEN
2751       ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET; HULL_SUBSET; IN_INSERT];
2752       ALL_TAC]) THEN
2753    ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
2754    EXPAND_TAC "e" THEN REWRITE_TAC[REAL_MIN_LT] THEN
2755    DISJ2_TAC THEN DISJ1_TAC THEN
2756    REWRITE_TAC[REAL_FIELD `d / (a * b) = inv(a:real) * d / b`] THEN
2757    REWRITE_TAC[REAL_ARITH `inv(&4) * x < inv(&2) * x <=> &0 < x`] THEN
2758    ASM_SIMP_TAC[REAL_LT_DIV]));;
2759
2760 (* ------------------------------------------------------------------------- *)
2761 (* Version allowing finite number of exceptional points.                     *)
2762 (* ------------------------------------------------------------------------- *)
2763
2764 let CAUCHY_THEOREM_TRIANGLE_COFINITE = prove
2765  (`!f s a b c.
2766         f continuous_on (convex hull {a,b,c}) /\
2767         FINITE s /\
2768         (!x. x IN interior(convex hull {a,b,c}) DIFF s
2769              ==> f complex_differentiable (at x))
2770         ==> (f has_path_integral Cx(&0))
2771             (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`,
2772   GEN_TAC THEN GEN_TAC THEN WF_INDUCT_TAC `CARD(s:complex->bool)` THEN
2773   REPEAT STRIP_TAC THEN ASM_CASES_TAC `s:complex->bool = {}` THENL
2774    [MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_INTERIOR THEN
2775     ASM_REWRITE_TAC[holomorphic_on] THEN X_GEN_TAC `z:complex` THEN
2776     DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
2777     ASM_REWRITE_TAC[complex_differentiable; IN_DIFF; NOT_IN_EMPTY] THEN
2778     MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
2779     ALL_TAC] THEN
2780   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
2781   DISCH_THEN(X_CHOOSE_TAC `d:complex`) THEN
2782   FIRST_X_ASSUM(MP_TAC o SPEC `s DELETE (d:complex)`) THEN
2783   ASM_SIMP_TAC[CARD_DELETE; CARD_EQ_0;
2784                  ARITH_RULE `n - 1 < n <=> ~(n = 0)`] THEN
2785   ASM_CASES_TAC `(d:complex) IN convex hull {a,b,c}` THENL
2786    [ALL_TAC;
2787     DISCH_THEN MATCH_MP_TAC THEN
2788     ASM_REWRITE_TAC[FINITE_DELETE; IN_DIFF; IN_DELETE] THEN
2789     REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2790     ASM_REWRITE_TAC[IN_DIFF] THEN ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET]] THEN
2791   DISCH_TAC THEN SUBGOAL_THEN
2792    `(f has_path_integral Cx(&0))
2793     (linepath(a,b) ++ linepath(b,d) ++ linepath(d,a)) /\
2794     (f has_path_integral Cx(&0))
2795     (linepath(b,c) ++ linepath(c,d) ++ linepath(d,b)) /\
2796     (f has_path_integral Cx(&0))
2797     (linepath(c,a) ++ linepath(a,d) ++ linepath(d,c))`
2798   MP_TAC THENL
2799    [RULE_ASSUM_TAC(REWRITE_RULE[IMP_IMP; RIGHT_IMP_FORALL_THM]) THEN
2800     REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2801     ASM_REWRITE_TAC[FINITE_DELETE] THEN
2802     (CONJ_TAC THENL
2803       [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2804        EXISTS_TAC `convex hull {a:complex,b,c}` THEN ASM_REWRITE_TAC[] THEN
2805        MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2806        REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2807        REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2808        MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2809        REWRITE_TAC[IN_INSERT];
2810        ALL_TAC]) THEN
2811     ASM_REWRITE_TAC[FINITE_DELETE; IN_DIFF; IN_DELETE] THEN
2812     REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2813     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [DE_MORGAN_THM]) THEN
2814     (ASM_CASES_TAC `x:complex = d` THEN ASM_REWRITE_TAC[] THENL
2815       [ASM_MESON_TAC[NOT_IN_INTERIOR_CONVEX_HULL_3]; ALL_TAC]) THEN
2816     DISCH_TAC THEN ASM_REWRITE_TAC[IN_DIFF] THEN
2817     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
2818      `x IN interior s
2819       ==> interior s SUBSET interior t ==> x IN interior t`)) THEN
2820     MATCH_MP_TAC SUBSET_INTERIOR THEN
2821     MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2822     SIMP_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2823     REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2824     MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN REWRITE_TAC[IN_INSERT];
2825     ALL_TAC] THEN
2826   SUBGOAL_THEN
2827    `f path_integrable_on
2828     (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`
2829   MP_TAC THENL
2830    [SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN; VALID_PATH_LINEPATH;
2831              PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
2832              PATHFINISH_LINEPATH] THEN
2833     STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2834                   SEGMENTS_SUBSET_CONVEX_HULL) THEN
2835     ASM_MESON_TAC[PATH_INTEGRABLE_CONTINUOUS_LINEPATH; CONTINUOUS_ON_SUBSET];
2836     ALL_TAC] THEN
2837   REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
2838   X_GEN_TAC `y:complex` THEN
2839   DISCH_THEN(fun th -> ASSUME_TAC th THEN MP_TAC th) THEN
2840   REWRITE_TAC[IMP_IMP] THEN
2841   DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN
2842    (MP_TAC o MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL)) THEN
2843   ASM_CASES_TAC `y = Cx(&0)` THEN ASM_REWRITE_TAC[] THENL
2844    [ASM_MESON_TAC[]; UNDISCH_TAC `~(y = Cx(&0))`] THEN
2845   REWRITE_TAC[] THEN
2846   SUBGOAL_THEN `(f:complex->complex) continuous_on segment[a,d] /\
2847                 f continuous_on segment[b,d] /\
2848                 f continuous_on segment[c,d]`
2849   MP_TAC THENL
2850    [ALL_TAC;
2851     DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN (MP_TAC o MATCH_MP
2852                PATH_INTEGRAL_REVERSE_LINEPATH)) THEN
2853     CONV_TAC COMPLEX_RING] THEN
2854   REPEAT CONJ_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2855   EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2856   ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2857   MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2858   SIMP_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2859   REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2860   MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN REWRITE_TAC[IN_INSERT]);;
2861
2862 (* ------------------------------------------------------------------------- *)
2863 (* Existence of a primitive.                                                 *)
2864 (* ------------------------------------------------------------------------- *)
2865
2866 let STARLIKE_CONVEX_SUBSET = prove
2867  (`!s a b c:real^N.
2868         a IN s /\ segment[b,c] SUBSET s /\
2869         (!x. x IN s ==> segment[a,x] SUBSET s)
2870         ==> convex hull {a,b,c} SUBSET s`,
2871   REPEAT STRIP_TAC THEN
2872   MP_TAC(ISPECL [`{b:real^N,c}`; `a:real^N`] CONVEX_HULL_INSERT) THEN
2873   REWRITE_TAC[NOT_INSERT_EMPTY] THEN DISCH_THEN SUBST1_TAC THEN
2874   REWRITE_TAC[SUBSET; IN_ELIM_THM; LEFT_IMP_EXISTS_THM] THEN
2875   MAP_EVERY X_GEN_TAC [`x:real^N`; `u:real`; `v:real`; `d:real^N`] THEN
2876   STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `d:real^N`) THEN ANTS_TAC THENL
2877    [ASM_MESON_TAC[SUBSET; SEGMENT_CONVEX_HULL];
2878     ASM_REWRITE_TAC[SUBSET] THEN DISCH_THEN MATCH_MP_TAC THEN
2879     REWRITE_TAC[SEGMENT_CONVEX_HULL; CONVEX_HULL_2; IN_ELIM_THM] THEN
2880     ASM_MESON_TAC[]]);;
2881
2882 let TRIANGLE_PATH_INTEGRALS_STARLIKE_PRIMITIVE = prove
2883  (`!f s a.
2884       a IN s /\ open s /\ f continuous_on s /\
2885       (!z. z IN s ==> segment[a,z] SUBSET s) /\
2886       (!b c. segment[b,c] SUBSET s
2887              ==> path_integral (linepath(a,b)) f +
2888                  path_integral (linepath(b,c)) f +
2889                  path_integral (linepath(c,a)) f = Cx(&0))
2890       ==> ?g. !z. z IN s ==> (g has_complex_derivative f(z)) (at z)`,
2891   REPEAT STRIP_TAC THEN
2892   EXISTS_TAC `\x. path_integral (linepath(a,x)) f` THEN
2893   X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
2894   REWRITE_TAC[has_complex_derivative] THEN
2895   REWRITE_TAC[has_derivative_at; LINEAR_COMPLEX_MUL] THEN
2896   MATCH_MP_TAC LIM_TRANSFORM THEN
2897   EXISTS_TAC `\y. inv(norm(y - x)) % (path_integral(linepath(x,y)) f -
2898                    f x * (y - x))` THEN
2899   REWRITE_TAC[VECTOR_ARITH
2900    `i % (x - a) - i % (y - (z + a)) = i % (x + z - y)`] THEN
2901   CONJ_TAC THENL
2902    [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
2903     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
2904     DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN ASM_REWRITE_TAC[] THEN
2905     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
2906     STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2907     X_GEN_TAC `y:complex` THEN REWRITE_TAC[dist] THEN STRIP_TAC THEN
2908     REWRITE_TAC[VECTOR_MUL_EQ_0] THEN DISJ2_TAC THEN
2909     MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `y:complex`]
2910          PATH_INTEGRAL_REVERSE_LINEPATH) THEN
2911     ANTS_TAC THENL
2912      [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2913       EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
2914       FIRST_X_ASSUM MATCH_MP_TAC THEN
2915       FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
2916       ASM_REWRITE_TAC[IN_BALL; ONCE_REWRITE_RULE[NORM_SUB] dist];
2917       REWRITE_TAC[COMPLEX_VEC_0] THEN MATCH_MP_TAC(COMPLEX_RING
2918         `ax + xy + ya = Cx(&0) ==> ay = --ya ==> xy + ax - ay = Cx(&0)`) THEN
2919       FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_X_ASSUM(MATCH_MP_TAC o
2920        MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT] SUBSET_TRANS)) THEN
2921       REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2922       MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
2923       REWRITE_TAC[SUBSET; IN_BALL; IN_INSERT; NOT_IN_EMPTY] THEN
2924       REPEAT STRIP_TAC THEN
2925       ASM_REWRITE_TAC[dist; NORM_0; VECTOR_SUB_REFL] THEN
2926       ASM_MESON_TAC[NORM_SUB]];
2927     REWRITE_TAC[LIM_AT] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
2928     SUBGOAL_THEN `(f:complex->complex) continuous at x` MP_TAC THENL
2929      [MATCH_MP_TAC CONTINUOUS_ON_INTERIOR THEN ASM_MESON_TAC[INTERIOR_OPEN];
2930       ALL_TAC] THEN
2931     REWRITE_TAC[continuous_at; dist; VECTOR_SUB_RZERO] THEN
2932     DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
2933     DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
2934     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
2935     DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
2936     ASM_REWRITE_TAC[SUBSET; IN_BALL; dist] THEN
2937     DISCH_THEN(X_CHOOSE_THEN `d2:real` STRIP_ASSUME_TAC) THEN
2938     EXISTS_TAC `min d1 d2` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
2939     X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
2940     SUBGOAL_THEN `f path_integrable_on linepath(x,y)` MP_TAC THENL
2941      [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2942       MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
2943       ASM_REWRITE_TAC[] THEN
2944       MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(x:complex,d2)` THEN
2945       CONJ_TAC THENL
2946        [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2947         MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
2948         REWRITE_TAC[SUBSET; IN_BALL; IN_INSERT; NOT_IN_EMPTY] THEN
2949         REPEAT STRIP_TAC THEN
2950         ASM_REWRITE_TAC[dist; NORM_0; VECTOR_SUB_REFL] THEN
2951         ASM_MESON_TAC[NORM_SUB];
2952         ASM_REWRITE_TAC[SUBSET; IN_BALL; dist]];
2953       ALL_TAC] THEN
2954     REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
2955     X_GEN_TAC `z:complex` THEN
2956     MP_TAC(SPECL [`x:complex`; `y:complex`; `(f:complex->complex) x`]
2957                   HAS_PATH_INTEGRAL_CONST_LINEPATH) THEN
2958     REWRITE_TAC[IMP_IMP] THEN
2959     DISCH_THEN(fun th -> ASSUME_TAC(CONJUNCT2 th) THEN MP_TAC th) THEN
2960     FIRST_ASSUM(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
2961     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
2962     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_NEG) THEN
2963     REWRITE_TAC[COMPLEX_NEG_SUB] THEN STRIP_TAC THEN
2964     MATCH_MP_TAC(REAL_ARITH `x <= e / &2 /\ &0 < e ==> x < e`) THEN
2965     ASM_REWRITE_TAC[NORM_MUL; REAL_ABS_INV; REAL_ABS_NORM] THEN
2966     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
2967     ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
2968     MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
2969     EXISTS_TAC `\w. (f:complex->complex) w - f x` THEN
2970     ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> &0 <= e / &2`] THEN
2971     X_GEN_TAC `w:complex` THEN STRIP_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
2972     FIRST_X_ASSUM MATCH_MP_TAC THEN
2973     ASM_MESON_TAC[REAL_LET_TRANS; SEGMENT_BOUND]]);;
2974
2975 let HOLOMORPHIC_STARLIKE_PRIMITIVE = prove
2976  (`!f s k. open s /\ starlike s /\ FINITE k /\ f continuous_on s /\
2977            (!x. x IN s DIFF k ==> f complex_differentiable at x)
2978            ==> ?g. !x. x IN s ==> (g has_complex_derivative f(x)) (at x)`,
2979   REPEAT STRIP_TAC THEN
2980   FIRST_X_ASSUM(X_CHOOSE_THEN `a:complex` STRIP_ASSUME_TAC o
2981         GEN_REWRITE_RULE I [starlike]) THEN
2982   MATCH_MP_TAC TRIANGLE_PATH_INTEGRALS_STARLIKE_PRIMITIVE THEN
2983   EXISTS_TAC `a:complex` THEN ASM_REWRITE_TAC[] THEN
2984   MAP_EVERY X_GEN_TAC [`x:complex`; `y:complex`] THEN STRIP_TAC THEN
2985   MATCH_MP_TAC HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL THEN
2986   MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_COFINITE THEN
2987   EXISTS_TAC `k:complex->bool` THEN ASM_REWRITE_TAC[] THEN
2988   SUBGOAL_THEN `convex hull {a:complex,x,y} SUBSET s` ASSUME_TAC THENL
2989    [MATCH_MP_TAC STARLIKE_CONVEX_SUBSET THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN
2990   CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2991   REWRITE_TAC[IN_DIFF] THEN REPEAT STRIP_TAC THEN
2992   FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_DIFF] THEN
2993   ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET]);;
2994
2995 (* ------------------------------------------------------------------------- *)
2996 (* Cauchy's theorem for an open starlike set.                                *)
2997 (* ------------------------------------------------------------------------- *)
2998
2999 let CAUCHY_THEOREM_STARLIKE = prove
3000  (`!f s k g. open s /\ starlike s /\ FINITE k /\ f continuous_on s /\
3001              (!x. x IN s DIFF k ==> f complex_differentiable at x) /\
3002              valid_path g /\ (path_image g) SUBSET s /\
3003              pathfinish g = pathstart g
3004              ==> (f has_path_integral Cx(&0)) (g)`,
3005   MESON_TAC[HOLOMORPHIC_STARLIKE_PRIMITIVE; CAUCHY_THEOREM_PRIMITIVE;
3006             HAS_COMPLEX_DERIVATIVE_AT_WITHIN]);;
3007
3008 let CAUCHY_THEOREM_STARLIKE_SIMPLE = prove
3009  (`!f s g. open s /\ starlike s /\ f holomorphic_on s /\
3010            valid_path g /\ (path_image g) SUBSET s /\
3011            pathfinish g = pathstart g
3012            ==> (f has_path_integral Cx(&0)) (g)`,
3013   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_STARLIKE THEN
3014   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
3015   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; FINITE_RULES] THEN
3016   REWRITE_TAC[IN_DIFF; NOT_IN_EMPTY; complex_differentiable] THEN
3017   ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; holomorphic_on]);;
3018
3019 (* ------------------------------------------------------------------------- *)
3020 (* For a convex set we can avoid assuming openness and boundary analyticity. *)
3021 (* ------------------------------------------------------------------------- *)
3022
3023 let TRIANGLE_PATH_INTEGRALS_CONVEX_PRIMITIVE = prove
3024  (`!f s a.
3025       a IN s /\ convex s /\ f continuous_on s /\
3026       (!b c. b IN s /\ c IN s
3027              ==> path_integral (linepath(a,b)) f +
3028                  path_integral (linepath(b,c)) f +
3029                  path_integral (linepath(c,a)) f = Cx(&0))
3030       ==> ?g. !z. z IN s ==> (g has_complex_derivative f(z)) (at z within s)`,
3031   REPEAT STRIP_TAC THEN
3032   EXISTS_TAC `\x. path_integral (linepath(a,x)) f` THEN
3033   X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
3034   REWRITE_TAC[has_complex_derivative] THEN
3035   REWRITE_TAC[has_derivative_within; LINEAR_COMPLEX_MUL] THEN
3036   MATCH_MP_TAC LIM_TRANSFORM THEN
3037   EXISTS_TAC `\y. inv(norm(y - x)) % (path_integral(linepath(x,y)) f -
3038                    f x * (y - x))` THEN
3039   REWRITE_TAC[VECTOR_ARITH
3040    `i % (x - a) - i % (y - (z + a)) = i % (x + z - y)`] THEN
3041   CONJ_TAC THENL
3042    [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_WITHIN] THEN
3043     EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN
3044     X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
3045     REWRITE_TAC[VECTOR_MUL_EQ_0] THEN DISJ2_TAC THEN
3046     MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `y:complex`]
3047          PATH_INTEGRAL_REVERSE_LINEPATH) THEN
3048     ANTS_TAC THENL
3049      [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
3050       EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
3051       REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
3052       MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
3053       REWRITE_TAC[COMPLEX_VEC_0] THEN MATCH_MP_TAC(COMPLEX_RING
3054         `ax + xy + ya = Cx(&0) ==> ay = --ya ==> xy + ax - ay = Cx(&0)`) THEN
3055       ASM_SIMP_TAC[]];
3056     REWRITE_TAC[LIM_WITHIN] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3057     SUBGOAL_THEN
3058      `(f:complex->complex) continuous (at x within s)` MP_TAC THENL
3059      [ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN]; ALL_TAC] THEN
3060     REWRITE_TAC[continuous_within; dist; VECTOR_SUB_RZERO] THEN
3061     DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
3062     DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
3063     EXISTS_TAC `d1:real` THEN ASM_REWRITE_TAC[] THEN
3064     X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
3065     SUBGOAL_THEN `f path_integrable_on linepath(x,y)` MP_TAC THENL
3066      [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
3067       MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
3068       ASM_REWRITE_TAC[] THEN REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
3069       MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
3070       ALL_TAC] THEN
3071     REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
3072     X_GEN_TAC `z:complex` THEN
3073     MP_TAC(SPECL [`x:complex`; `y:complex`; `(f:complex->complex) x`]
3074                   HAS_PATH_INTEGRAL_CONST_LINEPATH) THEN
3075     REWRITE_TAC[IMP_IMP] THEN
3076     DISCH_THEN(fun th -> ASSUME_TAC(CONJUNCT2 th) THEN MP_TAC th) THEN
3077     FIRST_ASSUM(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
3078     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
3079     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_NEG) THEN
3080     REWRITE_TAC[COMPLEX_NEG_SUB] THEN STRIP_TAC THEN
3081     MATCH_MP_TAC(REAL_ARITH `x <= e / &2 /\ &0 < e ==> x < e`) THEN
3082     ASM_REWRITE_TAC[NORM_MUL; REAL_ABS_INV; REAL_ABS_NORM] THEN
3083     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
3084     ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
3085     MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
3086     EXISTS_TAC `\w. (f:complex->complex) w - f x` THEN
3087     ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> &0 <= e / &2`] THEN
3088     X_GEN_TAC `w:complex` THEN STRIP_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
3089     FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL
3090      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
3091        `w IN t ==> t SUBSET s ==> w IN s`)) THEN
3092       REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
3093       MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
3094       ASM_MESON_TAC[REAL_LET_TRANS; SEGMENT_BOUND]]]);;
3095
3096 let PATHINTEGRAL_CONVEX_PRIMITIVE = prove
3097  (`!f s. convex s /\ f continuous_on s /\
3098          (!a b c. a IN s /\ b IN s /\ c IN s
3099                   ==>  (f has_path_integral Cx(&0))
3100                        (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a)))
3101          ==> ?g. !x. x IN s
3102                      ==> (g has_complex_derivative f(x)) (at x within s)`,
3103   REPEAT STRIP_TAC THEN
3104   ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN
3105   FIRST_X_ASSUM(X_CHOOSE_THEN `a:complex` STRIP_ASSUME_TAC o
3106         GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
3107   MATCH_MP_TAC TRIANGLE_PATH_INTEGRALS_CONVEX_PRIMITIVE THEN
3108   EXISTS_TAC `a:complex` THEN ASM_REWRITE_TAC[] THEN
3109   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL THEN
3110   ASM_SIMP_TAC[]);;
3111
3112 let HOLOMORPHIC_CONVEX_PRIMITIVE = prove
3113  (`!f s k. convex s /\ FINITE k /\ f continuous_on s /\
3114            (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x)
3115            ==> ?g. !x. x IN s
3116                        ==> (g has_complex_derivative f(x)) (at x within s)`,
3117   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATHINTEGRAL_CONVEX_PRIMITIVE THEN
3118   ASM_REWRITE_TAC[] THEN
3119   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_COFINITE THEN
3120   EXISTS_TAC `k:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
3121    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
3122     ASM_REWRITE_TAC[];
3123     X_GEN_TAC `w:complex` THEN
3124     DISCH_THEN(fun th -> FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
3125     SPEC_TAC(`w:complex`,`w:complex`) THEN ASM_REWRITE_TAC[GSYM SUBSET] THEN
3126     MATCH_MP_TAC(SET_RULE `s SUBSET t ==> (s DIFF k) SUBSET (t DIFF k)`) THEN
3127     MATCH_MP_TAC SUBSET_INTERIOR] THEN
3128   MATCH_MP_TAC HULL_MINIMAL THEN ASM_REWRITE_TAC[] THEN ASM SET_TAC[]);;
3129
3130 let CAUCHY_THEOREM_CONVEX = prove
3131  (`!f s k g. convex s /\ FINITE k /\ f continuous_on s /\
3132              (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x) /\
3133              valid_path g /\ (path_image g) SUBSET s /\
3134              pathfinish g = pathstart g
3135              ==> (f has_path_integral Cx(&0)) (g)`,
3136   MESON_TAC[HOLOMORPHIC_CONVEX_PRIMITIVE; CAUCHY_THEOREM_PRIMITIVE]);;
3137
3138 let CAUCHY_THEOREM_CONVEX_SIMPLE = prove
3139  (`!f s g. convex s /\ f holomorphic_on s /\
3140            valid_path g /\ (path_image g) SUBSET s /\
3141            pathfinish g = pathstart g
3142            ==> (f has_path_integral Cx(&0)) (g)`,
3143   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_CONVEX THEN
3144   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
3145   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; FINITE_RULES] THEN
3146   REWRITE_TAC[IN_DIFF; NOT_IN_EMPTY; complex_differentiable] THEN
3147   SUBGOAL_THEN `f holomorphic_on (interior s)` MP_TAC THENL
3148    [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; INTERIOR_SUBSET]; ALL_TAC] THEN
3149   MESON_TAC[holomorphic_on; HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN;
3150             OPEN_INTERIOR]);;
3151
3152 (* ------------------------------------------------------------------------- *)
3153 (* In particular for a disc.                                                 *)
3154 (* ------------------------------------------------------------------------- *)
3155
3156 let CAUCHY_THEOREM_DISC = prove
3157  (`!f g k a e.
3158         FINITE k /\ f continuous_on cball(a,e) /\
3159         (!x. x IN ball(a,e) DIFF k ==> f complex_differentiable at x) /\
3160         valid_path g /\ (path_image g) SUBSET cball(a,e) /\
3161         pathfinish g = pathstart g
3162         ==> (f has_path_integral Cx(&0)) (g)`,
3163   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_CONVEX THEN
3164   MAP_EVERY EXISTS_TAC [`cball(a:complex,e)`; `k:complex->bool`] THEN
3165   ASM_REWRITE_TAC[INTERIOR_CBALL; CONVEX_CBALL]);;
3166
3167 let CAUCHY_THEOREM_DISC_SIMPLE = prove
3168  (`!f g a e.
3169         f holomorphic_on ball(a,e) /\
3170         valid_path g /\ (path_image g) SUBSET ball(a,e) /\
3171         pathfinish g = pathstart g
3172         ==> (f has_path_integral Cx(&0)) (g)`,
3173   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_CONVEX_SIMPLE THEN
3174   EXISTS_TAC `ball(a:complex,e)` THEN ASM_REWRITE_TAC[CONVEX_BALL; OPEN_BALL]);;
3175
3176 (* ------------------------------------------------------------------------- *)
3177 (* Generalize integrability to local primitives.                             *)
3178 (* ------------------------------------------------------------------------- *)
3179
3180 let PATH_INTEGRAL_LOCAL_PRIMITIVE_LEMMA = prove
3181  (`!f f' g s a b.
3182         (!x. x IN s ==> (f has_complex_derivative f' x) (at x 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 within interval[a,b]))
3186             integrable_on interval[a,b]`,
3187   REPEAT STRIP_TAC THEN
3188   ASM_CASES_TAC `interval[a:real^1,b] = {}` THENL
3189    [ASM_REWRITE_TAC[INTEGRABLE_ON_EMPTY];
3190     REWRITE_TAC[integrable_on] THEN
3191     EXISTS_TAC `(f:complex->complex) (g(b:real^1)) - f(g a)` THEN
3192     MATCH_MP_TAC PATH_INTEGRAL_PRIMITIVE_LEMMA THEN
3193     ASM_MESON_TAC[]]);;
3194
3195 let PATH_INTEGRAL_LOCAL_PRIMITIVE_ANY = prove
3196  (`!f g s a b.
3197     (!x. x IN s
3198          ==> ?d h. &0 < d /\
3199                    !y. norm(y - x) < d
3200                        ==> (h has_complex_derivative f(y)) (at y within s)) /\
3201     g piecewise_differentiable_on interval[a,b] /\
3202     (!x. x IN interval[a,b] ==> g(x) IN s)
3203     ==> (\x. f(g x) * vector_derivative g (at x)) integrable_on interval[a,b]`,
3204   REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_ON_LITTLE_SUBINTERVALS THEN
3205   X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
3206   FIRST_X_ASSUM(MP_TAC o SPEC `(g:real^1->complex) x`) THEN
3207   ASM_SIMP_TAC[LEFT_IMP_EXISTS_THM] THEN
3208   MAP_EVERY X_GEN_TAC [`d:real`; `h:complex->complex`] THEN STRIP_TAC THEN
3209   FIRST_ASSUM(MP_TAC o MATCH_MP
3210     PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON) THEN
3211   REWRITE_TAC[continuous_on] THEN DISCH_THEN(MP_TAC o SPEC `x:real^1`) THEN
3212   ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `d:real`) THEN
3213   ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
3214   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
3215   SIMP_TAC[integrable_on; GSYM HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
3216   REWRITE_TAC[GSYM integrable_on] THEN
3217   MATCH_MP_TAC PATH_INTEGRAL_LOCAL_PRIMITIVE_LEMMA THEN
3218   MAP_EVERY EXISTS_TAC
3219    [`h:complex->complex`; `IMAGE (g:real^1->complex) (interval[u,v])`] THEN
3220   REWRITE_TAC[FORALL_IN_IMAGE] THEN REPEAT STRIP_TAC THENL
3221    [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_WITHIN_SUBSET THEN
3222     EXISTS_TAC `s:complex->bool` THEN
3223     CONJ_TAC THENL [FIRST_X_ASSUM MATCH_MP_TAC; ASM SET_TAC[]] THEN
3224     REWRITE_TAC[GSYM dist] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3225     ASM_MESON_TAC[SUBSET; IN_BALL; DIST_SYM];
3226     ASM_MESON_TAC[PIECEWISE_DIFFERENTIABLE_ON_SUBSET];
3227     ASM SET_TAC[]]);;
3228
3229 let PATH_INTEGRAL_LOCAL_PRIMITIVE = prove
3230  (`!f g s.
3231         (!x. x IN s
3232          ==> ?d h. &0 < d /\
3233                    !y. norm(y - x) < d
3234                        ==> (h has_complex_derivative f(y)) (at y within s)) /\
3235         valid_path g /\ (path_image g) SUBSET s
3236         ==> f path_integrable_on g`,
3237   REWRITE_TAC[valid_path; path_image; SUBSET; FORALL_IN_IMAGE] THEN
3238   REWRITE_TAC[path_integrable_on; has_path_integral] THEN
3239   REWRITE_TAC[HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
3240   REWRITE_TAC[GSYM integrable_on; PATH_INTEGRAL_LOCAL_PRIMITIVE_ANY]);;
3241
3242 (* ------------------------------------------------------------------------- *)
3243 (* In particular if a function is holomorphic.                               *)
3244 (* ------------------------------------------------------------------------- *)
3245
3246 let PATH_INTEGRABLE_HOLOMORPHIC = prove
3247  (`!f g s k.
3248         open s /\ FINITE k /\
3249         f continuous_on s /\
3250         (!x. x IN s DIFF k ==> f complex_differentiable at x) /\
3251         valid_path g /\ path_image g SUBSET s
3252         ==> f path_integrable_on g`,
3253   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_LOCAL_PRIMITIVE THEN
3254   EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
3255   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3256   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
3257   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
3258   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN STRIP_TAC THEN
3259   MP_TAC(ISPECL [`f:complex->complex`; `ball(z:complex,d)`;
3260                  `k:complex->bool`] HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
3261   ANTS_TAC THENL
3262    [ASM_REWRITE_TAC[CONVEX_BALL; DIFF_EMPTY] THEN CONJ_TAC THENL
3263      [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
3264     GEN_TAC THEN DISCH_THEN(fun th ->
3265         FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
3266     SIMP_TAC[IN_DIFF] THEN ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET];
3267     MATCH_MP_TAC MONO_EXISTS THEN
3268     SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL] THEN
3269     ONCE_REWRITE_TAC[NORM_SUB] THEN REWRITE_TAC[IN_BALL; dist] THEN
3270     ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN]]);;
3271
3272 let PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE = prove
3273  (`!f g s. open s /\ f holomorphic_on s /\ valid_path g /\ path_image g SUBSET s
3274            ==> f path_integrable_on g`,
3275   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC THEN
3276   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
3277   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; FINITE_RULES; DIFF_EMPTY] THEN
3278   ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; complex_differentiable]);;
3279
3280 (* ------------------------------------------------------------------------- *)
3281 (* Key fact that path integral is the same for a "nearby" path. This is the  *)
3282 (* main lemma for the homotopy form of Cauchy's theorem and is also useful   *)
3283 (* if we want "without loss of generality" to assume some niceness of our    *)
3284 (* path (e.g. smoothness). It can also be used to define the integrals of    *)
3285 (* analytic functions over arbitrary continuous paths. This is just done for *)
3286 (* winding numbers now; I'm not sure if it's worth going further with that.  *)
3287 (* ------------------------------------------------------------------------- *)
3288
3289 let PATH_INTEGRAL_NEARBY_ENDS,PATH_INTEGRAL_NEARBY_LOOP = (CONJ_PAIR o prove)
3290  (`(!s p.
3291       open s /\ path p /\ path_image p SUBSET s
3292       ==> ?d. &0 < d /\
3293               !g h. valid_path g /\ valid_path h /\
3294                     (!t. t IN interval[vec 0,vec 1]
3295                          ==> norm(g t - p t) < d /\ norm(h t - p t) < d) /\
3296                     pathstart h = pathstart g /\ pathfinish h = pathfinish g
3297                     ==> path_image g SUBSET s /\
3298                         path_image h SUBSET s /\
3299                         !f. f holomorphic_on s
3300                             ==> path_integral h f = path_integral g f) /\
3301    (!s p.
3302       open s /\ path p /\ path_image p SUBSET s
3303       ==> ?d. &0 < d /\
3304               !g h. valid_path g /\ valid_path h /\
3305                     (!t. t IN interval[vec 0,vec 1]
3306                          ==> norm(g t - p t) < d /\ norm(h t - p t) < d) /\
3307                     pathfinish g = pathstart g /\ pathfinish h = pathstart h
3308                     ==> path_image g SUBSET s /\
3309                         path_image h SUBSET s /\
3310                         !f. f holomorphic_on s
3311                             ==> path_integral h f = path_integral g f)`,
3312   REWRITE_TAC[AND_FORALL_THM] THEN REPEAT GEN_TAC THEN
3313   MAP_EVERY (fun t -> ASM_CASES_TAC t THEN ASM_REWRITE_TAC[])
3314    [`open(s:complex->bool)`;
3315     `path(p:real^1->complex)`;
3316     `path_image(p:real^1->complex) SUBSET s`] THEN
3317   REWRITE_TAC[RIGHT_IMP_EXISTS_THM] THEN
3318   MATCH_MP_TAC(MESON[] `(?x. P x /\ Q x) ==> (?x. P x) /\ (?x. Q x)`) THEN
3319   SUBGOAL_THEN
3320    `!z. z IN path_image p ==> ?e. &0 < e /\ ball(z:complex,e) SUBSET s`
3321   MP_TAC THENL
3322    [ASM_MESON_TAC[OPEN_CONTAINS_BALL; SUBSET]; ALL_TAC] THEN
3323   GEN_REWRITE_TAC (LAND_CONV o TOP_DEPTH_CONV)
3324    [RIGHT_IMP_EXISTS_THM; RIGHT_AND_EXISTS_THM; SKOLEM_THM] THEN
3325   REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `ee:complex->real` THEN
3326   DISCH_THEN(LABEL_TAC "*") THEN
3327   FIRST_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_HEINE_BOREL o
3328     MATCH_MP COMPACT_PATH_IMAGE) THEN
3329   DISCH_THEN(MP_TAC o SPEC
3330    `IMAGE (\z:complex. ball(z,ee z / &3)) (path_image p)`) THEN
3331   ANTS_TAC THENL
3332    [REWRITE_TAC[FORALL_IN_IMAGE; OPEN_BALL; SUBSET] THEN
3333     X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3334     REWRITE_TAC[UNIONS_IMAGE; IN_ELIM_THM] THEN EXISTS_TAC `z:complex` THEN
3335     ASM_SIMP_TAC[CENTRE_IN_BALL; REAL_ARITH `&0 < e / &3 <=> &0 < e`];
3336     ALL_TAC] THEN
3337   REWRITE_TAC[path_image; GSYM IMAGE_o] THEN REWRITE_TAC[GSYM path_image] THEN
3338   ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN
3339   REWRITE_TAC[CONJ_ASSOC; FINITE_SUBSET_IMAGE] THEN
3340   REWRITE_TAC[LEFT_AND_EXISTS_THM; MESON[]
3341    `(?f s. (P s /\ f = g s) /\ Q f) <=> ?s. P s /\ Q(g s)`] THEN
3342   REWRITE_TAC[UNIONS_IMAGE; LEFT_IMP_EXISTS_THM] THEN
3343   X_GEN_TAC `k:real^1->bool` THEN
3344   DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
3345   GEN_REWRITE_TAC LAND_CONV [SUBSET] THEN REWRITE_TAC[IN_ELIM_THM; o_THM] THEN
3346   ASM_CASES_TAC `k:real^1->bool = {}` THENL
3347    [ASM_REWRITE_TAC[NOT_IN_EMPTY; GSYM NOT_EXISTS_THM; MEMBER_NOT_EMPTY] THEN
3348     REWRITE_TAC[PATH_IMAGE_NONEMPTY];
3349     DISCH_THEN(LABEL_TAC "+")] THEN
3350   SUBGOAL_THEN
3351     `!i:real^1. i IN k ==> &0 < ee((p i):complex)`
3352   ASSUME_TAC THENL
3353    [ASM_MESON_TAC[SUBSET; path_image; IN_IMAGE]; ALL_TAC] THEN
3354   ABBREV_TAC `e = inf(IMAGE ((ee:complex->real) o (p:real^1->complex)) k)` THEN
3355   MP_TAC(ISPEC `IMAGE ((ee:complex->real) o (p:real^1->complex)) k`
3356     INF_FINITE) THEN
3357   MP_TAC(ISPECL [`IMAGE ((ee:complex->real) o (p:real^1->complex)) k`; `&0`]
3358     REAL_LT_INF_FINITE) THEN
3359   ASM_SIMP_TAC[FINITE_IMAGE; IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
3360   ASM_REWRITE_TAC[o_THM] THEN DISCH_TAC THEN
3361   DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
3362   EXISTS_TAC `e / &3` THEN
3363   MP_TAC(ISPECL [`p:real^1->complex`; `interval[vec 0:real^1,vec 1]`]
3364         COMPACT_UNIFORMLY_CONTINUOUS) THEN REWRITE_TAC[COMPACT_INTERVAL] THEN
3365   ANTS_TAC THENL [ASM_MESON_TAC[path]; ALL_TAC] THEN
3366   REWRITE_TAC[uniformly_continuous_on] THEN
3367   DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN
3368   ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &3 <=> &0 < e`] THEN
3369   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
3370   REWRITE_TAC[RIGHT_IMP_FORALL_THM; AND_FORALL_THM] THEN
3371   MAP_EVERY X_GEN_TAC [`g:real^1->complex`; `h:real^1->complex`] THEN
3372   MAP_EVERY (fun t -> ASM_CASES_TAC t THEN ASM_REWRITE_TAC[])
3373    [`!t. t IN interval[vec 0,vec 1]
3374          ==> norm((g:real^1->complex) t - p t) < e / &3 /\
3375              norm((h:real^1->complex) t - p t) < e / &3`;
3376     `valid_path(g:real^1->complex)`; `valid_path(h:real^1->complex)`] THEN
3377   MATCH_MP_TAC(TAUT
3378    `q /\ (p1 \/ p2 ==> q ==> r) ==> (p1 ==> q /\ r) /\ (p2 ==> q /\ r)`) THEN
3379   CONJ_TAC THENL
3380    [CONJ_TAC THEN REWRITE_TAC[path_image; SUBSET; FORALL_IN_IMAGE] THEN
3381     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
3382     REMOVE_THEN "+" (MP_TAC o SPEC `(p:real^1->complex) t`) THEN
3383     ASM_SIMP_TAC[path_image; FUN_IN_IMAGE; IN_BALL] THEN
3384     DISCH_THEN(X_CHOOSE_THEN `u:real^1` STRIP_ASSUME_TAC) THENL
3385      [SUBGOAL_THEN `(g:real^1->complex) t IN ball(p(u:real^1),ee(p u))`
3386       MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[path_image; IN_IMAGE; SUBSET]];
3387       SUBGOAL_THEN `(h:real^1->complex) t IN ball(p(u:real^1),ee(p u))`
3388       MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[path_image; IN_IMAGE; SUBSET]]] THEN
3389     REWRITE_TAC[IN_BALL] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
3390      (NORM_ARITH `dist(gu,gt) < eu / &3
3391                   ==> norm(ht - gt) < e / &3 /\ e <= eu
3392                   ==> dist(gu,ht) < eu`)) THEN
3393     ASM_SIMP_TAC[];
3394     DISCH_TAC THEN STRIP_TAC THEN
3395     X_GEN_TAC `f:complex->complex` THEN DISCH_TAC] THEN
3396   SUBGOAL_THEN
3397    `?ff. !z. z IN path_image p
3398              ==> &0 < ee z /\ ball(z,ee z) SUBSET s /\
3399                  !w. w IN ball(z,ee z)
3400                      ==> (ff z has_complex_derivative f w) (at w)`
3401   MP_TAC THENL
3402    [REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_EXISTS_IMP_THM;
3403                 RIGHT_EXISTS_AND_THM] THEN
3404     X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3405     REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
3406     ASM_REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
3407     MP_TAC(ISPECL [`f:complex->complex`; `ball(z:complex,ee z)`;
3408                    `{}:complex->bool`] HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
3409     SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL] THEN
3410     DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[CONVEX_BALL; FINITE_EMPTY] THEN
3411     SIMP_TAC[DIFF_EMPTY; INTERIOR_OPEN; OPEN_BALL] THEN
3412     SUBGOAL_THEN `f holomorphic_on ball(z,ee z)` MP_TAC THENL
3413      [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
3414       ASM_REWRITE_TAC[];
3415       SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
3416       SIMP_TAC[holomorphic_on; HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL;
3417                complex_differentiable]];
3418     REMOVE_THEN "*" (K ALL_TAC) THEN
3419     DISCH_THEN(CHOOSE_THEN (LABEL_TAC "*"))] THEN
3420   MP_TAC(ISPEC `d:real` REAL_ARCH_INV) THEN ASM_REWRITE_TAC[] THEN
3421   DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
3422   SUBGOAL_THEN
3423    `!n. n <= N
3424         ==> path_integral(subpath (vec 0) (&n / &N % vec 1) h) f -
3425             path_integral(subpath (vec 0) (&n / &N % vec 1) g) f =
3426             path_integral(linepath (g(&n / &N % vec 1),h(&n / &N % vec 1))) f -
3427             path_integral(linepath (g(vec 0),h(vec 0))) f`
3428   (MP_TAC o SPEC `N:num`) THENL
3429    [ALL_TAC;
3430     ASM_SIMP_TAC[LE_REFL; REAL_DIV_REFL; REAL_OF_NUM_EQ; VECTOR_MUL_LID] THEN
3431     FIRST_X_ASSUM(DISJ_CASES_THEN MP_TAC) THEN
3432     REWRITE_TAC[pathstart; pathfinish] THEN STRIP_TAC THEN
3433     ASM_REWRITE_TAC[SUBPATH_TRIVIAL; PATH_INTEGRAL_TRIVIAL] THEN
3434     CONV_TAC COMPLEX_RING] THEN
3435   INDUCT_TAC THENL
3436    [REWRITE_TAC[real_div; REAL_MUL_LZERO; VECTOR_MUL_LZERO] THEN
3437     FIRST_X_ASSUM(DISJ_CASES_THEN MP_TAC) THEN
3438     REWRITE_TAC[pathstart; pathfinish] THEN REPEAT STRIP_TAC THEN
3439     ASM_REWRITE_TAC[PATH_INTEGRAL_TRIVIAL; PATH_INTEGRAL_SUBPATH_REFL] THEN
3440     REWRITE_TAC[COMPLEX_SUB_REFL];
3441     DISCH_TAC THEN FIRST_X_ASSUM(K ALL_TAC o check (is_disj o concl))] THEN
3442   REMOVE_THEN "+" (MP_TAC o SPEC `(p:real^1->complex)(&n / &N % vec 1)`) THEN
3443   REWRITE_TAC[IN_BALL] THEN ANTS_TAC THENL
3444    [REWRITE_TAC[path_image] THEN MATCH_MP_TAC FUN_IN_IMAGE THEN
3445     REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN
3446     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
3447     REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC;
3448     DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC)] THEN
3449   MP_TAC(ISPECL
3450    [`(ff:complex->complex->complex) (p(t:real^1))`; `f:complex->complex`;
3451     `subpath (&n / &N % vec 1) (&(SUC n) / &N % vec 1) (g:real^1->complex) ++
3452      linepath(g (&(SUC n) / &N % vec 1),h(&(SUC n) / &N % vec 1)) ++
3453      subpath (&(SUC n) / &N % vec 1) (&n / &N % vec 1) h ++
3454      linepath(h (&n / &N % vec 1),g (&n / &N % vec 1))`;
3455     `ball((p:real^1->complex) t,ee(p t))`] CAUCHY_THEOREM_PRIMITIVE) THEN
3456   ASM_SIMP_TAC[VALID_PATH_JOIN_EQ; PATHSTART_JOIN; PATHFINISH_JOIN;
3457    PATHSTART_SUBPATH; PATHFINISH_SUBPATH; PATH_IMAGE_JOIN; PATHSTART_LINEPATH;
3458    PATHFINISH_LINEPATH; VALID_PATH_LINEPATH; UNION_SUBSET] THEN
3459   ONCE_REWRITE_TAC[IMP_CONJ] THEN ANTS_TAC THENL
3460    [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3461     REMOVE_THEN "*" (MP_TAC o SPEC `(p:real^1->complex) t`) THEN ANTS_TAC THENL
3462      [ASM_MESON_TAC[path_image; IN_IMAGE; SUBSET];
3463       ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN; CENTRE_IN_BALL]];
3464     ALL_TAC] THEN
3465   MATCH_MP_TAC(TAUT `p /\ q /\ (p ==> r ==> s) ==> (p /\ q ==> r) ==> s`) THEN
3466   CONJ_TAC THENL
3467    [CONJ_TAC THEN MATCH_MP_TAC VALID_PATH_SUBPATH THEN ASM_REWRITE_TAC[] THEN
3468     REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN
3469     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
3470     REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC;
3471     ALL_TAC] THEN
3472   CONJ_TAC THENL
3473    [SUBGOAL_THEN `drop(&n / &N % vec 1) <= drop(&(SUC n) / &N % vec 1)`
3474     ASSUME_TAC THENL
3475      [ASM_SIMP_TAC[DROP_CMUL; DROP_VEC; REAL_MUL_RID; REAL_LE_DIV2_EQ;
3476                    REAL_OF_NUM_LT; LE_1; REAL_OF_NUM_LE] THEN
3477       ARITH_TAC;
3478       ASM_SIMP_TAC[PATH_IMAGE_SUBPATH; PATH_IMAGE_LINEPATH] THEN
3479       ONCE_REWRITE_TAC[GSYM REVERSEPATH_SUBPATH] THEN
3480       ASM_SIMP_TAC[PATH_IMAGE_SUBPATH; PATH_IMAGE_REVERSEPATH]] THEN
3481     MATCH_MP_TAC(TAUT
3482      `(p /\ r) /\ (p /\ r ==> q /\ s) ==> p /\ q /\ r /\ s`) THEN
3483     CONJ_TAC THENL
3484      [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
3485       REWRITE_TAC[AND_FORALL_THM; TAUT
3486         `(p ==> q) /\ (p ==> r) <=> p ==> q /\ r`] THEN
3487       X_GEN_TAC `u:real^1` THEN REWRITE_TAC[IN_INTERVAL_1] THEN
3488       REWRITE_TAC[DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN STRIP_TAC THEN
3489       REWRITE_TAC[IN_BALL] THEN
3490       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
3491        `!e pu. dist(pt,pn) < ee / &3
3492                ==> dist(pn,pu) < e / &3 /\ e <= ee /\
3493                    norm(gu - pu) < e / &3 /\ norm(hu - pu) < e / &3
3494                    ==> dist(pt,gu) < ee /\ dist(pt,hu) < ee`)) THEN
3495       MAP_EVERY EXISTS_TAC [`e:real`; `(p:real^1->complex) u`] THEN
3496       ASM_SIMP_TAC[] THEN
3497       SUBGOAL_THEN `(u:real^1) IN interval[vec 0,vec 1]` ASSUME_TAC THENL
3498        [REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN CONJ_TAC THENL
3499          [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
3500            REAL_LE_TRANS)) THEN ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS];
3501           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
3502            REAL_LE_TRANS)) THEN
3503           ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
3504           ASM_REWRITE_TAC[REAL_MUL_LID; REAL_OF_NUM_LE]];
3505         ASM_SIMP_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3506         ASM_REWRITE_TAC[] THEN
3507         REWRITE_TAC[DIST_REAL; GSYM drop; IN_INTERVAL_1;
3508                     DROP_VEC; DROP_CMUL; REAL_MUL_RID] THEN
3509         ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_POS; REAL_LE_DIV;
3510               REAL_OF_NUM_LT; LE_1; REAL_MUL_LID; REAL_OF_NUM_LE;
3511               ARITH_RULE `SUC n <= N ==> n <= N`] THEN
3512         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
3513          `u <= s ==> n <= u /\ s - n < d ==> abs(n - u) < d`)) THEN
3514         ASM_REWRITE_TAC[] THEN
3515         REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB] THEN
3516         SIMP_TAC[REAL_OF_NUM_SUB; ARITH_RULE `n <= SUC n`] THEN
3517         ASM_REWRITE_TAC[ARITH_RULE `SUC n - n = 1`; REAL_MUL_LID]];
3518       GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [SUBSET] THEN
3519       REWRITE_TAC[FORALL_IN_IMAGE] THEN STRIP_TAC THEN
3520       REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN CONJ_TAC THEN
3521       MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
3522       REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET] THEN
3523       CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3524       REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; REAL_NOT_LT] THEN
3525       REWRITE_TAC[DROP_VEC; DROP_CMUL; REAL_MUL_RID] THEN
3526         ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_POS; REAL_LE_DIV;
3527               REAL_OF_NUM_LT; LE_1; REAL_MUL_LID; REAL_OF_NUM_LE] THEN
3528       ARITH_TAC];
3529     STRIP_TAC THEN DISCH_THEN(fun th ->
3530         MP_TAC(MATCH_MP PATH_INTEGRAL_UNIQUE th) THEN
3531         MP_TAC(MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE th)) THEN
3532     ASM_SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN_EQ; VALID_PATH_LINEPATH;
3533       PATHSTART_SUBPATH; PATHFINISH_SUBPATH; PATHSTART_JOIN; PATHFINISH_JOIN;
3534       PATHSTART_LINEPATH; PATHFINISH_LINEPATH; VALID_PATH_LINEPATH;
3535       PATH_INTEGRAL_JOIN] THEN
3536     STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o check(is_imp o concl)) THEN
3537     ASM_SIMP_TAC[ARITH_RULE `SUC n <= N ==> n <= N`] THEN
3538     MATCH_MP_TAC(COMPLEX_RING
3539      `hn - he = hn' /\ gn + gd = gn' /\ hgn = --ghn
3540       ==> hn - gn = ghn - gh0
3541           ==> gd + ghn' + he + hgn = Cx(&0)
3542               ==> hn' - gn' = ghn' - gh0`) THEN
3543     REPEAT CONJ_TAC THENL
3544      [ASM_SIMP_TAC[complex_sub; GSYM PATH_INTEGRAL_REVERSEPATH] THEN
3545       REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
3546       MATCH_MP_TAC PATH_INTEGRAL_SUBPATH_COMBINE;
3547       MATCH_MP_TAC PATH_INTEGRAL_SUBPATH_COMBINE;
3548       GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV)
3549        [GSYM REVERSEPATH_LINEPATH] THEN
3550       MATCH_MP_TAC PATH_INTEGRAL_REVERSEPATH] THEN
3551     ASM_REWRITE_TAC[VALID_PATH_LINEPATH] THEN
3552     ASM_REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN
3553     ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1;
3554                  REAL_MUL_LID; REAL_OF_NUM_LE] THEN
3555     ASM_SIMP_TAC[ARITH_RULE `SUC n <= N ==> n <= N`] THEN
3556     TRY(MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
3557         EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN NO_TAC) THEN
3558     ASM_MESON_TAC[PATH_INTEGRABLE_REVERSEPATH; VALID_PATH_LINEPATH;
3559                   REVERSEPATH_LINEPATH]]);;
3560
3561 (* ------------------------------------------------------------------------- *)
3562 (* Hence we can treat even non-rectifiable paths as having a "length"        *)
3563 (* for bounds on analytic functions in open sets.                            *)
3564 (* ------------------------------------------------------------------------- *)
3565
3566 let VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION = prove
3567  (`!p:real^1->complex.
3568      vector_polynomial_function p ==> valid_path p`,
3569   REPEAT STRIP_TAC THEN REWRITE_TAC[valid_path] THEN
3570   MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
3571   MATCH_MP_TAC DIFFERENTIABLE_AT_IMP_DIFFERENTIABLE_ON THEN
3572   REWRITE_TAC[VECTOR_DERIVATIVE_WORKS] THEN
3573   REPEAT STRIP_TAC THEN REWRITE_TAC[vector_derivative] THEN
3574   CONV_TAC SELECT_CONV THEN
3575   ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION]);;
3576
3577 let PATH_INTEGRAL_BOUND_EXISTS = prove
3578  (`!s g. open s /\ valid_path g /\ path_image g SUBSET s
3579          ==> ?L. &0 < L /\
3580                  !f B. f holomorphic_on s /\ (!z. z IN s ==> norm(f z) <= B)
3581                        ==> norm(path_integral g f) <= L * B`,
3582   REPEAT STRIP_TAC THEN
3583   MP_TAC(ISPECL [`s:complex->bool`; `g:real^1->complex`]
3584         PATH_INTEGRAL_NEARBY_ENDS) THEN
3585   ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
3586   DISCH_THEN(X_CHOOSE_THEN `d:real` (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
3587   DISCH_THEN(MP_TAC o SPEC `g:real^1->complex`) THEN
3588   ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
3589   DISCH_THEN(STRIP_ASSUME_TAC o GSYM) THEN
3590   MP_TAC(ISPECL [`g:real^1->complex`; `d:real`]
3591    PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
3592   ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
3593   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3594   FIRST_X_ASSUM(MP_TAC o SPEC `p:real^1->complex`) THEN
3595   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN STRIP_TAC THEN
3596   FIRST_ASSUM(X_CHOOSE_THEN `p':real^1->complex` STRIP_ASSUME_TAC o
3597     MATCH_MP HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION) THEN
3598   SUBGOAL_THEN `bounded(IMAGE (p':real^1->complex) (interval[vec 0,vec 1]))`
3599   MP_TAC THENL
3600    [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
3601     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
3602     REWRITE_TAC[COMPACT_INTERVAL] THEN
3603     ASM_MESON_TAC[CONTINUOUS_VECTOR_POLYNOMIAL_FUNCTION;
3604                   CONTINUOUS_AT_IMP_CONTINUOUS_ON];
3605     REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE]] THEN
3606   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `L:real` THEN STRIP_TAC THEN
3607   ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
3608   SUBGOAL_THEN `f path_integrable_on p /\ valid_path p` STRIP_ASSUME_TAC THENL
3609    [ASM_MESON_TAC[PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE;
3610                   VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION];
3611     ALL_TAC] THEN
3612   MP_TAC(ISPECL [`f:complex->complex`; `p:real^1->complex`]
3613         PATH_INTEGRAL_INTEGRAL) THEN ASM_REWRITE_TAC[] THEN
3614   DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
3615    `drop(integral (interval[vec 0,vec 1]) (\x:real^1. lift(L * B)))` THEN
3616   CONJ_TAC THENL
3617    [MATCH_MP_TAC INTEGRAL_NORM_BOUND_INTEGRAL THEN
3618     ASM_REWRITE_TAC[INTEGRABLE_CONST; GSYM PATH_INTEGRABLE_ON] THEN
3619     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
3620     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
3621     REWRITE_TAC[LIFT_DROP; COMPLEX_NORM_MUL] THEN
3622     MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN
3623     CONJ_TAC THENL
3624      [FIRST_X_ASSUM MATCH_MP_TAC THEN
3625       ASM_MESON_TAC[path_image; SUBSET; IN_IMAGE];
3626       ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_UNIQUE_AT]];
3627     REWRITE_TAC[INTEGRAL_CONST; CONTENT_UNIT_1; VECTOR_MUL_LID] THEN
3628     REWRITE_TAC[LIFT_DROP; REAL_LE_REFL]]);;
3629
3630 (* ------------------------------------------------------------------------- *)
3631 (* Winding number.                                                           *)
3632 (* ------------------------------------------------------------------------- *)
3633
3634 let winding_number = new_definition
3635  `winding_number(g,z) =
3636     @n. !e. &0 < e
3637             ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3638                     pathstart p = pathstart g /\
3639                     pathfinish p = pathfinish g /\
3640                     (!t. t IN interval[vec 0,vec 1] ==> norm(g t - p t) < e) /\
3641                     path_integral p (\w. Cx(&1) / (w - z)) =
3642                     Cx(&2) * Cx(pi) * ii * n`;;
3643
3644 let CX_2PII_NZ = prove
3645  (`~(Cx(&2) * Cx(pi) * ii = Cx(&0))`,
3646   SIMP_TAC[COMPLEX_ENTIRE; CX_PI_NZ; II_NZ; CX_INJ; REAL_OF_NUM_EQ; ARITH]);;
3647
3648 let PATH_INTEGRABLE_INVERSEDIFF = prove
3649  (`!g z. valid_path g /\ ~(z IN path_image g)
3650          ==> (\w. Cx(&1) / (w - z)) path_integrable_on g`,
3651   REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
3652   EXISTS_TAC `(:complex) DELETE z` THEN
3653   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN; SET_RULE
3654    `s SUBSET (UNIV DELETE x) <=> ~(x IN s)`] THEN
3655   X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_UNIV; IN_DELETE] THEN
3656   STRIP_TAC THEN
3657   W(MP_TAC o DISCH_ALL o COMPLEX_DIFF_CONV o snd o dest_exists o snd) THEN
3658   ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN MESON_TAC[]);;
3659
3660 let WINDING_NUMBER = prove
3661  (`!g z e.
3662         path g /\ ~(z IN path_image g) /\ &0 < e
3663          ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3664                  pathstart p = pathstart g /\
3665                  pathfinish p = pathfinish g /\
3666                  (!t. t IN interval[vec 0,vec 1] ==> norm(g t - p t) < e) /\
3667                  path_integral p (\w. Cx(&1) / (w - z)) =
3668                  Cx(&2) * Cx(pi) * ii * winding_number(g,z)`,
3669   REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
3670   GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN DISCH_TAC THEN
3671   REWRITE_TAC[winding_number] THEN CONV_TAC SELECT_CONV THEN
3672   MP_TAC(ISPECL [`(:complex) DELETE z`; `g:real^1->complex`]
3673         PATH_INTEGRAL_NEARBY_ENDS) THEN
3674   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN
3675   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
3676   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
3677   MP_TAC(ISPECL [`g:real^1->complex`; `d / &2`]
3678     PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
3679   ASM_REWRITE_TAC[REAL_HALF] THEN
3680   DISCH_THEN(X_CHOOSE_THEN `h:real^1->complex` STRIP_ASSUME_TAC) THEN
3681   EXISTS_TAC `Cx (&1) / (Cx (&2) * Cx pi * ii) *
3682               path_integral h (\w. Cx (&1) / (w - z))` THEN
3683   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3684   MP_TAC(ISPECL [`g:real^1->complex`; `min d e / &2`]
3685     PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
3686   ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN
3687   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `p:real^1->complex` THEN
3688   STRIP_TAC THEN
3689   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION; CX_2PII_NZ; COMPLEX_FIELD
3690    `~(a * b * c = Cx(&0))
3691     ==> a * b * c * Cx(&1) / (a * b * c) * z = z`] THEN
3692   FIRST_X_ASSUM(MP_TAC o SPECL [`h:real^1->complex`; `p:real^1->complex`]) THEN
3693   ANTS_TAC THENL
3694    [ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
3695     ASM_MESON_TAC[NORM_ARITH
3696      `norm(h - g) < d / &2 /\ norm(p - g) < min d e / &2
3697       ==> norm(h - g) < d /\ norm(p - g) < d`];
3698     ALL_TAC] THEN
3699   REWRITE_TAC[SET_RULE `t SUBSET UNIV DELETE x <=> ~(x IN t)`] THEN
3700   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
3701    [ASM_MESON_TAC[NORM_SUB; REAL_ARITH `&0 < e /\ x < min d e / &2 ==> x < e`];
3702     ALL_TAC] THEN
3703   FIRST_X_ASSUM MATCH_MP_TAC THEN
3704   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN] THEN
3705   REWRITE_TAC[IN_DELETE; IN_UNIV; GSYM complex_differentiable] THEN
3706   REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC THEN
3707   ASM_REWRITE_TAC[COMPLEX_SUB_0]);;
3708
3709 let WINDING_NUMBER_UNIQUE = prove
3710  (`!g z e n.
3711         path g /\ ~(z IN path_image g) /\
3712         (!e. &0 < e
3713              ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3714                      pathstart p = pathstart g /\
3715                      pathfinish p = pathfinish g /\
3716                      (!t. t IN interval[vec 0,vec 1]
3717                           ==> norm(g t - p t) < e) /\
3718                      path_integral p (\w. Cx(&1) / (w - z)) =
3719                      Cx(&2) * Cx(pi) * ii * n)
3720         ==> winding_number(g,z) = n`,
3721   REPEAT STRIP_TAC THEN
3722   MP_TAC(ISPECL [`(:complex) DELETE z`; `g:real^1->complex`]
3723         PATH_INTEGRAL_NEARBY_ENDS) THEN
3724   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN
3725   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
3726   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
3727   FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3728   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3729   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`] WINDING_NUMBER) THEN
3730   DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3731   DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
3732   FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `q:real^1->complex`]) THEN
3733   ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[NORM_SUB] THEN ASM_SIMP_TAC[] THEN
3734   STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `\w. Cx(&1) / (w - z)`) THEN
3735   ANTS_TAC THENL
3736    [ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN] THEN
3737     REWRITE_TAC[IN_DELETE; IN_UNIV; GSYM complex_differentiable] THEN
3738     REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC THEN
3739     ASM_REWRITE_TAC[COMPLEX_SUB_0];
3740     ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN
3741     CONV_TAC COMPLEX_RING]);;
3742
3743 let WINDING_NUMBER_UNIQUE_LOOP = prove
3744  (`!g z e n.
3745         path g /\ ~(z IN path_image g) /\ pathfinish g = pathstart g /\
3746         (!e. &0 < e
3747              ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3748                      pathfinish p = pathstart p /\
3749                      (!t. t IN interval[vec 0,vec 1]
3750                           ==> norm(g t - p t) < e) /\
3751                      path_integral p (\w. Cx(&1) / (w - z)) =
3752                      Cx(&2) * Cx(pi) * ii * n)
3753         ==> winding_number(g,z) = n`,
3754   REPEAT STRIP_TAC THEN
3755   MP_TAC(ISPECL [`(:complex) DELETE z`; `g:real^1->complex`]
3756         PATH_INTEGRAL_NEARBY_LOOP) THEN
3757   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN
3758   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
3759   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
3760   FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3761   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3762   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`] WINDING_NUMBER) THEN
3763   DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3764   DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
3765   FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `q:real^1->complex`]) THEN
3766   ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[NORM_SUB] THEN ASM_SIMP_TAC[] THEN
3767   STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `\w. Cx(&1) / (w - z)`) THEN
3768   ANTS_TAC THENL
3769    [ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN] THEN
3770     REWRITE_TAC[IN_DELETE; IN_UNIV; GSYM complex_differentiable] THEN
3771     REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC THEN
3772     ASM_REWRITE_TAC[COMPLEX_SUB_0];
3773     ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN
3774     CONV_TAC COMPLEX_RING]);;
3775
3776 let WINDING_NUMBER_VALID_PATH = prove
3777  (`!g z. valid_path g /\ ~(z IN path_image g)
3778          ==> winding_number(g,z) =
3779              Cx(&1) / (Cx(&2) * Cx(pi) * ii) *
3780              path_integral g (\w. Cx(&1) / (w - z))`,
3781   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
3782   ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
3783   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3784   EXISTS_TAC `g:real^1->complex` THEN
3785   ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
3786   MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_FIELD);;
3787
3788 let HAS_PATH_INTEGRAL_WINDING_NUMBER = prove
3789  (`!g z. valid_path g /\ ~(z IN path_image g)
3790          ==> ((\w. Cx(&1) / (w - z)) has_path_integral
3791               (Cx(&2) * Cx(pi) * ii * winding_number(g,z))) g`,
3792   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH] THEN
3793   ASM_SIMP_TAC[CX_2PII_NZ; COMPLEX_FIELD
3794    `~(a * b * c = Cx(&0))
3795     ==> a * b * c * Cx(&1) / (a * b * c) * z = z`] THEN
3796   MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
3797   ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF]);;
3798
3799 let WINDING_NUMBER_TRIVIAL = prove
3800  (`!a z. ~(z = a) ==> winding_number(linepath(a,a),z) = Cx(&0)`,
3801   SIMP_TAC[VALID_PATH_LINEPATH; PATH_INTEGRAL_TRIVIAL; COMPLEX_MUL_RZERO;
3802            WINDING_NUMBER_VALID_PATH; PATH_IMAGE_LINEPATH; SEGMENT_REFL;
3803            IN_SING]);;
3804
3805 let WINDING_NUMBER_JOIN = prove
3806  (`!g1 g2 z.
3807         path g1 /\ path g2 /\ pathfinish g1 = pathstart g2 /\
3808         ~(z IN path_image g1) /\ ~(z IN path_image g2)
3809         ==> winding_number(g1 ++ g2,z) =
3810             winding_number(g1,z) + winding_number(g2,z)`,
3811   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
3812   ASM_SIMP_TAC[PATH_JOIN; PATH_IMAGE_JOIN; IN_UNION] THEN
3813   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3814   MP_TAC(ISPECL [`g2:real^1->complex`; `z:complex`; `e:real`]
3815     WINDING_NUMBER) THEN
3816   MP_TAC(ISPECL [`g1:real^1->complex`; `z:complex`; `e:real`]
3817     WINDING_NUMBER) THEN
3818   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
3819   X_GEN_TAC `p1:real^1->complex` THEN STRIP_TAC THEN
3820   X_GEN_TAC `p2:real^1->complex` THEN STRIP_TAC THEN
3821   EXISTS_TAC `p1 ++ p2:real^1->complex` THEN
3822   ASM_SIMP_TAC[VALID_PATH_JOIN; PATHSTART_JOIN; PATHFINISH_JOIN] THEN
3823   ASM_SIMP_TAC[PATH_IMAGE_JOIN; IN_UNION] THEN  CONJ_TAC THENL
3824    [REWRITE_TAC[joinpaths; IN_INTERVAL_1; DROP_VEC] THEN REPEAT STRIP_TAC THEN
3825     COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
3826     FIRST_X_ASSUM MATCH_MP_TAC THEN
3827     ASM_REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; DROP_CMUL; DROP_SUB] THEN
3828     ASM_REAL_ARITH_TAC;
3829     W(MP_TAC o PART_MATCH (lhs o rand) PATH_INTEGRAL_JOIN o lhand o snd) THEN
3830     ASM_REWRITE_TAC[COMPLEX_ADD_LDISTRIB] THEN
3831     DISCH_THEN MATCH_MP_TAC THEN
3832     CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_INVERSEDIFF THEN
3833     ASM_REWRITE_TAC[]]);;
3834
3835 let WINDING_NUMBER_REVERSEPATH = prove
3836  (`!g z. path g /\ ~(z IN path_image g)
3837          ==> winding_number(reversepath g,z) = --(winding_number(g,z))`,
3838   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
3839   ASM_SIMP_TAC[PATH_REVERSEPATH; PATH_IMAGE_REVERSEPATH] THEN
3840   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3841   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `e:real`]
3842     WINDING_NUMBER) THEN
3843   ASM_REWRITE_TAC[] THEN
3844   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3845   EXISTS_TAC `reversepath p:real^1->complex` THEN
3846   ASM_SIMP_TAC[VALID_PATH_REVERSEPATH; PATH_IMAGE_REVERSEPATH;
3847                PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
3848                PATH_INTEGRAL_REVERSEPATH; PATH_INTEGRABLE_INVERSEDIFF] THEN
3849   REWRITE_TAC[COMPLEX_MUL_RNEG; reversepath; IN_INTERVAL_1; DROP_VEC] THEN
3850   REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3851   REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; DROP_SUB] THEN ASM_REAL_ARITH_TAC);;
3852
3853 let WINDING_NUMBER_SHIFTPATH = prove
3854  (`!g a z. path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g) /\
3855            a IN interval[vec 0,vec 1]
3856            ==> winding_number(shiftpath a g,z) = winding_number(g,z)`,
3857   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE_LOOP THEN
3858   ASM_SIMP_TAC[PATH_SHIFTPATH; PATH_IMAGE_SHIFTPATH] THEN CONJ_TAC THENL
3859    [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL_1; DROP_VEC]) THEN
3860     ASM_SIMP_TAC[PATHSTART_SHIFTPATH; PATHFINISH_SHIFTPATH];
3861     ALL_TAC] THEN
3862   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3863   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `e:real`]
3864     WINDING_NUMBER) THEN ASM_REWRITE_TAC[] THEN
3865   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3866   EXISTS_TAC `shiftpath a p:real^1->complex` THEN
3867   ASM_SIMP_TAC[VALID_PATH_SHIFTPATH; PATH_IMAGE_SHIFTPATH;
3868                PATH_INTEGRAL_SHIFTPATH; PATH_INTEGRABLE_INVERSEDIFF] THEN
3869   RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL_1; DROP_VEC]) THEN
3870   ASM_SIMP_TAC[PATHSTART_SHIFTPATH; PATHFINISH_SHIFTPATH] THEN
3871   SIMP_TAC[COMPLEX_MUL_RNEG; shiftpath; IN_INTERVAL_1; DROP_ADD; DROP_VEC] THEN
3872   REPEAT STRIP_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
3873   FIRST_X_ASSUM MATCH_MP_TAC THEN
3874   REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; DROP_SUB; DROP_ADD] THEN
3875   ASM_REAL_ARITH_TAC);;
3876
3877 let WINDING_NUMBER_SPLIT_LINEPATH = prove
3878  (`!a b c z.
3879     c IN segment[a,b] /\ ~(z IN segment[a,b])
3880     ==> winding_number(linepath(a,b),z) =
3881         winding_number(linepath(a,c),z) +
3882         winding_number(linepath(c,b),z)`,
3883   REPEAT STRIP_TAC THEN
3884   SUBGOAL_THEN `~((z:complex) IN segment[a,c]) /\ ~(z IN segment[c,b])`
3885   STRIP_ASSUME_TAC THENL
3886    [CONJ_TAC THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
3887      `~(z IN s) ==> t SUBSET s ==> ~(z IN t)`)) THEN
3888     ASM_REWRITE_TAC[SUBSET_SEGMENT; ENDS_IN_SEGMENT];
3889     ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; PATH_IMAGE_LINEPATH;
3890                  VALID_PATH_LINEPATH] THEN
3891     REWRITE_TAC[GSYM COMPLEX_ADD_LDISTRIB] THEN AP_TERM_TAC THEN
3892     MATCH_MP_TAC PATH_INTEGRAL_SPLIT_LINEPATH THEN
3893     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN
3894     SIMP_TAC[CONTINUOUS_ON_CONST; CONTINUOUS_ON_SUB; CONTINUOUS_ON_ID] THEN
3895     ASM_MESON_TAC[COMPLEX_SUB_0]]);;
3896
3897 let WINDING_NUMBER_EQUAL = prove
3898  (`!p q z. (!t. t IN interval[vec 0,vec 1] ==> p t = q t)
3899            ==> winding_number(p,z) = winding_number(q,z)`,
3900   REPEAT STRIP_TAC THEN SIMP_TAC[winding_number; PATH_INTEGRAL_INTEGRAL] THEN
3901   AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3902   X_GEN_TAC `W:complex` THEN REWRITE_TAC[] THEN
3903   AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3904   X_GEN_TAC `e:real` THEN REWRITE_TAC[] THEN
3905   ASM_CASES_TAC `&0 < e` THEN ASM_REWRITE_TAC[] THEN
3906   AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3907   X_GEN_TAC `g:real^1->complex` THEN
3908   ASM_SIMP_TAC[pathstart; pathfinish; ENDS_IN_UNIT_INTERVAL]);;
3909
3910 let WINDING_NUMBER_OFFSET = prove
3911  (`!p z. winding_number(p,z) = winding_number((\w. p w - z),Cx(&0))`,
3912   REPEAT GEN_TAC THEN REWRITE_TAC[winding_number; PATH_INTEGRAL_INTEGRAL] THEN
3913   AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3914   X_GEN_TAC `W:complex` THEN REWRITE_TAC[] THEN
3915   AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3916   X_GEN_TAC `e:real` THEN REWRITE_TAC[] THEN
3917   ASM_CASES_TAC `&0 < e` THEN
3918   ASM_REWRITE_TAC[path_image; valid_path; pathstart; pathfinish] THEN
3919   EQ_TAC THEN
3920   DISCH_THEN(X_CHOOSE_THEN `g:real^1->complex` STRIP_ASSUME_TAC) THENL
3921    [EXISTS_TAC `\t. (g:real^1->complex) t - z`;
3922     EXISTS_TAC `\t. (g:real^1->complex) t + z`] THEN
3923   ASM_REWRITE_TAC[COMPLEX_RING `(p - z) - (g - z):complex = p - g`;
3924                   COMPLEX_RING `p - (g + z):complex = p - z - g`;
3925                   COMPLEX_RING `(p - z) + z:complex = p`;
3926                   COMPLEX_SUB_RZERO] THEN
3927   RULE_ASSUM_TAC(REWRITE_RULE[IN_IMAGE]) THEN
3928   ASM_SIMP_TAC[PIECEWISE_DIFFERENTIABLE_ADD; PIECEWISE_DIFFERENTIABLE_SUB;
3929                DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE;
3930                DIFFERENTIABLE_ON_CONST; IN_IMAGE] THEN
3931   ASM_REWRITE_TAC[COMPLEX_RING `Cx(&0) = w - z <=> z = w`;
3932                   COMPLEX_RING `z = w + z <=> Cx(&0) = w`] THEN
3933   FIRST_X_ASSUM(fun th -> GEN_REWRITE_TAC RAND_CONV [SYM th]) THEN
3934   MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
3935   REWRITE_TAC[COMPLEX_RING `(w + z) - z = w - Cx(&0)`] THEN AP_TERM_TAC THEN
3936   REWRITE_TAC[vector_derivative; has_vector_derivative; HAS_DERIVATIVE_AT;
3937               COMPLEX_RING `(x - z) - (w - z):complex = x - w`;
3938               COMPLEX_RING `(x + z) - (w + z):complex = x - w`]);;
3939
3940 (* ------------------------------------------------------------------------- *)
3941 (* A combined theorem deducing several things piecewise.                     *)
3942 (* ------------------------------------------------------------------------- *)
3943
3944 let WINDING_NUMBER_JOIN_POS_COMBINED = prove
3945  (`!g1 g2 z.
3946        (valid_path g1 /\
3947         ~(z IN path_image g1) /\
3948         &0 < Re(winding_number(g1,z))) /\
3949        (valid_path g2 /\
3950         ~(z IN path_image g2) /\
3951         &0 < Re(winding_number(g2,z))) /\
3952        pathfinish g1 = pathstart g2
3953        ==> valid_path(g1 ++ g2) /\
3954            ~(z IN path_image(g1 ++ g2)) /\
3955            &0 < Re(winding_number(g1 ++ g2,z))`,
3956   REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_SIMP_TAC[VALID_PATH_JOIN] THEN
3957   ASM_SIMP_TAC[PATH_IMAGE_JOIN; VALID_PATH_IMP_PATH; IN_UNION] THEN
3958   ASM_SIMP_TAC[WINDING_NUMBER_JOIN; VALID_PATH_IMP_PATH; RE_ADD] THEN
3959   ASM_REAL_ARITH_TAC);;
3960
3961 (* ------------------------------------------------------------------------- *)
3962 (* Useful sufficient conditions for the winding number to be positive etc.   *)
3963 (* ------------------------------------------------------------------------- *)
3964
3965 let RE_WINDING_NUMBER = prove
3966  (`!g z. valid_path g /\ ~(z IN path_image g)
3967          ==> Re(winding_number(g,z)) =
3968              Im(path_integral g (\w. Cx(&1) / (w - z))) / (&2 * pi)`,
3969   SIMP_TAC[WINDING_NUMBER_VALID_PATH; complex_div; COMPLEX_MUL_LID] THEN
3970   REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM CX_MUL] THEN
3971   REWRITE_TAC[COMPLEX_INV_MUL; GSYM CX_INV; COMPLEX_INV_II] THEN
3972   REWRITE_TAC[COMPLEX_MUL_LNEG; COMPLEX_MUL_RNEG; RE_NEG] THEN
3973   REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; RE_MUL_CX; RE_MUL_II] THEN
3974   MP_TAC PI_POS THEN CONV_TAC REAL_FIELD);;
3975
3976 let WINDING_NUMBER_POS_LE = prove
3977  (`!g z. valid_path g /\ ~(z IN path_image g) /\
3978          (!x. x IN interval(vec 0,vec 1)
3979               ==> &0 <= Im(vector_derivative g (at x) * cnj(g x - z)))
3980          ==> &0 <= Re(winding_number(g,z))`,
3981   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[RE_WINDING_NUMBER] THEN
3982   MATCH_MP_TAC REAL_LE_DIV THEN
3983   SIMP_TAC[REAL_LE_MUL; REAL_POS; PI_POS; REAL_LT_IMP_LE; IM_DEF] THEN
3984   MATCH_MP_TAC(INST_TYPE [`:1`,`:M`; `:2`,`:N`]
3985     HAS_INTEGRAL_COMPONENT_POS) THEN
3986   MAP_EVERY EXISTS_TAC
3987    [`\x:real^1. if x IN interval(vec 0,vec 1)
3988                 then Cx(&1) / (g x - z) * vector_derivative g (at x)
3989                 else Cx(&0)`;
3990     `interval[vec 0:real^1,vec 1]`] THEN
3991   REWRITE_TAC[ARITH; DIMINDEX_2] THEN CONJ_TAC THENL
3992    [MATCH_MP_TAC HAS_INTEGRAL_SPIKE_INTERIOR THEN
3993     EXISTS_TAC `\x:real^1. Cx(&1) / (g x - z) * vector_derivative g (at x)` THEN
3994     ASM_SIMP_TAC[] THEN REWRITE_TAC[GSYM HAS_PATH_INTEGRAL] THEN
3995     MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
3996     ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF];
3997     ALL_TAC] THEN
3998   X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN COND_CASES_TAC THEN
3999   ASM_REWRITE_TAC[GSYM IM_DEF; IM_CX; REAL_LE_REFL] THEN
4000   FIRST_X_ASSUM(MP_TAC o SPEC `x:real^1`) THEN
4001   ASM_REWRITE_TAC[complex_div; COMPLEX_MUL_LID] THEN
4002   REWRITE_TAC[complex_inv; complex_inv; complex_mul; RE; IM; cnj] THEN
4003   REWRITE_TAC[real_div; REAL_RING
4004    `(a * x) * b + (--c * x) * d:real = x * (a * b - c * d)`] THEN
4005   REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN
4006   SIMP_TAC[REAL_POW_2; REAL_LE_INV_EQ; REAL_LE_ADD; REAL_LE_SQUARE] THEN
4007   ASM_REAL_ARITH_TAC);;
4008
4009 let WINDING_NUMBER_POS_LT_LEMMA = prove
4010  (`!g z e. valid_path g /\ ~(z IN path_image g) /\ &0 < e /\
4011            (!x. x IN interval(vec 0,vec 1)
4012                 ==> e <= Im(vector_derivative g (at x) / (g x - z)))
4013            ==> &0 < Re(winding_number(g,z))`,
4014   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[RE_WINDING_NUMBER] THEN
4015   MATCH_MP_TAC REAL_LT_DIV THEN
4016   SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; ARITH; PI_POS] THEN
4017   MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `Im(ii * Cx e)` THEN
4018   CONJ_TAC THENL
4019    [ASM_REWRITE_TAC[COMPLEX_MUL_LNEG; IM_MUL_II; IM_NEG; RE_CX]; ALL_TAC] THEN
4020   REWRITE_TAC[IM_DEF] THEN
4021   MATCH_MP_TAC(ISPECL [`\x:real^1. ii * Cx e`;
4022         `\x:real^1. if x IN interval(vec 0,vec 1)
4023                     then Cx(&1) / (g x - z) * vector_derivative g (at x)
4024                     else ii * Cx e`;
4025         `interval[vec 0:real^1,vec 1]`; `ii * Cx e`;
4026         `path_integral g (\w. Cx(&1) / (w - z))`; `2`]
4027        HAS_INTEGRAL_COMPONENT_LE) THEN
4028   REWRITE_TAC[DIMINDEX_2; ARITH] THEN REPEAT CONJ_TAC THENL
4029    [GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_MUL_LID] THEN
4030     ONCE_REWRITE_TAC[GSYM CONTENT_UNIT_1] THEN
4031     REWRITE_TAC[HAS_INTEGRAL_CONST];
4032     MATCH_MP_TAC HAS_INTEGRAL_SPIKE_INTERIOR THEN
4033     EXISTS_TAC `\x:real^1. Cx(&1) / (g x - z) * vector_derivative g (at x)` THEN
4034     ASM_SIMP_TAC[] THEN REWRITE_TAC[GSYM HAS_PATH_INTEGRAL] THEN
4035     MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
4036     ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF];
4037     X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN COND_CASES_TAC THEN
4038     ASM_REWRITE_TAC[GSYM IM_DEF; IM_CX; REAL_LE_REFL] THEN
4039     REWRITE_TAC[IM_MUL_II; RE_CX] THEN
4040     FIRST_X_ASSUM(MP_TAC o SPEC `x:real^1`) THEN
4041     ASM_REWRITE_TAC[complex_div; COMPLEX_MUL_LID; COMPLEX_MUL_SYM]]);;
4042
4043 let WINDING_NUMBER_POS_LT = prove
4044  (`!g z e. valid_path g /\ ~(z IN path_image g) /\ &0 < e /\
4045            (!x. x IN interval(vec 0,vec 1)
4046                 ==> e <= Im(vector_derivative g (at x) * cnj(g x - z)))
4047            ==> &0 < Re(winding_number(g,z))`,
4048   REPEAT STRIP_TAC THEN
4049   SUBGOAL_THEN `bounded (IMAGE (\w. w - z) (path_image g))` MP_TAC THENL
4050    [REWRITE_TAC[path_image; GSYM IMAGE_o] THEN
4051     MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
4052     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
4053     REWRITE_TAC[COMPACT_INTERVAL] THEN
4054     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
4055     SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
4056     MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON THEN
4057     ASM_REWRITE_TAC[GSYM valid_path];
4058     ALL_TAC] THEN
4059   REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
4060   DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
4061   MATCH_MP_TAC WINDING_NUMBER_POS_LT_LEMMA THEN
4062   EXISTS_TAC `e:real / B pow 2` THEN
4063   ASM_SIMP_TAC[REAL_LT_DIV; REAL_POW_LT] THEN
4064   X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
4065   ONCE_REWRITE_TAC[COMPLEX_DIV_CNJ] THEN
4066   REWRITE_TAC[real_div; complex_div; GSYM CX_INV; GSYM CX_POW] THEN
4067   REWRITE_TAC[IM_MUL_CX] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
4068   ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LE_INV_EQ; REAL_POW_LE] THEN
4069   MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL
4070    [MATCH_MP_TAC REAL_POW_LT THEN REWRITE_TAC[NORM_POS_LT; VECTOR_SUB_EQ] THEN
4071     UNDISCH_TAC `~((z:complex) IN path_image g)`;
4072     MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[NORM_POS_LE] THEN
4073     FIRST_X_ASSUM MATCH_MP_TAC] THEN
4074   REWRITE_TAC[path_image; IN_IMAGE] THEN
4075   ASM_MESON_TAC[SUBSET; INTERVAL_OPEN_SUBSET_CLOSED]);;
4076
4077 (* ------------------------------------------------------------------------- *)
4078 (* The winding number is an integer (proof from Ahlfors's book).             *)
4079 (* ------------------------------------------------------------------------- *)
4080
4081 let WINDING_NUMBER_AHLFORS_LEMMA = prove
4082  (`!g a b.
4083         g piecewise_differentiable_on interval [a,b] /\
4084         drop a <= drop b /\ (!x. x IN interval [a,b] ==> ~(g x = z))
4085         ==> (\x. vector_derivative g (at x within interval[a,b]) / (g(x) - z))
4086             integrable_on interval[a,b] /\
4087             cexp(--(integral (interval[a,b])
4088                         (\x. vector_derivative g (at x within interval[a,b]) /
4089                                (g(x) - z)))) *
4090             (g(b) - z) = g(a) - z`,
4091   let lemma = prove
4092    (`!f g g' s x z.
4093           (g has_vector_derivative g') (at x within s) /\
4094           (f has_vector_derivative (g' / (g x - z))) (at x within s) /\
4095           ~(g x = z)
4096           ==> ((\x. cexp(--f x) * (g x - z)) has_vector_derivative Cx(&0))
4097               (at x within s)`,
4098     REPEAT STRIP_TAC THEN
4099     SUBGOAL_THEN
4100      `cexp(--f x) * (g' - Cx(&0)) +
4101       (cexp(--f x) * --(g' / ((g:real^1->complex) x - z))) * (g x - z) = Cx(&0)`
4102      (SUBST1_TAC o SYM)
4103     THENL
4104      [FIRST_X_ASSUM(MP_TAC o check (is_neg o concl)) THEN
4105       CONV_TAC COMPLEX_FIELD;
4106       ALL_TAC] THEN
4107     MATCH_MP_TAC(ISPEC `( * ):complex->complex->complex`
4108       HAS_VECTOR_DERIVATIVE_BILINEAR_WITHIN) THEN
4109     REWRITE_TAC[BILINEAR_COMPLEX_MUL; GSYM COMPLEX_VEC_0] THEN
4110     ASM_SIMP_TAC[HAS_VECTOR_DERIVATIVE_SUB; ETA_AX;
4111                  HAS_VECTOR_DERIVATIVE_CONST] THEN
4112     GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
4113     REWRITE_TAC[has_vector_derivative] THEN
4114     SUBGOAL_THEN `!x y. (\z. drop z % (x * y :complex)) =
4115                         (\w. x * w) o (\z. drop z % y)`
4116      (fun th -> REWRITE_TAC[th])
4117     THENL
4118      [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4119       SIMPLE_COMPLEX_ARITH_TAC;
4120       ALL_TAC] THEN
4121     MATCH_MP_TAC DIFF_CHAIN_WITHIN THEN
4122     REWRITE_TAC[GSYM has_complex_derivative; GSYM has_vector_derivative] THEN
4123     SIMP_TAC[HAS_COMPLEX_DERIVATIVE_CEXP; HAS_COMPLEX_DERIVATIVE_AT_WITHIN] THEN
4124     ASM_SIMP_TAC[HAS_VECTOR_DERIVATIVE_NEG]) in
4125   REPEAT GEN_TAC THEN STRIP_TAC THEN
4126   SUBGOAL_THEN
4127    `!w. ~(w = z)
4128         ==> ?h. !y. norm(y - w) < norm(w - z)
4129                     ==> (h has_complex_derivative inv(y - z)) (at y)`
4130    (LABEL_TAC "P")
4131   THENL
4132    [REPEAT STRIP_TAC THEN
4133     MP_TAC(ISPECL [`\w:complex. inv(w - z)`;
4134                `ball(w:complex,norm(w - z))`;
4135                `{}:complex->bool`]
4136               HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
4137     SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL; INTERIOR_OPEN] THEN
4138     REWRITE_TAC[CONVEX_BALL; FINITE_RULES; DIFF_EMPTY] THEN ANTS_TAC THENL
4139      [SUBGOAL_THEN `(\w. inv(w - z)) holomorphic_on ball(w:complex,norm(w - z))`
4140        (fun th ->
4141         MESON_TAC[HOLOMORPHIC_ON_OPEN; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
4142                   OPEN_BALL; complex_differentiable; th]) THEN
4143       SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; IN_BALL] THEN
4144       X_GEN_TAC `u:complex` THEN DISCH_TAC THEN
4145       EXISTS_TAC `--Cx(&1) / (u - z) pow 2` THEN COMPLEX_DIFF_TAC THEN
4146       REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_SUB_0] THEN
4147       ASM_MESON_TAC[REAL_LT_REFL; dist];
4148       ALL_TAC] THEN
4149     REWRITE_TAC[IN_BALL; dist] THEN MESON_TAC[NORM_SUB];
4150     ALL_TAC] THEN
4151   SUBGOAL_THEN
4152    `!t. t IN interval[a,b]
4153         ==> (\x. vector_derivative g (at x within interval[a,b]) / (g(x) - z))
4154             integrable_on interval[a,t] /\
4155             cexp(--(integral (interval[a,t])
4156                          (\x. vector_derivative g (at x within interval[a,b]) /
4157                               (g(x) - z)))) *
4158             (g(t) - z) = g(a) - z`
4159    (fun th -> MATCH_MP_TAC th THEN
4160               ASM_REWRITE_TAC[IN_INTERVAL_1; REAL_LE_REFL]) THEN
4161   REWRITE_TAC[TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
4162   REWRITE_TAC[FORALL_AND_THM] THEN
4163   MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
4164    [REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
4165     MAP_EVERY EXISTS_TAC [`a:real^1`; `b:real^1`] THEN
4166     ASM_REWRITE_TAC[SUBSET_INTERVAL_1; REAL_LE_REFL] THEN
4167     CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[IN_INTERVAL_1]] THEN
4168     REWRITE_TAC[integrable_on; complex_div] THEN
4169     ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
4170     REWRITE_TAC[HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
4171     REWRITE_TAC[GSYM integrable_on] THEN
4172     MATCH_MP_TAC PATH_INTEGRAL_LOCAL_PRIMITIVE_ANY THEN
4173     EXISTS_TAC `(:complex) DELETE z` THEN
4174     ASM_SIMP_TAC[IN_DELETE; IN_UNIV;
4175                  DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE] THEN
4176     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
4177     EXISTS_TAC `norm(w - z:complex)` THEN
4178     ASM_REWRITE_TAC[COMPLEX_NORM_NZ; COMPLEX_SUB_0] THEN
4179     ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
4180     ALL_TAC] THEN
4181   DISCH_TAC THEN MATCH_MP_TAC HAS_DERIVATIVE_ZERO_UNIQUE_STRONG_INTERVAL THEN
4182   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [piecewise_differentiable_on]) THEN
4183   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
4184   MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[IN_DIFF; FINITE_IMP_COUNTABLE] THEN
4185   X_GEN_TAC `k:real^1->bool` THEN STRIP_TAC THEN
4186   ASM_SIMP_TAC[CONVEX_INTERVAL; INTEGRAL_REFL] THEN
4187   REWRITE_TAC[COMPLEX_VEC_0; COMPLEX_NEG_0; CEXP_0; COMPLEX_MUL_LID] THEN
4188   CONJ_TAC THENL
4189    [MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
4190     ASM_SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; ETA_AX;
4191                  PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON] THEN
4192     GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
4193     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
4194     REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
4195     MATCH_MP_TAC CONTINUOUS_ON_NEG THEN
4196     MATCH_MP_TAC INDEFINITE_INTEGRAL_CONTINUOUS_RIGHT THEN
4197     FIRST_X_ASSUM MATCH_MP_TAC THEN
4198     ASM_REWRITE_TAC[IN_INTERVAL_1; REAL_LE_REFL];
4199     ALL_TAC] THEN
4200   X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
4201   MP_TAC(ISPECL [`\w:complex. inv(w - z)`;
4202                  `ball((g:real^1->complex) t,dist(g t,z))`;
4203                  `{}:complex->bool`]
4204                 HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
4205   SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL; INTERIOR_OPEN] THEN
4206   REWRITE_TAC[CONVEX_BALL; FINITE_RULES; DIFF_EMPTY] THEN ANTS_TAC THENL
4207    [SUBGOAL_THEN `(\w. inv(w - z)) holomorphic_on ball(g(t:real^1),dist(g t,z))`
4208      (fun th ->
4209       MESON_TAC[HOLOMORPHIC_ON_OPEN; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
4210                 OPEN_BALL; complex_differentiable; th]) THEN
4211     SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; IN_BALL] THEN
4212     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
4213     EXISTS_TAC `--Cx(&1) / (w - z) pow 2` THEN COMPLEX_DIFF_TAC THEN
4214     REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_SUB_0] THEN
4215     ASM_MESON_TAC[REAL_LT_REFL];
4216     ALL_TAC] THEN
4217   REWRITE_TAC[IN_BALL; dist] THEN
4218   DISCH_THEN(X_CHOOSE_TAC `h:complex->complex`) THEN
4219   SUBGOAL_THEN `(\h. Cx(&0)) = (\h. drop h % Cx(&0))` SUBST1_TAC THENL
4220    [REWRITE_TAC[FUN_EQ_THM; GSYM COMPLEX_VEC_0; VECTOR_MUL_RZERO];
4221     ALL_TAC] THEN
4222   REWRITE_TAC[GSYM has_vector_derivative] THEN MATCH_MP_TAC lemma THEN
4223   EXISTS_TAC `vector_derivative g (at t within interval[a,b]):complex` THEN
4224   REPEAT CONJ_TAC THENL
4225    [REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
4226     ASM_MESON_TAC[DIFFERENTIABLE_AT_WITHIN];
4227     ALL_TAC;
4228     ASM_MESON_TAC[]] THEN
4229   REWRITE_TAC[has_vector_derivative] THEN
4230   MATCH_MP_TAC HAS_DERIVATIVE_TRANSFORM_WITHIN THEN
4231   ASM_REWRITE_TAC[GSYM has_vector_derivative] THEN
4232   EXISTS_TAC `\u. integral (interval [a,t])
4233                   (\x. vector_derivative g (at x within interval [a,b]) /
4234                        ((g:real^1->complex) x - z)) + (h(g(u)) - h(g(t)))` THEN
4235   REWRITE_TAC[LEFT_EXISTS_AND_THM; CONJ_ASSOC] THEN
4236   REWRITE_TAC[GSYM CONJ_ASSOC] THEN CONJ_TAC THENL
4237    [ALL_TAC;
4238     ONCE_REWRITE_TAC[COMPLEX_RING `a + (b - c) = b + (a - c):complex`] THEN
4239     GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_ADD_RID] THEN
4240     MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_ADD THEN
4241     REWRITE_TAC[HAS_VECTOR_DERIVATIVE_CONST] THEN
4242     REWRITE_TAC[has_vector_derivative] THEN
4243     SUBGOAL_THEN `!x y. (\h. drop h % x / y) =
4244                         (\x. inv(y) * x) o (\h. drop h % x)`
4245      (fun th -> REWRITE_TAC[th])
4246     THENL
4247      [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4248       SIMPLE_COMPLEX_ARITH_TAC;
4249       ALL_TAC] THEN
4250     GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
4251     MATCH_MP_TAC DIFF_CHAIN_WITHIN THEN
4252     REWRITE_TAC[GSYM has_complex_derivative; GSYM has_vector_derivative] THEN
4253     REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
4254     CONJ_TAC THENL [ASM_MESON_TAC[DIFFERENTIABLE_AT_WITHIN]; ALL_TAC] THEN
4255     MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
4256     FIRST_X_ASSUM MATCH_MP_TAC THEN
4257     REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; COMPLEX_NORM_NZ] THEN
4258     ASM_SIMP_TAC[COMPLEX_SUB_0]] THEN
4259   SUBGOAL_THEN
4260    `?d. &0 < d /\
4261         !y:real^1. y IN interval[a,b] /\ dist(y,t) < d
4262                    ==> dist(g y:complex,g t) < norm(g t - z) /\ ~(y IN k)`
4263   MP_TAC THENL
4264    [SUBGOAL_THEN `(g:real^1->complex) continuous (at t within interval[a,b])`
4265     MP_TAC THENL
4266      [ASM_MESON_TAC[PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON;
4267                     CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN];
4268       ALL_TAC] THEN
4269     REWRITE_TAC[continuous_within] THEN
4270     DISCH_THEN(MP_TAC o SPEC `norm((g:real^1->complex) t - z)`) THEN
4271     ASM_SIMP_TAC[COMPLEX_NORM_NZ; COMPLEX_SUB_0] THEN
4272     DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
4273     FIRST_X_ASSUM(X_CHOOSE_THEN `d2:real` STRIP_ASSUME_TAC o
4274       SPEC `t:real^1` o MATCH_MP FINITE_SET_AVOID) THEN
4275     EXISTS_TAC `min d1 d2` THEN ASM_SIMP_TAC[REAL_LT_MIN] THEN
4276     ASM_MESON_TAC[DIST_SYM; REAL_NOT_LE];
4277     ALL_TAC] THEN
4278   REWRITE_TAC[TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
4279   REWRITE_TAC[FORALL_AND_THM] THEN
4280   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN STRIP_TAC THEN
4281   ASM_REWRITE_TAC[] THEN X_GEN_TAC `u:real^1` THEN REWRITE_TAC[dist] THEN
4282   STRIP_TAC THEN
4283   DISJ_CASES_TAC(REAL_ARITH `drop t <= drop u \/ drop u <= drop t`) THENL
4284    [SUBGOAL_THEN
4285      `integral (interval [a,u])
4286         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) =
4287       integral (interval [a,t])
4288         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) +
4289       integral (interval [t,u])
4290         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z))`
4291     SUBST1_TAC THENL
4292      [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE THEN
4293       ASM_MESON_TAC[IN_INTERVAL_1];
4294       ALL_TAC] THEN
4295     SIMP_TAC[COMPLEX_RING `a + x = a + y <=> y:complex = x`];
4296     SUBGOAL_THEN
4297      `integral (interval [a,t])
4298         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) =
4299       integral (interval [a,u])
4300         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) +
4301       integral (interval [u,t])
4302         (\x. vector_derivative g (at x within interval [a,b]) / (g x - z))`
4303     SUBST1_TAC THENL
4304      [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE THEN
4305       ASM_MESON_TAC[IN_INTERVAL_1];
4306       ALL_TAC] THEN
4307     SIMP_TAC[COMPLEX_RING `(a + x) + (w - z) = a <=> x:complex = z - w`]] THEN
4308   (MATCH_MP_TAC INTEGRAL_UNIQUE THEN
4309    MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS THEN
4310    ASM_REWRITE_TAC[GSYM o_DEF] THEN X_GEN_TAC `x:real^1` THEN
4311    REPEAT STRIP_TAC THEN REWRITE_TAC[has_vector_derivative; COMPLEX_CMUL] THEN
4312    SUBGOAL_THEN `!x y. (\h. Cx(drop h) * x / y) =
4313                        (\x. inv(y) * x) o (\h. drop h % x)`
4314     (fun th -> REWRITE_TAC[th])
4315    THENL
4316     [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4317      SIMPLE_COMPLEX_ARITH_TAC;
4318      ALL_TAC] THEN
4319    MATCH_MP_TAC DIFF_CHAIN_WITHIN THEN
4320    REWRITE_TAC[GSYM has_complex_derivative; GSYM has_vector_derivative] THEN
4321    CONJ_TAC THENL
4322     [MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_WITHIN_SUBSET THEN
4323      EXISTS_TAC `interval[a:real^1,b]` THEN
4324      REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN CONJ_TAC THENL
4325       [MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
4326        FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL
4327         [ALL_TAC; FIRST_X_ASSUM MATCH_MP_TAC];
4328        ALL_TAC] THEN
4329      REPEAT(FIRST_X_ASSUM(MP_TAC o
4330         check (fun t -> not(is_forall (concl t))))) THEN
4331      REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB] THEN
4332      REWRITE_TAC[SUBSET_INTERVAL_1; IN_INTERVAL_1; REAL_LE_REFL] THEN
4333      REAL_ARITH_TAC;
4334      ALL_TAC] THEN
4335    MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
4336    FIRST_X_ASSUM MATCH_MP_TAC THEN GEN_REWRITE_TAC LAND_CONV [GSYM dist] THEN
4337    ONCE_REWRITE_TAC[DIST_SYM] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
4338    CONJ_TAC THENL [ASM_MESON_TAC[IN_INTERVAL_1; REAL_LE_TRANS]; ALL_TAC] THEN
4339    REPEAT(FIRST_X_ASSUM(MP_TAC o
4340       check (fun t -> not(is_forall (concl t))))) THEN
4341    REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB] THEN
4342    REWRITE_TAC[SUBSET_INTERVAL_1; IN_INTERVAL_1; REAL_LE_REFL] THEN
4343    REAL_ARITH_TAC));;
4344
4345 let WINDING_NUMBER_AHLFORS = prove
4346  (`!g z a b.
4347         g piecewise_differentiable_on interval [a,b] /\
4348         drop a <= drop b /\ (!x. x IN interval [a,b] ==> ~(g x = z))
4349         ==> (\x. vector_derivative g (at x) / (g(x) - z))
4350             integrable_on interval[a,b] /\
4351             cexp(--(integral (interval[a,b])
4352                              (\x. vector_derivative g (at x) / (g(x) - z)))) *
4353             (g(b) - z) = g(a) - z`,
4354   REPEAT GEN_TAC THEN STRIP_TAC THEN
4355   REWRITE_TAC[integrable_on; integral] THEN
4356   REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] complex_div] THEN
4357   REWRITE_TAC[GSYM HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
4358   ONCE_REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM](GSYM complex_div)] THEN
4359   REWRITE_TAC[GSYM integral; GSYM integrable_on] THEN
4360   MATCH_MP_TAC WINDING_NUMBER_AHLFORS_LEMMA THEN ASM_REWRITE_TAC[]);;
4361
4362 let WINDING_NUMBER_AHLFORS_FULL = prove
4363  (`!p z. path p /\ ~(z IN path_image p)
4364          ==> pathfinish p - z =
4365              cexp(Cx(&2) * Cx pi * ii * winding_number(p,z)) *
4366              (pathstart p - z)`,
4367   REPEAT STRIP_TAC THEN
4368   MP_TAC(ISPECL [`p:real^1->complex`; `z:complex`; `&1`] WINDING_NUMBER) THEN
4369   ASM_REWRITE_TAC[REAL_LT_01; LEFT_IMP_EXISTS_THM] THEN
4370   X_GEN_TAC `g:real^1->complex` THEN STRIP_TAC THEN
4371   REPEAT(FIRST_X_ASSUM(SUBST_ALL_TAC o SYM)) THEN
4372   RULE_ASSUM_TAC(REWRITE_RULE[valid_path; path_image; IN_IMAGE;
4373         NOT_EXISTS_THM]) THEN
4374   MP_TAC(ISPECL
4375    [`g:real^1->complex`; `z:complex`; `vec 0:real^1`; `vec 1:real^1`]
4376    WINDING_NUMBER_AHLFORS) THEN
4377   ASM_SIMP_TAC[DROP_VEC; REAL_POS; pathstart; pathfinish] THEN ANTS_TAC THENL
4378    [ASM_MESON_TAC[]; DISCH_THEN(SUBST1_TAC o SYM o CONJUNCT2)] THEN
4379   REWRITE_TAC[GSYM CEXP_ADD; COMPLEX_MUL_ASSOC; PATH_INTEGRAL_INTEGRAL] THEN
4380   REWRITE_TAC[SIMPLE_COMPLEX_ARITH `Cx(&1) / z * w = w / z`] THEN
4381   REWRITE_TAC[GSYM complex_sub; COMPLEX_SUB_REFL; CEXP_0; COMPLEX_MUL_LID]);;
4382
4383 (* ------------------------------------------------------------------------- *)
4384 (* State in terms of complex integers. Note the useful equality version.     *)
4385 (* ------------------------------------------------------------------------- *)
4386
4387 let complex_integer = new_definition
4388  `complex_integer z <=> integer(Re z) /\ Im z = &0`;;
4389
4390 let COMPLEX_INTEGER = prove
4391  (`complex_integer z <=> ?n. integer n /\ z = Cx n`,
4392   REWRITE_TAC[COMPLEX_EQ; RE_CX; IM_CX; complex_integer] THEN MESON_TAC[]);;
4393
4394 let INTEGER_WINDING_NUMBER_EQ = prove
4395  (`!g z. path g /\ ~(z IN path_image g)
4396          ==> (complex_integer(winding_number(g,z)) <=>
4397               pathfinish g = pathstart g)`,
4398   REPEAT STRIP_TAC THEN
4399   MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_BALL) THEN
4400   ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4401   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4402   ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_BALL] THEN
4403   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
4404   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `e:real`]
4405     WINDING_NUMBER) THEN
4406   ASM_REWRITE_TAC[] THEN
4407   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
4408   SUBGOAL_THEN
4409    `complex_integer(winding_number(p,z)) <=>
4410     pathfinish p = pathstart p`
4411   MP_TAC THENL
4412    [UNDISCH_THEN
4413      `path_integral p (\w. Cx (&1) / (w - z)) =
4414       Cx (&2) * Cx pi * ii * winding_number (g,z)` (K ALL_TAC) THEN
4415     ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH];
4416     ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; CX_2PII_NZ; COMPLEX_FIELD
4417      `~(a * b * c = Cx(&0))
4418       ==> Cx(&1) / (a * b * c) * a * b * c * z = z`]] THEN
4419   UNDISCH_THEN `pathstart p:complex = pathstart g` (SUBST_ALL_TAC o SYM) THEN
4420   UNDISCH_THEN `pathfinish p:complex = pathfinish g` (SUBST_ALL_TAC o SYM) THEN
4421   RULE_ASSUM_TAC(REWRITE_RULE[valid_path; path_image]) THEN
4422   REWRITE_TAC[pathfinish; pathstart] THEN
4423   MATCH_MP_TAC EQ_TRANS THEN
4424   EXISTS_TAC `cexp(path_integral p (\w. Cx(&1) / (w - z))) = Cx(&1)` THEN
4425   CONJ_TAC THENL
4426    [REWRITE_TAC[CEXP_EQ_1; complex_integer] THEN
4427     REWRITE_TAC[complex_div; COMPLEX_MUL_LID; COMPLEX_INV_MUL] THEN
4428     SIMP_TAC[GSYM CX_INV; GSYM CX_MUL; COMPLEX_MUL_ASSOC; COMPLEX_INV_II] THEN
4429     REWRITE_TAC[RE_MUL_CX; IM_MUL_CX; GSYM COMPLEX_MUL_ASSOC] THEN
4430     REWRITE_TAC[COMPLEX_MUL_LNEG; RE_MUL_II; IM_MUL_II; RE_NEG; IM_NEG] THEN
4431     REWRITE_TAC[REAL_NEGNEG; REAL_ENTIRE; REAL_INV_EQ_0; REAL_NEG_EQ_0] THEN
4432     SIMP_TAC[REAL_OF_NUM_EQ; ARITH; REAL_LT_IMP_NZ; PI_POS] THEN
4433     SIMP_TAC[PI_POS; REAL_FIELD
4434      `&0 < p ==> (x = &2 * n * p <=> (inv(&2) * inv(p)) * x = n)`] THEN
4435     MESON_TAC[];
4436     MP_TAC(ISPECL [`p:real^1->complex`; `z:complex`;
4437                    `vec 0:real^1`; `vec 1:real^1`]
4438                   WINDING_NUMBER_AHLFORS) THEN
4439     ASM_REWRITE_TAC[DROP_VEC; REAL_POS] THEN
4440     ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
4441     DISCH_THEN(MP_TAC o CONJUNCT2) THEN
4442     REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] complex_div] THEN
4443     REWRITE_TAC[integral; GSYM HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
4444     REWRITE_TAC[GSYM has_path_integral; GSYM path_integral] THEN
4445     REWRITE_TAC[CEXP_NEG; COMPLEX_MUL_RID] THEN
4446     MATCH_MP_TAC(COMPLEX_FIELD
4447      `~(i = Cx(&0)) /\ ~(g0 = z)
4448       ==> (inv i * (g1 - z) = g0 - z ==> (i = Cx(&1) <=> g1 = g0))`) THEN
4449     REWRITE_TAC[CEXP_NZ] THEN
4450     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [IN_IMAGE]) THEN
4451     REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN MESON_TAC[REAL_POS; DROP_VEC]]);;
4452
4453 let INTEGER_WINDING_NUMBER = prove
4454  (`!g z. path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g)
4455          ==> complex_integer(winding_number(g,z))`,
4456   MESON_TAC[INTEGER_WINDING_NUMBER_EQ]);;
4457
4458 (* ------------------------------------------------------------------------- *)
4459 (* For |WN| >= 1 the path must contain points in every direction.            *)
4460 (* We can thus bound the WN of a path that doesn't meet some "cut".          *)
4461 (* ------------------------------------------------------------------------- *)
4462
4463 let WINDING_NUMBER_POS_MEETS = prove
4464  (`!g z. valid_path g /\ ~(z IN path_image g) /\
4465          Re(winding_number(g,z)) >= &1
4466          ==> !w. ~(w = z)
4467                  ==> ?a. &0 < a /\ z + (Cx a * (w - z)) IN path_image g`,
4468   REPEAT STRIP_TAC THEN
4469   SUBGOAL_THEN
4470    `!t. t IN interval[vec 0,vec 1] ==> ~((g:real^1->complex) t = z)`
4471   ASSUME_TAC THENL
4472    [UNDISCH_TAC `~((z:complex) IN path_image g)` THEN
4473     REWRITE_TAC[path_image; IN_IMAGE] THEN MESON_TAC[];
4474     ALL_TAC] THEN
4475   ABBREV_TAC `r:complex = (w - z) / (pathstart g - z)` THEN
4476   STRIP_ASSUME_TAC(GSYM(SPEC `r:complex` ARG)) THEN
4477   SUBGOAL_THEN
4478    `?t. t IN interval[vec 0,vec 1] /\
4479         Im(integral (interval[vec 0,t])
4480                     (\x. vector_derivative g (at x) / (g x - z))) = Arg r`
4481   STRIP_ASSUME_TAC THENL
4482    [REWRITE_TAC[IM_DEF] THEN MATCH_MP_TAC IVT_INCREASING_COMPONENT_ON_1 THEN
4483     ASM_SIMP_TAC[DIMINDEX_2; DROP_VEC; ARITH; INTEGRAL_REFL; REAL_POS;
4484                  VEC_COMPONENT] THEN
4485     CONJ_TAC THENL
4486      [MATCH_MP_TAC INDEFINITE_INTEGRAL_CONTINUOUS_RIGHT THEN
4487       REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] complex_div] THEN
4488       REWRITE_TAC[GSYM PATH_INTEGRABLE_ON] THEN
4489       REWRITE_TAC[SIMPLE_COMPLEX_ARITH `inv z = Cx(&1) / z`] THEN
4490       MATCH_MP_TAC PATH_INTEGRABLE_INVERSEDIFF THEN ASM_REWRITE_TAC[];
4491       ALL_TAC] THEN
4492     MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2 * pi` THEN
4493     ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN
4494     UNDISCH_TAC `Re(winding_number (g,z)) >= &1` THEN
4495     ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; GSYM IM_DEF] THEN
4496     REWRITE_TAC[path_integral; HAS_PATH_INTEGRAL; GSYM integral] THEN
4497     SUBST1_TAC(COMPLEX_FIELD `ii = --inv ii`) THEN
4498     REWRITE_TAC[complex_div; COMPLEX_INV_MUL; COMPLEX_INV_NEG] THEN
4499     REWRITE_TAC[GSYM CX_INV; GSYM CX_MUL; COMPLEX_MUL_ASSOC] THEN
4500     REWRITE_TAC[RE_MUL_CX; RE; COMPLEX_MUL_RNEG; RE_NEG; COMPLEX_MUL_LNEG;
4501                 COMPLEX_INV_INV; GSYM COMPLEX_MUL_ASSOC; RE_MUL_II] THEN
4502     REWRITE_TAC[REAL_MUL_RNEG; REAL_NEGNEG] THEN
4503     SIMP_TAC[REAL_ARITH `((&1 * inv(&2)) * p) * x >= &1 <=> &2 <= x * p`] THEN
4504     SIMP_TAC[GSYM real_div; REAL_LE_RDIV_EQ; PI_POS] THEN
4505     REWRITE_TAC[COMPLEX_MUL_LID; COMPLEX_MUL_AC];
4506     ALL_TAC] THEN
4507   MP_TAC(ISPECL
4508    [`g:real^1->complex`; `z:complex`; `vec 0:real^1`; `t:real^1`]
4509    WINDING_NUMBER_AHLFORS) THEN
4510   ANTS_TAC THENL
4511    [REPEAT CONJ_TAC THENL
4512      [MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_SUBSET THEN
4513       EXISTS_TAC `interval[vec 0:real^1,vec 1]` THEN
4514       RULE_ASSUM_TAC(REWRITE_RULE[valid_path]) THEN ASM_REWRITE_TAC[];
4515       ALL_TAC;
4516       GEN_TAC THEN
4517       DISCH_THEN(fun th -> FIRST_ASSUM MATCH_MP_TAC THEN MP_TAC th)] THEN
4518     UNDISCH_TAC `(t:real^1) IN interval[vec 0,vec 1]` THEN
4519     REWRITE_TAC[SUBSET; IN_INTERVAL_1; DROP_VEC] THEN REAL_ARITH_TAC;
4520     ALL_TAC] THEN
4521   DISCH_THEN(MP_TAC o CONJUNCT2) THEN REWRITE_TAC[CEXP_NEG] THEN
4522   ABBREV_TAC `i = integral (interval [vec 0,t])
4523     (\x. vector_derivative g (at x) / (g x - z))` THEN
4524   SUBST1_TAC(SPEC `i:complex` COMPLEX_EXPAND) THEN
4525   ASM_REWRITE_TAC[CEXP_ADD; COMPLEX_INV_MUL; GSYM CX_EXP] THEN
4526   UNDISCH_TAC `Cx(norm r) * cexp(ii * Cx(Arg r)) = r` THEN
4527   REWRITE_TAC[IMP_IMP] THEN DISCH_THEN(MP_TAC o MATCH_MP (COMPLEX_FIELD
4528    `x * e = r /\ (y * inv e) * w = z
4529     ==> ~(e = Cx(&0)) ==> x * y * w = r * z`)) THEN
4530   REWRITE_TAC[CEXP_NZ] THEN
4531   EXPAND_TAC "r" THEN
4532   GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV) [pathstart] THEN
4533   SUBGOAL_THEN `~((g:real^1->complex)(vec 0) = z)` ASSUME_TAC THENL
4534    [FIRST_ASSUM MATCH_MP_TAC THEN SIMP_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS];
4535     ALL_TAC] THEN
4536   ASM_SIMP_TAC[COMPLEX_DIV_RMUL; COMPLEX_SUB_0; GSYM CX_INV; GSYM CX_MUL;
4537                COMPLEX_MUL_ASSOC; GSYM real_div] THEN
4538   DISCH_TAC THEN
4539   EXISTS_TAC `exp(Re i) / norm(r:complex)` THEN
4540   SUBGOAL_THEN `~(r = Cx(&0))` ASSUME_TAC THENL
4541    [EXPAND_TAC "r" THEN MATCH_MP_TAC(COMPLEX_FIELD
4542    `~(x = Cx(&0)) /\ ~(y = Cx(&0)) ==> ~(x / y = Cx(&0))`) THEN
4543     ASM_REWRITE_TAC[COMPLEX_SUB_0; pathstart];
4544     ALL_TAC] THEN
4545   ASM_SIMP_TAC[REAL_LT_DIV; REAL_EXP_POS_LT; COMPLEX_NORM_NZ] THEN
4546   REWRITE_TAC[path_image; IN_IMAGE] THEN
4547   EXISTS_TAC `t:real^1` THEN ASM_REWRITE_TAC[] THEN
4548   MATCH_MP_TAC(COMPLEX_FIELD
4549    `inv i * (gt - z) = wz /\ ~(i = Cx(&0)) ==> z + i * wz = gt`) THEN
4550   ASM_REWRITE_TAC[GSYM CX_INV; REAL_INV_DIV; CX_INJ] THEN
4551   MATCH_MP_TAC(REAL_FIELD `~(x = &0) /\ ~(y = &0) ==> ~(x / y = &0)`) THEN
4552   ASM_REWRITE_TAC[REAL_EXP_NZ; COMPLEX_NORM_ZERO]);;
4553
4554 let WINDING_NUMBER_BIG_MEETS = prove
4555  (`!g z. valid_path g /\ ~(z IN path_image g) /\
4556          abs(Re(winding_number(g,z))) >= &1
4557          ==> !w. ~(w = z)
4558                  ==> ?a. &0 < a /\ z + (Cx a * (w - z)) IN path_image g`,
4559   REPEAT GEN_TAC THEN REWRITE_TAC[real_abs] THEN COND_CASES_TAC THEN
4560   ASM_SIMP_TAC[WINDING_NUMBER_POS_MEETS] THEN
4561   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
4562   ASM_SIMP_TAC[GSYM RE_NEG; VALID_PATH_IMP_PATH;
4563                GSYM WINDING_NUMBER_REVERSEPATH] THEN
4564   DISCH_TAC THEN ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
4565   MATCH_MP_TAC WINDING_NUMBER_POS_MEETS THEN
4566   ASM_SIMP_TAC[PATH_IMAGE_REVERSEPATH; VALID_PATH_REVERSEPATH]);;
4567
4568 let WINDING_NUMBER_LT_1 = prove
4569  (`!g w z. valid_path g /\ ~(z IN path_image g) /\ ~(w = z) /\
4570            (!a. &0 < a ==> ~(z + (Cx a * (w - z)) IN path_image g))
4571            ==> Re(winding_number(g,z)) < &1`,
4572   REPEAT STRIP_TAC THEN
4573   REWRITE_TAC[GSYM REAL_NOT_LE; GSYM real_ge] THEN
4574   ASM_MESON_TAC[WINDING_NUMBER_POS_MEETS]);;
4575
4576 (* ------------------------------------------------------------------------- *)
4577 (* One way of proving that WN=1 for a loop.                                  *)
4578 (* ------------------------------------------------------------------------- *)
4579
4580 let WINDING_NUMBER_EQ_1 = prove
4581  (`!g z. valid_path g /\ ~(z IN path_image g) /\ pathfinish g = pathstart g /\
4582          &0 < Re(winding_number(g,z)) /\ Re(winding_number(g,z)) < &2
4583          ==> winding_number(g,z) = Cx(&1)`,
4584   REPEAT GEN_TAC THEN
4585   REPLICATE_TAC 3 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
4586   SUBGOAL_THEN `complex_integer(winding_number(g,z))` MP_TAC THENL
4587    [ASM_SIMP_TAC[INTEGER_WINDING_NUMBER; VALID_PATH_IMP_PATH]; ALL_TAC] THEN
4588   SIMP_TAC[complex_integer; COMPLEX_EQ; RE_CX; IM_CX] THEN
4589   SIMP_TAC[REAL_LT_INTEGERS; INTEGER_CLOSED] THEN REAL_ARITH_TAC);;
4590
4591 (* ------------------------------------------------------------------------- *)
4592 (* Continuity of winding number and invariance on connected sets.            *)
4593 (* ------------------------------------------------------------------------- *)
4594
4595 let CONTINUOUS_AT_WINDING_NUMBER = prove
4596  (`!g z. path g /\ ~(z IN path_image g)
4597          ==> (\w. winding_number(g,w)) continuous (at z)`,
4598   REPEAT STRIP_TAC THEN
4599   MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_CBALL) THEN
4600   ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE] THEN
4601   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4602   ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_CBALL] THEN
4603   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
4604   MP_TAC(ISPECL [`(:complex) DIFF cball(z,e / &2)`; `g:real^1->complex`]
4605         PATH_INTEGRAL_NEARBY_ENDS) THEN
4606   ASM_SIMP_TAC[OPEN_DIFF; OPEN_UNIV; CLOSED_CBALL] THEN ANTS_TAC THENL
4607    [REWRITE_TAC[SUBSET; IN_DIFF; IN_CBALL; SUBSET; IN_UNIV] THEN
4608     GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
4609     REWRITE_TAC[] THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
4610     ASM_REAL_ARITH_TAC;
4611     ALL_TAC] THEN
4612   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
4613   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `min d e / &2`]
4614     WINDING_NUMBER) THEN
4615   ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN
4616   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
4617   MATCH_MP_TAC CONTINUOUS_TRANSFORM_AT THEN
4618   MAP_EVERY EXISTS_TAC [`\w. winding_number(p,w)`; `min d e / &2`] THEN
4619   ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN CONJ_TAC THENL
4620    [X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
4621     MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
4622     ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
4623     MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
4624      [REWRITE_TAC[path_image; IN_IMAGE] THEN
4625       DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC) THEN
4626       FIRST_X_ASSUM(MP_TAC o SPEC `(g:real^1->complex) t`) THEN
4627       FIRST_X_ASSUM(MP_TAC o SPEC `t:real^1`) THEN
4628       ASM_SIMP_TAC[path_image; FUN_IN_IMAGE] THEN
4629       UNDISCH_TAC `dist (w:complex,z) < min d e / &2` THEN
4630       ASM_REWRITE_TAC[] THEN CONV_TAC NORM_ARITH;
4631       DISCH_TAC THEN X_GEN_TAC `k:real` THEN DISCH_TAC THEN
4632       MP_TAC(ISPECL [`g:real^1->complex`; `w:complex`; `min k (min d e) / &2`]
4633          WINDING_NUMBER) THEN
4634       ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN ANTS_TAC THENL
4635        [FIRST_X_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
4636         ASM_REAL_ARITH_TAC;
4637         ALL_TAC] THEN
4638       DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
4639       EXISTS_TAC `p:real^1->complex` THEN ASM_REWRITE_TAC[] THEN
4640       ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
4641       FIRST_X_ASSUM(fun th -> GEN_REWRITE_TAC RAND_CONV [SYM th]) THEN
4642       CONV_TAC SYM_CONV THEN FIRST_X_ASSUM(MP_TAC o SPECL
4643         [`p:real^1->complex`; `q:real^1->complex`]) THEN
4644       ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
4645        [X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
4646         REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `t:real^1`)) THEN
4647         ASM_REWRITE_TAC[] THEN CONV_TAC NORM_ARITH;
4648         DISCH_THEN(MATCH_MP_TAC o last o CONJUNCTS)] THEN
4649       MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
4650       SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
4651                IN_DELETE; IN_UNIV; COMPLEX_SUB_0] THEN
4652       ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN SIMP_TAC[IN_DIFF] THEN
4653       REWRITE_TAC[IN_UNIV; IN_CBALL] THEN
4654       ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC];
4655     UNDISCH_TAC `~((z:complex) IN path_image p)` THEN
4656     UNDISCH_TAC `valid_path(p:real^1->complex)` THEN
4657     POP_ASSUM_LIST(K ALL_TAC) THEN SPEC_TAC(`z:complex`,`z:complex`) THEN
4658     SPEC_TAC(`p:real^1->complex`,`g:real^1->complex`)] THEN
4659   REPEAT STRIP_TAC THEN
4660   MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_BALL) THEN
4661   ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4662   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4663   ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_BALL] THEN
4664   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
4665   MP_TAC(ISPECL [`(:complex) DIFF cball(z, &3 / &4 * d)`; `g:real^1->complex`]
4666         PATH_INTEGRAL_BOUND_EXISTS) THEN
4667   ASM_REWRITE_TAC[GSYM closed; CLOSED_CBALL; SUBSET; IN_DIFF;
4668                   IN_CBALL; IN_UNIV; REAL_NOT_LE] THEN
4669   ANTS_TAC THENL
4670    [ASM_MESON_TAC[REAL_ARITH `&0 < d /\ ~(&3 / &4 * d < x) ==> x < d`];
4671     ALL_TAC] THEN
4672   DISCH_THEN(X_CHOOSE_THEN `L:real` STRIP_ASSUME_TAC) THEN
4673   REWRITE_TAC[continuous_at] THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
4674   EXISTS_TAC `min (d / &4) (e / &2 * d pow 2 / L / &4)` THEN
4675   ASM_SIMP_TAC[REAL_LT_MIN; REAL_POW_LT; REAL_LT_DIV; REAL_LT_MUL; REAL_HALF;
4676                REAL_ARITH `&0 < x / &4 <=> &0 < x`] THEN
4677   X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
4678   SUBGOAL_THEN `~((w:complex) IN path_image g)` ASSUME_TAC THENL
4679    [FIRST_X_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
4680     ASM_REAL_ARITH_TAC;
4681     ALL_TAC] THEN
4682   ASM_SIMP_TAC[dist; WINDING_NUMBER_VALID_PATH; GSYM COMPLEX_SUB_LDISTRIB] THEN
4683   REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_CX] THEN
4684   REWRITE_TAC[REAL_ABS_NUM; COMPLEX_NORM_II; REAL_ABS_PI] THEN
4685   REWRITE_TAC[real_div; REAL_MUL_LID; REAL_MUL_RID] THEN
4686   MATCH_MP_TAC(REAL_ARITH
4687     `inv p * x <= &1 * x /\ x < e ==> inv p * x < e`) THEN
4688   CONJ_TAC THENL
4689    [MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
4690     MATCH_MP_TAC REAL_INV_LE_1 THEN MP_TAC PI_APPROX_32 THEN REAL_ARITH_TAC;
4691     ALL_TAC] THEN
4692   MATCH_MP_TAC(REAL_ARITH `!d. &0 < e /\ d = e / &2 /\ x <= d ==> x < e`) THEN
4693   EXISTS_TAC `L * (e / &2 * d pow 2 / L / &4) * inv(d / &2) pow 2` THEN
4694   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
4695    [MAP_EVERY UNDISCH_TAC [`&0 < d`; `&0 < L`] THEN CONV_TAC REAL_FIELD;
4696     ALL_TAC] THEN
4697   SUBGOAL_THEN
4698    `path_integral g (\x. Cx(&1) / (x - w)) -
4699     path_integral g (\x. Cx(&1) / (x - z)) =
4700     path_integral g (\x. Cx(&1) / (x - w) - Cx(&1) / (x - z))`
4701   SUBST1_TAC THENL
4702    [CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_SUB THEN
4703     CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_INVERSEDIFF THEN
4704     ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
4705     ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC;
4706     ALL_TAC] THEN
4707   FIRST_X_ASSUM MATCH_MP_TAC THEN
4708   SIMP_TAC[HOLOMORPHIC_ON_OPEN; GSYM closed; CLOSED_CBALL] THEN
4709   REWRITE_TAC[IN_UNIV; IN_DIFF; IN_CBALL; REAL_NOT_LE; AND_FORALL_THM] THEN
4710   X_GEN_TAC `x:complex` THEN
4711   REWRITE_TAC[TAUT `(a ==> b) /\ (a ==> c) <=> a ==> b /\ c`] THEN
4712   DISCH_TAC THEN REWRITE_TAC[GSYM complex_differentiable] THEN
4713   SUBGOAL_THEN `~(x:complex = w) /\ ~(x = z)` STRIP_ASSUME_TAC THENL
4714    [CONJ_TAC THEN DISCH_THEN SUBST_ALL_TAC THEN
4715     REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM REAL_NOT_LE])) THEN
4716     CONV_TAC NORM_ARITH;
4717     ALL_TAC] THEN
4718   CONJ_TAC THENL
4719    [MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
4720     CONJ_TAC THEN MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
4721     ASM_SIMP_TAC[COMPLEX_SUB_0; COMPLEX_DIFFERENTIABLE_SUB;
4722                  COMPLEX_DIFFERENTIABLE_ID; COMPLEX_DIFFERENTIABLE_CONST];
4723     ALL_TAC] THEN
4724   ASM_SIMP_TAC[COMPLEX_FIELD
4725    `~(x = w) /\ ~(x = z)
4726     ==> Cx(&1) / (x - w) - Cx(&1) / (x - z) =
4727         (w - z) * inv((x - w) * (x - z))`] THEN
4728   REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
4729   ASM_SIMP_TAC[NORM_POS_LE; GSYM dist; REAL_LT_IMP_LE] THEN
4730   REWRITE_TAC[COMPLEX_NORM_INV; REAL_POW_INV] THEN
4731   MATCH_MP_TAC REAL_LE_INV2 THEN
4732   ASM_SIMP_TAC[REAL_POW_2; REAL_LT_MUL; REAL_HALF; COMPLEX_NORM_MUL] THEN
4733   MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_SIMP_TAC[REAL_HALF; REAL_LT_IMP_LE] THEN
4734   REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM REAL_NOT_LE])) THEN
4735   CONV_TAC NORM_ARITH);;
4736
4737 let CONTINUOUS_ON_WINDING_NUMBER = prove
4738  (`!g. path g
4739        ==> (\w. winding_number(g,w)) continuous_on
4740            ((:complex) DIFF path_image g)`,
4741   SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; GSYM closed;
4742            OPEN_UNIV; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4743   SIMP_TAC[IN_DIFF; IN_UNIV; CONTINUOUS_AT_WINDING_NUMBER]);;
4744
4745 let WINDING_NUMBER_CONSTANT = prove
4746  (`!s g. path g /\ pathfinish g = pathstart g /\
4747          connected s /\ s INTER path_image g = {}
4748          ==> ?k. !z. z IN s ==> winding_number(g,z) = k`,
4749   REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_DISCRETE_RANGE_CONSTANT THEN
4750   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
4751    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
4752     EXISTS_TAC `(:complex) DIFF path_image g` THEN
4753     ASM_SIMP_TAC[CONTINUOUS_ON_WINDING_NUMBER] THEN ASM SET_TAC[];
4754     ALL_TAC] THEN
4755   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
4756   EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN
4757   X_GEN_TAC `w:complex` THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
4758   SUBGOAL_THEN
4759    `complex_integer(winding_number(g,w)) /\
4760     complex_integer(winding_number(g,z))`
4761   MP_TAC THENL
4762    [CONJ_TAC THEN MATCH_MP_TAC INTEGER_WINDING_NUMBER THEN
4763     ASM_REWRITE_TAC[] THEN ASM SET_TAC[];
4764     REWRITE_TAC[COMPLEX_INTEGER] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]] THEN
4765   REWRITE_TAC[GSYM CX_SUB; CX_INJ; COMPLEX_NORM_CX] THEN
4766   REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_ABS_INTEGER_LEMMA THEN
4767   ASM_SIMP_TAC[REAL_SUB_0; INTEGER_CLOSED]);;
4768
4769 let WINDING_NUMBER_EQ = prove
4770  (`!g s w z.
4771         path g /\ pathfinish g = pathstart g /\
4772         w IN s /\ z IN s /\ connected s /\ s INTER path_image g = {}
4773         ==> winding_number(g,w) = winding_number(g,z)`,
4774   MESON_TAC[WINDING_NUMBER_CONSTANT]);;
4775
4776 let OPEN_WINDING_NUMBER_LEVELSETS = prove
4777  (`!g k. path g /\ pathfinish g = pathstart g
4778          ==> open {z | ~(z IN path_image g) /\ winding_number(g,z) = k}`,
4779   REPEAT STRIP_TAC THEN REWRITE_TAC[open_def; IN_ELIM_THM] THEN
4780   X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
4781   MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_BALL) THEN
4782   ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4783   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4784   ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_BALL] THEN
4785   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
4786   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `w:complex` THEN
4787   REPEAT STRIP_TAC THENL [ASM_MESON_TAC[DIST_SYM]; ALL_TAC] THEN
4788   MP_TAC(ISPECL [`ball(z:complex,e)`; `g:real^1->complex`]
4789         WINDING_NUMBER_CONSTANT) THEN
4790   ASM_SIMP_TAC[CONNECTED_BALL; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_BALL] THEN
4791   ASM_MESON_TAC[DIST_REFL; DIST_SYM]);;
4792
4793 (* ------------------------------------------------------------------------- *)
4794 (* Winding number is zero "outside" a curve, in various senses.              *)
4795 (* ------------------------------------------------------------------------- *)
4796
4797 let WINDING_NUMBER_ZERO_IN_OUTSIDE = prove
4798  (`!g z. path g /\ pathfinish g = pathstart g /\ z IN outside(path_image g)
4799          ==> winding_number(g,z) = Cx(&0)`,
4800   REPEAT STRIP_TAC THEN
4801   MP_TAC(ISPECL [`path_image(g:real^1->complex)`; `Cx(&0)`]
4802    BOUNDED_SUBSET_BALL) THEN ASM_SIMP_TAC[BOUNDED_PATH_IMAGE] THEN
4803   DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
4804   SUBGOAL_THEN `?w. ~(w IN ball(Cx(&0),B + &1))` STRIP_ASSUME_TAC THENL
4805    [MATCH_MP_TAC(SET_RULE `~(s = UNIV) ==> ?z. ~(z IN s)`) THEN
4806     MESON_TAC[BOUNDED_BALL; NOT_BOUNDED_UNIV];
4807     ALL_TAC] THEN
4808   MP_TAC(ISPECL [`Cx(&0)`; `B:real`; `B + &1`] SUBSET_BALL) THEN
4809   REWRITE_TAC[REAL_ARITH `B <= B + &1`] THEN DISCH_TAC THEN
4810   MP_TAC(ISPECL [`path_image(g:real^1->complex)`; `ball(Cx(&0),B + &1)`]
4811         OUTSIDE_SUBSET_CONVEX) THEN
4812   ASM_REWRITE_TAC[CONVEX_BALL] THEN
4813   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
4814   REWRITE_TAC[SUBSET; IN_UNIV; IN_DIFF] THEN DISCH_TAC THEN
4815   MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC `winding_number(g,w)` THEN
4816   CONJ_TAC THENL
4817    [MP_TAC(ISPECL [`outside(path_image(g:real^1->complex))`;
4818                    `g:real^1->complex`] WINDING_NUMBER_CONSTANT) THEN
4819     ASM_SIMP_TAC[OUTSIDE_NO_OVERLAP; CONNECTED_OUTSIDE;
4820                  DIMINDEX_2; LE_REFL; BOUNDED_PATH_IMAGE] THEN
4821     ASM SET_TAC[];
4822     MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN ASM_REWRITE_TAC[] THEN
4823     MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
4824      [ASM SET_TAC[]; DISCH_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC] THEN
4825     MP_TAC(ISPECL [`g:real^1->complex`; `min e (&1)`]
4826         PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
4827     ASM_REWRITE_TAC[REAL_LT_MIN; REAL_LT_01] THEN
4828     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `p:real^1->complex` THEN
4829     STRIP_TAC THEN ONCE_REWRITE_TAC[NORM_SUB] THEN
4830     ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN CONJ_TAC THENL
4831      [UNDISCH_TAC `~(w IN ball (Cx (&0),B + &1))` THEN
4832       REWRITE_TAC[CONTRAPOS_THM; path_image; IN_BALL] THEN
4833       SPEC_TAC(`w:complex`,`x:complex`) THEN REWRITE_TAC[FORALL_IN_IMAGE];
4834       REWRITE_TAC[COMPLEX_MUL_RZERO] THEN
4835       MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
4836       MATCH_MP_TAC CAUCHY_THEOREM_CONVEX_SIMPLE THEN
4837       EXISTS_TAC `ball(Cx(&0),B + &1)` THEN
4838       ASM_SIMP_TAC[CONVEX_BALL; VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
4839       CONJ_TAC THENL
4840        [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
4841         SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
4842                  COMPLEX_SUB_0] THEN
4843         ASM_MESON_TAC[];
4844         REWRITE_TAC[path_image; SUBSET; FORALL_IN_IMAGE; IN_BALL]]] THEN
4845       X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
4846       REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
4847       MATCH_MP_TAC(NORM_ARITH
4848        `!g:real^1->complex. norm(p t - g t) < &1 /\ norm(g t) <= B
4849                             ==> norm(p t) < B + &1`) THEN
4850       EXISTS_TAC `g:real^1->complex` THEN
4851       UNDISCH_TAC `path_image g SUBSET ball (Cx (&0),B)` THEN
4852       ASM_SIMP_TAC[SUBSET; IN_BALL; path_image; FORALL_IN_IMAGE] THEN
4853       ASM_SIMP_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG; REAL_LT_IMP_LE]]);;
4854
4855 let WINDING_NUMBER_ZERO_OUTSIDE = prove
4856  (`!g s z. path g /\ convex s /\ pathfinish g = pathstart g /\
4857            ~(z IN s) /\ path_image g SUBSET s
4858            ==> winding_number(g,z) = Cx(&0)`,
4859   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_ZERO_IN_OUTSIDE THEN
4860   ASM_REWRITE_TAC[] THEN
4861   MP_TAC(ISPECL [`path_image(g:real^1->complex)`; `s:complex->bool`]
4862         OUTSIDE_SUBSET_CONVEX) THEN
4863   ASM SET_TAC[]);;
4864
4865 let WINDING_NUMBER_ZERO_ATINFINITY = prove
4866  (`!g. path g /\ pathfinish g = pathstart g
4867        ==> ?B. !z. B <= norm(z) ==> winding_number(g,z) = Cx(&0)`,
4868   REPEAT STRIP_TAC THEN
4869   SUBGOAL_THEN `bounded (path_image g :complex->bool)` MP_TAC THENL
4870    [ASM_SIMP_TAC[BOUNDED_PATH_IMAGE]; ALL_TAC] THEN
4871   REWRITE_TAC[bounded] THEN DISCH_THEN(X_CHOOSE_TAC `B:real`) THEN
4872   EXISTS_TAC `B + &1` THEN REPEAT STRIP_TAC THEN
4873   MATCH_MP_TAC WINDING_NUMBER_ZERO_OUTSIDE THEN
4874   EXISTS_TAC `cball(Cx(&0),B)` THEN ASM_REWRITE_TAC[CONVEX_CBALL] THEN
4875   REWRITE_TAC[SUBSET; IN_CBALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
4876   ASM_MESON_TAC[REAL_ARITH `~(B + &1 <= z /\ z <= B)`]);;
4877
4878 let WINDING_NUMBER_ZERO_POINT = prove
4879  (`!g s. path g /\ pathfinish g = pathstart g /\
4880          open s /\ path_image g SUBSET s
4881          ==> ?z. z IN s /\ winding_number(g,z) = Cx(&0)`,
4882   REPEAT STRIP_TAC THEN
4883   MP_TAC(ISPECL [`path_image g:complex->bool`; `s:complex->bool`]
4884         OUTSIDE_COMPACT_IN_OPEN) THEN
4885   ASM_SIMP_TAC[COMPACT_PATH_IMAGE] THEN ANTS_TAC THENL
4886    [ASM_MESON_TAC[SUBSET_EMPTY; PATH_IMAGE_NONEMPTY]; ALL_TAC] THEN
4887   REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN MATCH_MP_TAC MONO_EXISTS THEN
4888   GEN_TAC THEN REWRITE_TAC[IN_INTER] THEN
4889   ASM_SIMP_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE]);;
4890
4891 (* ------------------------------------------------------------------------- *)
4892 (* If a path winds round a set, it winds rounds its inside.                  *)
4893 (* ------------------------------------------------------------------------- *)
4894
4895 let WINDING_NUMBER_AROUND_INSIDE = prove
4896  (`!g s z.
4897         path g /\ pathfinish g = pathstart g /\
4898         closed s /\ connected s /\ s INTER path_image g = {} /\
4899         z IN s /\ ~(winding_number(g,z) = Cx(&0))
4900         ==> !w. w IN s UNION inside(s)
4901                 ==> winding_number(g,w) = winding_number(g,z)`,
4902   MAP_EVERY X_GEN_TAC
4903    [`g:real^1->complex`; `s:complex->bool`; `z0:complex`] THEN STRIP_TAC THEN
4904   SUBGOAL_THEN `!z. z IN s ==> winding_number(g,z) = winding_number(g,z0)`
4905   ASSUME_TAC THENL [ASM_MESON_TAC[WINDING_NUMBER_EQ]; ALL_TAC] THEN
4906   ABBREV_TAC `k = winding_number (g,z0)` THEN
4907   SUBGOAL_THEN `(s:complex->bool) SUBSET inside(path_image g)` ASSUME_TAC THENL
4908    [REWRITE_TAC[SUBSET; INSIDE_OUTSIDE; IN_DIFF; IN_UNIV; IN_UNION] THEN
4909     X_GEN_TAC `z:complex` THEN REPEAT STRIP_TAC THENL
4910      [ASM SET_TAC[]; ASM_MESON_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE]];
4911     ALL_TAC] THEN
4912   X_GEN_TAC `z:complex` THEN REWRITE_TAC[IN_UNION] THEN
4913   STRIP_TAC THEN ASM_SIMP_TAC[] THEN
4914   MP_TAC(ISPECL [`s:complex->bool`;
4915                  `path_image g:complex->bool`]
4916         INSIDE_INSIDE_COMPACT_CONNECTED) THEN
4917   ASM_SIMP_TAC[COMPACT_PATH_IMAGE; CONNECTED_PATH_IMAGE] THEN STRIP_TAC THEN
4918   EXPAND_TAC "k" THEN MATCH_MP_TAC WINDING_NUMBER_EQ THEN
4919   EXISTS_TAC `s UNION inside s :complex->bool` THEN
4920   ASM_SIMP_TAC[CONNECTED_WITH_INSIDE; IN_UNION] THEN
4921   MP_TAC(ISPEC `path_image g :complex->bool` INSIDE_NO_OVERLAP) THEN
4922   ASM SET_TAC[]);;
4923
4924 (* ------------------------------------------------------------------------- *)
4925 (* Bounding a WN by 1/2 for a path and point in opposite halfspaces.         *)
4926 (* ------------------------------------------------------------------------- *)
4927
4928 let WINDING_NUMBER_SUBPATH_CONTINUOUS = prove
4929  (`!g z. valid_path g /\ ~(z IN path_image g)
4930          ==> (\a. winding_number(subpath (vec 0) a g,z)) continuous_on
4931              interval[vec 0,vec 1]`,
4932   REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_EQ THEN EXISTS_TAC
4933     `\a. Cx(&1) / (Cx(&2) * Cx pi * ii) *
4934          integral (interval[vec 0,a])
4935                   (\t. Cx(&1) / (g t - z) * vector_derivative g (at t))` THEN
4936   CONJ_TAC THENL
4937    [X_GEN_TAC `a:real^1` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
4938     MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
4939      `Cx(&1) / (Cx(&2) * Cx pi * ii) *
4940       path_integral (subpath (vec 0) a g) (\w. Cx (&1) / (w - z))` THEN
4941     CONJ_TAC THENL
4942      [AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN
4943       MATCH_MP_TAC PATH_INTEGRAL_SUBPATH_INTEGRAL THEN
4944       ASM_SIMP_TAC[ENDS_IN_UNIT_INTERVAL; PATH_INTEGRABLE_INVERSEDIFF] THEN
4945       ASM_MESON_TAC[IN_INTERVAL_1];
4946       REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN CONV_TAC SYM_CONV THEN
4947       MATCH_MP_TAC WINDING_NUMBER_VALID_PATH THEN
4948       ASM_MESON_TAC[VALID_PATH_SUBPATH; SUBSET; VALID_PATH_IMP_PATH;
4949                  ENDS_IN_UNIT_INTERVAL; PATH_IMAGE_SUBPATH_SUBSET]];
4950     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_LMUL THEN
4951     MATCH_MP_TAC INDEFINITE_INTEGRAL_CONTINUOUS_RIGHT THEN
4952     REWRITE_TAC[GSYM PATH_INTEGRABLE_ON] THEN
4953     ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF]]);;
4954
4955 let WINDING_NUMBER_IVT_POS = prove
4956  (`!g z w.
4957         valid_path g /\ ~(z IN path_image g) /\
4958         &0 <= w /\ w <= Re(winding_number(g,z))
4959         ==> ?t. t IN interval[vec 0,vec 1] /\
4960                 Re(winding_number(subpath (vec 0) t g,z)) = w`,
4961   REPEAT STRIP_TAC THEN REWRITE_TAC[RE_DEF] THEN
4962   MATCH_MP_TAC IVT_INCREASING_COMPONENT_ON_1 THEN
4963   ASM_SIMP_TAC[WINDING_NUMBER_SUBPATH_CONTINUOUS] THEN
4964   ASM_REWRITE_TAC[SUBPATH_TRIVIAL; GSYM RE_DEF; DIMINDEX_2; ARITH] THEN
4965   REWRITE_TAC[DROP_VEC; REAL_POS; SUBPATH_REFL] THEN
4966   MP_TAC(ISPECL [`(g:real^1->complex) (vec 0)`; `z:complex`]
4967         WINDING_NUMBER_TRIVIAL) THEN
4968   ASM_MESON_TAC[pathstart; PATHSTART_IN_PATH_IMAGE; RE_CX]);;
4969
4970 let WINDING_NUMBER_IVT_NEG = prove
4971  (`!g z w.
4972         valid_path g /\ ~(z IN path_image g) /\
4973         Re(winding_number(g,z)) <= w /\ w <= &0
4974         ==> ?t. t IN interval[vec 0,vec 1] /\
4975                 Re(winding_number(subpath (vec 0) t g,z)) = w`,
4976   REPEAT STRIP_TAC THEN REWRITE_TAC[RE_DEF] THEN
4977   MATCH_MP_TAC IVT_DECREASING_COMPONENT_ON_1 THEN
4978   ASM_SIMP_TAC[WINDING_NUMBER_SUBPATH_CONTINUOUS] THEN
4979   ASM_REWRITE_TAC[SUBPATH_TRIVIAL; GSYM RE_DEF; DIMINDEX_2; ARITH] THEN
4980   REWRITE_TAC[DROP_VEC; REAL_POS; SUBPATH_REFL] THEN
4981   MP_TAC(ISPECL [`(g:real^1->complex) (vec 0)`; `z:complex`]
4982         WINDING_NUMBER_TRIVIAL) THEN
4983   ASM_MESON_TAC[pathstart; PATHSTART_IN_PATH_IMAGE; RE_CX]);;
4984
4985 let WINDING_NUMBER_IVT_ABS = prove
4986  (`!g z w.
4987         valid_path g /\ ~(z IN path_image g) /\
4988         &0 <= w /\ w <= abs(Re(winding_number(g,z)))
4989         ==> ?t. t IN interval[vec 0,vec 1] /\
4990                 abs(Re(winding_number(subpath (vec 0) t g,z))) = w`,
4991   REPEAT GEN_TAC THEN ASM_CASES_TAC `&0 <= Re(winding_number(g,z))` THEN
4992   ASM_REWRITE_TAC[real_abs] THEN REWRITE_TAC[GSYM real_abs] THEN
4993   REPEAT STRIP_TAC THENL
4994    [MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `w:real`]
4995         WINDING_NUMBER_IVT_POS);
4996     MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `--w:real`]
4997         WINDING_NUMBER_IVT_NEG)] THEN
4998   (ANTS_TAC THENL [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; ALL_TAC]) THEN
4999   MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[] THEN ASM_REAL_ARITH_TAC);;
5000
5001 let WINDING_NUMBER_LT_HALF = prove
5002  (`!g z a b.
5003         valid_path g /\ a dot z <= b /\ path_image g SUBSET {w | a dot w > b}
5004         ==> abs(Re(winding_number(g,z))) < &1 / &2`,
5005   let lemma = prove
5006    (`!g z a b.
5007           valid_path g /\ ~(z IN path_image g) /\
5008           a dot z <= b /\ path_image g SUBSET {w | a dot w > b}
5009           ==> Re(winding_number(g,z)) < &1 / &2`,
5010     REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LE] THEN STRIP_TAC THEN
5011     MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `&1 / &2`]
5012       WINDING_NUMBER_IVT_POS) THEN
5013     CONV_TAC REAL_RAT_REDUCE_CONV THEN ASM_REWRITE_TAC[NOT_EXISTS_THM] THEN
5014     X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
5015     MP_TAC(ISPECL [`subpath (vec 0) t (g:real^1->complex)`; `z:complex`]
5016           WINDING_NUMBER_AHLFORS_FULL) THEN
5017     ASM_SIMP_TAC[VALID_PATH_SUBPATH; VALID_PATH_IMP_PATH;
5018                  ENDS_IN_UNIT_INTERVAL; NOT_IMP] THEN
5019     CONJ_TAC THENL
5020      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
5021        `~(z IN t) ==> s SUBSET t ==> ~(z IN s)`)) THEN
5022       ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; ENDS_IN_UNIT_INTERVAL;
5023                    VALID_PATH_IMP_PATH];
5024       ASM_REWRITE_TAC[EULER; RE_MUL_CX; RE_MUL_II; IM_MUL_CX; IM_MUL_II] THEN
5025       REWRITE_TAC[REAL_ARITH `&2 * pi * &1 / &2 = pi`; SIN_PI; COS_PI] THEN
5026       REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_RID] THEN
5027       REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
5028       REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM CX_MUL] THEN
5029       REWRITE_TAC[REAL_MUL_RNEG; REAL_MUL_RID; GSYM COMPLEX_CMUL] THEN
5030       DISCH_TAC THEN
5031       SUBGOAL_THEN `&0 < a dot ((g:real^1->complex) t - z) /\
5032                     &0 < a dot (g(vec 0) - z)`
5033       MP_TAC THENL
5034        [REWRITE_TAC[DOT_RSUB; REAL_SUB_LT] THEN CONJ_TAC THEN
5035         MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `b:real` THEN
5036         ASM_REWRITE_TAC[GSYM real_gt] THEN
5037         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
5038          `g SUBSET {z | a dot z > b} ==> t IN g ==> a dot t > b`)) THEN
5039         REWRITE_TAC[path_image] THEN MATCH_MP_TAC FUN_IN_IMAGE THEN
5040         ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL];
5041         ASM_REWRITE_TAC[DOT_RMUL] THEN
5042         DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
5043         ASM_SIMP_TAC[REAL_LT_MUL_EQ] THEN
5044         MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(&0 < -- x)`) THEN
5045         REWRITE_TAC[REAL_EXP_POS_LT]]]) in
5046   REPEAT STRIP_TAC THEN
5047   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
5048   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
5049   ASM_REWRITE_TAC[IN_ELIM_THM; REAL_ARITH `a:real > b <=> ~(a <= b)`] THEN
5050   DISCH_TAC THEN MATCH_MP_TAC(REAL_ARITH `x < a /\ --x < a ==> abs x < a`) THEN
5051   CONJ_TAC THENL [ASM_MESON_TAC[lemma]; ALL_TAC] THEN
5052   MP_TAC(ISPECL [`reversepath g:real^1->complex`; `z:complex`;
5053                  `a:complex`; `b:real`] lemma) THEN
5054   ASM_SIMP_TAC[VALID_PATH_REVERSEPATH; PATH_IMAGE_REVERSEPATH;
5055                WINDING_NUMBER_REVERSEPATH; VALID_PATH_IMP_PATH; RE_NEG] THEN
5056   REAL_ARITH_TAC);;
5057
5058 let WINDING_NUMBER_LE_HALF = prove
5059  (`!g z a b.
5060         valid_path g /\ ~(z IN path_image g) /\
5061         ~(a = vec 0) /\ a dot z <= b /\ path_image g SUBSET {w | a dot w >= b}
5062         ==> abs(Re(winding_number(g,z))) <= &1 / &2`,
5063   REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN
5064   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
5065    CONTINUOUS_AT_WINDING_NUMBER) THEN
5066   ASM_SIMP_TAC[VALID_PATH_IMP_PATH; continuous_at] THEN
5067   DISCH_THEN(MP_TAC o SPEC `abs(Re(winding_number(g,z))) - &1 / &2`) THEN
5068   ASM_REWRITE_TAC[REAL_SUB_LT] THEN
5069   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
5070   FIRST_X_ASSUM(MP_TAC o SPEC `z - d / &2 / norm(a) % a:complex`) THEN
5071   REWRITE_TAC[NORM_ARITH `dist(z - d:complex,z) = norm d`] THEN
5072   ASM_SIMP_TAC[NORM_MUL; REAL_ABS_DIV; REAL_ABS_NORM; REAL_DIV_RMUL;
5073                NORM_EQ_0; NOT_IMP] THEN
5074   CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
5075   MATCH_MP_TAC(NORM_ARITH
5076     `abs(Re w' - Re w) <= norm(w' - w) /\ abs(Re w') < &1 / &2
5077      ==> ~(dist(w',w) < abs(Re w) - &1 / &2)`) THEN
5078   REWRITE_TAC[GSYM RE_SUB] THEN CONJ_TAC THENL
5079    [SIMP_TAC[COMPONENT_LE_NORM; RE_DEF; DIMINDEX_2; ARITH]; ALL_TAC] THEN
5080   MATCH_MP_TAC WINDING_NUMBER_LT_HALF THEN EXISTS_TAC `a:complex` THEN
5081   EXISTS_TAC `b - d / &3 * norm(a:complex)` THEN
5082   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
5083    [REWRITE_TAC[DOT_RSUB; DOT_RMUL; GSYM NORM_POW_2] THEN
5084     ASM_SIMP_TAC[NORM_EQ_0; REAL_FIELD
5085      `~(a = &0) ==> x / a * a pow 2 = x * a`] THEN
5086     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
5087      `a:real <= b ==> d <= e ==> a - e <= b - d`)) THEN
5088     MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
5089     ASM_REAL_ARITH_TAC;
5090     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5091         SUBSET_TRANS)) THEN
5092     REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN MATCH_MP_TAC(REAL_ARITH
5093      `&0 < e ==> !x. a dot x >= b ==> a dot x > b - e`) THEN
5094     MATCH_MP_TAC REAL_LT_MUL THEN ASM_SIMP_TAC[NORM_POS_LT] THEN
5095     ASM_REAL_ARITH_TAC]);;
5096
5097 let WINDING_NUMBER_LT_HALF_LINEPATH = prove
5098  (`!a b z.
5099         ~(z IN segment[a,b])
5100         ==> abs(Re(winding_number(linepath(a,b),z))) < &1 / &2`,
5101   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_LT_HALF THEN
5102   MP_TAC(ISPECL [`segment[a:complex,b]`; `z:complex`]
5103         SEPARATING_HYPERPLANE_CLOSED_POINT) THEN
5104   ASM_REWRITE_TAC[CONVEX_SEGMENT; CLOSED_SEGMENT] THEN
5105   REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN
5106   SIMP_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH; SUBSET; IN_ELIM_THM;
5107            REAL_LT_IMP_LE]);;
5108
5109 (* ------------------------------------------------------------------------- *)
5110 (* Positivity of WN for a linepath.                                          *)
5111 (* ------------------------------------------------------------------------- *)
5112
5113 let WINDING_NUMBER_LINEPATH_POS_LT = prove
5114  (`!a b z. &0 < Im((b - a) * cnj(b - z))
5115            ==> &0 < Re(winding_number(linepath(a,b),z))`,
5116   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_POS_LT THEN
5117   EXISTS_TAC `Im((b - a) * cnj(b - z))` THEN
5118   ASM_REWRITE_TAC[VALID_PATH_LINEPATH; VECTOR_DERIVATIVE_LINEPATH_AT] THEN
5119   CONJ_TAC THENL
5120    [POP_ASSUM MP_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
5121     SPEC_TAC(`z:complex`,`z:complex`) THEN
5122     REWRITE_TAC[path_image; FORALL_IN_IMAGE; linepath] THEN
5123     REWRITE_TAC[VECTOR_ARITH
5124      `b - ((&1 - x) % a + x % b) = (&1 - x) % (b - a)`] THEN
5125     REWRITE_TAC[COMPLEX_CMUL; CNJ_MUL; CNJ_CX] THEN
5126     REWRITE_TAC[COMPLEX_RING `a * Cx x * cnj a = Cx x * a * cnj a`] THEN
5127     SIMP_TAC[COMPLEX_MUL_CNJ; GSYM CX_POW; GSYM CX_MUL; IM_CX; REAL_LT_REFL];
5128     ALL_TAC] THEN
5129   SUBGOAL_THEN
5130     `segment[a,b] SUBSET
5131       {y | Im((b - a) * cnj(b - z)) <= Im((b - a) * cnj(y - z))}`
5132   MP_TAC THENL
5133    [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
5134     CONJ_TAC THENL
5135      [REWRITE_TAC[SET_RULE `{a,b} SUBSET {y | P y} <=> P a /\ P b`] THEN
5136       POP_ASSUM MP_TAC THEN
5137       REWRITE_TAC[cnj; complex_mul; RE; IM; RE_SUB; IM_SUB] THEN
5138       REAL_ARITH_TAC;
5139       ALL_TAC] THEN
5140     REWRITE_TAC[COMPLEX_SUB_LDISTRIB; IM_SUB; CNJ_SUB; REAL_LE_SUB_LADD] THEN
5141     REWRITE_TAC[CONVEX_ALT; cnj; complex_mul; RE; IM; RE_SUB; IM_SUB] THEN
5142     REWRITE_TAC[IN_ELIM_THM; IM_ADD; RE_ADD; IM_CMUL; RE_CMUL] THEN
5143     REWRITE_TAC[REAL_NEG_ADD; REAL_NEG_RMUL] THEN
5144     ONCE_REWRITE_TAC[REAL_ARITH
5145      `e <= ab * ((&1 - u) * x + u * y) + ab' * ((&1 - u) * x' + u * y') <=>
5146       (&1 - u) * e + u * e <=
5147         (&1 - u) * (ab * x + ab' * x') + u * (ab * y + ab' * y')`] THEN
5148     REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_ADD2 THEN
5149     CONJ_TAC THEN MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN
5150     ASM_REAL_ARITH_TAC;
5151     REWRITE_TAC[GSYM PATH_IMAGE_LINEPATH] THEN
5152     REWRITE_TAC[SUBSET; path_image; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
5153     ASM_MESON_TAC[SUBSET; INTERVAL_OPEN_SUBSET_CLOSED]]);;
5154
5155 (* ------------------------------------------------------------------------- *)
5156 (* Winding number for a triangle.                                            *)
5157 (* ------------------------------------------------------------------------- *)
5158
5159 let WINDING_NUMBER_TRIANGLE = prove
5160  (`!a b c z.
5161         z IN interior(convex hull {a,b,c})
5162         ==> winding_number(linepath(a,b) ++ linepath(b,c) ++ linepath(c,a),z) =
5163             if &0 < Im((b - a) * cnj (b - z)) then Cx(&1) else --Cx(&1)`,
5164   let lemma1 = prove
5165    (`!a b c. vec 0 IN interior(convex hull {a,b,c})
5166              ==> ~(Im(a / b) <= &0 /\ &0 <= Im(b / c))`,
5167     REPEAT GEN_TAC THEN
5168     ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN SIMP_TAC[] THEN
5169     GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)
5170      [GSYM COMPLEX_INV_DIV] THEN
5171     REWRITE_TAC[IM_COMPLEX_INV_GE_0] THEN
5172     GEOM_BASIS_MULTIPLE_TAC 1 `b:complex` THEN
5173     REWRITE_TAC[COMPLEX_CMUL; COMPLEX_BASIS; GSYM CX_MUL; REAL_MUL_RID] THEN
5174     X_GEN_TAC `x:real` THEN GEN_REWRITE_TAC LAND_CONV [REAL_LE_LT] THEN
5175     REWRITE_TAC[IM_DIV_CX] THEN ASM_CASES_TAC `x = &0` THEN
5176     ASM_REWRITE_TAC[NOT_IN_INTERIOR_CONVEX_HULL_3; COMPLEX_VEC_0] THEN
5177     DISCH_TAC THEN REPEAT GEN_TAC THEN
5178     ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_MUL_LZERO] THEN STRIP_TAC THEN
5179     MATCH_MP_TAC(SET_RULE
5180      `!s. ~(x IN s) /\ t SUBSET s ==> ~(x IN t)`) THEN
5181     EXISTS_TAC `interior {z | Im z <= &0}` THEN CONJ_TAC THENL
5182      [REWRITE_TAC[IM_DEF; INTERIOR_HALFSPACE_COMPONENT_LE] THEN
5183       REWRITE_TAC[GSYM COMPLEX_VEC_0; IN_ELIM_THM; VEC_COMPONENT] THEN
5184       REAL_ARITH_TAC;
5185       MATCH_MP_TAC SUBSET_INTERIOR THEN MATCH_MP_TAC HULL_MINIMAL THEN
5186       REWRITE_TAC[CONVEX_HALFSPACE_IM_LE] THEN
5187       ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_ELIM_THM] THEN
5188       REWRITE_TAC[IM_CX; REAL_LE_REFL]]) in
5189   let lemma2 = prove
5190    (`z IN interior(convex hull {a,b,c})
5191      ==>  &0 < Im((b - a) * cnj (b - z)) /\
5192           &0 < Im((c - b) * cnj (c - z)) /\
5193           &0 < Im((a - c) * cnj (a - z)) \/
5194           Im((b - a) * cnj (b - z)) < &0 /\
5195           &0 < Im((b - c) * cnj (b - z)) /\
5196           &0 < Im((a - b) * cnj (a - z)) /\
5197           &0 < Im((c - a) * cnj (c - z))`,
5198     GEOM_ORIGIN_TAC `z:complex` THEN
5199     REWRITE_TAC[VECTOR_SUB_RZERO; COMPLEX_SUB_RDISTRIB] THEN
5200     REWRITE_TAC[COMPLEX_MUL_CNJ; IM_SUB; GSYM CX_POW; IM_CX] THEN
5201     REWRITE_TAC[REAL_ARITH `&0 < &0 - x <=> x < &0`;
5202                 REAL_ARITH `&0 - x < &0 <=> &0 < x`] THEN
5203     REWRITE_TAC[GSYM IM_COMPLEX_DIV_GT_0; GSYM IM_COMPLEX_DIV_LT_0] THEN
5204     REPEAT STRIP_TAC THEN
5205     GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [GSYM COMPLEX_INV_DIV] THEN
5206     REWRITE_TAC[IM_COMPLEX_INV_LT_0; IM_COMPLEX_INV_GT_0] THEN
5207     GEN_REWRITE_TAC (RAND_CONV o LAND_CONV o LAND_CONV o RAND_CONV)
5208      [GSYM COMPLEX_INV_DIV] THEN
5209     REWRITE_TAC[IM_COMPLEX_INV_LT_0] THEN
5210     MP_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`] lemma1) THEN
5211     MP_TAC(ISPECL [`b:complex`; `c:complex`; `a:complex`] lemma1) THEN
5212     MP_TAC(ISPECL [`c:complex`; `a:complex`; `b:complex`] lemma1) THEN
5213     POP_ASSUM MP_TAC THEN SIMP_TAC[INSERT_AC] THEN REAL_ARITH_TAC) in
5214   let lemma3 = prove
5215    (`!a b c z.
5216           z IN interior(convex hull {a,b,c}) /\
5217           &0 < Im((b - a) * cnj (b - z)) /\
5218           &0 < Im((c - b) * cnj (c - z)) /\
5219           &0 < Im((a - c) * cnj (a - z))
5220           ==> winding_number
5221                (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a),z) = Cx(&1)`,
5222     REPEAT STRIP_TAC THEN
5223     MATCH_MP_TAC WINDING_NUMBER_EQ_1 THEN
5224     REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; CONJ_ASSOC;
5225                 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
5226     CONJ_TAC THENL
5227      [REWRITE_TAC[GSYM CONJ_ASSOC] THEN
5228       REPEAT(MATCH_MP_TAC WINDING_NUMBER_JOIN_POS_COMBINED THEN
5229              REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
5230                          PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
5231              CONJ_TAC) THEN
5232       ASM_SIMP_TAC[WINDING_NUMBER_LINEPATH_POS_LT; VALID_PATH_LINEPATH] THEN
5233       RULE_ASSUM_TAC(REWRITE_RULE
5234        [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
5235       ASM_REWRITE_TAC[PATH_IMAGE_LINEPATH];
5236       RULE_ASSUM_TAC(REWRITE_RULE
5237          [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
5238       ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_IMAGE_JOIN; PATH_JOIN; IN_UNION;
5239              PATH_LINEPATH; PATHSTART_JOIN; PATHFINISH_JOIN; RE_ADD;
5240              PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
5241       MATCH_MP_TAC(REAL_ARITH
5242        `abs a < &1 / &2 /\ abs b < &1 / &2 /\ abs c < &1 / &2
5243         ==> a + b + c < &2`) THEN
5244       REPEAT CONJ_TAC THEN MATCH_MP_TAC WINDING_NUMBER_LT_HALF_LINEPATH THEN
5245       ASM_REWRITE_TAC[]]) in
5246   REPEAT STRIP_TAC THEN
5247   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP lemma2) THEN
5248   ASM_SIMP_TAC[lemma3; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
5249   SUBGOAL_THEN
5250    `winding_number
5251       (linepath(c,b) ++ linepath(b,a) ++ linepath(a,c),z) = Cx(&1)`
5252   MP_TAC THENL
5253    [MATCH_MP_TAC lemma3 THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[INSERT_AC];
5254     COND_CASES_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC]] THEN
5255   DISCH_THEN(SUBST1_TAC o SYM) THEN CONV_TAC SYM_CONV THEN
5256   REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
5257   RULE_ASSUM_TAC(REWRITE_RULE
5258    [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
5259   FIRST_ASSUM(ASSUME_TAC o ONCE_REWRITE_RULE[SEGMENT_SYM] o CONJUNCT2) THEN
5260   ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_IMAGE_JOIN; PATH_JOIN; IN_UNION;
5261          PATH_LINEPATH; PATHSTART_JOIN; PATHFINISH_JOIN; RE_ADD;
5262          PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
5263   ASM_SIMP_TAC[COMPLEX_NEG_ADD; GSYM WINDING_NUMBER_REVERSEPATH;
5264               PATH_IMAGE_LINEPATH; PATH_LINEPATH; REVERSEPATH_LINEPATH] THEN
5265   CONV_TAC COMPLEX_RING);;
5266
5267 (* ------------------------------------------------------------------------- *)
5268 (* Cauchy's integral formula, again for a convex enclosing set.              *)
5269 (* ------------------------------------------------------------------------- *)
5270
5271 let CAUCHY_INTEGRAL_FORMULA_WEAK = prove
5272  (`!f s k g z.
5273         convex s /\ FINITE k /\ f continuous_on s /\
5274         (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x) /\
5275         z IN interior(s) DIFF k /\
5276         valid_path g /\ (path_image g) SUBSET (s DELETE z) /\
5277         pathfinish g = pathstart g
5278         ==> ((\w. f(w) / (w - z)) has_path_integral
5279              (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
5280   REWRITE_TAC[IN_DIFF] THEN REPEAT STRIP_TAC THEN
5281   FIRST_ASSUM(MP_TAC o SPEC `z:complex`) THEN ANTS_TAC THENL
5282    [ASM_REWRITE_TAC[]; ALL_TAC] THEN
5283   REWRITE_TAC[complex_differentiable; LEFT_IMP_EXISTS_THM] THEN
5284   X_GEN_TAC `f':complex` THEN DISCH_TAC THEN MP_TAC(SPECL
5285    [`\w:complex. if w = z then f' else (f w - f z) / (w - z)`;
5286     `s:complex->bool`;
5287     `(z:complex) INSERT k`;
5288     `g:real^1->complex`] CAUCHY_THEOREM_CONVEX) THEN
5289   REWRITE_TAC[IN_DIFF; IN_INSERT; DE_MORGAN_THM] THEN ANTS_TAC THENL
5290    [ASM_REWRITE_TAC[FINITE_INSERT] THEN REPEAT CONJ_TAC THENL
5291      [ALL_TAC;
5292       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
5293       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_AT THEN
5294       EXISTS_TAC `\w:complex. (f w - f z) / (w - z)` THEN
5295       EXISTS_TAC `dist(w:complex,z)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
5296       CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC] THEN
5297       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
5298       ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
5299       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
5300       ASM_SIMP_TAC[ETA_AX; COMPLEX_DIFFERENTIABLE_CONST;
5301                    COMPLEX_DIFFERENTIABLE_ID];
5302       ASM SET_TAC[]] THEN
5303     REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN
5304     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
5305     ASM_CASES_TAC `w:complex = z` THENL
5306      [ALL_TAC;
5307       MATCH_MP_TAC CONTINUOUS_TRANSFORM_WITHIN THEN
5308       EXISTS_TAC `\w:complex. (f w - f z) / (w - z)` THEN
5309       EXISTS_TAC `dist(w:complex,z)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
5310       CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC] THEN
5311       MATCH_MP_TAC CONTINUOUS_COMPLEX_DIV_WITHIN THEN
5312       RULE_ASSUM_TAC(REWRITE_RULE[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN]) THEN
5313       ASM_SIMP_TAC[CONTINUOUS_CONST; CONTINUOUS_SUB; CONTINUOUS_WITHIN_ID;
5314                    ETA_AX; COMPLEX_SUB_0]] THEN
5315     FIRST_X_ASSUM SUBST_ALL_TAC THEN REWRITE_TAC[CONTINUOUS_WITHIN] THEN
5316     MATCH_MP_TAC LIM_TRANSFORM_AWAY_WITHIN THEN
5317     EXISTS_TAC `\w:complex. (f w - f z) / (w - z)` THEN SIMP_TAC[] THEN
5318     EXISTS_TAC `z + Cx(&1)` THEN
5319     CONJ_TAC THENL [CONV_TAC COMPLEX_RING; ALL_TAC] THEN
5320     REWRITE_TAC[GSYM HAS_COMPLEX_DERIVATIVE_WITHIN] THEN
5321     ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
5322     ALL_TAC] THEN
5323   MP_TAC(SPECL [`g:real^1->complex`; `z:complex`]
5324     HAS_PATH_INTEGRAL_WINDING_NUMBER) THEN
5325   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5326   DISCH_THEN(MP_TAC o SPEC `(f:complex->complex) z` o MATCH_MP
5327     HAS_PATH_INTEGRAL_COMPLEX_LMUL) THEN REWRITE_TAC[IMP_IMP] THEN
5328   DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_ADD) THEN
5329   REWRITE_TAC[COMPLEX_RING
5330    `f * Cx(&2) * a * b * c + Cx(&0) = Cx(&2) * a * b * c * f`] THEN
5331   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_EQ) THEN
5332   X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
5333   SUBGOAL_THEN `~(w:complex = z)` MP_TAC THENL
5334    [ASM SET_TAC[]; ALL_TAC] THEN
5335   ASM_REWRITE_TAC[] THEN CONV_TAC COMPLEX_FIELD);;
5336
5337 let CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE = prove
5338  (`!f s g z.
5339         convex s /\ f holomorphic_on s /\
5340         z IN interior(s) /\
5341         valid_path g /\ (path_image g) SUBSET (s DELETE z) /\
5342         pathfinish g = pathstart g
5343         ==> ((\w. f(w) / (w - z)) has_path_integral
5344              (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
5345   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_INTEGRAL_FORMULA_WEAK THEN
5346   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
5347   ASM_REWRITE_TAC[DIFF_EMPTY; FINITE_RULES] THEN
5348   SIMP_TAC[OPEN_INTERIOR; complex_differentiable; GSYM HOLOMORPHIC_ON_OPEN] THEN
5349   ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
5350                 HOLOMORPHIC_ON_SUBSET; INTERIOR_SUBSET]);;
5351
5352 (* ------------------------------------------------------------------------- *)
5353 (* Homotopy forms of Cauchy's theorem. The first two proofs are almost the   *)
5354 (* same and could potentially be unified with a little more work.            *)
5355 (* ------------------------------------------------------------------------- *)
5356
5357 let CAUCHY_THEOREM_HOMOTOPIC_PATHS = prove
5358  (`!f g h s.
5359         open s /\ f holomorphic_on s /\
5360         valid_path g /\ valid_path h /\ homotopic_paths s g h
5361         ==> path_integral g f = path_integral h f`,
5362   REPEAT STRIP_TAC THEN
5363   FIRST_ASSUM(ASSUME_TAC o SYM o MATCH_MP HOMOTOPIC_PATHS_IMP_PATHSTART) THEN
5364   FIRST_ASSUM(ASSUME_TAC o SYM o MATCH_MP HOMOTOPIC_PATHS_IMP_PATHFINISH) THEN
5365   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homotopic_paths]) THEN
5366   REWRITE_TAC[homotopic_with; LEFT_IMP_EXISTS_THM; PCROSS] THEN
5367   X_GEN_TAC `k:real^(1,1)finite_sum->complex` THEN STRIP_TAC THEN
5368   SUBGOAL_THEN
5369    `!t. t IN interval[vec 0:real^1,vec 1]
5370         ==> ?e. &0 < e /\
5371               !t1 t2. t1 IN interval[vec 0:real^1,vec 1] /\
5372                       t2 IN interval[vec 0,vec 1] /\
5373                       norm(t1 - t) < e /\ norm(t2 - t) < e
5374                    ==> ?d. &0 < d /\
5375                         !g1 g2. valid_path g1 /\ valid_path g2 /\
5376                                 (!u. u IN interval[vec 0,vec 1]
5377                                      ==> norm(g1 u - k(pastecart t1 u)) < d /\
5378                                          norm(g2 u - k(pastecart t2 u)) < d) /\
5379                                 pathstart g1 = pathstart g /\
5380                                 pathfinish g1 = pathfinish g /\
5381                                 pathstart g2 = pathstart g /\
5382                                 pathfinish g2 = pathfinish g
5383                                 ==> path_image g1 SUBSET s /\
5384                                     path_image g2 SUBSET s /\
5385                                     path_integral g2 f = path_integral g1 f`
5386   MP_TAC THENL
5387    [X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
5388     MP_TAC(ISPECL
5389      [`s:complex->bool`; `\u. (k:real^(1,1)finite_sum->complex)(pastecart t u)`]
5390      PATH_INTEGRAL_NEARBY_ENDS) THEN
5391     REWRITE_TAC[] THEN ANTS_TAC THENL
5392      [ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[GSYM o_DEF] THEN
5393       REWRITE_TAC[path_image; path; IMAGE_o] THEN CONJ_TAC THENL
5394        [ALL_TAC; ASM SET_TAC[]] THEN
5395       MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5396       SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5397                CONTINUOUS_ON_CONST] THEN
5398       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5399         CONTINUOUS_ON_SUBSET)) THEN ASM SET_TAC[];
5400       DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC)] THEN
5401     FIRST_ASSUM(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5402           COMPACT_UNIFORMLY_CONTINUOUS)) THEN
5403     SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS; COMPACT_INTERVAL] THEN
5404     REWRITE_TAC[uniformly_continuous_on] THEN
5405     DISCH_THEN(MP_TAC o SPEC `e / &4`) THEN
5406     ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5407     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
5408     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5409     REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
5410     REWRITE_TAC[FORALL_IN_GSPEC] THEN
5411     REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP; GSYM CONJ_ASSOC] THEN
5412     DISCH_THEN(MP_TAC o MATCH_MP (MESON[]
5413      `(!t x t' x'. P t x t' x') ==> (!t t' u. P t u t' u)`)) THEN
5414     REWRITE_TAC[dist; NORM_PASTECART; PASTECART_SUB] THEN
5415     REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5416     CONV_TAC REAL_RAT_REDUCE_CONV THEN
5417     REWRITE_TAC[TAUT `a /\ b /\ c /\ b /\ d <=> a /\ c /\ b /\ d`] THEN
5418     SIMP_TAC[REAL_ADD_RID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
5419     ASM_REWRITE_TAC[] THEN
5420     MAP_EVERY X_GEN_TAC [`t1:real^1`; `t2:real^1`] THEN
5421     STRIP_TAC THEN EXISTS_TAC `e / &4` THEN
5422     ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5423     MAP_EVERY X_GEN_TAC [`g1:real^1->complex`; `g2:real^1->complex`] THEN
5424     STRIP_TAC THEN FIRST_X_ASSUM
5425      (MP_TAC o SPECL [`g1:real^1->complex`; `g2:real^1->complex`]) THEN
5426     ASM_REWRITE_TAC[] THEN ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
5427     X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN
5428     ASM_MESON_TAC[NORM_ARITH
5429      `norm(g1 - k1) < e / &4 /\ norm(g2 - k2) < e / &4 /\
5430       norm(k1 - kt) < e / &4 /\ norm(k2 - kt) < e / &4
5431       ==> norm(g1 - kt) < e /\ norm(g2 - kt) < e`];
5432     GEN_REWRITE_TAC (LAND_CONV o BINDER_CONV) [RIGHT_IMP_EXISTS_THM] THEN
5433     REWRITE_TAC[ SKOLEM_THM; LEFT_IMP_EXISTS_THM]] THEN
5434   X_GEN_TAC `ee:real^1->real` THEN DISCH_THEN(LABEL_TAC "*") THEN
5435   MP_TAC(ISPEC `interval[vec 0:real^1,vec 1]` COMPACT_IMP_HEINE_BOREL) THEN
5436   REWRITE_TAC[COMPACT_INTERVAL] THEN
5437   DISCH_THEN(MP_TAC o SPEC
5438    `IMAGE (\t:real^1. ball(t,ee t / &3)) (interval[vec 0,vec 1])`) THEN
5439   ANTS_TAC THENL
5440    [REWRITE_TAC[FORALL_IN_IMAGE; OPEN_BALL; SUBSET] THEN
5441     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
5442     REWRITE_TAC[UNIONS_IMAGE; IN_ELIM_THM] THEN EXISTS_TAC `t:real^1` THEN
5443     ASM_SIMP_TAC[CENTRE_IN_BALL; REAL_ARITH `&0 < e / &3 <=> &0 < e`];
5444     ALL_TAC] THEN
5445   ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN
5446   REWRITE_TAC[CONJ_ASSOC; FINITE_SUBSET_IMAGE] THEN
5447   REWRITE_TAC[LEFT_AND_EXISTS_THM; MESON[]
5448    `(?f s. (P s /\ f = g s) /\ Q f) <=> ?s. P s /\ Q(g s)`] THEN
5449   REWRITE_TAC[UNIONS_IMAGE; LEFT_IMP_EXISTS_THM] THEN
5450   X_GEN_TAC `k:real^1->bool` THEN
5451   DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
5452   GEN_REWRITE_TAC LAND_CONV [SUBSET] THEN REWRITE_TAC[IN_ELIM_THM] THEN
5453   ASM_CASES_TAC `k:real^1->bool = {}` THENL
5454    [ASM_REWRITE_TAC[NOT_IN_EMPTY; GSYM NOT_EXISTS_THM; MEMBER_NOT_EMPTY] THEN
5455     REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN REAL_ARITH_TAC;
5456     DISCH_THEN(LABEL_TAC "+")] THEN
5457   SUBGOAL_THEN `!i:real^1. i IN k ==> &0 < ee(i)`
5458   ASSUME_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
5459   ABBREV_TAC `e = inf(IMAGE (ee:real^1->real) k)` THEN
5460   MP_TAC(ISPEC `IMAGE (ee:real^1->real) k` INF_FINITE) THEN
5461   MP_TAC(ISPECL [`IMAGE (ee:real^1->real) k`; `&0`]
5462     REAL_LT_INF_FINITE) THEN
5463   ASM_SIMP_TAC[FINITE_IMAGE; IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
5464   DISCH_TAC THEN DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
5465   MP_TAC(ISPEC `e / &3` REAL_ARCH_INV) THEN
5466   ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &3 <=> &0 < e`] THEN
5467   DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
5468   SUBGOAL_THEN
5469    `!n. n <= N
5470         ==> ?d. &0 < d /\
5471                 !j. valid_path j /\
5472                     (!u. u IN interval [vec 0,vec 1]
5473                         ==> norm(j u - k(pastecart (lift(&n / &N)) u)) < d) /\
5474                     pathstart j = pathstart g /\
5475                     pathfinish j = pathfinish g
5476                     ==> path_image j SUBSET s /\
5477                         path_integral j f = path_integral g f`
5478   (MP_TAC o SPEC `N:num`) THENL
5479    [ALL_TAC;
5480     REWRITE_TAC[LE_REFL; LEFT_IMP_EXISTS_THM] THEN
5481     GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5482     DISCH_THEN(MP_TAC o SPEC `h:real^1->complex`) THEN
5483     ASM_SIMP_TAC[REAL_DIV_REFL; REAL_OF_NUM_EQ; LIFT_NUM] THEN
5484     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[]] THEN
5485   INDUCT_TAC THENL
5486    [REMOVE_THEN "*" (MP_TAC o SPEC `vec 0:real^1`) THEN
5487     ASM_REWRITE_TAC[real_div; REAL_MUL_LZERO; LE_0; LIFT_NUM] THEN
5488     REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL] THEN
5489     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5490     REPEAT(DISCH_THEN(MP_TAC o SPEC `vec 0:real^1`) THEN
5491            REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL]) THEN
5492     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5493     MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN STRIP_TAC THEN
5494     ASM_REWRITE_TAC[] THEN X_GEN_TAC `j:real^1->complex` THEN
5495     STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
5496      [`g:real^1->complex`; `j:real^1->complex`]) THEN
5497     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[];
5498     DISCH_TAC] THEN
5499   SUBGOAL_THEN `lift(&n / &N) IN interval[vec 0,vec 1] /\
5500                 lift(&(SUC n) / &N) IN interval[vec 0,vec 1]`
5501   STRIP_ASSUME_TAC THENL
5502    [REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; LIFT_DROP] THEN
5503     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
5504     REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_LID; REAL_OF_NUM_LE] THEN
5505     ASM_ARITH_TAC;
5506     ALL_TAC] THEN
5507   REMOVE_THEN "+" (MP_TAC o SPEC `lift(&n / &N)`) THEN ASM_REWRITE_TAC[] THEN
5508   DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC) THEN
5509   FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN
5510   ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
5511   DISCH_THEN(X_CHOOSE_THEN `d1:real`
5512     (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "1"))) THEN
5513   REMOVE_THEN "*" (MP_TAC o SPEC `t:real^1`) THEN
5514   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5515   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5516   DISCH_THEN(MP_TAC o SPECL [`lift(&n / &N)`; `lift(&(SUC n) / &N)`]) THEN
5517   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
5518    [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
5519     MATCH_MP_TAC(NORM_ARITH
5520      `!e. norm(n' - n:real^N) < e / &3 /\ e <= ee
5521      ==> dist(t,n) < ee / &3 ==> norm(n - t) < ee /\ norm(n' - t) < ee`) THEN
5522     EXISTS_TAC `e:real` THEN
5523     REWRITE_TAC[NORM_REAL; GSYM drop; DROP_SUB; LIFT_DROP] THEN
5524     REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB] THEN
5525     SIMP_TAC[REAL_OF_NUM_SUB; ARITH_RULE `n <= SUC n`] THEN
5526     REWRITE_TAC[ARITH_RULE `SUC n - n = 1`; REAL_MUL_LID] THEN
5527     REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN
5528     ASM_SIMP_TAC[GSYM real_div];
5529     ALL_TAC] THEN
5530   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d2:real` THEN
5531   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
5532   X_GEN_TAC `j:real^1->complex` THEN STRIP_TAC THEN
5533   MP_TAC(ISPECL
5534    [`\u:real^1. (k(pastecart (lift (&n / &N)) u):complex)`;
5535     `min d1 d2`] PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
5536   ASM_SIMP_TAC[REAL_LT_MIN; REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5537   ANTS_TAC THENL
5538    [REWRITE_TAC[path] THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
5539     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5540     SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5541              CONTINUOUS_ON_CONST] THEN
5542     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5543         CONTINUOUS_ON_SUBSET)) THEN
5544     ASM SET_TAC[];
5545     DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC)] THEN
5546   REMOVE_THEN "1" (MP_TAC o SPEC `p:real^1->complex`) THEN
5547   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN STRIP_TAC THEN
5548   FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `j:real^1->complex`]) THEN
5549   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION]);;
5550
5551 let CAUCHY_THEOREM_HOMOTOPIC_LOOPS = prove
5552  (`!f g h s.
5553         open s /\ f holomorphic_on s /\
5554         valid_path g /\ valid_path h /\ homotopic_loops s g h
5555         ==> path_integral g f = path_integral h f`,
5556   REPEAT STRIP_TAC THEN
5557   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_LOOP) THEN
5558   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homotopic_loops]) THEN
5559   REWRITE_TAC[homotopic_with; PCROSS; LEFT_IMP_EXISTS_THM] THEN
5560   X_GEN_TAC `k:real^(1,1)finite_sum->complex` THEN STRIP_TAC THEN
5561   SUBGOAL_THEN
5562    `!t. t IN interval[vec 0:real^1,vec 1]
5563         ==> ?e. &0 < e /\
5564               !t1 t2. t1 IN interval[vec 0:real^1,vec 1] /\
5565                       t2 IN interval[vec 0,vec 1] /\
5566                       norm(t1 - t) < e /\ norm(t2 - t) < e
5567                    ==> ?d. &0 < d /\
5568                         !g1 g2. valid_path g1 /\ valid_path g2 /\
5569                                 (!u. u IN interval[vec 0,vec 1]
5570                                      ==> norm(g1 u - k(pastecart t1 u)) < d /\
5571                                          norm(g2 u - k(pastecart t2 u)) < d) /\
5572                                 pathfinish g1 = pathstart g1 /\
5573                                 pathfinish g2 = pathstart g2
5574                                 ==> path_image g1 SUBSET s /\
5575                                     path_image g2 SUBSET s /\
5576                                     path_integral g2 f = path_integral g1 f`
5577   MP_TAC THENL
5578    [X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
5579     MP_TAC(ISPECL
5580      [`s:complex->bool`; `\u. (k:real^(1,1)finite_sum->complex)(pastecart t u)`]
5581      PATH_INTEGRAL_NEARBY_LOOP) THEN
5582     REWRITE_TAC[] THEN ANTS_TAC THENL
5583      [ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[GSYM o_DEF] THEN
5584       REWRITE_TAC[path_image; path; IMAGE_o] THEN CONJ_TAC THENL
5585        [ALL_TAC; ASM SET_TAC[]] THEN
5586       MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5587       SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5588                CONTINUOUS_ON_CONST] THEN
5589       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5590         CONTINUOUS_ON_SUBSET)) THEN ASM SET_TAC[];
5591       DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC)] THEN
5592     FIRST_ASSUM(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5593           COMPACT_UNIFORMLY_CONTINUOUS)) THEN
5594     SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS; COMPACT_INTERVAL] THEN
5595     REWRITE_TAC[uniformly_continuous_on] THEN
5596     DISCH_THEN(MP_TAC o SPEC `e / &4`) THEN
5597     ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5598     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
5599     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5600     REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
5601     REWRITE_TAC[FORALL_IN_GSPEC] THEN
5602     REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP; GSYM CONJ_ASSOC] THEN
5603     DISCH_THEN(MP_TAC o MATCH_MP (MESON[]
5604      `(!t x t' x'. P t x t' x') ==> (!t t' u. P t u t' u)`)) THEN
5605     REWRITE_TAC[dist; NORM_PASTECART; PASTECART_SUB] THEN
5606     REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5607     CONV_TAC REAL_RAT_REDUCE_CONV THEN
5608     REWRITE_TAC[TAUT `a /\ b /\ c /\ b /\ d <=> a /\ c /\ b /\ d`] THEN
5609     SIMP_TAC[REAL_ADD_RID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
5610     ASM_REWRITE_TAC[] THEN
5611     MAP_EVERY X_GEN_TAC [`t1:real^1`; `t2:real^1`] THEN
5612     STRIP_TAC THEN EXISTS_TAC `e / &4` THEN
5613     ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5614     MAP_EVERY X_GEN_TAC [`g1:real^1->complex`; `g2:real^1->complex`] THEN
5615     STRIP_TAC THEN FIRST_X_ASSUM
5616      (MP_TAC o SPECL [`g1:real^1->complex`; `g2:real^1->complex`]) THEN
5617     ASM_REWRITE_TAC[] THEN ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
5618     X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN
5619     ASM_MESON_TAC[NORM_ARITH
5620      `norm(g1 - k1) < e / &4 /\ norm(g2 - k2) < e / &4 /\
5621       norm(k1 - kt) < e / &4 /\ norm(k2 - kt) < e / &4
5622       ==> norm(g1 - kt) < e /\ norm(g2 - kt) < e`];
5623     GEN_REWRITE_TAC (LAND_CONV o BINDER_CONV) [RIGHT_IMP_EXISTS_THM] THEN
5624     REWRITE_TAC[ SKOLEM_THM; LEFT_IMP_EXISTS_THM]] THEN
5625   X_GEN_TAC `ee:real^1->real` THEN DISCH_THEN(LABEL_TAC "*") THEN
5626   MP_TAC(ISPEC `interval[vec 0:real^1,vec 1]` COMPACT_IMP_HEINE_BOREL) THEN
5627   REWRITE_TAC[COMPACT_INTERVAL] THEN
5628   DISCH_THEN(MP_TAC o SPEC
5629    `IMAGE (\t:real^1. ball(t,ee t / &3)) (interval[vec 0,vec 1])`) THEN
5630   ANTS_TAC THENL
5631    [REWRITE_TAC[FORALL_IN_IMAGE; OPEN_BALL; SUBSET] THEN
5632     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
5633     REWRITE_TAC[UNIONS_IMAGE; IN_ELIM_THM] THEN EXISTS_TAC `t:real^1` THEN
5634     ASM_SIMP_TAC[CENTRE_IN_BALL; REAL_ARITH `&0 < e / &3 <=> &0 < e`];
5635     ALL_TAC] THEN
5636   ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN
5637   REWRITE_TAC[CONJ_ASSOC; FINITE_SUBSET_IMAGE] THEN
5638   REWRITE_TAC[LEFT_AND_EXISTS_THM; MESON[]
5639    `(?f s. (P s /\ f = g s) /\ Q f) <=> ?s. P s /\ Q(g s)`] THEN
5640   REWRITE_TAC[UNIONS_IMAGE; LEFT_IMP_EXISTS_THM] THEN
5641   X_GEN_TAC `k:real^1->bool` THEN
5642   DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
5643   GEN_REWRITE_TAC LAND_CONV [SUBSET] THEN REWRITE_TAC[IN_ELIM_THM] THEN
5644   ASM_CASES_TAC `k:real^1->bool = {}` THENL
5645    [ASM_REWRITE_TAC[NOT_IN_EMPTY; GSYM NOT_EXISTS_THM; MEMBER_NOT_EMPTY] THEN
5646     REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN REAL_ARITH_TAC;
5647     DISCH_THEN(LABEL_TAC "+")] THEN
5648   SUBGOAL_THEN `!i:real^1. i IN k ==> &0 < ee(i)`
5649   ASSUME_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
5650   ABBREV_TAC `e = inf(IMAGE (ee:real^1->real) k)` THEN
5651   MP_TAC(ISPEC `IMAGE (ee:real^1->real) k` INF_FINITE) THEN
5652   MP_TAC(ISPECL [`IMAGE (ee:real^1->real) k`; `&0`]
5653     REAL_LT_INF_FINITE) THEN
5654   ASM_SIMP_TAC[FINITE_IMAGE; IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
5655   DISCH_TAC THEN DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
5656   MP_TAC(ISPEC `e / &3` REAL_ARCH_INV) THEN
5657   ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &3 <=> &0 < e`] THEN
5658   DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
5659   SUBGOAL_THEN
5660    `!n. n <= N
5661         ==> ?d. &0 < d /\
5662                 !j. valid_path j /\
5663                     (!u. u IN interval [vec 0,vec 1]
5664                         ==> norm(j u - k(pastecart (lift(&n / &N)) u)) < d) /\
5665                     pathfinish j = pathstart j
5666                     ==> path_image j SUBSET s /\
5667                         path_integral j f = path_integral g f`
5668   (MP_TAC o SPEC `N:num`) THENL
5669    [ALL_TAC;
5670     REWRITE_TAC[LE_REFL; LEFT_IMP_EXISTS_THM] THEN
5671     GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5672     DISCH_THEN(MP_TAC o SPEC `h:real^1->complex`) THEN
5673     ASM_SIMP_TAC[REAL_DIV_REFL; REAL_OF_NUM_EQ; LIFT_NUM] THEN
5674     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[]] THEN
5675   INDUCT_TAC THENL
5676    [REMOVE_THEN "*" (MP_TAC o SPEC `vec 0:real^1`) THEN
5677     ASM_REWRITE_TAC[real_div; REAL_MUL_LZERO; LE_0; LIFT_NUM] THEN
5678     REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL] THEN
5679     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5680     REPEAT(DISCH_THEN(MP_TAC o SPEC `vec 0:real^1`) THEN
5681            REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL]) THEN
5682     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5683     MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN STRIP_TAC THEN
5684     ASM_REWRITE_TAC[] THEN X_GEN_TAC `j:real^1->complex` THEN
5685     STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
5686      [`g:real^1->complex`; `j:real^1->complex`]) THEN
5687     ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[];
5688     DISCH_TAC] THEN
5689   SUBGOAL_THEN `lift(&n / &N) IN interval[vec 0,vec 1] /\
5690                 lift(&(SUC n) / &N) IN interval[vec 0,vec 1]`
5691   STRIP_ASSUME_TAC THENL
5692    [REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; LIFT_DROP] THEN
5693     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
5694     REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_LID; REAL_OF_NUM_LE] THEN
5695     ASM_ARITH_TAC;
5696     ALL_TAC] THEN
5697   REMOVE_THEN "+" (MP_TAC o SPEC `lift(&n / &N)`) THEN ASM_REWRITE_TAC[] THEN
5698   DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC) THEN
5699   FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN
5700   ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
5701   DISCH_THEN(X_CHOOSE_THEN `d1:real`
5702     (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "1"))) THEN
5703   REMOVE_THEN "*" (MP_TAC o SPEC `t:real^1`) THEN
5704   ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5705   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5706   DISCH_THEN(MP_TAC o SPECL [`lift(&n / &N)`; `lift(&(SUC n) / &N)`]) THEN
5707   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
5708    [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
5709     MATCH_MP_TAC(NORM_ARITH
5710      `!e. norm(n' - n:real^N) < e / &3 /\ e <= ee
5711      ==> dist(t,n) < ee / &3 ==> norm(n - t) < ee /\ norm(n' - t) < ee`) THEN
5712     EXISTS_TAC `e:real` THEN
5713     REWRITE_TAC[NORM_REAL; GSYM drop; DROP_SUB; LIFT_DROP] THEN
5714     REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB] THEN
5715     SIMP_TAC[REAL_OF_NUM_SUB; ARITH_RULE `n <= SUC n`] THEN
5716     REWRITE_TAC[ARITH_RULE `SUC n - n = 1`; REAL_MUL_LID] THEN
5717     REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN
5718     ASM_SIMP_TAC[GSYM real_div];
5719     ALL_TAC] THEN
5720   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d2:real` THEN
5721   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
5722   X_GEN_TAC `j:real^1->complex` THEN STRIP_TAC THEN
5723   MP_TAC(ISPECL
5724    [`\u:real^1. (k(pastecart (lift (&n / &N)) u):complex)`;
5725     `min d1 d2`] PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
5726   ASM_SIMP_TAC[REAL_LT_MIN; REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5727   ANTS_TAC THENL
5728    [REWRITE_TAC[path] THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
5729     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5730     SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5731              CONTINUOUS_ON_CONST] THEN
5732     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5733         CONTINUOUS_ON_SUBSET)) THEN
5734     ASM SET_TAC[];
5735     DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC)] THEN
5736   REMOVE_THEN "1" (MP_TAC o SPEC `p:real^1->complex`) THEN
5737   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN STRIP_TAC THEN
5738   FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `j:real^1->complex`]) THEN
5739   ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION]);;
5740
5741 let CAUCHY_THEOREM_NULL_HOMOTOPIC = prove
5742  (`!f g s a.
5743         open s /\ f holomorphic_on s /\ a IN s /\ valid_path g /\
5744         homotopic_loops s g (linepath(a,a))
5745         ==> (f has_path_integral Cx(&0)) g`,
5746   REPEAT STRIP_TAC THEN
5747   FIRST_ASSUM(ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_SUBSET) THEN
5748   MATCH_MP_TAC
5749    (MESON[HAS_PATH_INTEGRAL_INTEGRAL; path_integrable_on; PATH_INTEGRAL_UNIQUE]
5750      `!p. f path_integrable_on g /\ (f has_path_integral y) p /\
5751           path_integral g f = path_integral p f
5752           ==> (f has_path_integral y) g`) THEN
5753   EXISTS_TAC `linepath(a:complex,a)` THEN REPEAT CONJ_TAC THENL
5754    [ASM_MESON_TAC[PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE];
5755     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
5756     DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[] THEN
5757     DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
5758     MATCH_MP_TAC CAUCHY_THEOREM_CONVEX_SIMPLE THEN
5759     EXISTS_TAC `ball(a:complex,e)` THEN
5760     ASM_REWRITE_TAC[VALID_PATH_LINEPATH; CONVEX_BALL; PATH_IMAGE_LINEPATH;
5761                     PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
5762     ASM_REWRITE_TAC[SEGMENT_REFL; SING_SUBSET; IN_BALL; CENTRE_IN_BALL] THEN
5763     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET];
5764     MATCH_MP_TAC CAUCHY_THEOREM_HOMOTOPIC_LOOPS THEN
5765     EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[VALID_PATH_LINEPATH]]);;
5766
5767 let CAUCHY_THEOREM_SIMPLY_CONNECTED = prove
5768  (`!f g s. open s /\ simply_connected s /\ f holomorphic_on s /\
5769            valid_path g /\ path_image g SUBSET s /\ pathfinish g = pathstart g
5770            ==> (f has_path_integral Cx(&0)) g`,
5771   REWRITE_TAC[SIMPLY_CONNECTED_EQ_CONTRACTIBLE_PATH] THEN REPEAT STRIP_TAC THEN
5772   MATCH_MP_TAC CAUCHY_THEOREM_NULL_HOMOTOPIC THEN
5773   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `pathstart g :complex`] THEN
5774   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
5775    [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; SUBSET];
5776     MATCH_MP_TAC HOMOTOPIC_PATHS_IMP_HOMOTOPIC_LOOPS THEN
5777     ASM_SIMP_TAC[PATHFINISH_LINEPATH; VALID_PATH_IMP_PATH]]);;
5778
5779 (* ------------------------------------------------------------------------- *)
5780 (* More winding number properties, including the fact that it's +-1 inside   *)
5781 (* a simple closed curve.                                                    *)
5782 (* ------------------------------------------------------------------------- *)
5783
5784 let WINDING_NUMBER_HOMOTOPIC_PATHS = prove
5785  (`!g h z. homotopic_paths ((:complex) DELETE z) g h
5786            ==> winding_number(g,z) = winding_number(h,z)`,
5787   REPEAT STRIP_TAC THEN
5788   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_PATH) THEN
5789   FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_SUBSET) THEN
5790   REWRITE_TAC[SET_RULE `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5791   STRIP_TAC THEN
5792   MP_TAC(ISPECL [`g:real^1->complex`; `(:complex) DELETE z`]
5793      HOMOTOPIC_NEARBY_PATHS) THEN
5794   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5795    `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5796   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
5797   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `d:real`]
5798     WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5799   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
5800   MP_TAC(ISPECL [`h:real^1->complex`; `(:complex) DELETE z`]
5801      HOMOTOPIC_NEARBY_PATHS) THEN
5802   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5803    `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5804   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
5805   MP_TAC(ISPECL [`h:real^1->complex`; `z:complex`; `e:real`]
5806     WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5807   DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
5808   SUBGOAL_THEN
5809    `path_integral p (\w. Cx(&1) / (w - z)) =
5810     path_integral q (\w. Cx(&1) / (w - z))`
5811   MP_TAC THENL
5812    [MATCH_MP_TAC CAUCHY_THEOREM_HOMOTOPIC_PATHS THEN
5813     EXISTS_TAC `(:complex) DELETE z` THEN
5814     ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN CONJ_TAC THENL
5815      [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
5816       SIMP_TAC[HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID;
5817                HOLOMORPHIC_ON_SUB; IN_DELETE; COMPLEX_SUB_0];
5818       ALL_TAC] THEN
5819     MATCH_MP_TAC HOMOTOPIC_PATHS_TRANS THEN
5820     EXISTS_TAC `g:real^1->complex` THEN CONJ_TAC THENL
5821      [ONCE_REWRITE_TAC[HOMOTOPIC_PATHS_SYM] THEN
5822       FIRST_X_ASSUM MATCH_MP_TAC THEN
5823       ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH];
5824       MATCH_MP_TAC HOMOTOPIC_PATHS_TRANS THEN
5825       EXISTS_TAC `h:real^1->complex` THEN ASM_REWRITE_TAC[] THEN
5826       FIRST_X_ASSUM MATCH_MP_TAC THEN
5827       ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH]];
5828     ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_RING]);;
5829
5830 let WINDING_NUMBER_HOMOTOPIC_LOOPS = prove
5831  (`!g h z. homotopic_loops ((:complex) DELETE z) g h
5832            ==> winding_number(g,z) = winding_number(h,z)`,
5833   REPEAT STRIP_TAC THEN
5834   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_PATH) THEN
5835   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_LOOP) THEN
5836   FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_SUBSET) THEN
5837   REWRITE_TAC[SET_RULE `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5838   STRIP_TAC THEN
5839   MP_TAC(ISPECL [`g:real^1->complex`; `(:complex) DELETE z`]
5840      HOMOTOPIC_NEARBY_LOOPS) THEN
5841   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5842    `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5843   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
5844   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `d:real`]
5845     WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5846   DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
5847   MP_TAC(ISPECL [`h:real^1->complex`; `(:complex) DELETE z`]
5848      HOMOTOPIC_NEARBY_LOOPS) THEN
5849   ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5850    `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5851   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
5852   MP_TAC(ISPECL [`h:real^1->complex`; `z:complex`; `e:real`]
5853     WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5854   DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
5855   SUBGOAL_THEN
5856    `path_integral p (\w. Cx(&1) / (w - z)) =
5857     path_integral q (\w. Cx(&1) / (w - z))`
5858   MP_TAC THENL
5859    [MATCH_MP_TAC CAUCHY_THEOREM_HOMOTOPIC_LOOPS THEN
5860     EXISTS_TAC `(:complex) DELETE z` THEN
5861     ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN CONJ_TAC THENL
5862      [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
5863       SIMP_TAC[HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID;
5864                HOLOMORPHIC_ON_SUB; IN_DELETE; COMPLEX_SUB_0];
5865       ALL_TAC] THEN
5866     MATCH_MP_TAC HOMOTOPIC_LOOPS_TRANS THEN
5867     EXISTS_TAC `g:real^1->complex` THEN CONJ_TAC THENL
5868      [ONCE_REWRITE_TAC[HOMOTOPIC_LOOPS_SYM] THEN
5869       FIRST_X_ASSUM MATCH_MP_TAC THEN
5870       ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH];
5871       MATCH_MP_TAC HOMOTOPIC_LOOPS_TRANS THEN
5872       EXISTS_TAC `h:real^1->complex` THEN ASM_REWRITE_TAC[] THEN
5873       FIRST_X_ASSUM MATCH_MP_TAC THEN
5874       ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH]];
5875     ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_RING]);;
5876
5877 let WINDING_NUMBER_PATHS_LINEAR_EQ = prove
5878  (`!g h z.
5879         path g /\ path h /\
5880         pathstart h = pathstart g /\
5881         pathfinish h = pathfinish g /\
5882         (!t. t IN interval[vec 0,vec 1] ==> ~(z IN segment[g t,h t]))
5883         ==> winding_number(h,z) = winding_number(g,z)`,
5884   REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5885   MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
5886   MATCH_MP_TAC HOMOTOPIC_PATHS_LINEAR THEN ASM SET_TAC[]);;
5887
5888 let WINDING_NUMBER_LOOPS_LINEAR_EQ = prove
5889  (`!g h z.
5890         path g /\ path h /\
5891         pathfinish g = pathstart g /\
5892         pathfinish h = pathstart h /\
5893         (!t. t IN interval[vec 0,vec 1] ==> ~(z IN segment[g t,h t]))
5894         ==> winding_number(h,z) = winding_number(g,z)`,
5895   REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5896   MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_LOOPS THEN
5897   MATCH_MP_TAC HOMOTOPIC_LOOPS_LINEAR THEN ASM SET_TAC[]);;
5898
5899 let WINDING_NUMBER_NEARBY_PATHS_EQ = prove
5900  (`!g h z.
5901         path g /\ path h /\
5902         pathstart h = pathstart g /\
5903         pathfinish h = pathfinish g /\
5904         (!t. t IN interval[vec 0,vec 1] ==> norm(h t - g t) < norm(g t - z))
5905         ==> winding_number(h,z) = winding_number(g,z)`,
5906   REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5907   MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
5908   MATCH_MP_TAC HOMOTOPIC_PATHS_NEARBY_EXPLICIT THEN ASM SET_TAC[]);;
5909
5910 let WINDING_NUMBER_NEARBY_LOOPS_EQ = prove
5911  (`!g h z.
5912         path g /\ path h /\
5913         pathfinish g = pathstart g /\
5914         pathfinish h = pathstart h /\
5915         (!t. t IN interval[vec 0,vec 1] ==> norm(h t - g t) < norm(g t - z))
5916         ==> winding_number(h,z) = winding_number(g,z)`,
5917   REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5918   MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_LOOPS THEN
5919   MATCH_MP_TAC HOMOTOPIC_LOOPS_NEARBY_EXPLICIT THEN ASM SET_TAC[]);;
5920
5921 let WINDING_NUMBER_SUBPATH_COMBINE = prove
5922  (`!g u v w z.
5923         path g /\ ~(z IN path_image g) /\
5924         u IN interval [vec 0,vec 1] /\
5925         v IN interval [vec 0,vec 1] /\
5926         w IN interval [vec 0,vec 1]
5927         ==> winding_number(subpath u v g,z) +
5928             winding_number(subpath v w g,z) =
5929             winding_number(subpath u w g,z)`,
5930   REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
5931   EXISTS_TAC `winding_number(subpath u v g ++ subpath v w g,z)` THEN
5932   CONJ_TAC THENL
5933    [CONV_TAC SYM_CONV THEN MATCH_MP_TAC WINDING_NUMBER_JOIN THEN
5934     ASM_SIMP_TAC[PATH_SUBPATH; PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
5935     ASM_MESON_TAC[SUBSET; PATH_IMAGE_SUBPATH_SUBSET];
5936     MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
5937     MATCH_MP_TAC HOMOTOPIC_JOIN_SUBPATHS THEN
5938     ASM_REWRITE_TAC[] THEN ASM SET_TAC[]]);;
5939
5940 let WINDING_NUMBER_STRONG = prove
5941  (`!g z e.
5942         path g /\ ~(z IN path_image g) /\ &0 < e
5943          ==> ?p. vector_polynomial_function p /\ valid_path p /\
5944                  ~(z IN path_image p) /\
5945                  pathstart p = pathstart g /\
5946                  pathfinish p = pathfinish g /\
5947                  (!t. t IN interval[vec 0,vec 1] ==> norm(g t - p t) < e) /\
5948                  path_integral p (\w. Cx(&1) / (w - z)) =
5949                  Cx(&2) * Cx(pi) * ii * winding_number(g,z)`,
5950   REPEAT STRIP_TAC THEN
5951   SUBGOAL_THEN
5952    `?d. &0 < d /\
5953        !t. t IN interval[vec 0,vec 1] ==> d <= norm((g:real^1->complex) t - z)`
5954   STRIP_ASSUME_TAC THENL
5955    [EXISTS_TAC `setdist({z:complex},path_image g)` THEN
5956     REWRITE_TAC[SETDIST_POS_LE; REAL_ARITH
5957      `&0 < x <=> &0 <= x /\ ~(x = &0)`] THEN
5958      ASM_SIMP_TAC[SETDIST_EQ_0_CLOSED_COMPACT; CLOSED_SING; COMPACT_PATH_IMAGE;
5959                   PATH_IMAGE_NONEMPTY] THEN
5960      CONJ_TAC THENL [ASM SET_TAC[]; REPEAT STRIP_TAC] THEN
5961      REWRITE_TAC[ONCE_REWRITE_RULE[DIST_SYM] (GSYM dist)] THEN
5962      MATCH_MP_TAC SETDIST_LE_DIST THEN REWRITE_TAC[path_image] THEN
5963      ASM SET_TAC[];
5964      MP_TAC(ISPECL [`g:real^1->complex`; `min d e`]
5965       PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
5966      ASM_REWRITE_TAC[REAL_LT_MIN] THEN MATCH_MP_TAC MONO_EXISTS THEN
5967      X_GEN_TAC `p:real^1->complex` THEN STRIP_TAC THEN
5968      ONCE_REWRITE_TAC[NORM_SUB] THEN
5969      ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
5970      MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
5971       [REWRITE_TAC[path_image; IN_IMAGE] THEN
5972        ASM_MESON_TAC[NORM_SUB; REAL_NOT_LT];
5973        DISCH_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
5974         `!w'. ~(a * b * c = Cx(&0)) /\ w' = w /\ w' = Cx(&1) / (a * b * c) * i
5975               ==> i = a * b * c * w`) THEN
5976        EXISTS_TAC `winding_number(p,z)` THEN
5977        REWRITE_TAC[CX_2PII_NZ] THEN CONJ_TAC THENL
5978         [MATCH_MP_TAC WINDING_NUMBER_NEARBY_PATHS_EQ; ALL_TAC] THEN
5979        ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; VALID_PATH_IMP_PATH;
5980                     VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
5981        ASM_MESON_TAC[REAL_LTE_TRANS; NORM_SUB]]]);;
5982
5983 let WINDING_NUMBER_FROM_INNERPATH = prove
5984  (`!c1 c2 c a b z:complex d.
5985         ~(a = b) /\
5986         simple_path c1 /\ pathstart c1 = a /\ pathfinish c1 = b /\
5987         simple_path c2 /\ pathstart c2 = a /\ pathfinish c2 = b /\
5988         simple_path c /\ pathstart c = a /\ pathfinish c = b /\
5989         path_image c1 INTER path_image c2 = {a,b} /\
5990         path_image c1 INTER path_image c = {a,b} /\
5991         path_image c2 INTER path_image c = {a,b} /\
5992         ~(path_image c INTER inside(path_image c1 UNION path_image c2) = {}) /\
5993         z IN inside(path_image c1 UNION path_image c) /\
5994         winding_number(c1 ++ reversepath c,z) = d /\ ~(d = Cx(&0))
5995         ==> z IN inside(path_image c1 UNION path_image c2) /\
5996             winding_number(c1 ++ reversepath c2,z) = d`,
5997   REPEAT GEN_TAC THEN STRIP_TAC THEN
5998   MP_TAC(ISPECL [`c1:real^1->complex`; `c2:real^1->complex`;
5999                  `c:real^1->complex`; `a:complex`; `b:complex`]
6000          SPLIT_INSIDE_SIMPLE_CLOSED_CURVE) THEN
6001   ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
6002   CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
6003   UNDISCH_TAC `winding_number(c1 ++ reversepath c,z) = d` THEN
6004   MP_TAC(ISPECL
6005    [`c ++ reversepath(c2:real^1->complex)`; `z:complex`]
6006    WINDING_NUMBER_ZERO_IN_OUTSIDE) THEN
6007   SUBGOAL_THEN
6008    `~((z:complex) IN path_image c) /\
6009     ~(z IN path_image c1) /\
6010     ~(z IN path_image c2)`
6011   STRIP_ASSUME_TAC THENL
6012    [MP_TAC(ISPEC `(path_image c1 UNION path_image c):complex->bool`
6013                  INSIDE_NO_OVERLAP) THEN
6014     MP_TAC(ISPEC `(path_image c1 UNION path_image c2):complex->bool`
6015                  INSIDE_NO_OVERLAP) THEN
6016     ASM SET_TAC[];
6017     ASM_SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_JOIN;
6018       PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH; PATH_IMAGE_REVERSEPATH;
6019       PATH_JOIN; PATH_REVERSEPATH; SIMPLE_PATH_IMP_PATH;
6020       WINDING_NUMBER_JOIN; WINDING_NUMBER_REVERSEPATH] THEN
6021     ANTS_TAC THENL
6022      [ASM_REWRITE_TAC[OUTSIDE_INSIDE; IN_DIFF; IN_UNION; IN_UNIV] THEN
6023       ONCE_REWRITE_TAC[UNION_COMM] THEN ASM SET_TAC[];
6024       CONV_TAC COMPLEX_RING]]);;
6025
6026 let SIMPLE_CLOSED_PATH_WINDING_NUMBER_INSIDE = prove
6027  (`!g. simple_path g
6028        ==> (!z. z IN inside(path_image g) ==> winding_number(g,z) = Cx(&1)) \/
6029            (!z. z IN inside(path_image g) ==> winding_number(g,z) = --Cx(&1))`,
6030   let lemma1 = prove
6031    (`!p a e.
6032           &0 < e /\
6033           simple_path(p ++ linepath(a - e % basis 1,a + e % basis 1)) /\
6034           pathstart p = a + e % basis 1 /\ pathfinish p = a - e % basis 1 /\
6035           ball(a,e) INTER path_image p = {}
6036           ==> ?z. z IN inside(path_image
6037                          (p ++ linepath(a - e % basis 1,a + e % basis 1))) /\
6038                   norm(winding_number
6039                    (p ++ linepath(a - e % basis 1,a + e % basis 1),z)) = &1`,
6040     REPEAT STRIP_TAC THEN
6041     MP_TAC(ISPECL
6042      [`p:real^1->complex`; `linepath(a - e % basis 1,a + e % basis 1)`]
6043      SIMPLE_PATH_JOIN_LOOP_EQ) THEN
6044     ASM_REWRITE_TAC[PATHFINISH_LINEPATH; PATHSTART_LINEPATH] THEN
6045     STRIP_TAC THEN
6046     SUBGOAL_THEN
6047       `(a:complex) IN frontier(inside
6048        (path_image(p ++ linepath(a - e % basis 1,a + e % basis 1))))`
6049     MP_TAC THENL
6050      [FIRST_ASSUM
6051        (MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] JORDAN_INSIDE_OUTSIDE)) THEN
6052       ASM_REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
6053                       PATHFINISH_LINEPATH] THEN
6054       STRIP_TAC THEN ASM_SIMP_TAC[PATH_IMAGE_JOIN; PATHSTART_LINEPATH] THEN
6055       REWRITE_TAC[IN_UNION; PATH_IMAGE_LINEPATH] THEN DISJ2_TAC THEN
6056       REWRITE_TAC[IN_SEGMENT] THEN EXISTS_TAC `&1 / &2` THEN
6057       CONV_TAC REAL_RAT_REDUCE_CONV THEN VECTOR_ARITH_TAC;
6058       ALL_TAC] THEN
6059     REWRITE_TAC[FRONTIER_STRADDLE] THEN
6060     DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
6061     DISCH_THEN(X_CHOOSE_THEN `c:complex` STRIP_ASSUME_TAC o CONJUNCT1) THEN
6062     MP_TAC(ISPEC
6063      `path_image (p ++ linepath(a - e % basis 1:complex,a + e % basis 1))`
6064      INSIDE_NO_OVERLAP) THEN
6065     REWRITE_TAC[EXTENSION] THEN DISCH_THEN(MP_TAC o SPEC `c:complex`) THEN
6066     ASM_REWRITE_TAC[IN_INTER; NOT_IN_EMPTY] THEN
6067     ASM_SIMP_TAC[PATH_IMAGE_JOIN; PATHSTART_LINEPATH; PATH_IMAGE_LINEPATH] THEN
6068     REWRITE_TAC[IN_UNION; DE_MORGAN_THM] THEN
6069     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6070     GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [SEGMENT_AS_BALL] THEN
6071     ASM_REWRITE_TAC[IN_INTER;
6072       VECTOR_ARITH `inv(&2) % ((a - e) + (a + e)):complex = a`;
6073       VECTOR_ARITH `(a + e) - (a - e):complex = &2 % e`] THEN
6074     ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6075     ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> (abs(&2) * abs e * &1) / &2 = e`] THEN
6076     ASM_SIMP_TAC[IN_CBALL; REAL_LT_IMP_LE] THEN STRIP_TAC THEN
6077     SUBGOAL_THEN
6078      `~collinear{a - e % basis 1,c:complex,a + e % basis 1}`
6079     ASSUME_TAC THENL
6080      [MP_TAC(ISPECL
6081        [`a - e % basis 1:complex`; `a + e % basis  1:complex`; `c:complex`]
6082        COLLINEAR_3_AFFINE_HULL) THEN
6083       ASM_SIMP_TAC[VECTOR_ARITH `a - x:complex = a + x <=> x = vec 0`;
6084                    BASIS_NONZERO; DIMINDEX_2; ARITH; VECTOR_MUL_EQ_0;
6085                    REAL_LT_IMP_NZ] THEN
6086       REWRITE_TAC[INSERT_AC];
6087       ALL_TAC] THEN
6088     SUBGOAL_THEN
6089     `~(interior(convex hull {a - e % basis 1,c:complex,a + e % basis 1}) = {})`
6090     MP_TAC THENL
6091      [ASM_SIMP_TAC[INTERIOR_CONVEX_HULL_3_MINIMAL] THEN
6092       REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN
6093       REPEAT(ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN EXISTS_TAC `&1 / &3`) THEN
6094       CONV_TAC REAL_RAT_REDUCE_CONV THEN MESON_TAC[];
6095       ALL_TAC] THEN
6096     REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN
6097     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
6098     FIRST_ASSUM(MP_TAC o AP_TERM `norm:complex->real` o
6099       MATCH_MP WINDING_NUMBER_TRIANGLE) THEN
6100     REWRITE_TAC[] THEN ONCE_REWRITE_TAC[COND_RAND] THEN
6101     REWRITE_TAC[NORM_NEG; COND_ID; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
6102     DISCH_TAC THEN
6103     MP_TAC(ISPECL
6104      [`linepath(a + e % basis 1:complex,a - e % basis 1)`;
6105       `p:real^1->complex`;
6106       `linepath(a + e % basis 1:complex,c) ++ linepath(c,a - e % basis 1)`;
6107       `a + e % basis 1:complex`; `a - e % basis 1:complex`;
6108       `z:complex`;
6109       `winding_number
6110         (linepath(a - e % basis 1,c) ++
6111          linepath(c,a + e % basis 1) ++
6112          linepath(a + e % basis 1,a - e % basis 1),
6113          z)`] WINDING_NUMBER_FROM_INNERPATH) THEN
6114     ASM_SIMP_TAC[SIMPLE_PATH_LINEPATH; PATHSTART_JOIN; PATHFINISH_JOIN;
6115              VECTOR_ARITH `a + x:complex = a - x <=> x = vec 0`;
6116              BASIS_NONZERO; DIMINDEX_2; ARITH; VECTOR_MUL_EQ_0;
6117              REAL_LT_IMP_NZ; PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
6118              ARC_IMP_SIMPLE_PATH; PATH_IMAGE_JOIN; PATH_IMAGE_LINEPATH] THEN
6119     ANTS_TAC THENL
6120      [ALL_TAC;
6121       MATCH_MP_TAC(TAUT
6122        `(p ==> p') /\ (p /\ q ==> q') ==> p /\ q ==> p' /\ q'`) THEN
6123       CONJ_TAC THENL [MESON_TAC[UNION_COMM; SEGMENT_SYM]; ALL_TAC] THEN
6124       DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (SUBST_ALL_TAC o SYM)) THEN
6125       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
6126        `norm(z:complex) = &1 ==> u = --z ==> norm u = &1`)) THEN
6127       GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV)
6128        [GSYM REVERSEPATH_LINEPATH] THEN
6129       ASM_SIMP_TAC[GSYM REVERSEPATH_JOINPATHS; PATHSTART_LINEPATH] THEN
6130       ONCE_REWRITE_TAC[COMPLEX_RING `a:complex = --b <=> b = --a`] THEN
6131       MATCH_MP_TAC WINDING_NUMBER_REVERSEPATH THEN
6132       ASM_SIMP_TAC[PATH_JOIN; PATHSTART_LINEPATH; PATH_IMAGE_JOIN;
6133                    PATH_LINEPATH; ARC_IMP_PATH; PATH_IMAGE_LINEPATH] THEN
6134       ONCE_REWRITE_TAC[SEGMENT_SYM] THEN ONCE_REWRITE_TAC[UNION_COMM] THEN
6135       ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]] THEN
6136     REPEAT CONJ_TAC THENL
6137      [MATCH_MP_TAC ARC_IMP_SIMPLE_PATH THEN MATCH_MP_TAC ARC_JOIN THEN
6138       REWRITE_TAC[ARC_LINEPATH_EQ; PATHSTART_LINEPATH;
6139                   PATHFINISH_LINEPATH] THEN
6140       REPEAT(CONJ_TAC THENL
6141        [DISCH_THEN SUBST_ALL_TAC THEN
6142         RULE_ASSUM_TAC(REWRITE_RULE[INSERT_AC; COLLINEAR_2]) THEN
6143         FIRST_X_ASSUM CONTR_TAC;
6144         ALL_TAC]) THEN
6145       REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
6146       MATCH_MP_TAC(SET_RULE `s = t ==> s SUBSET t`) THEN
6147       MATCH_MP_TAC INTER_SEGMENT THEN ASM_MESON_TAC[INSERT_AC];
6148       REWRITE_TAC[SEGMENT_CLOSED_OPEN] THEN
6149       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6150        `b INTER p = {}
6151         ==> s SUBSET b /\ k SUBSET p
6152             ==> (s UNION k) INTER p = k`)) THEN
6153       CONJ_TAC THENL
6154        [REWRITE_TAC[SUBSET; IN_SEGMENT; IN_BALL] THEN
6155         REWRITE_TAC[VECTOR_ARITH
6156          `(&1 - u) % (a + e) + u % (a - e):complex =
6157           a + (&1 - &2 * u) % e`] THEN
6158         REPEAT STRIP_TAC THEN
6159         ASM_REWRITE_TAC[NORM_ARITH `dist(a:complex,a + e) = norm e`] THEN
6160         SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6161         MATCH_MP_TAC(REAL_ARITH
6162          `x * e < &1 * e /\ &0 < e ==> x * abs e * &1 < e`) THEN
6163         ASM_SIMP_TAC[REAL_LT_RMUL_EQ] THEN ASM_REAL_ARITH_TAC;
6164         REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET] THEN
6165         ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE]];
6166       MATCH_MP_TAC(SET_RULE
6167        `s INTER t1 = {a} /\ s INTER t2 = {b}
6168         ==> s INTER (t1 UNION t2) = {a,b}`) THEN
6169       CONJ_TAC THENL
6170        [GEN_REWRITE_TAC (LAND_CONV o LAND_CONV) [SEGMENT_SYM];
6171         GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [SEGMENT_SYM]] THEN
6172       MATCH_MP_TAC INTER_SEGMENT THEN DISJ2_TAC THEN
6173       ASM_MESON_TAC[INSERT_AC];
6174       MATCH_MP_TAC(SET_RULE
6175        `s INTER t1 = {a} /\ s INTER t2 = {b}
6176         ==> s INTER (t1 UNION t2) = {a,b}`) THEN
6177       CONJ_TAC THENL [ONCE_REWRITE_TAC[SEGMENT_SYM]; ALL_TAC] THEN
6178       REWRITE_TAC[SEGMENT_CLOSED_OPEN] THEN
6179       MATCH_MP_TAC(SET_RULE
6180        `b IN p /\ ~(c IN p) /\ p INTER s = {}
6181         ==> p INTER (s UNION {c,b}) = {b}`) THEN
6182       (CONJ_TAC THENL
6183         [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE];
6184          ASM_REWRITE_TAC[]]) THEN
6185       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6186        `b INTER p = {} ==> s SUBSET b ==> p INTER s = {}`)) THEN
6187       REWRITE_TAC[GSYM INTERIOR_CBALL] THEN
6188       MATCH_MP_TAC IN_INTERIOR_CLOSURE_CONVEX_SEGMENT THEN
6189       ASM_REWRITE_TAC[CONVEX_CBALL; INTERIOR_CBALL; IN_BALL] THEN
6190       MATCH_MP_TAC(REWRITE_RULE[SUBSET] CLOSURE_SUBSET) THEN
6191       REWRITE_TAC[IN_CBALL;
6192                   NORM_ARITH `dist(a:complex,a - e) = norm e`;
6193                   NORM_ARITH `dist(a:complex,a + e) = norm e`] THEN
6194       ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6195       ASM_REAL_ARITH_TAC;
6196       REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `c:complex` THEN
6197       REWRITE_TAC[IN_INTER; ENDS_IN_SEGMENT; IN_UNION] THEN
6198       FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6199        `c IN s ==> s = t ==> c IN t`)) THEN
6200       ASM_SIMP_TAC[PATH_IMAGE_JOIN; PATHSTART_LINEPATH] THEN
6201       REWRITE_TAC[UNION_COMM; PATH_IMAGE_LINEPATH; SEGMENT_SYM];
6202       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [GSYM
6203         INSIDE_OF_TRIANGLE]) THEN
6204       REWRITE_TAC[UNION_ACI; SEGMENT_SYM];
6205       ASM_SIMP_TAC[REVERSEPATH_JOINPATHS; PATHSTART_JOIN; PATHFINISH_JOIN;
6206            PATHSTART_LINEPATH; PATHFINISH_LINEPATH; REVERSEPATH_LINEPATH] THEN
6207       RULE_ASSUM_TAC(REWRITE_RULE
6208         [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
6209       ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_JOIN; PATH_LINEPATH;
6210           PATH_IMAGE_JOIN; IN_UNION; PATHSTART_JOIN; PATHFINISH_JOIN;
6211           PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
6212       CONV_TAC COMPLEX_RING;
6213       DISCH_THEN SUBST_ALL_TAC THEN
6214       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE LAND_CONV [COMPLEX_NORM_CX]) THEN
6215       REAL_ARITH_TAC]) in
6216   let lemma2 = prove
6217    (`!p a d e.
6218           &0 < d /\ &0 < e /\
6219           simple_path(p ++ linepath(a - d % basis 1,a + e % basis 1)) /\
6220           pathstart p = a + e % basis 1 /\ pathfinish p = a - d % basis 1
6221           ==> ?z. z IN inside(path_image
6222                          (p ++ linepath(a - d % basis 1,a + e % basis 1))) /\
6223                   norm(winding_number
6224                    (p ++ linepath(a - d % basis 1,a + e % basis 1),z)) = &1`,
6225     REPEAT STRIP_TAC THEN
6226     MP_TAC(ISPECL
6227      [`p:real^1->complex`; `linepath(a - d % basis 1,a + e % basis 1)`]
6228      SIMPLE_PATH_JOIN_LOOP_EQ) THEN
6229     ASM_REWRITE_TAC[PATHFINISH_LINEPATH; PATHSTART_LINEPATH] THEN
6230     REWRITE_TAC[ARC_LINEPATH_EQ; PATH_IMAGE_LINEPATH] THEN STRIP_TAC THEN
6231     SUBGOAL_THEN `~((a:complex) IN path_image p)` ASSUME_TAC THENL
6232      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6233        `p INTER s SUBSET {d,e}
6234         ==> a IN s /\ ~(d = a) /\ ~(e = a) ==> ~(a IN p)`)) THEN
6235       REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6236       REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6237         NORM_ARITH `dist(a - d:complex,a) + dist(a,a + e) = norm(d) + norm(e)`;
6238         VECTOR_ARITH `a + e:complex = a <=> e = vec 0`;
6239         VECTOR_ARITH `a - d:complex = a <=> d = vec 0`] THEN
6240       SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; NORM_MUL; VECTOR_MUL_EQ_0] THEN
6241       ASM_SIMP_TAC[BASIS_NONZERO; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6242       ASM_REAL_ARITH_TAC;
6243       ALL_TAC] THEN
6244     MP_TAC(ISPEC `(:complex) DIFF path_image p` OPEN_CONTAINS_BALL) THEN
6245     ASM_SIMP_TAC[GSYM closed; CLOSED_ARC_IMAGE; IN_UNIV; IN_DIFF] THEN
6246     DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[] THEN
6247     REWRITE_TAC[SET_RULE `s SUBSET UNIV DIFF t <=> s INTER t = {}`] THEN
6248     DISCH_THEN(X_CHOOSE_THEN `k:real` STRIP_ASSUME_TAC) THEN
6249     ABBREV_TAC `kde:real = min k (min d e) / &2` THEN
6250     SUBGOAL_THEN `&0 < kde /\ kde < k /\ kde < d /\ kde < e`
6251     STRIP_ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
6252     MP_TAC(ISPECL
6253      [`linepath(a + kde % basis 1,a + e % basis 1) ++ p ++
6254        linepath(a - d % basis 1,a - kde % basis 1)`;
6255       `a:complex`; `kde:real`] lemma1) THEN
6256     ASM_SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_JOIN;
6257       PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH;
6258       SIMPLE_PATH_JOIN_LOOP_EQ] THEN
6259     ANTS_TAC THENL
6260      [REPEAT CONJ_TAC THENL
6261        [MATCH_MP_TAC ARC_JOIN THEN
6262         ASM_SIMP_TAC[ARC_JOIN_EQ; PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
6263                      PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_LINEPATH;
6264                      ARC_LINEPATH_EQ; PATH_IMAGE_JOIN] THEN
6265         REWRITE_TAC[VECTOR_ARITH `a + e:complex = a + d <=> e - d = vec 0`;
6266                   VECTOR_ARITH `a - d:complex = a - e <=> e - d = vec 0`] THEN
6267         REWRITE_TAC[GSYM VECTOR_SUB_RDISTRIB; VECTOR_MUL_EQ_0; REAL_SUB_0] THEN
6268         ASM_SIMP_TAC[BASIS_NONZERO; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6269         ASM_SIMP_TAC[REAL_LT_IMP_NE] THEN
6270         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6271          `p INTER de SUBSET {e,d}
6272           ==> dk SUBSET de /\ ke SUBSET de /\ ~(e IN dk) /\ ~(d IN ke) /\
6273               ke INTER dk = {}
6274           ==> p INTER dk SUBSET {d} /\ ke INTER (p UNION dk) SUBSET {e}`)) THEN
6275         REWRITE_TAC[SUBSET_SEGMENT; ENDS_IN_SEGMENT] THEN
6276         REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6277         REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e) /\
6278                                 dist(a + d,a - e) = norm(d + e) /\
6279                                 dist(a - d,a - e) = norm(d - e) /\
6280                                 dist(a + d,a + e) = norm(d - e)`] THEN
6281         REWRITE_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB] THEN
6282         ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6283         REPEAT(CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC]) THEN
6284         REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_INTER; NOT_IN_EMPTY] THEN
6285         MATCH_MP_TAC(MESON[REAL_LT_ANTISYM]
6286          `!a:complex. (!x. x IN t ==> x$1 < a$1) /\ (!x. x IN s ==> a$1 < x$1)
6287                       ==> !x. ~(x IN s /\ x IN t)`) THEN
6288         EXISTS_TAC `a:complex` THEN
6289         SIMP_TAC[IN_SEGMENT; LEFT_IMP_EXISTS_THM] THEN
6290         SIMP_TAC[VECTOR_SUB_COMPONENT; VECTOR_ADD_COMPONENT;
6291                  VECTOR_MUL_COMPONENT; BASIS_COMPONENT; DIMINDEX_2; ARITH] THEN
6292         REWRITE_TAC[REAL_ARITH
6293          `(a < (&1 - u) * (a + x) + u * (a + y) <=>
6294            &0 < (&1 - u) * x + u * y) /\
6295           ((&1 - u) * (a - x) + u * (a - y) < a <=>
6296            &0 < (&1 - u) * x + u * y)`] THEN
6297         REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_MUL_RID] THEN
6298         REWRITE_TAC[REAL_ARITH `&0 < (&1 - u) * x + u * y <=>
6299                                 (&1 - u) * --x + u * --y < &0`] THEN
6300         MATCH_MP_TAC REAL_CONVEX_BOUND_LT THEN ASM_REAL_ARITH_TAC;
6301         REWRITE_TAC[ARC_LINEPATH_EQ; VECTOR_MUL_EQ_0;
6302                     VECTOR_ARITH `a - k:complex = a + k <=> k = vec 0`] THEN
6303         ASM_SIMP_TAC[REAL_LT_IMP_NZ; BASIS_NONZERO; DIMINDEX_2; ARITH];
6304         MATCH_MP_TAC(SET_RULE
6305           `kk INTER p = {} /\ kk INTER ke = {kp} /\ dk INTER kk = {kn}
6306            ==> (ke UNION p UNION dk) INTER kk SUBSET {kp,kn}`) THEN
6307         CONJ_TAC THENL
6308          [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6309            `b INTER p = {} ==> s SUBSET b ==> s INTER p = {}`)) THEN
6310           SIMP_TAC[SUBSET; IN_SEGMENT; IN_BALL; LEFT_IMP_EXISTS_THM] THEN
6311           REWRITE_TAC[VECTOR_ARITH
6312             `(&1 - u) % (a - d) + u % (a + d):complex = a - (&1 - &2 * u) % d`;
6313            NORM_ARITH `dist(a:complex,a - d) = norm d`] THEN
6314           REPEAT STRIP_TAC THEN
6315           SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6316           MATCH_MP_TAC(REAL_ARITH
6317            `&0 < kd /\ a * kd <= &1 * kd /\ kd < k
6318             ==> a * abs kd * &1 < k`) THEN
6319           ASM_SIMP_TAC[REAL_LE_RMUL_EQ] THEN ASM_REAL_ARITH_TAC;
6320           CONJ_TAC THEN MATCH_MP_TAC INTER_SEGMENT THEN DISJ1_TAC THEN
6321           REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6322           REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e) /\
6323                                   dist(a + d,a - e) = norm(d + e) /\
6324                                   dist(a - d,a - e) = norm(d - e) /\
6325                                   dist(a + d,a + e) = norm(d - e)`] THEN
6326           REWRITE_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB] THEN
6327           ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6328           ASM_REAL_ARITH_TAC];
6329         REWRITE_TAC[UNION_OVER_INTER; EMPTY_UNION] THEN
6330         ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN CONJ_TAC THENL
6331          [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6332            `b INTER p = {} ==> c SUBSET b ==> c INTER p = {}`)) THEN
6333           MATCH_MP_TAC SUBSET_BALL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE];
6334           ALL_TAC] THEN
6335         REWRITE_TAC[SET_RULE `s INTER t = {} <=>
6336                               !x. x IN t ==> ~(x IN s)`] THEN
6337         SIMP_TAC[IN_SEGMENT; LEFT_IMP_EXISTS_THM; IN_BALL] THEN
6338         REWRITE_TAC[VECTOR_ARITH
6339         `(&1 - u) % (a - d) + u % (a - e):complex =
6340          a - ((&1 - u) % d + u % e) /\
6341          (&1 - u) % (a + d) + u % (a + e):complex =
6342          a + ((&1 - u) % d + u % e)`;
6343         NORM_ARITH
6344          `dist(a:complex,a + d) = norm d /\ dist(a,a - e) = norm e`] THEN
6345         REWRITE_TAC[VECTOR_MUL_ASSOC; GSYM VECTOR_ADD_RDISTRIB] THEN
6346         SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6347         REWRITE_TAC[REAL_NOT_LT; REAL_MUL_RID] THEN REPEAT STRIP_TAC THEN
6348         MATCH_MP_TAC(REAL_ARITH `x <= y ==> x <= abs y`) THEN
6349         REWRITE_TAC[REAL_ARITH
6350          `(k <= (&1 - u) * k + u * e <=> &0 <= u * (e - k)) /\
6351           (k <= (&1 - u) * d + u * k <=> &0 <= (&1 - u) * (d - k))`] THEN
6352         MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC];
6353       ALL_TAC] THEN
6354     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN
6355     MATCH_MP_TAC(TAUT
6356      `(p <=> p') /\ (p /\ p' ==> (q <=> q')) ==> p /\ q ==> p' /\ q'`) THEN
6357     CONJ_TAC THENL
6358      [AP_TERM_TAC THEN AP_TERM_TAC THEN
6359       ONCE_REWRITE_TAC[SET_RULE
6360        `(c UNION p UNION a) UNION b = p UNION (a UNION b UNION c)`] THEN
6361       AP_TERM_TAC THEN
6362       W(MP_TAC o PART_MATCH (lhand o rand) UNION_SEGMENT o
6363          rand o lhand o snd) THEN
6364       REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between;
6365                   NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6366                   NORM_ARITH `dist(a + d:complex,a + e) = norm(d - e)`] THEN
6367       ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB;
6368                    NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6369       ANTS_TAC THENL [ASM_REAL_ARITH_TAC; DISCH_THEN SUBST1_TAC] THEN
6370       MATCH_MP_TAC UNION_SEGMENT THEN
6371       REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between;
6372                   NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6373                   NORM_ARITH `dist(a - d:complex,a - e) = norm(d - e)`] THEN
6374       ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB;
6375                    NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6376       ASM_REAL_ARITH_TAC;
6377       ALL_TAC] THEN
6378     DISCH_THEN(CONJUNCTS_THEN (MP_TAC o MATCH_MP
6379      (MESON[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]
6380        `z IN inside s ==> ~(z IN s)`))) THEN
6381     REWRITE_TAC[IN_UNION; DE_MORGAN_THM] THEN REPEAT STRIP_TAC THEN
6382     AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
6383     ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_JOIN; ARC_IMP_PATH; PATH_LINEPATH;
6384       PATH_IMAGE_JOIN; IN_UNION; PATH_IMAGE_LINEPATH; PATHSTART_JOIN;
6385       PATHFINISH_JOIN; PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
6386     MATCH_MP_TAC(COMPLEX_RING
6387      `d + k + e:complex = z ==> (e + p + d) + k = p + z`) THEN
6388     MATCH_MP_TAC EQ_TRANS THEN
6389     EXISTS_TAC
6390      `winding_number(linepath (a - d % basis 1:complex,a - kde % basis 1),z) +
6391       winding_number(linepath (a - kde % basis 1,a + e % basis 1),z)` THEN
6392     CONJ_TAC THENL [AP_TERM_TAC; ALL_TAC] THEN CONV_TAC SYM_CONV THEN
6393     MATCH_MP_TAC WINDING_NUMBER_SPLIT_LINEPATH THEN
6394     ASM_REWRITE_TAC[] THENL
6395      [CONJ_TAC THENL
6396        [ALL_TAC;
6397         SUBGOAL_THEN
6398          `~(z IN segment[a - kde % basis 1:complex,a + kde % basis 1]) /\
6399           ~(z IN segment[a + kde % basis 1,a + e % basis 1])`
6400         MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
6401         MATCH_MP_TAC(SET_RULE
6402          `s UNION t = u ==> ~(z IN s) /\ ~(z IN t) ==> ~(z IN u)`) THEN
6403         MATCH_MP_TAC UNION_SEGMENT];
6404       ALL_TAC] THEN
6405     REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6406     REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6407                 NORM_ARITH `dist(a - d:complex,a - e) = norm(d - e)`;
6408                 NORM_ARITH `dist(a + d:complex,a + e) = norm(d - e)`] THEN
6409     ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB; NORM_MUL;
6410                    NORM_BASIS; DIMINDEX_2; ARITH] THEN
6411     ASM_REAL_ARITH_TAC) in
6412   let lemma3 = prove
6413    (`!p:real^1->complex.
6414           simple_path p /\ pathfinish p = pathstart p
6415           ==> ?z. z IN inside(path_image p) /\ norm(winding_number(p,z)) = &1`,
6416     GEN_TAC THEN STRIP_TAC THEN
6417     MP_TAC(ISPEC `p:real^1->complex` JORDAN_INSIDE_OUTSIDE) THEN
6418     ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
6419     UNDISCH_TAC `~(inside(path_image p):complex->bool = {})` THEN
6420     REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN
6421     DISCH_THEN(X_CHOOSE_TAC `a:complex`) THEN
6422     MP_TAC(ISPECL [`inside(path_image p):complex->bool`;
6423                    `a:complex`; `basis 1:complex`]
6424           RAY_TO_FRONTIER) THEN
6425     MP_TAC(ISPECL [`inside(path_image p):complex->bool`;
6426                    `a:complex`; `--basis 1:complex`]
6427           RAY_TO_FRONTIER) THEN
6428     ASM_SIMP_TAC[INTERIOR_OPEN; VECTOR_NEG_EQ_0; BASIS_NONZERO;
6429                  DIMINDEX_2; ARITH] THEN
6430     REWRITE_TAC[VECTOR_ARITH `a + d % --b:complex = a - d % b`] THEN
6431     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
6432     DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
6433     SUBGOAL_THEN
6434      `?t. t IN interval[vec 0,vec 1] /\
6435           (p:real^1->complex) t = a - d % basis 1`
6436     STRIP_ASSUME_TAC THENL
6437      [RULE_ASSUM_TAC(REWRITE_RULE[path_image; IN_IMAGE]) THEN
6438       ASM_MESON_TAC[];
6439       ALL_TAC] THEN
6440     SUBGOAL_THEN
6441      `?q. simple_path q /\
6442           pathstart q:complex = a - d % basis 1 /\
6443           pathfinish q = a - d % basis 1 /\
6444           path_image q = path_image p /\
6445           (!z. z IN inside(path_image p)
6446                ==> winding_number(q,z) = winding_number(p,z))`
6447     MP_TAC THENL
6448      [EXISTS_TAC `shiftpath t (p:real^1->complex)` THEN
6449       FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6450       ASM_SIMP_TAC[PATHSTART_SHIFTPATH; PATHFINISH_SHIFTPATH; DROP_VEC;
6451                    SIMPLE_PATH_SHIFTPATH; PATH_IMAGE_SHIFTPATH] THEN
6452       REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_SHIFTPATH THEN
6453       ASM_SIMP_TAC[SIMPLE_PATH_IMP_PATH] THEN
6454       ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6455       DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` MP_TAC) THEN
6456       REPLICATE_TAC 3 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
6457       REWRITE_TAC[IMP_CONJ] THEN DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
6458       SUBGOAL_THEN
6459        `?z. z IN inside(path_image q) /\ norm(winding_number(q,z)) = &1`
6460        (fun th -> MESON_TAC[th]) THEN
6461       POP_ASSUM_LIST(MP_TAC o end_itlist CONJ o rev o
6462           filter (fun tm -> not(free_in `t:real^1` (concl tm) or
6463                                 free_in `p:real^1->complex` (concl tm)))) THEN
6464       STRIP_TAC] THEN
6465     SUBGOAL_THEN
6466      `?t. t IN interval[vec 0,vec 1] /\
6467           (q:real^1->complex) t = a + e % basis 1`
6468     STRIP_ASSUME_TAC THENL
6469      [RULE_ASSUM_TAC(REWRITE_RULE[path_image; IN_IMAGE]) THEN
6470       ASM_MESON_TAC[];
6471       ALL_TAC] THEN
6472     SUBGOAL_THEN `~(a - d % basis 1:complex = a + e % basis 1)`
6473     ASSUME_TAC THENL
6474      [REWRITE_TAC[VECTOR_ARITH
6475        `a - d % l:complex = a + e % l <=> (e + d) % l = vec 0`] THEN
6476       SIMP_TAC[VECTOR_MUL_EQ_0; BASIS_NONZERO; DIMINDEX_2; ARITH] THEN
6477       ASM_REAL_ARITH_TAC;
6478       ALL_TAC] THEN
6479     SUBGOAL_THEN
6480       `path_image q INTER segment[a - d % basis 1,a + e % basis 1] =
6481        {a - d % basis 1:complex,a + e % basis 1}`
6482     ASSUME_TAC THENL
6483      [REWRITE_TAC[SEGMENT_CLOSED_OPEN] THEN
6484       MATCH_MP_TAC(SET_RULE
6485        `a IN p /\ b IN p /\ p INTER s = {}
6486         ==> p INTER (s UNION {a,b}) = {a,b}`) THEN
6487       CONJ_TAC THENL [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE]; ALL_TAC] THEN
6488       CONJ_TAC THENL [ASM_MESON_TAC[path_image; IN_IMAGE]; ALL_TAC] THEN
6489       ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6490                    ENDS_IN_UNIT_INTERVAL] THEN
6491       REWRITE_TAC[SET_RULE `s INTER t = {} <=> !x. x IN t ==> ~(x IN s)`] THEN
6492       REWRITE_TAC[IN_SEGMENT; VECTOR_ARITH
6493        `(&1 - u) % (a - d % l) + u % (a + e % l):complex =
6494          a + (u * e - (&1 - u) * d) % l`] THEN
6495       X_GEN_TAC `y:complex` THEN
6496       DISCH_THEN(X_CHOOSE_THEN `k:real` STRIP_ASSUME_TAC o CONJUNCT2) THEN
6497       ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(MESON
6498        [INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]
6499        `x IN inside s ==> ~(x IN s)`) THEN
6500       ASM_CASES_TAC `&0 <= k * e - (&1 - k) * d` THENL
6501        [ALL_TAC;
6502         ONCE_REWRITE_TAC[VECTOR_ARITH
6503          `a + (s - t) % l:complex = a - (t - s) % l`]] THEN
6504       FIRST_X_ASSUM MATCH_MP_TAC THEN
6505       ASM_SIMP_TAC[REAL_ARITH `~(&0 <= a - b) ==> &0 <= b - a`] THEN
6506       REWRITE_TAC[REAL_ARITH `k * e - (&1 - k) * d < e <=>
6507                               &0 < (&1 - k) * (d + e)`] THEN
6508       REWRITE_TAC[REAL_ARITH `(&1 - k) * d - k * e < d <=>
6509                               &0 < k * (d + e)`] THEN
6510       MATCH_MP_TAC REAL_LT_MUL THEN ASM_REAL_ARITH_TAC;
6511       ALL_TAC] THEN
6512     MP_TAC(ISPECL
6513      [`subpath t (vec 0) (q:real^1->complex)`;
6514       `a:complex`; `d:real`; `e:real`] lemma2) THEN
6515     ASM_SIMP_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH;
6516                  PATH_IMAGE_JOIN; PATHSTART_LINEPATH] THEN
6517     ANTS_TAC THENL
6518      [CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[pathstart]] THEN
6519       MATCH_MP_TAC SIMPLE_PATH_JOIN_LOOP THEN
6520       ASM_REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH;
6521                       PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
6522       ASM_REWRITE_TAC[ARC_LINEPATH_EQ] THEN REPEAT CONJ_TAC THENL
6523        [MATCH_MP_TAC ARC_SIMPLE_PATH_SUBPATH THEN
6524         RULE_ASSUM_TAC(REWRITE_RULE[pathstart]) THEN
6525         ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL];
6526         RULE_ASSUM_TAC(REWRITE_RULE[pathstart]) THEN ASM_REWRITE_TAC[];
6527         REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
6528         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6529          `p INTER s = {a,b} ==> p' SUBSET p ==> p' INTER s SUBSET {b,a}`)) THEN
6530         ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6531                      ENDS_IN_UNIT_INTERVAL]];
6532       DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC)] THEN
6533     MP_TAC(ISPECL
6534      [`subpath (vec 0) t (q:real^1->complex)`;
6535       `subpath (vec 1) t (q:real^1->complex)`;
6536       `linepath(a - d % basis 1:complex,a + e % basis 1)`;
6537       `a - d % basis 1:complex`; `a + e % basis 1:complex`;
6538       `z:complex`;
6539       `--winding_number
6540           (subpath t (vec 0) q ++
6541            linepath (a - d % basis 1,a + e % basis 1),z)`]
6542       WINDING_NUMBER_FROM_INNERPATH) THEN
6543     ASM_REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH;
6544                     PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
6545     REWRITE_TAC[REVERSEPATH_SUBPATH; REVERSEPATH_LINEPATH] THEN
6546     SUBGOAL_THEN
6547      `path_image (subpath (vec 0) t q) UNION
6548       path_image (subpath (vec 1) t q) :complex->bool =
6549       path_image q`
6550     SUBST1_TAC THENL
6551      [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6552       SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN
6553       ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6554       REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
6555       SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6556       REWRITE_TAC[GSYM IMAGE_UNION; PATH_IMAGE_REVERSEPATH] THEN
6557       SUBGOAL_THEN `interval[vec 0:real^1,t] UNION interval[t,vec 1] =
6558                     interval[vec 0,vec 1]`
6559         (fun th -> ASM_REWRITE_TAC[th; GSYM path_image]) THEN
6560       REWRITE_TAC[EXTENSION; IN_UNION; IN_INTERVAL_1; DROP_VEC] THEN
6561       ASM_REAL_ARITH_TAC;
6562       ALL_TAC] THEN
6563     ANTS_TAC THENL
6564      [RULE_ASSUM_TAC(REWRITE_RULE[pathstart; pathfinish]) THEN
6565       REPLICATE_TAC 2 (ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
6566        [MATCH_MP_TAC SIMPLE_PATH_SUBPATH THEN
6567         ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL] THEN ASM_MESON_TAC[];
6568         ALL_TAC]) THEN
6569       ASM_REWRITE_TAC[SIMPLE_PATH_LINEPATH_EQ; PATH_IMAGE_LINEPATH] THEN
6570       REPEAT CONJ_TAC THENL
6571        [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6572         SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN
6573         ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6574         REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
6575         SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6576         MATCH_MP_TAC(SET_RULE
6577           `a IN s /\ a IN t /\ b IN s /\ b IN t /\
6578            (!x. x IN s ==> !y. y IN t ==> x = y ==> x = a \/ x = b)
6579            ==> s INTER t = {a,b}`) THEN
6580         REPEAT CONJ_TAC THENL
6581          [REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `vec 0:real^1` THEN
6582           ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6583           ASM_REAL_ARITH_TAC;
6584           REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `vec 1:real^1` THEN
6585           ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6586           ASM_REAL_ARITH_TAC;
6587           REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `t:real^1` THEN
6588           ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6589           ASM_REAL_ARITH_TAC;
6590           REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `t:real^1` THEN
6591           ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6592           ASM_REAL_ARITH_TAC;
6593           ALL_TAC] THEN
6594         REWRITE_TAC[FORALL_IN_IMAGE; IN_INTERVAL_1; DROP_VEC] THEN
6595         X_GEN_TAC `s:real^1` THEN STRIP_TAC THEN
6596         X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN DISCH_TAC THEN
6597         FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [simple_path]) THEN
6598         DISCH_THEN(MP_TAC o SPECL [`s:real^1`; `u:real^1`] o CONJUNCT2) THEN
6599         ASM_REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN
6600         ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
6601         DISCH_THEN(REPEAT_TCL DISJ_CASES_THEN
6602           (REPEAT_TCL CONJUNCTS_THEN SUBST_ALL_TAC)) THEN
6603         ASM_REWRITE_TAC[] THEN SUBGOAL_THEN `drop u = drop t` MP_TAC THENL
6604          [ASM_REAL_ARITH_TAC; ASM_MESON_TAC[DROP_EQ]];
6605         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6606          `p INTER s = {a,b}
6607           ==> a IN q /\ b IN q /\ q SUBSET p ==> q INTER s = {a,b}`)) THEN
6608         ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6609                      ENDS_IN_UNIT_INTERVAL] THEN
6610         FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6611         SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6612         REWRITE_TAC[IN_IMAGE] THEN CONJ_TAC THENL
6613          [EXISTS_TAC `vec 0:real^1`; EXISTS_TAC `t:real^1`] THEN
6614         ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6615         ASM_REAL_ARITH_TAC;
6616         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6617          `p INTER s = {a,b}
6618           ==> a IN q /\ b IN q /\ q SUBSET p ==> q INTER s = {a,b}`)) THEN
6619         ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6620                      ENDS_IN_UNIT_INTERVAL] THEN
6621         ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6622         REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
6623         FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6624         SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6625         REWRITE_TAC[IN_IMAGE] THEN CONJ_TAC THENL
6626          [EXISTS_TAC `vec 1:real^1`; EXISTS_TAC `t:real^1`] THEN
6627         ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6628         ASM_REAL_ARITH_TAC;
6629         REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_INTER] THEN
6630         EXISTS_TAC `a:complex` THEN
6631         ASM_REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6632         REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6633               NORM_ARITH `dist(a - d:complex,a) = norm(d)`;
6634               NORM_ARITH `dist(a:complex,a + e) = norm e`] THEN
6635         ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; NORM_MUL;
6636                  NORM_BASIS; DIMINDEX_2; ARITH] THEN
6637         ASM_REAL_ARITH_TAC;
6638         ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6639         RULE_ASSUM_TAC(REWRITE_RULE[PATH_IMAGE_LINEPATH]) THEN
6640         ASM_REWRITE_TAC[REVERSEPATH_SUBPATH];
6641         W(MP_TAC o PART_MATCH (rand o rand) WINDING_NUMBER_REVERSEPATH o
6642           rand o snd) THEN
6643         ANTS_TAC THENL
6644          [ASM_SIMP_TAC[PATH_JOIN_EQ; PATH_IMAGE_JOIN; PATH_LINEPATH;
6645             SIMPLE_PATH_IMP_PATH; PATHSTART_LINEPATH; PATHFINISH_SUBPATH;
6646             PATH_SUBPATH; ENDS_IN_UNIT_INTERVAL] THEN
6647           ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6648           DISCH_THEN(SUBST1_TAC o SYM) THEN
6649           ASM_SIMP_TAC[REVERSEPATH_JOINPATHS; REVERSEPATH_LINEPATH;
6650                        REVERSEPATH_SUBPATH; PATHFINISH_SUBPATH;
6651                        PATHSTART_LINEPATH] THEN
6652           MATCH_MP_TAC(MESON[COMPLEX_ADD_SYM]
6653            `winding_number(g ++ h,z) =
6654             winding_number(g,z) + winding_number(h,z) /\
6655             winding_number(h ++ g,z) =
6656             winding_number(h,z) + winding_number(g,z)
6657             ==> winding_number(g ++ h,z) =winding_number(h ++ g,z)`) THEN
6658           CONJ_TAC THEN MATCH_MP_TAC WINDING_NUMBER_JOIN THEN
6659           ASM_SIMP_TAC[PATH_LINEPATH; PATH_SUBPATH; PATH_SUBPATH;
6660                        SIMPLE_PATH_IMP_PATH; ENDS_IN_UNIT_INTERVAL;
6661                        PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
6662                        PATHSTART_SUBPATH; PATHFINISH_SUBPATH]
6663           THENL [ALL_TAC; ONCE_REWRITE_TAC[CONJ_SYM]] THEN
6664           REWRITE_TAC[SET_RULE
6665            `~(z IN s) /\ ~(z IN t) <=> ~(z IN s UNION t)`] THEN
6666           ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6667           REWRITE_TAC[REVERSEPATH_LINEPATH; REVERSEPATH_SUBPATH] THEN
6668           ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]];
6669         REWRITE_TAC[COMPLEX_NEG_EQ_0] THEN DISCH_THEN SUBST_ALL_TAC THEN
6670         RULE_ASSUM_TAC(REWRITE_RULE
6671          [COMPLEX_NORM_CX; REAL_OF_NUM_EQ; REAL_ABS_NUM; ARITH]) THEN
6672         FIRST_X_ASSUM CONTR_TAC];
6673       DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6674       ONCE_REWRITE_TAC[COMPLEX_RING `a:complex = --b <=> --a = b`] THEN
6675       DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
6676       RULE_ASSUM_TAC(REWRITE_RULE[NORM_NEG])] THEN
6677     EXISTS_TAC `z:complex` THEN ASM_REWRITE_TAC[] THEN
6678     SUBGOAL_THEN
6679      `winding_number(subpath (vec 0) t q ++ subpath t (vec 1) q,z) =
6680       winding_number(subpath (vec 0) (vec 1) q,z)`
6681      (fun th -> ASM_MESON_TAC[th; SUBPATH_TRIVIAL]) THEN
6682     MATCH_MP_TAC EQ_TRANS THEN
6683     EXISTS_TAC `winding_number(subpath (vec 0) t q,z) +
6684                 winding_number(subpath t (vec 1) q,z)` THEN
6685     CONJ_TAC THENL
6686      [MATCH_MP_TAC WINDING_NUMBER_JOIN THEN
6687       ASM_SIMP_TAC[PATH_SUBPATH; ENDS_IN_UNIT_INTERVAL; SIMPLE_PATH_IMP_PATH;
6688                    PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
6689       SUBGOAL_THEN `~((z:complex) IN path_image q)` MP_TAC THENL
6690        [ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6691         MATCH_MP_TAC(SET_RULE
6692           `s1 SUBSET s /\ s2 SUBSET s
6693            ==> ~(z IN s) ==> ~(z IN s1) /\ ~(z IN s2)`) THEN
6694         ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; ENDS_IN_UNIT_INTERVAL;
6695                   SIMPLE_PATH_IMP_PATH]];
6696       MATCH_MP_TAC WINDING_NUMBER_SUBPATH_COMBINE THEN
6697       ASM_REWRITE_TAC[ENDS_IN_INTERVAL; GSYM IN_INTERVAL_1] THEN
6698       ASM_SIMP_TAC[UNIT_INTERVAL_NONEMPTY; SIMPLE_PATH_IMP_PATH] THEN
6699       ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]]) in
6700   GEN_TAC THEN DISCH_TAC THEN
6701   ASM_CASES_TAC `pathfinish g:complex = pathstart g` THENL
6702    [ALL_TAC; ASM_MESON_TAC[INSIDE_SIMPLE_CURVE_IMP_CLOSED]] THEN
6703   MATCH_MP_TAC(MESON[]
6704    `(?k. !z. z IN s ==> f z = k) /\
6705     (?z. z IN s /\ (f z = a \/ f z = b))
6706     ==> (!z. z IN s ==> f z = a) \/ (!z. z IN s ==> f z = b)`) THEN
6707   CONJ_TAC THENL
6708    [MATCH_MP_TAC WINDING_NUMBER_CONSTANT THEN
6709     ASM_SIMP_TAC[INSIDE_NO_OVERLAP; SIMPLE_PATH_IMP_PATH] THEN
6710     ASM_SIMP_TAC[JORDAN_INSIDE_OUTSIDE];
6711     MP_TAC(SPEC `g:real^1->complex` lemma3) THEN ASM_REWRITE_TAC[] THEN
6712     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN
6713     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
6714     MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
6715       INTEGER_WINDING_NUMBER) THEN
6716     ANTS_TAC THENL
6717      [ASM_SIMP_TAC[SIMPLE_PATH_IMP_PATH] THEN
6718       ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6719       SIMP_TAC[complex_integer; COMPLEX_EQ; IM_NEG; IM_CX] THEN
6720       SIMP_TAC[GSYM real; REAL_NORM; RE_NEG; RE_CX] THEN REAL_ARITH_TAC]]);;
6721
6722 let SIMPLE_CLOSED_PATH_ABS_WINDING_NUMBER_INSIDE = prove
6723  (`!g z. simple_path g /\ z IN inside(path_image g)
6724          ==> abs(Re(winding_number(g,z))) = &1`,
6725   REPEAT STRIP_TAC THEN FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP
6726     SIMPLE_CLOSED_PATH_WINDING_NUMBER_INSIDE) THEN
6727   ASM_SIMP_TAC[RE_NEG; RE_CX; REAL_ABS_NUM; REAL_ABS_NEG]);;
6728
6729 let SIMPLE_CLOSED_PATH_NORM_WINDING_NUMBER_INSIDE = prove
6730  (`!g z. simple_path g /\ z IN inside(path_image g)
6731          ==> norm(winding_number(g,z)) = &1`,
6732   REPEAT STRIP_TAC THEN
6733   SUBGOAL_THEN `pathfinish g:complex = pathstart g` ASSUME_TAC THENL
6734    [ASM_MESON_TAC[INSIDE_SIMPLE_CURVE_IMP_CLOSED]; ALL_TAC] THEN
6735   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
6736       INTEGER_WINDING_NUMBER) THEN
6737   ANTS_TAC THENL
6738    [ASM_SIMP_TAC[SIMPLE_PATH_IMP_PATH] THEN
6739     ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6740     ASM_SIMP_TAC[complex_integer; GSYM real; REAL_NORM;
6741                  SIMPLE_CLOSED_PATH_ABS_WINDING_NUMBER_INSIDE]]);;
6742
6743 let SIMPLE_CLOSED_PATH_WINDING_NUMBER_CASES = prove
6744  (`!g z. simple_path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g)
6745          ==> winding_number(g,z) IN {--Cx(&1),Cx(&0),Cx(&1)}`,
6746   REPEAT STRIP_TAC THEN
6747   MP_TAC(ISPEC `path_image g:complex->bool` INSIDE_UNION_OUTSIDE) THEN
6748   REWRITE_TAC[EXTENSION; IN_DIFF; IN_UNIV; IN_UNION] THEN
6749   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
6750   ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN STRIP_TAC THEN
6751   ASM_SIMP_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE; SIMPLE_PATH_IMP_PATH] THEN
6752   ASM_MESON_TAC[SIMPLE_CLOSED_PATH_WINDING_NUMBER_INSIDE]);;
6753
6754 let SIMPLE_CLOSED_PATH_WINDING_NUMBER_POS = prove
6755  (`!g z. simple_path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g) /\
6756          &0 < Re(winding_number(g,z))
6757          ==> winding_number(g,z) = Cx(&1)`,
6758   REPEAT STRIP_TAC THEN
6759   MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
6760       SIMPLE_CLOSED_PATH_WINDING_NUMBER_CASES) THEN
6761   ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
6762   STRIP_TAC THEN UNDISCH_TAC `&0 < Re(winding_number(g,z))` THEN
6763   ASM_REWRITE_TAC[RE_NEG; RE_CX] THEN REAL_ARITH_TAC);;
6764
6765 let SIMPLY_CONNECTED_IMP_WINDING_NUMBER_ZERO = prove
6766  (`!s g z. simply_connected s /\
6767            path g /\ path_image g SUBSET s /\
6768            pathfinish g = pathstart g /\ ~(z IN s)
6769            ==> winding_number(g,z) = Cx(&0)`,
6770   REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
6771   EXISTS_TAC `winding_number(linepath(pathstart g,pathstart g),z)` THEN
6772   CONJ_TAC THENL
6773    [MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
6774     MATCH_MP_TAC HOMOTOPIC_LOOPS_IMP_HOMOTOPIC_PATHS_NULL THEN
6775     EXISTS_TAC `pathstart(g:real^1->complex)` THEN
6776     MATCH_MP_TAC HOMOTOPIC_LOOPS_SUBSET THEN
6777     EXISTS_TAC `s:complex->bool` THEN
6778     CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
6779     FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [simply_connected]) THEN
6780     ASM_REWRITE_TAC[PATH_LINEPATH; PATHSTART_LINEPATH;
6781                     PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH; SEGMENT_REFL;
6782                     INSERT_SUBSET; EMPTY_SUBSET];
6783     MATCH_MP_TAC WINDING_NUMBER_TRIVIAL] THEN
6784   MP_TAC(ISPEC `g:real^1->complex` PATHSTART_IN_PATH_IMAGE) THEN
6785   ASM SET_TAC[]);;
6786
6787 let NO_BOUNDED_CONNECTED_COMPONENT_IMP_WINDING_NUMBER_ZERO = prove
6788  (`!s. ~(?z. ~(z IN s) /\ bounded(connected_component ((:complex) DIFF s) z))
6789        ==> !g z. path g /\ path_image g SUBSET s /\
6790                  pathfinish g = pathstart g /\ ~(z IN s)
6791                  ==> winding_number(g,z) = Cx(&0)`,
6792   REWRITE_TAC[NOT_EXISTS_THM] THEN REPEAT STRIP_TAC THEN
6793   MATCH_MP_TAC WINDING_NUMBER_ZERO_IN_OUTSIDE THEN
6794   ASM_REWRITE_TAC[outside; IN_ELIM_THM] THEN
6795   CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
6796   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
6797   ASM_REWRITE_TAC[CONTRAPOS_THM] THEN
6798   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] BOUNDED_SUBSET) THEN
6799   MATCH_MP_TAC CONNECTED_COMPONENT_MONO THEN ASM SET_TAC[]);;
6800
6801 let NO_BOUNDED_PATH_COMPONENT_IMP_WINDING_NUMBER_ZERO = prove
6802  (`!s. ~(?z. ~(z IN s) /\ bounded(path_component ((:complex) DIFF s) z))
6803        ==> !g z. path g /\ path_image g SUBSET s /\
6804                  pathfinish g = pathstart g /\ ~(z IN s)
6805                  ==> winding_number(g,z) = Cx(&0)`,
6806   GEN_TAC THEN DISCH_TAC THEN
6807   MATCH_MP_TAC NO_BOUNDED_CONNECTED_COMPONENT_IMP_WINDING_NUMBER_ZERO THEN
6808   ASM_MESON_TAC[PATH_COMPONENT_SUBSET_CONNECTED_COMPONENT; BOUNDED_SUBSET]);;
6809
6810 (* ------------------------------------------------------------------------- *)
6811 (* Partial circle path.                                                      *)
6812 (* ------------------------------------------------------------------------- *)
6813
6814 let partcirclepath = new_definition
6815  `partcirclepath(z,r,s,t) =
6816     \x. z + Cx(r) * cexp(ii * linepath(Cx(s),Cx(t)) x)`;;
6817
6818 let PATHSTART_PARTCIRCLEPATH = prove
6819  (`!r z s t. pathstart(partcirclepath(z,r,s,t)) =
6820                 z + Cx(r) * cexp(ii * Cx(s))`,
6821   REWRITE_TAC[pathstart; partcirclepath;
6822               REWRITE_RULE[pathstart] PATHSTART_LINEPATH]);;
6823
6824 let PATHFINISH_PARTCIRCLEPATH = prove
6825  (`!r z s t. pathfinish(partcirclepath(z,r,s,t)) =
6826                 z + Cx(r) * cexp(ii * Cx(t))`,
6827   REWRITE_TAC[pathfinish; partcirclepath;
6828               REWRITE_RULE[pathfinish] PATHFINISH_LINEPATH]);;
6829
6830 let HAS_VECTOR_DERIVATIVE_PARTCIRCLEPATH = prove
6831  (`!z r s t x.
6832         ((partcirclepath(z,r,s,t)) has_vector_derivative
6833          (ii * Cx(r) * (Cx t - Cx s) * cexp(ii * linepath(Cx(s),Cx(t)) x)))
6834         (at x)`,
6835   REWRITE_TAC[partcirclepath; linepath; COMPLEX_CMUL; CX_SUB] THEN
6836   REPEAT GEN_TAC THEN MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_REAL_COMPLEX THEN
6837   COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING);;
6838
6839 let VECTOR_DERIVATIVE_PARTCIRCLEPATH = prove
6840  (`!z r s t x.
6841         vector_derivative (partcirclepath(z,r,s,t)) (at x) =
6842         ii * Cx(r) * (Cx t - Cx s) * cexp(ii * linepath(Cx(s),Cx(t)) x)`,
6843   REPEAT GEN_TAC THEN MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
6844   REWRITE_TAC[HAS_VECTOR_DERIVATIVE_PARTCIRCLEPATH]);;
6845
6846 let VALID_PATH_PARTCIRCLEPATH = prove
6847  (`!z r s t. valid_path(partcirclepath(z,r,s,t))`,
6848   REPEAT GEN_TAC THEN REWRITE_TAC[valid_path] THEN
6849   MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
6850   REWRITE_TAC[differentiable_on] THEN X_GEN_TAC `x:real^1` THEN STRIP_TAC THEN
6851   MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
6852   REWRITE_TAC[VECTOR_DERIVATIVE_WORKS; VECTOR_DERIVATIVE_PARTCIRCLEPATH;
6853               HAS_VECTOR_DERIVATIVE_PARTCIRCLEPATH]);;
6854
6855 let PATH_PARTCIRCLEPATH = prove
6856  (`!z r s t. path(partcirclepath(z,r,s,t))`,
6857   SIMP_TAC[VALID_PATH_PARTCIRCLEPATH; VALID_PATH_IMP_PATH]);;
6858
6859 let PATH_IMAGE_PARTCIRCLEPATH = prove
6860  (`!z r s t.
6861         &0 <= r /\ s <= t
6862         ==> path_image(partcirclepath(z,r,s,t)) =
6863                 {z + Cx(r) * cexp(ii * Cx x) | s <= x /\ x <= t}`,
6864   REPEAT STRIP_TAC THEN REWRITE_TAC[path_image; partcirclepath] THEN
6865   REWRITE_TAC[EXTENSION; TAUT `(a <=> b) <=> (a ==> b) /\ (b ==> a)`] THEN
6866   REWRITE_TAC[FORALL_AND_THM; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
6867   CONJ_TAC THENL
6868    [X_GEN_TAC `x:real^1` THEN REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN
6869     DISCH_TAC THEN EXISTS_TAC `(&1 - drop x) * s + drop x * t` THEN
6870     REWRITE_TAC[linepath; CX_ADD; CX_SUB; COMPLEX_CMUL; CX_MUL] THEN
6871     REWRITE_TAC[REAL_ARITH `s <= (&1 - x) * s + x * t <=> &0 <= x * (t - s)`;
6872       REAL_ARITH `(&1 - x) * s + x * t <= t <=> &0 <= (&1 - x) * (t - s)`] THEN
6873     ASM_SIMP_TAC[REAL_LE_MUL; REAL_SUB_LE];
6874     ALL_TAC] THEN
6875   X_GEN_TAC `w:complex` THEN
6876   DISCH_THEN(X_CHOOSE_THEN `x:real` STRIP_ASSUME_TAC) THEN
6877   ASM_REWRITE_TAC[IN_IMAGE] THEN ASM_CASES_TAC `s:real < t` THENL
6878    [EXISTS_TAC `lift((x - s) / (t - s))` THEN
6879     ASM_SIMP_TAC[IN_INTERVAL_1; REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_SUB_LT;
6880                  LIFT_DROP; DROP_VEC; linepath; REAL_MUL_LZERO; REAL_MUL_LID;
6881                  REAL_SUB_LE; REAL_ARITH `x - s:real <= t - s <=> x <= t`] THEN
6882     AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
6883     REWRITE_TAC[COMPLEX_CMUL; CX_SUB; CX_DIV] THEN
6884     SUBGOAL_THEN `~(Cx(s) = Cx(t))` MP_TAC THENL
6885      [ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NE]; CONV_TAC COMPLEX_FIELD];
6886     UNDISCH_TAC `s:real <= t` THEN ASM_REWRITE_TAC[REAL_LE_LT] THEN
6887     DISCH_THEN SUBST_ALL_TAC THEN EXISTS_TAC `vec 0:real^1` THEN
6888     SIMP_TAC[IN_INTERVAL_1; DROP_VEC; linepath; VECTOR_MUL_LZERO;
6889              REAL_SUB_RZERO; VECTOR_MUL_LID; VECTOR_ADD_RID; REAL_POS] THEN
6890     AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
6891     REWRITE_TAC[CX_INJ] THEN ASM_REAL_ARITH_TAC]);;
6892
6893 let PATH_IMAGE_PARTCIRCLEPATH_SUBSET = prove
6894  (`!z r s t.
6895         &0 <= r /\ s <= t
6896         ==> path_image(partcirclepath(z,r,s,t)) SUBSET sphere(z,r)`,
6897   SIMP_TAC[PATH_IMAGE_PARTCIRCLEPATH] THEN
6898   SIMP_TAC[SUBSET; IN_ELIM_THM; IN_SPHERE; LEFT_IMP_EXISTS_THM] THEN
6899   REWRITE_TAC[NORM_ARITH `dist(z,z + a) = norm a`] THEN
6900   REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP; COMPLEX_NORM_CX;
6901               RE_MUL_II; IM_CX; REAL_NEG_0; REAL_EXP_0] THEN
6902   REAL_ARITH_TAC);;
6903
6904 let IN_PATH_IMAGE_PARTCIRCLEPATH = prove
6905  (`!z r s t w.
6906         &0 <= r /\ s <= t /\ w IN path_image(partcirclepath(z,r,s,t))
6907         ==> norm(w - z) = r`,
6908   MP_TAC PATH_IMAGE_PARTCIRCLEPATH_SUBSET THEN
6909   REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN
6910   REWRITE_TAC[SUBSET; IN_SPHERE; dist; NORM_SUB] THEN SET_TAC[]);;
6911
6912 let HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG = prove
6913  (`!f i z r s t B k.
6914         FINITE k /\
6915         (f has_path_integral i) (partcirclepath(z,r,s,t)) /\
6916         &0 <= B /\ &0 < r /\ s <= t /\
6917         (!x. x IN path_image(partcirclepath(z,r,s,t)) DIFF k
6918              ==> norm(f x) <= B)
6919         ==> norm(i) <= B * r * (t - s)`,
6920   let lemma1 = prove
6921    (`!b w. FINITE {z | norm(z) <= b /\ cexp(z) = w}`,
6922     REPEAT GEN_TAC THEN ASM_CASES_TAC `w = Cx(&0)` THEN
6923     ASM_REWRITE_TAC[CEXP_NZ; SET_RULE `{x | F} = {}`; FINITE_RULES] THEN
6924     FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP CEXP_CLOG) THEN
6925     REWRITE_TAC[CEXP_EQ] THEN
6926     REWRITE_TAC[SET_RULE
6927      `{z | P z /\ ?n. Q n /\ z = f n} = IMAGE f {n | Q n /\ P(f n)}`] THEN
6928     MATCH_MP_TAC FINITE_IMAGE THEN
6929     MATCH_MP_TAC FINITE_SUBSET THEN
6930     EXISTS_TAC `{n | integer n /\
6931                      norm(Cx (&2 * n * pi) * ii) <= b + norm(clog w)}` THEN
6932     CONJ_TAC THENL
6933      [ALL_TAC; SIMP_TAC[SUBSET; IN_ELIM_THM] THEN NORM_ARITH_TAC] THEN
6934     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
6935     REWRITE_TAC[REAL_MUL_RID; REAL_ABS_MUL; REAL_ABS_NUM; REAL_ABS_PI] THEN
6936     ASM_SIMP_TAC[REAL_MUL_ASSOC; GSYM REAL_LE_RDIV_EQ; PI_POS] THEN
6937     REWRITE_TAC[REAL_ARITH `&2 * x <= a <=> x <= a / &2`] THEN
6938     REWRITE_TAC[GSYM REAL_BOUNDS_LE; FINITE_INTSEG]) in
6939   let lemma2 = prove
6940    (`!a b. ~(a = Cx(&0)) ==> FINITE {z | norm(z) <= b /\ cexp(a * z) = w}`,
6941     REPEAT STRIP_TAC THEN MATCH_MP_TAC FINITE_SUBSET THEN
6942     EXISTS_TAC
6943      `IMAGE (\z. z / a) {z | norm(z) <= b * norm(a) /\ cexp(z) = w}` THEN
6944     SIMP_TAC[lemma1; FINITE_IMAGE] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
6945     REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN
6946     ASM_SIMP_TAC[COMPLEX_FIELD `~(a = Cx(&0)) ==> (x = y / a <=> a * x = y)`;
6947                  UNWIND_THM1; COMPLEX_NORM_MUL; REAL_LE_LMUL; NORM_POS_LE]) in
6948   REPEAT GEN_TAC THEN REWRITE_TAC[HAS_PATH_INTEGRAL] THEN STRIP_TAC THEN
6949   MP_TAC(ASSUME `s <= t`) THEN GEN_REWRITE_TAC LAND_CONV [REAL_LE_LT] THEN
6950   STRIP_TAC THENL
6951    [ALL_TAC;
6952     FIRST_X_ASSUM SUBST_ALL_TAC THEN
6953     REPEAT(POP_ASSUM MP_TAC) THEN
6954     REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH] THEN
6955     REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_LZERO; COMPLEX_MUL_RZERO] THEN
6956     SIMP_TAC[GSYM COMPLEX_VEC_0; HAS_INTEGRAL_0_EQ; NORM_0] THEN
6957     REAL_ARITH_TAC] THEN
6958   GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
6959   REWRITE_TAC[GSYM CONTENT_UNIT_1] THEN MATCH_MP_TAC HAS_INTEGRAL_BOUND THEN
6960   EXISTS_TAC `\x. if (partcirclepath(z,r,s,t) x) IN k then Cx(&0)
6961                   else f(partcirclepath(z,r,s,t) x) *
6962                        vector_derivative (partcirclepath(z,r,s,t)) (at x)` THEN
6963   ASM_SIMP_TAC[] THEN CONJ_TAC THENL
6964    [ASM_MESON_TAC[REAL_LE_MUL; REAL_POS; REAL_LT_IMP_LE; REAL_SUB_LE];
6965     ALL_TAC] THEN
6966   CONJ_TAC THENL
6967    [MATCH_MP_TAC HAS_INTEGRAL_SPIKE THEN
6968     EXISTS_TAC `\x. f(partcirclepath(z,r,s,t) x) *
6969                     vector_derivative (partcirclepath(z,r,s,t)) (at x)` THEN
6970     EXISTS_TAC `{x | x IN interval[vec 0,vec 1] /\
6971                      (partcirclepath(z,r,s,t) x) IN k}` THEN
6972     ASM_SIMP_TAC[IN_DIFF; IN_ELIM_THM; IMP_CONJ] THEN
6973     MATCH_MP_TAC NEGLIGIBLE_FINITE THEN
6974     MATCH_MP_TAC FINITE_FINITE_PREIMAGE_GENERAL THEN ASM_REWRITE_TAC[] THEN
6975     X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
6976     REWRITE_TAC[partcirclepath] THEN
6977     ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ; COMPLEX_FIELD
6978      `~(r = Cx(&0)) ==> (z + r * e = y <=> e = (y - z) / r)`] THEN
6979     REWRITE_TAC[linepath; COMPLEX_CMUL] THEN
6980     REWRITE_TAC[GSYM CX_MUL; GSYM CX_ADD] THEN
6981     REWRITE_TAC[REAL_ARITH `(&1 - t) * x + t * y = x + t * (y - x)`] THEN
6982     REWRITE_TAC[CX_ADD; COMPLEX_ADD_LDISTRIB; CEXP_ADD] THEN
6983     SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
6984      `~(e = Cx(&0)) ==> (e * x = y <=> x = y / e)`] THEN
6985     ABBREV_TAC `w = (y - z) / Cx r / cexp(ii * Cx s)` THEN
6986     REWRITE_TAC[CX_MUL; COMPLEX_RING
6987      `ii * Cx x * Cx(t - s) = (ii * Cx(t - s)) * Cx x`] THEN
6988     MATCH_MP_TAC FINITE_SUBSET THEN
6989     EXISTS_TAC
6990      `{x | Cx(drop x) IN
6991            {z | norm(z) <= &1 /\ cexp((ii * Cx(t - s)) * z) = w}}` THEN
6992     CONJ_TAC THENL
6993      [MATCH_MP_TAC FINITE_IMAGE_INJ THEN REWRITE_TAC[CX_INJ; DROP_EQ] THEN
6994       MATCH_MP_TAC lemma2 THEN
6995       REWRITE_TAC[COMPLEX_RING `ii * x = Cx(&0) <=> x = Cx(&0)`] THEN
6996       ASM_SIMP_TAC[CX_INJ; REAL_SUB_0; REAL_LT_IMP_NE];
6997       SIMP_TAC[SUBSET; IN_ELIM_THM; IN_INTERVAL_1; DROP_VEC] THEN
6998       SIMP_TAC[COMPLEX_NORM_CX] THEN REAL_ARITH_TAC];
6999     ALL_TAC] THEN
7000   X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
7001   COND_CASES_TAC THEN ASM_REWRITE_TAC[COMPLEX_NORM_0] THEN
7002   ASM_SIMP_TAC[REAL_LE_MUL; REAL_LT_IMP_LE; REAL_SUB_LE] THEN
7003   REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH] THEN
7004   REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
7005   REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_LID] THEN
7006   REWRITE_TAC[NORM_CEXP; RE_MUL_II; IM_LINEPATH_CX] THEN
7007   REWRITE_TAC[REAL_EXP_0; REAL_NEG_0; REAL_MUL_RID] THEN
7008   MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN CONJ_TAC THENL
7009    [FIRST_X_ASSUM MATCH_MP_TAC THEN
7010     REWRITE_TAC[path_image] THEN ASM SET_TAC[];
7011     ALL_TAC] THEN
7012   SIMP_TAC[REAL_LE_MUL; NORM_POS_LE; REAL_ABS_POS] THEN
7013   MATCH_MP_TAC REAL_LE_MUL2 THEN
7014   ASM_SIMP_TAC[NORM_POS_LE; GSYM CX_SUB; COMPLEX_NORM_CX] THEN
7015   ASM_REAL_ARITH_TAC);;
7016
7017 let HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH = prove
7018  (`!f i z r s t B.
7019         (f has_path_integral i) (partcirclepath(z,r,s,t)) /\
7020         &0 <= B /\ &0 < r /\ s <= t /\
7021         (!x. x IN path_image(partcirclepath(z,r,s,t))
7022              ==> norm(f x) <= B)
7023         ==> norm(i) <= B * r * (t - s)`,
7024   REPEAT STRIP_TAC THEN
7025   MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG THEN
7026   MAP_EVERY EXISTS_TAC
7027    [`f:complex->complex`; `z:complex`; `{}:complex->bool`] THEN
7028   ASM_REWRITE_TAC[FINITE_RULES; IN_DIFF; NOT_IN_EMPTY]);;
7029
7030 let PATH_INTEGRABLE_CONTINUOUS_PARTCIRCLEPATH = prove
7031  (`!f z r s t. f continuous_on path_image(partcirclepath(z,r,s,t))
7032                ==> f path_integrable_on (partcirclepath(z,r,s,t))`,
7033   REPEAT GEN_TAC THEN REWRITE_TAC[path_integrable_on; HAS_PATH_INTEGRAL] THEN
7034   REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH; GSYM integrable_on] THEN
7035   DISCH_TAC THEN MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
7036   MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC THENL
7037    [ONCE_REWRITE_TAC[GSYM o_DEF] THEN
7038     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
7039     ASM_REWRITE_TAC[GSYM path_image; ETA_AX] THEN
7040     MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON THEN
7041     ASM_REWRITE_TAC[GSYM valid_path; VALID_PATH_PARTCIRCLEPATH];
7042     ALL_TAC] THEN
7043   REWRITE_TAC[linepath] THEN
7044   REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
7045          REWRITE_TAC[CONTINUOUS_ON_CONST]) THEN
7046   ONCE_REWRITE_TAC[GSYM o_DEF] THEN
7047   MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
7048   REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
7049   REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
7050          REWRITE_TAC[CONTINUOUS_ON_CONST]) THEN
7051   REWRITE_TAC[VECTOR_ARITH `(&1 - x) % s + x % t = s + x % (t - s)`] THEN
7052   MATCH_MP_TAC CONTINUOUS_ON_ADD THEN REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
7053   MATCH_MP_TAC LINEAR_CONTINUOUS_ON THEN
7054   REWRITE_TAC[linear; DROP_ADD; DROP_CMUL; CX_ADD; COMPLEX_CMUL; CX_MUL;
7055               CX_SUB] THEN
7056   CONV_TAC COMPLEX_RING);;
7057
7058 let WINDING_NUMBER_PARTCIRCLEPATH_POS_LT = prove
7059  (`!r z s t w.
7060         s < t /\ norm(w - z) < r
7061         ==> &0 < Re(winding_number(partcirclepath(z,r,s,t),w))`,
7062   REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_POS_LT THEN
7063   EXISTS_TAC `r * (t - s) * (r - norm(w - z:complex))` THEN
7064   FIRST_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
7065    `n < r ==> &0 <= n ==> &0 < r`)) THEN
7066   REWRITE_TAC[NORM_POS_LE] THEN DISCH_TAC THEN
7067   ASM_SIMP_TAC[REAL_LT_MUL; REAL_SUB_LT; VALID_PATH_PARTCIRCLEPATH] THEN
7068   ASM_REWRITE_TAC[VALID_PATH_PARTCIRCLEPATH] THEN CONJ_TAC THENL
7069    [ASM_MESON_TAC[IN_PATH_IMAGE_PARTCIRCLEPATH; REAL_LT_IMP_LE; REAL_LT_REFL];
7070     ALL_TAC] THEN
7071   X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
7072   REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH] THEN
7073   REWRITE_TAC[partcirclepath] THEN
7074   REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; IM_MUL_II; RE_MUL_CX; GSYM CX_SUB] THEN
7075   REWRITE_TAC[CNJ_ADD; CNJ_SUB; CNJ_MUL; CNJ_CX] THEN
7076   REWRITE_TAC[COMPLEX_RING
7077    `c * ((z + r * c') - w):complex = r * c * c' - c * (w - z)`] THEN
7078   REWRITE_TAC[COMPLEX_MUL_CNJ; NORM_CEXP; RE_MUL_II] THEN
7079   REWRITE_TAC[IM_LINEPATH_CX; REAL_NEG_0; REAL_EXP_0; COMPLEX_MUL_RID;
7080               COMPLEX_POW_2] THEN
7081   ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_SUB_LT; RE_SUB; RE_CX] THEN
7082   MATCH_MP_TAC(REAL_ARITH
7083    `norm(x) <= norm(y) /\ abs(Re(x)) <= norm(x)
7084     ==> r - norm(y) <= r - Re x`) THEN
7085   REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN
7086   REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP; RE_MUL_II; IM_LINEPATH_CX] THEN
7087   REWRITE_TAC[REAL_EXP_0; REAL_NEG_0; REAL_MUL_LID; GSYM CNJ_SUB] THEN
7088   REWRITE_TAC[COMPLEX_NORM_CNJ; REAL_LE_REFL]);;
7089
7090 let SIMPLE_PATH_PARTCIRCLEPATH = prove
7091  (`!z r s t. simple_path(partcirclepath(z,r,s,t)) <=>
7092                 ~(r = &0) /\ ~(s = t) /\ abs(s - t) <= &2 * pi`,
7093   let lemma = prove
7094    (`(!x y. (&0 <= x /\ x <= &1) /\ (&0 <= y /\ y <= &1) ==> P(abs(x - y))) <=>
7095      (!x. &0 <= x /\ x <= &1 ==> P x)`,
7096     MESON_TAC[REAL_ARITH `(&0 <= x /\ x <= &1) /\ (&0 <= y /\ y <= &1)
7097                           ==> &0 <= abs(x - y) /\ abs(x - y) <= &1`;
7098               REAL_ARITH `&0 <= &0 /\ &0 <= &1`;
7099               REAL_ARITH `(&0 <= x ==> abs(x - &0) = x)`]) in
7100   REPEAT GEN_TAC THEN REWRITE_TAC[simple_path; PATH_PARTCIRCLEPATH] THEN
7101   REWRITE_TAC[partcirclepath] THEN
7102   SIMP_TAC[COMPLEX_RING `z + r * x = z + r * y <=> r * (x - y) = Cx(&0)`] THEN
7103   REWRITE_TAC[COMPLEX_ENTIRE; CX_INJ] THEN
7104   ASM_CASES_TAC `r = &0` THEN ASM_REWRITE_TAC[] THENL
7105    [DISCH_THEN(MP_TAC o SPECL [`lift(&1 / &3)`; `lift(&1 / &2)`]) THEN
7106     REWRITE_TAC[IN_INTERVAL_1; LIFT_DROP; GSYM LIFT_NUM; LIFT_EQ] THEN
7107     CONV_TAC REAL_RAT_REDUCE_CONV;
7108     ALL_TAC] THEN
7109   ASM_CASES_TAC `s:real = t` THEN ASM_REWRITE_TAC[] THENL
7110    [DISCH_THEN(MP_TAC o SPECL [`lift(&1 / &3)`; `lift(&1 / &2)`]) THEN
7111     REWRITE_TAC[linepath; VECTOR_ARITH `(&1 - t) % x + t % x = x`] THEN
7112     REWRITE_TAC[IN_INTERVAL_1; LIFT_DROP; GSYM LIFT_NUM; LIFT_EQ] THEN
7113     CONV_TAC REAL_RAT_REDUCE_CONV THEN REWRITE_TAC[COMPLEX_SUB_0];
7114     ALL_TAC] THEN
7115   REWRITE_TAC[COMPLEX_SUB_0; CEXP_EQ] THEN
7116   REWRITE_TAC[COMPLEX_RING
7117    `ii * x = ii * y + z * ii <=> ii * (x - (y + z)) = Cx(&0)`] THEN
7118   REWRITE_TAC[COMPLEX_ENTIRE; II_NZ; LINEPATH_CX] THEN
7119   REWRITE_TAC[GSYM CX_SUB; GSYM CX_ADD; CX_INJ] THEN
7120   REWRITE_TAC[REAL_ARITH
7121    `((&1 - x) * s + x * t) - (((&1 - y) * s + y * t) + z) = &0 <=>
7122     (x - y) * (t - s) = z`] THEN
7123   REWRITE_TAC[GSYM DROP_EQ; DROP_VEC; IN_INTERVAL_1] THEN
7124   SIMP_TAC[REAL_ARITH
7125    `&0 <= x /\ x <= &1 /\ &0 <= y /\ y <= &1
7126     ==> (x = y \/ x = &0 /\ y = &1 \/ x = &1 /\ y = &0 <=>
7127          abs(x - y) = &0 \/ abs(x - y) = &1)`] THEN
7128   SIMP_TAC[PI_POS; REAL_FIELD
7129    `&0 < pi ==> (x = &2 * n * pi <=> n = x / (&2 * pi))`] THEN
7130   REWRITE_TAC[ONCE_REWRITE_RULE[CONJ_SYM] UNWIND_THM2] THEN
7131   ONCE_REWRITE_TAC[GSYM INTEGER_ABS] THEN
7132   REWRITE_TAC[GSYM FORALL_DROP; REAL_ABS_MUL; REAL_ABS_DIV] THEN
7133   REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_PI] THEN
7134   ONCE_REWRITE_TAC[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`] THEN
7135   REWRITE_TAC[lemma] THEN EQ_TAC THENL
7136    [DISCH_THEN(MP_TAC o SPEC `(&2 * pi) / abs(t - s)`) THEN
7137     ASM_SIMP_TAC[REAL_ABS_SUB; REAL_FIELD
7138      `~(s = t) ==> x / abs(s - t) * abs(s - t) = x`] THEN
7139     ASM_SIMP_TAC[PI_POS; INTEGER_CLOSED; REAL_FIELD
7140      `&0 < pi ==> (&2 * pi) / (&2 * pi) = &1`] THEN
7141     ASM_SIMP_TAC[REAL_EQ_LDIV_EQ; REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ;
7142                  GSYM REAL_ABS_NZ; REAL_SUB_0] THEN
7143     MP_TAC PI_POS THEN REAL_ARITH_TAC;
7144     DISCH_TAC THEN X_GEN_TAC `x:real` THEN REPEAT STRIP_TAC THEN
7145     FIRST_X_ASSUM(MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
7146        REAL_ABS_INTEGER_LEMMA)) THEN
7147     SIMP_TAC[REAL_ABS_DIV; REAL_ABS_MUL; REAL_ABS_ABS; REAL_ABS_NUM;
7148              REAL_ABS_PI] THEN
7149     SIMP_TAC[REAL_EQ_LDIV_EQ; REAL_LE_RDIV_EQ; PI_POS; REAL_LT_MUL;
7150              REAL_OF_NUM_LT; ARITH] THEN
7151     ASM_CASES_TAC `x = &0` THEN ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN
7152     ASM_REWRITE_TAC[REAL_ENTIRE; REAL_MUL_LID;
7153                     REAL_ARITH `abs(t - s) = &0 <=> s = t`] THEN
7154     DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
7155      `p <= x * abs(s - t)
7156       ==> abs(s - t) <= p ==> &1 * abs(s - t) <= x * abs(s - t)`)) THEN
7157     ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN ASM_REWRITE_TAC[] THEN
7158     ASM_SIMP_TAC[REAL_LE_RMUL_EQ; GSYM REAL_ABS_NZ; REAL_SUB_0] THEN
7159     ASM_REAL_ARITH_TAC]);;
7160
7161 let ARC_PARTCIRCLEPATH = prove
7162  (`!z r s t. ~(r = &0) /\ ~(s = t) /\ abs(s - t) < &2 * pi
7163              ==> arc(partcirclepath(z,r,s,t))`,
7164   REPEAT STRIP_TAC THEN REWRITE_TAC[arc; PATH_PARTCIRCLEPATH] THEN
7165   REWRITE_TAC[partcirclepath] THEN
7166   SIMP_TAC[COMPLEX_RING `z + r * x = z + r * y <=> r * (x - y) = Cx(&0)`] THEN
7167   ASM_REWRITE_TAC[COMPLEX_ENTIRE; CX_INJ] THEN
7168   REWRITE_TAC[COMPLEX_SUB_0; CEXP_EQ] THEN
7169   REWRITE_TAC[COMPLEX_RING
7170    `ii * x = ii * y + z * ii <=> ii * (x - (y + z)) = Cx(&0)`] THEN
7171   REWRITE_TAC[COMPLEX_ENTIRE; II_NZ; LINEPATH_CX] THEN
7172   REWRITE_TAC[GSYM CX_SUB; GSYM CX_ADD; CX_INJ] THEN
7173   REWRITE_TAC[REAL_ARITH
7174    `((&1 - x) * s + x * t) - (((&1 - y) * s + y * t) + z) = &0 <=>
7175     (x - y) * (t - s) = z`] THEN
7176   REPEAT GEN_TAC THEN DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
7177   FIRST_X_ASSUM(X_CHOOSE_THEN `n:real` MP_TAC) THEN
7178   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
7179   ASM_CASES_TAC `n = &0` THEN
7180   ASM_REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_ENTIRE; REAL_SUB_0;
7181                   DROP_EQ] THEN
7182   MP_TAC(SPEC `n:real` REAL_ABS_INTEGER_LEMMA) THEN
7183   ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
7184   ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN DISCH_THEN(K ALL_TAC) THEN
7185   MATCH_MP_TAC(REAL_ARITH `abs x < abs y ==> ~(x = y)`) THEN
7186   REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NUM; REAL_ABS_PI] THEN
7187   MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `&1 * &2 * pi` THEN
7188   CONJ_TAC THENL
7189    [ALL_TAC;
7190     ONCE_REWRITE_TAC[REAL_ARITH `&2 * n * pi = n * &2 * pi`] THEN
7191     MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN
7192     MP_TAC PI_POS THEN REAL_ARITH_TAC] THEN
7193   MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&1 * abs(t - s)` THEN
7194   CONJ_TAC THENL
7195    [ALL_TAC;
7196     ASM_REWRITE_TAC[REAL_MUL_LID] THEN ASM_MESON_TAC[REAL_ABS_SUB]] THEN
7197   MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN
7198   REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1])) THEN
7199   REWRITE_TAC[DROP_VEC] THEN REAL_ARITH_TAC);;
7200
7201 (* ------------------------------------------------------------------------- *)
7202 (* Special case of one complete circle.                                      *)
7203 (* ------------------------------------------------------------------------- *)
7204
7205 let circlepath = new_definition
7206  `circlepath(z,r) = partcirclepath(z,r,&0,&2 * pi)`;;
7207
7208 let CIRCLEPATH = prove
7209  (`circlepath(z,r) = \x. z + Cx(r) * cexp(Cx(&2) * Cx pi * ii * Cx(drop x))`,
7210   REWRITE_TAC[circlepath; partcirclepath; linepath; COMPLEX_CMUL] THEN
7211   REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_LID] THEN
7212   REWRITE_TAC[CX_MUL; COMPLEX_MUL_AC]);;
7213
7214 let PATHSTART_CIRCLEPATH = prove
7215  (`!r z. pathstart(circlepath(z,r)) = z + Cx(r)`,
7216   REWRITE_TAC[circlepath; PATHSTART_PARTCIRCLEPATH] THEN
7217   REWRITE_TAC[COMPLEX_MUL_RZERO; CEXP_0; COMPLEX_MUL_RID]);;
7218
7219 let PATHFINISH_CIRCLEPATH = prove
7220  (`!r z. pathfinish(circlepath(z,r)) = z + Cx(r)`,
7221   REWRITE_TAC[circlepath; PATHFINISH_PARTCIRCLEPATH] THEN
7222   REWRITE_TAC[CEXP_EULER; GSYM CX_COS; GSYM CX_SIN] THEN
7223   REWRITE_TAC[SIN_NPI; COS_NPI; REAL_POW_NEG; ARITH; REAL_POW_ONE] THEN
7224   CONV_TAC COMPLEX_RING);;
7225
7226 let HAS_VECTOR_DERIVATIVE_CIRCLEPATH = prove
7227  (`((circlepath (z,r)) has_vector_derivative
7228     (Cx(&2) * Cx(pi) * ii * Cx(r) * cexp(Cx(&2) * Cx pi * ii * Cx(drop x))))
7229    (at x)`,
7230   REWRITE_TAC[CIRCLEPATH] THEN
7231   MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_REAL_COMPLEX THEN
7232   COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING);;
7233
7234 let VECTOR_DERIVATIVE_CIRCLEPATH = prove
7235  (`vector_derivative (circlepath (z,r)) (at x) =
7236         Cx(&2) * Cx(pi) * ii * Cx(r) * cexp(Cx(&2) * Cx pi * ii * Cx(drop x))`,
7237   MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
7238   REWRITE_TAC[HAS_VECTOR_DERIVATIVE_CIRCLEPATH]);;
7239
7240 let VALID_PATH_CIRCLEPATH = prove
7241  (`!z r. valid_path (circlepath(z,r))`,
7242   REWRITE_TAC[circlepath; VALID_PATH_PARTCIRCLEPATH]);;
7243
7244 let PATH_IMAGE_CIRCLEPATH = prove
7245  (`!z r. &0 <= r ==> path_image (circlepath(z,r)) = sphere(z,r)`,
7246   REPEAT STRIP_TAC THEN REWRITE_TAC[CIRCLEPATH; path_image] THEN
7247   REWRITE_TAC[sphere; NORM_ARITH `dist(w,z) = norm(z - w)`] THEN
7248   MATCH_MP_TAC SUBSET_ANTISYM THEN REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
7249   REWRITE_TAC[IN_ELIM_THM; COMPLEX_RING `(z + r) - z = r:complex`] THEN
7250   REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP] THEN CONJ_TAC THENL
7251    [ONCE_REWRITE_TAC[COMPLEX_RING
7252      `Cx(&2) * p * i * z = (Cx(&2) * p * z) * i`] THEN
7253     REWRITE_TAC[RE_MUL_II; GSYM CX_MUL; IM_CX] THEN
7254     REWRITE_TAC[REAL_EXP_NEG; REAL_EXP_0; REAL_MUL_RID; COMPLEX_NORM_CX] THEN
7255     POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
7256     ALL_TAC] THEN
7257   X_GEN_TAC `x:complex` THEN DISCH_TAC THEN ABBREV_TAC `w:complex = x - z` THEN
7258   FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP (COMPLEX_RING
7259    `x - z = w:complex ==> x = z + w`)) THEN
7260   REWRITE_TAC[IN_IMAGE; COMPLEX_RING `z + a = z + b:complex <=> a = b`] THEN
7261   ASM_CASES_TAC `w = Cx(&0)` THENL
7262    [UNDISCH_THEN `norm(w:complex) = r` (MP_TAC o SYM) THEN
7263     ASM_REWRITE_TAC[COMPLEX_NORM_0; REAL_ABS_ZERO] THEN
7264     DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[COMPLEX_MUL_LZERO] THEN
7265     REWRITE_TAC[MEMBER_NOT_EMPTY; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
7266     REWRITE_TAC[REAL_NOT_LT; REAL_POS];
7267     ALL_TAC] THEN
7268   MP_TAC(SPECL [`Re(w / Cx(norm w))`; `Im(w / Cx(norm w))`]
7269     SINCOS_TOTAL_2PI) THEN
7270   REWRITE_TAC[GSYM COMPLEX_SQNORM] THEN
7271   REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NORM] THEN
7272   ASM_SIMP_TAC[REAL_DIV_REFL; REAL_POW_ONE; COMPLEX_NORM_ZERO] THEN
7273   DISCH_THEN(X_CHOOSE_THEN `t:real` (STRIP_ASSUME_TAC o GSYM)) THEN
7274   EXISTS_TAC `lift(t / (&2 * pi))` THEN
7275   ONCE_REWRITE_TAC[COMPLEX_RING
7276      `Cx(&2) * p * i * z = i * (Cx(&2) * p * z)`] THEN
7277   REWRITE_TAC[CEXP_EULER; LIFT_DROP; CX_DIV; CX_MUL] THEN
7278   ASM_SIMP_TAC[CX_PI_NZ; COMPLEX_FIELD
7279    `~(p = Cx(&0)) ==> Cx(&2) * p * t / (Cx(&2) * p) = t`] THEN
7280   ASM_REWRITE_TAC[GSYM CX_COS; GSYM CX_SIN] THEN CONJ_TAC THENL
7281    [REWRITE_TAC[complex_div; GSYM CX_INV] THEN
7282     REWRITE_TAC[SIMPLE_COMPLEX_ARITH `Re(w * Cx x) = Re(w) * x`;
7283                 SIMPLE_COMPLEX_ARITH `Im(w * Cx x) = Im(w) * x`] THEN
7284     REWRITE_TAC[COMPLEX_ADD_LDISTRIB; GSYM CX_MUL] THEN
7285     SUBGOAL_THEN `!z:real. r * z * inv r = z` MP_TAC THENL
7286      [SUBGOAL_THEN `~(r = &0)` MP_TAC THENL [ALL_TAC; CONV_TAC REAL_FIELD] THEN
7287       ASM_MESON_TAC[COMPLEX_NORM_ZERO];
7288       ONCE_REWRITE_TAC[COMPLEX_RING `t * ii * s = ii * t * s`] THEN
7289       SIMP_TAC[GSYM CX_MUL; GSYM COMPLEX_EXPAND]];
7290     REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; LIFT_DROP] THEN
7291     ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_LT_MUL;
7292                  PI_POS; REAL_OF_NUM_LT; ARITH] THEN
7293     ASM_REAL_ARITH_TAC]);;
7294
7295 let HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH_STRONG = prove
7296  (`!f i z r B k.
7297         FINITE k /\
7298         (f has_path_integral i) (circlepath(z,r)) /\
7299         &0 <= B /\ &0 < r /\
7300         (!x. norm(x - z) = r /\ ~(x IN k) ==> norm(f x) <= B)
7301         ==> norm(i) <= B * (&2 * pi * r)`,
7302   REWRITE_TAC[circlepath] THEN REPEAT STRIP_TAC THEN
7303   SUBST1_TAC(REAL_ARITH `B * (&2 * pi * r) = B * r * (&2 * pi - &0)`) THEN
7304   MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG THEN
7305   MAP_EVERY EXISTS_TAC
7306    [`f:complex->complex`; `z:complex`; `k:complex->bool`] THEN
7307   ASM_SIMP_TAC[REAL_LE_MUL; REAL_POS; REAL_LT_IMP_LE; PI_POS; IN_DIFF] THEN
7308   ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; GSYM circlepath; REAL_LT_IMP_LE] THEN
7309   ASM_REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(w,z) = norm(z - w)`]);;
7310
7311 let HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH = prove
7312  (`!f i z r B.
7313         (f has_path_integral i) (circlepath(z,r)) /\
7314         &0 <= B /\ &0 < r /\ (!x. norm(x - z) = r ==> norm(f x) <= B)
7315         ==> norm(i) <= B * (&2 * pi * r)`,
7316   REWRITE_TAC[circlepath] THEN REPEAT STRIP_TAC THEN
7317   SUBST1_TAC(REAL_ARITH `B * (&2 * pi * r) = B * r * (&2 * pi - &0)`) THEN
7318   MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH THEN
7319   MAP_EVERY EXISTS_TAC [`f:complex->complex`; `z:complex`] THEN
7320   ASM_SIMP_TAC[REAL_LE_MUL; REAL_POS; REAL_LT_IMP_LE; PI_POS] THEN
7321   ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; GSYM circlepath; REAL_LT_IMP_LE] THEN
7322   ASM_REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(w,z) = norm(z - w)`]);;
7323
7324 let PATH_INTEGRABLE_CONTINUOUS_CIRCLEPATH = prove
7325  (`!f z r. f continuous_on path_image(circlepath(z,r))
7326            ==> f path_integrable_on (circlepath(z,r))`,
7327   SIMP_TAC[PATH_INTEGRABLE_CONTINUOUS_PARTCIRCLEPATH; circlepath]);;
7328
7329 let SIMPLE_PATH_CIRCLEPATH = prove
7330  (`!z r. simple_path(circlepath(z,r)) <=> ~(r = &0)`,
7331   REWRITE_TAC[circlepath; SIMPLE_PATH_PARTCIRCLEPATH] THEN
7332   MP_TAC PI_POS THEN REAL_ARITH_TAC);;
7333
7334 let WINDING_NUMBER_CIRCLEPATH = prove
7335  (`!z r w. norm(w - z) < r ==> winding_number(circlepath(z,r),w) = Cx(&1)`,
7336   REPEAT STRIP_TAC THEN
7337   MATCH_MP_TAC SIMPLE_CLOSED_PATH_WINDING_NUMBER_POS THEN
7338   REWRITE_TAC[SIMPLE_PATH_CIRCLEPATH;
7339               PATHSTART_CIRCLEPATH; PATHFINISH_CIRCLEPATH; CONJ_ASSOC] THEN
7340   CONJ_TAC THENL
7341    [FIRST_X_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
7342      `n < r ==> (&0 <= n ==> &0 <= r /\ &0 < r) /\ n < r`)) THEN
7343     SIMP_TAC[NORM_POS_LE; PATH_IMAGE_CIRCLEPATH; IN_ELIM_THM] THEN
7344     ASM_REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(w,z) = norm(z - w)`] THEN
7345     REAL_ARITH_TAC;
7346     REWRITE_TAC[circlepath] THEN
7347     MATCH_MP_TAC WINDING_NUMBER_PARTCIRCLEPATH_POS_LT THEN
7348     ASM_SIMP_TAC[REAL_LT_MUL; PI_POS; REAL_OF_NUM_LT; ARITH]]);;
7349
7350 (* ------------------------------------------------------------------------- *)
7351 (* Hence the Cauchy formula for points inside a circle.                      *)
7352 (* ------------------------------------------------------------------------- *)
7353
7354 let CAUCHY_INTEGRAL_CIRCLEPATH = prove
7355  (`!f z r w.
7356         f continuous_on cball(z,r) /\
7357         f holomorphic_on ball(z,r) /\
7358         w IN ball(z,r)
7359         ==> ((\u. f(u) / (u - w)) has_path_integral
7360              (Cx(&2) * Cx(pi) * ii * f(w))) (circlepath(z,r))`,
7361   REPEAT STRIP_TAC THEN
7362   MP_TAC(SPECL [`f:complex->complex`; `cball(z:complex,r)`;
7363                 `{}:complex->bool`; `circlepath(z,r)`; `w:complex`]
7364                CAUCHY_INTEGRAL_FORMULA_WEAK) THEN
7365   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
7366   ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[dist] THEN DISCH_TAC THEN
7367   ASM_SIMP_TAC[WINDING_NUMBER_CIRCLEPATH; COMPLEX_MUL_LID] THEN
7368   DISCH_THEN MATCH_MP_TAC THEN
7369   ASM_REWRITE_TAC[VALID_PATH_CIRCLEPATH; PATHSTART_CIRCLEPATH; FINITE_RULES;
7370        PATHFINISH_CIRCLEPATH; CONVEX_CBALL; INTERIOR_CBALL; DIFF_EMPTY] THEN
7371   REWRITE_TAC[complex_differentiable] THEN
7372   CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL]; ALL_TAC] THEN
7373   FIRST_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
7374    `n < r ==> &0 <= n ==> &0 <= r`)) THEN
7375   SIMP_TAC[NORM_POS_LE; PATH_IMAGE_CIRCLEPATH] THEN
7376   REWRITE_TAC[SET_RULE `s SUBSET c DELETE q <=> s SUBSET c /\ ~(q IN s)`] THEN
7377   REWRITE_TAC[SPHERE_SUBSET_CBALL; IN_SPHERE] THEN
7378   UNDISCH_TAC `norm(w - z:complex) < r` THEN CONV_TAC NORM_ARITH);;
7379
7380 let CAUCHY_INTEGRAL_CIRCLEPATH_SIMPLE = prove
7381  (`!f z r w.
7382         f holomorphic_on cball(z,r) /\ w IN ball(z,r)
7383         ==> ((\u. f(u) / (u - w)) has_path_integral
7384              (Cx(&2) * Cx(pi) * ii * f(w))) (circlepath(z,r))`,
7385   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_INTEGRAL_CIRCLEPATH THEN
7386   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
7387   ASM_MESON_TAC[BALL_SUBSET_CBALL; HOLOMORPHIC_ON_SUBSET]);;
7388
7389 (* ------------------------------------------------------------------------- *)
7390 (* Uniform convergence of path integral when the derivative of the path is   *)
7391 (* bounded, and in particular for the special case of a circle.              *)
7392 (* ------------------------------------------------------------------------- *)
7393
7394 let PATH_INTEGRAL_UNIFORM_LIMIT = prove
7395  (`!net f B g l.
7396      ~(trivial_limit net) /\ valid_path g /\
7397      (!t. t IN interval[vec 0,vec 1]
7398           ==> norm(vector_derivative g (at t)) <= B) /\
7399      eventually (\n:A. (f n) path_integrable_on g) net /\
7400      (!e. &0 < e
7401           ==> eventually (\n. !x. x IN path_image g
7402                                   ==> norm(f n x - l x) < e) net)
7403      ==> l path_integrable_on g /\
7404          ((\n. path_integral g (f n)) --> path_integral g l) net`,
7405   REPEAT GEN_TAC THEN STRIP_TAC THEN
7406   MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
7407    [REWRITE_TAC[path_integrable_on; HAS_PATH_INTEGRAL; GSYM integrable_on] THEN
7408     MATCH_MP_TAC INTEGRABLE_UNIFORM_LIMIT THEN
7409     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
7410     FIRST_X_ASSUM(MP_TAC o SPEC `e / (abs B + &1)`) THEN
7411     ASM_SIMP_TAC[REAL_LT_DIV; REAL_ARITH `&0 < abs B + &1`] THEN
7412     UNDISCH_TAC `eventually (\n:A. (f n) path_integrable_on g) net` THEN
7413     REWRITE_TAC[IMP_IMP; GSYM EVENTUALLY_AND] THEN
7414     DISCH_THEN(MP_TAC o MATCH_MP EVENTUALLY_HAPPENS) THEN
7415     ASM_REWRITE_TAC[path_image; path_integrable_on; FORALL_IN_IMAGE] THEN
7416     REWRITE_TAC[HAS_PATH_INTEGRAL; GSYM integrable_on] THEN
7417     DISCH_THEN(X_CHOOSE_THEN `a:A` STRIP_ASSUME_TAC) THEN
7418     EXISTS_TAC `\x. f (a:A) (g x) * vector_derivative g (at x)` THEN
7419     ASM_REWRITE_TAC[GSYM COMPLEX_SUB_RDISTRIB] THEN
7420     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
7421     MATCH_MP_TAC REAL_LE_TRANS THEN
7422     EXISTS_TAC `e / (abs B + &1) * B` THEN CONJ_TAC THENL
7423      [REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
7424       ASM_SIMP_TAC[NORM_POS_LE] THEN ONCE_REWRITE_TAC[NORM_SUB] THEN
7425       ASM_SIMP_TAC[REAL_LT_IMP_LE];
7426       REWRITE_TAC[REAL_ARITH `e / x * B <= e <=> &0 <= e * (&1 - B / x)`] THEN
7427       MATCH_MP_TAC REAL_LE_MUL THEN
7428       ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_SUB_LE; REAL_LE_LDIV_EQ;
7429                    REAL_ARITH `&0 < abs B + &1`] THEN
7430       REAL_ARITH_TAC];
7431     ALL_TAC] THEN
7432   DISCH_TAC THEN ONCE_REWRITE_TAC[LIM_NULL] THEN REWRITE_TAC[tendsto] THEN
7433   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
7434   FIRST_X_ASSUM(MP_TAC o SPEC `e / &2 / (abs B + &1)`) THEN
7435   ASM_SIMP_TAC[REAL_LT_DIV; REAL_ARITH `&0 < abs B + &1`; REAL_HALF] THEN
7436   UNDISCH_TAC `eventually (\n:A. (f n) path_integrable_on g) net` THEN
7437   REWRITE_TAC[IMP_IMP; GSYM EVENTUALLY_AND] THEN
7438   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
7439   X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
7440   ASM_SIMP_TAC[PATH_INTEGRAL_INTEGRAL; DIST_0; GSYM INTEGRAL_SUB;
7441                GSYM PATH_INTEGRABLE_ON; ETA_AX] THEN
7442   MATCH_MP_TAC REAL_LET_TRANS THEN
7443   EXISTS_TAC
7444    `drop(integral (interval[vec 0,vec 1]) (\x:real^1. lift(e / &2)))` THEN
7445   CONJ_TAC THENL
7446    [MATCH_MP_TAC INTEGRAL_NORM_BOUND_INTEGRAL THEN
7447     ASM_SIMP_TAC[INTEGRABLE_SUB; GSYM PATH_INTEGRABLE_ON; ETA_AX] THEN
7448     REWRITE_TAC[INTEGRABLE_CONST; GSYM COMPLEX_SUB_RDISTRIB; LIFT_DROP] THEN
7449     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
7450     EXISTS_TAC `e / &2 / (abs B + &1) * B` THEN CONJ_TAC THENL
7451      [REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
7452       ASM_SIMP_TAC[NORM_POS_LE] THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
7453       FIRST_X_ASSUM MATCH_MP_TAC THEN
7454       REWRITE_TAC[IN_IMAGE; path_image] THEN ASM_MESON_TAC[];
7455       REWRITE_TAC[REAL_ARITH `e / x * B <= e <=> &0 <= e * (&1 - B / x)`] THEN
7456       MATCH_MP_TAC REAL_LE_MUL THEN
7457       ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_SUB_LE; REAL_LE_LDIV_EQ;
7458                    REAL_ARITH `&0 < abs B + &1`] THEN
7459       ASM_REAL_ARITH_TAC];
7460     REWRITE_TAC[INTEGRAL_CONST; CONTENT_UNIT_1; VECTOR_MUL_LID; LIFT_DROP] THEN
7461     ASM_REAL_ARITH_TAC]);;
7462
7463 let PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH = prove
7464  (`!net f l z r.
7465      &0 < r /\ ~(trivial_limit net) /\
7466      eventually (\n:A. (f n) path_integrable_on circlepath(z,r)) net /\
7467      (!e. &0 < e
7468           ==> eventually (\n. !x. x IN path_image (circlepath(z,r))
7469                                   ==> norm(f n x - l x) < e) net)
7470      ==> l path_integrable_on circlepath(z,r) /\
7471          ((\n. path_integral (circlepath(z,r)) (f n))
7472           --> path_integral (circlepath(z,r)) l) net`,
7473   REPEAT GEN_TAC THEN STRIP_TAC THEN
7474   MATCH_MP_TAC PATH_INTEGRAL_UNIFORM_LIMIT THEN EXISTS_TAC `&2 * pi * r` THEN
7475   ASM_SIMP_TAC[PI_POS; REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
7476   REWRITE_TAC[VALID_PATH_CIRCLEPATH; VECTOR_DERIVATIVE_CIRCLEPATH] THEN
7477   REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
7478   REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_PI; REAL_MUL_LID] THEN
7479   REWRITE_TAC[NORM_CEXP; RE_MUL_CX; RE_MUL_II; IM_CX] THEN
7480   REWRITE_TAC[REAL_NEG_0; REAL_MUL_RZERO; REAL_EXP_0; REAL_MUL_RID] THEN
7481   ASM_SIMP_TAC[real_abs; REAL_LE_REFL; REAL_LT_IMP_LE]);;
7482
7483 (* ------------------------------------------------------------------------- *)
7484 (* General stepping result for derivative formulas.                          *)
7485 (* ------------------------------------------------------------------------- *)
7486
7487 let CAUCHY_NEXT_DERIVATIVE = prove
7488  (`!f' f g s k B.
7489      ~(k = 0) /\
7490      open s /\ valid_path g /\
7491      (!t. t IN interval[vec 0,vec 1]
7492           ==> norm(vector_derivative g (at t)) <= B) /\
7493      f' continuous_on path_image g /\
7494      (!w. w IN s DIFF path_image g
7495           ==> ((\u. f'(u) / (u - w) pow k) has_path_integral f w) g)
7496      ==> !w. w IN s DIFF path_image g
7497              ==> (\u. f'(u) / (u - w) pow (k + 1)) path_integrable_on g /\
7498                  (f has_complex_derivative
7499                   (Cx(&k) * path_integral g (\u. f'(u) / (u - w) pow (k + 1))))
7500                   (at w)`,
7501   REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `w:complex` THEN
7502   REWRITE_TAC[IN_DIFF] THEN STRIP_TAC THEN
7503   MP_TAC(ISPEC `s DIFF path_image(g:real^1->complex)`
7504         OPEN_CONTAINS_BALL) THEN
7505   ASM_SIMP_TAC[OPEN_DIFF; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
7506   DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
7507   ASM_REWRITE_TAC[IN_DIFF] THEN
7508   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
7509   MP_TAC(ISPECL
7510    [`at(w:complex)`;
7511     `\u x:complex. f'(x) * (inv(x - u) pow k - inv(x - w) pow k) /
7512                    (u - w) / Cx(&k)`;
7513     `B:real`; `g:real^1->complex`;
7514     `\u. f'(u) / (u - w) pow (k + 1)`]
7515         PATH_INTEGRAL_UNIFORM_LIMIT) THEN
7516   REWRITE_TAC[] THEN ANTS_TAC THENL
7517    [ALL_TAC;
7518     MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
7519     DISCH_THEN(MP_TAC o SPEC `Cx(&k)` o MATCH_MP LIM_COMPLEX_LMUL) THEN
7520     REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT] THEN
7521     MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
7522                   LIM_TRANSFORM_AT) THEN
7523     EXISTS_TAC `d:real` THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `u:complex` THEN
7524     REWRITE_TAC[dist] THEN STRIP_TAC THEN
7525     SUBGOAL_THEN `~(u:complex = w)` ASSUME_TAC THENL
7526      [ASM_MESON_TAC[COMPLEX_SUB_0; COMPLEX_NORM_0; REAL_LT_REFL]; ALL_TAC] THEN
7527     ASM_SIMP_TAC[CX_INJ; REAL_OF_NUM_EQ; COMPLEX_FIELD
7528      `~(y = Cx(&0)) ==> (y * x = z <=> x = z / y)`] THEN
7529     ASM_SIMP_TAC[COMPLEX_SUB_0; CX_INJ; REAL_OF_NUM_EQ; COMPLEX_SUB_LDISTRIB;
7530            COMPLEX_FIELD `~(c = Cx(&0)) ==> (a - b) / c = a / c - b / c`] THEN
7531     MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
7532     MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
7533     REWRITE_TAC[complex_div; COMPLEX_MUL_ASSOC] THEN
7534     REWRITE_TAC[GSYM complex_div] THEN
7535     CONJ_TAC THEN REPEAT(MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_DIV) THEN
7536     REWRITE_TAC[GSYM complex_div; COMPLEX_POW_INV] THEN
7537     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
7538     FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
7539     ASM_REWRITE_TAC[IN_BALL; dist; VECTOR_SUB_REFL; NORM_0] THEN
7540     ASM_MESON_TAC[NORM_SUB]] THEN
7541   ASM_REWRITE_TAC[TRIVIAL_LIMIT_AT] THEN CONJ_TAC THENL
7542    [REWRITE_TAC[EVENTUALLY_AT] THEN EXISTS_TAC `d:real` THEN
7543     ASM_REWRITE_TAC[] THEN X_GEN_TAC `u:complex` THEN
7544     REWRITE_TAC[dist] THEN STRIP_TAC THEN
7545     REWRITE_TAC[complex_div; COMPLEX_MUL_ASSOC] THEN
7546     REPEAT(MATCH_MP_TAC PATH_INTEGRABLE_COMPLEX_RMUL) THEN
7547     REWRITE_TAC[COMPLEX_SUB_LDISTRIB; COMPLEX_POW_INV; GSYM complex_div] THEN
7548     MATCH_MP_TAC PATH_INTEGRABLE_SUB THEN
7549     REWRITE_TAC[path_integrable_on] THEN CONJ_TAC THENL
7550      [EXISTS_TAC `(f:complex->complex) u`;
7551       EXISTS_TAC `(f:complex->complex) w`] THEN
7552     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
7553     FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
7554     REWRITE_TAC[IN_BALL; dist; VECTOR_SUB_REFL; NORM_0] THEN
7555     ASM_MESON_TAC[NORM_SUB];
7556     ALL_TAC] THEN
7557   SUBGOAL_THEN
7558    `!e. &0 < e
7559      ==> eventually
7560          (\n. !x. x IN path_image g
7561                   ==> norm
7562                       ((inv (x - n) pow k - inv (x - w) pow k) /
7563                        (n - w) / Cx(&k) - inv(x - w) pow (k + 1)) <
7564                       e)
7565          (at w)`
7566   ASSUME_TAC THENL
7567    [ALL_TAC;
7568     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
7569     SUBGOAL_THEN `bounded(IMAGE (f':complex->complex) (path_image g))`
7570     MP_TAC THENL
7571      [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
7572       MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
7573       ASM_SIMP_TAC[COMPACT_VALID_PATH_IMAGE];
7574       ALL_TAC] THEN
7575     REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
7576     DISCH_THEN(X_CHOOSE_THEN `C:real` STRIP_ASSUME_TAC) THEN
7577     FIRST_X_ASSUM(MP_TAC o SPEC `e / C:real`) THEN
7578     ASM_SIMP_TAC[REAL_LT_DIV] THEN
7579     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
7580     X_GEN_TAC `u:complex` THEN REWRITE_TAC[] THEN
7581     MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `x:complex` THEN
7582     DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
7583     ASM_REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC] THEN
7584     REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB; COMPLEX_NORM_MUL] THEN
7585     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_SIMP_TAC[REAL_LT_RDIV_EQ] THEN
7586     MATCH_MP_TAC(REAL_ARITH `a <= b ==> b < x ==> a < x`) THEN
7587     REWRITE_TAC[COMPLEX_POW_INV] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
7588     ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE]] THEN
7589   X_GEN_TAC `e:real` THEN DISCH_TAC THEN REWRITE_TAC[EVENTUALLY_AT] THEN
7590   EXISTS_TAC `min (d / &2) ((e * (d / &2) pow (k + 2)) / (&k + &1))` THEN
7591   ASM_SIMP_TAC[REAL_LT_MIN; REAL_HALF; REAL_POW_LT; REAL_LT_MUL; dist;
7592                REAL_LT_DIV; REAL_ARITH `&0 < &k + &1`] THEN
7593   X_GEN_TAC `u:complex` THEN STRIP_TAC THEN
7594   X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
7595   MP_TAC(ISPECL [`\n w. if n = 0 then inv(x - w) pow k
7596                         else if n = 1 then Cx(&k) / (x - w) pow (k + 1)
7597                         else (Cx(&k) * Cx(&k + &1)) / (x - w) pow (k + 2)`;
7598                  `1`; `ball(w:complex,d / &2)`;
7599                  `(&k * (&k + &1)) / (d / &2) pow (k + 2)`]
7600          COMPLEX_TAYLOR) THEN
7601   REWRITE_TAC[] THEN ANTS_TAC THENL
7602    [REWRITE_TAC[CONVEX_BALL; ADD_EQ_0; ARITH] THEN CONJ_TAC THENL
7603      [ALL_TAC;
7604       X_GEN_TAC `v:complex` THEN REWRITE_TAC[IN_BALL; dist] THEN DISCH_TAC THEN
7605       REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_CX]THEN
7606       REWRITE_TAC[real_div; GSYM REAL_POW_INV; GSYM REAL_MUL_ASSOC] THEN
7607       REWRITE_TAC[REAL_ABS_NUM; REAL_ARITH `abs(&k + &1) = &k + &1`] THEN
7608       REPEAT(MATCH_MP_TAC REAL_LE_LMUL THEN
7609              CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC]) THEN
7610       REWRITE_TAC[REAL_POW_INV] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
7611       ASM_SIMP_TAC[GSYM real_div; REAL_POW_LT; REAL_HALF] THEN
7612       REWRITE_TAC[COMPLEX_NORM_POW] THEN MATCH_MP_TAC REAL_POW_LE2 THEN
7613       ASM_SIMP_TAC[REAL_ARITH `&0 < d ==> &0 <= d / &2`] THEN
7614       UNDISCH_TAC `ball(w:complex,d) SUBSET s DIFF path_image g` THEN
7615       REWRITE_TAC[SUBSET] THEN DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
7616       ASM_REWRITE_TAC[IN_DIFF; IN_BALL] THEN
7617       UNDISCH_TAC `norm(w - v:complex) < d / &2` THEN
7618       CONV_TAC NORM_ARITH] THEN
7619     GEN_TAC THEN X_GEN_TAC `y:complex` THEN
7620     REWRITE_TAC[IN_BALL; dist] THEN STRIP_TAC THEN
7621     SUBGOAL_THEN `~(y:complex = x)` ASSUME_TAC THENL
7622      [DISCH_THEN SUBST_ALL_TAC THEN
7623       UNDISCH_TAC `ball(w:complex,d) SUBSET s DIFF path_image g` THEN
7624       REWRITE_TAC[SUBSET] THEN DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
7625       ASM_REWRITE_TAC[IN_DIFF; IN_BALL; dist] THEN ASM_REAL_ARITH_TAC;
7626       ALL_TAC] THEN
7627     FIRST_X_ASSUM(DISJ_CASES_THEN SUBST_ALL_TAC o MATCH_MP
7628       (ARITH_RULE `i <= 1 ==> i = 0 \/ i = 1`)) THEN
7629     REWRITE_TAC[ARITH] THEN
7630     MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
7631     COMPLEX_DIFF_TAC THEN
7632     REWRITE_TAC[COMPLEX_POW_EQ_0; COMPLEX_INV_EQ_0; CONJ_ASSOC;
7633        COMPLEX_MUL_LZERO; COMPLEX_SUB_0; ADD_EQ_0; ARITH] THEN
7634     REWRITE_TAC[COMPLEX_SUB_LZERO; COMPLEX_NEG_NEG; complex_div] THEN
7635     REWRITE_TAC[COMPLEX_MUL_LID; GSYM COMPLEX_MUL_ASSOC;
7636      GSYM COMPLEX_POW_INV; GSYM COMPLEX_INV_MUL; GSYM COMPLEX_POW_ADD] THEN
7637     ASM_SIMP_TAC[ARITH_RULE `~(k = 0) ==> k - 1 + 2 = k + 1`] THEN
7638     REWRITE_TAC[COMPLEX_INV_INV; ADD_SUB; COMPLEX_MUL_RNEG;
7639                 COMPLEX_NEG_NEG; COMPLEX_MUL_RID; COMPLEX_POW_POW] THEN
7640     REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; GSYM REAL_OF_NUM_ADD] THEN
7641     AP_TERM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[COMPLEX_POW_INV] THEN
7642     ASM_SIMP_TAC[COMPLEX_POW_EQ_0; COMPLEX_INV_EQ_0; COMPLEX_SUB_0;
7643                  COMPLEX_FIELD `~(x = Cx(&0)) /\ ~(y = Cx(&0))
7644                                 ==> (z * inv x = inv y <=> y * z = x)`] THEN
7645     REWRITE_TAC[GSYM COMPLEX_POW_ADD] THEN AP_TERM_TAC THEN ARITH_TAC;
7646     ALL_TAC] THEN
7647   DISCH_THEN(MP_TAC o SPECL [`w:complex`; `u:complex`]) THEN
7648   ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_HALF; NUMSEG_CONV `0..1`] THEN
7649   ASM_SIMP_TAC[IN_BALL; dist; VSUM_CLAUSES; FINITE_RULES] THEN
7650   ANTS_TAC THENL [ASM_MESON_TAC[NORM_SUB]; ALL_TAC] THEN
7651   REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; ARITH] THEN
7652   REWRITE_TAC[complex_pow; VECTOR_ADD_RID; ARITH; FACT] THEN
7653   CONV_TAC NUM_REDUCE_CONV THEN
7654   REWRITE_TAC[COMPLEX_DIV_1; COMPLEX_MUL_RID; COMPLEX_POW_1] THEN
7655   SUBGOAL_THEN `~(u:complex = w)` ASSUME_TAC THENL
7656    [ASM_MESON_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; REAL_LT_REFL];
7657     ALL_TAC] THEN
7658   SUBGOAL_THEN `~(x:complex = w)` ASSUME_TAC THENL
7659    [ASM_MESON_TAC[]; ALL_TAC] THEN
7660   ASM_SIMP_TAC[COMPLEX_SUB_0; COMPLEX_POW_EQ_0; CX_INJ; REAL_OF_NUM_EQ;
7661      COMPLEX_FIELD
7662         `~(d = Cx(&0)) /\ ~(c = Cx(&0)) /\ ~(e = Cx(&0))
7663          ==> a - (b + c / d * e) = ((a - b) / e / c - inv d) * c * e`] THEN
7664   REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; REAL_DIV_1] THEN
7665   REWRITE_TAC[REAL_ABS_NUM; GSYM COMPLEX_POW_INV] THEN DISCH_TAC THEN
7666   MATCH_MP_TAC REAL_LT_RCANCEL_IMP THEN
7667   EXISTS_TAC `&k * norm(u - w:complex)` THEN
7668   ASM_SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; LT_NZ] THEN
7669   FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
7670    `n <= x ==> x < y ==> n < y`)) THEN
7671   REWRITE_TAC[REAL_POW_2; REAL_MUL_ASSOC] THEN
7672   ASM_SIMP_TAC[REAL_POW_2; REAL_MUL_ASSOC; REAL_LT_RMUL_EQ] THEN
7673   GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
7674   REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
7675   MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[REAL_OF_NUM_LT; LT_NZ] THEN
7676   ONCE_REWRITE_TAC[REAL_ARITH `a * b * c:real = (c * a) * b`] THEN
7677   ASM_SIMP_TAC[GSYM real_div; REAL_LT_LDIV_EQ; REAL_HALF; REAL_POW_LT] THEN
7678   ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_ARITH `&0 < &k + &1`]);;
7679
7680 let CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH = prove
7681  (`!f g z r k.
7682         ~(k = 0) /\
7683         (f continuous_on path_image(circlepath(z,r))) /\
7684         (!w. w IN ball(z,r)
7685              ==> ((\u. f(u) / (u - w) pow k) has_path_integral g w)
7686                  (circlepath(z,r)))
7687         ==> !w. w IN ball(z,r)
7688                 ==> (\u. f(u) / (u - w) pow (k + 1)) path_integrable_on
7689                             (circlepath(z,r)) /\
7690                     (g has_complex_derivative
7691                      (Cx(&k) * path_integral(circlepath(z,r))
7692                                  (\u. f(u) / (u - w) pow (k + 1))))
7693                     (at w)`,
7694   REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_CASES_TAC `&0 <= r` THENL
7695    [ALL_TAC;
7696     GEN_TAC THEN REWRITE_TAC[IN_BALL] THEN
7697     MATCH_MP_TAC(TAUT `~p ==> p ==> q`) THEN
7698     UNDISCH_TAC `~(&0 <= r)` THEN CONV_TAC NORM_ARITH] THEN
7699   MP_TAC(ISPECL
7700    [`f:complex->complex`; `g:complex->complex`; `circlepath(z,r)`;
7701     `ball(z:complex,r)`; `k:num`; `&2 * pi * r`] CAUCHY_NEXT_DERIVATIVE) THEN
7702   ASM_REWRITE_TAC[OPEN_BALL; VALID_PATH_CIRCLEPATH] THEN
7703   SUBGOAL_THEN `ball(z,r) DIFF path_image(circlepath (z,r)) = ball(z,r)`
7704   SUBST1_TAC THENL
7705    [REWRITE_TAC[SET_RULE `s DIFF t = s <=> !x. x IN t ==> ~(x IN s)`] THEN
7706     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; IN_SPHERE; IN_BALL; REAL_LT_REFL];
7707     DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
7708     REWRITE_TAC[VECTOR_DERIVATIVE_CIRCLEPATH] THEN
7709     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
7710     REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_PI; REAL_MUL_LID] THEN
7711     REWRITE_TAC[NORM_CEXP; RE_MUL_CX; RE_MUL_II; IM_CX] THEN
7712     REWRITE_TAC[REAL_NEG_0; REAL_MUL_RZERO; REAL_EXP_0; REAL_MUL_RID] THEN
7713     ASM_SIMP_TAC[real_abs; REAL_LE_REFL]]);;
7714
7715 (* ------------------------------------------------------------------------- *)
7716 (* In particular, the first derivative formula.                              *)
7717 (* ------------------------------------------------------------------------- *)
7718
7719 let CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH = prove
7720  (`!f z r w.
7721         f continuous_on cball(z,r) /\
7722         f holomorphic_on ball(z,r) /\
7723         w IN ball(z,r)
7724         ==> (\u. f(u) / (u - w) pow 2) path_integrable_on circlepath(z,r) /\
7725             (f has_complex_derivative
7726                 (Cx(&1) / (Cx(&2) * Cx(pi) * ii) *
7727                  path_integral(circlepath(z,r)) (\u. f(u) / (u - w) pow 2)))
7728             (at w)`,
7729   REPEAT GEN_TAC THEN STRIP_TAC THEN
7730   MP_TAC(SPECL [`f:complex->complex`; `\x:complex. Cx(&2) * Cx(pi) * ii * f x`;
7731                 `z:complex`; `r:real`; `1`]
7732          CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
7733   ASM_SIMP_TAC[COMPLEX_POW_1; ARITH; CAUCHY_INTEGRAL_CIRCLEPATH] THEN
7734   ANTS_TAC THENL
7735    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `cball(z:complex,r)` THEN
7736     ASM_REWRITE_TAC[] THEN
7737     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
7738     DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
7739      `n < r ==> &0 <= n ==> &0 <= r`)) THEN
7740     SIMP_TAC[DIST_POS_LE; PATH_IMAGE_CIRCLEPATH; SPHERE_SUBSET_CBALL];
7741     ALL_TAC] THEN
7742   DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN ASM_REWRITE_TAC[] THEN
7743   MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[COMPLEX_MUL_LID] THEN
7744   DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
7745         MATCH_MP HAS_COMPLEX_DERIVATIVE_LMUL_AT) THEN
7746   MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
7747   REWRITE_TAC[FUN_EQ_THM] THEN MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_FIELD);;
7748
7749 (* ------------------------------------------------------------------------- *)
7750 (* Existence of all higher derivatives.                                      *)
7751 (* ------------------------------------------------------------------------- *)
7752
7753 let HOLOMORPHIC_DERIVATIVE = prove
7754  (`!f f' s. open s /\ (!z. z IN s ==> (f has_complex_derivative f'(z)) (at z))
7755             ==> f' holomorphic_on s`,
7756   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN] THEN
7757   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7758   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
7759   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
7760   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
7761   MP_TAC(SPECL [`\x. Cx(&1) / (Cx(&2) * Cx pi * ii) * f(x:complex)`;
7762                 `f':complex->complex`; `z:complex`; `r:real`; `2`]
7763                CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
7764   ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[CENTRE_IN_BALL]] THEN
7765   SUBGOAL_THEN `f holomorphic_on cball(z,r)` ASSUME_TAC THENL
7766    [ASM_REWRITE_TAC[holomorphic_on] THEN
7767     ASM_MESON_TAC[SUBSET; HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
7768     ALL_TAC] THEN
7769   REWRITE_TAC[ARITH] THEN CONJ_TAC THENL
7770    [MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_LMUL THEN
7771     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `cball(z:complex,r)` THEN
7772     ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
7773     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE; SPHERE_SUBSET_CBALL];
7774     ALL_TAC] THEN
7775   X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
7776   MP_TAC(SPECL [`f:complex->complex`; `z:complex`; `r:real`; `w:complex`]
7777                CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH) THEN
7778   ANTS_TAC THENL
7779    [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
7780                   BALL_SUBSET_CBALL];
7781     ALL_TAC] THEN
7782   STRIP_TAC THEN
7783   FIRST_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRAL) THEN
7784   DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
7785     MATCH_MP HAS_PATH_INTEGRAL_COMPLEX_LMUL) THEN
7786   REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC] THEN
7787   MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
7788   REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM complex_div] THEN
7789   MATCH_MP_TAC COMPLEX_DERIVATIVE_UNIQUE_AT THEN
7790   MAP_EVERY EXISTS_TAC [`f:complex->complex`; `w:complex`] THEN
7791   ASM_REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC] THEN
7792   ASM_MESON_TAC[SUBSET; BALL_SUBSET_CBALL]);;
7793
7794 let HOLOMORPHIC_COMPLEX_DERIVATIVE = prove
7795  (`!f s. open s /\ f holomorphic_on s
7796          ==> (complex_derivative f) holomorphic_on s`,
7797   REPEAT STRIP_TAC THEN MATCH_MP_TAC HOLOMORPHIC_DERIVATIVE THEN
7798   EXISTS_TAC `f:complex->complex` THEN ASM_REWRITE_TAC[] THEN
7799   ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DERIVATIVE; HOLOMORPHIC_ON_OPEN]);;
7800
7801 let ANALYTIC_COMPLEX_DERIVATIVE = prove
7802  (`!f s. f analytic_on s ==> (complex_derivative f) analytic_on s`,
7803   REPEAT GEN_TAC THEN REWRITE_TAC[analytic_on] THEN DISCH_TAC THEN
7804   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7805   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7806   ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
7807   SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_BALL]);;
7808
7809 let HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE = prove
7810  (`!f s n. open s /\ f holomorphic_on s
7811            ==> (higher_complex_derivative n f) holomorphic_on s`,
7812   REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN
7813   INDUCT_TAC THEN
7814   ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; higher_complex_derivative]);;
7815
7816 let ANALYTIC_HIGHER_COMPLEX_DERIVATIVE = prove
7817  (`!f s n. f analytic_on s ==> (higher_complex_derivative n f) analytic_on s`,
7818   REPEAT GEN_TAC THEN REWRITE_TAC[analytic_on] THEN DISCH_TAC THEN
7819   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7820   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7821   ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
7822   ASM_SIMP_TAC[HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE; OPEN_BALL]);;
7823
7824 let HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE = prove
7825  (`!f s x n. open s /\ f holomorphic_on s /\ x IN s
7826              ==> ((higher_complex_derivative n f) has_complex_derivative
7827                           (higher_complex_derivative (SUC n) f x)) (at x)`,
7828   REPEAT STRIP_TAC THEN REWRITE_TAC[higher_complex_derivative] THEN
7829   REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
7830   MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
7831   EXISTS_TAC `s:complex->bool` THEN
7832   ASM_SIMP_TAC[HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]);;
7833
7834 (* ------------------------------------------------------------------------- *)
7835 (* Morera's theorem.                                                         *)
7836 (* ------------------------------------------------------------------------- *)
7837
7838 let MORERA_LOCAL_TRIANGLE_GEN = prove
7839  (`!f s.
7840      (!z. z IN s
7841           ==> ?e a. &0 < e /\ z IN ball(a,e) /\ f continuous_on ball(a,e) /\
7842                     !b c. segment[b,c] SUBSET ball(a,e)
7843                            ==> path_integral (linepath(a,b)) f +
7844                                path_integral (linepath(b,c)) f +
7845                                path_integral (linepath(c,a)) f = Cx(&0))
7846      ==> f analytic_on s`,
7847   REPEAT STRIP_TAC THEN REWRITE_TAC[analytic_on] THEN
7848   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7849   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7850   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
7851   MAP_EVERY X_GEN_TAC [`e:real`; `a:complex`] THEN STRIP_TAC THEN
7852   EXISTS_TAC `e - dist(a:complex,z)` THEN CONJ_TAC THENL
7853    [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN NORM_ARITH_TAC;
7854     ALL_TAC] THEN
7855   MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `ball(a:complex,e)` THEN
7856   CONJ_TAC THENL
7857    [MATCH_MP_TAC HOLOMORPHIC_DERIVATIVE THEN REWRITE_TAC[OPEN_BALL] THEN
7858     MATCH_MP_TAC TRIANGLE_PATH_INTEGRALS_STARLIKE_PRIMITIVE THEN
7859     EXISTS_TAC `a:complex` THEN ASM_REWRITE_TAC[CENTRE_IN_BALL; OPEN_BALL] THEN
7860     REPEAT STRIP_TAC THEN REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
7861     MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
7862     ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; CENTRE_IN_BALL];
7863     REWRITE_TAC[SUBSET; IN_BALL] THEN NORM_ARITH_TAC]);;
7864
7865 let MORERA_LOCAL_TRIANGLE = prove
7866  (`!f s. (!z. z IN s
7867               ==> ?t. open t /\ z IN t /\ f continuous_on t /\
7868                       !a b c. convex hull {a,b,c} SUBSET t
7869                               ==> path_integral (linepath(a,b)) f +
7870                                   path_integral (linepath(b,c)) f +
7871                                   path_integral (linepath(c,a)) f = Cx(&0))
7872          ==> f analytic_on s`,
7873   REPEAT GEN_TAC THEN DISCH_TAC THEN
7874   MATCH_MP_TAC MORERA_LOCAL_TRIANGLE_GEN THEN
7875   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7876   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7877   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
7878   X_GEN_TAC `t:complex->bool` THEN STRIP_TAC THEN
7879   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
7880   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
7881   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
7882   EXISTS_TAC `z:complex` THEN ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN
7883   CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
7884   MAP_EVERY X_GEN_TAC [`x:complex`; `w:complex`] THEN DISCH_TAC THEN
7885   FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM
7886    (MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT] SUBSET_TRANS)) THEN
7887   MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
7888   ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; CENTRE_IN_BALL] THEN
7889   MP_TAC(ISPECL [`x:complex`; `w:complex`] ENDS_IN_SEGMENT) THEN
7890   ASM SET_TAC[]);;
7891
7892 let MORERA_TRIANGLE = prove
7893  (`!f s. open s /\ f continuous_on s /\
7894          (!a b c. convex hull {a,b,c} SUBSET s
7895                   ==> path_integral (linepath(a,b)) f +
7896                       path_integral (linepath(b,c)) f +
7897                       path_integral (linepath(c,a)) f = Cx(&0))
7898          ==> f analytic_on s`,
7899   REPEAT STRIP_TAC THEN MATCH_MP_TAC MORERA_LOCAL_TRIANGLE THEN
7900   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN EXISTS_TAC `s:complex->bool` THEN
7901   ASM_REWRITE_TAC[]);;
7902
7903 (* ------------------------------------------------------------------------- *)
7904 (* Combining theorems for higher derivatives including Leibniz rule.         *)
7905 (* ------------------------------------------------------------------------- *)
7906
7907 let HIGHER_COMPLEX_DERIVATIVE_EQ_ITER = prove
7908  (`!n. higher_complex_derivative n = ITER n complex_derivative`,
7909   INDUCT_TAC THEN
7910   ASM_REWRITE_TAC [FUN_EQ_THM; ITER; higher_complex_derivative]);;
7911
7912 let HIGHER_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE = prove
7913  (`!f m n. higher_complex_derivative m (higher_complex_derivative n f) =
7914            higher_complex_derivative (m + n) f`,
7915   REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_EQ_ITER; ITER_ADD]);;
7916
7917 let higher_complex_derivative_alt = prove
7918  (`(!f. higher_complex_derivative 0 f = f) /\
7919    (!f z n. higher_complex_derivative (SUC n) f =
7920             higher_complex_derivative n (complex_derivative f))`,
7921   REWRITE_TAC [HIGHER_COMPLEX_DERIVATIVE_EQ_ITER; ITER_ALT]);;
7922
7923 let HIGHER_COMPLEX_DERIVATIVE_LINEAR = prove
7924  (`!c n. higher_complex_derivative n (\w. c * w) =
7925     \z. if n = 0 then c * z else if n = 1 then c else (Cx(&0))`,
7926   GEN_TAC THEN INDUCT_TAC THEN
7927   ASM_REWRITE_TAC [higher_complex_derivative; NOT_SUC; SUC_INJ; ONE] THEN
7928   STRUCT_CASES_TAC (SPEC `n:num` num_CASES) THEN
7929   REWRITE_TAC [NOT_SUC; SUC_INJ;
7930                COMPLEX_DERIVATIVE_LINEAR; COMPLEX_DERIVATIVE_CONST]);;
7931
7932 let HIGHER_COMPLEX_DERIVATIVE_CONST = prove
7933  (`!i c. higher_complex_derivative i (\w.c) = \w. if i=0 then c else Cx(&0)`,
7934   INDUCT_TAC THEN ASM_REWRITE_TAC [higher_complex_derivative_alt; NOT_SUC;
7935                                    COMPLEX_DERIVATIVE_CONST; FUN_EQ_THM] THEN
7936   MESON_TAC[]);;
7937
7938 let HIGHER_COMPLEX_DERIVATIVE_ID = prove
7939  (`!z i. higher_complex_derivative i (\w.w) z =
7940             if i = 0 then z else if i = 1 then Cx(&1) else Cx(&0)`,
7941   GEN_TAC THEN INDUCT_TAC THEN
7942   ASM_REWRITE_TAC [higher_complex_derivative_alt; NOT_SUC; ONE; SUC_INJ] THEN
7943   REWRITE_TAC[COMPLEX_DERIVATIVE_ID; HIGHER_COMPLEX_DERIVATIVE_CONST; ONE]);;
7944
7945 let HAS_COMPLEX_DERIVATIVE_ITER_1 = prove
7946  (`!f n z. f z = z /\ (f has_complex_derivative Cx(&1)) (at z)
7947            ==> (ITER n f has_complex_derivative Cx(&1)) (at z)`,
7948   GEN_TAC THEN INDUCT_TAC THEN REPEAT STRIP_TAC THEN
7949   REWRITE_TAC [ITER_POINTLESS; I_DEF; HAS_COMPLEX_DERIVATIVE_ID] THEN
7950   SUBGOAL_THEN `Cx(&1) = Cx(&1) * Cx(&1)` SUBST1_TAC THENL
7951   [REWRITE_TAC [COMPLEX_MUL_LID];
7952    ASM_SIMP_TAC [ITER_FIXPOINT; COMPLEX_DIFF_CHAIN_AT]]);;
7953
7954 let HIGHER_COMPLEX_DERIVATIVE_NEG = prove
7955  (`!f s n z.
7956      open s /\ f holomorphic_on s /\ z IN s
7957      ==> higher_complex_derivative n (\w. --(f w)) z =
7958                 --(higher_complex_derivative n f z)`,
7959   REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7960   REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7961   REWRITE_TAC [higher_complex_derivative] THEN REPEAT STRIP_TAC THEN
7962   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7963   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7964   EXISTS_TAC `(\w. --(higher_complex_derivative n f w))` THEN
7965   EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
7966   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_NEG THEN
7967   REWRITE_TAC [ETA_AX; GSYM higher_complex_derivative] THEN
7968   ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]);;
7969
7970 let HIGHER_COMPLEX_DERIVATIVE_ADD = prove
7971  (`!f g s n z.
7972      open s /\ f holomorphic_on s /\ g holomorphic_on s /\ z IN s ==>
7973      higher_complex_derivative n (\w. f w + g w) z  =
7974      higher_complex_derivative n f z + higher_complex_derivative n g z`,
7975   REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7976   REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7977   REWRITE_TAC [higher_complex_derivative] THEN REPEAT STRIP_TAC THEN
7978   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7979   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7980   EXISTS_TAC `(\w. higher_complex_derivative n f w +
7981                    higher_complex_derivative n g w)` THEN
7982   EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
7983   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_ADD THEN
7984   REWRITE_TAC [ETA_AX; GSYM higher_complex_derivative] THEN
7985   ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]);;
7986
7987 let HIGHER_COMPLEX_DERIVATIVE_SUB = prove
7988  (`!f g s n z.
7989      open s /\ f holomorphic_on s /\ g holomorphic_on s /\ z IN s ==>
7990      higher_complex_derivative n (\w. f w - g w) z  =
7991      higher_complex_derivative n f z - higher_complex_derivative n g z`,
7992   REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7993   REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7994   REWRITE_TAC [higher_complex_derivative] THEN REPEAT STRIP_TAC THEN
7995   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7996   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7997   EXISTS_TAC `(\w. higher_complex_derivative n f w -
7998                    higher_complex_derivative n g w)` THEN
7999   EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
8000   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
8001   REWRITE_TAC [ETA_AX; GSYM higher_complex_derivative] THEN
8002   ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]);;
8003
8004 let HIGHER_COMPLEX_DERIVATIVE_MUL = prove
8005  (`!f g s n z.
8006      open s /\ f holomorphic_on s /\ g holomorphic_on s /\ z IN s
8007      ==> higher_complex_derivative n (\w. f w * g w) z =
8008          vsum (0..n) (\i. Cx(&(binom(n,i))) *
8009                           higher_complex_derivative i f z *
8010                           higher_complex_derivative (n-i) g z)`,
8011   REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
8012   REPEAT DISCH_TAC THEN INDUCT_TAC THEN
8013   REPEAT STRIP_TAC THEN REWRITE_TAC [NUMSEG_SING; VSUM_SING; SUB] THEN
8014   REWRITE_TAC [higher_complex_derivative; binom; COMPLEX_MUL_LID] THEN
8015   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
8016   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
8017   EXISTS_TAC `\w. vsum (0..n)
8018                     (\i. Cx (&(binom (n,i))) *
8019                          higher_complex_derivative i f w *
8020                          higher_complex_derivative (n-i) g w)` THEN
8021   EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
8022   SUBGOAL_THEN `vsum (0..SUC n) (\i. Cx (&(binom (SUC n,i))) *
8023                                      higher_complex_derivative i f z *
8024                                      higher_complex_derivative (SUC n-i) g z) =
8025                 vsum (0..n) (\i. Cx (&(binom (n,i))) *
8026                                  (higher_complex_derivative i f z *
8027                                   higher_complex_derivative (SUC n-i) g z +
8028                                   higher_complex_derivative (SUC i) f z *
8029                                   higher_complex_derivative (n-i) g z))`
8030     SUBST1_TAC THENL
8031   [SUBGOAL_THEN
8032        `!i. binom(SUC n,i) = binom(n,i) + if i=0 then 0 else binom(n,PRE i)`
8033      (fun th -> REWRITE_TAC[th; GSYM REAL_OF_NUM_ADD; CX_ADD]) THENL
8034    [INDUCT_TAC THEN REWRITE_TAC[binom; NOT_SUC; PRE; ADD_SYM; ADD_0];
8035     REWRITE_TAC [COMPLEX_ADD_LDISTRIB; COMPLEX_ADD_RDISTRIB]] THEN
8036    SIMP_TAC [VSUM_ADD; FINITE_NUMSEG] THEN BINOP_TAC THENL
8037    [REWRITE_TAC [VSUM_CLAUSES_NUMSEG; LE_0] THEN
8038     SUBGOAL_THEN `binom(n,SUC n)=0` SUBST1_TAC THENL
8039     [REWRITE_TAC [BINOM_EQ_0] THEN ARITH_TAC; CONV_TAC COMPLEX_RING];
8040     SIMP_TAC [VSUM_CLAUSES_LEFT; SPEC `SUC n` LE_0] THEN
8041     REWRITE_TAC [COMPLEX_MUL_LZERO; COMPLEX_ADD_LID; GSYM ADD1;
8042                  VSUM_SUC; o_DEF; SUB_SUC; NOT_SUC; PRE]];
8043    MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_VSUM THEN
8044    REWRITE_TAC [FINITE_NUMSEG; IN_NUMSEG] THEN REPEAT STRIP_TAC THEN
8045    MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_LMUL_AT THEN
8046    MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_MUL_AT THEN
8047    ASM_SIMP_TAC [ETA_AX; ARITH_RULE `i <= n ==> SUC n - i = SUC (n-i)`] THEN
8048    ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]]);;
8049
8050 let HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN = prove
8051  (`!f g s i z.
8052      open s /\ f holomorphic_on s /\ g holomorphic_on s /\
8053      (!w. w IN s ==> f w = g w) /\ z IN s
8054      ==> higher_complex_derivative i f z = higher_complex_derivative i g z`,
8055   REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
8056   REPEAT DISCH_TAC THEN INDUCT_TAC THEN REPEAT STRIP_TAC THEN
8057   ASM_SIMP_TAC [higher_complex_derivative] THEN
8058   MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
8059   ASM_MESON_TAC [HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]);;
8060
8061 let HIGHER_COMPLEX_DERIVATIVE_COMPOSE_LINEAR = prove
8062  (`!f u s t n z.
8063      f holomorphic_on t /\ open s /\ open t /\
8064      (!w. w IN s ==> u * w IN t) /\ z IN s
8065      ==> higher_complex_derivative n (\w. f (u * w)) z =
8066          u pow n * higher_complex_derivative n f (u * z)`,
8067   REWRITE_TAC [RIGHT_FORALL_IMP_THM; IMP_CONJ] THEN
8068   REPEAT GEN_TAC THEN REPEAT DISCH_TAC THEN INDUCT_TAC THEN
8069   REWRITE_TAC [higher_complex_derivative; complex_pow; COMPLEX_MUL_LID] THEN
8070   REPEAT STRIP_TAC THEN EQ_TRANS_TAC
8071     `complex_derivative
8072       (\z. u pow n * higher_complex_derivative n f (u * z)) z` THENL
8073   [MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
8074    EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8075    [MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
8076     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC
8077      (REWRITE_RULE [o_DEF]
8078        (SPECL [`\z:complex. u * z`; `f:complex->complex`]
8079               HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
8080     EXISTS_TAC `t:complex->bool` THEN ASM_REWRITE_TAC[] THEN MATCH_MP_TAC
8081      (REWRITE_RULE [o_DEF]
8082        (SPECL [`\w:complex. u:complex`; `\w:complex. w`]
8083               HOLOMORPHIC_ON_MUL)) THEN
8084     REWRITE_TAC [HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID];
8085     MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
8086     SIMP_TAC [HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_CONST] THEN MATCH_MP_TAC
8087      (REWRITE_RULE [o_DEF]
8088        (SPECL [`\w. u * w`; `higher_complex_derivative f n`]
8089               HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
8090     EXISTS_TAC `t:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8091     [MATCH_MP_TAC
8092       (REWRITE_RULE [o_DEF]
8093         (SPECL [`\w:complex. u:complex`; `\w:complex. w`]
8094                HOLOMORPHIC_ON_MUL)) THEN
8095      REWRITE_TAC [HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID];
8096      ASM_SIMP_TAC [HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]]];
8097    EQ_TRANS_TAC
8098      `u pow n * complex_derivative
8099         (\z. higher_complex_derivative n f (u * z)) z` THENL
8100    [MATCH_MP_TAC COMPLEX_DERIVATIVE_LMUL THEN
8101     MATCH_MP_TAC ANALYTIC_ON_IMP_DIFFERENTIABLE_AT THEN
8102     EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
8103     MATCH_MP_TAC (REWRITE_RULE [o_DEF] ANALYTIC_ON_COMPOSE_GEN) THEN
8104     EXISTS_TAC `t:complex->bool` THEN
8105     ASM_SIMP_TAC [ANALYTIC_ON_LINEAR; ANALYTIC_HIGHER_COMPLEX_DERIVATIVE;
8106                   ANALYTIC_ON_OPEN];
8107     ABBREV_TAC `a = u:complex pow n` THEN
8108     REWRITE_TAC [COMPLEX_MUL_AC; COMPLEX_EQ_MUL_LCANCEL] THEN
8109     ASM_CASES_TAC `a = Cx(&0)` THEN ASM_REWRITE_TAC[] THEN
8110     GEN_REWRITE_TAC RAND_CONV [COMPLEX_MUL_SYM] THEN MATCH_MP_TAC
8111      (REWRITE_RULE [o_DEF; COMPLEX_DIFFERENTIABLE_LINEAR;
8112                     COMPLEX_DERIVATIVE_LINEAR]
8113        (SPECL [`\w. u * w`;`higher_complex_derivative n f`]
8114               COMPLEX_DERIVATIVE_CHAIN)) THEN
8115     ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT;
8116                    HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]]]);;
8117
8118 let HIGHER_COMPLEX_DERIVATIVE_ADD_AT = prove
8119  (`!f g n z.
8120      f analytic_on {z} /\ g analytic_on {z}
8121      ==> higher_complex_derivative n (\w. f w + g w) z =
8122          higher_complex_derivative n f z +
8123          higher_complex_derivative n g z`,
8124   REWRITE_TAC [ANALYTIC_AT_TWO] THEN
8125   MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_ADD]);;
8126
8127 let HIGHER_COMPLEX_DERIVATIVE_SUB_AT = prove
8128  (`!f g n z.
8129      f analytic_on {z} /\ g analytic_on {z}
8130      ==> higher_complex_derivative n (\w. f w - g w) z =
8131          higher_complex_derivative n f z -
8132          higher_complex_derivative n g z`,
8133   REWRITE_TAC [ANALYTIC_AT_TWO] THEN
8134   MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_SUB]);;
8135
8136 let HIGHER_COMPLEX_DERIVATIVE_NEG_AT = prove
8137  (`!f n z.
8138      f analytic_on {z}
8139      ==> higher_complex_derivative n (\w. --(f w)) z =
8140          --(higher_complex_derivative n f z)`,
8141   REWRITE_TAC [ANALYTIC_AT] THEN
8142   MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_NEG]);;
8143
8144 let HIGHER_COMPLEX_DERIVATIVE_MUL_AT = prove
8145  (`!f g n z.
8146      f analytic_on {z} /\ g analytic_on {z}
8147      ==> higher_complex_derivative n (\w. f w * g w) z =
8148          vsum (0..n) (\i. Cx(&(binom(n,i))) *
8149                           higher_complex_derivative i f z *
8150                           higher_complex_derivative (n-i) g z)`,
8151   REWRITE_TAC [ANALYTIC_AT_TWO] THEN
8152   MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_MUL]);;
8153
8154 (* ------------------------------------------------------------------------- *)
8155 (* Nonexistence of isolated singularities and a stronger integral formula.   *)
8156 (* ------------------------------------------------------------------------- *)
8157
8158 let NO_ISOLATED_SINGULARITY = prove
8159  (`!f s k. open s /\ FINITE k /\
8160            f continuous_on s /\ f holomorphic_on (s DIFF k)
8161            ==> f holomorphic_on s`,
8162   REPEAT GEN_TAC THEN
8163   SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DIFF; FINITE_IMP_CLOSED; IMP_CONJ] THEN
8164   REWRITE_TAC[GSYM complex_differentiable] THEN REPEAT DISCH_TAC THEN
8165   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8166   ASM_CASES_TAC `(z:complex) IN k` THEN ASM_SIMP_TAC[IN_DIFF] THEN
8167   MP_TAC(ISPECL [`z:complex`; `k:complex->bool`] FINITE_SET_AVOID) THEN
8168   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `d:real` THEN
8169   STRIP_TAC THEN
8170   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
8171   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
8172   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
8173   SUBGOAL_THEN `f holomorphic_on ball(z,min d e)` MP_TAC THENL
8174    [ALL_TAC;
8175     ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; CENTRE_IN_BALL; REAL_LT_MIN;
8176                  complex_differentiable]] THEN
8177   SUBGOAL_THEN
8178    `?g. !w. w IN ball(z,min d e)
8179             ==> (g has_complex_derivative f w) (at w within ball(z,min d e))`
8180   MP_TAC THENL
8181    [ALL_TAC;
8182     SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL] THEN
8183     MESON_TAC[HOLOMORPHIC_DERIVATIVE; OPEN_BALL]] THEN
8184   MATCH_MP_TAC PATHINTEGRAL_CONVEX_PRIMITIVE THEN
8185   REWRITE_TAC[CONVEX_BALL] THEN CONJ_TAC THENL
8186    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
8187     ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
8188      (SET_RULE `b SUBSET s ==> c SUBSET b ==> c SUBSET s`)) THEN
8189     REWRITE_TAC[SUBSET; IN_BALL] THEN REAL_ARITH_TAC;
8190     ALL_TAC] THEN
8191   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_COFINITE THEN
8192   EXISTS_TAC `k:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8193    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
8194     ASM_REWRITE_TAC[];
8195     X_GEN_TAC `w:complex` THEN
8196     DISCH_THEN(fun th -> FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
8197     SPEC_TAC(`w:complex`,`w:complex`) THEN ASM_REWRITE_TAC[GSYM SUBSET] THEN
8198     MATCH_MP_TAC(SET_RULE `s SUBSET t ==> (s DIFF k) SUBSET (t DIFF k)`) THEN
8199     MATCH_MP_TAC(SET_RULE
8200      `interior s SUBSET s /\ s SUBSET t ==> interior s SUBSET t`) THEN
8201     REWRITE_TAC[INTERIOR_SUBSET]] THEN
8202   (MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,e)` THEN
8203    ASM_REWRITE_TAC[] THEN
8204    MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,min d e)` THEN
8205    CONJ_TAC THENL
8206     [MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
8207      ASM SET_TAC[];
8208      REWRITE_TAC[SUBSET; IN_BALL] THEN REAL_ARITH_TAC]));;
8209
8210 let CAUCHY_INTEGRAL_FORMULA_CONVEX = prove
8211  (`!f s k g z.
8212         convex s /\ FINITE k /\ f continuous_on s /\
8213         (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x) /\
8214         z IN interior(s) /\
8215         valid_path g /\ (path_image g) SUBSET (s DELETE z) /\
8216         pathfinish g = pathstart g
8217         ==> ((\w. f(w) / (w - z)) has_path_integral
8218              (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
8219   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_INTEGRAL_FORMULA_WEAK THEN
8220   MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
8221   ASM_REWRITE_TAC[DIFF_EMPTY; FINITE_RULES] THEN
8222   SIMP_TAC[GSYM HOLOMORPHIC_ON_OPEN; complex_differentiable; OPEN_INTERIOR] THEN
8223   MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN
8224   EXISTS_TAC `k:complex->bool` THEN
8225   ASM_REWRITE_TAC[OPEN_INTERIOR] THEN CONJ_TAC THENL
8226    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
8227     ASM_REWRITE_TAC[INTERIOR_SUBSET];
8228     ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DIFF; FINITE_IMP_CLOSED;
8229                  OPEN_INTERIOR; GSYM complex_differentiable]]);;
8230
8231 (* ------------------------------------------------------------------------- *)
8232 (* Formula for higher derivatives.                                           *)
8233 (* ------------------------------------------------------------------------- *)
8234
8235 let CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH = prove
8236  (`!f z r k w.
8237         f continuous_on cball(z,r) /\
8238         f holomorphic_on ball(z,r) /\
8239         w IN ball(z,r)
8240         ==> ((\u. f(u) / (u - w) pow (k + 1))
8241              has_path_integral
8242              ((Cx(&2) * Cx(pi) * ii) / Cx(&(FACT k)) *
8243               higher_complex_derivative k f w))
8244             (circlepath(z,r))`,
8245   REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
8246   REPEAT GEN_TAC THEN DISCH_TAC THEN DISCH_TAC THEN
8247   ASM_CASES_TAC `&0 < r` THENL
8248    [ALL_TAC;
8249     REWRITE_TAC[IN_BALL] THEN
8250     ASM_MESON_TAC[NORM_ARITH `~(&0 < r) ==> ~(dist(a,b) < r)`]] THEN
8251   INDUCT_TAC THEN REWRITE_TAC[higher_complex_derivative] THENL
8252    [REWRITE_TAC[ARITH; COMPLEX_POW_1; FACT; COMPLEX_DIV_1] THEN
8253     ASM_SIMP_TAC[GSYM COMPLEX_MUL_ASSOC; CAUCHY_INTEGRAL_CIRCLEPATH];
8254     ALL_TAC] THEN
8255   MP_TAC(SPECL
8256    [`f:complex->complex`;
8257     `\x. (Cx(&2) * Cx(pi) * ii) / Cx(&(FACT k)) *
8258          higher_complex_derivative k f x`;
8259     `z:complex`; `r:real`; `k + 1`] CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
8260   ASM_REWRITE_TAC[ADD1; ARITH_RULE `(k + 1) + 1 = k + 2`] THEN ANTS_TAC THENL
8261    [REWRITE_TAC[ADD_EQ_0; ARITH_EQ] THEN
8262     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8263     EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[] THEN
8264     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE; SPHERE_SUBSET_CBALL];
8265     ALL_TAC] THEN
8266   DISCH_THEN(fun th ->
8267     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN MP_TAC(SPEC `w:complex` th)) THEN
8268   ASM_REWRITE_TAC[] THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
8269   REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
8270   X_GEN_TAC `y:complex` THEN
8271   DISCH_THEN(fun th -> ASSUME_TAC th THEN MP_TAC th) THEN
8272   MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
8273   MATCH_MP_TAC(COMPLEX_FIELD
8274    `~(a = Cx(&0)) /\ ~(b = Cx(&0)) /\ x = b / a * y ==> y = a / b * x`) THEN
8275   REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ] THEN
8276   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
8277   FIRST_ASSUM(MP_TAC o MATCH_MP HAS_COMPLEX_DERIVATIVE_LMUL_AT) THEN
8278   DISCH_THEN(MP_TAC o SPEC `Cx(&(FACT k)) / (Cx(&2) * Cx pi * ii)`) THEN
8279   REWRITE_TAC[] THEN MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN BINOP_TAC THENL
8280    [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN
8281     MATCH_MP_TAC(COMPLEX_FIELD
8282      `~(a = Cx(&0)) /\ ~(b = Cx(&0)) ==> (a / b) * (b / a) * x = x`) THEN
8283     REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ];
8284     REWRITE_TAC[FACT; GSYM REAL_OF_NUM_MUL; GSYM ADD1; CX_MUL] THEN
8285     MATCH_MP_TAC(COMPLEX_FIELD
8286      `z:complex = y /\ ~(d = Cx(&0))
8287       ==> k / d * k1 * z = (k1 * k) / d * y`) THEN
8288     REWRITE_TAC[CX_2PII_NZ] THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
8289     ASM_REWRITE_TAC[]]);;
8290
8291 let CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH = prove
8292  (`!f z r k w.
8293         f continuous_on cball(z,r) /\
8294         f holomorphic_on ball(z,r) /\
8295         w IN ball(z,r)
8296         ==> (\u. f(u) / (u - w) pow (k + 1))
8297                 path_integrable_on circlepath(z,r) /\
8298             higher_complex_derivative k f w =
8299               Cx(&(FACT k)) / (Cx(&2) * Cx(pi) * ii) *
8300               path_integral(circlepath(z,r)) (\u. f(u) / (u - w) pow (k + 1))`,
8301   REPEAT GEN_TAC THEN DISCH_TAC THEN
8302   FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP
8303     CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH) THEN
8304   CONJ_TAC THENL [ASM_MESON_TAC[path_integrable_on]; ALL_TAC] THEN
8305   MATCH_MP_TAC(COMPLEX_FIELD
8306    `~(a = Cx(&0)) /\ ~(b = Cx(&0)) /\ x = b / a * y ==> y = a / b * x`) THEN
8307   REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ] THEN
8308   MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN ASM_REWRITE_TAC[]);;
8309
8310 (* ------------------------------------------------------------------------- *)
8311 (* A holomorphic function is analytic, i.e. has local power series.          *)
8312 (* ------------------------------------------------------------------------- *)
8313
8314 let HOLOMORPHIC_POWER_SERIES = prove
8315  (`!f z w r.
8316      f holomorphic_on ball(z,r) /\ w IN ball(z,r)
8317      ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) * (w - z) pow n)
8318           sums f(w)) (from 0)`,
8319   REPEAT STRIP_TAC THEN
8320   SUBGOAL_THEN
8321    `?r. &0 < r /\ f holomorphic_on cball(z,r) /\ w IN ball(z,r)`
8322   MP_TAC THENL
8323    [EXISTS_TAC `(r + dist(w:complex,z)) / &2` THEN REPEAT CONJ_TAC THENL
8324      [ALL_TAC;
8325       MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
8326       EXISTS_TAC `ball(z:complex,r)` THEN ASM_REWRITE_TAC[SUBSET];
8327       ALL_TAC] THEN
8328     UNDISCH_TAC `(w:complex) IN ball(z,r)` THEN
8329     REWRITE_TAC[IN_BALL; IN_CBALL] THEN NORM_ARITH_TAC;
8330     ALL_TAC] THEN
8331   POP_ASSUM_LIST(K ALL_TAC) THEN
8332   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
8333   SUBGOAL_THEN `f holomorphic_on ball(z,r) /\ f continuous_on cball(z,r)`
8334   STRIP_ASSUME_TAC THENL
8335    [ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
8336     MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN ASM_MESON_TAC[BALL_SUBSET_CBALL];
8337     ALL_TAC] THEN
8338   SUBGOAL_THEN
8339    `((\k. path_integral (circlepath(z,r)) (\u. f u / (u - z) pow (k + 1)) *
8340           (w - z) pow k)
8341      sums path_integral (circlepath(z,r)) (\u. f u / (u - w))) (from 0)`
8342   MP_TAC THENL
8343    [ALL_TAC;
8344     DISCH_THEN(MP_TAC o SPEC `inv(Cx(&2) * Cx(pi) * ii)` o
8345         MATCH_MP SERIES_COMPLEX_LMUL) THEN
8346     MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN BINOP_TAC THENL
8347      [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `k:num` THEN
8348       MP_TAC(SPECL [`f:complex->complex`; `z:complex`; `r:real`; `k:num`;
8349        `z:complex`] CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH) THEN
8350       ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN
8351       DISCH_THEN(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
8352       MATCH_MP_TAC(COMPLEX_FIELD
8353        `~(pit = Cx(&0)) /\ ~(fact = Cx(&0))
8354         ==> inv(pit) * ((pit / fact) * d) * wz = d / fact * wz`) THEN
8355       REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ];
8356       MP_TAC(SPECL [`f:complex->complex`; `z:complex`; `r:real`; `w:complex`]
8357         CAUCHY_INTEGRAL_CIRCLEPATH_SIMPLE) THEN
8358       ASM_REWRITE_TAC[] THEN
8359       DISCH_THEN(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
8360       MATCH_MP_TAC(COMPLEX_FIELD
8361        `~(x * y * z = Cx(&0)) ==> inv(x * y * z) * x * y * z * w = w`) THEN
8362       REWRITE_TAC[CX_2PII_NZ]]] THEN
8363   REWRITE_TAC[sums; FROM_0; INTER_UNIV] THEN
8364   MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
8365   EXISTS_TAC `\n. path_integral (circlepath(z,r))
8366                    (\u. vsum (0..n)
8367                          (\k. f u * (w - z) pow k / (u - z) pow (k + 1)))` THEN
8368   CONJ_TAC THENL
8369    [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
8370     X_GEN_TAC `k:num` THEN REWRITE_TAC[] THEN
8371     W(MP_TAC o PART_MATCH (lhs o rand) PATH_INTEGRAL_VSUM o lhand o snd) THEN
8372     ANTS_TAC THENL
8373      [REWRITE_TAC[FINITE_NUMSEG] THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN
8374       ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH
8375        `a * b / c:complex = b * a / c`] THEN
8376       MATCH_MP_TAC PATH_INTEGRABLE_COMPLEX_LMUL THEN
8377       ASM_SIMP_TAC[CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH;
8378                    CENTRE_IN_BALL];
8379       ALL_TAC] THEN
8380     DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC VSUM_EQ THEN
8381     X_GEN_TAC `m:num` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
8382     ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a * b / c:complex = a / c * b`] THEN
8383     MATCH_MP_TAC PATH_INTEGRAL_COMPLEX_RMUL THEN
8384     ASM_SIMP_TAC[CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH; CENTRE_IN_BALL];
8385     ALL_TAC] THEN
8386   MATCH_MP_TAC(CONJUNCT2
8387    (REWRITE_RULE[FORALL_AND_THM; TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`]
8388         PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH)) THEN
8389   ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL
8390    [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
8391     X_GEN_TAC `k:num` THEN REWRITE_TAC[] THEN
8392     MATCH_MP_TAC PATH_INTEGRABLE_VSUM THEN
8393     REWRITE_TAC[FINITE_NUMSEG] THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN
8394     ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a * b / c:complex = b * a / c`] THEN
8395     MATCH_MP_TAC PATH_INTEGRABLE_COMPLEX_LMUL THEN
8396     ASM_SIMP_TAC[CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH; CENTRE_IN_BALL];
8397     ALL_TAC] THEN
8398   X_GEN_TAC `e:real` THEN STRIP_TAC THEN
8399   ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE; IN_ELIM_THM] THEN
8400   SIMP_TAC[VSUM_COMPLEX_LMUL; FINITE_NUMSEG; complex_div] THEN
8401   REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB; COMPLEX_NORM_MUL] THEN
8402   REWRITE_TAC[COMPLEX_POW_ADD; COMPLEX_INV_MUL; COMPLEX_POW_1] THEN
8403   SIMP_TAC[COMPLEX_MUL_ASSOC; VSUM_COMPLEX_RMUL; FINITE_NUMSEG] THEN
8404   REWRITE_TAC[GSYM complex_div; GSYM COMPLEX_POW_DIV] THEN
8405   REWRITE_TAC[VSUM_GP; CONJUNCT1 LT; CONJUNCT1 complex_pow] THEN
8406   REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
8407   SUBGOAL_THEN
8408    `?B. &0 < B /\
8409         !u:complex. u IN cball(z,r) ==> norm(f u:complex) <= B`
8410   STRIP_ASSUME_TAC THENL
8411    [MP_TAC(ISPEC `IMAGE (f:complex->complex) (cball(z,r))`
8412       COMPACT_IMP_BOUNDED) THEN
8413     ASM_SIMP_TAC[COMPACT_CONTINUOUS_IMAGE; COMPACT_CBALL] THEN
8414     REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE];
8415     ALL_TAC] THEN
8416   SUBGOAL_THEN `?k. &0 < k /\ k <= r /\ norm(w - z) <= r - k /\
8417                     !u. norm(u - z) = r ==> k <= norm(u - w)`
8418   STRIP_ASSUME_TAC THENL
8419    [EXISTS_TAC `r - dist(z:complex,w)` THEN
8420     REPEAT(POP_ASSUM MP_TAC) THEN REWRITE_TAC[IN_BALL] THEN
8421     NORM_ARITH_TAC;
8422     ALL_TAC] THEN
8423   REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(z,x) = r <=> norm(x - z) = r`] THEN
8424   MP_TAC(SPECL [`(r - k) / r:real`; `e / B * k:real`] REAL_ARCH_POW_INV) THEN
8425   ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_LT_DIV; REAL_HALF; REAL_LT_MUL] THEN
8426   ASM_REWRITE_TAC[REAL_ARITH `r - k < &1 * r <=> &0 < k`] THEN
8427   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN
8428   X_GEN_TAC `n:num` THEN DISCH_TAC THEN
8429   X_GEN_TAC `u:complex` THEN DISCH_TAC THEN
8430   SUBGOAL_THEN `~(u:complex = z) /\ ~(u = w)` STRIP_ASSUME_TAC THENL
8431    [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
8432     MAP_EVERY UNDISCH_TAC [`&0 < r`; `norm(u - z:complex) = r`] THEN
8433     NORM_ARITH_TAC;
8434     ALL_TAC] THEN
8435   ASM_SIMP_TAC[COMPLEX_FIELD
8436    `~(u = z) /\ ~(u = w) ==> ~((w - z) / (u - z) = Cx(&1))`] THEN
8437   ASM_SIMP_TAC[COMPLEX_FIELD
8438    `~(u = z) /\ ~(u = w)
8439     ==> x / (Cx(&1) - (w - z) / (u - z)) / (u - z) = x / (u - w)`] THEN
8440   ASM_SIMP_TAC[COMPLEX_FIELD
8441    `~(u = w)
8442     ==> (Cx(&1) - e) / (u - w) - inv(u - w) = --(e / (u - w))`] THEN
8443   REWRITE_TAC[COMPLEX_NORM_DIV; NORM_NEG; COMPLEX_NORM_POW] THEN
8444   MATCH_MP_TAC REAL_LET_TRANS THEN
8445   EXISTS_TAC `B * ((r - k) / r) pow N / k:real` THEN CONJ_TAC THENL
8446    [ALL_TAC;
8447     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
8448     ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_LT_LDIV_EQ]] THEN
8449   MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_SIMP_TAC[NORM_POS_LE] THEN
8450   REPEAT CONJ_TAC THENL
8451    [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_CBALL] THEN
8452     ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[dist; REAL_LE_REFL];
8453     MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[NORM_POS_LE] THEN
8454     MATCH_MP_TAC REAL_POW_LE THEN MATCH_MP_TAC REAL_LE_DIV THEN
8455     ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE];
8456     ALL_TAC] THEN
8457   REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
8458   REWRITE_TAC[GSYM real_div] THEN REPEAT CONJ_TAC THENL
8459    [MATCH_MP_TAC REAL_POW_LE THEN MATCH_MP_TAC REAL_LE_DIV THEN
8460     ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE];
8461     ALL_TAC;
8462     REWRITE_TAC[REAL_LE_INV_EQ; NORM_POS_LE];
8463     MATCH_MP_TAC REAL_LE_INV2 THEN ASM_SIMP_TAC[]] THEN
8464   MATCH_MP_TAC REAL_LE_TRANS THEN
8465   EXISTS_TAC `((r - k) / r:real) pow (SUC n)` THEN CONJ_TAC THENL
8466    [MATCH_MP_TAC REAL_POW_LE2 THEN
8467     ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LE_DIV; NORM_POS_LE; REAL_LT_IMP_LE];
8468     MATCH_MP_TAC REAL_POW_MONO_INV THEN
8469     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ] THEN
8470     ASM_SIMP_TAC[ARITH_RULE `N <= n ==> N <= SUC n`] THEN
8471     ASM_REAL_ARITH_TAC]);;
8472
8473 (* ------------------------------------------------------------------------- *)
8474 (* Liouville's theorem.                                                      *)
8475 (* ------------------------------------------------------------------------- *)
8476
8477 let LIOUVILLE_THEOREM = prove
8478  (`!f. f holomorphic_on (:complex) /\ bounded (IMAGE f (:complex))
8479        ==> ?c. !z. f(z) = c`,
8480   GEN_TAC THEN
8481   SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_UNIV; BOUNDED_POS; IN_UNIV;
8482            FORALL_IN_IMAGE; SKOLEM_THM] THEN
8483   DISCH_THEN(CONJUNCTS_THEN2 (X_CHOOSE_TAC `f':complex->complex`)
8484                (X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC)) THEN
8485   SUBGOAL_THEN `!w. w IN (:complex) ==> f w:complex = f z`
8486    (fun th -> MESON_TAC[th; IN_UNIV]) THEN
8487   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_ZERO_UNIQUE THEN
8488   EXISTS_TAC `z:complex` THEN
8489   REWRITE_TAC[IN_UNIV; CONVEX_UNIV; WITHIN_UNIV] THEN
8490   X_GEN_TAC `w:complex` THEN
8491   SUBGOAL_THEN `(f':complex->complex) w = Cx(&0)`
8492    (fun th -> ASM_MESON_TAC[th]) THEN
8493   REWRITE_TAC[GSYM COMPLEX_NORM_ZERO] THEN
8494   MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ ~(&0 < x) ==> x = &0`) THEN
8495   REWRITE_TAC[NORM_POS_LE] THEN DISCH_TAC THEN
8496   SUBGOAL_THEN `?R. &0 < R /\ B / R < norm((f':complex->complex) w)`
8497   STRIP_ASSUME_TAC THENL
8498    [EXISTS_TAC `&2 * B / norm((f':complex->complex) w)` THEN
8499     ASM_SIMP_TAC[REAL_LT_DIV; REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
8500     REWRITE_TAC[real_div; REAL_INV_MUL; REAL_INV_INV; GSYM REAL_MUL_ASSOC] THEN
8501     ASM_SIMP_TAC[REAL_FIELD
8502      `&0 < B ==> B * inv(&2) * inv(B) * c = c / &2`] THEN
8503     ASM_REAL_ARITH_TAC;
8504     ALL_TAC] THEN
8505   MP_TAC(SPECL [`f:complex->complex`; `w:complex`;
8506                 `R:real`; `w:complex`]
8507                CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH) THEN
8508   ANTS_TAC THENL
8509    [ASM_SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN; HOLOMORPHIC_ON_OPEN;
8510                  OPEN_BALL; CENTRE_IN_BALL; REAL_LT_DIV; REAL_HALF] THEN
8511     ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_IMP_CONTINUOUS_AT;
8512                   CONTINUOUS_AT_WITHIN];
8513     ALL_TAC] THEN
8514   STRIP_TAC THEN
8515   FIRST_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRAL) THEN
8516   DISCH_THEN(MP_TAC o SPEC `B:real / R pow 2` o MATCH_MP
8517    (ONCE_REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH)) THEN
8518   ASM_SIMP_TAC[REAL_LT_DIV; REAL_LT_IMP_LE; REAL_POW_LT] THEN
8519   ASM_SIMP_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_POW; REAL_LE_DIV2_EQ;
8520                REAL_POW_LT; REAL_NOT_LE] THEN
8521   MATCH_MP_TAC REAL_LT_LCANCEL_IMP THEN
8522   EXISTS_TAC `norm(Cx(&1) / (Cx (&2) * Cx pi * ii))` THEN
8523   REWRITE_TAC[GSYM COMPLEX_NORM_MUL] THEN
8524   SUBGOAL_THEN
8525    `Cx(&1) / (Cx(&2) * Cx pi * ii) *
8526     path_integral (circlepath (w,R)) (\u. f u / (u - w) pow 2) =
8527     f' w`
8528   SUBST1_TAC THENL [ASM_MESON_TAC[COMPLEX_DERIVATIVE_UNIQUE_AT]; ALL_TAC] THEN
8529   REWRITE_TAC[COMPLEX_NORM_NZ] THEN
8530   ASM_SIMP_TAC[CX_2PII_NZ;
8531     COMPLEX_FIELD `~(y = Cx(&0)) ==> ~(Cx(&1) / y = Cx(&0))`] THEN
8532   REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
8533   REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_PI; COMPLEX_NORM_II] THEN
8534   ASM_SIMP_TAC[PI_POS; REAL_FIELD
8535    `&0 < R /\ &0 < pi
8536    ==> &1 / (&2 * pi * &1) * B / R pow 2 * &2 * pi * R = B / R`]);;
8537
8538 (* ------------------------------------------------------------------------- *)
8539 (* These weaker versions don't even need the derivative formula.             *)
8540 (* ------------------------------------------------------------------------- *)
8541
8542 let LIOUVILLE_WEAK = prove
8543  (`!f. f holomorphic_on (:complex) /\ (f --> Cx(&0)) at_infinity
8544        ==> !z. f(z) = Cx(&0)`,
8545   REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[TAUT `p = ~ ~ p`] THEN
8546   PURE_REWRITE_TAC[GSYM COMPLEX_NORM_NZ] THEN DISCH_TAC THEN
8547   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [LIM_AT_INFINITY]) THEN
8548   DISCH_THEN(MP_TAC o SPEC `norm((f:complex->complex) z) / &2`) THEN
8549   ASM_REWRITE_TAC[dist; REAL_HALF; COMPLEX_SUB_RZERO] THEN
8550   DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
8551   MP_TAC(SPECL [`f:complex->complex`; `z:complex`;
8552                 `&1 + abs B + norm(z:complex)`; `z:complex`]
8553                 CAUCHY_INTEGRAL_CIRCLEPATH) THEN
8554   ASM_SIMP_TAC[CONVEX_UNIV; INTERIOR_OPEN; OPEN_UNIV; IN_UNIV] THEN
8555   ABBREV_TAC `R = &1 + abs B + norm(z:complex)` THEN
8556   SUBGOAL_THEN `&0 < R` ASSUME_TAC THENL
8557    [ASM_MESON_TAC[NORM_POS_LE; REAL_ABS_POS; REAL_ARITH
8558      `&0 <= x /\ &0 <= y ==> &0 < &1 + x + y`]; ALL_TAC] THEN
8559   ASM_REWRITE_TAC[CENTRE_IN_BALL; NOT_IMP; CONJ_ASSOC] THEN CONJ_TAC THENL
8560    [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
8561                   SUBSET_UNIV];
8562     ALL_TAC] THEN
8563   DISCH_THEN(MP_TAC o MATCH_MP
8564    (ONCE_REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH)) THEN
8565   DISCH_THEN(MP_TAC o SPEC `norm((f:complex->complex) z) / &2 / R`) THEN
8566   ASM_SIMP_TAC[REAL_LE_DIV; NORM_POS_LE; REAL_POS; REAL_LT_IMP_LE] THEN
8567   ASM_SIMP_TAC[REAL_FIELD `&0 < R ==> x / R * &2 * pi * R = &2 * pi * x`] THEN
8568   REWRITE_TAC[NOT_IMP; REAL_NOT_LE] THEN CONJ_TAC THENL
8569    [REPEAT STRIP_TAC THEN ASM_SIMP_TAC[COMPLEX_NORM_DIV; REAL_LE_DIV2_EQ] THEN
8570     MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
8571     UNDISCH_TAC `norm(x - z:complex) = R` THEN EXPAND_TAC "R" THEN
8572     MATCH_MP_TAC(REAL_ARITH
8573      `d <= x + z ==> d = &1 + abs b + z ==> x >= b`) THEN
8574     REWRITE_TAC[VECTOR_SUB] THEN MESON_TAC[NORM_TRIANGLE; NORM_NEG];
8575     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_ABS_PI;
8576                 COMPLEX_NORM_II] THEN
8577     SIMP_TAC[REAL_LT_LMUL_EQ; REAL_OF_NUM_LT; ARITH; PI_POS; REAL_MUL_LID] THEN
8578     SUBGOAL_THEN `?w:complex. norm w = abs B` MP_TAC THENL
8579      [MESON_TAC[VECTOR_CHOOSE_SIZE; REAL_ABS_POS]; ALL_TAC] THEN
8580     ASM_MESON_TAC[NORM_POS_LE; REAL_ARITH
8581      `abs B >= B /\ (&0 <= x /\ x < z / &2 ==> z / &2 < z)`]]);;
8582
8583 let LIOUVILLE_WEAK_INVERSE = prove
8584  (`!f. f holomorphic_on (:complex) /\
8585        (!B. eventually (\x. norm(f x) >= B) at_infinity)
8586        ==> ?z. f(z) = Cx(&0)`,
8587   REPEAT STRIP_TAC THEN MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN
8588   PURE_REWRITE_TAC[NOT_EXISTS_THM] THEN DISCH_TAC THEN
8589   MP_TAC(SPEC `\x:complex. Cx(&1) / (f(x))` LIOUVILLE_WEAK) THEN
8590   ASM_SIMP_TAC[COMPLEX_FIELD `~(y = Cx(&0)) ==> ~(Cx(&1) / y = Cx(&0))`] THEN
8591   CONJ_TAC THENL
8592    [REWRITE_TAC[holomorphic_on; complex_div; COMPLEX_MUL_LID; IN_UNIV] THEN
8593     GEN_TAC THEN REWRITE_TAC[GSYM complex_differentiable; WITHIN_UNIV] THEN
8594     MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_INV_AT THEN ASM_REWRITE_TAC[] THEN
8595     ASM_MESON_TAC[OPEN_UNIV; HOLOMORPHIC_ON_OPEN; IN_UNIV;
8596                   complex_differentiable];
8597     REWRITE_TAC[tendsto] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
8598     FIRST_X_ASSUM(MP_TAC o SPEC `&2/ e`) THEN
8599     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8600     REWRITE_TAC[dist; COMPLEX_SUB_RZERO; real_ge; COMPLEX_NORM_DIV;
8601                 COMPLEX_NORM_CX; REAL_ABS_POS] THEN
8602     ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_LE_LDIV_EQ; COMPLEX_NORM_NZ] THEN
8603     REAL_ARITH_TAC]);;
8604
8605 (* ------------------------------------------------------------------------- *)
8606 (* In particular we get the Fundamental Theorem of Algebra.                  *)
8607 (* ------------------------------------------------------------------------- *)
8608
8609 let FTA = prove
8610  (`!a n. a(0) = Cx(&0) \/ ~(!k. k IN 1..n ==> a(k) = Cx(&0))
8611          ==> ?z. vsum(0..n) (\i. a(i) * z pow i) = Cx(&0)`,
8612   REPEAT STRIP_TAC THENL
8613    [EXISTS_TAC `Cx(&0)` THEN
8614     SIMP_TAC[VSUM_CLAUSES_LEFT; LE_0] THEN
8615     ASM_SIMP_TAC[ADD_CLAUSES; COMPLEX_POW_ZERO; LE_1; COMPLEX_ADD_LID;
8616                  COMPLEX_MUL_RZERO; COMPLEX_MUL_LZERO] THEN
8617     REWRITE_TAC[GSYM COMPLEX_VEC_0; VSUM_0];
8618     MATCH_MP_TAC LIOUVILLE_WEAK_INVERSE THEN CONJ_TAC THENL
8619      [MATCH_MP_TAC HOLOMORPHIC_ON_VSUM THEN
8620       SIMP_TAC[FINITE_NUMSEG; HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_MUL;
8621                HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID];
8622       ASM_MESON_TAC[COMPLEX_POLYFUN_EXTREMAL]]]);;
8623
8624 (* ------------------------------------------------------------------------- *)
8625 (* Weierstrass convergence theorem.                                          *)
8626 (* ------------------------------------------------------------------------- *)
8627
8628 let HOLOMORPHIC_UNIFORM_LIMIT = prove
8629  (`!net:(A net) f g z r.
8630         ~(trivial_limit net) /\
8631         eventually
8632            (\n. (f n) continuous_on cball(z,r) /\
8633                 (f n) holomorphic_on ball(z,r))
8634            net /\
8635         (!e. &0 < e
8636              ==> eventually (\n. !x. x IN cball(z,r) ==> norm(f n x - g x) < e)
8637                             net)
8638         ==> g continuous_on cball(z,r) /\ g holomorphic_on ball(z,r)`,
8639   REPEAT GEN_TAC THEN STRIP_TAC THEN
8640   DISJ_CASES_TAC(REAL_ARITH `r <= &0 \/ &0 < r`) THENL
8641    [ASM_SIMP_TAC[BALL_EMPTY; holomorphic_on; NOT_IN_EMPTY] THEN
8642     FIRST_X_ASSUM(DISJ_CASES_TAC o MATCH_MP (REAL_ARITH
8643      `r <= &0 ==> r < &0 \/ r = &0`)) THEN
8644     ASM_SIMP_TAC[continuous_on; CBALL_EMPTY; CBALL_SING; NOT_IN_EMPTY] THEN
8645     SIMP_TAC[IN_SING; DIST_REFL] THEN MESON_TAC[REAL_LT_01];
8646     ALL_TAC] THEN
8647   MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
8648    [MATCH_MP_TAC CONTINUOUS_UNIFORM_LIMIT THEN
8649     MAP_EVERY EXISTS_TAC [`net:A net`; `f:A->complex->complex`] THEN
8650     RULE_ASSUM_TAC(REWRITE_RULE[EVENTUALLY_AND]) THEN
8651     ASM_REWRITE_TAC[];
8652     ALL_TAC] THEN
8653   DISCH_TAC THEN
8654   MP_TAC(ISPECL
8655    [`\x. Cx(&1) / (Cx(&2) * Cx pi * ii) * g(x:complex)`;
8656     `g:complex->complex`; `z:complex`; `r:real`; `1`]
8657      CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
8658   SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8659   ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
8660   REWRITE_TAC[ARITH] THEN CONJ_TAC THENL
8661    [MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
8662     REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
8663     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8664     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8665     EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
8666     SIMP_TAC[SPHERE_SUBSET_CBALL];
8667     ALL_TAC] THEN
8668   X_GEN_TAC `w:complex` THEN DISCH_TAC THEN REWRITE_TAC[COMPLEX_POW_1] THEN
8669   REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC] THEN
8670   REWRITE_TAC[GSYM complex_div] THEN REWRITE_TAC[COMPLEX_MUL_ASSOC] THEN
8671   REWRITE_TAC[GSYM complex_div] THEN REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC] THEN
8672   SUBGOAL_THEN
8673    `(\u. g u / (u - w)) path_integrable_on circlepath(z,r) /\
8674     ((\n:A. path_integral(circlepath(z,r))
8675             (\u. f n u / (u - w))) -->
8676      path_integral(circlepath(z,r)) (\u. g u / (u - w))) net`
8677   MP_TAC THENL
8678    [MATCH_MP_TAC PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH THEN
8679     ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8680      [FIRST_X_ASSUM(fun th -> MP_TAC th THEN
8681         MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO)) THEN
8682       X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8683       MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_CIRCLEPATH THEN
8684       ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8685       REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8686       MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN CONJ_TAC THENL
8687        [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8688         EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
8689         SIMP_TAC[SUBSET; IN_CBALL; IN_ELIM_THM; NORM_SUB; dist; REAL_LE_REFL];
8690         ALL_TAC] THEN
8691       ASM_SIMP_TAC[CONTINUOUS_ON_COMPLEX_POW; CONTINUOUS_ON_SUB;
8692                    CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
8693       REWRITE_TAC[COMPLEX_POW_EQ_0; ARITH; IN_ELIM_THM] THEN
8694       GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
8695       SIMP_TAC[COMPLEX_SUB_0] THEN DISCH_THEN SUBST_ALL_TAC THEN
8696       ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8697       ALL_TAC] THEN
8698     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
8699     FIRST_X_ASSUM(MP_TAC o SPEC `e * abs(r - norm(w - z:complex))`) THEN
8700     SUBGOAL_THEN `&0 < e * abs(r - norm(w - z:complex))` ASSUME_TAC THENL
8701      [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[GSYM REAL_ABS_NZ] THEN
8702       SIMP_TAC[REAL_SUB_0] THEN
8703       ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8704       ALL_TAC] THEN
8705     ASM_REWRITE_TAC[] THEN
8706     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8707     X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN
8708     MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `x:complex` THEN
8709     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8710     REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8711     REWRITE_TAC[IN_ELIM_THM] THEN
8712     DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
8713     ASM_REWRITE_TAC[IN_CBALL] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
8714     ASM_REWRITE_TAC[dist; REAL_LE_REFL] THEN
8715     SUBGOAL_THEN `~(x:complex = w)` ASSUME_TAC THENL
8716      [DISCH_THEN SUBST_ALL_TAC THEN
8717       ASM_MESON_TAC[IN_BALL; dist; NORM_SUB; REAL_LT_REFL];
8718       ALL_TAC] THEN
8719     ASM_SIMP_TAC[COMPLEX_FIELD
8720      `~(x = w) ==> a / (x - w) - b / (x - w) =
8721                    (a - b:complex) / (x - w)`] THEN
8722     ASM_SIMP_TAC[COMPLEX_NORM_DIV; REAL_LT_LDIV_EQ; COMPLEX_NORM_NZ;
8723                  COMPLEX_POW_EQ_0; COMPLEX_SUB_0] THEN
8724     MATCH_MP_TAC(REAL_ARITH `a <= b ==> x < a ==> x < b`) THEN
8725     ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_LT_IMP_LE; COMPLEX_NORM_POW] THEN
8726     MATCH_MP_TAC(REAL_ARITH `w < r /\ r <= x + w ==> abs(r - w) <= x`) THEN
8727     CONJ_TAC THENL [ASM_MESON_TAC[IN_BALL; dist; NORM_SUB]; ALL_TAC] THEN
8728     FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
8729     REWRITE_TAC[GSYM dist] THEN MESON_TAC[DIST_TRIANGLE];
8730     ALL_TAC] THEN
8731   STRIP_TAC THEN
8732   FIRST_X_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRAL) THEN
8733   DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
8734     MATCH_MP HAS_PATH_INTEGRAL_COMPLEX_LMUL) THEN
8735   MATCH_MP_TAC EQ_IMP THEN REWRITE_TAC[] THEN AP_THM_TAC THEN AP_TERM_TAC THEN
8736   MATCH_MP_TAC LIM_UNIQUE THEN
8737   MAP_EVERY EXISTS_TAC [`net:A net`; `\n. (f:A->complex->complex) n w`] THEN
8738   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8739    [ALL_TAC;
8740     REWRITE_TAC[tendsto; dist] THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
8741     FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
8742     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8743     REWRITE_TAC[] THEN ASM_MESON_TAC[SUBSET; BALL_SUBSET_CBALL]] THEN
8744   SUBGOAL_THEN
8745    `((\n:A. Cx(&2) * Cx pi * ii * f n w)
8746      --> path_integral (circlepath (z,r)) (\u. g u / (u - w))) net`
8747   MP_TAC THENL
8748    [MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN EXISTS_TAC
8749      `\n:A. path_integral (circlepath (z,r)) (\u. f n u / (u - w))` THEN
8750     ASM_REWRITE_TAC[] THEN
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_INTEGRAL_UNIQUE THEN
8755     MATCH_MP_TAC CAUCHY_INTEGRAL_CIRCLEPATH THEN
8756     ASM_REWRITE_TAC[ETA_AX];
8757     ALL_TAC] THEN
8758   DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
8759     MATCH_MP LIM_COMPLEX_LMUL) THEN
8760   SIMP_TAC[CX_2PII_NZ; COMPLEX_FIELD
8761    `~(x * y * z = Cx(&0)) ==> Cx(&1) / (x * y * z) * x * y * z * w = w`]);;
8762
8763 (* ------------------------------------------------------------------------- *)
8764 (* Version showing that the limit is the limit of the derivatives.           *)
8765 (* ------------------------------------------------------------------------- *)
8766
8767 let HAS_COMPLEX_DERIVATIVE_UNIFORM_LIMIT = prove
8768  (`!net:(A net) f f' g z r.
8769         &0 < r /\ ~(trivial_limit net) /\
8770         eventually
8771           (\n. (f n) continuous_on cball(z,r) /\
8772                (!w. w IN ball(z,r)
8773                     ==> ((f n) has_complex_derivative (f' n w)) (at w)))
8774           net /\
8775         (!e. &0 < e
8776              ==> eventually (\n. !x. x IN cball(z,r) ==> norm(f n x - g x) < e)
8777                             net)
8778         ==> g continuous_on cball(z,r) /\
8779             ?g'. !w. w IN ball(z,r)
8780                      ==> (g has_complex_derivative (g' w)) (at w) /\
8781                          ((\n. f' n w) --> g' w) net`,
8782   REPEAT GEN_TAC THEN STRIP_TAC THEN
8783   MP_TAC(SPECL [`net:(A)net`; `f:A->complex->complex`;
8784                 `g:complex->complex`; `z:complex`; `r:real`]
8785                HOLOMORPHIC_UNIFORM_LIMIT) THEN
8786   ANTS_TAC THENL
8787    [ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(fun th ->
8788       MP_TAC th THEN MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ]
8789         EVENTUALLY_MONO)) THEN
8790     SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN MESON_TAC[];
8791     ALL_TAC] THEN
8792   SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8793   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC
8794     (MP_TAC o REWRITE_RULE[RIGHT_IMP_EXISTS_THM])) THEN
8795   REWRITE_TAC[SKOLEM_THM] THEN MATCH_MP_TAC MONO_EXISTS THEN
8796   X_GEN_TAC `g':complex->complex` THEN STRIP_TAC THEN
8797   ASM_SIMP_TAC[] THEN X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
8798   ONCE_REWRITE_TAC[LIM_NULL] THEN MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
8799   EXISTS_TAC
8800    `\n. Cx(&1) / (Cx(&2) * Cx pi * ii) *
8801         (path_integral(circlepath(z,r)) (\x. f (n:A) x / (x - w) pow 2) -
8802          path_integral(circlepath(z,r)) (\x. g x / (x - w) pow 2))` THEN
8803   REWRITE_TAC[] THEN CONJ_TAC THENL
8804    [FIRST_X_ASSUM(fun th ->
8805       MP_TAC th THEN MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ]
8806         EVENTUALLY_MONO)) THEN
8807     X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8808     REWRITE_TAC[COMPLEX_SUB_LDISTRIB] THEN BINOP_TAC THEN
8809     MATCH_MP_TAC COMPLEX_DERIVATIVE_UNIQUE_AT THENL
8810      [EXISTS_TAC `(f:A->complex->complex) a`;
8811       EXISTS_TAC `g:complex->complex`] THEN
8812     EXISTS_TAC `w:complex` THEN ASM_SIMP_TAC[] THEN
8813     W(fun (asl,w) -> MP_TAC(PART_MATCH (rand o rand)
8814       CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH w)) THEN
8815     ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8816     ANTS_TAC THEN SIMP_TAC[] THEN ASM_MESON_TAC[];
8817     ALL_TAC] THEN
8818   REWRITE_TAC[COMPLEX_VEC_0] THEN
8819   SUBST1_TAC(SYM(SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` COMPLEX_MUL_RZERO)) THEN
8820   MATCH_MP_TAC LIM_COMPLEX_MUL THEN REWRITE_TAC[LIM_CONST] THEN
8821   REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN REWRITE_TAC[GSYM LIM_NULL] THEN
8822   W(fun (asl,w) -> MP_TAC(PART_MATCH (rand o rand)
8823       PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH w)) THEN
8824   ANTS_TAC THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL
8825    [FIRST_X_ASSUM(fun th -> MP_TAC th THEN
8826       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO)) THEN
8827     X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8828     MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_CIRCLEPATH THEN
8829     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8830     REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8831     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN CONJ_TAC THENL
8832      [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8833       EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
8834       SIMP_TAC[SUBSET; IN_CBALL; IN_ELIM_THM; NORM_SUB; dist; REAL_LE_REFL];
8835       ALL_TAC] THEN
8836     ASM_SIMP_TAC[CONTINUOUS_ON_COMPLEX_POW; CONTINUOUS_ON_SUB;
8837                  CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
8838     REWRITE_TAC[COMPLEX_POW_EQ_0; ARITH; IN_ELIM_THM] THEN
8839     GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
8840     SIMP_TAC[COMPLEX_SUB_0] THEN DISCH_THEN SUBST_ALL_TAC THEN
8841     ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8842     ALL_TAC] THEN
8843   X_GEN_TAC `e:real` THEN DISCH_TAC THEN
8844   FIRST_X_ASSUM(MP_TAC o SPEC `e * abs(r - norm(w - z:complex)) pow 2`) THEN
8845   SUBGOAL_THEN `&0 < e * abs(r - norm(w - z:complex)) pow 2` ASSUME_TAC THENL
8846    [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[] THEN
8847     MATCH_MP_TAC REAL_POW_LT THEN REWRITE_TAC[GSYM REAL_ABS_NZ] THEN
8848     SIMP_TAC[REAL_SUB_0] THEN
8849     ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8850     ALL_TAC] THEN
8851   ASM_REWRITE_TAC[] THEN
8852   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8853   X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN
8854   MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `x:complex` THEN
8855   ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8856   REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8857   REWRITE_TAC[IN_ELIM_THM] THEN
8858   DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
8859   ASM_REWRITE_TAC[IN_CBALL] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
8860   ASM_REWRITE_TAC[dist; REAL_LE_REFL] THEN
8861   SUBGOAL_THEN `~(x:complex = w)` ASSUME_TAC THENL
8862    [DISCH_THEN SUBST_ALL_TAC THEN
8863     ASM_MESON_TAC[IN_BALL; dist; NORM_SUB; REAL_LT_REFL];
8864     ALL_TAC] THEN
8865   ASM_SIMP_TAC[COMPLEX_FIELD
8866    `~(x = w) ==> a / (x - w) pow 2 - b / (x - w) pow 2 =
8867                  (a - b:complex) / (x - w) pow 2`] THEN
8868   ASM_SIMP_TAC[COMPLEX_NORM_DIV; REAL_LT_LDIV_EQ; COMPLEX_NORM_NZ;
8869                COMPLEX_POW_EQ_0; COMPLEX_SUB_0] THEN
8870   MATCH_MP_TAC(REAL_ARITH `a <= b ==> x < a ==> x < b`) THEN
8871   ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_LT_IMP_LE; COMPLEX_NORM_POW] THEN
8872   MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN
8873   MATCH_MP_TAC(REAL_ARITH `w < r /\ r <= x + w ==> abs(r - w) <= x`) THEN
8874   CONJ_TAC THENL [ASM_MESON_TAC[IN_BALL; dist; NORM_SUB]; ALL_TAC] THEN
8875   FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
8876   REWRITE_TAC[GSYM dist] THEN MESON_TAC[DIST_TRIANGLE]);;
8877
8878 (* ------------------------------------------------------------------------- *)
8879 (* Some more simple/convenient versions for applications.                    *)
8880 (* ------------------------------------------------------------------------- *)
8881
8882 let HOLOMORPHIC_UNIFORM_SEQUENCE = prove
8883  (`!f g s.
8884         open s /\
8885         (!n. (f n) holomorphic_on s) /\
8886         (!x. x IN s
8887              ==> ?d. &0 < d /\ cball(x,d) SUBSET s /\
8888                      !e. &0 < e
8889                          ==> eventually (\n. !y. y IN cball(x,d)
8890                                                  ==> norm(f n y - g y) < e)
8891                                         sequentially)
8892         ==> g holomorphic_on s`,
8893   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN] THEN
8894   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8895   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
8896   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
8897   MP_TAC(ISPECL [`sequentially`; `f:num->complex->complex`;
8898                  `g:complex->complex`; `z:complex`; `r:real`]
8899                 HOLOMORPHIC_UNIFORM_LIMIT) THEN
8900   ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN ANTS_TAC THENL
8901    [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
8902     ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
8903                   BALL_SUBSET_CBALL];
8904     SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8905     ASM_MESON_TAC[CENTRE_IN_BALL]]);;
8906
8907 let HAS_COMPLEX_DERIVATIVE_UNIFORM_SEQUENCE = prove
8908  (`!f f' g s.
8909         open s /\
8910         (!n x. x IN s ==> ((f n) has_complex_derivative f' n x) (at x)) /\
8911         (!x. x IN s
8912              ==> ?d. &0 < d /\ cball(x,d) SUBSET s /\
8913                      !e. &0 < e
8914                          ==> eventually (\n. !y. y IN cball(x,d)
8915                                                  ==> norm(f n y - g y) < e)
8916                                         sequentially)
8917         ==> ?g'. !x. x IN s ==> (g has_complex_derivative g'(x)) (at x) /\
8918                                 ((\n. f' n x) --> g'(x)) sequentially`,
8919   REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_EXISTS_IMP_THM] THEN
8920   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8921   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
8922   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
8923   MP_TAC(ISPECL [`sequentially`; `f:num->complex->complex`;
8924                  `f':num->complex->complex`;
8925                  `g:complex->complex`; `z:complex`; `r:real`]
8926                 HAS_COMPLEX_DERIVATIVE_UNIFORM_LIMIT) THEN
8927   ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN ANTS_TAC THENL
8928    [ALL_TAC; ASM_MESON_TAC[CENTRE_IN_BALL]] THEN
8929   MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN
8930   REWRITE_TAC[] THEN CONJ_TAC THENL
8931    [MATCH_MP_TAC CONTINUOUS_AT_IMP_CONTINUOUS_ON THEN
8932     ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_IMP_CONTINUOUS_AT; SUBSET];
8933     ASM_MESON_TAC[BALL_SUBSET_CBALL; SUBSET]]);;
8934
8935 (* ------------------------------------------------------------------------- *)
8936 (* A one-stop shop for an analytic function defined by a series.             *)
8937 (* ------------------------------------------------------------------------- *)
8938
8939 let SERIES_AND_DERIVATIVE_COMPARISON = prove
8940  (`!f f' s k h.
8941      open s /\
8942      (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
8943      (?l. (lift o h sums l) k) /\
8944      (?N. !n x. N <= n /\ n IN k /\ x IN s ==> norm(f n x) <= h n)
8945           ==> ?g g'. !x. x IN s
8946                          ==> ((\n. f n x) sums g x) k /\
8947                              ((\n. f' n x) sums g' x) k /\
8948                              (g has_complex_derivative g' x) (at x)`,
8949   REPEAT GEN_TAC THEN
8950   REPLICATE_TAC 2 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
8951   DISCH_THEN(MP_TAC o MATCH_MP SERIES_COMPARISON_UNIFORM) THEN
8952   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
8953   REWRITE_TAC[] THEN DISCH_TAC THEN
8954   REWRITE_TAC[TAUT `a ==> b /\ c /\ d <=> (a ==> b) /\ (a ==> d /\ c)`] THEN
8955   REWRITE_TAC[FORALL_AND_THM; RIGHT_EXISTS_AND_THM] THEN CONJ_TAC THENL
8956    [REWRITE_TAC[sums; LIM_SEQUENTIALLY] THEN ASM_MESON_TAC[]; ALL_TAC] THEN
8957   REWRITE_TAC[sums] THEN
8958   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_UNIFORM_SEQUENCE THEN
8959   EXISTS_TAC `\n x. vsum
8960     (k INTER (0..n)) (\n. (f:num->complex->complex) n x)` THEN
8961   ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_VSUM; FINITE_INTER_NUMSEG; IN_INTER] THEN
8962   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8963   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
8964   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[GSYM dist] THEN
8965   MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[EVENTUALLY_SEQUENTIALLY] THEN
8966   ASM_MESON_TAC[SUBSET]);;
8967
8968 (* ------------------------------------------------------------------------- *)
8969 (* A version where we only have local uniform/comparative convergence.       *)
8970 (* ------------------------------------------------------------------------- *)
8971
8972 let SERIES_AND_DERIVATIVE_COMPARISON_LOCAL = prove
8973  (`!f f' s k.
8974      open s /\
8975      (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
8976      (!x. x IN s
8977           ==> ?d h N. &0 < d /\ (?l. (lift o h sums l) k) /\
8978                       !n y. N <= n /\ n IN k /\ y IN ball(x,d)
8979                                ==> norm(f n y) <= h n)
8980      ==> ?g g'. !x. x IN s
8981                     ==> ((\n. f n x) sums g x) k /\
8982                         ((\n. f' n x) sums g' x) k /\
8983                         (g has_complex_derivative g' x) (at x)`,
8984   REPEAT STRIP_TAC THEN
8985   EXISTS_TAC `\x. infsum k (\n. (f:num->complex->complex) n x)` THEN
8986   REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_EXISTS_IMP_THM] THEN
8987   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8988   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
8989   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
8990   MAP_EVERY X_GEN_TAC [`d:real`; `h:num->real`; `N:num`] THEN
8991   DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
8992   MP_TAC(ISPECL [`f:num->complex->complex`; `f':num->complex->complex`;
8993                  `ball(z:complex,d) INTER s`; `k:num->bool`; `h:num->real`]
8994                 SERIES_AND_DERIVATIVE_COMPARISON) THEN
8995   ASM_SIMP_TAC[OPEN_INTER; OPEN_BALL; IN_INTER] THEN
8996   ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
8997   DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` MP_TAC) THEN
8998   ONCE_REWRITE_TAC[TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
8999   REWRITE_TAC[FORALL_AND_THM; RIGHT_EXISTS_AND_THM] THEN
9000   DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
9001   REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_AND_EXISTS_THM] THEN
9002   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
9003   MATCH_MP_TAC MONO_EXISTS THEN ASM_SIMP_TAC[CENTRE_IN_BALL] THEN
9004   X_GEN_TAC `g':complex` THEN REPEAT STRIP_TAC THENL
9005    [ASM_MESON_TAC[SUMS_INFSUM; CENTRE_IN_BALL; summable]; ALL_TAC] THEN
9006   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_AT THEN
9007   EXISTS_TAC `g:complex->complex` THEN
9008   MP_TAC(ISPEC `ball(z:complex,d) INTER s` OPEN_CONTAINS_BALL) THEN
9009   ASM_SIMP_TAC[OPEN_INTER; OPEN_BALL] THEN
9010   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
9011   ASM_REWRITE_TAC[IN_INTER; CENTRE_IN_BALL] THEN MATCH_MP_TAC MONO_EXISTS THEN
9012   REWRITE_TAC[SUBSET; IN_BALL; IN_INTER] THEN
9013   ASM_MESON_TAC[INFSUM_UNIQUE; SUBSET; IN_BALL; DIST_SYM]);;
9014
9015 (* ------------------------------------------------------------------------- *)
9016 (* Sometimes convenient to compare with a complex series of +ve reals.       *)
9017 (* ------------------------------------------------------------------------- *)
9018
9019 let SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX = prove
9020  (`!f f' s k.
9021      open s /\
9022      (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
9023      (!x. x IN s
9024           ==> ?d h N. &0 < d /\ summable k h /\
9025                       (!n. n IN k ==> real(h n) /\ &0 <= Re(h n)) /\
9026                       (!n y. N <= n /\ n IN k /\ y IN ball(x,d)
9027                              ==> norm(f n y) <= norm(h n)))
9028      ==> ?g g'. !x. x IN s
9029                     ==> ((\n. f n x) sums g x) k /\
9030                         ((\n. f' n x) sums g' x) k /\
9031                         (g has_complex_derivative g' x) (at x)`,
9032   REPEAT STRIP_TAC THEN
9033   MATCH_MP_TAC SERIES_AND_DERIVATIVE_COMPARISON_LOCAL THEN
9034   ASM_REWRITE_TAC[] THEN X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
9035   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
9036   ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
9037   X_GEN_TAC `d:real` THEN ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
9038   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
9039   DISCH_THEN(X_CHOOSE_THEN `h:num->complex` STRIP_ASSUME_TAC) THEN
9040   EXISTS_TAC `\n. norm((h:num->complex) n)` THEN ASM_REWRITE_TAC[] THEN
9041   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [summable]) THEN
9042   DISCH_THEN(X_CHOOSE_THEN `l:complex` STRIP_ASSUME_TAC) THEN
9043   EXISTS_TAC `lift(Re l)` THEN MATCH_MP_TAC SUMS_EQ THEN
9044   EXISTS_TAC `\i:num. lift(Re(h i))` THEN
9045   ASM_SIMP_TAC[REAL_NORM_POS; o_DEF] THEN
9046   REWRITE_TAC[RE_DEF] THEN MATCH_MP_TAC SERIES_COMPONENT THEN
9047   ASM_REWRITE_TAC[DIMINDEX_2; ARITH]);;
9048
9049 let SERIES_DIFFERENTIABLE_COMPARISON_COMPLEX = prove
9050  (`!f s k.
9051      open s /\
9052      (!n x. n IN k /\ x IN s ==> (f n) complex_differentiable (at x)) /\
9053      (!x. x IN s
9054           ==> ?d h N. &0 < d /\ summable k h /\
9055                       (!n. n IN k ==> real(h n) /\ &0 <= Re(h n)) /\
9056                       (!n y. N <= n /\ n IN k /\ y IN ball(x,d)
9057                              ==> norm(f n y) <= norm(h n)))
9058      ==> ?g. !x. x IN s
9059                  ==> ((\n. f n x) sums g x) k /\
9060                       g complex_differentiable (at x)`,
9061   REPEAT GEN_TAC THEN
9062   REWRITE_TAC[complex_differentiable; RIGHT_AND_EXISTS_THM] THEN
9063   GEN_REWRITE_TAC (PAT_CONV `\x. a /\ x /\ b ==> x` o ONCE_DEPTH_CONV)
9064    [RIGHT_IMP_EXISTS_THM] THEN
9065   REWRITE_TAC[SKOLEM_THM] THEN
9066   REWRITE_TAC[RIGHT_AND_EXISTS_THM; LEFT_AND_EXISTS_THM] THEN
9067   DISCH_THEN(CHOOSE_THEN (MP_TAC o MATCH_MP
9068      SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX)) THEN
9069   MESON_TAC[]);;
9070
9071 (* ------------------------------------------------------------------------- *)
9072 (* In particular, a power series is analytic inside circle of convergence.   *)
9073 (* ------------------------------------------------------------------------- *)
9074
9075 let POWER_SERIES_AND_DERIVATIVE_0 = prove
9076  (`!k a r. summable k (\n. a(n) * Cx(r) pow n)
9077            ==> ?g g'.
9078                   !z. norm(z) < r
9079                       ==> ((\n. a(n) * z pow n) sums g(z)) k /\
9080                           ((\n. Cx(&n) * a(n) * z pow (n - 1)) sums g'(z)) k /\
9081                           (g has_complex_derivative g' z) (at z)`,
9082   REPEAT STRIP_TAC THEN
9083   ASM_CASES_TAC `&0 < r` THEN
9084   ASM_SIMP_TAC[NORM_ARITH `~(&0 < r) ==> ~(norm z < r)`] THEN
9085   SUBGOAL_THEN `!z. norm(z) < r <=> z IN ball(Cx(&0),r)`
9086    (fun th -> REWRITE_TAC[th])
9087   THENL
9088    [REWRITE_TAC[IN_BALL; dist; COMPLEX_SUB_LZERO; NORM_NEG]; ALL_TAC] THEN
9089   MATCH_MP_TAC SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX THEN
9090   REWRITE_TAC[OPEN_BALL; IN_BALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
9091   CONJ_TAC THENL
9092    [REPEAT STRIP_TAC THEN COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING;
9093     ALL_TAC] THEN
9094   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9095   MAP_EVERY EXISTS_TAC
9096    [`(r - norm(z:complex)) / &2`;
9097     `\n. Cx(norm(a(n):complex) * ((r + norm(z:complex)) / &2) pow n)`;
9098     `0`] THEN
9099   ASM_REWRITE_TAC[REAL_SUB_LT; REAL_HALF; REAL_CX; RE_CX] THEN
9100   REPEAT CONJ_TAC THENL
9101    [REWRITE_TAC[CX_MUL; CX_POW] THEN
9102     MATCH_MP_TAC POWER_SERIES_CONV_IMP_ABSCONV_WEAK THEN
9103     EXISTS_TAC `Cx r` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[COMPLEX_NORM_CX];
9104     REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN
9105     REWRITE_TAC[NORM_POS_LE] THEN MATCH_MP_TAC REAL_POW_LE;
9106     REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_NORM_CX; COMPLEX_NORM_MUL] THEN
9107     REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NORM] THEN
9108     MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
9109     REWRITE_TAC[COMPLEX_NORM_POW; REAL_ABS_POW] THEN
9110     MATCH_MP_TAC REAL_POW_LE2] THEN
9111   ASM_NORM_ARITH_TAC);;
9112
9113 let POWER_SERIES_AND_DERIVATIVE = prove
9114  (`!k a r w.
9115         summable k (\n. a(n) * Cx(r) pow n)
9116         ==> ?g g'.
9117              !z. z IN ball(w,r)
9118                  ==> ((\n. a(n) * (z - w) pow n) sums g(z)) k /\
9119                      ((\n. Cx(&n) * a(n) * (z - w) pow (n - 1)) sums g'(z)) k /\
9120                      (g has_complex_derivative g' z) (at z)`,
9121   REPEAT STRIP_TAC THEN
9122   FIRST_ASSUM(MP_TAC o MATCH_MP POWER_SERIES_AND_DERIVATIVE_0) THEN
9123   REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
9124   MAP_EVERY X_GEN_TAC [`g:complex->complex`; `g':complex->complex`] THEN
9125   DISCH_TAC THEN
9126   EXISTS_TAC `(\z. g(z - w)):complex->complex` THEN
9127   EXISTS_TAC `(\z. g'(z - w)):complex->complex` THEN
9128   REWRITE_TAC[IN_BALL; dist] THEN X_GEN_TAC `z:complex` THEN
9129   DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `z - w:complex`) THEN
9130   ANTS_TAC THENL [ASM_MESON_TAC[NORM_SUB]; ALL_TAC] THEN
9131   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
9132   GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
9133   GEN_REWRITE_TAC (RATOR_CONV o RAND_CONV) [GSYM COMPLEX_MUL_RID] THEN
9134   MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN ASM_REWRITE_TAC[] THEN
9135   COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_SUB_RZERO]);;
9136
9137 let POWER_SERIES_HOLOMORPHIC = prove
9138  (`!a k f z r. (!w. w IN ball(z,r) ==> ((\n. a(n) * (w - z) pow n) sums f w) k)
9139                ==> f holomorphic_on ball(z,r)`,
9140   REPEAT STRIP_TAC THEN SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
9141   X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_BALL; dist] THEN DISCH_TAC THEN
9142   MP_TAC(ISPECL [`k:num->bool`; `a:num->complex`;
9143                  `(norm(z - w:complex) + r) / &2`; `z:complex`]
9144                 POWER_SERIES_AND_DERIVATIVE) THEN
9145   ANTS_TAC THENL
9146    [FIRST_X_ASSUM(MP_TAC o SPEC `z + Cx((norm(z - w) + r) / &2)`) THEN
9147     REWRITE_TAC[IN_BALL; dist; COMPLEX_RING `(z + w) - z:complex = w`;
9148                 NORM_ARITH `norm(z - (z + w)) = norm w`; summable] THEN
9149     ANTS_TAC THENL [REWRITE_TAC[COMPLEX_NORM_CX]; MESON_TAC[]] THEN
9150     POP_ASSUM MP_TAC THEN NORM_ARITH_TAC;
9151     ALL_TAC] THEN
9152   DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` MP_TAC) THEN
9153   DISCH_THEN(X_CHOOSE_THEN `g':complex->complex` (LABEL_TAC "*")) THEN
9154   EXISTS_TAC `(g':complex->complex) w` THEN
9155   MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_AT THEN
9156   MAP_EVERY EXISTS_TAC
9157    [`g:complex->complex`; `(r - norm(z - w:complex)) / &2`] THEN
9158   REPEAT CONJ_TAC THENL
9159    [UNDISCH_TAC `norm(z - w:complex) < r` THEN NORM_ARITH_TAC;
9160     ALL_TAC;
9161     REMOVE_THEN "*" (MP_TAC o SPEC `w:complex`) THEN ANTS_TAC THENL
9162      [ALL_TAC; SIMP_TAC[]] THEN REWRITE_TAC[IN_BALL] THEN
9163     UNDISCH_TAC `norm(z - w:complex) < r` THEN NORM_ARITH_TAC] THEN
9164   X_GEN_TAC `u:complex` THEN REWRITE_TAC[dist] THEN DISCH_TAC THEN
9165   MATCH_MP_TAC SERIES_UNIQUE THEN
9166   EXISTS_TAC `(\n. a(n) * (u - z) pow n):num->complex` THEN
9167   EXISTS_TAC `k:num->bool` THEN CONJ_TAC THENL
9168    [REMOVE_THEN "*" (MP_TAC o SPEC `u:complex`) THEN
9169     ANTS_TAC THENL [ALL_TAC; SIMP_TAC[]];
9170     FIRST_X_ASSUM MATCH_MP_TAC] THEN
9171   REWRITE_TAC[IN_BALL] THEN ASM_NORM_ARITH_TAC);;
9172
9173 let HOLOMORPHIC_IFF_POWER_SERIES = prove
9174  (`!f z r. f holomorphic_on ball(z,r) <=>
9175              !w. w IN ball(z,r)
9176                  ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
9177                        (w - z) pow n) sums
9178                       f w)
9179                      (from 0)`,
9180   REPEAT GEN_TAC THEN EQ_TAC THEN REPEAT STRIP_TAC THENL
9181    [ASM_MESON_TAC[HOLOMORPHIC_POWER_SERIES]; ALL_TAC] THEN
9182   MATCH_MP_TAC POWER_SERIES_HOLOMORPHIC THEN
9183   MAP_EVERY EXISTS_TAC
9184    [`\n. higher_complex_derivative n f z / Cx(&(FACT n))`;
9185     `from 0`] THEN
9186   ASM_REWRITE_TAC[]);;
9187
9188 let POWER_SERIES_ANALYTIC = prove
9189  (`!a k f z r. (!w. w IN ball(z,r) ==> ((\n. a(n) * (w - z) pow n) sums f w) k)
9190                ==> f analytic_on ball(z,r)`,
9191   SIMP_TAC[ANALYTIC_ON_OPEN; OPEN_BALL] THEN
9192   REWRITE_TAC[POWER_SERIES_HOLOMORPHIC]);;
9193
9194 let ANALYTIC_IFF_POWER_SERIES = prove
9195  (`!f z r. f analytic_on ball(z,r) <=>
9196              !w. w IN ball(z,r)
9197                  ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
9198                        (w - z) pow n) sums
9199                       f w)
9200                      (from 0)`,
9201   SIMP_TAC[ANALYTIC_ON_OPEN; OPEN_BALL] THEN
9202   REWRITE_TAC[HOLOMORPHIC_IFF_POWER_SERIES]);;
9203
9204 (* ------------------------------------------------------------------------- *)
9205 (* Equality between holomorphic functions, on open ball then connected set.  *)
9206 (* ------------------------------------------------------------------------- *)
9207
9208 let HOLOMORPHIC_FUN_EQ_ON_BALL = prove
9209  (`!f g z r w.
9210      f holomorphic_on ball(z,r) /\ g holomorphic_on ball(z,r) /\
9211      w IN ball(z,r) /\
9212      (!n. higher_complex_derivative n f z = higher_complex_derivative n g z)
9213      ==> f w = g w`,
9214   REPEAT STRIP_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
9215   EXISTS_TAC `(\n. higher_complex_derivative n f z /
9216                    Cx (&(FACT n)) * (w - z) pow n)` THEN
9217   EXISTS_TAC `(from 0)` THEN CONJ_TAC THENL [ALL_TAC; ASM_REWRITE_TAC []] THEN
9218   ASM_MESON_TAC [HOLOMORPHIC_POWER_SERIES]);;
9219
9220 let HOLOMORPHIC_FUN_EQ_0_ON_BALL = prove
9221  (`!f z r w.
9222      w IN ball(z,r) /\ f holomorphic_on ball(z,r) /\
9223      (!n. higher_complex_derivative n f z = Cx(&0))
9224      ==> f w = Cx(&0)`,
9225   REPEAT STRIP_TAC THEN
9226   SUBST1_TAC (GSYM (BETA_CONV `(\z:complex. Cx(&0)) w`)) THEN
9227   MATCH_MP_TAC HOLOMORPHIC_FUN_EQ_ON_BALL THEN
9228   REWRITE_TAC [HOLOMORPHIC_ON_CONST; HIGHER_COMPLEX_DERIVATIVE_CONST] THEN
9229   ASM_MESON_TAC []);;
9230
9231 let HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED = prove
9232  (`!f s z.
9233         open s /\ connected s /\ f holomorphic_on s /\
9234         z IN s /\ (!n. higher_complex_derivative n f z = Cx(&0))
9235         ==> !w. w IN s ==> f w = Cx(&0)`,
9236   REPEAT GEN_TAC THEN REWRITE_TAC[CONNECTED_CLOPEN] THEN STRIP_TAC THEN
9237   FIRST_X_ASSUM(MP_TAC o SPEC
9238    `{w | w IN s /\ !n. higher_complex_derivative n f w = Cx(&0)}`) THEN
9239   ANTS_TAC THENL [ALL_TAC; ASM SET_TAC[higher_complex_derivative]] THEN
9240   CONJ_TAC THENL
9241    [MATCH_MP_TAC OPEN_SUBSET THEN CONJ_TAC THENL [SET_TAC[]; ALL_TAC] THEN
9242     UNDISCH_TAC `open(s:complex->bool)` THEN
9243     REWRITE_TAC[OPEN_CONTAINS_BALL; IN_ELIM_THM] THEN
9244     MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `w:complex` THEN
9245     DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
9246     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
9247     REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN STRIP_TAC THEN ASM_SIMP_TAC[] THEN
9248     X_GEN_TAC `u:complex` THEN REPEAT STRIP_TAC THEN
9249     MATCH_MP_TAC HOLOMORPHIC_FUN_EQ_0_ON_BALL THEN
9250     MAP_EVERY EXISTS_TAC [`w:complex`; `e:real`] THEN
9251     ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
9252      [MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
9253       ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; OPEN_BALL; SUBSET];
9254       ASM_REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]];
9255     SUBGOAL_THEN
9256      `closed_in (subtopology euclidean s)
9257                 (INTERS (IMAGE
9258               (\n. {w | w IN s /\ higher_complex_derivative n f w = Cx(&0)})
9259                 (:num)))`
9260     MP_TAC THENL
9261      [MATCH_MP_TAC CLOSED_IN_INTERS THEN
9262       REWRITE_TAC[IMAGE_EQ_EMPTY; UNIV_NOT_EMPTY] THEN
9263       REWRITE_TAC[FORALL_IN_IMAGE; IN_UNIV] THEN X_GEN_TAC `n:num` THEN
9264       MATCH_MP_TAC CONTINUOUS_CLOSED_IN_PREIMAGE_CONSTANT THEN
9265       MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN SIMP_TAC[ETA_AX] THEN
9266       MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
9267       ASM_REWRITE_TAC[];
9268       MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
9269       SIMP_TAC[INTERS; IN_IMAGE; IN_UNIV; LEFT_IMP_EXISTS_THM; IN_ELIM_THM] THEN
9270       ONCE_REWRITE_TAC[SWAP_FORALL_THM] THEN
9271       REWRITE_TAC[LEFT_FORALL_IMP_THM; EXISTS_REFL] THEN SET_TAC[]]]);;
9272
9273 let HOLOMORPHIC_FUN_EQ_ON_CONNECTED = prove
9274  (`!f g z s w.
9275      open s /\ connected s /\ f holomorphic_on s /\ g holomorphic_on s /\
9276      w IN s /\ z IN s /\
9277      (!n. higher_complex_derivative n f z = higher_complex_derivative n g z)
9278      ==> f w = g w`,
9279   REPEAT STRIP_TAC THEN
9280   MP_TAC(ISPECL [`\z. (f:complex->complex) z - g z`; `s:complex->bool`;
9281                  `z:complex`] HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED) THEN
9282   ASM_REWRITE_TAC[RIGHT_IMP_FORALL_THM; HOLOMORPHIC_ON_SUB] THEN
9283   DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
9284   ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN DISCH_THEN MATCH_MP_TAC THEN
9285   ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB] THEN
9286   MP_TAC(ISPECL [`f:complex->complex`; `g:complex->complex`; `s:complex->bool`]
9287         HIGHER_COMPLEX_DERIVATIVE_SUB) THEN
9288   ASM_SIMP_TAC[COMPLEX_SUB_0]);;
9289
9290 let HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED = prove
9291  (`!f s z.
9292         open s /\
9293         connected s /\
9294         f holomorphic_on s /\
9295         z IN s /\
9296         (!n. 0 < n ==> higher_complex_derivative n f z = Cx (&0))
9297         ==> !w. w IN s ==> f w = f z`,
9298   REPEAT STRIP_TAC THEN MP_TAC(ISPECL
9299    [`\w. (f:complex->complex) w - f z`; `s:complex->bool`; `z:complex`]
9300    HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED) THEN
9301   ASM_REWRITE_TAC[COMPLEX_SUB_0; RIGHT_IMP_FORALL_THM; IMP_IMP] THEN
9302   DISCH_THEN MATCH_MP_TAC THEN
9303   ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST] THEN
9304   X_GEN_TAC `n:num` THEN ASM_CASES_TAC `n = 0` THEN
9305   ASM_REWRITE_TAC[higher_complex_derivative; COMPLEX_SUB_REFL] THEN
9306   MP_TAC(ISPECL
9307    [`f:complex->complex`; `(\w. f(z:complex)):complex->complex`;
9308     `s:complex->bool`; `n:num`; `z:complex`]
9309    HIGHER_COMPLEX_DERIVATIVE_SUB) THEN
9310   ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN DISCH_THEN SUBST1_TAC THEN
9311   ASM_SIMP_TAC[LE_1; HIGHER_COMPLEX_DERIVATIVE_CONST; COMPLEX_SUB_REFL]);;
9312
9313 (* ------------------------------------------------------------------------- *)
9314 (* Some basic lemmas about poles/singularities.                              *)
9315 (* ------------------------------------------------------------------------- *)
9316
9317 let POLE_LEMMA = prove
9318  (`!f s a.
9319         f holomorphic_on s /\ a IN interior(s)
9320         ==> (\z. if z = a then complex_derivative f a
9321                  else (f(z) - f(a)) / (z - a)) holomorphic_on s`,
9322   REPEAT STRIP_TAC THEN SUBGOAL_THEN `(a:complex) IN s` ASSUME_TAC THENL
9323    [ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET]; ALL_TAC] THEN
9324   SUBGOAL_THEN
9325    `!z. z IN s /\ ~(z = a)
9326         ==> (\z. if z = a then complex_derivative f a
9327                  else (f(z) - f(a)) / (z - a))
9328             complex_differentiable (at z within s)`
9329   ASSUME_TAC THENL
9330    [REPEAT STRIP_TAC THEN
9331     MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_WITHIN THEN
9332     EXISTS_TAC `\z:complex. (f(z) - f(a)) / (z - a)` THEN
9333     EXISTS_TAC `dist(a:complex,z)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
9334     CONJ_TAC THENL
9335      [X_GEN_TAC `w:complex` THEN COND_CASES_TAC THEN
9336       ASM_REWRITE_TAC[REAL_LT_REFL] THEN STRIP_TAC THEN
9337       FIRST_X_ASSUM(MP_TAC o SPEC `w:complex`) THEN ASM_REWRITE_TAC[] THEN
9338       REPEAT(POP_ASSUM MP_TAC) THEN CONV_TAC COMPLEX_FIELD;
9339       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_WITHIN THEN
9340       ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
9341       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
9342       REWRITE_TAC[COMPLEX_DIFFERENTIABLE_CONST; COMPLEX_DIFFERENTIABLE_ID] THEN
9343       ASM_MESON_TAC[holomorphic_on; complex_differentiable]];
9344     ALL_TAC] THEN
9345   REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
9346   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9347   ASM_CASES_TAC `z:complex = a` THENL [ALL_TAC; ASM_SIMP_TAC[]] THEN
9348   FIRST_X_ASSUM SUBST_ALL_TAC THEN
9349   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERIOR]) THEN
9350   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
9351   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_AT_WITHIN THEN
9352   SUBGOAL_THEN
9353    `(\z. if z = a then complex_derivative f a else (f z - f a) / (z - a))
9354     holomorphic_on ball(a,e)`
9355   MP_TAC THENL
9356    [ALL_TAC;
9357     ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; GSYM complex_differentiable;
9358                  CENTRE_IN_BALL; COMPLEX_DIFFERENTIABLE_AT_WITHIN]] THEN
9359   MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN
9360   EXISTS_TAC `{a:complex}` THEN SIMP_TAC[OPEN_BALL; FINITE_RULES] THEN
9361   MATCH_MP_TAC(TAUT `b /\ (b ==> a) ==> a /\ b`) THEN CONJ_TAC THENL
9362    [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
9363     EXISTS_TAC `s DELETE (a:complex)` THEN
9364     ASM_SIMP_TAC[SET_RULE `b SUBSET s ==> b DIFF {a} SUBSET s DELETE a`] THEN
9365     ASM_SIMP_TAC[holomorphic_on; GSYM complex_differentiable; IN_DELETE] THEN
9366     REPEAT STRIP_TAC THEN
9367     MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_WITHIN_SUBSET THEN
9368     EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[] THEN SET_TAC[];
9369     ALL_TAC] THEN
9370   SIMP_TAC[HOLOMORPHIC_ON_OPEN; CONTINUOUS_ON_EQ_CONTINUOUS_AT;
9371            OPEN_DIFF; FINITE_IMP_CLOSED; OPEN_BALL; FINITE_INSERT;
9372            FINITE_RULES; GSYM complex_differentiable] THEN
9373   REWRITE_TAC[IN_DIFF; IN_BALL; IN_SING] THEN
9374   MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `w:complex` THEN
9375   ASM_CASES_TAC `w:complex = a` THENL
9376    [ALL_TAC; ASM_SIMP_TAC[COMPLEX_DIFFERENTIABLE_IMP_CONTINUOUS_AT]] THEN
9377   FIRST_X_ASSUM SUBST_ALL_TAC THEN REWRITE_TAC[] THEN
9378   SUBGOAL_THEN `f holomorphic_on ball(a,e)` MP_TAC THENL
9379    [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
9380   ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
9381   REWRITE_TAC[GSYM complex_differentiable; IN_BALL] THEN
9382   DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN
9383   ASM_REWRITE_TAC[GSYM HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
9384   MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
9385   REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT; CONTINUOUS_AT] THEN
9386   MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
9387               LIM_TRANSFORM_AT) THEN
9388   EXISTS_TAC `&1` THEN REWRITE_TAC[GSYM DIST_NZ; REAL_LT_01] THEN
9389   X_GEN_TAC `u:complex` THEN STRIP_TAC THEN ASM_REWRITE_TAC[]);;
9390
9391 let POLE_LEMMA_OPEN = prove
9392  (`!f s a.
9393         open s /\ f holomorphic_on s
9394         ==> (\z. if z = a
9395                  then complex_derivative f a
9396                  else (f z - f a) / (z - a)) holomorphic_on s`,
9397   REPEAT STRIP_TAC THEN ASM_CASES_TAC `(a:complex) IN s` THENL
9398    [MATCH_MP_TAC POLE_LEMMA THEN ASM_SIMP_TAC[INTERIOR_OPEN];
9399     ALL_TAC] THEN
9400   REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
9401   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9402   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_WITHIN THEN
9403   MAP_EVERY EXISTS_TAC [`\z:complex. (f(z) - f(a)) / (z - a)`; `&1`] THEN
9404   ASM_REWRITE_TAC[REAL_LT_01] THEN
9405   CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
9406   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_WITHIN THEN
9407   ASM_REWRITE_TAC[COMPLEX_SUB_0; CONJ_ASSOC] THEN
9408   CONJ_TAC THENL [CONJ_TAC; ASM_MESON_TAC[]] THEN
9409   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
9410   REWRITE_TAC[COMPLEX_DIFFERENTIABLE_CONST; COMPLEX_DIFFERENTIABLE_ID] THEN
9411   ASM_MESON_TAC[holomorphic_on; complex_differentiable]);;
9412
9413 let POLE_THEOREM = prove
9414  (`!f g s a.
9415         g holomorphic_on s /\ a IN interior(s) /\
9416         (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z))
9417         ==> (\z. if z = a then complex_derivative g a
9418                  else f(z) - g(a) / (z - a)) holomorphic_on s`,
9419   REPEAT GEN_TAC THEN REWRITE_TAC[CONJ_ASSOC] THEN
9420   DISCH_THEN(CONJUNCTS_THEN ASSUME_TAC) THEN
9421   FIRST_ASSUM(MP_TAC o MATCH_MP POLE_LEMMA) THEN
9422   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9423   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9424   COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
9425   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex` o last o CONJUNCTS) THEN
9426   ASM_REWRITE_TAC[] THEN REPEAT(POP_ASSUM MP_TAC) THEN
9427   CONV_TAC COMPLEX_FIELD);;
9428
9429 let POLE_THEOREM_OPEN = prove
9430  (`!f g s a.
9431         open s /\ g holomorphic_on s /\
9432         (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z))
9433         ==> (\z. if z = a then complex_derivative g a
9434                  else f(z) - g(a) / (z - a)) holomorphic_on s`,
9435   REPEAT GEN_TAC THEN REWRITE_TAC[CONJ_ASSOC] THEN
9436   DISCH_THEN(CONJUNCTS_THEN ASSUME_TAC) THEN
9437   FIRST_ASSUM(MP_TAC o SPEC `a:complex` o MATCH_MP POLE_LEMMA_OPEN) THEN
9438   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9439   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9440   COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
9441   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex` o last o CONJUNCTS) THEN
9442   ASM_REWRITE_TAC[] THEN REPEAT(POP_ASSUM MP_TAC) THEN
9443   CONV_TAC COMPLEX_FIELD);;
9444
9445 let POLE_THEOREM_0 = prove
9446  (`!f g s a.
9447         g holomorphic_on s /\ a IN interior(s) /\
9448         (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z)) /\
9449         f a = complex_derivative g a /\ g(a) = Cx(&0)
9450         ==> f holomorphic_on s`,
9451   REPEAT STRIP_TAC THEN
9452   SUBGOAL_THEN
9453    `(\z. if z = a then complex_derivative g a
9454          else f(z) - g(a) / (z - a)) holomorphic_on s`
9455   MP_TAC THENL [ASM_SIMP_TAC[POLE_THEOREM]; ALL_TAC] THEN
9456   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9457   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9458   COND_CASES_TAC THEN ASM_REWRITE_TAC[complex_div] THEN
9459   CONV_TAC COMPLEX_RING);;
9460
9461 let POLE_THEOREM_OPEN_0 = prove
9462  (`!f g s a.
9463         open s /\ g holomorphic_on s /\
9464         (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z)) /\
9465         f a = complex_derivative g a /\ g(a) = Cx(&0)
9466         ==> f holomorphic_on s`,
9467   REPEAT STRIP_TAC THEN
9468   SUBGOAL_THEN
9469    `(\z. if z = a then complex_derivative g a
9470          else f(z) - g(a) / (z - a)) holomorphic_on s`
9471   MP_TAC THENL [ASM_SIMP_TAC[POLE_THEOREM_OPEN]; ALL_TAC] THEN
9472   MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9473   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9474   COND_CASES_TAC THEN ASM_REWRITE_TAC[complex_div] THEN
9475   CONV_TAC COMPLEX_RING);;
9476
9477 let POLE_THEOREM_ANALYTIC = prove
9478  (`!f g s a.
9479         g analytic_on s /\
9480         (!z. z IN s
9481              ==> ?d. &0 < d /\
9482                      !w. w IN ball(z,d) /\ ~(w = a) ==> g(w) = (w - a) * f(w))
9483         ==> (\z. if z = a then complex_derivative g a
9484                  else f(z) - g(a) / (z - a)) analytic_on s`,
9485   REPEAT GEN_TAC THEN REWRITE_TAC[analytic_on] THEN
9486   DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "A") (LABEL_TAC "B")) THEN
9487   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9488   REMOVE_THEN "A" (MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
9489   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
9490   FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
9491   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
9492   EXISTS_TAC `min (d:real) e` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
9493   MATCH_MP_TAC POLE_THEOREM_OPEN THEN
9494   ASM_SIMP_TAC[BALL_MIN_INTER; OPEN_BALL; IN_INTER] THEN
9495   ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; INTER_SUBSET]);;
9496
9497 let POLE_THEOREM_ANALYTIC_0 = prove
9498  (`!f g s a.
9499         g analytic_on s /\
9500         (!z. z IN s
9501              ==> ?d. &0 < d /\
9502                      !w. w IN ball(z,d) /\ ~(w = a)
9503                          ==> g(w) = (w - a) * f(w)) /\
9504         f a = complex_derivative g a /\ g(a) = Cx(&0)
9505         ==> f analytic_on s`,
9506   REPEAT STRIP_TAC THEN
9507   SUBGOAL_THEN
9508    `(\z. if z = a then complex_derivative g a
9509          else f(z) - g(a) / (z - a)) analytic_on s`
9510   MP_TAC THENL [ASM_SIMP_TAC[POLE_THEOREM_ANALYTIC]; ALL_TAC] THEN
9511   MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
9512   REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN COND_CASES_TAC THEN
9513   ASM_REWRITE_TAC[complex_div] THEN CONV_TAC COMPLEX_RING);;
9514
9515 let POLE_THEOREM_ANALYTIC_OPEN_SUPERSET = prove
9516  (`!f g s a t.
9517         s SUBSET t /\ open t /\ g analytic_on s /\
9518         (!z. z IN t /\ ~(z = a) ==> g(z) = (z - a) * f(z))
9519         ==> (\z. if z = a then complex_derivative g a
9520                  else f(z) - g(a) / (z - a)) analytic_on s`,
9521   REPEAT STRIP_TAC THEN MATCH_MP_TAC POLE_THEOREM_ANALYTIC THEN
9522   ASM_MESON_TAC[OPEN_CONTAINS_BALL; SUBSET]);;
9523
9524 let POLE_THEOREM_ANALYTIC_OPEN_SUPERSET_0 = prove
9525  (`!f g s a t.
9526         s SUBSET t /\ open t /\ g analytic_on s /\
9527         (!z. z IN t /\ ~(z = a) ==> g(z) = (z - a) * f(z)) /\
9528         f a = complex_derivative g a /\ g(a) = Cx(&0)
9529         ==> f analytic_on s`,
9530   REPEAT STRIP_TAC THEN
9531   SUBGOAL_THEN
9532    `(\z. if z = a then complex_derivative g a
9533          else f(z) - g(a) / (z - a)) analytic_on s`
9534   MP_TAC THENL
9535    [MATCH_MP_TAC POLE_THEOREM_ANALYTIC_OPEN_SUPERSET THEN ASM_MESON_TAC[];
9536     ALL_TAC] THEN
9537   MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
9538   REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN COND_CASES_TAC THEN
9539   ASM_REWRITE_TAC[complex_div] THEN CONV_TAC COMPLEX_RING);;
9540
9541 let HOLOMORPHIC_ON_EXTEND_LIM,HOLOMORPHIC_ON_EXTEND_BOUNDED =
9542  (CONJ_PAIR o prove)
9543  (`(!f a s.
9544       f holomorphic_on (s DELETE a) /\ a IN interior s
9545       ==> ((?g. g holomorphic_on s /\ (!z. z IN s DELETE a ==> g z = f z)) <=>
9546            ((\z. (z - a) * f(z)) --> Cx(&0)) (at a))) /\
9547    (!f a s.
9548       f holomorphic_on (s DELETE a) /\ a IN interior s
9549       ==> ((?g. g holomorphic_on s /\ (!z. z IN s DELETE a ==> g z = f z)) <=>
9550            (?B. eventually (\z. norm(f z) <= B) (at a))))`,
9551   REWRITE_TAC[AND_FORALL_THM] THEN
9552   REWRITE_TAC[TAUT `(p ==> q) /\ (p ==> r) <=> (p ==> q /\ r)`] THEN
9553   REPEAT GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC(TAUT
9554    `(p ==> r) /\ (r ==> q) /\ (q ==> p) ==> (p <=> q) /\ (p <=> r)`) THEN
9555   REPEAT CONJ_TAC THENL
9556    [REWRITE_TAC[IN_DELETE] THEN DISCH_THEN(X_CHOOSE_THEN `g:complex->complex`
9557      (CONJUNCTS_THEN2
9558        (MP_TAC o MATCH_MP HOLOMORPHIC_ON_IMP_CONTINUOUS_ON) ASSUME_TAC)) THEN
9559     DISCH_THEN(MP_TAC o SPEC `interior s:complex->bool` o
9560      MATCH_MP(REWRITE_RULE[IMP_CONJ] CONTINUOUS_ON_SUBSET)) THEN
9561     REWRITE_TAC[INTERIOR_SUBSET; CONTINUOUS_ON] THEN
9562     DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN
9563     ASM_SIMP_TAC[LIM_WITHIN_OPEN; OPEN_INTERIOR; tendsto] THEN
9564     DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN
9565     DISCH_THEN(fun th -> EXISTS_TAC `norm((g:complex->complex) a) + &1` THEN
9566                          MP_TAC th) THEN
9567     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MP) THEN
9568     FIRST_ASSUM(fun th ->
9569      REWRITE_TAC[GSYM(MATCH_MP EVENTUALLY_WITHIN_INTERIOR th)]) THEN
9570     ASM_SIMP_TAC[EVENTUALLY_WITHIN; GSYM DIST_NZ] THEN
9571     EXISTS_TAC `&1` THEN CONV_TAC NORM_ARITH;
9572     DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
9573     MATCH_MP_TAC LIM_NULL_COMPLEX_RMUL_BOUNDED THEN
9574     SUBST1_TAC(COMPLEX_RING `Cx(&0) = a - a`) THEN
9575     SIMP_TAC[LIM_AT_ID; LIM_CONST; LIM_SUB] THEN
9576     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ_ALT]
9577         EVENTUALLY_MONO)) THEN
9578     SIMP_TAC[];
9579     DISCH_TAC THEN ABBREV_TAC `h = \z. (z - a) pow 2 * f z` THEN
9580     SUBGOAL_THEN `(h has_complex_derivative Cx(&0)) (at a)` ASSUME_TAC THENL
9581      [EXPAND_TAC "h" THEN REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT] THEN
9582       MATCH_MP_TAC LIM_TRANSFORM_AT THEN
9583       MAP_EVERY EXISTS_TAC [`\z:complex. (z - a) * f z`; `&1`] THEN
9584       ASM_SIMP_TAC[REAL_LT_01; GSYM DIST_NZ] THEN CONV_TAC COMPLEX_FIELD;
9585       ALL_TAC] THEN
9586     SUBGOAL_THEN `h holomorphic_on s` ASSUME_TAC THENL
9587      [REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
9588       X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9589       ASM_CASES_TAC `z:complex = a` THENL
9590        [ASM_MESON_TAC[complex_differentiable; COMPLEX_DIFFERENTIABLE_AT_WITHIN];
9591         ALL_TAC] THEN
9592       EXPAND_TAC "h" THEN MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_MUL_WITHIN THEN
9593       CONJ_TAC THENL [COMPLEX_DIFFERENTIABLE_TAC; ALL_TAC] THEN
9594       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
9595       DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
9596       ASM_REWRITE_TAC[IN_DELETE; complex_differentiable] THEN
9597       MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `b:complex` THEN
9598       REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN] THEN
9599       MATCH_MP_TAC EQ_IMP THEN MATCH_MP_TAC LIM_TRANSFORM_WITHIN_SET THEN
9600       REWRITE_TAC[EVENTUALLY_AT] THEN EXISTS_TAC `dist(a:complex,z)` THEN
9601       ASM_REWRITE_TAC[IN_DELETE; NORM_ARITH `&0 < dist(a,b) <=> ~(a = b)`] THEN
9602       MESON_TAC[REAL_LT_REFL];
9603       MP_TAC(SPECL [`h:complex->complex`; `s:complex->bool`; `a:complex`]
9604             POLE_LEMMA) THEN ASM_REWRITE_TAC[] THEN
9605       ABBREV_TAC
9606        `g = \z. if z = a then complex_derivative h a
9607                 else (h z - h a) / (z - a)` THEN
9608       DISCH_TAC THEN
9609       EXISTS_TAC
9610        `\z. if z = a then complex_derivative g a
9611             else (g z - g a) / (z - a)` THEN
9612       ASM_SIMP_TAC[POLE_LEMMA; IN_DELETE] THEN EXPAND_TAC "g" THEN
9613       FIRST_ASSUM(fun th ->
9614         REWRITE_TAC[MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE th]) THEN
9615       SIMP_TAC[COMPLEX_SUB_RZERO] THEN
9616       EXPAND_TAC "h" THEN SIMP_TAC[] THEN CONV_TAC COMPLEX_FIELD]]);;
9617
9618 (* ------------------------------------------------------------------------- *)
9619 (* General, homology form of Cauchy's theorem. Proof is based on Dixon's,    *)
9620 (* as presented in Lang's "Complex Analysis" book.                           *)
9621 (* ------------------------------------------------------------------------- *)
9622
9623 let CAUCHY_INTEGRAL_FORMULA_GLOBAL = prove
9624  (`!f s g z.
9625         open s /\ f holomorphic_on s /\ z IN s /\
9626         valid_path g /\ pathfinish g = pathstart g /\
9627         path_image g SUBSET s DELETE z /\
9628         (!w. ~(w IN s) ==> winding_number(g,w) = Cx(&0))
9629         ==> ((\w. f(w) / (w - z)) has_path_integral
9630              (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
9631   MATCH_MP_TAC(MESON[]
9632    `((!f s g. vector_polynomial_function g ==> P f s g) ==> !f s g. P f s g) /\
9633     (!f s g. vector_polynomial_function g ==> P f s g)
9634     ==> !f s g. P f s g`) THEN
9635   CONJ_TAC THENL
9636    [REPEAT STRIP_TAC THEN
9637     MP_TAC(ISPECL [`s DELETE (z:complex)`; `g:real^1->complex`]
9638       PATH_INTEGRAL_NEARBY_ENDS) THEN
9639     ASM_SIMP_TAC[VALID_PATH_IMP_PATH; OPEN_DELETE] THEN
9640     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
9641     MP_TAC(ISPECL [`g:real^1->complex`; `d:real`]
9642       PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
9643     ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
9644     DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
9645     FIRST_X_ASSUM(MP_TAC o SPECL
9646      [`g:real^1->complex`; `p:real^1->complex`]) THEN
9647     ASM_SIMP_TAC[VECTOR_SUB_REFL; NORM_0;
9648                  VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
9649     STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
9650      [`f:complex->complex`; `s:complex->bool`; `p:real^1->complex`]) THEN
9651     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
9652     SUBGOAL_THEN
9653      `winding_number(p,z) = winding_number(g,z) /\
9654       !w. ~(w IN s) ==> winding_number(p,w) = winding_number(g,w)`
9655      (fun th -> SIMP_TAC[th])
9656     THENL
9657      [FIRST_X_ASSUM(K ALL_TAC o SPEC `z:complex`) THEN
9658       REPEAT(FIRST_X_ASSUM(STRIP_ASSUME_TAC o MATCH_MP (SET_RULE
9659        `g SUBSET s DELETE z
9660         ==> ~(z IN g) /\ (!y. ~(y IN s) ==> ~(y IN g))`))) THEN
9661       ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH;
9662                    VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
9663       REPEAT STRIP_TAC THEN AP_TERM_TAC THEN
9664       FIRST_X_ASSUM MATCH_MP_TAC THEN
9665       REWRITE_TAC[complex_div; COMPLEX_MUL_LID] THEN
9666       MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN
9667       SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
9668                IN_DELETE; COMPLEX_SUB_0] THEN ASM SET_TAC[];
9669       ALL_TAC] THEN
9670     ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
9671     MATCH_MP_TAC(MESON[HAS_PATH_INTEGRAL_INTEGRAL; path_integrable_on;
9672                        PATH_INTEGRAL_UNIQUE]
9673      `f path_integrable_on g /\ path_integral p f = path_integral g f
9674       ==> (f has_path_integral y) p ==> (f has_path_integral y) g`) THEN
9675     CONJ_TAC THENL
9676      [MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
9677       EXISTS_TAC `s DELETE (z:complex)` THEN ASM_SIMP_TAC[OPEN_DELETE];
9678       FIRST_X_ASSUM MATCH_MP_TAC] THEN
9679     MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
9680     SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
9681              IN_DELETE; COMPLEX_SUB_0] THEN
9682     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; DELETE_SUBSET];
9683     ALL_TAC] THEN
9684   MAP_EVERY X_GEN_TAC
9685    [`f:complex->complex`; `u:complex->bool`; `g:real^1->complex`] THEN
9686   DISCH_TAC THEN X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
9687   FIRST_ASSUM(X_CHOOSE_THEN `g':real^1->complex` STRIP_ASSUME_TAC o
9688       MATCH_MP HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION) THEN
9689   SUBGOAL_THEN
9690    `bounded(IMAGE (g':real^1->complex) (interval[vec 0,vec 1]))`
9691   MP_TAC THENL
9692    [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
9693     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
9694     REWRITE_TAC[COMPACT_INTERVAL] THEN
9695     ASM_MESON_TAC[CONTINUOUS_VECTOR_POLYNOMIAL_FUNCTION;
9696                   CONTINUOUS_AT_IMP_CONTINUOUS_ON];
9697     REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
9698     DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC)] THEN
9699   FIRST_ASSUM(ASSUME_TAC o MATCH_MP VALID_PATH_IMP_PATH) THEN
9700   MAP_EVERY ABBREV_TAC
9701    [`d = \z w. if w = z then complex_derivative f z
9702               else (f(w) - f(z)) / (w - z)`;
9703     `v = {w | ~(w IN path_image g) /\ winding_number(g,w) = Cx(&0)}`] THEN
9704   SUBGOAL_THEN `open(v:complex->bool)` ASSUME_TAC THENL
9705    [EXPAND_TAC "v" THEN MATCH_MP_TAC OPEN_WINDING_NUMBER_LEVELSETS THEN
9706     ASM_REWRITE_TAC[];
9707     ALL_TAC] THEN
9708   SUBGOAL_THEN `u UNION v = (:complex)` ASSUME_TAC THENL
9709    [ASM SET_TAC[]; ALL_TAC] THEN
9710   SUBGOAL_THEN `!y:complex. y IN u ==> (d y) holomorphic_on u` ASSUME_TAC THENL
9711    [X_GEN_TAC `y:complex` THEN STRIP_TAC THEN EXPAND_TAC "d" THEN
9712     MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN EXISTS_TAC `{y:complex}` THEN
9713     ASM_REWRITE_TAC[FINITE_SING] THEN CONJ_TAC THENL
9714      [ASM_SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT] THEN
9715       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
9716       ASM_CASES_TAC `w:complex = y` THENL
9717        [UNDISCH_THEN `w:complex = y` SUBST_ALL_TAC THEN
9718         REWRITE_TAC[CONTINUOUS_AT] THEN
9719         MATCH_MP_TAC LIM_TRANSFORM_AWAY_AT THEN
9720         EXISTS_TAC `\w:complex. (f w - f y) / (w - y)` THEN SIMP_TAC[] THEN
9721         EXISTS_TAC `y + Cx(&1)` THEN
9722         CONJ_TAC THENL [CONV_TAC COMPLEX_RING; ALL_TAC] THEN
9723         REWRITE_TAC[GSYM HAS_COMPLEX_DERIVATIVE_AT] THEN
9724         REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
9725         ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT];
9726         MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_IMP_CONTINUOUS_AT];
9727       ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DELETE; IN_DELETE;
9728         SET_RULE `s DIFF {x} = s DELETE x`; GSYM complex_differentiable] THEN
9729       X_GEN_TAC `w:complex` THEN STRIP_TAC] THEN
9730      MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_AT THEN
9731      EXISTS_TAC `\w:complex. (f w - f y) / (w - y)` THEN
9732      EXISTS_TAC `dist(w:complex,y)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
9733      (CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC]) THEN
9734      MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
9735      ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
9736      MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
9737      ASM_SIMP_TAC[ETA_AX; COMPLEX_DIFFERENTIABLE_CONST;
9738                   COMPLEX_DIFFERENTIABLE_ID] THEN
9739      ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT];
9740      ALL_TAC] THEN
9741   SUBGOAL_THEN
9742    `!y. ~(y IN path_image g)
9743         ==> (\x. (f x - f y) / (x - y)) path_integrable_on g`
9744   ASSUME_TAC THENL
9745    [X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
9746     MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
9747     EXISTS_TAC `u DELETE (y:complex)` THEN ASM_SIMP_TAC[OPEN_DELETE] THEN
9748     CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
9749     MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
9750     SIMP_TAC[IN_DELETE; COMPLEX_SUB_0] THEN
9751     CONJ_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
9752     ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID] THEN
9753     MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
9754     EXISTS_TAC `u:complex->bool` THEN ASM_REWRITE_TAC[DELETE_SUBSET];
9755     ALL_TAC] THEN
9756   SUBGOAL_THEN
9757    `!y:complex. d y path_integrable_on g`
9758   ASSUME_TAC THENL
9759    [X_GEN_TAC `y:complex` THEN
9760     ASM_CASES_TAC `(y:complex) IN path_image g` THENL
9761      [MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
9762       EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[] THEN ASM SET_TAC[];
9763       MATCH_MP_TAC PATH_INTEGRABLE_EQ THEN
9764       EXISTS_TAC `\x:complex. (f x - f y) / (x - y)` THEN
9765       ASM_SIMP_TAC[] THEN EXPAND_TAC "d" THEN ASM_MESON_TAC[]];
9766     ALL_TAC] THEN
9767   SUBGOAL_THEN
9768    `?h. (!z. z IN u ==> ((d z) has_path_integral h(z)) g) /\
9769         (!z. z IN v ==> ((\w. f(w) / (w - z)) has_path_integral h(z)) g)`
9770    (CHOOSE_THEN (CONJUNCTS_THEN2 (LABEL_TAC "u") (LABEL_TAC "v")))
9771   THENL
9772    [EXISTS_TAC `\z. if z IN u then path_integral g (d z)
9773                     else path_integral g (\w. f(w) / (w - z))` THEN
9774     SIMP_TAC[] THEN CONJ_TAC THEN X_GEN_TAC `w:complex` THEN DISCH_TAC THENL
9775      [ASM_MESON_TAC[HAS_PATH_INTEGRAL_INTEGRAL]; ALL_TAC] THEN
9776     ASM_CASES_TAC `(w:complex) IN u` THEN ASM_REWRITE_TAC[] THENL
9777      [ALL_TAC;
9778       MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
9779       MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
9780       EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL
9781        [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
9782         ASM_SIMP_TAC[COMPLEX_SUB_0; HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST;
9783                      HOLOMORPHIC_ON_ID] THEN
9784         ASM_MESON_TAC[];
9785         ASM SET_TAC[]]] THEN
9786     MATCH_MP_TAC HAS_PATH_INTEGRAL_EQ THEN
9787     EXISTS_TAC `\x:complex. (f x - f w) / (x - w) + f(w) / (x - w)` THEN
9788     CONJ_TAC THENL
9789      [X_GEN_TAC `x:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9790       SIMPLE_COMPLEX_ARITH_TAC;
9791       ALL_TAC] THEN
9792     GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_ADD_RID] THEN
9793     MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN
9794     UNDISCH_TAC `(w:complex) IN v` THEN EXPAND_TAC "v" THEN
9795     REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THENL
9796      [MATCH_MP_TAC(MESON[PATH_INTEGRAL_UNIQUE; HAS_PATH_INTEGRAL_INTEGRAL;
9797                    path_integrable_on; PATH_INTEGRAL_EQ; PATH_INTEGRABLE_EQ]
9798        `g path_integrable_on p /\
9799         (!x. x IN path_image p ==> f x = g x)
9800         ==> (f has_path_integral path_integral p g) p`) THEN
9801       ASM_REWRITE_TAC[] THEN EXPAND_TAC "d" THEN ASM_MESON_TAC[];
9802       SUBGOAL_THEN
9803        `Cx(&0) = (f w) * Cx(&2) * Cx pi * ii * winding_number(g,w)`
9804       SUBST1_TAC THENL [ASM_REWRITE_TAC[COMPLEX_MUL_RZERO]; ALL_TAC] THEN
9805       ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `x / y = x * Cx(&1) / y`] THEN
9806       MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_LMUL THEN
9807       MATCH_MP_TAC HAS_PATH_INTEGRAL_WINDING_NUMBER THEN
9808       ASM_REWRITE_TAC[]];
9809     ALL_TAC] THEN
9810   SUBGOAL_THEN `!z. (h:complex->complex) z = Cx(&0)` ASSUME_TAC THENL
9811    [ALL_TAC;
9812     REMOVE_THEN "u" (MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
9813     EXPAND_TAC "d" THEN REWRITE_TAC[] THEN
9814     DISCH_THEN(MP_TAC o SPEC `\w. (f w - f z) / (w - z)` o
9815      MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT] HAS_PATH_INTEGRAL_EQ)) THEN
9816     REWRITE_TAC[] THEN ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
9817     MP_TAC(SPECL [`g:real^1->complex`; `z:complex`]
9818       HAS_PATH_INTEGRAL_WINDING_NUMBER) THEN ASM_REWRITE_TAC[] THEN
9819     ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
9820     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_COMPLEX_RMUL) THEN
9821     DISCH_THEN(MP_TAC o SPEC `(f:complex->complex) z`) THEN
9822     REWRITE_TAC[IMP_IMP] THEN
9823     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_ADD) THEN
9824     REWRITE_TAC[complex_div; COMPLEX_ADD_RID; COMPLEX_RING
9825      `(Cx(&1) * i) * fz + (fx - fz) * i = fx * i`] THEN
9826     REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC]] THEN
9827   UNDISCH_THEN `(z:complex) IN u` (K ALL_TAC) THEN
9828   FIRST_X_ASSUM(ASSUME_TAC o MATCH_MP (SET_RULE
9829    `p SUBSET u DELETE z ==> p SUBSET u`)) THEN
9830   POP_ASSUM_LIST(MP_TAC o end_itlist CONJ o rev) THEN STRIP_TAC THEN
9831   MATCH_MP_TAC LIOUVILLE_WEAK THEN
9832   MATCH_MP_TAC(TAUT `b /\ (b ==> a) ==> a /\ b`) THEN CONJ_TAC THENL
9833    [SUBGOAL_THEN
9834      `?t:complex->bool.
9835         compact t /\ path_image g SUBSET interior t /\ t SUBSET u`
9836     STRIP_ASSUME_TAC THENL
9837      [SUBGOAL_THEN
9838        `?dd. &0 < dd /\
9839             {y + k | y IN path_image g /\ k IN ball(vec 0,dd)} SUBSET u`
9840       STRIP_ASSUME_TAC THENL
9841        [ASM_CASES_TAC `u = (:complex)` THENL
9842          [EXISTS_TAC `&1` THEN ASM_REWRITE_TAC[REAL_LT_01; SUBSET_UNIV];
9843           ALL_TAC] THEN
9844         MP_TAC(ISPECL [`path_image g:complex->bool`; `(:complex) DIFF u`]
9845           SEPARATE_COMPACT_CLOSED) THEN
9846         ASM_SIMP_TAC[COMPACT_PATH_IMAGE; GSYM OPEN_CLOSED] THEN
9847         ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
9848         DISCH_THEN(X_CHOOSE_THEN `dd:real` STRIP_ASSUME_TAC) THEN
9849         EXISTS_TAC `dd / &2` THEN ASM_REWRITE_TAC[REAL_HALF] THEN
9850         REWRITE_TAC[SUBSET; FORALL_IN_GSPEC] THEN
9851         MAP_EVERY X_GEN_TAC [`y:complex`; `k:complex`] THEN
9852         MATCH_MP_TAC(TAUT `(a /\ ~c ==> ~b) ==> a /\ b ==> c`) THEN
9853         STRIP_TAC THEN
9854         FIRST_X_ASSUM(MP_TAC o SPECL [`y:complex`; `y + k:complex`]) THEN
9855         ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; IN_BALL] THEN CONV_TAC NORM_ARITH;
9856         ALL_TAC] THEN
9857       EXISTS_TAC `{y + k:complex |
9858                    y IN path_image g /\ k IN cball(vec 0,dd / &2)}` THEN
9859       ASM_SIMP_TAC[COMPACT_SUMS; COMPACT_PATH_IMAGE; COMPACT_CBALL] THEN
9860       CONJ_TAC THENL
9861        [REWRITE_TAC[SUBSET; IN_INTERIOR; IN_ELIM_THM] THEN
9862         X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
9863         EXISTS_TAC `dd / &2` THEN ASM_REWRITE_TAC[REAL_HALF] THEN
9864         X_GEN_TAC `x:complex` THEN REWRITE_TAC[IN_BALL] THEN DISCH_TAC THEN
9865         MAP_EVERY EXISTS_TAC [`y:complex`; `x - y:complex`] THEN
9866         ASM_REWRITE_TAC[IN_CBALL] THEN
9867         UNDISCH_TAC `dist(y:complex,x) < dd / &2` THEN CONV_TAC NORM_ARITH;
9868         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
9869          `{x + y:real^N | x IN s /\ y IN t} SUBSET u
9870           ==> t' SUBSET t ==> {x + y | x IN s /\ y IN t'} SUBSET u`)) THEN
9871         REWRITE_TAC[SUBSET; IN_BALL; IN_CBALL] THEN
9872         UNDISCH_TAC `&0 < dd` THEN CONV_TAC NORM_ARITH];
9873       ALL_TAC] THEN
9874     MP_TAC(ISPECL [`interior t:complex->bool`; `g:real^1->complex`]
9875         PATH_INTEGRAL_BOUND_EXISTS) THEN
9876     ASM_REWRITE_TAC[OPEN_INTERIOR] THEN
9877     DISCH_THEN(X_CHOOSE_THEN `L:real` STRIP_ASSUME_TAC) THEN
9878     SUBGOAL_THEN `bounded(IMAGE (f:complex->complex) t)` MP_TAC THENL
9879      [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
9880       MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
9881       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; CONTINUOUS_ON_SUBSET];
9882       REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
9883       DISCH_THEN(X_CHOOSE_THEN `D:real` STRIP_ASSUME_TAC)] THEN
9884     FIRST_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_BOUNDED) THEN
9885     REWRITE_TAC[BOUNDED_POS] THEN
9886     DISCH_THEN(X_CHOOSE_THEN `C:real` STRIP_ASSUME_TAC) THEN
9887     REWRITE_TAC[LIM_AT_INFINITY] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
9888     EXISTS_TAC `(D * L) / (e / &2) + C:real` THEN REWRITE_TAC[real_ge] THEN
9889     X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
9890     REWRITE_TAC[dist; COMPLEX_SUB_RZERO] THEN
9891     SUBGOAL_THEN `h y = path_integral g (\w. f w / (w - y))` SUBST1_TAC THENL
9892      [CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
9893       FIRST_X_ASSUM MATCH_MP_TAC THEN EXPAND_TAC "v" THEN
9894       REWRITE_TAC[IN_ELIM_THM] THEN CONJ_TAC THENL
9895        [DISCH_TAC THEN
9896         UNDISCH_TAC `(D * L) / (e / &2) + C <= norm(y:complex)` THEN
9897         MATCH_MP_TAC(REAL_ARITH `&0 < d /\ x <= c ==> d + c <= x ==> F`) THEN
9898         ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF] THEN
9899         ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET];
9900         MATCH_MP_TAC WINDING_NUMBER_ZERO_OUTSIDE THEN
9901         EXISTS_TAC `cball(Cx(&0),C)` THEN
9902         ASM_REWRITE_TAC[CONVEX_CBALL; SUBSET; IN_CBALL; dist;
9903                         COMPLEX_SUB_LZERO; NORM_NEG] THEN
9904         CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET]] THEN
9905         UNDISCH_TAC `(D * L) / (e / &2) + C <= norm(y:complex)` THEN
9906         MATCH_MP_TAC(REAL_ARITH `&0 < d ==> d + c <= x ==> ~(x <= c)`) THEN
9907         ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF]];
9908       ALL_TAC] THEN
9909     MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `L * (e / &2 / L)` THEN
9910     CONJ_TAC THENL
9911      [ALL_TAC;
9912       ASM_SIMP_TAC[REAL_DIV_LMUL; REAL_LT_IMP_NZ; REAL_HALF] THEN
9913       ASM_REAL_ARITH_TAC] THEN
9914     FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[] THEN CONJ_TAC THENL
9915      [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN CONJ_TAC THENL
9916        [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_TRANS; INTERIOR_SUBSET];
9917         SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID;
9918                  HOLOMORPHIC_ON_CONST; COMPLEX_SUB_0]] THEN
9919       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
9920       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
9921        `d + c <= norm y ==> &0 < d /\ norm w <= c ==> ~(w = y)`)) THEN
9922       ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF] THEN
9923       ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
9924       ALL_TAC] THEN
9925     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN SIMP_TAC[COMPLEX_NORM_DIV] THEN
9926     SUBGOAL_THEN `&0 < norm(w - y)` ASSUME_TAC THENL
9927      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
9928        `d + c <= norm y ==> &0 < d /\ norm w <= c ==> &0 < norm(w - y)`)) THEN
9929       ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF] THEN
9930       ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
9931       ASM_SIMP_TAC[REAL_LE_LDIV_EQ]] THEN
9932     MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `D:real` THEN CONJ_TAC THENL
9933      [ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET]; ALL_TAC] THEN
9934     REWRITE_TAC[REAL_ARITH `e / &2 / L * x = (x * (e / &2)) / L`] THEN
9935     ASM_SIMP_TAC[REAL_LE_RDIV_EQ; GSYM REAL_LE_LDIV_EQ; REAL_HALF] THEN
9936     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
9937        `d + c <= norm y ==> norm w <= c ==> d <= norm(w - y)`)) THEN
9938     ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
9939     DISCH_TAC] THEN
9940   SUBGOAL_THEN
9941    `(\y. (d:complex->complex->complex) (fstcart y) (sndcart y)) continuous_on
9942     {pastecart x z | x IN u /\ z IN u}`
9943   ASSUME_TAC THENL
9944    [REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN EXPAND_TAC "d" THEN
9945     REWRITE_TAC[FORALL_IN_GSPEC; continuous_within; IMP_CONJ] THEN
9946     MAP_EVERY X_GEN_TAC [`x:complex`; `z:complex`] THEN REPEAT DISCH_TAC THEN
9947     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
9948     REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART; FORALL_PASTECART] THEN
9949     REWRITE_TAC[dist; IMP_IMP; GSYM CONJ_ASSOC; PASTECART_SUB] THEN
9950     ASM_CASES_TAC `z:complex = x` THEN ASM_REWRITE_TAC[] THENL
9951      [UNDISCH_THEN `z:complex = x` (SUBST_ALL_TAC o SYM);
9952       SUBGOAL_THEN
9953         `(\y. (f(sndcart y) - f(fstcart y)) / (sndcart y - fstcart y))
9954          continuous at (pastecart x z)`
9955       MP_TAC THENL
9956        [MATCH_MP_TAC CONTINUOUS_COMPLEX_DIV_AT THEN
9957         ASM_SIMP_TAC[FSTCART_PASTECART; SNDCART_PASTECART; COMPLEX_SUB_0] THEN
9958         CONJ_TAC THEN MATCH_MP_TAC CONTINUOUS_SUB THEN
9959         SIMP_TAC[LINEAR_CONTINUOUS_AT; LINEAR_FSTCART; LINEAR_SNDCART] THEN
9960         CONJ_TAC THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
9961         MATCH_MP_TAC CONTINUOUS_AT_COMPOSE THEN
9962         SIMP_TAC[LINEAR_CONTINUOUS_AT; LINEAR_FSTCART; LINEAR_SNDCART] THEN
9963         REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART] THEN
9964         ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
9965                       CONTINUOUS_ON_EQ_CONTINUOUS_AT];
9966         ALL_TAC] THEN
9967       REWRITE_TAC[continuous_at; dist; FORALL_PASTECART] THEN
9968       REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART; PASTECART_SUB] THEN
9969       DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
9970       DISCH_THEN(X_CHOOSE_THEN `k1:real` STRIP_ASSUME_TAC) THEN
9971       SUBGOAL_THEN
9972        `open({pastecart x z | x IN u /\ z IN u} DIFF
9973              {y | y IN UNIV /\ fstcart y - sndcart y = Cx(&0)})`
9974       MP_TAC THENL
9975        [MATCH_MP_TAC OPEN_DIFF THEN
9976         ASM_SIMP_TAC[REWRITE_RULE[PCROSS] OPEN_PCROSS] THEN
9977         MATCH_MP_TAC CONTINUOUS_CLOSED_PREIMAGE_CONSTANT THEN
9978         REWRITE_TAC[CLOSED_UNIV] THEN MATCH_MP_TAC CONTINUOUS_ON_SUB THEN
9979         SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_FSTCART; LINEAR_SNDCART];
9980         SIMP_TAC[OPEN_CONTAINS_BALL; IN_DIFF; IMP_CONJ; FORALL_IN_GSPEC] THEN
9981         DISCH_THEN(MP_TAC o SPECL [`x:complex`; `z:complex`]) THEN
9982         ASM_REWRITE_TAC[IN_ELIM_THM; IN_UNIV; COMPLEX_SUB_0] THEN
9983         ASM_REWRITE_TAC[SUBSET; IN_BALL; FORALL_PASTECART; IN_DIFF;
9984           IN_ELIM_PASTECART_THM; FSTCART_PASTECART; SNDCART_PASTECART] THEN
9985         REWRITE_TAC[IN_ELIM_THM; IMP_IMP; GSYM CONJ_ASSOC] THEN
9986         REWRITE_TAC[ONCE_REWRITE_RULE[NORM_SUB] dist; PASTECART_SUB;
9987                FSTCART_PASTECART; SNDCART_PASTECART] THEN
9988         DISCH_THEN(X_CHOOSE_THEN `k2:real` STRIP_ASSUME_TAC)] THEN
9989       EXISTS_TAC `min k1 k2:real` THEN
9990       ASM_SIMP_TAC[REAL_LT_MIN; COMPLEX_NORM_NZ; COMPLEX_SUB_0]] THEN
9991     SUBGOAL_THEN `(complex_derivative f) continuous at z` MP_TAC THENL
9992      [MATCH_MP_TAC CONTINUOUS_ON_INTERIOR THEN
9993       EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[INTERIOR_OPEN] THEN
9994       MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
9995       MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
9996       ASM_REWRITE_TAC[];
9997       REWRITE_TAC[continuous_at] THEN DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN
9998       ASM_REWRITE_TAC[dist; REAL_HALF]] THEN
9999     DISCH_THEN(X_CHOOSE_THEN `k1:real` STRIP_ASSUME_TAC) THEN
10000     MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_BALL) THEN
10001     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
10002     ASM_REWRITE_TAC[] THEN
10003     DISCH_THEN(X_CHOOSE_THEN `k2:real` STRIP_ASSUME_TAC) THEN
10004     EXISTS_TAC `min k1 k2:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
10005     MAP_EVERY X_GEN_TAC [`x':complex`; `z':complex`] THEN STRIP_TAC THEN
10006     MATCH_MP_TAC(REAL_ARITH `&0 < e /\ x <= e / &2 ==> x < e`) THEN
10007     COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL
10008      [ASM_MESON_TAC[NORM_LE_PASTECART; REAL_LET_TRANS; REAL_LT_IMP_LE];
10009       ALL_TAC] THEN
10010     SUBGOAL_THEN `e / &2 = e / &2 / norm(z' - x') * norm(z' - x':complex)`
10011     SUBST1_TAC THENL
10012      [ASM_SIMP_TAC[REAL_DIV_RMUL; NORM_EQ_0; VECTOR_SUB_EQ]; ALL_TAC] THEN
10013     MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
10014     EXISTS_TAC `\u. (complex_derivative f u - complex_derivative f z) /
10015                     (z' - x')` THEN
10016     ASM_SIMP_TAC[REAL_LE_DIV; NORM_POS_LE; REAL_LT_IMP_LE; REAL_HALF] THEN
10017     CONJ_TAC THENL
10018      [ASM_SIMP_TAC[COMPLEX_FIELD
10019        `~(z:complex = x)
10020          ==> a / (z - x) - b = (a - b * (z - x)) / (z - x)`] THEN
10021       MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_DIV THEN
10022       MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
10023       REWRITE_TAC[HAS_PATH_INTEGRAL_CONST_LINEPATH] THEN
10024       MP_TAC(ISPECL [`f:complex->complex`; `complex_derivative f`;
10025                      `linepath(x':complex,z')`; `u:complex->bool`]
10026                 PATH_INTEGRAL_PRIMITIVE) THEN
10027       REWRITE_TAC[ETA_AX; PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
10028       DISCH_THEN MATCH_MP_TAC THEN
10029       REWRITE_TAC[VALID_PATH_LINEPATH] THEN CONJ_TAC THENL
10030        [ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE;
10031                       GSYM HOLOMORPHIC_ON_DIFFERENTIABLE;
10032                       HAS_COMPLEX_DERIVATIVE_AT_WITHIN; HOLOMORPHIC_ON_OPEN;
10033                       complex_differentiable];
10034         MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,k2)`];
10035       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
10036       REWRITE_TAC[COMPLEX_NORM_DIV; real_div] THEN
10037       MATCH_MP_TAC REAL_LE_RMUL THEN
10038       REWRITE_TAC[REAL_LE_INV_EQ; NORM_POS_LE] THEN
10039       MATCH_MP_TAC(REAL_ARITH `x < e / &2 ==> x <= e * inv(&2)`) THEN
10040       FIRST_X_ASSUM MATCH_MP_TAC THEN
10041       REWRITE_TAC[REWRITE_RULE[ONCE_REWRITE_RULE[NORM_SUB] dist]
10042        (GSYM IN_BALL)] THEN
10043       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
10044        `w IN s ==> s SUBSET t ==> w IN t`))] THEN
10045     ASM_REWRITE_TAC[PATH_IMAGE_LINEPATH; SEGMENT_CONVEX_HULL] THEN
10046     MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
10047     REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_BALL; dist] THEN
10048     ONCE_REWRITE_TAC[NORM_SUB] THEN
10049     ASM_MESON_TAC[NORM_LE_PASTECART; REAL_LET_TRANS];
10050     ALL_TAC] THEN
10051   SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_UNIV; IN_UNIV;
10052            GSYM complex_differentiable] THEN
10053   X_GEN_TAC `z0:complex` THEN ASM_CASES_TAC `(z0:complex) IN v` THENL
10054    [MP_TAC(ISPECL
10055     [`f:complex->complex`; `h:complex->complex`; `g:real^1->complex`;
10056      `v:complex->bool`; `1`; `B:real`]
10057         CAUCHY_NEXT_DERIVATIVE) THEN
10058     ASM_SIMP_TAC[IN_DIFF; ARITH_EQ; COMPLEX_POW_1] THEN ANTS_TAC THENL
10059      [CONJ_TAC THENL
10060        [ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_UNIQUE_AT]; ALL_TAC] THEN
10061       MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
10062       MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
10063       EXISTS_TAC `u:complex->bool` THEN ASM SET_TAC[];
10064       DISCH_THEN(MP_TAC o SPEC `z0:complex`) THEN
10065       UNDISCH_TAC `(z0:complex) IN v` THEN EXPAND_TAC "v" THEN
10066       SIMP_TAC[IN_ELIM_THM; complex_differentiable] THEN MESON_TAC[]];
10067     ALL_TAC] THEN
10068   SUBGOAL_THEN `(z0:complex) IN u` ASSUME_TAC THENL
10069    [ASM SET_TAC[]; ALL_TAC] THEN
10070   MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_BALL) THEN
10071   ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `z0:complex`) THEN
10072   ASM_SIMP_TAC[] THEN DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
10073   MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
10074   EXISTS_TAC `ball(z0:complex,e)` THEN
10075   ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
10076   MATCH_MP_TAC ANALYTIC_IMP_HOLOMORPHIC THEN MATCH_MP_TAC MORERA_TRIANGLE THEN
10077   REWRITE_TAC[OPEN_BALL] THEN
10078   SUBGOAL_THEN `(h:complex->complex) continuous_on u` ASSUME_TAC THENL
10079    [REWRITE_TAC[CONTINUOUS_ON_SEQUENTIALLY] THEN
10080     MAP_EVERY X_GEN_TAC [`a:num->complex`; `x:complex`] THEN STRIP_TAC THEN
10081     MP_TAC(ISPECL
10082      [`sequentially`; `\n:num x. (d:complex->complex->complex) (a n) x`;
10083       `B:real`; `g:real^1->complex`; `(d:complex->complex->complex) x`]
10084       PATH_INTEGRAL_UNIFORM_LIMIT) THEN
10085     ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; ETA_AX; EVENTUALLY_TRUE] THEN
10086     ANTS_TAC THENL
10087      [ALL_TAC;
10088       MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN BINOP_TAC THEN
10089       REWRITE_TAC[FUN_EQ_THM; o_THM] THEN REPEAT GEN_TAC THEN
10090       MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10091       FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]] THEN
10092     CONJ_TAC THENL
10093      [ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_UNIQUE_AT]; ALL_TAC] THEN
10094     X_GEN_TAC `ee:real` THEN DISCH_TAC THEN
10095     MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_CBALL) THEN
10096     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
10097     ASM_SIMP_TAC[] THEN
10098     DISCH_THEN(X_CHOOSE_THEN `dd:real` STRIP_ASSUME_TAC) THEN
10099     SUBGOAL_THEN
10100      `(\y. (d:complex->complex->complex) (fstcart y) (sndcart y))
10101       uniformly_continuous_on
10102       {pastecart w z | w IN cball(x,dd) /\ z IN path_image g}`
10103     MP_TAC THENL
10104      [MATCH_MP_TAC COMPACT_UNIFORMLY_CONTINUOUS THEN
10105       ASM_SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS; COMPACT_CBALL;
10106                    COMPACT_VALID_PATH_IMAGE] THEN
10107       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10108         CONTINUOUS_ON_SUBSET)) THEN
10109       REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_ELIM_PASTECART_THM] THEN
10110       ASM SET_TAC[];
10111       ALL_TAC] THEN
10112     REWRITE_TAC[uniformly_continuous_on] THEN
10113     DISCH_THEN(MP_TAC o SPEC `ee:real`) THEN ASM_REWRITE_TAC[] THEN
10114     DISCH_THEN(X_CHOOSE_THEN `kk:real`
10115       (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
10116     DISCH_THEN(MP_TAC o GENL [`w:complex`; `z:complex`] o
10117      SPECL [`pastecart (x:complex) (z:complex)`;
10118             `pastecart (w:complex) (z:complex)`]) THEN
10119     SIMP_TAC[IN_ELIM_PASTECART_THM; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10120     ASM_SIMP_TAC[CENTRE_IN_CBALL; REAL_LT_IMP_LE; dist; PASTECART_SUB] THEN
10121     REWRITE_TAC[VECTOR_SUB_REFL; NORM_0; NORM_PASTECART] THEN
10122     CONV_TAC REAL_RAT_REDUCE_CONV THEN
10123     REWRITE_TAC[TAUT `b /\ (a /\ b) /\ c ==> d <=> a /\ b /\ c ==> d`] THEN
10124     SIMP_TAC[REAL_ADD_RID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
10125     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [LIM_SEQUENTIALLY]) THEN
10126     DISCH_THEN(MP_TAC o SPEC `min dd kk:real`) THEN
10127     ASM_REWRITE_TAC[EVENTUALLY_SEQUENTIALLY; REAL_LT_MIN] THEN
10128     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
10129     REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
10130     ASM_SIMP_TAC[ONCE_REWRITE_RULE[DIST_SYM] IN_CBALL; GSYM dist;
10131                  REAL_LT_IMP_LE];
10132     ALL_TAC] THEN
10133   CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
10134
10135   SUBGOAL_THEN
10136    `!w. w IN u ==> (\z. d z w) holomorphic_on u`
10137   ASSUME_TAC THENL
10138    [EXPAND_TAC "d" THEN X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
10139     MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN EXISTS_TAC `{y:complex}` THEN
10140     ASM_REWRITE_TAC[FINITE_SING] THEN CONJ_TAC THENL
10141      [SUBGOAL_THEN
10142        `((\y. (d:complex->complex->complex) (fstcart y) (sndcart y)) o
10143         (\z. pastecart y z))
10144         continuous_on u`
10145       MP_TAC THENL
10146        [MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
10147         SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
10148                  CONTINUOUS_ON_CONST] THEN
10149         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10150           CONTINUOUS_ON_SUBSET)) THEN
10151         ASM_SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM];
10152         EXPAND_TAC "d" THEN
10153         REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10154         MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] CONTINUOUS_ON_EQ) THEN
10155         GEN_TAC THEN REWRITE_TAC[] THEN COND_CASES_TAC THEN
10156         ASM_REWRITE_TAC[] THEN
10157         DISCH_TAC THEN REWRITE_TAC[complex_div] THEN MATCH_MP_TAC(COMPLEX_RING
10158          `x':complex = --x /\ y' = --y ==> x * y = x' * y'`) THEN
10159         REWRITE_TAC[GSYM COMPLEX_INV_NEG; COMPLEX_NEG_SUB]];
10160       ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DELETE; IN_DELETE;
10161         SET_RULE `s DIFF {x} = s DELETE x`; GSYM complex_differentiable] THEN
10162       X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
10163       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_AT THEN
10164       EXISTS_TAC `\w:complex. (f y - f w) / (y - w)` THEN
10165       EXISTS_TAC `dist(w:complex,y)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
10166       (CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC]) THEN
10167       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
10168       ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
10169       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
10170       ASM_SIMP_TAC[ETA_AX; COMPLEX_DIFFERENTIABLE_CONST;
10171                    COMPLEX_DIFFERENTIABLE_ID] THEN
10172       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]];
10173     ALL_TAC] THEN
10174   SUBGOAL_THEN
10175    `!w a b:complex. w IN u /\ segment[a,b] SUBSET u
10176                     ==> (\z. d z w) path_integrable_on (linepath(a,b))`
10177   ASSUME_TAC THENL
10178    [REPEAT STRIP_TAC THEN
10179     MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
10180     ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
10181     ALL_TAC] THEN
10182   SUBGOAL_THEN
10183    `!a b:complex.
10184         segment[a,b] SUBSET u
10185         ==> (\w. path_integral (linepath(a,b)) (\z. d z w))
10186             continuous_on u`
10187   ASSUME_TAC THENL
10188    [REPEAT STRIP_TAC THEN ASM_CASES_TAC `a:complex = b` THENL
10189      [ASM_SIMP_TAC[PATH_INTEGRAL_TRIVIAL; CONTINUOUS_ON_CONST]; ALL_TAC] THEN
10190     REWRITE_TAC[continuous_on] THEN X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
10191     X_GEN_TAC `ee:real` THEN DISCH_TAC THEN
10192     ASM_SIMP_TAC[dist; GSYM PATH_INTEGRAL_SUB] THEN
10193     MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_CBALL) THEN
10194     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
10195     ASM_SIMP_TAC[] THEN
10196     DISCH_THEN(X_CHOOSE_THEN `dd:real` STRIP_ASSUME_TAC) THEN
10197     SUBGOAL_THEN
10198      `(\y. (d:complex->complex->complex) (fstcart y) (sndcart y))
10199       uniformly_continuous_on
10200       {pastecart z t | z IN segment[a,b] /\ t IN cball(w,dd)}`
10201     MP_TAC THENL
10202      [MATCH_MP_TAC COMPACT_UNIFORMLY_CONTINUOUS THEN
10203       ASM_SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS;
10204                    COMPACT_CBALL; COMPACT_SEGMENT] THEN
10205       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10206         CONTINUOUS_ON_SUBSET)) THEN
10207       REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_ELIM_PASTECART_THM] THEN
10208       ASM SET_TAC[];
10209       ALL_TAC] THEN
10210     REWRITE_TAC[uniformly_continuous_on] THEN
10211     DISCH_THEN(MP_TAC o SPEC `ee / &2 / norm(b - a:complex)`) THEN
10212     ASM_SIMP_TAC[REAL_HALF; REAL_LT_DIV; COMPLEX_NORM_NZ; COMPLEX_SUB_0] THEN
10213     DISCH_THEN(X_CHOOSE_THEN `kk:real`
10214       (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
10215     DISCH_THEN(MP_TAC o GENL [`z:complex`; `r:complex`] o
10216      SPECL [`pastecart (r:complex) (z:complex)`;
10217             `pastecart (r:complex) (w:complex)`]) THEN
10218     SIMP_TAC[IN_ELIM_PASTECART_THM; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10219     ASM_SIMP_TAC[CENTRE_IN_CBALL; REAL_LT_IMP_LE; dist; PASTECART_SUB] THEN
10220     REWRITE_TAC[VECTOR_SUB_REFL; NORM_0; NORM_PASTECART] THEN
10221     CONV_TAC REAL_RAT_REDUCE_CONV THEN
10222     REWRITE_TAC[TAUT `(a /\ b) /\ a /\ c ==> d <=> a /\ b /\ c ==> d`] THEN
10223     SIMP_TAC[REAL_ADD_LID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
10224     EXISTS_TAC `min dd kk:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
10225     X_GEN_TAC `x:complex` THEN REPEAT STRIP_TAC THEN
10226     MATCH_MP_TAC(REAL_ARITH `&0 < e /\ x <= e / &2 ==> x < e`) THEN
10227     ASM_REWRITE_TAC[] THEN
10228     SUBGOAL_THEN `ee / &2 = ee / &2 / norm(b - a) * norm(b - a:complex)`
10229     SUBST1_TAC THENL
10230      [ASM_SIMP_TAC[REAL_DIV_RMUL; NORM_EQ_0; VECTOR_SUB_EQ]; ALL_TAC] THEN
10231     MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
10232     EXISTS_TAC `\r. (d:complex->complex->complex) r x - d r w` THEN
10233     ASM_SIMP_TAC[REAL_LE_DIV; NORM_POS_LE; REAL_LT_IMP_LE; REAL_HALF] THEN
10234     CONJ_TAC THENL
10235      [MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
10236       MATCH_MP_TAC PATH_INTEGRABLE_SUB THEN ASM_SIMP_TAC[];
10237       REPEAT STRIP_TAC THEN GEN_REWRITE_TAC LAND_CONV [NORM_SUB] THEN
10238       MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
10239       ASM_REWRITE_TAC[IN_CBALL; dist] THEN
10240       ASM_MESON_TAC[NORM_SUB; REAL_LT_IMP_LE]];
10241     ALL_TAC] THEN
10242   SUBGOAL_THEN
10243    `!a b. segment[a,b] SUBSET u
10244           ==> (\w. path_integral (linepath (a,b)) (\z. d z w))
10245               path_integrable_on g`
10246   ASSUME_TAC THENL
10247    [REPEAT STRIP_TAC THEN REWRITE_TAC[PATH_INTEGRABLE_ON] THEN
10248     MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
10249     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC THENL
10250      [SUBGOAL_THEN
10251        `((\w. path_integral (linepath(a,b)) (\z. d z w)) o (g:real^1->complex))
10252         continuous_on interval[vec 0,vec 1]`
10253       MP_TAC THENL
10254        [MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
10255         ASM_SIMP_TAC[GSYM path; VALID_PATH_IMP_PATH] THEN
10256         MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
10257         EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[GSYM path_image];
10258         REWRITE_TAC[o_DEF]];
10259       FIRST_ASSUM(fun th -> REWRITE_TAC
10260        [MATCH_MP HAS_VECTOR_DERIVATIVE_UNIQUE_AT (SPEC_ALL th)]) THEN
10261       ASM_SIMP_TAC[ETA_AX; GSYM path; VALID_PATH_IMP_PATH;
10262                    VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION]];
10263     ALL_TAC] THEN
10264   SUBGOAL_THEN
10265    `!a b. segment[a,b] SUBSET u
10266           ==> path_integral (linepath(a,b)) h =
10267               path_integral g (\w. path_integral (linepath (a,b)) (\z. d z w))`
10268   ASSUME_TAC THENL
10269    [ALL_TAC;
10270     MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`; `c:complex`] THEN
10271     DISCH_TAC THEN
10272     SUBGOAL_THEN
10273      `segment[a:complex,b] SUBSET u /\
10274       segment[b,c] SUBSET u /\ segment[c,a] SUBSET u`
10275     STRIP_ASSUME_TAC THENL
10276      [ASM_MESON_TAC[SEGMENTS_SUBSET_CONVEX_HULL; SUBSET_TRANS]; ALL_TAC] THEN
10277     ASM_SIMP_TAC[] THEN
10278     ASM_SIMP_TAC[GSYM PATH_INTEGRAL_ADD; PATH_INTEGRABLE_ADD] THEN
10279     MATCH_MP_TAC PATH_INTEGRAL_EQ_0 THEN
10280     X_GEN_TAC `w:complex` THEN REWRITE_TAC[] THEN DISCH_TAC THEN
10281     SUBGOAL_THEN `(w:complex) IN u` ASSUME_TAC THENL
10282      [ASM SET_TAC[]; ALL_TAC] THEN
10283     ASM_SIMP_TAC[GSYM PATH_INTEGRAL_JOIN; VALID_PATH_LINEPATH;
10284      VALID_PATH_JOIN; PATHSTART_JOIN;
10285      PATH_INTEGRABLE_JOIN; PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
10286     MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10287     MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE THEN
10288     MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `u:complex->bool` THEN
10289     ASM_SIMP_TAC[] THEN ASM SET_TAC[]] THEN
10290   MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`] THEN DISCH_TAC THEN
10291   MATCH_MP_TAC EQ_TRANS THEN
10292   EXISTS_TAC `path_integral (linepath(a,b)) (\z. path_integral g (d z))` THEN
10293   CONJ_TAC THENL
10294    [MATCH_MP_TAC PATH_INTEGRAL_EQ THEN
10295     REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
10296     REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
10297     MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10298     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[SUBSET];
10299     MATCH_MP_TAC(REWRITE_RULE[PCROSS] PATH_INTEGRAL_SWAP) THEN
10300     REWRITE_TAC[VALID_PATH_LINEPATH; VECTOR_DERIVATIVE_LINEPATH_AT;
10301                 CONTINUOUS_ON_CONST] THEN
10302     FIRST_ASSUM(fun th -> REWRITE_TAC
10303      [MATCH_MP HAS_VECTOR_DERIVATIVE_UNIQUE_AT (SPEC_ALL th)]) THEN
10304     ASM_SIMP_TAC[ETA_AX; CONTINUOUS_VECTOR_POLYNOMIAL_FUNCTION;
10305                  CONTINUOUS_AT_IMP_CONTINUOUS_ON] THEN
10306     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10307         CONTINUOUS_ON_SUBSET)) THEN
10308     REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_ELIM_PASTECART_THM] THEN
10309     REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN ASM SET_TAC[]]);;
10310
10311 let CAUCHY_THEOREM_GLOBAL = prove
10312  (`!f s g.
10313         open s /\ f holomorphic_on s /\
10314         valid_path g /\ pathfinish g = pathstart g /\ path_image g SUBSET s /\
10315         (!z. ~(z IN s) ==> winding_number(g,z) = Cx(&0))
10316         ==> (f has_path_integral Cx(&0)) g`,
10317   REPEAT STRIP_TAC THEN
10318   SUBGOAL_THEN `?z:complex. z IN s /\ ~(z IN path_image g)`
10319   STRIP_ASSUME_TAC THENL
10320    [MATCH_MP_TAC(SET_RULE
10321      `t SUBSET s /\ ~(t = s) ==> ?z. z IN s /\ ~(z IN t)`) THEN
10322     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(MESON
10323      [CLOPEN; COMPACT_EQ_BOUNDED_CLOSED; NOT_BOUNDED_UNIV]
10324      `open s /\ compact t /\ ~(t = {}) ==> ~(t = s)`) THEN
10325     ASM_SIMP_TAC[COMPACT_PATH_IMAGE; PATH_IMAGE_NONEMPTY; VALID_PATH_IMP_PATH];
10326     MP_TAC(ISPECL [`\w:complex. (w - z) * f(w)`; `s:complex->bool`;
10327                    `g:real^1->complex`; `z:complex`]
10328       CAUCHY_INTEGRAL_FORMULA_GLOBAL) THEN
10329     ASM_SIMP_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_LZERO; COMPLEX_MUL_RZERO;
10330                  HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_SUB;
10331                  HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST] THEN
10332     ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
10333     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_EQ) THEN
10334     X_GEN_TAC `w:complex` THEN ASM_CASES_TAC `w:complex = z` THEN
10335     ASM_SIMP_TAC[COMPLEX_FIELD
10336      `~(w:complex = z) ==> ((w - z) * f) / (w - z) = f`]]);;
10337
10338 let CAUCHY_THEOREM_GLOBAL_OUTSIDE = prove
10339  (`!f s g.
10340         open s /\ f holomorphic_on s /\
10341         valid_path g /\ pathfinish g = pathstart g /\
10342         (!z. ~(z IN s) ==> z IN outside(path_image g))
10343         ==> (f has_path_integral Cx(&0)) g`,
10344   REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_GLOBAL THEN
10345   EXISTS_TAC `s:complex->bool` THEN
10346   ASM_SIMP_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE; VALID_PATH_IMP_PATH] THEN
10347   MP_TAC(ISPEC `path_image(g:real^1->complex)` OUTSIDE_NO_OVERLAP) THEN
10348   ASM SET_TAC[]);;
10349
10350 (* ------------------------------------------------------------------------- *)
10351 (* First Cartan Theorem.                                                     *)
10352 (* ------------------------------------------------------------------------- *)
10353
10354 let HIGHER_COMPLEX_DERIVATIVE_COMP_LEMMA = prove
10355  (`!f g z s t n i.
10356      open s /\ f holomorphic_on s /\ z IN s /\
10357      open t /\ g holomorphic_on t /\ (!w. w IN s ==> f w IN t) /\
10358      complex_derivative f z = Cx(&1) /\
10359      (!i. 1 < i /\ i <= n ==> higher_complex_derivative i f z = Cx(&0)) /\
10360      i <= n
10361      ==> higher_complex_derivative i (g o f) z =
10362          higher_complex_derivative i g (f z)`,
10363   REPEAT GEN_TAC  THEN
10364   SUBGOAL_THEN
10365    `open s /\ f holomorphic_on s /\ z IN s /\ open t /\
10366       (!w. w IN s ==> f w IN t) /\
10367       complex_derivative f z = Cx(&1) /\
10368       (!i. 1 < i /\ i <= n ==> higher_complex_derivative i f z = Cx(&0))
10369       ==> !i g. g holomorphic_on t /\ i <= n
10370           ==> higher_complex_derivative i (g o f) z =
10371               higher_complex_derivative i g (f z)`
10372     (fun th -> MESON_TAC [th])  THEN
10373   STRIP_TAC  THEN
10374   INDUCT_TAC THEN
10375   REWRITE_TAC [LE_SUC_LT; higher_complex_derivative_alt; o_THM]  THEN
10376   REPEAT STRIP_TAC  THEN
10377   EQ_TRANS_TAC `higher_complex_derivative i
10378              (\w. complex_derivative g (f w) * complex_derivative f w) z` THENL
10379    [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN  THEN
10380     EXISTS_TAC `s:complex->bool`  THEN
10381     ASM_REWRITE_TAC []  THEN
10382     REPEAT CONJ_TAC THENL
10383      [MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10384       ASM_REWRITE_TAC []  THEN
10385       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10386       EXISTS_TAC `t:complex->bool`  THEN
10387       ASM_SIMP_TAC [];
10388       MATCH_MP_TAC HOLOMORPHIC_ON_MUL  THEN
10389       CONJ_TAC THENL
10390        [REWRITE_TAC [GSYM o_DEF]  THEN
10391         MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10392         EXISTS_TAC `t:complex->bool`  THEN
10393         ASM_REWRITE_TAC []  THEN
10394         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10395         ASM_REWRITE_TAC [];
10396         ASM_REWRITE_TAC [ETA_AX]  THEN
10397         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10398         ASM_REWRITE_TAC []];
10399       REPEAT STRIP_TAC  THEN
10400       MATCH_MP_TAC COMPLEX_DERIVATIVE_CHAIN  THEN
10401       ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]];
10402     EQ_TRANS_TAC
10403      `vsum (0..i)
10404         (\j. Cx (&(binom (i,j))) *
10405              higher_complex_derivative j (\w. complex_derivative g (f w)) z *
10406              higher_complex_derivative (i - j) (complex_derivative f) z)` THENL
10407      [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_MUL  THEN
10408       EXISTS_TAC `s:complex->bool`  THEN
10409       ASM_REWRITE_TAC []  THEN
10410       ASM_SIMP_TAC [HOLOMORPHIC_COMPLEX_DERIVATIVE]  THEN
10411       REWRITE_TAC [GSYM o_DEF]  THEN
10412       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10413       EXISTS_TAC `t:complex->bool`  THEN
10414       ASM_REWRITE_TAC []  THEN
10415       ASM_SIMP_TAC [HOLOMORPHIC_COMPLEX_DERIVATIVE];
10416       REWRITE_TAC [GSYM higher_complex_derivative_alt]  THEN
10417       EQ_TRANS_TAC
10418         `vsum (i..i)
10419            (\j. Cx (&(binom (i,j))) *
10420                 higher_complex_derivative j
10421                   (\w. complex_derivative g (f w)) z *
10422                 higher_complex_derivative (SUC (i - j)) f z)` THENL
10423        [MATCH_MP_TAC VSUM_SUPERSET  THEN
10424         REWRITE_TAC[SUBSET_NUMSEG; LT_REFL; LE_0;
10425                     LE_REFL; IN_NUMSEG_0; NUMSEG_SING; IN_SING]  THEN
10426         X_GEN_TAC `j:num`  THEN
10427         REWRITE_TAC [ARITH_RULE `j:num <= i /\ ~(j = i) <=> j < i`]  THEN
10428         DISCH_TAC  THEN
10429         ASSERT_TAC `1 < SUC (i - j) /\ SUC (i - j) <= n`  THENL
10430          [ASM_SIMP_TAC [ARITH_RULE
10431            `i < n /\ j < i ==> 1 < SUC (i - j) /\ SUC (i - j) <= n`]  THEN
10432           MATCH_MP_TAC (ARITH_RULE `i < n /\ j < i ==> 1 < SUC (i - j)`)  THEN
10433           ASM_REWRITE_TAC [];
10434           ASM_SIMP_TAC [COMPLEX_MUL_RZERO; COMPLEX_VEC_0]];
10435         REWRITE_TAC [NUMSEG_SING; VSUM_SING; BINOM_REFL; SUB_REFL]  THEN
10436         ASM_REWRITE_TAC [COMPLEX_MUL_LID; COMPLEX_MUL_RID;
10437                          higher_complex_derivative]  THEN
10438         ASM_REWRITE_TAC [GSYM o_DEF]  THEN
10439         REWRITE_TAC [GSYM higher_complex_derivative;
10440                      higher_complex_derivative_alt]  THEN
10441         FIRST_X_ASSUM MATCH_MP_TAC  THEN
10442         ASM_SIMP_TAC [ARITH_RULE `i:num < n ==> i <= n`]  THEN
10443         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10444         ASM_REWRITE_TAC []]]]);;
10445
10446 let HIGHER_COMPLEX_DERIVATIVE_COMP_ITER_LEMMA = prove
10447  (`!f s z n m i.
10448      open s /\ f holomorphic_on s /\ (!w. w IN s ==> f w IN s) /\
10449      z IN s /\ f z = z /\ complex_derivative f z = Cx (&1) /\
10450      (!i. 1 < i /\ i <= n ==> higher_complex_derivative i f z = Cx (&0)) /\
10451      i <= n
10452      ==> higher_complex_derivative i (ITER m f) z =
10453          higher_complex_derivative i f z`,
10454   GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN GEN_TAC  THEN
10455   REWRITE_TAC [RIGHT_FORALL_IMP_THM; IMP_CONJ]  THEN
10456   REWRITE_TAC [IMP_IMP]  THEN
10457   STRIP_TAC  THEN
10458   ASSERT_TAC `!m. ITER m f z = z:complex`  THENL
10459    [INDUCT_TAC THEN ASM_REWRITE_TAC [ITER]; ALL_TAC] THEN
10460   ASSERT_TAC `!m (w:complex). w IN s ==> ITER m f w IN s`  THENL
10461    [INDUCT_TAC THEN ASM_SIMP_TAC [ITER]; ALL_TAC] THEN
10462   ASSERT_TAC `!m. ITER m f holomorphic_on s`  THENL
10463    [INDUCT_TAC THEN REWRITE_TAC [ITER_POINTLESS] THENL
10464      [ASM_SIMP_TAC [I_DEF; HOLOMORPHIC_ON_ID];
10465       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10466       EXISTS_TAC `s:complex ->bool`  THEN
10467       ASM_REWRITE_TAC []];
10468     ALL_TAC] THEN
10469   INDUCT_TAC  THENL
10470    [REWRITE_TAC [ITER_POINTLESS; I_DEF; HIGHER_COMPLEX_DERIVATIVE_ID]  THEN
10471     REPEAT STRIP_TAC THEN COND_CASES_TAC THENL
10472      [ASM_REWRITE_TAC [higher_complex_derivative]; ALL_TAC] THEN
10473     REPEAT STRIP_TAC THEN COND_CASES_TAC THENL
10474      [ASM_REWRITE_TAC [higher_complex_derivative; ONE]; ALL_TAC] THEN
10475     MATCH_MP_TAC EQ_SYM  THEN
10476     FIRST_X_ASSUM MATCH_MP_TAC  THEN
10477     ASM_SIMP_TAC [ARITH_RULE `~(i = 0) /\ ~(i = 1) ==> 1 < i`];
10478     GEN_TAC THEN DISCH_TAC  THEN
10479     REWRITE_TAC [ITER_ALT_POINTLESS]  THEN
10480     EQ_TRANS_TAC `higher_complex_derivative i (ITER m f) (f z)`  THENL
10481      [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_LEMMA  THEN
10482       EXISTS_TAC `s:complex ->bool`  THEN
10483       EXISTS_TAC `s:complex ->bool`  THEN
10484       EXISTS_TAC `n:num`  THEN
10485       ASM_REWRITE_TAC [];
10486       ASM_REWRITE_TAC []  THEN
10487       FIRST_X_ASSUM MATCH_MP_TAC  THEN
10488       ASM_REWRITE_TAC []]]);;
10489
10490 let HIGHER_COMPLEX_DERIVATIVE_ITER_TOP_LEMMA = prove
10491  (`!f s z n m.
10492      open s /\ f holomorphic_on s /\ (!w. w IN s ==> f w IN s) /\
10493      z IN s /\ f z = z /\ complex_derivative f z = Cx (&1) /\
10494      (!i. 1 < i /\ i < n ==> higher_complex_derivative i f z = Cx (&0)) /\
10495      1 < n
10496      ==> higher_complex_derivative n (ITER m f) z =
10497          Cx(&m) * higher_complex_derivative n f z`,
10498   GEN_TAC THEN GEN_TAC THEN GEN_TAC  THEN
10499   INDUCT_TAC THEN REWRITE_TAC [LT_SUC_LE] THEN REWRITE_TAC [LT]  THEN
10500   REWRITE_TAC [RIGHT_FORALL_IMP_THM]  THEN
10501   STRIP_TAC  THEN
10502   ASSERT_TAC `!m. ITER m f z = z:complex`  THENL
10503    [INDUCT_TAC THEN ASM_REWRITE_TAC [ITER]; ALL_TAC] THEN
10504   ASSERT_TAC `!m (w:complex). w IN s ==> ITER m f w IN s`  THENL
10505    [INDUCT_TAC THEN ASM_SIMP_TAC [ITER]; ALL_TAC] THEN
10506   ASSERT_TAC `!m. ITER m f holomorphic_on s`  THENL
10507    [INDUCT_TAC THEN REWRITE_TAC [ITER_POINTLESS]  THEN
10508     ASM_SIMP_TAC [I_DEF; HOLOMORPHIC_ON_ID]  THEN
10509     MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10510     EXISTS_TAC `s:complex ->bool`  THEN
10511     ASM_REWRITE_TAC [];
10512     ALL_TAC] THEN
10513   ASSERT_TAC `!w. w IN s ==> f complex_differentiable at w`  THENL
10514    [ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]; ALL_TAC] THEN
10515   ASSERT_TAC `!m w. w IN s ==> ITER m f complex_differentiable at w`  THENL
10516    [ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]; ALL_TAC] THEN
10517   ASSERT_TAC `!m. complex_derivative (ITER m f) z = Cx(&1)`  THENL
10518    [INDUCT_TAC THEN ASM_REWRITE_TAC [ITER_POINTLESS]  THENL
10519      [REWRITE_TAC [I_DEF; COMPLEX_DERIVATIVE_ID]; ALL_TAC] THEN
10520     ASM_SIMP_TAC [COMPLEX_DERIVATIVE_CHAIN;
10521                   HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]  THEN
10522     REWRITE_TAC [COMPLEX_MUL_LID];
10523     ALL_TAC] THEN
10524   INDUCT_TAC THEN
10525   REWRITE_TAC [higher_complex_derivative_alt; ITER_POINTLESS]  THENL
10526    [ASM_REWRITE_TAC [COMPLEX_MUL_LZERO; I_DEF; COMPLEX_DERIVATIVE_ID;
10527                      HIGHER_COMPLEX_DERIVATIVE_CONST;
10528                      ARITH_RULE `n = 0 <=> ~(1 <= n)`];
10529     ALL_TAC] THEN
10530   EQ_TRANS_TAC `higher_complex_derivative n
10531              (\w. complex_derivative f (ITER m f w) *
10532                   complex_derivative (ITER m f) w) z`  THENL
10533    [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN  THEN
10534     EXISTS_TAC `s:complex->bool`  THEN
10535     ASM_REWRITE_TAC[] THEN CONJ_TAC  THENL
10536      [REWRITE_TAC [o_DEF]  THEN
10537       MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10538       ASM_REWRITE_TAC []  THEN
10539       ONCE_REWRITE_TAC [GSYM o_DEF]  THEN
10540       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10541       EXISTS_TAC `s:complex->bool`  THEN
10542       ASM_REWRITE_TAC [ETA_AX];
10543       ALL_TAC] THEN
10544     CONJ_TAC  THENL
10545      [MATCH_MP_TAC HOLOMORPHIC_ON_MUL  THEN CONJ_TAC  THENL
10546        [ONCE_REWRITE_TAC [GSYM o_DEF]  THEN
10547         MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10548         EXISTS_TAC `s:complex->bool`  THEN
10549         ASM_REWRITE_TAC[ETA_AX]  THEN
10550         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10551         ASM_REWRITE_TAC[];
10552         ONCE_REWRITE_TAC [GSYM o_DEF]  THEN
10553         MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10554         EXISTS_TAC `s:complex->bool`  THEN
10555         ASM_REWRITE_TAC[HOLOMORPHIC_ON_ID]  THEN
10556         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10557         ASM_REWRITE_TAC[]];
10558       GEN_TAC THEN DISCH_TAC  THEN
10559       MATCH_MP_TAC COMPLEX_DERIVATIVE_CHAIN  THEN
10560       CONJ_TAC  THENL
10561        [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT  THEN
10562         ASM_MESON_TAC [];
10563         MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT  THEN
10564         ASM_MESON_TAC []]];
10565     ALL_TAC] THEN
10566   EQ_TRANS_TAC
10567    `vsum (0..n)
10568       (\i. Cx (&(binom (n,i))) *
10569            higher_complex_derivative i
10570              (\w. complex_derivative f (ITER m f w)) z *
10571            higher_complex_derivative (n - i)
10572              (complex_derivative (ITER m f)) z)`  THENL
10573    [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_MUL  THEN
10574     EXISTS_TAC `s:complex->bool`  THEN
10575     ASM_REWRITE_TAC[]  THEN CONJ_TAC  THENL
10576      [ONCE_REWRITE_TAC [GSYM o_DEF]  THEN
10577       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN  THEN
10578       EXISTS_TAC `s:complex->bool`  THEN
10579       ASM_REWRITE_TAC[ETA_AX]  THEN
10580       MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10581       ASM_REWRITE_TAC[];
10582       MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE  THEN
10583       ASM_REWRITE_TAC[]];
10584     ALL_TAC] THEN
10585   EQ_TRANS_TAC
10586    `vsum {0,n}
10587       (\i. Cx (&(binom (n,i))) *
10588            higher_complex_derivative i
10589              (\w. complex_derivative f (ITER m f w)) z *
10590            higher_complex_derivative (n - i)
10591              (complex_derivative (ITER m f)) z)`  THENL
10592    [MATCH_MP_TAC VSUM_SUPERSET  THEN
10593     REWRITE_TAC [INSERT_SUBSET; EMPTY_SUBSET; IN_NUMSEG_0; LE_0; LE_REFL;
10594                  IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM]  THEN
10595     X_GEN_TAC `i:num`  THEN
10596     STRIP_TAC  THEN
10597     REWRITE_TAC [GSYM higher_complex_derivative_alt]  THEN
10598     ASSERT_TAC `1 < SUC (n-i) /\ SUC (n-i) <= n`  THENL
10599      [ASM_SIMP_TAC [ARITH_RULE `i <= n /\ ~(i=0) /\ ~(i=n)
10600                                 ==> 1 < SUC (n-i) /\ SUC (n-i) <= n`];
10601       ALL_TAC] THEN
10602     ASM_SIMP_TAC []  THEN
10603     SUBGOAL_THEN
10604       `higher_complex_derivative (SUC (n - i)) (ITER m f) z = Cx(&0)`
10605       SUBST1_TAC  THENL
10606      [EQ_TRANS_TAC `higher_complex_derivative (SUC (n - i)) f z`  THENL
10607        [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_ITER_LEMMA  THEN
10608         EXISTS_TAC `s:complex->bool`  THEN
10609         ASM_REWRITE_TAC []  THEN
10610         EXISTS_TAC `n:num`  THEN
10611         ASM_REWRITE_TAC [];
10612         FIRST_X_ASSUM MATCH_MP_TAC  THEN
10613         ASM_REWRITE_TAC []];
10614       ASM_REWRITE_TAC [COMPLEX_MUL_RZERO; COMPLEX_VEC_0]];
10615     ALL_TAC] THEN
10616   SIMP_TAC [VSUM_CLAUSES; FINITE_RULES; IN_INSERT; NOT_IN_EMPTY]  THEN
10617   REWRITE_TAC [binom; BINOM_REFL; COMPLEX_MUL_LID;
10618                SUB_REFL; SUB; higher_complex_derivative]  THEN
10619   ASM_CASES_TAC `n = 0` THEN ASM_REWRITE_TAC []  THENL
10620    [REWRITE_TAC [higher_complex_derivative]  THEN
10621     POP_ASSUM SUBST_ALL_TAC  THEN
10622     RULE_ASSUM_TAC (REWRITE_RULE [higher_complex_derivative])  THEN
10623     ASM_REWRITE_TAC [COMPLEX_MUL_RID; COMPLEX_MUL_LID;
10624                      COMPLEX_VEC_0; COMPLEX_ADD_RID]  THEN
10625     ASM_MESON_TAC [ARITH_RULE `~(1 <= 0)`];
10626     ALL_TAC] THEN
10627   ASM_REWRITE_TAC [COMPLEX_MUL_LID; COMPLEX_VEC_0; COMPLEX_ADD_RID]  THEN
10628   ASM_REWRITE_TAC [COMPLEX_MUL_RID]  THEN
10629   ASM_REWRITE_TAC [GSYM higher_complex_derivative_alt]  THEN
10630   SUBGOAL_THEN
10631     `(\w. complex_derivative f (ITER m f w)) = complex_derivative f o ITER m f`
10632     SUBST1_TAC
10633   THENL [REWRITE_TAC [FUN_EQ_THM; o_THM]; ALL_TAC] THEN
10634   SUBGOAL_THEN
10635     `higher_complex_derivative n (complex_derivative f o ITER m f) z =
10636      higher_complex_derivative n (complex_derivative f) (ITER m f z)`
10637   SUBST1_TAC  THENL
10638    [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_LEMMA  THEN
10639     EXISTS_TAC `s:complex->bool`  THEN
10640     EXISTS_TAC `s:complex->bool`  THEN
10641     EXISTS_TAC `n:num`  THEN
10642     ASM_REWRITE_TAC[]  THEN
10643     ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; LE_REFL]  THEN
10644     REPEAT STRIP_TAC  THEN
10645     EQ_TRANS_TAC `higher_complex_derivative i f z`  THENL
10646      [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_ITER_LEMMA  THEN
10647       EXISTS_TAC `s:complex->bool`  THEN
10648       EXISTS_TAC `n:num`  THEN
10649       ASM_REWRITE_TAC[];
10650       ASM_SIMP_TAC[]];
10651     ALL_TAC] THEN
10652   ASSERT_TAC `Cx (&(SUC m)) = Cx (&m) +  Cx (&1)`  THENL
10653    [REWRITE_TAC [GSYM CX_ADD; REAL_OF_NUM_ADD; ONE; ADD_SUC; ADD_0];
10654     ASM_REWRITE_TAC[COMPLEX_POLY_CLAUSES;
10655                     GSYM higher_complex_derivative_alt]]);;
10656
10657 let CAUCHY_HIGHER_COMPLEX_DERIVATIVE_BOUND = prove
10658  (`!f z y r B0 n.
10659      &0 < r /\ 0 < n /\
10660      f holomorphic_on ball(z,r) /\
10661      f continuous_on cball(z,r) /\
10662      (!w. w IN ball(z,r) ==> f w IN ball(y,B0))
10663      ==> norm (higher_complex_derivative n f z) <= &(FACT n) * B0 / r pow n`,
10664   REPEAT STRIP_TAC  THEN
10665   SUBGOAL_THEN `higher_complex_derivative n f z =
10666                 higher_complex_derivative n (\w. f w - y) z`
10667   SUBST1_TAC  THENL
10668    [EQ_TRANS_TAC `higher_complex_derivative n (\w. f w) z -
10669              higher_complex_derivative n (\w. y) z`  THENL
10670      [ASM_SIMP_TAC
10671        [HIGHER_COMPLEX_DERIVATIVE_CONST; ARITH_RULE `0<n ==> ~(n=0)`]  THEN
10672       REWRITE_TAC [COMPLEX_SUB_RZERO; ETA_AX];
10673       MATCH_MP_TAC EQ_SYM  THEN
10674       REWRITE_TAC [ETA_AX]  THEN
10675       MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_SUB  THEN
10676       EXISTS_TAC `ball(z:complex,r)`  THEN
10677       ASM_SIMP_TAC [OPEN_BALL; HOLOMORPHIC_ON_CONST; CENTRE_IN_BALL]];
10678     ALL_TAC] THEN
10679   SUBGOAL_THEN
10680    `norm ((Cx (&2) * Cx pi * ii) / Cx (&(FACT n))
10681           * higher_complex_derivative n (\w. f w - y) z)
10682     <= (B0 / r pow (n + 1)) * &2 * pi * r`
10683   MP_TAC THENL
10684    [MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH  THEN
10685     EXISTS_TAC `(\u. (f u - y) / (u - z) pow (n + 1))`  THEN
10686     EXISTS_TAC `z:complex`  THEN STRIP_TAC  THENL
10687      [MATCH_MP_TAC CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH  THEN
10688       ASM_SIMP_TAC[CENTRE_IN_BALL]  THEN CONJ_TAC  THENL
10689        [MATCH_MP_TAC CONTINUOUS_ON_SUB  THEN
10690         ASM_REWRITE_TAC [CONTINUOUS_ON_CONST];
10691         MATCH_MP_TAC HOLOMORPHIC_ON_SUB  THEN
10692         ASM_REWRITE_TAC [HOLOMORPHIC_ON_CONST]];
10693       ALL_TAC] THEN
10694     ASM_SIMP_TAC[]  THEN STRIP_TAC  THENL
10695      [MATCH_MP_TAC REAL_LE_DIV  THEN STRIP_TAC  THENL
10696        [MATCH_MP_TAC REAL_LT_IMP_LE  THEN
10697         MATCH_MP_TAC
10698          (prove(`(?x. &0 <= x /\ x < B0) ==> &0 < B0`, REAL_ARITH_TAC))  THEN
10699         EXISTS_TAC `norm ((\u. (f:complex->complex) u - y) z)`  THEN
10700         SIMP_TAC[NORM_POS_LE]  THEN
10701         SUBGOAL_THEN
10702          `!w:complex. f w IN ball(y,B0) ==> norm (f w - y) < B0`
10703         MATCH_MP_TAC  THENL
10704          [ASM_MESON_TAC [dist; DIST_SYM; IN_BALL; CENTRE_IN_BALL];
10705           ALL_TAC] THEN
10706         FIRST_ASSUM MATCH_MP_TAC  THEN
10707         ASM_SIMP_TAC[CENTRE_IN_BALL];
10708         MATCH_MP_TAC(SPECL [`r:real`;`n + 1`] REAL_POW_LE)  THEN
10709         ASM_SIMP_TAC[REAL_LT_IMP_LE]];
10710       REPEAT STRIP_TAC  THEN
10711       ASM_REWRITE_TAC[COMPLEX_NORM_DIV;COMPLEX_NORM_POW]  THEN
10712       ASM_SIMP_TAC [REAL_LE_DIV2_EQ; REAL_POW_LT]  THEN
10713       ONCE_REWRITE_TAC[MESON[] `!(f:complex->complex).
10714         (f x - y) = (\w. f w - y) x`]  THEN
10715       MATCH_MP_TAC CONTINUOUS_ON_CLOSURE_NORM_LE  THEN
10716       EXISTS_TAC `ball(z:complex,r)`  THEN
10717       ASM_SIMP_TAC[CLOSURE_BALL]  THEN
10718       REPEAT STRIP_TAC  THENL
10719        [MATCH_MP_TAC CONTINUOUS_ON_SUB  THEN
10720         ASM_SIMP_TAC[CONTINUOUS_ON_CONST];
10721         SUBGOAL_THEN
10722         `!w:complex. f w IN ball(y,B0) ==> norm (f w - y) <= B0`
10723         MATCH_MP_TAC  THENL
10724          [REWRITE_TAC[GSYM dist;IN_BALL;DIST_SYM;REAL_LT_IMP_LE];
10725           ASM_MESON_TAC [dist; DIST_SYM; IN_BALL; CENTRE_IN_BALL]];
10726         ASM_REWRITE_TAC[cball;IN_ELIM_THM;dist;DIST_SYM]  THEN
10727         ASM_SIMP_TAC[REAL_EQ_IMP_LE]]];
10728       ALL_TAC] THEN
10729   REWRITE_TAC [COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_II;
10730                COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_ABS_PI;
10731                REAL_MUL_RID]  THEN
10732   STRIP_TAC  THEN
10733   ABBREV_TAC `a = (&2 * pi) / &(FACT n)`  THEN
10734   SUBGOAL_THEN `&0 < a` ASSUME_TAC  THENL
10735    [EXPAND_TAC "a"  THEN
10736     SIMP_TAC[REAL_LT_DIV; REAL_LT_MUL; REAL_OF_NUM_LT; FACT_LT; ARITH; PI_POS];
10737     ALL_TAC] THEN
10738   SUBGOAL_THEN
10739   `B0 / r pow (n + 1) * &2 * pi * r = a * (&(FACT n) * B0 / r pow n)`
10740   SUBST_ALL_TAC  THENL
10741    [EXPAND_TAC "a"  THEN
10742     REWRITE_TAC [GSYM ADD1; real_pow] THEN
10743     SUBGOAL_THEN `~(&(FACT n) = &0) /\ &0 < r` MP_TAC  THENL
10744      [ASM_REWRITE_TAC[FACT_NZ; REAL_OF_NUM_EQ];
10745       CONV_TAC REAL_FIELD];
10746    ASM_MESON_TAC [REAL_LE_LCANCEL_IMP]]);;
10747
10748 let FIRST_CARTAN_THM_DIM_1 = prove
10749   (`!f s z w.
10750       open s /\ connected s /\ bounded s /\
10751       (!w. w IN s ==> f w IN s) /\ f holomorphic_on s /\
10752       z IN s /\ f z = z /\
10753       complex_derivative f z = Cx (&1) /\ w IN s
10754       ==> f w = w`,
10755    REWRITE_TAC [RIGHT_FORALL_IMP_THM; IMP_CONJ] THEN REPEAT GEN_TAC THEN
10756    REPEAT DISCH_TAC THEN REPEAT STRIP_TAC THEN EQ_TRANS_TAC `I w:complex` THENL
10757    [MATCH_MP_TAC HOLOMORPHIC_FUN_EQ_ON_CONNECTED;
10758     REWRITE_TAC [I_THM]] THEN
10759    EXISTS_TAC `z:complex` THEN EXISTS_TAC `s:complex->bool` THEN
10760    ASM_REWRITE_TAC [I_DEF; HOLOMORPHIC_ON_ID] THEN
10761    GEN_TAC THEN STRIP_ASSUME_TAC (ARITH_RULE `n = 0 \/ n = 1 \/ 1 < n`) THENL
10762    [ASM_REWRITE_TAC [higher_complex_derivative];
10763     ASM_REWRITE_TAC [ONE; higher_complex_derivative; COMPLEX_DERIVATIVE_ID];
10764     ASM_REWRITE_TAC [HIGHER_COMPLEX_DERIVATIVE_ID]] THEN
10765    ASM_SIMP_TAC [ARITH_RULE `1 < n ==> ~(n=0) /\ ~(n=1)`] THEN
10766    POP_ASSUM MP_TAC THEN SPEC_TAC (`n:num`,`n:num`) THEN
10767    MATCH_MP_TAC num_WF THEN REPEAT STRIP_TAC THEN
10768    REWRITE_TAC [GSYM COMPLEX_NORM_ZERO] THEN
10769    MATCH_MP_TAC REAL_ARCH_RDIV_EQ_0 THEN REWRITE_TAC [NORM_POS_LE] THEN
10770    ASSERT_TAC `?c. s SUBSET ball(z:complex,c)` THENL
10771    [ASSERT_TAC `?c. !w:complex. w IN s ==> norm w <= c` THENL
10772     [ASM_REWRITE_TAC[GSYM bounded];
10773      EXISTS_TAC `&2 * c + &1` THEN REWRITE_TAC [SUBSET] THEN GEN_TAC THEN
10774      DISCH_TAC THEN
10775      SUBGOAL_THEN `norm (x:complex) <= c /\ norm (z:complex) <= c` MP_TAC THENL
10776      [ASM_MESON_TAC[]; REWRITE_TAC [IN_BALL] THEN NORM_ARITH_TAC]];
10777     ALL_TAC] THEN
10778    ASSERT_TAC `?r. &0 < r /\ cball(z:complex,r) SUBSET s` THENL
10779    [ASM_MESON_TAC [OPEN_CONTAINS_CBALL];
10780     EXISTS_TAC `&(FACT n) * c / r pow n`] THEN
10781    ASSERT_TAC `&0 < c` THENL
10782    [SUBGOAL_THEN `~(ball(z:complex,c) = {})` MP_TAC THENL
10783     [ASM SET_TAC[]; ASM_REWRITE_TAC [BALL_EQ_EMPTY; REAL_NOT_LE]];
10784     ALL_TAC] THEN
10785    ASSERT_TAC `ball(z:complex,r) SUBSET s` THENL
10786    [ASM_MESON_TAC [SUBSET_TRANS; BALL_SUBSET_CBALL]; ALL_TAC] THEN
10787    CONJ_TAC THENL
10788    [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL
10789     [MATCH_MP_TAC REAL_LT_IMP_LE THEN MATCH_MP_TAC REAL_LTE_TRANS THEN
10790      EXISTS_TAC `&1` THEN REWRITE_TAC [REAL_LT_01; FACT_LE; REAL_OF_NUM_LE];
10791      MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC [REAL_LT_IMP_LE; REAL_POW_LE]];
10792     ALL_TAC] THEN
10793    REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC [GSYM COMPLEX_NORM_NUM] THEN
10794    REWRITE_TAC [GSYM COMPLEX_NORM_MUL] THEN SUBGOAL_THEN
10795       `Cx(&m) * higher_complex_derivative n f z =
10796        higher_complex_derivative n (ITER m f) z`
10797      SUBST1_TAC THENL
10798    [MATCH_MP_TAC (GSYM HIGHER_COMPLEX_DERIVATIVE_ITER_TOP_LEMMA) THEN
10799     EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [];
10800     ALL_TAC] THEN
10801    REWRITE_TAC [COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_POS] THEN
10802    MATCH_MP_TAC CAUCHY_HIGHER_COMPLEX_DERIVATIVE_BOUND THEN
10803    EXISTS_TAC `z:complex` THEN ASM_SIMP_TAC [ARITH_RULE `1<n ==> 0 < n`] THEN
10804    ASSERT_TAC `!m w. w:complex IN s ==> ITER m f w IN s` THENL
10805    [INDUCT_TAC THEN ASM_SIMP_TAC [ITER];
10806     ASSERT_TAC `!m. ITER m f holomorphic_on s` THENL
10807     [INDUCT_TAC THEN REWRITE_TAC [ITER_POINTLESS] THENL
10808      [ASM_SIMP_TAC [I_DEF; HOLOMORPHIC_ON_ID];
10809       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
10810       EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC []];
10811      ASSERT_TAC `ITER m f holomorphic_on ball(z,r)` THENL
10812      [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN ASM SET_TAC [];
10813       ASM_REWRITE_TAC[]] THEN
10814      CONJ_TAC THENL
10815      [ASM_MESON_TAC [CONTINUOUS_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
10816       ASM SET_TAC []]]]);;
10817
10818 (* ------------------------------------------------------------------------- *)
10819 (* Second Cartan Theorem.                                                    *)
10820 (* ------------------------------------------------------------------------- *)
10821
10822 let SECOND_CARTAN_THM_DIM_1 = prove
10823  (`!g f r.
10824      &0 < r /\
10825      g holomorphic_on ball(Cx(&0),r) /\
10826      (!z. z IN ball(Cx(&0),r) ==> g z IN ball(Cx(&0),r)) /\
10827      g(Cx(&0)) = Cx(&0) /\
10828      f holomorphic_on ball(Cx(&0),r) /\
10829      (!z. z IN ball(Cx(&0),r) ==> f z IN ball(Cx(&0),r)) /\
10830      f (Cx(&0)) = Cx(&0) /\
10831      (!z. z IN ball(Cx(&0),r) ==> g (f z) = z) /\
10832      (!z. z IN ball(Cx(&0),r) ==> f (g z) = z)
10833      ==> ?t. !z. z IN ball(Cx(&0),r) ==> g z = cexp (ii * Cx t) * z`,
10834   let COMPLEX_DERIVATIVE_LEFT_INVERSE = prove
10835     (`!s t f g w.
10836        open s /\ open t /\
10837        (!z. z IN s ==> f z IN t) /\ f holomorphic_on s /\
10838        (!z. z IN t ==> g z IN s) /\ g holomorphic_on t /\
10839        (!z. z IN s ==> g (f z) = z) /\ w IN s
10840        ==> complex_derivative f w * complex_derivative g (f w) = Cx(&1)`,
10841      REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC [COMPLEX_MUL_SYM] THEN
10842      SUBGOAL_THEN `complex_derivative g (f w) * complex_derivative f w =
10843                    complex_derivative (g o f) w ` SUBST1_TAC THENL
10844      [ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT;
10845                      COMPLEX_DERIVATIVE_CHAIN];
10846       EQ_TRANS_TAC `complex_derivative (\u. u) w` THENL
10847       [MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
10848        EXISTS_TAC `s:complex->bool` THEN
10849        ASM_SIMP_TAC[HOLOMORPHIC_ON_ID;o_THM] THEN
10850        ASM_MESON_TAC [HOLOMORPHIC_ON_COMPOSE_GEN];
10851        ASM_SIMP_TAC[COMPLEX_DERIVATIVE_ID]]]) in
10852   let LEMMA_1 = prove
10853     (`!s f.
10854         open s /\ connected s /\ f holomorphic_on s /\ Cx(&0) IN s /\
10855         (!u z. norm u = &1 /\ z IN s ==> u * z IN s) /\
10856         (!u z. norm u = &1 /\ z IN s ==> f (u * z) = u * f z)
10857         ==> ?c. !z. z IN s ==> f z = c * z`,
10858      REPEAT STRIP_TAC THEN ABBREV_TAC `c = complex_derivative f (Cx(&0))` THEN
10859      EXISTS_TAC `c : complex` THEN
10860      SUBGOAL_THEN `f(Cx(&0)) = Cx(&0)` ASSUME_TAC THENL
10861      [FIRST_X_ASSUM (MP_TAC o SPECL [`--Cx(&1)`;`Cx(&0)`]) THEN
10862       ASM_REWRITE_TAC [NORM_NEG; COMPLEX_NORM_NUM; COMPLEX_MUL_RZERO] THEN
10863       CONV_TAC COMPLEX_RING; ALL_TAC] THEN
10864      SUBGOAL_THEN
10865        `!n u z.
10866           norm u = &1 /\ z IN s ==>
10867           u pow n * higher_complex_derivative n f (u * z) =
10868        u * higher_complex_derivative n f z`
10869        ASSUME_TAC THENL
10870      [REPEAT STRIP_TAC THEN
10871       EQ_TRANS_TAC `higher_complex_derivative n (\w. f (u * w)) z` THENL
10872       [MATCH_MP_TAC EQ_SYM THEN
10873        MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMPOSE_LINEAR THEN
10874        EXISTS_TAC `s:complex->bool` THEN EXISTS_TAC `s:complex->bool` THEN
10875        ASM_SIMP_TAC[]; ALL_TAC] THEN
10876       EQ_TRANS_TAC `higher_complex_derivative n (\w. u * f w) z` THENL
10877       [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
10878        EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL
10879        [MATCH_MP_TAC
10880          (REWRITE_RULE [o_DEF]
10881            (SPECL [`\w:complex. u*w`; `f:complex->complex`]
10882                HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
10883         EXISTS_TAC `s:complex->bool` THEN
10884         ASM_SIMP_TAC [HOLOMORPHIC_ON_LINEAR];
10885         MATCH_MP_TAC
10886           (REWRITE_RULE [o_DEF]
10887             (SPECL [`f:complex->complex`; `\w:complex. u*w`]
10888                    HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
10889         EXISTS_TAC `(:complex)` THEN
10890         ASM_REWRITE_TAC [HOLOMORPHIC_ON_LINEAR; IN_UNIV]];
10891         POP_ASSUM MP_TAC THEN SPEC_TAC (`z:complex`,`z:complex`) THEN
10892        SPEC_TAC (`n:num`,`n:num`) THEN INDUCT_TAC THEN
10893        REWRITE_TAC [higher_complex_derivative] THEN GEN_TAC THEN
10894        DISCH_TAC THEN EQ_TRANS_TAC
10895          `complex_derivative (\w. u * higher_complex_derivative n f w) z`
10896        THENL
10897        [MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
10898         EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
10899         [MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
10900          ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
10901          ASM_REWRITE_TAC [HOLOMORPHIC_ON_CONST];
10902          MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
10903          ASM_REWRITE_TAC [HOLOMORPHIC_ON_CONST; ETA_AX] THEN
10904          MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
10905          ASM_REWRITE_TAC[]];
10906         MATCH_MP_TAC COMPLEX_DERIVATIVE_LMUL THEN
10907         MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
10908         ASM_MESON_TAC [HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]]];
10909       SUBGOAL_THEN
10910         `!n. 2 <= n ==> higher_complex_derivative n f (Cx(&0)) = Cx(&0)`
10911         ASSUME_TAC THENL
10912       [GEN_TAC THEN  DISCH_TAC THEN SUBGOAL_THEN
10913          `!n z. 2 <= n /\
10914                 (!u. norm u = &1 ==> u pow n * z = u * z) ==> z = Cx(&0)`
10915          MATCH_MP_TAC THENL
10916        [REPEAT STRIP_TAC THEN MATCH_MP_TAC
10917          (COMPLEX_RING
10918            `!u. ~(u pow n' = u) /\ u pow n' * z = u * z ==> z = Cx(&0)`) THEN
10919         SUBGOAL_THEN `2 <= n' ==> ?u. norm u = &1 /\ ~(u pow n' = u)`
10920           (fun th -> ASM_MESON_TAC [th]) THEN
10921         STRUCT_CASES_TAC (SPEC `n':num` num_CASES) THEN
10922         REWRITE_TAC
10923           [ARITH_LE; ARITH_RULE `2 <= SUC n'' <=> 1 <= n''`; complex_pow] THEN
10924         DISCH_TAC THEN MP_TAC (SPEC `n'':num` COMPLEX_NOT_ROOT_UNITY) THEN
10925         ASM_REWRITE_TAC [] THEN STRIP_TAC THEN EXISTS_TAC `u:complex` THEN
10926         ASM_REWRITE_TAC [] THEN POP_ASSUM MP_TAC THEN
10927         REWRITE_TAC [CONTRAPOS_THM] THEN
10928         SUBGOAL_THEN `~(u = Cx(&0))` MP_TAC THENL
10929         [ASM_REWRITE_TAC [GSYM COMPLEX_NORM_ZERO; REAL_OF_NUM_EQ; ARITH_EQ];
10930          CONV_TAC COMPLEX_FIELD];
10931         EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
10932         FIRST_X_ASSUM (MP_TAC o SPECL [`n:num`;`u:complex`;`Cx(&0)`]) THEN
10933         ASM_REWRITE_TAC[COMPLEX_MUL_RZERO]];
10934        REPEAT STRIP_TAC THEN MATCH_MP_TAC
10935         (REWRITE_RULE []
10936           (SPECL [`f:complex->complex`; `\z. c*z`; `Cx(&0)`;
10937                   `s:complex->bool`]
10938              HOLOMORPHIC_FUN_EQ_ON_CONNECTED)) THEN
10939        ASM_REWRITE_TAC [COMPLEX_MUL_RZERO; HOLOMORPHIC_ON_LINEAR;
10940                         HIGHER_COMPLEX_DERIVATIVE_LINEAR] THEN
10941        GEN_TAC THEN FIRST_X_ASSUM (MP_TAC o SPEC `n:num`) THEN
10942        STRUCT_CASES_TAC (ARITH_RULE `n = 0 \/ n = 1 \/ 2 <= n`) THEN
10943        ASM_SIMP_TAC [higher_complex_derivative; ARITH_EQ; ARITH_LE; ONE] THEN
10944        ASM_SIMP_TAC [ARITH_RULE `2 <= n ==> ~(n=0)`] THEN
10945        ASM_SIMP_TAC [ARITH_RULE `2 <= n ==> ~(n=SUC 0)`]]]) in
10946   let LEMMA_2 = prove
10947     (`!r c. &0 < r /\ &0 <= c /\
10948             (!x. &0 <= x /\ x < r ==> c * x < r)
10949             ==> c <= &1`,
10950      REPEAT STRIP_TAC THEN REWRITE_TAC [GSYM REAL_NOT_LT] THEN STRIP_TAC THEN
10951      FIRST_X_ASSUM (MP_TAC o SPEC `r * (c + &1) / (&2 * c)`) THEN
10952      REWRITE_TAC [MESON [] `((a ==> b) ==> F) <=> (a /\ ~b)`] THEN
10953      CONJ_TAC THENL
10954      [CONJ_TAC THENL
10955       [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL
10956        [ASM_REAL_ARITH_TAC; MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC];
10957        ALL_TAC] THEN
10958       MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `r * &1` THEN
10959       CONJ_TAC THENL [ALL_TAC; REWRITE_TAC [REAL_MUL_RID; REAL_LE_REFL]] THEN
10960       MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[] THEN
10961       SUBGOAL_THEN `&0 < &2 * c` ASSUME_TAC THENL
10962       [ASM_REAL_ARITH_TAC;
10963        ASM_SIMP_TAC [REAL_LT_LDIV_EQ] THEN ASM_REAL_ARITH_TAC];
10964       REWRITE_TAC [REAL_NOT_LT] THEN
10965       ONCE_REWRITE_TAC [REAL_RING `!a b c:real. a * b * c = b * a * c`] THEN
10966       MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `r * &1` THEN CONJ_TAC THENL
10967       [REWRITE_TAC [REAL_MUL_RID; REAL_LE_REFL]; ALL_TAC] THEN
10968       MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL
10969       [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
10970       SUBGOAL_THEN `&0 < &2 * c` ASSUME_TAC THENL
10971       [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
10972        ASM_SIMP_TAC [REAL_ARITH `&0 < c ==> a * b / c = (a * b) / c`] THEN
10973        SUBGOAL_THEN `(c * (c + &1)) / (&2 * c) = (c + &1) / &2`
10974          SUBST1_TAC THENL
10975        [ASM_SIMP_TAC [RAT_LEMMA5; REAL_ARITH `&0 < &2`] THEN
10976         ASM_REAL_ARITH_TAC;
10977         ASM_REAL_ARITH_TAC]]) in
10978   REPEAT STRIP_TAC THEN SUBGOAL_THEN
10979     `!u z. norm u = &1 /\ z IN ball(Cx(&0),r) ==> u * g z = g (u * z)`
10980     ASSUME_TAC THENL
10981   [REPEAT STRIP_TAC THEN SUBGOAL_THEN `~(u = Cx(&0))` ASSUME_TAC THENL
10982    [ASM_REWRITE_TAC[GSYM COMPLEX_NORM_NZ] THEN REAL_ARITH_TAC; ALL_TAC] THEN
10983    SUBGOAL_THEN `!w. w IN ball(Cx(&0),r) ==> f (u * g w) / u = w`
10984      ASSUME_TAC THENL
10985    [REPEAT STRIP_TAC THEN MATCH_MP_TAC FIRST_CARTAN_THM_DIM_1 THEN
10986     EXISTS_TAC `ball(Cx(&0),r)` THEN EXISTS_TAC `Cx(&0)` THEN
10987     ASM_REWRITE_TAC [OPEN_BALL;CONNECTED_BALL;BOUNDED_BALL;
10988                     COMPLEX_MUL_RZERO; CENTRE_IN_BALL] THEN
10989     ASSERT_TAC `!z. norm (u * z) = norm z` THENL
10990     [ASM_REWRITE_TAC [COMPLEX_NORM_MUL; REAL_MUL_LID]; ALL_TAC] THEN
10991     ASSERT_TAC `!z. z IN ball(Cx(&0),r) ==> u * z IN ball(Cx(&0),r)` THENL
10992     [ASM_REWRITE_TAC [COMPLEX_IN_BALL_0]; ALL_TAC] THEN
10993     ASSERT_TAC `!z. z IN ball(Cx(&0),r) ==> z / u IN ball(Cx(&0),r)` THENL
10994     [ASM_REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_DIV; REAL_DIV_1];
10995      ALL_TAC] THEN
10996     CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN CONJ_TAC THENL
10997     [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN CONJ_TAC THENL
10998      [ALL_TAC; ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST]] THEN
10999      SUBGOAL_THEN `(\w:complex. f (u * g w) : complex) = f o (\w. u * g w)`
11000        SUBST1_TAC THENL
11001      [REWRITE_TAC [o_DEF]; MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN] THEN
11002      EXISTS_TAC `ball(Cx(&0),r)` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
11003      [MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
11004       ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST];
11005       ASM_SIMP_TAC[]];
11006      ALL_TAC] THEN
11007     CONJ_TAC THENL
11008     [REWRITE_TAC [complex_div; COMPLEX_MUL_LZERO]; ALL_TAC] THEN
11009     SUBGOAL_THEN `Cx(&1) = u / u` SUBST1_TAC THENL
11010     [ASM_SIMP_TAC [COMPLEX_DIV_REFL]; ALL_TAC] THEN
11011     MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
11012     MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_CDIV_AT THEN
11013     SUBGOAL_THEN `(\w:complex. f (u * g w) : complex) = f o (\w. u * g w)`
11014     SUBST1_TAC THENL [REWRITE_TAC [o_DEF]; ALL_TAC] THEN
11015     SUBGOAL_THEN
11016     `((\w. f (u * g w)) has_complex_derivative
11017       complex_derivative f (u * g(Cx(&0))) *
11018       (u * complex_derivative g (Cx(&0))))
11019      (at (Cx (&0)))` MP_TAC THENL
11020     [MATCH_MP_TAC (REWRITE_RULE [o_DEF]
11021       (SPECL [`\w:complex. u * g(w):complex`; `f:complex->complex`]
11022       COMPLEX_DIFF_CHAIN_AT)) THEN CONJ_TAC THENL
11023      [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_LMUL_AT THEN
11024       REWRITE_TAC [HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
11025       MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
11026       EXISTS_TAC `ball(Cx(&0),r)` THEN
11027       ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL];
11028       REWRITE_TAC [HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
11029       MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
11030       EXISTS_TAC `ball(Cx(&0),r)` THEN
11031       ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; COMPLEX_MUL_RZERO]];
11032      SUBGOAL_THEN
11033        `complex_derivative f (u * g (Cx (&0))) *
11034         (u * complex_derivative g (Cx (&0))) = u`
11035        SUBST1_TAC THENL
11036      [ALL_TAC; REWRITE_TAC[o_DEF]] THEN
11037      ABBREV_TAC `g' = complex_derivative g (Cx(&0))` THEN
11038      ABBREV_TAC `f' = complex_derivative f (Cx(&0))` THEN
11039      SUBGOAL_THEN `f' * g' = Cx(&1)` ASSUME_TAC THENL
11040      [EXPAND_TAC "g'" THEN EXPAND_TAC "f'" THEN
11041       SUBGOAL_THEN `complex_derivative g (Cx(&0)) =
11042                     complex_derivative g (f (Cx(&0)))` SUBST1_TAC THENL
11043       [ASM_REWRITE_TAC [];
11044        MATCH_MP_TAC COMPLEX_DERIVATIVE_LEFT_INVERSE THEN
11045        EXISTS_TAC `ball(Cx(&0),r)` THEN EXISTS_TAC `ball(Cx(&0),r)` THEN
11046        ASM_REWRITE_TAC [OPEN_BALL; CENTRE_IN_BALL]];
11047       ASM_REWRITE_TAC [COMPLEX_MUL_RZERO] THEN
11048       POP_ASSUM MP_TAC THEN CONV_TAC COMPLEX_RING]];
11049     SUBGOAL_THEN `f(u*g(z)) = f (g (u * z)) : complex` MP_TAC THENL
11050     [MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC `u * z:complex` THEN CONJ_TAC THENL
11051      [SUBGOAL_THEN `!x y:complex. x / u = y ==> x = u * y` MATCH_MP_TAC THENL
11052       [REWRITE_TAC [complex_div] THEN GEN_TAC THEN GEN_TAC THEN
11053        DISCH_THEN (SUBST1_TAC o GSYM) THEN
11054        SUBGOAL_THEN `x = (inv u * u) * x` MP_TAC THENL
11055        [ASM_SIMP_TAC [COMPLEX_MUL_LINV; COMPLEX_MUL_LID];
11056         REWRITE_TAC [COMPLEX_MUL_AC]];
11057        POP_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC []];
11058       MATCH_MP_TAC EQ_SYM THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
11059       ASM_REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_MUL; REAL_MUL_LID] THEN
11060       ASM_REWRITE_TAC [GSYM COMPLEX_IN_BALL_0]];
11061      DISCH_TAC THEN SUBGOAL_THEN
11062        `g (f (u * g z)) = g (f (g (u * z : complex))) : complex` MP_TAC THENL
11063      [POP_ASSUM SUBST1_TAC THEN REWRITE_TAC [];
11064       SUBGOAL_THEN `u * g z IN ball (Cx(&0),r) /\ u * z IN ball(Cx(&0),r)`
11065       MP_TAC THENL
11066       [ASM_REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_MUL; REAL_MUL_LID] THEN
11067        REWRITE_TAC [GSYM COMPLEX_IN_BALL_0] THEN ASM_SIMP_TAC[];
11068        ASM_SIMP_TAC[]]]]];
11069    SUBGOAL_THEN `?c. !z. z IN ball(Cx(&0),r) ==> g z = c * z`
11070      STRIP_ASSUME_TAC THENL
11071    [MATCH_MP_TAC LEMMA_1 THEN
11072     ASM_SIMP_TAC [OPEN_BALL; CONNECTED_BALL; CENTRE_IN_BALL] THEN
11073     SIMP_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_MUL; REAL_MUL_LID];
11074     ALL_TAC] THEN
11075    SUBGOAL_THEN `norm (c:complex) = &1` ASSUME_TAC THENL
11076    [ALL_TAC; ASM_MESON_TAC [COMPLEX_NORM_EQ_1_CEXP]] THEN
11077    SUBGOAL_THEN `~(norm (c:complex) = &0)` ASSUME_TAC THENL
11078    [REWRITE_TAC [COMPLEX_NORM_ZERO] THEN STRIP_TAC THEN
11079     SUBGOAL_THEN `Cx(&0) = Cx(r / &2)` MP_TAC THENL
11080     [ALL_TAC; REWRITE_TAC [CX_INJ] THEN ASM_REAL_ARITH_TAC] THEN
11081     SUBGOAL_THEN `Cx(r / &2) IN ball(Cx(&0),r)` ASSUME_TAC THENL
11082     [REWRITE_TAC [COMPLEX_IN_BALL_0; CX_DIV; COMPLEX_NORM_DIV;
11083                   COMPLEX_NORM_NUM] THEN
11084      REWRITE_TAC [COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
11085      EQ_TRANS_TAC `g (f (Cx(r / &2)):complex):complex` THENL
11086      [EQ_TRANS_TAC `c * (f (Cx(r / &2)):complex)` THENL
11087       [ASM_REWRITE_TAC [COMPLEX_MUL_LZERO]; ASM_MESON_TAC[]];
11088       ASM_MESON_TAC[]]];
11089     ALL_TAC] THEN SUBGOAL_THEN `&0 < norm (c:complex)` ASSUME_TAC THENL
11090    [POP_ASSUM MP_TAC THEN CONV_TAC NORM_ARITH; ALL_TAC] THEN
11091     REWRITE_TAC [GSYM REAL_LE_ANTISYM] THEN CONJ_TAC THENL
11092    [MATCH_MP_TAC LEMMA_2 THEN EXISTS_TAC `r : real` THEN
11093     ASM_REWRITE_TAC [NORM_POS_LE] THEN GEN_TAC THEN STRIP_TAC THEN
11094     ABBREV_TAC `p = Cx x` THEN
11095     SUBGOAL_THEN `x = norm (p:complex)` SUBST_ALL_TAC THENL
11096     [EXPAND_TAC "p" THEN REWRITE_TAC [COMPLEX_NORM_CX] THEN
11097      ASM_REAL_ARITH_TAC;
11098      REWRITE_TAC [GSYM COMPLEX_NORM_MUL] THEN
11099      SUBGOAL_THEN `c * p = g p` SUBST1_TAC THENL
11100      [ALL_TAC; ASM_MESON_TAC [COMPLEX_IN_BALL_0]] THEN
11101      FIRST_X_ASSUM (MATCH_MP_TAC o GSYM) THEN
11102      ASM_MESON_TAC [COMPLEX_IN_BALL_0]];
11103     ALL_TAC] THEN
11104    SUBST1_TAC (GSYM (SPEC `norm (c:complex)` REAL_INV_INV)) THEN
11105    MATCH_MP_TAC REAL_INV_1_LE THEN CONJ_TAC THENL
11106    [ASM_MESON_TAC [REAL_LT_INV]; ALL_TAC] THEN
11107    MATCH_MP_TAC LEMMA_2 THEN EXISTS_TAC `r:real` THEN ASM_REWRITE_TAC [] THEN
11108    CONJ_TAC THENL
11109    [MATCH_MP_TAC REAL_LE_INV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
11110    GEN_TAC THEN STRIP_TAC THEN
11111    SUBGOAL_THEN `x = norm (g (f (Cx x):complex):complex)` SUBST1_TAC THENL
11112    [SUBGOAL_THEN `g (f (Cx x):complex) = Cx x` SUBST1_TAC THENL
11113     [FIRST_X_ASSUM MATCH_MP_TAC THEN
11114      REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_CX] THEN
11115      ASM_REAL_ARITH_TAC;
11116      REWRITE_TAC [COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC];
11117     SUBGOAL_THEN `g (f (Cx x):complex) = c * f (Cx x) : complex`
11118       SUBST1_TAC THENL
11119     [FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
11120      REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_CX] THEN
11121      ASM_REAL_ARITH_TAC;
11122      REWRITE_TAC [COMPLEX_NORM_MUL; REAL_MUL_ASSOC] THEN
11123      ASM_SIMP_TAC [REAL_MUL_LINV; REAL_MUL_LID; GSYM COMPLEX_IN_BALL_0] THEN
11124      FIRST_X_ASSUM MATCH_MP_TAC THEN
11125      REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_CX] THEN
11126      ASM_REAL_ARITH_TAC]]]);;
11127
11128 (* ------------------------------------------------------------------------- *)
11129 (* Cauchy's inequality.                                                      *)
11130 (* ------------------------------------------------------------------------- *)
11131
11132 let CAUCHY_INEQUALITY = prove
11133  (`!f z r (B:real) n.
11134      f continuous_on cball(z,r) /\
11135      f holomorphic_on ball(z,r) /\ &0 < r /\
11136      (!x:complex. norm(z-x) = r ==> norm(f x) <= B)
11137      ==> norm (higher_complex_derivative n f z) <= &(FACT n) * B / r pow n`,
11138   REPEAT STRIP_TAC THEN SUBGOAL_THEN `&0 <= B` ASSUME_TAC THENL
11139   [SUBGOAL_THEN `?x:complex. norm (z-x) = r` STRIP_ASSUME_TAC THENL [
11140   EXISTS_TAC `z + Cx r` THEN ASM_SIMP_TAC[COMPLEX_ADD_SUB2;NORM_NEG;
11141   COMPLEX_NORM_CX;REAL_ABS_REFL;REAL_LT_IMP_LE];ALL_TAC] THEN
11142   ASM_MESON_TAC [NORM_POS_LE;REAL_LE_TRANS];
11143   SUBGOAL_THEN `norm ((Cx(&2) * Cx pi * ii) / Cx(&(FACT n))
11144           * higher_complex_derivative n f z)
11145     <= (B / r pow (n + 1)) * &2 * pi * r` MP_TAC THENL[
11146   MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH THEN
11147   EXISTS_TAC `\u. (f:complex->complex) u / (u - z) pow (n + 1)` THEN
11148   EXISTS_TAC `z:complex` THEN CONJ_TAC THENL [MATCH_MP_TAC
11149   CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH THEN
11150   ASM_SIMP_TAC [CENTRE_IN_BALL]; ALL_TAC] THEN CONJ_TAC THENL
11151   [MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC
11152   [REAL_POW_LE;REAL_LT_IMP_LE];ALL_TAC]THEN ASM_REWRITE_TAC []
11153   THEN GEN_TAC THEN DISCH_TAC THEN
11154   ASM_REWRITE_TAC [COMPLEX_NORM_DIV;COMPLEX_NORM_POW] THEN MATCH_MP_TAC
11155   REAL_LE_TRANS THEN EXISTS_TAC `B:real / r pow (n+1)` THEN
11156   ASM_SIMP_TAC[ REAL_LE_DIV2_EQ; REAL_POW_LT;NORM_SUB;REAL_LE_REFL];
11157   REWRITE_TAC[COMPLEX_NORM_DIV;COMPLEX_NORM_MUL; COMPLEX_NORM_II;
11158   COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_ABS_PI; REAL_MUL_RID;REAL_ABS_NUM]
11159   THEN SUBGOAL_THEN `B / r pow (n + 1) * &2 * pi * r =
11160                 (&2 * pi) / &(FACT n) * (((&(FACT n) * B) * r/ r pow (n+1)))`
11161   SUBST1_TAC THENL [SUBGOAL_THEN `~(&(FACT n) = &0)` MP_TAC THENL
11162   [REWRITE_TAC [FACT_NZ;REAL_OF_NUM_EQ];ALL_TAC]
11163   THEN CONV_TAC REAL_FIELD;SUBGOAL_THEN `&0 < (&2 * pi) / &(FACT n)` ASSUME_TAC
11164   THENL[MATCH_MP_TAC REAL_LT_DIV THEN SIMP_TAC[FACT_LT;REAL_OF_NUM_LT] THEN
11165   MP_TAC PI_POS THEN REAL_ARITH_TAC;SUBGOAL_THEN `(&(FACT n) * B) * r / r pow
11166   (n + 1) = &(FACT n) * B / r pow n` SUBST1_TAC THENL
11167   [REWRITE_TAC[GSYM ADD1; real_pow] THEN MP_TAC (ASSUME `&0 < r`) THEN
11168   CONV_TAC REAL_FIELD; ASM_MESON_TAC [REAL_LE_LCANCEL_IMP]]]]]]);;
11169
11170 (* ------------------------------------------------------------------------- *)
11171 (* A holomorphic function f has only isolated zeros unless f is 0.           *)
11172 (* ------------------------------------------------------------------------- *)
11173
11174 let ISOLATED_ZEROS = prove
11175  (`!f a z w.
11176      open a /\ connected a /\ f holomorphic_on a /\ z IN a /\ f z = Cx(&0) /\
11177      w IN a /\ ~(f w = Cx(&0))
11178      ==> (?r. &0 < r /\ ball(z,r) SUBSET a /\
11179               (!w. w IN ball(z,r) /\ ~(w=z) ==> ~(f w = Cx(&0))))`,
11180   REPEAT STRIP_TAC THEN ASSERT_TAC `?k.
11181          ~(higher_complex_derivative k f z = Cx(&0)) /\
11182          (!n. n < k ==> higher_complex_derivative n f z = Cx(&0))` THENL
11183   [EXISTS_TAC `minimal n. (~(higher_complex_derivative n f z = Cx(&0)))`
11184   THEN SUBGOAL_THEN `?k'. ~(higher_complex_derivative k' f z = Cx(&0))`
11185   (fun th-> ASM_MESON_TAC[th;MINIMAL]) THEN REWRITE_TAC[GSYM NOT_FORALL_THM]
11186   THEN STRIP_TAC THEN ASM_MESON_TAC[HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED];
11187   ALL_TAC] THEN SUBGOAL_THEN `~(k = 0)`ASSUME_TAC THENL
11188   [STRIP_TAC THEN MP_TAC(ASSUME `~(higher_complex_derivative k f z = Cx(&0))`)
11189   THEN ASM_MESON_TAC[higher_complex_derivative];
11190   STRIP_ASSUME_TAC (MESON [OPEN_CONTAINS_BALL;ASSUME `open (a:complex->bool)`;
11191   ASSUME `z:complex IN a`] `?s. &0 < s /\ ball (z:complex,s) SUBSET a`)
11192   THEN ASSUME_TAC (MESON [HOLOMORPHIC_POWER_SERIES;
11193   ASSUME `f holomorphic_on a`;ASSUME `ball (z:complex,s)
11194   SUBSET a`;HOLOMORPHIC_ON_SUBSET] `!w:complex. w IN ball(z,s) ==>
11195   ((\n. higher_complex_derivative n f z / Cx(&(FACT n))*(w -z) pow n) sums f w)
11196   (from 0)`) THEN ASSERT_TAC `?g:complex->complex. !x:complex.
11197                 x IN ball(z,s) ==>
11198         (((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11199           (x - z) pow (n-k))) sums g x) (from k)` THENL
11200   [EXISTS_TAC `\x:complex. lim sequentially
11201   (\m. vsum (k..m) (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11202   (x - z) pow (n-k)))` THEN GEN_TAC THEN DISCH_TAC THEN
11203   SUBGOAL_THEN `!m. k..m = (0..m) INTER from k` ASSUME_TAC THENL
11204   [REWRITE_TAC[EXTENSION; IN_FROM; IN_INTER; IN_ELIM_THM; IN_NUMSEG] THEN
11205   ARITH_TAC;ASM_REWRITE_TAC[] THEN REWRITE_TAC
11206   [SET_RULE `!m. (0..m) INTER from k = from k INTER (0..m)`;SUMS_LIM]] THEN
11207   ASM_CASES_TAC `x:complex = z` THENL
11208   [ASM_REWRITE_TAC[COMPLEX_SUB_REFL;summable] THEN
11209   EXISTS_TAC `higher_complex_derivative k f z / Cx(&(FACT k))` THEN
11210   MATCH_MP_TAC SUMS_EQ THEN EXISTS_TAC `\n. if n = k then
11211   higher_complex_derivative k f z / Cx(&(FACT k)) else Cx(&0)`
11212   THEN CONJ_TAC THENL [REWRITE_TAC [IN_FROM] THEN GEN_TAC THEN DISCH_TAC
11213   THEN COND_CASES_TAC THENL
11214   [ASM_REWRITE_TAC[COMPLEX_POW_ZERO;SUB_REFL;COMPLEX_MUL_RID];
11215   ASM_SIMP_TAC[COMPLEX_POW_ZERO; ARITH_RULE `k <= x' /\ ~(x' = k) ==>
11216   ~(x' - k = 0)`;COMPLEX_MUL_RZERO]]; MATCH_MP_TAC SERIES_VSUM THEN
11217   EXISTS_TAC `{k:num}` THEN SIMP_TAC [FINITE_SING;from;IN_SING;
11218   COMPLEX_VEC_0;VSUM_SING] THEN SET_TAC[LE_REFL]];
11219   MATCH_MP_TAC SUMMABLE_EQ THEN EXISTS_TAC
11220   `\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11221   (x - z) pow n / (x-z) pow k` THEN CONJ_TAC THENL [REWRITE_TAC [IN_FROM]
11222   THEN GEN_TAC THEN DISCH_TAC THEN SUBGOAL_THEN `(x:complex - z) pow (x' - k)
11223   = (x - z) pow x' / (x - z) pow k` (fun th->
11224   REWRITE_TAC[th;COMPLEX_EQ_MUL_LCANCEL]) THEN MATCH_MP_TAC
11225   COMPLEX_DIV_POW THEN ASM_SIMP_TAC [COMPLEX_SUB_0];
11226   SUBGOAL_THEN `(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11227   (x - z) pow n / (x - z) pow k) = (\n. (higher_complex_derivative n f z /
11228   Cx(&(FACT n)) *(x - z) pow n) / (x - z) pow k) ` SUBST1_TAC
11229   THENL [REWRITE_TAC [FUN_EQ_THM] THEN GEN_TAC THEN CONV_TAC COMPLEX_FIELD;
11230   MATCH_MP_TAC SUMMABLE_COMPLEX_DIV THEN MATCH_MP_TAC SUMMABLE_FROM_ELSEWHERE
11231   THEN EXISTS_TAC `0` THEN ASM_MESON_TAC[summable]]]];ALL_TAC] THEN
11232   ASSERT_TAC `~(g (z:complex) = Cx(&0)) /\
11233   (!x. x IN ball(z,s) ==> f x = (x - z) pow k * g(x))` THENL
11234   [CONJ_TAC THENL [MATCH_MP_TAC
11235   (COMPLEX_FIELD `!x y:complex. x = y /\ ~(y= Cx(&0)) ==> ~(x=Cx(&0))`) THEN
11236   EXISTS_TAC `higher_complex_derivative k f z / Cx(&(FACT k))` THEN
11237   CONJ_TAC THENL [ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0] THEN
11238   MATCH_MP_TAC SERIES_UNIQUE THEN EXISTS_TAC
11239   `(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11240   Cx(&0) pow (n-k))` THEN EXISTS_TAC `from (k +1)` THEN
11241   CONJ_TAC THENL [SUBST1_TAC (MESON [VSUM_SING_NUMSEG]
11242   `higher_complex_derivative k f z / Cx(&(FACT k)) =
11243   vsum (k..k) (\n. higher_complex_derivative n f z / Cx(&(FACT n))) `)
11244   THEN SUBGOAL_THEN  `vsum (k..k)  (\n. higher_complex_derivative n f z
11245   / Cx(&(FACT n))) = vsum (k..((k+1)-1)) (\n. higher_complex_derivative n f z
11246   / Cx(&(FACT n)) * Cx(&0) pow (n - k))` SUBST1_TAC THENL [
11247   REWRITE_TAC[VSUM_SING_NUMSEG; COMPLEX_POW_ZERO;SUB_REFL;COMPLEX_MUL_RID;
11248   ARITH_RULE `((k:num) + 1) -1 = k`];
11249   MATCH_MP_TAC SUMS_OFFSET THEN ASM_REWRITE_TAC[ARITH_RULE `k:num < k+1`]
11250   THEN POP_ASSUM (MP_TAC o SPEC `z:complex`) THEN
11251   ASM_REWRITE_TAC[CENTRE_IN_BALL;COMPLEX_SUB_REFL]];MATCH_MP_TAC
11252   SUMS_COMPLEX_0 THEN GEN_TAC THEN SIMP_TAC [IN_FROM;COMPLEX_POW_ZERO;
11253   ARITH_RULE `k + 1 <= n <=> ~(n-k= 0)`;COMPLEX_MUL_RZERO]];
11254   MATCH_MP_TAC (COMPLEX_FIELD `!x y. ~(x = Cx(&0)) /\ ~(y = Cx(&0))
11255   ==> ~(x / y = Cx(&0))`) THEN ASM_REWRITE_TAC[GSYM COMPLEX_NORM_ZERO] THEN
11256   SUBST1_TAC (MESON [COMPLEX_NORM_CX]
11257   `norm (Cx(&(FACT k))) = abs ((&(FACT k)))`) THEN
11258   SIMP_TAC [REAL_ABS_ZERO;FACT_LT;REAL_OF_NUM_LT;REAL_LT_IMP_NZ]]; ALL_TAC]
11259   THEN GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
11260   EXISTS_TAC `(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11261   (x - z) pow n)`THEN EXISTS_TAC `(from 0)` THEN
11262   CONJ_TAC  THENL [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[];
11263   ASM_CASES_TAC `x:complex = z` THENL [
11264   ASM_REWRITE_TAC[COMPLEX_SUB_REFL] THEN MATCH_MP_TAC SUMS_EQ THEN
11265   EXISTS_TAC `\n:num. Cx(&0)` THEN  CONJ_TAC THENL
11266   [REWRITE_TAC[IN_FROM;COMPLEX_POW_ZERO] THEN X_GEN_TAC `n:num` THEN
11267   DISCH_TAC THEN  COND_CASES_TAC THENL [
11268   ASM_REWRITE_TAC[higher_complex_derivative] THEN CONV_TAC COMPLEX_FIELD;
11269   REWRITE_TAC[COMPLEX_MUL_RZERO]];
11270   ASM_REWRITE_TAC[COMPLEX_POW_ZERO;COMPLEX_MUL_LZERO] THEN
11271   ASM_REWRITE_TAC[SERIES_0;GSYM COMPLEX_VEC_0]];ALL_TAC] THEN
11272   MATCH_MP_TAC SUMS_EQ THEN EXISTS_TAC `\n.(x-z) pow k *
11273   higher_complex_derivative n f z / Cx(&(FACT n)) *(x - z) pow (n - k)`
11274   THEN CONJ_TAC THENL [REWRITE_TAC[IN_FROM] THEN X_GEN_TAC `n:num`
11275   THEN DISCH_TAC THEN ASM_CASES_TAC `n:num < k` THENL [ASM_SIMP_TAC[]
11276   THEN CONV_TAC COMPLEX_FIELD;
11277   SUBGOAL_THEN `(x:complex-z) pow (n-k) = (x-z) pow n / (x-z) pow k`
11278   SUBST1_TAC THENL [MATCH_MP_TAC COMPLEX_DIV_POW THEN
11279   ASM_SIMP_TAC[COMPLEX_SUB_0; ARITH_RULE `~(n:num < k) ==> k <= n`];
11280   SUBST1_TAC (COMPLEX_FIELD `(x - z) pow k *
11281      higher_complex_derivative n f z / Cx(&(FACT n)) *
11282      (x - z) pow n / (x - z) pow k =
11283          higher_complex_derivative n f z / Cx(&(FACT n)) * (x-z) pow k *
11284      (x - z) pow n / (x - z) pow k`) THEN MESON_TAC [ASSUME `~(x:complex = z)`;
11285   COMPLEX_DIV_LMUL;COMPLEX_SUB_0;COMPLEX_POW_EQ_0]]];
11286   MATCH_MP_TAC SERIES_COMPLEX_LMUL THEN SUBST1_TAC
11287   (MESON [COMPLEX_ADD_RID] `(g:complex->complex) x = g x + Cx(&0)`) THEN
11288   SUBGOAL_THEN `Cx(&0) = vsum (0.. (k-1))
11289   (\n. higher_complex_derivative n f z / Cx(&(FACT n)) * (x - z) pow (n - k))`
11290   SUBST1_TAC THENL [ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
11291   REWRITE_TAC [GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC VSUM_EQ_0 THEN
11292   REWRITE_TAC [IN_NUMSEG] THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
11293   ASM_SIMP_TAC[ARITH_RULE ` ~(k = 0) /\ n <= k - 1 ==> n < k`] THEN
11294   REWRITE_TAC[COMPLEX_VEC_0] THEN CONV_TAC COMPLEX_FIELD;
11295   MATCH_MP_TAC SUMS_OFFSET_REV THEN
11296   ASM_SIMP_TAC[ARITH_RULE `0 <= k /\ ~(k = 0) ==> 0 < k`;LE_0]]]];ALL_TAC] THEN
11297   ASSERT_TAC `?r. &0 < r /\ (!x:complex. dist (z,x) < r ==>
11298                 ~((g:complex->complex) x = Cx(&0)))` THENL [
11299   MATCH_MP_TAC CONTINUOUS_ON_OPEN_AVOID THEN
11300   EXISTS_TAC `ball(z:complex, s)` THEN
11301   ASM_REWRITE_TAC[OPEN_BALL;CENTRE_IN_BALL]
11302   THEN MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
11303   MATCH_MP_TAC ANALYTIC_IMP_HOLOMORPHIC THEN MATCH_MP_TAC POWER_SERIES_ANALYTIC
11304   THEN EXISTS_TAC `\n. higher_complex_derivative (n+k) f z / Cx(&(FACT (n+k)))`
11305   THEN EXISTS_TAC `from 0` THEN REWRITE_TAC[] THEN GEN_TAC THEN DISCH_TAC
11306   THEN REWRITE_TAC[SERIES_FROM] THEN MATCH_MP_TAC LIM_TRANSFORM THEN
11307   EXISTS_TAC `(\n.vsum (k..(k+n))
11308   (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *(w' - z) pow (n-k)))`
11309   THEN CONJ_TAC THENL [SIMP_TAC [VSUM_OFFSET_0;ARITH_RULE
11310   `!k n :num.(k + n) - k = n`; ARITH_RULE `!k n:num. k <= k + n`;ADD_ASSOC;
11311   ARITH_RULE `!k n :num.(n + k) - k = n`] THEN
11312   SUBGOAL_THEN `(\x. vsum (0..x) (\i. higher_complex_derivative (i + k)
11313          f z / Cx(&(FACT (i + k))) * (w' - z) pow i)
11314          - vsum (0..x) (\n. higher_complex_derivative (n + k) f z
11315         / Cx(&(FACT (n + k))) * (w' - z) pow n)) = (\x. Cx(&0))`
11316         (fun th-> SIMP_TAC[th;COMPLEX_VEC_0;LIM_CONST]) THEN
11317   REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REWRITE_TAC[COMPLEX_SUB_0];
11318   SUBGOAL_THEN `(\n. vsum (k..k + n)
11319   (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *(w' - z) pow (n - k)))
11320   = (\n. vsum (k..n+k)(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11321   (w' - z) pow (n - k)))` SUBST1_TAC THENL [
11322   REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REWRITE_TAC[ADD_SYM];
11323   MP_TAC (ISPECL [`(\n. vsum (k..n)
11324         (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11325         (w' - z) pow (n - k)))`;`(g:complex->complex) w'`;`k:num`]
11326   SEQ_OFFSET) THEN ONCE_REWRITE_TAC[GSYM SERIES_FROM] THEN ASM_SIMP_TAC[]]];
11327   ALL_TAC] THEN EXISTS_TAC `min r s` THEN CONJ_TAC THENL
11328   [MP_TAC (CONJ (ASSUME `&0 < r`) (ASSUME `&0 < s`)) THEN REAL_ARITH_TAC;
11329   CONJ_TAC THENL [REWRITE_TAC[real_min] THEN COND_CASES_TAC
11330   THENL [MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,s)`
11331   THEN ASM_REWRITE_TAC[ball] THEN SET_TAC[ASSUME `r:real <= s`;REAL_LTE_TRANS];
11332   ASM_REWRITE_TAC[]];GEN_TAC THEN STRIP_TAC THEN
11333   SUBGOAL_THEN `(f:complex->complex) w' =
11334                 (w' - z) pow k * (g:complex->complex) w'` SUBST1_TAC
11335    THENL [FIRST_ASSUM MATCH_MP_TAC THEN
11336   MP_TAC (ASSUME `w':complex IN ball (z,min r s)`) THEN REWRITE_TAC [real_min]
11337   THEN COND_CASES_TAC THENL [ASM_MESON_TAC[IN_BALL;REAL_LTE_TRANS];
11338   REWRITE_TAC[]];SIMP_TAC [COMPLEX_ENTIRE;DE_MORGAN_THM] THEN
11339   CONJ_TAC THENL  [REWRITE_TAC[COMPLEX_POW_EQ_0;DE_MORGAN_THM]
11340   THEN DISJ1_TAC THEN ASM_REWRITE_TAC [COMPLEX_SUB_0];
11341   FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC (ASSUME `w':complex IN
11342   ball (z,min r s)`) THEN REWRITE_TAC [real_min] THEN COND_CASES_TAC
11343   THENL [REWRITE_TAC[IN_BALL];
11344   ASM_MESON_TAC[REAL_NOT_LE;IN_BALL;REAL_LT_TRANS]]]]]]]);;
11345
11346 (* ------------------------------------------------------------------------- *)
11347 (* Analytic continuation.                                                    *)
11348 (* ------------------------------------------------------------------------- *)
11349
11350 let ANALYTIC_CONTINUATION = prove
11351  (`!f a u z.
11352      open a /\ connected a /\ f holomorphic_on a /\ u SUBSET a /\ z IN a /\
11353      z limit_point_of u /\ (!w. w IN u ==> f w = Cx(&0))
11354      ==> (!w. w IN a ==> f w = Cx(&0))`,
11355   REPEAT GEN_TAC THEN STRIP_TAC THEN
11356   REWRITE_TAC[TAUT ` (p ==> q) <=> ~( p /\ (~ q))`;GSYM NOT_EXISTS_THM]
11357   THEN STRIP_TAC THEN SUBGOAL_THEN  `(f:complex->complex) z = Cx(&0)`
11358   ASSUME_TAC THENL [STRIP_ASSUME_TAC(MESON [OPEN_CONTAINS_CBALL;
11359   ASSUME `open (a:complex->bool)`; ASSUME `z:complex IN a`]
11360   `?e. &0 < e /\ cball (z:complex,e) SUBSET a`) THEN ABBREV_TAC
11361   `s = cball(z:complex,e) INTER (u:complex->bool)` THEN
11362   ASSERT_TAC `f:complex->complex continuous_on closure s /\
11363                 (!x:complex. x IN s ==> f x = Cx(&0)) /\
11364                 z:complex IN closure s`
11365   THENL [CONJ_TAC THENL [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
11366   EXISTS_TAC `a:complex->bool` THEN
11367   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN MATCH_MP_TAC
11368   SUBSET_TRANS THEN EXISTS_TAC `cball(z:complex,e)` THEN
11369   ASM_MESON_TAC[CLOSED_CBALL;INTER_SUBSET;CLOSURE_MINIMAL];
11370   CONJ_TAC THENL [ASM_MESON_TAC[INTER_SUBSET;SUBSET];
11371   ASM_SIMP_TAC[closure;IN_UNION] THEN DISJ2_TAC THEN SUBGOAL_THEN
11372   `z:complex limit_point_of s` (fun thm-> SET_TAC[thm]) THEN
11373   REWRITE_TAC [LIMPT_APPROACHABLE] THEN GEN_TAC THEN DISCH_TAC THEN
11374   ASSERT_TAC `?x:complex. x IN u /\ ~(x = z) /\ dist (x , z) < min e' e`
11375   THENL [MP_TAC (ISPECL [`z:complex`;`u:complex->bool`] LIMPT_APPROACHABLE)
11376   THEN ASM_SIMP_TAC[REAL_LT_MIN];EXISTS_TAC `x:complex` THEN ASM_REWRITE_TAC[]
11377   THEN CONJ_TAC THENL
11378   [REWRITE_TAC [GSYM (ASSUME `cball (z:complex,e) INTER u = s`);IN_INTER;
11379   ASSUME `x:complex IN u`;IN_CBALL] THEN ASM_MESON_TAC[REAL_LT_IMP_LE;
11380   REAL_LT_MIN;DIST_SYM]; ASM_MESON_TAC [REAL_LT_MIN]]]]];
11381   ASM_MESON_TAC [CONTINUOUS_CONSTANT_ON_CLOSURE]];
11382   MP_TAC(SPECL [`f:complex->complex`;`a:complex->bool`;`z:complex`;`w:complex`]
11383   ISOLATED_ZEROS) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
11384   SUBGOAL_THEN `?x:complex. x IN ball(z,r) /\ x IN u /\ ~(x=z) /\
11385     (f:complex->complex) x = Cx(&0)`(fun thm->ASM_MESON_TAC[thm]) THEN
11386   MP_TAC (ISPECL [`z:complex`;`u:complex->bool`] LIMPT_APPROACHABLE) THEN
11387   ASM_REWRITE_TAC [] THEN DISCH_TAC THEN POP_ASSUM (MP_TAC o SPEC `r:real`)
11388   THEN ASM_REWRITE_TAC [] THEN STRIP_TAC THEN EXISTS_TAC `x':complex`
11389   THEN ASM_MESON_TAC[IN_BALL;DIST_SYM]]);;
11390
11391 (* ------------------------------------------------------------------------- *)
11392 (* Open mapping theorem.                                                     *)
11393 (* ------------------------------------------------------------------------- *)
11394
11395 let OPEN_MAPPING_THM = prove
11396   (`!a f.
11397      open a /\ connected a /\ f holomorphic_on a /\
11398      ~(?c:complex. !z:complex. z IN a ==> f z = c)
11399      ==> (!u. open u /\ u SUBSET a ==> open(IMAGE f u))`,
11400   let LEMMA_ZERO = prove
11401   (`!f z r. f continuous_on cball(z,r) /\ f holomorphic_on ball(z,r) /\
11402       &0 < r /\ (!w. norm(z-w) =r ==> norm(f z) < norm(f w))
11403       ==> (?w. w IN ball(z,r) /\ f w = Cx(&0))`,
11404   REPEAT STRIP_TAC THEN SUBGOAL_THEN  ` ((!x:complex. x IN ball(z,r) ==>
11405   ~((f:complex->complex) x = Cx(&0))) ==> F ) ==> ( ?w:complex. w IN ball(z,r)
11406   /\ f w = Cx(&0))` MATCH_MP_TAC THENL [MESON_TAC[];
11407   STRIP_TAC THEN SUBGOAL_THEN `&0 < norm ((f:complex->complex) z)` ASSUME_TAC
11408   THENL [ASM_SIMP_TAC[COMPLEX_NORM_NZ; CENTRE_IN_BALL; SPEC `z:complex`
11409   (ASSUME`!x:complex. x IN ball(z,r) ==> ~((f:complex->complex) x = Cx(&0))`)];
11410   ALL_TAC] THEN SUBGOAL_THEN
11411     `(!x:complex. x IN cball(z,r) ==> ~((f:complex->complex) x = Cx(&0)))`
11412   ASSUME_TAC THENL [GEN_TAC THEN REWRITE_TAC [IN_CBALL;dist]
11413   THEN REWRITE_TAC[REAL_ARITH `a <= b <=> a < b \/ a = b`] THEN
11414   REWRITE_TAC [TAUT `((p \/ q) ==> r ) <=> ((p ==> r ) /\ (q ==> r))`] THEN
11415   CONJ_TAC THENL [ASM_MESON_TAC[IN_BALL;dist];
11416   DISCH_TAC THEN REWRITE_TAC[GSYM COMPLEX_NORM_ZERO] THEN MATCH_MP_TAC
11417   REAL_LT_IMP_NZ THEN MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC
11418   `norm ((f:complex->complex) z)` THEN
11419   ASM_SIMP_TAC [SPEC `z':complex` (ASSUME `!w:complex. norm (w - z) = r
11420                 ==> norm ((f:complex->complex) z) < norm (f w)`)]];
11421   ALL_TAC] THEN SUBGOAL_THEN `~(frontier(cball(z:complex,r))={})` ASSUME_TAC
11422   THENL [REWRITE_TAC[FRONTIER_CBALL;sphere;dist] THEN SUBGOAL_THEN `?x:complex.
11423   norm(z-x) = r` (fun th-> SET_TAC [MEMBER_NOT_EMPTY;th]) THEN EXISTS_TAC
11424   `z + Cx r` THEN ASM_SIMP_TAC[COMPLEX_ADD_SUB2;NORM_NEG;COMPLEX_NORM_CX;
11425   REAL_ABS_REFL;REAL_LT_IMP_LE];ALL_TAC] THEN
11426   ABBREV_TAC `g = \z. inv ((f:complex->complex) z)` THEN ASSERT_TAC
11427   `(g:complex->complex) continuous_on cball(z,r) /\ g holomorphic_on ball(z,r)`
11428    THENL [CONJ_TAC THENL [EXPAND_TAC "g" THEN
11429    REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN GEN_TAC THEN DISCH_TAC
11430   THEN MATCH_MP_TAC CONTINUOUS_COMPLEX_INV_WITHIN THEN ASM_MESON_TAC
11431   [CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN];EXPAND_TAC "g" THEN MATCH_MP_TAC
11432   HOLOMORPHIC_ON_INV THEN ASM_REWRITE_TAC[]];ALL_TAC] THEN
11433   SUBGOAL_THEN `?w:complex. w IN frontier(cball(z,r)) /\
11434                 (!x:complex. x IN frontier(cball(z,r)) ==>
11435                 norm ((f:complex->complex) w) <= norm (f x))`
11436   STRIP_ASSUME_TAC THENL [MATCH_MP_TAC CONTINUOUS_ATTAINS_INF
11437   THEN ASM_SIMP_TAC[COMPACT_FRONTIER;COMPACT_CBALL;CBALL_EQ_EMPTY;
11438   REAL_ARITH `!r:real. &0 < r ==> ~(r < &0)` ] THEN
11439   SUBGOAL_THEN `lift o (\x. norm ((f:complex->complex) x)) =
11440                  (lift o norm) o (\x. f x) ` SUBST1_TAC THENL
11441   [REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE
11442   THEN CONJ_TAC THENL [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC
11443   `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
11444   ASM_SIMP_TAC[SUBSET_TRANS;CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];
11445   ASM_MESON_TAC [CONTINUOUS_ON_LIFT_NORM; HOLOMORPHIC_ON_SUBSET;
11446   HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;SUBSET_TRANS;CLOSED_CBALL;
11447   FRONTIER_SUBSET_CLOSED]]];ALL_TAC] THEN
11448   SUBGOAL_THEN `?w:complex. norm (z-w) = r /\
11449                 norm ((f:complex->complex) w) <= norm (f z)`
11450                 (fun thm -> ASM_MESON_TAC[thm;REAL_NOT_LE])
11451   THEN EXISTS_TAC `w:complex` THEN CONJ_TAC
11452   THENL [MP_TAC (ASSUME `w:complex IN frontier (cball (z,r))`) THEN
11453   REWRITE_TAC[FRONTIER_CBALL;sphere;dist] THEN SET_TAC[];ALL_TAC] THEN
11454   SUBGOAL_THEN `&0 < norm ((f:complex->complex) w)` ASSUME_TAC THENL
11455   [REWRITE_TAC[NORM_POS_LT;COMPLEX_VEC_0] THEN MATCH_MP_TAC (ASSUME `!x.
11456   x:complex IN cball (z,r) ==> ~(f x = Cx(&0))`) THEN MATCH_MP_TAC
11457   (SET_RULE `!x:complex u s. x IN u /\ u SUBSET s ==> x IN s `) THEN
11458   EXISTS_TAC `frontier(cball(z:complex,r))` THEN
11459   ASM_SIMP_TAC[CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];ALL_TAC] THEN
11460   SUBGOAL_THEN `inv (norm ((f:complex-> complex) w)) = &1/ (norm (f w))`
11461   ASSUME_TAC THENL [MATCH_MP_TAC REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC
11462   REAL_DIV_LMUL THEN ASM_REWRITE_TAC[COMPLEX_NORM_ZERO;GSYM COMPLEX_NORM_NZ];
11463   ASSERT_TAC `?x:complex. x IN frontier(cball(z,r)) /\ (!y. y IN
11464   frontier(cball(z,r)) ==> norm ((g:complex->complex) y) <= norm (g x))`
11465   THENL [MATCH_MP_TAC CONTINUOUS_ATTAINS_SUP THEN
11466   ASM_SIMP_TAC[COMPACT_FRONTIER;
11467   COMPACT_CBALL;CBALL_EQ_EMPTY; REAL_ARITH `!r:real. &0 < r ==> ~(r < &0)`]
11468   THEN SUBGOAL_THEN `lift o (\x. norm ((g:complex->complex) x)) =
11469                           (lift o norm) o (\x. g x) ` SUBST1_TAC
11470   THENL [REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
11471   CONJ_TAC THENL [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
11472   EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX]
11473   THEN ASM_SIMP_TAC[SUBSET_TRANS;CLOSED_CBALL;
11474   FRONTIER_SUBSET_CLOSED]; ASM_MESON_TAC [CONTINUOUS_ON_LIFT_NORM;
11475   HOLOMORPHIC_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;SUBSET_TRANS;
11476   CLOSED_CBALL; FRONTIER_SUBSET_CLOSED]]];ALL_TAC] THEN SUBGOAL_THEN
11477   `&0 < norm ((f:complex->complex) x)` ASSUME_TAC THENL
11478   [REWRITE_TAC[NORM_POS_LT;COMPLEX_VEC_0] THEN MATCH_MP_TAC
11479   (ASSUME `!x. x:complex IN cball (z,r) ==> ~(f x = Cx(&0))`)
11480   THEN MATCH_MP_TAC (SET_RULE `!x:complex u s. x IN u /\ u SUBSET s
11481                 ==> x IN s `) THEN  EXISTS_TAC `frontier(cball(z:complex,r))`
11482   THEN ASM_SIMP_TAC[CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];
11483   ABBREV_TAC `B = norm ((g:complex->complex) x)`
11484   THEN SUBGOAL_THEN `norm (higher_complex_derivative 0 g z) <=
11485                 (&(FACT 0)) * B / (r pow 0) `
11486   MP_TAC THENL[MATCH_MP_TAC CAUCHY_INEQUALITY THEN
11487   ASM_REWRITE_TAC[] THEN MP_TAC
11488   (ASSUME `!y:complex. y IN frontier (cball (z,r)) ==>
11489                  norm ((g:complex ->complex) y) <= B`)
11490   THEN SIMP_TAC [FRONTIER_CBALL;sphere;dist] THEN SET_TAC[];
11491   REWRITE_TAC [higher_complex_derivative;FACT;real_pow;
11492   REAL_MUL_LID;REAL_DIV_1] THEN DISCH_TAC THEN SUBGOAL_THEN
11493         `inv (norm ((f:complex->complex) z)) <=
11494         inv (norm (f w)) ==> norm (f w) <= norm (f z)` MATCH_MP_TAC
11495   THENL [SUBGOAL_THEN `inv (norm ((f:complex-> complex) z)) =
11496                          &1/ (norm (f z))` SUBST1_TAC
11497   THENL [MATCH_MP_TAC REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC REAL_DIV_LMUL THEN
11498   ASM_SIMP_TAC[REAL_ARITH `&0 < norm ((f:complex->complex) z) ==>
11499   ~(norm (f z) = &0) `]; ASM_REWRITE_TAC[] THEN DISCH_TAC THEN SUBST1_TAC
11500   (REAL_ARITH `norm ((f:complex->complex) w)= &1 * norm (f w)`) THEN
11501    SUBST1_TAC(REAL_ARITH `norm ((f:complex->complex) z)=
11502                         &1 * norm (f z)`) THEN POP_ASSUM
11503   MP_TAC THEN MATCH_MP_TAC (TAUT `(p <=> q ) ==> ( p ==> q)`)
11504   THEN MATCH_MP_TAC RAT_LEMMA4 THEN ASM_REWRITE_TAC[]];
11505   REWRITE_TAC[GSYM COMPLEX_NORM_INV] THEN
11506   SUBGOAL_THEN `inv ((f:complex->complex) z) = g z /\ inv (f w) = g w`
11507                 (fun thm -> REWRITE_TAC[thm])
11508   THENL [ASM_MESON_TAC[];MATCH_MP_TAC (REAL_ARITH
11509   `!x y z:real. x <= y /\ y = z ==> x <= z`) THEN  EXISTS_TAC `B:real` THEN
11510   ASM_REWRITE_TAC[GSYM REAL_LE_ANTISYM] THEN CONJ_TAC THENL [EXPAND_TAC "B"
11511   THEN REWRITE_TAC[SYM (ASSUME`(\z. inv ((f:complex->complex) z)) =
11512   g`);COMPLEX_NORM_INV] THEN SUBGOAL_THEN `inv (norm ((f:complex->complex) x))
11513   = &1 / norm (f x)` (fun thm -> REWRITE_TAC[thm]) THENL [MATCH_MP_TAC
11514   REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC REAL_DIV_LMUL THEN
11515   ASM_SIMP_TAC[REAL_LT_IMP_NZ]; ASM_REWRITE_TAC[] THEN
11516   MP_TAC (SPEC `x:complex`(ASSUME`!x:complex. x IN frontier (cball (z,r))
11517                 ==> norm ((f:complex->complex) w) <= norm (f x)`))
11518   THEN REWRITE_TAC [ASSUME`x:complex IN frontier
11519   (cball (z,r))`] THEN SUBST1_TAC
11520   (REAL_ARITH `norm ((f:complex->complex) w)= &1* norm (f w)`) THEN
11521   SUBST1_TAC (REAL_ARITH `norm ((f:complex->complex) x)= &1 * norm (f x)`)
11522   THEN  DISCH_TAC THEN REWRITE_TAC[REAL_MUL_LID] THEN POP_ASSUM
11523   MP_TAC THEN MATCH_MP_TAC (TAUT `(q <=> p ) ==> ( p ==> q)`) THEN MATCH_MP_TAC
11524   (RAT_LEMMA4) THEN ASM_REWRITE_TAC[]];ASM_MESON_TAC[]]]]]]]]) in
11525   REPEAT STRIP_TAC THEN ASSUME_TAC (MESON [HOLOMORPHIC_ON_SUBSET;
11526   ASSUME `(u:complex->bool) SUBSET a`;ASSUME `f holomorphic_on a`]
11527   `f holomorphic_on u`) THEN ASM_CASES_TAC `(u:complex->bool)={}` THENL [
11528   ASM_MESON_TAC[SUBSET_EMPTY;IMAGE_EQ_EMPTY;OPEN_EMPTY];ALL_TAC] THEN
11529   SUBGOAL_THEN `!f u. ~(u={}) /\ open u /\ connected u /\
11530                  f holomorphic_on u /\
11531          ~(?c:complex. !z:complex. z IN u ==> f z=c) ==>
11532                          open (IMAGE f u)` ASSUME_TAC
11533   THENL [REPEAT STRIP_TAC THEN REWRITE_TAC[OPEN_CONTAINS_BALL;IN_IMAGE]
11534   THEN GEN_TAC THEN STRIP_TAC THEN
11535   ASSERT_TAC `(\z:complex.(f':complex->complex)z - f' x') holomorphic_on
11536   (u':complex->bool) /\ (\z:complex. f' z - f' x')x' = Cx(&0)` THENL [
11537   ASM_SIMP_TAC[HOLOMORPHIC_ON_CONST;HOLOMORPHIC_ON_SUB;
11538   BETA_THM;COMPLEX_SUB_REFL];ALL_TAC] THEN
11539   ASSERT_TAC `?s:real. &0 < s /\ ball(x',s) SUBSET u' /\
11540         (!z:complex. z IN ball(x',s) /\ ~(z = x') ==>
11541         ~((\z:complex.(f':complex->complex)z - f' x') z = Cx(&0)))` THENL [
11542   MATCH_MP_TAC ISOLATED_ZEROS THEN ASM_REWRITE_TAC[] THEN
11543     ASM_MESON_TAC[COMPLEX_SUB_0];
11544   ASSERT_TAC `?r. &0 < r /\ cball(x':complex,r) SUBSET ball(x',s)` THENL[
11545   EXISTS_TAC `s:real / &2` THEN ASM_SIMP_TAC [REAL_ARITH `&0 < s
11546   ==> &0 < s/ &2`;SUBSET;IN_CBALL;IN_BALL] THEN MP_TAC (ASSUME `&0 < s`)
11547   THEN REAL_ARITH_TAC;ALL_TAC] THEN
11548   ASSERT_TAC `cball(x',r) SUBSET u' /\
11549      (!z:complex. z IN cball(x',r) /\
11550         ~(z=x')==> ~((\z:complex.(f':complex->complex)z - f' x') z = Cx(&0)))`
11551   THENL [CONJ_TAC THENL [ASM_MESON_TAC[SUBSET_TRANS];
11552   MESON_TAC[ASSUME `!z:complex. z IN ball (x',s) /\ ~(z = x')
11553   ==> ~((\z. (f':complex->complex) z - f' x') z = Cx(&0))`;
11554   ASSUME `cball (x':complex,r) SUBSET ball (x',s)`;SUBSET]];ALL_TAC]
11555   THEN SUBGOAL_THEN `frontier (cball (x':complex,r)) SUBSET u'` ASSUME_TAC
11556   THENL [MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `cball(x':complex,r)`
11557   THEN ASM_MESON_TAC[CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];ALL_TAC] THEN
11558   ASSERT_TAC `?w. w IN frontier(cball(x':complex,r)) /\
11559         (!z. z IN frontier(cball(x',r)) ==>
11560         norm ((f':complex->complex)w - f' x') <= norm(f' z - f' x'))`
11561   THENL [MATCH_MP_TAC CONTINUOUS_ATTAINS_INF THEN
11562   ASM_SIMP_TAC[COMPACT_FRONTIER;COMPACT_CBALL;CBALL_EQ_EMPTY;
11563   REAL_ARITH `!r:real. &0 < r ==> ~(r < &0)` ] THEN
11564   CONJ_TAC THENL [REWRITE_TAC[REWRITE_RULE[sphere] FRONTIER_CBALL;dist] THEN
11565   SUBGOAL_THEN `?x:complex. norm(x'-x) = r` (fun th-> SET_TAC
11566    [MEMBER_NOT_EMPTY;th]) THEN EXISTS_TAC `x' + Cx r` THEN
11567   ASM_SIMP_TAC[COMPLEX_ADD_SUB2;NORM_NEG;COMPLEX_NORM_CX;
11568   REAL_ABS_REFL;REAL_LT_IMP_LE];
11569   SUBGOAL_THEN `lift o (\z. norm ((f':complex->complex) z - f' x')) =
11570         (lift o norm) o (\z. f' z - f' x') ` SUBST1_TAC THENL [
11571   REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
11572   ASM_MESON_TAC [CONTINUOUS_ON_LIFT_NORM; HOLOMORPHIC_ON_SUBSET;
11573   HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]]];ALL_TAC] THEN
11574   ABBREV_TAC `e = (norm ((f':complex->complex) w - f' x'))*(&1/ &3)`
11575   THEN SUBGOAL_THEN `&0<e` ASSUME_TAC THENL [
11576   EXPAND_TAC "e" THEN MATCH_MP_TAC REAL_LT_MUL THEN
11577   REWRITE_TAC [REAL_ARITH `&0 < &1 / &3`; COMPLEX_NORM_NZ] THEN
11578   SUBST1_TAC (MESON [BETA_THM] `(f':complex->complex) w - f' x' =
11579   (\w. f' w - f' x')w `) THEN FIRST_ASSUM MATCH_MP_TAC THEN
11580   CONJ_TAC THENL[MESON_TAC[ASSUME `w:complex IN frontier (cball (x',r))`;
11581   FRONTIER_SUBSET_CLOSED; CLOSED_CBALL;SET_RULE `!x:complex s t. x IN s /\
11582   s SUBSET t ==> x IN t` ];ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0] THEN
11583   REWRITE_TAC[GSYM COMPLEX_NORM_ZERO] THEN MATCH_MP_TAC REAL_LT_IMP_NZ
11584   THEN MATCH_MP_TAC (REAL_ARITH `&0 < r /\ r = norm (w:complex - x') ==>
11585   &0 < norm (w - x')`) THEN ASM_REWRITE_TAC[] THEN
11586   MP_TAC (ASSUME `w:complex IN frontier (cball (x',r))`) THEN
11587   SIMP_TAC[FRONTIER_CBALL; sphere; dist; IN_ELIM_THM; NORM_SUB]];
11588       ALL_TAC]
11589   THEN EXISTS_TAC `e:real` THEN REWRITE_TAC[ASSUME `&0<e`] THEN
11590   REWRITE_TAC[SUBSET;IN_IMAGE] THEN GEN_TAC THEN DISCH_TAC THEN
11591   ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0] THEN
11592   SUBGOAL_THEN `(?x:complex. x IN ball(x',r) /\
11593         x'' - (f':complex->complex) x = Cx(&0)) ==>
11594                 ?x. x'' - f' x = Cx(&0) /\ x IN u'` MATCH_MP_TAC THENL [
11595   STRIP_TAC THEN EXISTS_TAC `x''':complex` THEN
11596   ASM_REWRITE_TAC[] THEN
11597   MATCH_MP_TAC (SET_RULE `!x:complex u s. x IN u /\ u SUBSET s ==> x IN s`)
11598   THEN EXISTS_TAC `ball(x':complex,r)` THEN ASM_REWRITE_TAC[]
11599   THEN ASM_MESON_TAC[BALL_SUBSET_CBALL;SUBSET_TRANS];
11600   MATCH_MP_TAC LEMMA_ZERO THEN CONJ_TAC THENL
11601   [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
11602   MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN ASM_MESON_TAC
11603   [HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_SUBSET];
11604   CONJ_TAC THENL [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN ASM_MESON_TAC[
11605   HOLOMORPHIC_ON_CONST;HOLOMORPHIC_ON_SUBSET;BALL_SUBSET_CBALL];
11606   ASM_REWRITE_TAC[] THEN X_GEN_TAC `w':complex` THEN DISCH_TAC THEN
11607   MATCH_MP_TAC REAL_LTE_TRANS THEN
11608   EXISTS_TAC  `e:real` THEN CONJ_TAC THENL
11609   [MESON_TAC [NORM_SUB;dist;IN_BALL; ASSUME`x'':complex IN ball (x,e)`;
11610   ASSUME `x:complex = (f':complex->complex) x'`];
11611   MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2*e` THEN
11612   ASM_SIMP_TAC[REAL_ARITH `&0<e ==> e <= &2 * e`;NORM_SUB] THEN
11613   SUBST1_TAC (COMPLEX_RING `(f':complex->complex) w' - x'' =
11614                  f' w' -x + x - x''`) THEN
11615   MATCH_MP_TAC REAL_LE_TRANS THEN
11616   EXISTS_TAC `norm ((f':complex->complex) w' - x) - norm (x-x'')` THEN
11617   CONJ_TAC THENL [SUBST1_TAC (REAL_ARITH `&2 * e = &3 *e - e`) THEN
11618   MATCH_MP_TAC (REAL_ARITH `!x y z w:real. x<=y /\ z<w ==> x-w <= y-z`)
11619   THEN CONJ_TAC THENL [EXPAND_TAC "e" THEN
11620   ASM_REWRITE_TAC[REAL_ARITH `&3 * norm ((f':complex->complex) w - f' x') *
11621   &1 / &3 = norm (f' w - f' x')`] THEN FIRST_ASSUM MATCH_MP_TAC THEN
11622   POP_ASSUM MP_TAC THEN
11623   REWRITE_TAC[FRONTIER_CBALL; sphere; NORM_SUB; IN_ELIM_THM; dist];
11624   UNDISCH_TAC `x'':complex IN ball (x,e)` THEN
11625   REWRITE_TAC [IN_BALL;dist;ASSUME`x:complex = (f':complex->complex) x'`]];
11626   MATCH_MP_TAC (REAL_ARITH `!x y z:real. x<=y+z ==> x-z<=y`) THEN
11627   REWRITE_TAC[COMPLEX_NORM_TRIANGLE_SUB]]]]]]];ALL_TAC] THEN
11628   ASM_CASES_TAC `connected (u:complex->bool)` THENL [
11629   SUBGOAL_THEN `~(?c:complex. !z:complex. z IN u ==> f z=c)`
11630           (fun th-> ASM_MESON_TAC [th]) THEN
11631   ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0]
11632   THEN STRIP_TAC THEN ABBREV_TAC `w:complex= CHOICE u` THEN
11633   ASSUME_TAC (MESON [CHOICE_DEF;GSYM (ASSUME `CHOICE u = w:complex`);
11634   ASSUME `~(u:complex->bool = {})`] `w:complex IN u`) THEN
11635   ASSERT_TAC `w:complex limit_point_of u` THENL
11636   [MATCH_MP_TAC INTERIOR_LIMIT_POINT THEN ASM_SIMP_TAC [INTERIOR_OPEN];
11637   SUBGOAL_THEN `(\z. (f:complex->complex) z - c) holomorphic_on a` ASSUME_TAC
11638   THENL [ASM_SIMP_TAC [HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST];
11639   ASSUME_TAC (MESON [ASSUME `w:complex IN u`;ASSUME `u:complex->bool SUBSET a`;
11640   SET_RULE `w:complex IN u /\ u SUBSET a ==> w IN a`] `w:complex IN a`) THEN
11641   MP_TAC(SPECL [`\z:complex.(f:complex->complex)z - c`;
11642         `a:complex->bool`; `u:complex->bool`; `w:complex`]
11643          ANALYTIC_CONTINUATION) THEN
11644   ASM_REWRITE_TAC [] THEN MP_TAC (ASSUME `~(?c:complex. !z. z IN a ==>
11645   (f:complex->complex) z = c)`) THEN ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0;
11646   GSYM COMPLEX_SUB_RZERO] THEN ONCE_REWRITE_TAC [COMPLEX_SUB_RZERO] THEN
11647   MESON_TAC[]]];ALL_TAC] THEN SUBST1_TAC (MESON [UNIONS_COMPONENTS]
11648   `u:complex->bool = UNIONS ( components u)`) THEN
11649   REWRITE_TAC [IMAGE_UNIONS] THEN MATCH_MP_TAC OPEN_UNIONS THEN
11650   REWRITE_TAC[IN_IMAGE] THEN GEN_TAC THEN STRIP_TAC THEN
11651   FIRST_X_ASSUM SUBST1_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
11652   STRIP_ASSUME_TAC(MESON [IN_COMPONENTS;
11653   ASSUME `(x:complex->bool) IN components u`]
11654   `?w:complex. w IN u /\ x = connected_component u w`) THEN
11655   ASM_SIMP_TAC[CONNECTED_COMPONENT_EQ_EMPTY;OPEN_CONNECTED_COMPONENT;
11656   CONNECTED_CONNECTED_COMPONENT] THEN CONJ_TAC THENL
11657   [ASM_MESON_TAC [CONNECTED_COMPONENT_SUBSET;
11658   HOLOMORPHIC_ON_SUBSET]; ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0] THEN
11659   STRIP_TAC THEN ABBREV_TAC `y = CHOICE (x:complex->bool)` THEN
11660   SUBGOAL_THEN `y:complex IN x` ASSUME_TAC THENL
11661   [EXPAND_TAC "y" THEN MATCH_MP_TAC CHOICE_DEF THEN
11662   ASM_MESON_TAC [CONNECTED_COMPONENT_EQ_EMPTY];
11663   ASSUME_TAC (MESON [OPEN_COMPONENTS;ASSUME `open (u:complex->bool)`;
11664   ASSUME` x:complex->bool IN components u`] `open (x:complex->bool)`) THEN
11665   ASSERT_TAC `y:complex limit_point_of x` THENL [
11666   MATCH_MP_TAC INTERIOR_LIMIT_POINT THEN ASSUME_TAC
11667   (MESON [OPEN_COMPONENTS;ASSUME `open (u:complex->bool)`;
11668   ASSUME` x:complex->bool IN components u`] `open (x:complex->bool)`) THEN
11669   SIMP_TAC [INTERIOR_OPEN;ASSUME `open (x:complex->bool)`;
11670   ASSUME `y:complex IN x`]; SUBGOAL_THEN `(\z. (f:complex->complex) z - c)
11671   holomorphic_on a` ASSUME_TAC THENL [
11672   ASM_SIMP_TAC [HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST];
11673   SUBGOAL_THEN `x:complex->bool SUBSET a` ASSUME_TAC THENL [
11674   MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `u:complex->bool` THEN
11675   ASM_REWRITE_TAC[CONNECTED_COMPONENT_SUBSET];
11676   SUBGOAL_THEN `y:complex IN a` ASSUME_TAC THENL [
11677   MATCH_MP_TAC (SET_RULE `y:complex IN x /\ x SUBSET a ==> y IN a`)
11678   THEN ASM_REWRITE_TAC[]; MP_TAC(SPECL [`\z:complex.(f:complex->complex)z - c`;
11679   `a:complex->bool`; `x:complex->bool`; `y:complex`] ANALYTIC_CONTINUATION)
11680   THEN ASM_REWRITE_TAC [] THEN MP_TAC (ASSUME `~(?c:complex. !z. z IN a ==>
11681   (f:complex->complex) z = c)`) THEN
11682   ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0;GSYM COMPLEX_SUB_RZERO] THEN
11683   ONCE_REWRITE_TAC [COMPLEX_SUB_RZERO] THEN MESON_TAC[]]]]]]]);;
11684
11685 (* ------------------------------------------------------------------------- *)
11686 (* Maximum modulus principle.                                                *)
11687 (* ------------------------------------------------------------------------- *)
11688
11689 let MAXIMUM_MODULUS_PRINCIPLE = prove
11690   (`!f a u w.
11691       open a /\ connected a /\ f holomorphic_on a /\
11692       open u /\ u SUBSET a /\ w IN u /\
11693       (!z. z IN u ==> norm(f z) <= norm(f w))
11694       ==> (?c. !z. z IN a ==> f z = c)`,
11695   REPEAT STRIP_TAC THEN SUBGOAL_THEN
11696     `~(open (IMAGE (f:complex->complex) u))`
11697     (fun th -> ASM_MESON_TAC[th; OPEN_MAPPING_THM]) THEN
11698   REWRITE_TAC[OPEN_CONTAINS_BALL;NOT_FORALL_THM] THEN
11699   EXISTS_TAC `(f:complex->complex) w` THEN
11700   MATCH_MP_TAC (TAUT `!p q. (p /\ ~ q) ==> ~(p ==> q)`) THEN CONJ_TAC THENL
11701   [ASM_MESON_TAC[IN_IMAGE]; ALL_TAC] THEN
11702   REWRITE_TAC[NOT_EXISTS_THM;DE_MORGAN_THM;SUBSET] THEN
11703   GEN_TAC THEN ASM_CASES_TAC `~(&0 < e)` THENL
11704   [ASM_REWRITE_TAC[]; ALL_TAC] THEN POP_ASSUM MP_TAC THEN REWRITE_TAC[] THEN
11705   DISCH_TAC THEN DISJ2_TAC THEN REWRITE_TAC[NOT_FORALL_THM] THEN
11706   EXISTS_TAC `if &0 < Re((f:complex->complex) w)
11707               then f w + Cx(e / &2)
11708               else f w - Cx(e/ &2) ` THEN
11709   ABBREV_TAC `x = if &0<Re((f:complex->complex) w)
11710                   then f w + Cx(e / &2)
11711                   else f w - Cx(e / &2)` THEN
11712   MATCH_MP_TAC (TAUT `!p q. (p /\ ~ q) ==> ~(p ==> q)`) THEN CONJ_TAC THENL
11713   [REWRITE_TAC[IN_BALL;dist] THEN
11714   MATCH_MP_TAC (REAL_ARITH `!x y z:real. x = y /\ y < z ==> x < z `) THEN
11715   EXISTS_TAC `e / &2` THEN EXPAND_TAC "x" THEN COND_CASES_TAC THENL
11716   [ASM_SIMP_TAC [NORM_NEG;COMPLEX_ADD_SUB2;REAL_ARITH `&0 < e ==> e / &2 <e`;
11717                   COMPLEX_NORM_CX;REAL_ABS_REFL;
11718                   REAL_ARITH `&0 < e ==> &0 <= e / &2`];
11719   ASM_SIMP_TAC [COMPLEX_SUB_SUB2; REAL_ARITH `&0 < e ==> e / &2 <e`;
11720                   COMPLEX_NORM_CX; REAL_ABS_REFL;
11721                   REAL_ARITH `&0 < e ==> &0 <= e / &2`]]; ALL_TAC] THEN
11722   REWRITE_TAC[IN_IMAGE; NOT_EXISTS_THM; DE_MORGAN_THM] THEN
11723   GEN_TAC THEN ASM_CASES_TAC `~(x':complex IN u)` THENL
11724   [ASM_REWRITE_TAC[]; ALL_TAC] THEN DISJ1_TAC THEN POP_ASSUM MP_TAC THEN
11725   REWRITE_TAC[] THEN DISCH_TAC THEN
11726   MATCH_MP_TAC (NORM_ARITH `!x y:complex. ~(norm x=norm y) ==> ~(x=y)`) THEN
11727   REWRITE_TAC[REAL_NOT_EQ] THEN DISJ2_TAC THEN
11728   MATCH_MP_TAC REAL_LET_TRANS THEN
11729   EXISTS_TAC `norm ((f:complex->complex) w)` THEN ASM_SIMP_TAC[] THEN
11730   EXPAND_TAC "x" THEN COND_CASES_TAC THEN
11731   REWRITE_TAC [complex_norm;RE_ADD;IM_ADD; IM_CX;RE_CX;REAL_ADD_RID] THENL
11732   [MATCH_MP_TAC SQRT_MONO_LT THEN CONJ_TAC THENL
11733   [SIMP_TAC[REAL_ARITH `!x:real. x pow 2 = x*x`;
11734                REAL_LE_SQUARE;REAL_LE_ADD]; ALL_TAC] THEN
11735   MATCH_MP_TAC (REAL_ARITH `!x:real y z. x < y ==> x + z < y + z`) THEN
11736   REWRITE_TAC[GSYM REAL_LT_SQUARE_ABS] THEN
11737   ASM_SIMP_TAC [REAL_ARITH `!x y. &0 < x /\ &0 < y
11738                           ==> abs (x+y) = abs x + abs y`;
11739                 REAL_ARITH `!x:real. &0 < x ==> &0 < x / &2`] THEN
11740   ASM_REAL_ARITH_TAC; ALL_TAC] THEN
11741   REWRITE_TAC [complex_norm;RE_SUB;IM_SUB; IM_CX;RE_CX;REAL_SUB_RZERO] THEN
11742   MATCH_MP_TAC SQRT_MONO_LT THEN CONJ_TAC THENL
11743   [SIMP_TAC[REAL_LE_SQUARE; REAL_LE_ADD;
11744                 REAL_ARITH `!x:real. x pow 2 = x*x`]; ALL_TAC] THEN
11745   MATCH_MP_TAC (REAL_ARITH `!x:real y z. x < y ==> x + z < y + z`) THEN
11746   REWRITE_TAC[GSYM REAL_LT_SQUARE_ABS] THEN POP_ASSUM MP_TAC THEN
11747   REWRITE_TAC[REAL_NOT_LT] THEN DISCH_TAC THEN
11748   ASM_SIMP_TAC [REAL_ARITH `!x y. x <= &0 /\ &0 < y
11749                             ==> abs (x - y) = abs x + abs y`;
11750               REAL_ARITH `!x. &0 < x ==> &0 < x/ &2`] THEN
11751   ASM_REAL_ARITH_TAC);;
11752
11753 (* ------------------------------------------------------------------------- *)
11754 (* Factoring out a zero according to its order.                              *)
11755 (* ------------------------------------------------------------------------- *)
11756
11757 let HOLOMORPHIC_FACTOR_ORDER_OF_ZERO = prove
11758  (`!f s n.
11759       open s /\ z IN s /\ f holomorphic_on s /\
11760       0 < n /\ ~(higher_complex_derivative n f z = Cx(&0)) /\
11761       (!m. 0 < m /\ m < n ==> higher_complex_derivative m f z = Cx(&0))
11762       ==> ?g r. &0 < r /\
11763                 g holomorphic_on ball(z,r) /\
11764                 (!w. w IN ball(z,r) ==> f(w) - f(z) = (w - z) pow n * g(w)) /\
11765                 (!w. w IN ball(z,r) ==> ~(g w = Cx(&0)))`,
11766   REPEAT STRIP_TAC THEN
11767   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
11768   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
11769   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
11770   SUBGOAL_THEN
11771    `!w. w IN ball(z,r)
11772         ==> ((\m. higher_complex_derivative m f z / Cx(&(FACT m)) *
11773                   (w - z) pow m) sums f(w) - f(z)) (from n)`
11774   ASSUME_TAC THENL
11775    [GEN_TAC THEN DISCH_TAC THEN
11776     MP_TAC(ISPECL [`f:complex->complex`; `z:complex`; `w:complex`; `r:real`]
11777         HOLOMORPHIC_POWER_SERIES) THEN ASM_REWRITE_TAC[] THEN
11778     ANTS_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
11779     DISCH_THEN(MP_TAC o SPEC `1` o
11780       MATCH_MP (REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
11781     CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[VSUM_SING_NUMSEG] THEN
11782     REWRITE_TAC[FACT; higher_complex_derivative; COMPLEX_DIV_1] THEN
11783     REWRITE_TAC[complex_pow; COMPLEX_MUL_RID] THEN
11784     ASM_CASES_TAC `n = 1` THEN ASM_REWRITE_TAC[] THEN
11785     DISCH_THEN(MP_TAC o SPEC `n:num` o
11786       MATCH_MP (REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
11787     ANTS_TAC THENL [ASM_ARITH_TAC; MATCH_MP_TAC EQ_IMP] THEN
11788     AP_THM_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC(COMPLEX_RING
11789      `p = Cx(&0) ==> w - z - p = w - z`) THEN
11790     REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC VSUM_EQ_0 THEN
11791     REWRITE_TAC[IN_NUMSEG; COMPLEX_VEC_0] THEN REPEAT STRIP_TAC THEN
11792     REWRITE_TAC[COMPLEX_ENTIRE; complex_div] THEN REPEAT DISJ1_TAC THEN
11793     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC;
11794     ALL_TAC] THEN
11795   ABBREV_TAC
11796    `g = \w. infsum (from 0)
11797                    (\m. higher_complex_derivative (m + n) f z /
11798                         Cx(&(FACT(m + n))) * (w - z) pow m)` THEN
11799   SUBGOAL_THEN
11800    `!w. w IN ball(z,r)
11801         ==> ((\m. higher_complex_derivative (m + n) f z /
11802                   Cx(&(FACT(m + n))) * (w - z) pow m)
11803              sums g(w)) (from 0)`
11804   (LABEL_TAC "*") THENL
11805    [REPEAT STRIP_TAC THEN EXPAND_TAC "g" THEN REWRITE_TAC[SUMS_INFSUM] THEN
11806     ASM_CASES_TAC `w:complex = z` THENL
11807      [MATCH_MP_TAC SUMMABLE_FROM_ELSEWHERE THEN EXISTS_TAC `1` THEN
11808       MATCH_MP_TAC SUMMABLE_EQ THEN EXISTS_TAC `\n:num. Cx(&0)` THEN
11809       REWRITE_TAC[SUMMABLE_0; GSYM COMPLEX_VEC_0] THEN
11810       ASM_SIMP_TAC[IN_FROM; COMPLEX_VEC_0; COMPLEX_SUB_REFL;
11811                    COMPLEX_POW_ZERO; LE_1; COMPLEX_MUL_RZERO];
11812       SUBGOAL_THEN
11813        `!x:complex m. x * (w - z) pow m =
11814                       (x * (w - z) pow (m + n)) / (w - z) pow n`
11815        (fun th -> ONCE_REWRITE_TAC[th])
11816       THENL
11817        [REPEAT GEN_TAC THEN
11818         SIMP_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC; COMPLEX_POW_ADD] THEN
11819         ASM_SIMP_TAC[COMPLEX_MUL_RINV; COMPLEX_POW_EQ_0; COMPLEX_SUB_0] THEN
11820         REWRITE_TAC[COMPLEX_MUL_RID];
11821         MATCH_MP_TAC SUMMABLE_COMPLEX_DIV THEN
11822         MP_TAC(GEN `a:num->complex`
11823           (ISPECL [`n:num`; `a:num->complex`] SUMMABLE_REINDEX)) THEN
11824         DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN
11825         REWRITE_TAC[summable; ADD_CLAUSES] THEN ASM_MESON_TAC[]]];
11826     ALL_TAC] THEN
11827   SUBGOAL_THEN `g holomorphic_on ball(z,r)` ASSUME_TAC THENL
11828    [MATCH_MP_TAC POWER_SERIES_HOLOMORPHIC THEN
11829     EXISTS_TAC `\m. higher_complex_derivative (m + n) f z /
11830                     Cx(&(FACT (m + n)))` THEN
11831     EXISTS_TAC `from 0` THEN ASM_SIMP_TAC[];
11832     ALL_TAC] THEN
11833   SUBGOAL_THEN
11834    `!w. w IN ball(z,r) ==> f w - f z = (w - z) pow n * g(w)`
11835   ASSUME_TAC THENL
11836    [REPEAT STRIP_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
11837     EXISTS_TAC `\m. higher_complex_derivative m f z / Cx(&(FACT m)) *
11838                     (w - z) pow m` THEN
11839     EXISTS_TAC `from n` THEN ASM_SIMP_TAC[] THEN
11840     GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [ARITH_RULE `n = 0 + n`] THEN
11841     REWRITE_TAC[GSYM SUMS_REINDEX] THEN REWRITE_TAC[COMPLEX_POW_ADD] THEN
11842     ONCE_REWRITE_TAC[COMPLEX_RING `a * b * c:complex = c * a * b`] THEN
11843     MATCH_MP_TAC SERIES_COMPLEX_LMUL THEN ASM_SIMP_TAC[];
11844     ALL_TAC] THEN
11845   EXISTS_TAC `g:complex->complex` THEN
11846   SUBGOAL_THEN `(g:complex->complex) continuous_on ball(z,r)` MP_TAC THENL
11847    [ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]; ALL_TAC] THEN
11848   REWRITE_TAC[continuous_on] THEN
11849   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
11850   ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN DISCH_THEN(MP_TAC o SPEC
11851    `norm((g:complex->complex) z)`) THEN
11852   ANTS_TAC THENL
11853    [REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
11854     ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN
11855     DISCH_THEN(MP_TAC o SPEC `1` o
11856       MATCH_MP (REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
11857     CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[VSUM_SING_NUMSEG] THEN
11858     DISCH_THEN(MP_TAC o SPEC `Cx(&0)` o
11859         MATCH_MP(REWRITE_RULE[IMP_CONJ] SERIES_UNIQUE)) THEN
11860     REWRITE_TAC[complex_pow; ADD_CLAUSES; COMPLEX_MUL_RID] THEN ANTS_TAC THENL
11861      [REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC SUMS_0 THEN
11862       SIMP_TAC[IN_FROM; LE_1; COMPLEX_SUB_REFL; COMPLEX_POW_ZERO] THEN
11863       REWRITE_TAC[COMPLEX_VEC_0; COMPLEX_MUL_RZERO];
11864       SIMP_TAC[COMPLEX_SUB_0; NORM_POS_LT] THEN DISCH_THEN(K ALL_TAC) THEN
11865       ASM_REWRITE_TAC[COMPLEX_VEC_0; complex_div; COMPLEX_ENTIRE] THEN
11866       REWRITE_TAC[COMPLEX_INV_EQ_0; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ]];
11867     ALL_TAC] THEN
11868   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
11869   EXISTS_TAC `min d r:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
11870   SUBGOAL_THEN `ball(z,min d r) SUBSET ball(z:complex,r)` ASSUME_TAC THENL
11871    [SIMP_TAC[SUBSET_BALL; REAL_ARITH `min d r <= r`]; ALL_TAC] THEN
11872   CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
11873   CONJ_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
11874   REWRITE_TAC[IN_BALL; REAL_LT_MIN; GSYM COMPLEX_VEC_0] THEN
11875   RULE_ASSUM_TAC(REWRITE_RULE[IN_BALL]) THEN
11876   ASM_MESON_TAC[DIST_SYM; NORM_ARITH `dist(x,y) < norm y ==> ~(x = vec 0)`]);;
11877
11878 let HOLOMORPHIC_FACTOR_ORDER_OF_ZERO_STRONG = prove
11879  (`!f s n z.
11880       open s /\ z IN s /\ f holomorphic_on s /\
11881       0 < n /\ ~(higher_complex_derivative n f z = Cx(&0)) /\
11882       (!m. 0 < m /\ m < n ==> higher_complex_derivative m f z = Cx(&0))
11883       ==> ?g r. &0 < r /\
11884                 g holomorphic_on ball(z,r) /\
11885                 (!w. w IN ball(z,r)
11886                      ==> f(w) - f(z) = ((w - z) * g w) pow n) /\
11887                 (!w. w IN ball(z,r) ==> ~(g w = Cx(&0)))`,
11888   REPEAT STRIP_TAC THEN
11889   MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`]
11890         HOLOMORPHIC_FACTOR_ORDER_OF_ZERO) THEN
11891   ASM_REWRITE_TAC[] THEN
11892   ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN MATCH_MP_TAC MONO_EXISTS THEN
11893   X_GEN_TAC `r:real` THEN
11894   DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
11895   MP_TAC(ISPECL
11896    [`\z. complex_derivative g z / g z`; `ball(z:complex,r)`;
11897     `{}:complex->bool`] HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
11898   REWRITE_TAC[CONVEX_BALL; FINITE_RULES; DIFF_EMPTY] THEN ANTS_TAC THENL
11899    [SIMP_TAC[GSYM HOLOMORPHIC_ON_OPEN; OPEN_BALL;
11900              INTERIOR_OPEN; complex_differentiable] THEN
11901     MATCH_MP_TAC(TAUT `q /\ (q ==> p) ==> p /\ q`) THEN
11902     REWRITE_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
11903     ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_BALL;
11904                  HOLOMORPHIC_ON_DIV; ETA_AX];
11905     SIMP_TAC[OPEN_BALL; HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN] THEN
11906     DISCH_THEN(X_CHOOSE_THEN `h:complex->complex` STRIP_ASSUME_TAC)] THEN
11907   MP_TAC(ISPECL [`\z:complex. cexp(h z) / g z`; `ball(z:complex,r)`]
11908     HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
11909   REWRITE_TAC[OPEN_BALL; CONNECTED_BALL] THEN ANTS_TAC THENL
11910    [X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
11911     SUBGOAL_THEN
11912      `Cx(&0) = ((complex_derivative g w / g w * cexp (h w)) * g w -
11913                 cexp (h w) * complex_derivative g w) / g w pow 2`
11914     SUBST1_TAC THENL
11915      [ASM_SIMP_TAC[COMPLEX_FIELD
11916        `~(z = Cx(&0)) ==> (d / z * e) * z = e * d`] THEN
11917       SIMPLE_COMPLEX_ARITH_TAC;
11918       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DIV_AT THEN
11919       ASM_SIMP_TAC[] THEN CONJ_TAC THENL
11920        [GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
11921         ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
11922         MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
11923         ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_CEXP];
11924         ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; complex_differentiable;
11925           OPEN_BALL; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE]]];
11926     DISCH_THEN(X_CHOOSE_THEN `c:complex` MP_TAC) THEN
11927     ASM_CASES_TAC `c = Cx(&0)` THENL
11928      [ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
11929        `~(x = Cx(&0)) /\ ~(y = Cx(&0)) ==> ~(x / y = Cx(&0))`] THEN
11930       ASM_MESON_TAC[];
11931       ASM_SIMP_TAC[COMPLEX_FIELD
11932        `~(y = Cx(&0)) /\ ~(z = Cx(&0))
11933         ==> (x / y = z <=> y = inv(z) * x)`] THEN
11934       DISCH_TAC THEN EXISTS_TAC
11935        `\z:complex. cexp((clog(inv c) + h z) / Cx(&n))` THEN
11936       REWRITE_TAC[CEXP_NZ; GSYM CEXP_N; COMPLEX_POW_MUL] THEN
11937       ASM_SIMP_TAC[COMPLEX_DIV_LMUL; CX_INJ; REAL_OF_NUM_EQ; LE_1] THEN
11938       ASM_SIMP_TAC[CEXP_ADD; CEXP_CLOG; COMPLEX_INV_EQ_0] THEN
11939       GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
11940       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
11941       REWRITE_TAC[HOLOMORPHIC_ON_CEXP] THEN
11942       MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
11943       ASM_SIMP_TAC[HOLOMORPHIC_ON_CONST; CX_INJ; REAL_OF_NUM_EQ; LE_1] THEN
11944       MATCH_MP_TAC HOLOMORPHIC_ON_ADD THEN
11945       REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
11946       ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL]]]);;
11947
11948 let HOLOMORPHIC_FACTOR_ZERO_NONCONSTANT = prove
11949  (`!f s z.
11950         open s /\ connected s /\ z IN s /\
11951         f holomorphic_on s /\ f(z) = Cx(&0) /\ ~(?c. !w. w IN s ==> f w = c)
11952         ==> ?g r n.
11953                 0 < n /\ &0 < r /\ ball(z,r) SUBSET s /\
11954                 g holomorphic_on ball(z,r) /\
11955                 (!w. w IN ball(z,r) ==> f w = (w - z) pow n * g w) /\
11956                 (!w. w IN ball(z,r) ==> ~(g w = Cx (&0)))`,
11957   REPEAT STRIP_TAC THEN
11958   ASM_CASES_TAC `!n. 0 < n ==> higher_complex_derivative n f z = Cx(&0)` THENL
11959    [MP_TAC(ISPECL
11960      [`f:complex->complex`; `s:complex->bool`; `z:complex`]
11961      HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED) THEN
11962     ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[];
11963     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
11964     DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
11965     DISCH_THEN(X_CHOOSE_THEN `r0:real` STRIP_ASSUME_TAC) THEN
11966     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN
11967     GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
11968     REWRITE_TAC[NOT_IMP; GSYM IMP_CONJ_ALT] THEN
11969     DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN
11970     MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`]
11971         HOLOMORPHIC_FACTOR_ORDER_OF_ZERO) THEN
11972     ASM_REWRITE_TAC[COMPLEX_SUB_RZERO] THEN MATCH_MP_TAC MONO_EXISTS THEN
11973     X_GEN_TAC `g:complex->complex` THEN
11974     DISCH_THEN(X_CHOOSE_THEN `r1:real` STRIP_ASSUME_TAC) THEN
11975     EXISTS_TAC `min r0 r1:real` THEN EXISTS_TAC `n:num` THEN
11976     ASM_SIMP_TAC[BALL_MIN_INTER; IN_INTER; REAL_LT_MIN] THEN CONJ_TAC THENL
11977      [ASM SET_TAC[];
11978       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
11979         HOLOMORPHIC_ON_SUBSET)) THEN
11980       ASM SET_TAC[]]]);;
11981
11982 (* ------------------------------------------------------------------------- *)
11983 (* Relating invertibility and nonvanishing of derivative.                    *)
11984 (* ------------------------------------------------------------------------- *)
11985
11986 let HAS_COMPLEX_DERIVATIVE_LOCALLY_INJECTIVE = prove
11987  (`!f s z.
11988         f holomorphic_on s /\ open s /\ z IN s /\
11989         ~(complex_derivative f z = Cx(&0))
11990         ==> ?t. z IN t /\
11991                 open t /\
11992                 (!x x'. x IN t /\ x' IN t /\ f x' = f x ==> x' = x)`,
11993   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_DERIVATIVE_LOCALLY_INJECTIVE THEN
11994   EXISTS_TAC `\z h. complex_derivative f z * h` THEN
11995   ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN EXISTS_TAC `s:complex->bool` THEN
11996   ASM_REWRITE_TAC[GSYM has_complex_derivative] THEN
11997   REWRITE_TAC[CONJ_ASSOC; LEFT_EXISTS_AND_THM] THEN
11998   ASM_REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
11999   REPEAT CONJ_TAC THENL
12000    [MATCH_MP_TAC LINEAR_INJECTIVE_LEFT_INVERSE THEN
12001     ASM_SIMP_TAC[LINEAR_COMPLEX_MUL; COMPLEX_EQ_MUL_LCANCEL];
12002     ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT];
12003     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
12004     SUBGOAL_THEN `(complex_derivative f) continuous_on s` MP_TAC THENL
12005      [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
12006       ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE];
12007       ALL_TAC] THEN
12008     ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[continuous_on] THEN
12009     DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12010     DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN
12011     ASM_REWRITE_TAC[dist; REAL_HALF] THEN
12012     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
12013     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12014     DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
12015     ASM_REWRITE_TAC[SUBSET; IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
12016     DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12017     EXISTS_TAC `min d r:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
12018     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
12019     MATCH_MP_TAC(REAL_ARITH `&0 < e /\ x <= e / &2 ==> x < e`) THEN
12020     ASM_REWRITE_TAC[GSYM COMPLEX_SUB_RDISTRIB] THEN MATCH_MP_TAC
12021      (CONJUNCT2(MATCH_MP ONORM (SPEC_ALL LINEAR_COMPLEX_MUL))) THEN
12022     GEN_TAC THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
12023     MATCH_MP_TAC REAL_LE_RMUL THEN
12024     ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE]]);;
12025
12026 let HAS_COMPLEX_DERIVATIVE_LOCALLY_INVERTIBLE = prove
12027  (`!f s z.
12028         f holomorphic_on s /\ open s /\ z IN s /\
12029         ~(complex_derivative f z = Cx(&0))
12030         ==> ?t g. z IN t /\ open t /\ open(IMAGE f t) /\ t SUBSET s /\
12031                   (!w. w IN t ==> g(f w) = w) /\
12032                   (!y. y IN (IMAGE f t) ==> f(g y) = y)`,
12033   REPEAT GEN_TAC THEN DISCH_TAC THEN
12034   FIRST_ASSUM(MP_TAC o MATCH_MP HAS_COMPLEX_DERIVATIVE_LOCALLY_INJECTIVE) THEN
12035   DISCH_THEN(X_CHOOSE_THEN `t:complex->bool` MP_TAC) THEN
12036   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
12037   GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] THEN
12038   REWRITE_TAC[INJECTIVE_ON_LEFT_INVERSE] THEN
12039   DISCH_THEN(X_CHOOSE_TAC `g:complex->complex`) THEN
12040   EXISTS_TAC `s INTER t:complex->bool` THEN
12041   EXISTS_TAC `g:complex->complex` THEN
12042   ASM_SIMP_TAC[OPEN_INTER; IN_INTER; INTER_SUBSET; FORALL_IN_IMAGE] THEN
12043   MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
12044   ASM_SIMP_TAC[OPEN_INTER; IN_INTER] THEN
12045   ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
12046                 HOLOMORPHIC_ON_SUBSET; INTER_SUBSET]);;
12047
12048 let HOLOMORPHIC_INJECTIVE_IMP_REGULAR = prove
12049  (`!f s.
12050         f holomorphic_on s /\ open s /\
12051         (!w z. w IN s /\ z IN s /\ f w = f z ==> w = z)
12052         ==> !z. z IN s ==> ~(complex_derivative f z = Cx(&0))`,
12053   REPEAT STRIP_TAC THEN
12054   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12055   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12056   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12057   ASM_CASES_TAC `!n. 0 < n ==> higher_complex_derivative n f z = Cx(&0)` THENL
12058    [MP_TAC(ISPECL
12059      [`f:complex->complex`; `ball(z:complex,r)`; `z:complex`]
12060      HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED) THEN
12061     ASM_SIMP_TAC[OPEN_BALL; CONNECTED_BALL; CENTRE_IN_BALL; NOT_IMP] THEN
12062     CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
12063     DISCH_THEN(MP_TAC o SPEC `z + Cx(r / &2)`) THEN
12064     REWRITE_TAC[IN_BALL; NORM_ARITH `dist(z,z + r) = norm r`] THEN
12065     REWRITE_TAC[COMPLEX_NORM_CX; NOT_IMP] THEN
12066     CONJ_TAC THENL [ASM_REAL_ARITH_TAC; DISCH_TAC] THEN
12067     FIRST_X_ASSUM(MP_TAC o SPECL [`z:complex`; `z + Cx(r / &2)`]) THEN
12068     ASM_REWRITE_TAC[COMPLEX_RING `z = z + a <=> a = Cx(&0)`] THEN
12069     REWRITE_TAC[NOT_IMP; CX_INJ] THEN
12070     CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
12071     FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
12072     REWRITE_TAC[IN_BALL; NORM_ARITH `dist(z,z + r) = norm r`] THEN
12073     REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
12074     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM])] THEN
12075   GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
12076   REWRITE_TAC[NOT_IMP; GSYM IMP_CONJ_ALT] THEN
12077   DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN
12078   MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`; `z:complex`]
12079      HOLOMORPHIC_FACTOR_ORDER_OF_ZERO_STRONG) THEN
12080   ASM_REWRITE_TAC[NOT_EXISTS_THM] THEN
12081   MAP_EVERY X_GEN_TAC [`g:complex->complex`; `k:real`] THEN STRIP_TAC THEN
12082   ASM_CASES_TAC `n = 1` THENL
12083    [ASM_MESON_TAC[HIGHER_COMPLEX_DERIVATIVE_1]; ALL_TAC] THEN
12084   MP_TAC(ISPECL[`\w:complex. (w - z) * g(w)`; `ball(z:complex,min r k)`;
12085                 `z:complex`] HAS_COMPLEX_DERIVATIVE_LOCALLY_INVERTIBLE) THEN
12086   ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; NOT_IMP; REAL_LT_MIN] THEN
12087   CONJ_TAC THENL
12088    [SUBGOAL_THEN
12089      `!w. w IN ball(z,min r k)
12090           ==> ((\w. (w - z) * g w) has_complex_derivative
12091                ((w - z) * complex_derivative g w + (Cx(&1) - Cx(&0)) * g w))
12092               (at w)`
12093     (LABEL_TAC "*")
12094     THENL
12095      [REPEAT STRIP_TAC THEN
12096       SUBGOAL_THEN `w IN ball(z:complex,k)` ASSUME_TAC THENL
12097        [ASM_MESON_TAC[SUBSET; SUBSET_BALL; REAL_ARITH `min r k <= k`];
12098         ALL_TAC] THEN
12099       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_MUL_AT THEN
12100       SIMP_TAC[HAS_COMPLEX_DERIVATIVE_ID; HAS_COMPLEX_DERIVATIVE_SUB;
12101        HAS_COMPLEX_DERIVATIVE_CONST; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
12102       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_BALL];
12103       SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
12104       CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
12105       REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
12106       ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_LT_MIN] THEN
12107       DISCH_THEN(SUBST1_TAC o  MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
12108       REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_LZERO; COMPLEX_ADD_LID;
12109                   COMPLEX_SUB_RZERO; COMPLEX_MUL_LID] THEN
12110       FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[CENTRE_IN_BALL]];
12111     REWRITE_TAC[NOT_EXISTS_THM] THEN
12112     MAP_EVERY X_GEN_TAC [`t:complex->bool`; `h:complex->complex`] THEN
12113     ABBREV_TAC `u = IMAGE (\w:complex. (w - z) * g w) t` THEN STRIP_TAC THEN
12114     MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_CBALL) THEN
12115     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `Cx(&0)`) THEN
12116     ANTS_TAC THENL
12117      [EXPAND_TAC "u" THEN REWRITE_TAC[IN_IMAGE] THEN
12118       EXISTS_TAC `z:complex` THEN ASM_REWRITE_TAC[] THEN
12119       CONV_TAC COMPLEX_RING;
12120       ALL_TAC] THEN
12121     REWRITE_TAC[NOT_EXISTS_THM; SUBSET; IN_CBALL; dist;
12122                 COMPLEX_SUB_LZERO; NORM_NEG] THEN
12123     X_GEN_TAC `e:real` THEN
12124     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
12125     DISCH_THEN(fun th ->
12126      MP_TAC(ISPEC `Cx(e) * cexp(Cx(&2) * Cx pi * ii * Cx(&0 / &n))` th) THEN
12127      MP_TAC(ISPEC `Cx(e) * cexp(Cx(&2) * Cx pi * ii * Cx(&1 / &n))` th)) THEN
12128     REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP; RE_MUL_CX; RE_MUL_II] THEN
12129     REWRITE_TAC[IM_CX; REAL_NEG_0; REAL_MUL_RZERO; REAL_EXP_0] THEN
12130     REWRITE_TAC[COMPLEX_NORM_CX; REAL_MUL_RID] THEN
12131     SIMP_TAC[REAL_ARITH `&0 < e ==> abs e <= e`; ASSUME `&0 < e`] THEN
12132     EXPAND_TAC "u" THEN REWRITE_TAC[IN_IMAGE] THEN
12133     DISCH_THEN(X_CHOOSE_THEN `y1:complex` (STRIP_ASSUME_TAC o GSYM)) THEN
12134     DISCH_THEN(X_CHOOSE_THEN `y0:complex` (STRIP_ASSUME_TAC o GSYM)) THEN
12135     UNDISCH_THEN `!w. w IN ball (z,k) ==> f w - f z = ((w - z) * g w) pow n`
12136       (fun th -> MP_TAC(SPEC `y1:complex` th) THEN
12137                  MP_TAC(SPEC `y0:complex` th)) THEN
12138     MATCH_MP_TAC(TAUT `(p1 /\ p2) /\ ~(q1 /\ q2)
12139                        ==> (p1 ==> q1) ==> (p2 ==> q2) ==> F`) THEN
12140     CONJ_TAC THENL
12141      [ASM_MESON_TAC[SUBSET; SUBSET_BALL; REAL_ARITH `min r k <= k`];
12142       MATCH_MP_TAC(MESON[] `x' = y' /\ ~(x = y) ==> ~(x = x' /\ y = y')`)] THEN
12143     CONJ_TAC THENL
12144      [RULE_ASSUM_TAC(REWRITE_RULE[INJECTIVE_ON_LEFT_INVERSE]) THEN
12145       ASM_SIMP_TAC[] THEN REWRITE_TAC[COMPLEX_POW_MUL] THEN
12146       ASM_SIMP_TAC[COMPLEX_ROOT_UNITY; LE_1];
12147       REWRITE_TAC[COMPLEX_RING `x - a:complex = y - a <=> x = y`] THEN
12148       DISCH_TAC THEN UNDISCH_THEN
12149        `!w z. w IN s /\ z IN s /\ (f:complex->complex) w = f z ==> w = z`
12150        (MP_TAC o SPECL [`y0:complex`; `y1:complex`]) THEN
12151       ASM_REWRITE_TAC[NOT_IMP] THEN CONJ_TAC THENL
12152        [ASM_MESON_TAC[SUBSET; SUBSET_BALL; REAL_ARITH `min r k <= r`];
12153         DISCH_THEN SUBST_ALL_TAC] THEN
12154       MP_TAC(ISPECL [`n:num`; `0`; `1`] COMPLEX_ROOT_UNITY_EQ) THEN
12155       ASM_SIMP_TAC[LE_1] THEN MATCH_MP_TAC(TAUT `a /\ ~b ==> ~(a <=> b)`) THEN
12156       CONJ_TAC THENL
12157        [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (COMPLEX_RING
12158          `z = e * y ==> z = e * x /\ ~(e = Cx(&0)) ==> x = y`)) THEN
12159         ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ];
12160         REWRITE_TAC[num_congruent; int_congruent] THEN
12161         DISCH_THEN(X_CHOOSE_THEN `d:int`
12162          (MP_TAC o AP_TERM `abs:int->int` o SYM)) THEN
12163         REWRITE_TAC[INT_ABS_NUM; INT_SUB_LZERO; INT_ABS_NEG] THEN
12164         ASM_REWRITE_TAC[INT_ABS_MUL_1; INT_OF_NUM_EQ; INT_ABS_NUM]]]]);;
12165
12166 (* ------------------------------------------------------------------------- *)
12167 (* Hence a nice clean inverse function theorem.                              *)
12168 (* ------------------------------------------------------------------------- *)
12169
12170 let HOLOMORPHIC_ON_INVERSE = prove
12171  (`!f s. f holomorphic_on s /\ open s /\
12172          (!w z. w IN s /\ z IN s /\ f w = f z ==> w = z)
12173          ==> open(IMAGE f s) /\
12174              ?g. g holomorphic_on (IMAGE f s) /\
12175                  (!z. z IN s
12176                       ==> complex_derivative f z * complex_derivative g (f z) =
12177                           Cx(&1)) /\
12178                  (!z. z IN s ==> g(f z) = z) /\
12179                  (!y. y IN (IMAGE f s) ==> f(g y) = y)`,
12180   REPEAT GEN_TAC THEN STRIP_TAC THEN
12181   MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
12182    [MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
12183     ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
12184     DISCH_TAC] THEN
12185   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [INJECTIVE_ON_LEFT_INVERSE]) THEN
12186   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
12187   STRIP_TAC THEN ASM_SIMP_TAC[FORALL_IN_IMAGE] THEN
12188   ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; FORALL_IN_IMAGE] THEN
12189   REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `z:complex` THEN
12190   ASM_CASES_TAC `(z:complex) IN s` THEN ASM_REWRITE_TAC[] THEN
12191   MP_TAC(ISPECL
12192    [`f:complex->complex`; `g:complex->complex`;
12193     `complex_derivative f z`; `s:complex->bool`;
12194     `z:complex`] HAS_COMPLEX_DERIVATIVE_INVERSE_STRONG) THEN
12195   ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; IMP_CONJ] THEN
12196   ANTS_TAC THENL
12197    [ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE; HOLOMORPHIC_ON_OPEN;
12198                         complex_differentiable];
12199     ALL_TAC] THEN
12200   MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`]
12201         HOLOMORPHIC_INJECTIVE_IMP_REGULAR) THEN
12202   ANTS_TAC THENL [ASM_MESON_TAC[]; DISCH_THEN(MP_TAC o SPEC `z:complex`)] THEN
12203   ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
12204   ASM_SIMP_TAC[COMPLEX_FIELD
12205    `~(z = Cx(&0)) ==> (z * w = Cx(&1) <=> w = inv z)`] THEN
12206   MESON_TAC[HAS_COMPLEX_DERIVATIVE_DERIVATIVE]);;
12207
12208 (* ------------------------------------------------------------------------- *)
12209 (* Holomorphism of covering maps and lifts.                                  *)
12210 (* ------------------------------------------------------------------------- *)
12211
12212 let COVERING_SPACE_LIFT_IS_HOLOMORPHIC = prove
12213  (`!p c s f g u.
12214         covering_space (c,p) s /\ open c /\ p holomorphic_on c /\
12215         f holomorphic_on u /\ IMAGE f u SUBSET s /\ IMAGE g u SUBSET c /\
12216         g continuous_on u /\ (!x. x IN u ==> p(g x) = f x)
12217         ==> g holomorphic_on u`,
12218   REPEAT STRIP_TAC THEN
12219   REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
12220   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
12221   FIRST_ASSUM(MP_TAC o SPEC `(f:complex->complex) z` o last o CONJUNCTS o
12222               GEN_REWRITE_RULE I [covering_space]) THEN
12223   ANTS_TAC THENL [ASM SET_TAC[]; ASM_SIMP_TAC[OPEN_IN_OPEN_EQ]] THEN
12224   DISCH_THEN(X_CHOOSE_THEN `t:complex->bool` MP_TAC) THEN
12225   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
12226   DISCH_THEN(X_CHOOSE_THEN `vv:(complex->bool)->bool` STRIP_ASSUME_TAC) THEN
12227   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [EXTENSION]) THEN
12228   DISCH_THEN(MP_TAC o snd o EQ_IMP_RULE o SPEC `(g:complex->complex) z`) THEN
12229   ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[IN_UNIONS]] THEN
12230   DISCH_THEN(X_CHOOSE_THEN `v:complex->bool` STRIP_ASSUME_TAC) THEN
12231   MP_TAC(ISPECL [`p:complex->complex`; `v:complex->bool`]
12232         HOLOMORPHIC_ON_INVERSE) THEN
12233   ANTS_TAC THENL
12234    [CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
12235     RULE_ASSUM_TAC(REWRITE_RULE[homeomorphism]) THEN ASM SET_TAC[];
12236     DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
12237     DISCH_THEN(X_CHOOSE_THEN `p':complex->complex` STRIP_ASSUME_TAC)] THEN
12238   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_WITHIN THEN
12239   EXISTS_TAC `(p':complex->complex) o (f:complex->complex)` THEN
12240   MP_TAC(ISPECL
12241    [`g:complex->complex`; `u:complex->bool`; `c:complex->bool`;
12242     `v:complex->bool`] CONTINUOUS_OPEN_IN_PREIMAGE_GEN) THEN
12243   ASM_SIMP_TAC[OPEN_IN_OPEN_EQ] THEN REWRITE_TAC[open_in] THEN
12244   DISCH_THEN(MP_TAC o SPEC `z:complex` o CONJUNCT2) THEN
12245   ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[o_THM; IN_ELIM_THM]] THEN
12246   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
12247   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
12248   CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
12249   MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_COMPOSE_WITHIN THEN CONJ_TAC THENL
12250    [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_WITHIN THEN
12251     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET];
12252     MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_AT_WITHIN THEN
12253     MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
12254     EXISTS_TAC `IMAGE (p:complex->complex) v` THEN
12255     ASM_REWRITE_TAC[] THEN ASM SET_TAC[]]);;
12256
12257 let COVERING_SPACE_LIFT_HOLOMORPHIC = prove
12258  (`!p c s f u.
12259         covering_space (c,p) s /\ p holomorphic_on c /\ open c /\
12260         simply_connected u /\ locally path_connected u /\
12261         f holomorphic_on u /\ IMAGE f u SUBSET s
12262         ==> ?g. g holomorphic_on u /\ IMAGE g u SUBSET c /\
12263                 !y. y IN u ==> p(g y) = f y`,
12264   REPEAT STRIP_TAC THEN MP_TAC(ISPECL
12265    [`p:complex->complex`; `c:complex->bool`; `s:complex->bool`;
12266     `f:complex->complex`; `u:complex->bool`] COVERING_SPACE_LIFT) THEN
12267     ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
12268     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
12269   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
12270   FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
12271         COVERING_SPACE_LIFT_IS_HOLOMORPHIC)) THEN
12272   EXISTS_TAC `f:complex->complex` THEN ASM_REWRITE_TAC[]);;
12273
12274 (* ------------------------------------------------------------------------- *)
12275 (* The Schwarz lemma.                                                        *)
12276 (* ------------------------------------------------------------------------- *)
12277
12278 let SCHWARZ_LEMMA = prove
12279  (`!f. f holomorphic_on ball(Cx(&0),&1) /\
12280        (!z:complex. norm z < &1 ==> norm (f z) < &1) /\
12281        f(Cx(&0)) = Cx(&0)
12282        ==> (!z. norm z < &1 ==> norm(f z) <= norm z) /\
12283            norm(complex_derivative f(Cx(&0))) <= &1 /\
12284            ((?z. norm z < &1 /\ ~(z= Cx(&0)) /\ norm(f z) = norm z) \/
12285             norm(complex_derivative f (Cx(&0))) = &1
12286             ==> ?c. (!z. norm z < &1 ==> f z = c*z) /\ norm c = &1)`,
12287   let LEMMA1 = prove
12288   (`!f a. open a /\ connected a /\ bounded a /\ ~(a = {}) /\
12289          f holomorphic_on a /\ f continuous_on (closure a)
12290          ==> (?w. w IN (frontier a) /\
12291                   (!z. z IN (closure a) ==> norm (f z) <= norm (f w)))`,
12292   REPEAT STRIP_TAC THEN ASSERT_TAC
12293     `?x. x IN closure a /\
12294          (!z. z IN closure a ==>
12295               norm((f:complex->complex) z) <= norm(f x))` THENL
12296   [MATCH_MP_TAC CONTINUOUS_ATTAINS_SUP THEN
12297   ASM_SIMP_TAC [COMPACT_CLOSURE;CLOSURE_EQ_EMPTY] THEN
12298   SUBGOAL_THEN `lift o (\x. norm((f:complex->complex) x)) =
12299                  (lift o norm) o (\x. f x) ` SUBST1_TAC THENL
12300   [REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
12301   ASM_REWRITE_TAC [CONTINUOUS_ON_LIFT_NORM;ETA_AX]]; ALL_TAC] THEN
12302   ASM_CASES_TAC `x:complex IN frontier a` THENL
12303   [EXISTS_TAC `x:complex` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN
12304   SUBGOAL_THEN `x:complex IN interior a` MP_TAC THENL
12305   [POP_ASSUM MP_TAC THEN REWRITE_TAC[frontier;DIFF] THEN
12306   SET_TAC[ASSUME `x:complex IN closure a`]; ALL_TAC] THEN
12307   ASM_SIMP_TAC[INTERIOR_OPEN] THEN DISCH_TAC THEN
12308   SUBGOAL_THEN `?c. !z. z IN a ==> (f:complex->complex) z = c`
12309   STRIP_ASSUME_TAC THENL
12310   [MATCH_MP_TAC MAXIMUM_MODULUS_PRINCIPLE THEN
12311   EXISTS_TAC `a:complex->bool` THEN
12312   EXISTS_TAC `x:complex` THEN ASM_REWRITE_TAC[SUBSET_REFL] THEN GEN_TAC THEN
12313   DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[closure;UNION] THEN
12314   SET_TAC[ASSUME `z:complex IN a`]; ALL_TAC] THEN
12315   SUBGOAL_THEN `CHOICE(frontier(a:complex->bool)) IN frontier a`
12316   ASSUME_TAC THENL
12317   [MATCH_MP_TAC CHOICE_DEF THEN MATCH_MP_TAC FRONTIER_NOT_EMPTY THEN
12318    CONJ_TAC THENL [ASM SET_TAC[]; ASM_MESON_TAC[NOT_BOUNDED_UNIV]];
12319    ALL_TAC] THEN
12320   EXISTS_TAC `CHOICE(frontier(a:complex->bool))` THEN ASM_REWRITE_TAC[] THEN
12321   REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_EQ_IMP_LE THEN
12322   SUBGOAL_THEN `!z. z IN closure a ==> (f:complex->complex) z = c`
12323   ASSUME_TAC THENL
12324   [MP_TAC (ISPECL [`f:complex->complex`; `closure (a:complex->bool)`;
12325   `{c:complex}`] CONTINUOUS_CLOSED_PREIMAGE) THEN
12326   ASM_REWRITE_TAC [CLOSED_CLOSURE; CLOSED_SING] THEN
12327   ABBREV_TAC `s = {x | x IN closure(a:complex->bool) /\
12328   (f:complex->complex) x IN {c}}` THEN DISCH_TAC THEN
12329   SUBGOAL_THEN `closure a SUBSET (s:complex->bool)` ASSUME_TAC THENL
12330   [MATCH_MP_TAC CLOSURE_MINIMAL THEN CONJ_TAC THENL
12331   [REWRITE_TAC[SUBSET] THEN EXPAND_TAC "s" THEN
12332    ASSUME_TAC (MESON [CLOSURE_SUBSET;GSYM SUBSET]
12333        `!x:complex. x IN a ==> x IN closure a`) THEN
12334   SET_TAC [ASSUME `!x:complex. x IN a ==> x IN closure a`;
12335               ASSUME `!z:complex. z IN a ==> f z = c:complex`];
12336   ASM_REWRITE_TAC[]];
12337   POP_ASSUM MP_TAC THEN EXPAND_TAC "s" THEN SET_TAC[]];
12338   EQ_TRANS_TAC `norm(c:complex)` THENL
12339   [ASM_SIMP_TAC[]; ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN
12340   MATCH_MP_TAC (NORM_ARITH `!x y:complex. x = y ==> norm x = norm y`) THEN
12341   FIRST_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[frontier;IN_DIFF]]])
12342   in
12343   let LEMMA2 = prove
12344   (`!(f:complex->complex) r w s.
12345       &0 < r /\ f holomorphic_on ball(Cx(&0),r) /\
12346       &0 < s /\ ball(w,s) SUBSET ball(Cx(&0),r) /\
12347       (!z. norm (w-z) < s ==> norm(f z) <= norm(f w))
12348       ==> (?c. !z. norm z < r ==> f z = c)`,
12349   REPEAT STRIP_TAC THEN
12350   MP_TAC (SPECL[`f:complex->complex`;`ball (Cx(&0),r)`; `ball (w:complex,s)`;
12351                 `w:complex`] MAXIMUM_MODULUS_PRINCIPLE) THEN
12352   ASM_REWRITE_TAC[OPEN_BALL; CONNECTED_BALL; IN_BALL;DIST_REFL] THEN
12353   ASM_REWRITE_TAC[dist;COMPLEX_SUB_LZERO;NORM_NEG])
12354   in
12355   let LEMMA3 = prove
12356   (`!r:real f. f holomorphic_on (ball(Cx(&0),r)) /\ f (Cx(&0))=Cx(&0)
12357    ==> (?h. h holomorphic_on (ball(Cx(&0),r)) /\
12358   ((!z. norm z < r ==> f z=z*(h z)) /\
12359   (complex_derivative f (Cx(&0)))= h (Cx(&0))))`,
12360   REPEAT STRIP_TAC THEN ABBREV_TAC `h = \z. if z = Cx(&0) then
12361   complex_derivative f (Cx(&0)) else f z/z` THEN EXISTS_TAC
12362   `h:complex->complex` THEN ASSERT_TAC `(!z:complex. norm z < r ==>
12363   (f:complex->complex) z = z * h z) /\ complex_derivative f (Cx(&0))
12364   = h (Cx(&0))` THENL [CONJ_TAC THENL
12365   [GEN_TAC THEN DISCH_TAC THEN EXPAND_TAC "h" THEN
12366   COND_CASES_TAC THENL [ASM_REWRITE_TAC[COMPLEX_MUL_LZERO];
12367   POP_ASSUM MP_TAC THEN CONV_TAC COMPLEX_FIELD];
12368   EXPAND_TAC "h" THEN ASM_REWRITE_TAC[]];ALL_TAC] THEN ASM_REWRITE_TAC[]
12369   THEN MATCH_MP_TAC  POLE_THEOREM_OPEN_0 THEN  EXISTS_TAC `(f:complex->complex)`
12370   THEN EXISTS_TAC `Cx(&0)` THEN
12371   ASM_SIMP_TAC[OPEN_BALL;IN_BALL;COMPLEX_SUB_RZERO;
12372    dist;COMPLEX_SUB_LZERO;NORM_NEG])
12373   in
12374   GEN_TAC THEN STRIP_TAC THEN
12375   MP_TAC (SPECL [`&1`;`f:complex->complex`] LEMMA3) THEN ASM_REWRITE_TAC[] THEN
12376   STRIP_TAC THEN SUBGOAL_THEN
12377     `!z. norm z < &1 ==> norm ((h:complex->complex) z) <= &1`
12378     ASSUME_TAC THENL
12379   [GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC
12380   (prove
12381   (`!x y:real. (!a. y<a ==> x<a) ==> x <= y`,
12382   REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LT] THEN
12383   ONCE_REWRITE_TAC[REAL_LT_BETWEEN] THEN REWRITE_TAC[NOT_EXISTS_THM;
12384   DE_MORGAN_THM] THEN X_GEN_TAC `z:real` THEN
12385   POP_ASSUM (MP_TAC o SPEC `z:real`) THEN REAL_ARITH_TAC)) THEN
12386   X_GEN_TAC `a:real` THEN
12387   DISCH_TAC THEN SUBGOAL_THEN
12388    `?r. norm (z:complex) < r /\ inv r < a /\ r < &1` MP_TAC THENL
12389   [SUBGOAL_THEN `max (inv a) (norm(z:complex)) < &1` MP_TAC THENL
12390   [ASM_SIMP_TAC[REAL_MAX_LT; REAL_INV_LT_1];
12391   GEN_REWRITE_TAC LAND_CONV [REAL_LT_BETWEEN] THEN
12392   DISCH_THEN (X_CHOOSE_TAC `r:real`) THEN EXISTS_TAC `r:real` THEN
12393   POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[REAL_MAX_LT] THEN STRIP_TAC THEN
12394   ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_LINV THEN
12395   ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; ALL_TAC] THEN
12396   STRIP_TAC THEN
12397   SUBGOAL_THEN `&0 < r` ASSUME_TAC THENL
12398   [ASM_MESON_TAC[REAL_LET_TRANS; NORM_POS_LE]; ALL_TAC] THEN
12399   SUBGOAL_THEN `inv (r:real) = &1/r` ASSUME_TAC THENL
12400   [MATCH_MP_TAC REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC REAL_DIV_LMUL THEN
12401   ASM_SIMP_TAC[REAL_LT_IMP_NZ]; ALL_TAC] THEN
12402   SUBGOAL_THEN `?w. norm w = r /\ (!z. norm z < r
12403                     ==> norm((h:complex->complex) z) <= norm(h w))`
12404                   STRIP_ASSUME_TAC THENL
12405   [MATCH_MP_TAC(prove (`!f r. &0 < r /\ f holomorphic_on ball(Cx(&0),r) /\
12406          f continuous_on cball(Cx(&0),r)
12407          ==> (?w. norm w = r /\ (!z. norm z < r ==> norm(f z) <= norm(f w)))`,
12408   REPEAT GEN_TAC THEN STRIP_TAC THEN
12409   MP_TAC(SPECL[`f:complex->complex`; `ball(Cx(&0),r)`] LEMMA1) THEN
12410   ASM_REWRITE_TAC[OPEN_BALL; CONNECTED_BALL; BOUNDED_BALL; BALL_EQ_EMPTY;
12411                   REAL_ARITH `!r:real. ~(r <= &0) <=> &0 < r`] THEN
12412   ASM_SIMP_TAC[CLOSURE_BALL] THEN STRIP_TAC THEN EXISTS_TAC `w:complex` THEN
12413   CONJ_TAC THENL
12414   [UNDISCH_TAC `w:complex IN frontier(ball(Cx(&0),r))` THEN
12415   ASM_SIMP_TAC[FRONTIER_BALL;sphere;dist;COMPLEX_SUB_LZERO;NORM_NEG] THEN
12416   SET_TAC[];
12417   POP_ASSUM MP_TAC THEN
12418   REWRITE_TAC[IN_CBALL;dist;COMPLEX_SUB_LZERO;NORM_NEG] THEN
12419   MESON_TAC [REAL_LT_IMP_LE]])) THEN ASM_REWRITE_TAC[] THEN
12420   CONJ_TAC THENL [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET
12421   THEN EXISTS_TAC `ball(Cx(&0),&1)` THEN
12422   ASM_SIMP_TAC [SUBSET_BALL;REAL_LT_IMP_LE];
12423   MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
12424   MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `ball(Cx(&0),&1)` THEN
12425   ASM_REWRITE_TAC[SUBSET; IN_CBALL; IN_BALL] THEN
12426   ASM_MESON_TAC[REAL_LET_TRANS]]; ALL_TAC] THEN
12427   MATCH_MP_TAC REAL_LET_TRANS THEN
12428   EXISTS_TAC `norm(h(w:complex):complex)` THEN CONJ_TAC THENL
12429   [ASM_SIMP_TAC[]; ALL_TAC] THEN
12430   SUBGOAL_THEN `h w:complex = f w / w` SUBST1_TAC THENL
12431   [ASM_SIMP_TAC[] THEN
12432   MP_TAC (MESON [GSYM COMPLEX_NORM_ZERO;REAL_NOT_EQ;
12433                     ASSUME `norm(w:complex) =r`;
12434                     ASSUME `&0 < r`] `~(w=Cx(&0))`) THEN
12435   CONV_TAC(COMPLEX_FIELD);
12436   ASM_REWRITE_TAC[COMPLEX_NORM_DIV] THEN MATCH_MP_TAC REAL_LT_TRANS THEN
12437   EXISTS_TAC `&1/(r:real)` THEN ASM_SIMP_TAC [REAL_LT_DIV2_EQ] THEN
12438   MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `inv (r:real)` THEN
12439   ASM_REWRITE_TAC[REAL_LE_REFL]]; ALL_TAC] THEN
12440   CONJ_TAC THENL
12441   [GEN_TAC THEN DISCH_TAC THEN ASM_CASES_TAC `z = Cx(&0)` THENL
12442   [ASM_SIMP_TAC[COMPLEX_MUL_LZERO;REAL_LE_REFL];
12443   SUBST1_TAC (REAL_ARITH `norm (z:complex) = norm z * &1`) THEN
12444   ASM_SIMP_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
12445   ASM_SIMP_TAC[NORM_POS_LE]]; ALL_TAC] THEN CONJ_TAC THENL
12446   [ASM_MESON_TAC [COMPLEX_NORM_ZERO;REAL_LT_01]; ALL_TAC] THEN
12447   REWRITE_TAC[TAUT `((p \/ q) ==> r) <=> ((p ==> r) /\ (q ==> r))`] THEN
12448   CONJ_TAC THENL [STRIP_TAC THEN SUBGOAL_THEN
12449    `norm ((h:complex->complex) z) = &1` ASSUME_TAC THENL
12450   [SUBGOAL_THEN `(h:complex->complex) z = f z/z` SUBST1_TAC THENL
12451   [UNDISCH_THEN `!z:complex. norm z < &1  ==> f z = z * h z`
12452   (MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12453   UNDISCH_TAC `~(z = Cx(&0))` THEN CONV_TAC(COMPLEX_FIELD);
12454   ASM_SIMP_TAC[COMPLEX_NORM_ZERO;REAL_DIV_REFL;COMPLEX_NORM_DIV]];
12455   SUBGOAL_THEN `?c. (!z. norm z < &1 ==> (h:complex->complex) z = c)`
12456   STRIP_ASSUME_TAC THENL [MATCH_MP_TAC LEMMA2
12457   THEN EXISTS_TAC `z:complex` THEN EXISTS_TAC `&1 - norm(z:complex)`
12458   THEN ASM_REWRITE_TAC[REAL_LT_01] THEN CONJ_TAC THENL
12459   [ASM_MESON_TAC[REAL_SUB_LT]; CONJ_TAC THENL
12460   [REWRITE_TAC[SUBSET;IN_BALL] THEN GEN_TAC THEN DISCH_TAC THEN
12461   MATCH_MP_TAC REAL_LET_TRANS THEN
12462   EXISTS_TAC `dist(Cx(&0), z) + dist(z,x)` THEN
12463   REWRITE_TAC[DIST_TRIANGLE] THEN POP_ASSUM MP_TAC THEN
12464   REWRITE_TAC[dist;COMPLEX_SUB_LZERO;NORM_NEG] THEN REAL_ARITH_TAC;
12465   GEN_TAC THEN DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN
12466   MATCH_MP_TAC REAL_LET_TRANS THEN
12467   EXISTS_TAC `norm(z:complex) + norm(z' - z)` THEN
12468   REWRITE_TAC[NORM_TRIANGLE_SUB] THEN REWRITE_TAC[NORM_SUB] THEN
12469   POP_ASSUM MP_TAC THEN REWRITE_TAC[NORM_SUB] THEN REAL_ARITH_TAC]];
12470   EXISTS_TAC `c:complex` THEN CONJ_TAC THENL
12471   [ASM_SIMP_TAC[COMPLEX_MUL_SYM];
12472   POP_ASSUM (MP_TAC o SPEC `z:complex`) THEN ASM_MESON_TAC[]]]];
12473   ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
12474   SUBGOAL_THEN `?c. (!z. norm z < &1 ==> (h:complex->complex) z = c)`
12475   STRIP_ASSUME_TAC THENL[MATCH_MP_TAC LEMMA2 THEN EXISTS_TAC `Cx(&0)`
12476   THEN EXISTS_TAC `&1` THEN ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`;
12477   SUBSET_REFL; COMPLEX_SUB_LZERO; NORM_NEG];
12478   EXISTS_TAC `c:complex` THEN CONJ_TAC THENL
12479   [ASM_SIMP_TAC[COMPLEX_MUL_SYM];POP_ASSUM (MP_TAC o SPEC `Cx(&0)`) THEN
12480   ASM_MESON_TAC[COMPLEX_NORM_0; REAL_LT_01]]]]);;
12481
12482 (* ------------------------------------------------------------------------- *)
12483 (* The Schwarz reflection principle.                                         *)
12484 (* ------------------------------------------------------------------------- *)
12485
12486 let HOLOMORPHIC_ON_PASTE_ACROSS_LINE = prove
12487  (`!f s a k.
12488         open s /\ ~(a = vec 0) /\
12489         f holomorphic_on {z | z IN s /\ k < a dot z} /\
12490         f holomorphic_on {z | z IN s /\ a dot z < k} /\
12491         f continuous_on s
12492         ==> f holomorphic_on s`,
12493   let lemma0 = prove
12494    (`!d a b:real^N k.
12495           d dot a <= k /\ k <= d dot b
12496           ==> ?c. c IN segment[a,b] /\ d dot c = k /\
12497                   (!z. z IN segment[a,c] ==> d dot z <= k) /\
12498                   (!z. z IN segment[c,b] ==> k <= d dot z)`,
12499     REPEAT STRIP_TAC THEN
12500     MP_TAC(ISPECL [`segment[a:real^N,b]`; `a:real^N`; `b:real^N`;
12501                    `d:real^N`; `k:real`] CONNECTED_IVT_HYPERPLANE) THEN
12502     ASM_REWRITE_TAC[CONNECTED_SEGMENT; ENDS_IN_SEGMENT] THEN
12503     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `c:real^N` THEN STRIP_TAC THEN
12504     ASM_REWRITE_TAC[SET_RULE
12505      `(!z. z IN s ==> P z) <=> s SUBSET {x | P x}`] THEN
12506     REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN CONJ_TAC THEN
12507     MATCH_MP_TAC HULL_MINIMAL THEN
12508     REWRITE_TAC[CONVEX_HALFSPACE_LE; REWRITE_RULE[real_ge] CONVEX_HALFSPACE_GE;
12509                 SUBSET; FORALL_IN_INSERT; NOT_IN_EMPTY] THEN
12510     ASM_REWRITE_TAC[IN_ELIM_THM; REAL_LE_REFL]) in
12511   let lemma1 = prove
12512    (`!f s d k a b c.
12513           convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
12514           d dot a <= k /\ d dot b <= k /\ d dot c <= k /\
12515           f holomorphic_on {z | z IN s /\ d dot z < k} /\
12516           f holomorphic_on {z | z IN s /\ k < d dot z} /\
12517           f continuous_on s
12518           ==> path_integral (linepath (a,b)) f +
12519               path_integral (linepath (b,c)) f +
12520               path_integral (linepath (c,a)) f = Cx(&0)`,
12521     REPEAT STRIP_TAC THEN
12522     MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `b:complex`; `c:complex`]
12523           CAUCHY_THEOREM_TRIANGLE_INTERIOR) THEN
12524     ANTS_TAC THENL
12525      [CONJ_TAC THENL
12526        [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
12527         EXISTS_TAC `s:complex->bool` THEN
12528         ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
12529         MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
12530         EXISTS_TAC `{z:complex | z IN s /\ d dot z < k}` THEN
12531         ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SUBSET_TRANS THEN
12532         EXISTS_TAC `interior(s INTER {x:complex | d dot x <= k})` THEN
12533         CONJ_TAC THENL
12534          [MATCH_MP_TAC SUBSET_INTERIOR THEN MATCH_MP_TAC HULL_MINIMAL THEN
12535           ASM_SIMP_TAC[CONVEX_INTER; CONVEX_HALFSPACE_LE] THEN ASM SET_TAC[];
12536           ASM_SIMP_TAC[INTERIOR_INTER; INTERIOR_HALFSPACE_LE;
12537                        INTERIOR_OPEN] THEN
12538           SET_TAC[]]];
12539       REWRITE_TAC[HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL]]) in
12540   let lemma2 = prove
12541    (`!f s d k a b c.
12542           convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
12543           d dot a <= k /\ d dot b <= k /\
12544           f holomorphic_on {z | z IN s /\ d dot z < k} /\
12545           f holomorphic_on {z | z IN s /\ k < d dot z} /\
12546           f continuous_on s
12547           ==> path_integral (linepath (a,b)) f +
12548               path_integral (linepath (b,c)) f +
12549               path_integral (linepath (c,a)) f = Cx(&0)`,
12550     REPEAT STRIP_TAC THEN ASM_CASES_TAC `(d:complex) dot c <= k` THENL
12551      [MATCH_MP_TAC lemma1 THEN ASM_MESON_TAC[]; ALL_TAC] THEN
12552     RULE_ASSUM_TAC(REWRITE_RULE[REAL_NOT_LE]) THEN
12553     MP_TAC(ISPECL [`d:complex`; `b:complex`; `c:complex`; `k:real`]
12554           lemma0) THEN
12555     MP_TAC(ISPECL [`d:complex`; `a:complex`; `c:complex`; `k:real`]
12556           lemma0) THEN
12557     ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN
12558     DISCH_THEN(X_CHOOSE_THEN `a':complex` STRIP_ASSUME_TAC) THEN
12559     DISCH_THEN(X_CHOOSE_THEN `b':complex` STRIP_ASSUME_TAC) THEN
12560     SUBGOAL_THEN `(a':complex) IN s /\ b' IN s` STRIP_ASSUME_TAC THENL
12561      [ASM_MESON_TAC[CONVEX_CONTAINS_SEGMENT; SEGMENT_SYM; SUBSET];
12562       ALL_TAC] THEN
12563     MP_TAC(SPECL
12564      [`f:complex->complex`; `c:complex`; `a:complex`; `a':complex`]
12565           PATH_INTEGRAL_SPLIT_LINEPATH) THEN
12566     MP_TAC(SPECL
12567      [`f:complex->complex`; `b:complex`; `c:complex`; `b':complex`]
12568           PATH_INTEGRAL_SPLIT_LINEPATH) THEN
12569     ASM_REWRITE_TAC[] THEN REPEAT(ANTS_TAC THENL
12570      [ASM_MESON_TAC[CONVEX_CONTAINS_SEGMENT; SEGMENT_SYM;
12571                     CONTINUOUS_ON_SUBSET];
12572       ONCE_REWRITE_TAC[TAUT `p ==> q ==> r <=> q ==> p ==> r`]]) THEN
12573     MP_TAC(ISPECL [`f:complex->complex`; `linepath(a':complex,b')`]
12574           PATH_INTEGRAL_REVERSEPATH) THEN
12575     REWRITE_TAC[REVERSEPATH_LINEPATH; VALID_PATH_LINEPATH] THEN ANTS_TAC THENL
12576      [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
12577       ASM_MESON_TAC[CONVEX_CONTAINS_SEGMENT; CONTINUOUS_ON_SUBSET];
12578       ALL_TAC] THEN
12579     MP_TAC(ISPECL [`f:complex->complex`; `s INTER {x:complex | d dot x <= k}`;
12580                    `{}:complex->bool`;
12581                    `linepath(a:complex,b) ++ linepath(b,b') ++
12582                     linepath(b',a') ++ linepath(a',a)`]
12583           CAUCHY_THEOREM_CONVEX) THEN
12584     MP_TAC(ISPECL [`f:complex->complex`; `s INTER {x:complex | k <= d dot x}`;
12585                    `{}:complex->bool`;
12586                    `linepath(b':complex,c) ++ linepath(c,a') ++
12587                     linepath(a',b')`]
12588           CAUCHY_THEOREM_CONVEX) THEN
12589     MATCH_MP_TAC(TAUT
12590      `(q /\ q' ==> r) /\ (p /\ p') ==> (p ==> q) ==> (p' ==> q') ==> r`) THEN
12591     CONJ_TAC THENL
12592      [DISCH_THEN(CONJUNCTS_THEN
12593        (fun th -> MP_TAC(MATCH_MP PATH_INTEGRAL_UNIQUE th) THEN
12594                   MP_TAC(MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE th)));
12595       ASM_SIMP_TAC[DIFF_EMPTY; INTERIOR_INTER; INTERIOR_HALFSPACE_LE;
12596                    REWRITE_RULE[real_ge] INTERIOR_HALFSPACE_GE] THEN
12597       ASM_SIMP_TAC[CONVEX_INTER; CONVEX_HALFSPACE_LE; FINITE_EMPTY;
12598                    REWRITE_RULE[real_ge] CONVEX_HALFSPACE_GE]] THEN
12599     SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN_EQ;
12600              PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_JOIN;
12601              VALID_PATH_LINEPATH; PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
12602              PATH_INTEGRAL_JOIN]
12603     THENL [CONV_TAC COMPLEX_RING; ALL_TAC] THEN
12604     REWRITE_TAC[PATH_IMAGE_LINEPATH; UNION_SUBSET; SUBSET_INTER] THEN
12605     ASM_SIMP_TAC[fst(EQ_IMP_RULE(SPEC_ALL CONVEX_CONTAINS_SEGMENT_EQ));
12606                CONVEX_HALFSPACE_LE; REWRITE_RULE[real_ge] CONVEX_HALFSPACE_GE;
12607                  IN_ELIM_THM; REAL_LT_IMP_LE; REAL_LE_REFL] THEN
12608     ASM_SIMP_TAC[complex_differentiable; GSYM HOLOMORPHIC_ON_OPEN;
12609                  OPEN_INTER; INTERIOR_OPEN; OPEN_HALFSPACE_LT;
12610                  OPEN_HALFSPACE_GT] THEN
12611     RULE_ASSUM_TAC(REWRITE_RULE[SET_RULE
12612      `{x | x IN s /\ P x} = s INTER {x | P x}`]) THEN
12613     ASM_REWRITE_TAC[real_gt] THEN
12614     ASM_MESON_TAC[INTER_SUBSET; CONTINUOUS_ON_SUBSET]) in
12615   let lemma3 = prove
12616    (`!f s d k a b c.
12617           convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
12618           d dot a <= k /\
12619           f holomorphic_on {z | z IN s /\ d dot z < k} /\
12620           f holomorphic_on {z | z IN s /\ k < d dot z} /\
12621           f continuous_on s
12622           ==> path_integral (linepath (a,b)) f +
12623               path_integral (linepath (b,c)) f +
12624               path_integral (linepath (c,a)) f = Cx(&0)`,
12625     REPEAT STRIP_TAC THEN ASM_CASES_TAC `(d:complex) dot b <= k` THENL
12626      [MATCH_MP_TAC lemma2 THEN ASM_MESON_TAC[]; ALL_TAC] THEN
12627     ASM_CASES_TAC `(d:complex) dot c <= k` THENL
12628      [ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = c + a + b`] THEN
12629       MATCH_MP_TAC(GEN_ALL lemma2) THEN ASM_MESON_TAC[];
12630       ALL_TAC] THEN
12631     ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = b + c + a`] THEN
12632     MATCH_MP_TAC(GEN_ALL lemma2) THEN
12633     MAP_EVERY EXISTS_TAC
12634      [`s:complex->bool`; `--d:real^2`; `--k:real`] THEN
12635     ASM_REWRITE_TAC[DOT_LNEG; REAL_LE_NEG2; REAL_LT_NEG2; VECTOR_NEG_EQ_0] THEN
12636     ASM_REAL_ARITH_TAC) in
12637   let lemma4 = prove
12638    (`!f s d k a b c.
12639           convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
12640           f holomorphic_on {z | z IN s /\ d dot z < k} /\
12641           f holomorphic_on {z | z IN s /\ k < d dot z} /\
12642           f continuous_on s
12643           ==> path_integral (linepath (a,b)) f +
12644               path_integral (linepath (b,c)) f +
12645               path_integral (linepath (c,a)) f = Cx(&0)`,
12646     REPEAT STRIP_TAC THEN ASM_CASES_TAC `(d:complex) dot a <= k` THENL
12647      [MATCH_MP_TAC lemma3 THEN ASM_MESON_TAC[]; ALL_TAC] THEN
12648     MATCH_MP_TAC lemma3 THEN
12649     MAP_EVERY EXISTS_TAC
12650      [`s:complex->bool`; `--d:real^2`; `--k:real`] THEN
12651     ASM_REWRITE_TAC[DOT_LNEG; REAL_LE_NEG2; REAL_LT_NEG2; VECTOR_NEG_EQ_0] THEN
12652     ASM_REAL_ARITH_TAC) in
12653   REPEAT STRIP_TAC THEN MATCH_MP_TAC ANALYTIC_IMP_HOLOMORPHIC THEN
12654   MATCH_MP_TAC MORERA_LOCAL_TRIANGLE THEN
12655   X_GEN_TAC `p:complex` THEN DISCH_TAC THEN
12656   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12657   DISCH_THEN(MP_TAC o SPEC `p:complex`) THEN ASM_REWRITE_TAC[] THEN
12658   DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
12659   EXISTS_TAC `ball(p:complex,e)` THEN
12660   ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
12661   CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
12662   MAP_EVERY X_GEN_TAC [`u:complex`; `v:complex`; `w:complex`] THEN
12663   SIMP_TAC[SUBSET_HULL; CONVEX_BALL; INSERT_SUBSET; EMPTY_SUBSET] THEN
12664   STRIP_TAC THEN MATCH_MP_TAC lemma4 THEN
12665   MAP_EVERY EXISTS_TAC [`ball(p:complex,e)`; `a:complex`; `k:real`] THEN
12666   ASM_REWRITE_TAC[CONVEX_BALL; OPEN_BALL] THEN REPEAT CONJ_TAC THENL
12667    [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
12668     EXISTS_TAC `{z:complex | z IN s /\ a dot z < k}`;
12669     MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
12670     EXISTS_TAC `{z:complex | z IN s /\ k < a dot z}`;
12671     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
12672     EXISTS_TAC `s:complex->bool`] THEN
12673   ASM_REWRITE_TAC[] THEN ASM SET_TAC[]);;
12674
12675 let SCHWARZ_REFLECTION = prove
12676  (`!f s. open s /\ (!z. z IN s ==> cnj z IN s) /\
12677          f holomorphic_on {z | z IN s /\ &0 < Im z} /\
12678          f continuous_on {z | z IN s /\ &0 <= Im z} /\
12679          (!z. z IN s /\ real z ==> real(f z))
12680          ==> (\z. if &0 <= Im z then f(z) else cnj(f(cnj z)))
12681              holomorphic_on s`,
12682   REPEAT STRIP_TAC THEN
12683   MATCH_MP_TAC HOLOMORPHIC_ON_PASTE_ACROSS_LINE THEN
12684   MAP_EVERY EXISTS_TAC [`basis 2:complex`; `&0`] THEN
12685   ASM_SIMP_TAC[BASIS_NONZERO; DOT_BASIS; DIMINDEX_2; ARITH] THEN
12686   REWRITE_TAC[GSYM IM_DEF] THEN REPEAT CONJ_TAC THENL
12687    [UNDISCH_TAC `f holomorphic_on {z | z IN s /\ &0 < Im z}` THEN
12688     MATCH_MP_TAC EQ_IMP THEN MATCH_MP_TAC HOLOMORPHIC_EQ THEN
12689     SIMP_TAC[IN_ELIM_THM; REAL_LT_IMP_LE];
12690     SUBGOAL_THEN
12691      `(cnj o f o cnj) holomorphic_on {z | z IN s /\ Im z < &0}`
12692     MP_TAC THENL
12693      [ALL_TAC;
12694       MATCH_MP_TAC EQ_IMP THEN MATCH_MP_TAC HOLOMORPHIC_EQ THEN
12695       SIMP_TAC[IN_ELIM_THM; GSYM REAL_NOT_LE; o_THM]] THEN
12696     UNDISCH_TAC `f holomorphic_on {z | z IN s /\ &0 < Im z}` THEN
12697     REWRITE_TAC[holomorphic_on; IN_ELIM_THM] THEN DISCH_TAC THEN
12698     X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
12699     FIRST_X_ASSUM(MP_TAC o SPEC `cnj z`) THEN
12700     ASM_SIMP_TAC[IM_CNJ; REAL_ARITH `&0 < --x <=> x < &0`] THEN
12701     DISCH_THEN(X_CHOOSE_THEN `w:complex`
12702       (fun th -> EXISTS_TAC `cnj w` THEN MP_TAC th)) THEN
12703     REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN; LIM_WITHIN] THEN
12704     GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [GSYM FORALL_CNJ] THEN
12705     REWRITE_TAC[IN_ELIM_THM; dist; GSYM CNJ_SUB; o_THM] THEN
12706     GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [GSYM COMPLEX_NORM_CNJ] THEN
12707     REWRITE_TAC[CNJ_SUB; CNJ_DIV; CNJ_CNJ] THEN
12708     MATCH_MP_TAC MONO_FORALL THEN GEN_TAC THEN
12709     MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
12710     MATCH_MP_TAC MONO_EXISTS THEN REPEAT STRIP_TAC THEN
12711     ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
12712     ASM_SIMP_TAC[IM_CNJ] THEN ASM_REAL_ARITH_TAC;
12713     SUBGOAL_THEN
12714      `s = {z | z IN s /\ &0 <= Im z} UNION
12715           {z | z IN s /\ Im z <= &0}`
12716      (fun th -> SUBST1_TAC th THEN ASSUME_TAC(SYM th))
12717     THENL [SET_TAC[REAL_LE_TOTAL]; ALL_TAC] THEN
12718     MATCH_MP_TAC CONTINUOUS_ON_CASES_LOCAL THEN
12719     ASM_REWRITE_TAC[IN_ELIM_THM] THEN
12720     REWRITE_TAC[SET_RULE `{z | z IN s /\ P z} = s INTER {z | P z}`] THEN
12721     SIMP_TAC[CLOSED_IN_CLOSED_INTER; CLOSED_HALFSPACE_IM_LE;
12722              REWRITE_RULE[real_ge] CLOSED_HALFSPACE_IM_GE] THEN
12723     CONJ_TAC THENL
12724      [REPLICATE_TAC 2
12725        (MATCH_MP_TAC(REWRITE_RULE[o_DEF] CONTINUOUS_ON_COMPOSE) THEN
12726         REWRITE_TAC[CONTINUOUS_ON_CNJ]) THEN
12727       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
12728           CONTINUOUS_ON_SUBSET)) THEN
12729       ASM_SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM; IN_INTER; IM_CNJ] THEN
12730       REAL_ARITH_TAC;
12731       X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
12732       SUBGOAL_THEN `real z` ASSUME_TAC THENL
12733        [REWRITE_TAC[real] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
12734       RULE_ASSUM_TAC(REWRITE_RULE[REAL_CNJ]) THEN ASM_MESON_TAC[]]]);;
12735
12736 (* ------------------------------------------------------------------------- *)
12737 (* Bloch's theorem.                                                          *)
12738 (* ------------------------------------------------------------------------- *)
12739
12740 let BLOCH_LEMMA = prove
12741  (`!f a r.
12742     &0 < r /\ f holomorphic_on cball(a,r) /\
12743     (!z. z IN ball(a,r)
12744          ==> norm(complex_derivative f z) <= &2 * norm(complex_derivative f a))
12745     ==> ball(f(a),(&3 - &2 * sqrt(&2)) * r * norm(complex_derivative f a))
12746         SUBSET IMAGE f (ball(a,r))`,
12747   SUBGOAL_THEN
12748    `!f r.
12749         &0 < r /\ f holomorphic_on cball(Cx(&0),r) /\ f(Cx(&0)) = Cx(&0) /\
12750         (!z. z IN ball(Cx(&0),r)
12751              ==> norm(complex_derivative f z)
12752                  <= &2 * norm(complex_derivative f (Cx(&0))))
12753         ==> ball(Cx(&0),
12754                  (&3 - &2 * sqrt(&2)) *
12755                  r * norm(complex_derivative f (Cx(&0))))
12756             SUBSET IMAGE f (ball(Cx(&0),r))`
12757   ASSUME_TAC THENL
12758    [ALL_TAC;
12759     REPEAT STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
12760      [`\z. (f:complex->complex)(a + z) - f(a)`; `r:real`]) THEN
12761     ASM_REWRITE_TAC[COMPLEX_ADD_RID; COMPLEX_SUB_REFL] THEN
12762     SUBGOAL_THEN
12763      `!z. z IN ball(Cx(&0),r)
12764           ==> complex_derivative (\w. f (a + w) - f a) z =
12765               complex_derivative f (a + z)`
12766      (fun th -> ASM_SIMP_TAC[CENTRE_IN_BALL; COMPLEX_ADD_RID; th])
12767     THENL
12768      [REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
12769       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
12770       ONCE_REWRITE_TAC [COMPLEX_RING
12771        `complex_derivative f z =
12772         complex_derivative f z * (Cx(&0) + Cx(&1)) - Cx(&0)`] THEN
12773       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
12774       REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_CONST] THEN
12775       GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
12776       MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
12777       SIMP_TAC[HAS_COMPLEX_DERIVATIVE_ADD; HAS_COMPLEX_DERIVATIVE_CONST;
12778         HAS_COMPLEX_DERIVATIVE_ID; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
12779       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
12780       DISCH_THEN(MP_TAC o SPEC `a + z:complex`) THEN
12781       ASM_SIMP_TAC[IN_CBALL; NORM_ARITH `norm z < r ==> dist(a,a+z) <= r`] THEN
12782       REWRITE_TAC[GSYM complex_differentiable] THEN
12783       DISCH_THEN(MP_TAC o SPEC `ball(a:complex,r)` o
12784         MATCH_MP (REWRITE_RULE[IMP_CONJ]
12785         COMPLEX_DIFFERENTIABLE_WITHIN_SUBSET)) THEN
12786       ASM_REWRITE_TAC[BALL_SUBSET_CBALL] THEN MATCH_MP_TAC EQ_IMP THEN
12787       MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_WITHIN_OPEN THEN
12788       ASM_REWRITE_TAC[IN_BALL; OPEN_BALL; NORM_ARITH `dist(a,a + z) = norm z`];
12789       ANTS_TAC THENL
12790        [CONJ_TAC THENL
12791          [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
12792           REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
12793           GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
12794           MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
12795           EXISTS_TAC `cball(a:complex,r)` THEN
12796           ASM_SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_ID;
12797                        HOLOMORPHIC_ON_CONST; COMPLEX_IN_CBALL_0] THEN
12798           REWRITE_TAC[IN_CBALL] THEN NORM_ARITH_TAC;
12799           X_GEN_TAC `z:complex` THEN REWRITE_TAC[COMPLEX_IN_BALL_0] THEN
12800           STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
12801           ASM_REWRITE_TAC[IN_BALL; NORM_ARITH `dist(a,a + z) = norm z`]];
12802         REWRITE_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_IMAGE] THEN
12803         REWRITE_TAC[IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
12804         DISCH_THEN(fun th ->
12805          X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
12806          MP_TAC(SPEC `z - (f:complex->complex) a` th)) THEN
12807         ASM_REWRITE_TAC[COMPLEX_RING `z - a:complex = w - a <=> z = w`] THEN
12808         DISCH_THEN(X_CHOOSE_TAC `x:complex`) THEN
12809         EXISTS_TAC `a + x:complex` THEN
12810         ASM_REWRITE_TAC[COMPLEX_ADD_SUB]]]] THEN
12811   REPEAT GEN_TAC THEN
12812   SUBGOAL_THEN `&0 < &3 - &2 * sqrt(&2)` ASSUME_TAC THENL
12813    [REWRITE_TAC[REAL_ARITH `&0 < a - &2 * b <=> b < a / &2`] THEN
12814     MATCH_MP_TAC REAL_LT_LSQRT THEN REAL_ARITH_TAC;
12815     ALL_TAC] THEN
12816   ASM_CASES_TAC `&0 < r` THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
12817   ASM_CASES_TAC `complex_derivative f (Cx(&0)) = Cx(&0)` THEN
12818   ASM_SIMP_TAC[COMPLEX_NORM_0; REAL_MUL_RZERO; BALL_TRIVIAL; EMPTY_SUBSET] THEN
12819   ABBREV_TAC `C = &2 * norm(complex_derivative f (Cx(&0)))` THEN
12820   SUBGOAL_THEN `&0 < C` ASSUME_TAC THENL
12821    [ASM_MESON_TAC[COMPLEX_NORM_NZ; REAL_ARITH `&0 < &2 * x <=> &0 < x`];
12822     ALL_TAC] THEN
12823   SUBGOAL_THEN
12824    `!z. z IN ball(Cx(&0),r)
12825         ==> norm(complex_derivative f z - complex_derivative f (Cx(&0)))
12826             <= norm(z) / (r - norm(z)) * C`
12827   (LABEL_TAC "+") THENL
12828    [REPEAT STRIP_TAC THEN
12829     SUBGOAL_THEN
12830      `!R. norm z < R /\ R < r
12831           ==> norm(complex_derivative f z - complex_derivative f (Cx(&0)))
12832               <= norm(z) / (R - norm(z)) * C`
12833     MP_TAC THENL
12834      [REPEAT STRIP_TAC THEN
12835       MP_TAC(ISPECL
12836        [`complex_derivative f`;
12837         `cball(Cx(&0),R)`;
12838         `circlepath(Cx(&0),R)`]
12839         CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE) THEN
12840       REWRITE_TAC[CONVEX_CBALL; VALID_PATH_CIRCLEPATH; INTERIOR_CBALL;
12841                   PATHSTART_CIRCLEPATH; PATHFINISH_CIRCLEPATH] THEN
12842       SUBGOAL_THEN `&0 < R` ASSUME_TAC THENL
12843        [ASM_MESON_TAC[REAL_LET_TRANS; NORM_POS_LE]; ALL_TAC] THEN
12844       ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
12845       REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
12846       REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_CBALL; IN_BALL; IN_DELETE] THEN
12847       SIMP_TAC[WINDING_NUMBER_CIRCLEPATH; COMPLEX_SUB_RZERO; COMPLEX_SUB_LZERO;
12848                dist; NORM_NEG;  REAL_LE_REFL; MESON[REAL_LT_REFL]
12849           `norm z < R /\ (!w. norm w = R ==> ~(w = z)) <=> norm z < R`] THEN
12850       REWRITE_TAC[RIGHT_FORALL_IMP_THM; IMP_CONJ] THEN ANTS_TAC THENL
12851        [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
12852         EXISTS_TAC `ball(Cx(&0),r)` THEN CONJ_TAC THENL
12853          [MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
12854           REWRITE_TAC[OPEN_BALL] THEN
12855           MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
12856           EXISTS_TAC `cball(Cx(&0),r)` THEN ASM_REWRITE_TAC[BALL_SUBSET_CBALL];
12857           ASM_REWRITE_TAC[SUBSET_BALLS; DIST_REFL; REAL_ADD_LID]];
12858         REWRITE_TAC[COMPLEX_MUL_LID]] THEN
12859       DISCH_THEN(fun th ->
12860         MP_TAC (CONJ (SPEC `z:complex` th) (SPEC `Cx(&0)` th))) THEN
12861       ASM_REWRITE_TAC[COMPLEX_NORM_0; COMPLEX_SUB_RZERO] THEN
12862       DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
12863       DISCH_THEN(MP_TAC o SPEC `C * norm(z) / (R * (R - norm(z:complex)))` o
12864         MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
12865           HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH)) THEN
12866       ASM_REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB] THEN
12867       REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
12868       REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_LID; REAL_ABS_PI] THEN
12869       ASM_SIMP_TAC[REAL_FIELD
12870        `&0 < R /\ z < R
12871         ==> (C * z / (R * (R - z))) * &2 * pi * R =
12872             &2 * pi * z / (R - z) * C`] THEN
12873       ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH `&0 < &2`; PI_POS] THEN
12874       DISCH_THEN MATCH_MP_TAC THEN
12875       ASM_SIMP_TAC[REAL_LE_MUL_EQ; REAL_LE_DIV; REAL_LE_MUL; REAL_SUB_LE;
12876                    REAL_LT_IMP_LE; NORM_POS_LE; COMPLEX_SUB_RZERO] THEN
12877       X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
12878       SUBGOAL_THEN `~(x = Cx(&0)) /\ ~(x = z)` STRIP_ASSUME_TAC THENL
12879        [ASM_MESON_TAC[REAL_LT_REFL; COMPLEX_NORM_0]; ALL_TAC] THEN
12880       ASM_SIMP_TAC[COMPLEX_FIELD
12881        `~(x = Cx(&0)) /\ ~(x = z)
12882         ==> d / (x - z) - d / x = d * z / (x * (x - z))`] THEN
12883       REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
12884       ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE; IN_BALL; dist; NORM_NEG;
12885                    COMPLEX_SUB_LZERO] THEN
12886       REWRITE_TAC[COMPLEX_NORM_DIV; real_div] THEN
12887       MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
12888       MATCH_MP_TAC REAL_LE_INV2 THEN
12889       ASM_SIMP_TAC[REAL_LT_MUL; REAL_SUB_LT; COMPLEX_NORM_MUL] THEN
12890       ASM_SIMP_TAC[REAL_LE_LMUL_EQ] THEN
12891       UNDISCH_TAC `norm(x:complex) = R` THEN CONV_TAC NORM_ARITH;
12892       DISCH_TAC THEN MP_TAC(ISPECL
12893        [`\x. lift(norm(z:complex) / (drop x - norm z) * C)`;
12894         `interval(lift((norm(z:complex) + r) / &2),lift r)`; `lift r`;
12895         `norm(complex_derivative f z - complex_derivative f (Cx (&0)))`;
12896         `1`] CONTINUOUS_ON_CLOSURE_COMPONENT_GE) THEN
12897       REWRITE_TAC[GSYM drop; LIFT_DROP; CLOSURE_INTERVAL] THEN
12898       DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[INTERVAL_EQ_EMPTY_1] THEN
12899       FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
12900       REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN DISCH_TAC THEN
12901       ASM_SIMP_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; LIFT_DROP; REAL_ARITH
12902         `z < r ==> ~(r <= (z + r) / &2) /\ ~(r < (z + r) / &2)`] THEN
12903       REWRITE_TAC[FORALL_LIFT; LIFT_DROP; IN_INTERVAL_1] THEN
12904       CONJ_TAC THENL
12905        [ALL_TAC;
12906         ASM_MESON_TAC[REAL_ARITH `(z + r) / &2 < R /\ R < r ==> z < R`]] THEN
12907       REWRITE_TAC[LIFT_CMUL; real_div] THEN
12908       MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
12909       REWRITE_TAC[CONTINUOUS_ON_CONST; o_DEF; LIFT_CMUL] THEN
12910       MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
12911       REWRITE_TAC[CONTINUOUS_ON_CONST; o_DEF; LIFT_CMUL] THEN
12912       MATCH_MP_TAC(REWRITE_RULE[o_DEF] CONTINUOUS_ON_INV) THEN
12913       SIMP_TAC[LIFT_SUB; CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; LIFT_DROP;
12914                CONTINUOUS_ON_LIFT_NORM_COMPOSE; CONTINUOUS_ON_ID] THEN
12915       REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; LIFT_DROP] THEN
12916       ASM_REAL_ARITH_TAC];
12917     ALL_TAC] THEN
12918   SUBGOAL_THEN
12919    `!z.  z IN ball(Cx(&0),r)
12920          ==> (norm(z) - norm(z) pow 2 / (r - norm(z))) *
12921              norm(complex_derivative f (Cx(&0)))
12922              <= norm(f z)`
12923   (LABEL_TAC "*") THENL
12924    [REPEAT STRIP_TAC THEN
12925     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
12926     REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN DISCH_TAC THEN
12927     MP_TAC(ISPECL[`\z. f(z) - complex_derivative f (Cx(&0)) * z`;
12928                   `\z. complex_derivative f z - complex_derivative f (Cx(&0))`;
12929                   `linepath(Cx(&0),z)`; `ball(Cx(&0),r)`]
12930         PATH_INTEGRAL_PRIMITIVE) THEN
12931     REWRITE_TAC[PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN ANTS_TAC THENL
12932      [REWRITE_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
12933       ONCE_REWRITE_TAC[COMPLEX_RING
12934        `a - complex_derivative f b = a - complex_derivative f b * Cx(&1)`] THEN
12935       CONJ_TAC THENL
12936        [X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
12937         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
12938         SIMP_TAC[HAS_COMPLEX_DERIVATIVE_LMUL_WITHIN;
12939                  HAS_COMPLEX_DERIVATIVE_ID] THEN
12940         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
12941         REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
12942         FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
12943         DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
12944         ASM_SIMP_TAC[REWRITE_RULE[SUBSET] BALL_SUBSET_CBALL] THEN
12945         REWRITE_TAC[GSYM complex_differentiable] THEN
12946         DISCH_THEN(MP_TAC o SPEC `ball(Cx(&0),r)` o
12947           MATCH_MP (REWRITE_RULE[IMP_CONJ]
12948           COMPLEX_DIFFERENTIABLE_WITHIN_SUBSET)) THEN
12949         ASM_SIMP_TAC[COMPLEX_DIFFERENTIABLE_WITHIN_OPEN; OPEN_BALL] THEN
12950         REWRITE_TAC[BALL_SUBSET_CBALL];
12951         MATCH_MP_TAC(REWRITE_RULE[CONVEX_CONTAINS_SEGMENT] CONVEX_BALL) THEN
12952         ASM_REWRITE_TAC[CENTRE_IN_BALL]];
12953       ALL_TAC] THEN
12954     SIMP_TAC[HAS_INTEGRAL_INTEGRABLE_INTEGRAL; HAS_PATH_INTEGRAL_LINEPATH] THEN
12955     REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_MUL_RZERO] THEN
12956     REWRITE_TAC[linepath; COMPLEX_CMUL; COMPLEX_MUL_RZERO; LIFT_DROP] THEN
12957     REWRITE_TAC[COMPLEX_ADD_LID; FORALL_LIFT; IN_INTERVAL_1; LIFT_DROP] THEN
12958     STRIP_TAC THEN FIRST_ASSUM(MP_TAC o
12959      SPEC `\t. lift(norm(z:complex) pow 2 * drop t / (r - norm(z)) * C)` o
12960       MATCH_MP (REWRITE_RULE[IMP_CONJ] INTEGRAL_NORM_BOUND_INTEGRAL)) THEN
12961     REWRITE_TAC[linepath; COMPLEX_CMUL; COMPLEX_MUL_RZERO; LIFT_DROP] THEN
12962     REWRITE_TAC[COMPLEX_ADD_LID; FORALL_LIFT; IN_INTERVAL_1; LIFT_DROP] THEN
12963     REWRITE_TAC[REAL_ARITH `a * b / c * d:real = (a / c * d) * b`] THEN
12964     REWRITE_TAC[LIFT_CMUL; LIFT_DROP; DROP_VEC] THEN
12965     MP_TAC(ISPECL
12966      [`\x. inv(&2) * x pow 2`; `\x:real. x`; `&0`; `&1`]
12967         REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN
12968     REWRITE_TAC[REAL_POS] THEN ANTS_TAC THENL
12969      [REPEAT STRIP_TAC THEN REAL_DIFF_TAC THEN CONV_TAC NUM_REDUCE_CONV THEN
12970       REAL_ARITH_TAC;
12971       REWRITE_TAC[has_real_integral; o_DEF; IMAGE_LIFT_REAL_INTERVAL] THEN
12972       CONV_TAC REAL_RAT_REDUCE_CONV THEN REWRITE_TAC[LIFT_DROP; LIFT_NUM] THEN
12973       DISCH_THEN(MP_TAC o SPEC `norm(z:complex) pow 2 / (r - norm z) * C` o
12974         MATCH_MP HAS_INTEGRAL_CMUL) THEN
12975       REWRITE_TAC[HAS_INTEGRAL_INTEGRABLE_INTEGRAL] THEN
12976       STRIP_TAC THEN ASM_REWRITE_TAC[]] THEN
12977     ANTS_TAC THENL
12978      [X_GEN_TAC `t:real` THEN STRIP_TAC THEN
12979       REWRITE_TAC[REAL_ARITH
12980         `(z pow 2 / y * c) * t:real = (z / y * t * c) * z`] THEN
12981       REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
12982       REWRITE_TAC[NORM_POS_LE] THEN
12983       REMOVE_THEN "+" (MP_TAC o SPEC `Cx(t) * z`) THEN
12984       REWRITE_TAC[IN_BALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
12985       SUBGOAL_THEN `norm(Cx t * z) <= norm z` ASSUME_TAC THENL
12986        [GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
12987         REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
12988         REWRITE_TAC[NORM_POS_LE; COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
12989         ALL_TAC] THEN
12990       ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
12991       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
12992       ASM_SIMP_TAC[REAL_LE_RMUL_EQ; REAL_MUL_ASSOC; real_div] THEN
12993       ASM_REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; real_abs] THEN
12994       GEN_REWRITE_TAC LAND_CONV
12995        [REAL_ARITH `(t * z) * w:real = (z * w) * t`] THEN
12996       MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN
12997       MATCH_MP_TAC REAL_LE_MUL2 THEN
12998       REWRITE_TAC[NORM_POS_LE; REAL_LE_INV_EQ; REAL_SUB_LE] THEN
12999       REWRITE_TAC[REAL_LE_REFL] THEN CONJ_TAC THENL
13000        [ALL_TAC; MATCH_MP_TAC REAL_LE_INV2] THEN
13001       ASM_REWRITE_TAC[REAL_SUB_LT] THEN FIRST_X_ASSUM(MP_TAC o
13002         GEN_REWRITE_RULE LAND_CONV [COMPLEX_NORM_MUL]) THEN
13003       REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
13004       REWRITE_TAC[COMPLEX_SUB_RZERO]] THEN
13005     MATCH_MP_TAC(NORM_ARITH
13006      `abc <= norm d - e ==> norm(f - d) <= e ==> abc <= norm f`) THEN
13007     REWRITE_TAC[REAL_SUB_RDISTRIB;
13008                 ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] COMPLEX_NORM_MUL] THEN
13009     MATCH_MP_TAC(REAL_ARITH `y <= x ==> a - x <= a - y`) THEN
13010     REWRITE_TAC[DROP_CMUL; GSYM REAL_MUL_ASSOC; LIFT_DROP] THEN
13011     MATCH_MP_TAC REAL_LE_LMUL THEN
13012     ASM_SIMP_TAC[REAL_LE_DIV; REAL_SUB_LE; REAL_LT_IMP_LE; REAL_LE_POW_2] THEN
13013     EXPAND_TAC "C" THEN REAL_ARITH_TAC;
13014     ALL_TAC] THEN
13015   MATCH_MP_TAC SUBSET_TRANS THEN
13016   EXISTS_TAC `IMAGE (f:complex->complex)
13017                     (ball(Cx(&0),(&1 - sqrt(&2) / &2) * r))` THEN
13018   SUBGOAL_THEN `&0 < &1 - sqrt(&2) / &2 /\  &1 - sqrt(&2) / &2 < &1`
13019   STRIP_ASSUME_TAC THENL
13020    [REWRITE_TAC[REAL_ARITH
13021      `&0 < &1 - s / &2 /\  &1 - s / &2 < &1 <=> &0 < s /\ s < &2`] THEN
13022     CONJ_TAC THENL
13023      [MATCH_MP_TAC REAL_LT_RSQRT; MATCH_MP_TAC REAL_LT_LSQRT] THEN
13024     REAL_ARITH_TAC;
13025     ALL_TAC] THEN
13026   CONJ_TAC THENL
13027    [ALL_TAC;
13028     MATCH_MP_TAC IMAGE_SUBSET THEN MATCH_MP_TAC SUBSET_BALL THEN
13029     REWRITE_TAC[REAL_ARITH `x * r <= r <=> &0 <= r * (&1 - x)`] THEN
13030     MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC] THEN
13031   FIRST_ASSUM(fun th ->
13032     GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o LAND_CONV) [SYM th]) THEN
13033   MATCH_MP_TAC BALL_SUBSET_OPEN_MAP_IMAGE THEN
13034   ASM_SIMP_TAC[REAL_LT_MUL; BOUNDED_BALL; CLOSURE_BALL; CENTRE_IN_BALL] THEN
13035   REPEAT CONJ_TAC THENL
13036    [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
13037     EXISTS_TAC `cball(Cx(&0),r)` THEN
13038     ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
13039     MATCH_MP_TAC SUBSET_CBALL THEN
13040     REWRITE_TAC[REAL_ARITH `x * r <= r <=> &0 <= r * (&1 - x)`] THEN
13041     MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC;
13042     MATCH_MP_TAC(REWRITE_RULE[RIGHT_IMP_FORALL_THM; IMP_IMP]
13043         OPEN_MAPPING_THM) THEN
13044     EXISTS_TAC `ball(Cx(&0),r)` THEN
13045     ASM_SIMP_TAC[OPEN_BALL; CONNECTED_BALL; INTERIOR_OPEN; SUBSET_REFL] THEN
13046     REPEAT CONJ_TAC THENL
13047      [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; BALL_SUBSET_CBALL];
13048       ALL_TAC;
13049       MATCH_MP_TAC SUBSET_BALL THEN
13050       REWRITE_TAC[REAL_ARITH `x * r <= r <=> &0 <= r * (&1 - x)`] THEN
13051       MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC] THEN
13052     DISCH_THEN(X_CHOOSE_TAC `y:complex`) THEN
13053     MP_TAC(ISPECL
13054      [`f:complex->complex`; `(\x. y):complex->complex`;
13055       `ball(Cx(&0),r)`; `Cx(&0)`]
13056      COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN) THEN
13057     ASM_REWRITE_TAC[OPEN_BALL; HOLOMORPHIC_ON_CONST; COMPLEX_DERIVATIVE_CONST;
13058                     CENTRE_IN_BALL] THEN
13059     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; BALL_SUBSET_CBALL];
13060     REPEAT(MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC) THEN
13061     ASM_REWRITE_TAC[REAL_ARITH `&0 < &3 - &2 * s <=> s < &3 / &2`] THEN
13062     ASM_REAL_ARITH_TAC;
13063     ALL_TAC] THEN
13064   ASM_SIMP_TAC[FRONTIER_BALL; sphere; REAL_LT_MUL; dist; IN_ELIM_THM] THEN
13065   X_GEN_TAC `z:complex` THEN REWRITE_TAC[COMPLEX_SUB_LZERO; NORM_NEG] THEN
13066   DISCH_TAC THEN REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
13067   ASM_REWRITE_TAC[IN_BALL; dist; COMPLEX_SUB_LZERO; COMPLEX_SUB_RZERO] THEN
13068   ASM_REWRITE_TAC[NORM_NEG] THEN ANTS_TAC THENL
13069    [REWRITE_TAC[REAL_ARITH `x * r < r <=> &0 < r * (&1 - x)`] THEN
13070     MATCH_MP_TAC REAL_LT_MUL THEN ASM_REAL_ARITH_TAC;
13071     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LE_TRANS)] THEN
13072   REWRITE_TAC[REAL_MUL_ASSOC] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
13073   REWRITE_TAC[NORM_POS_LE; REAL_ARITH `r - (&1 - s) * r = s * r`] THEN
13074   REWRITE_TAC[real_div; REAL_INV_MUL; REAL_INV_INV] THEN
13075   ASM_SIMP_TAC[REAL_LE_RMUL_EQ; REAL_FIELD
13076    `&0 < r
13077     ==> a * r - (b * r) pow 2 * x * inv r =  (a - b pow 2 * x) * r`] THEN
13078   MATCH_MP_TAC REAL_EQ_IMP_LE THEN
13079   MP_TAC(SPEC `&2` SQRT_WORKS) THEN CONV_TAC REAL_FIELD);;
13080
13081 let BLOCH_UNIT = prove
13082  (`!f a. f holomorphic_on ball(a,&1) /\
13083        complex_derivative f a = Cx(&1)
13084        ==> ?b r. &1 / &12 < r /\ ball(b,r) SUBSET IMAGE f (ball(a,&1))`,
13085   REPEAT STRIP_TAC THEN ABBREV_TAC `r = &249 / &256` THEN
13086   SUBGOAL_THEN `&0 < r` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13087   ABBREV_TAC `g = \z. complex_derivative f z * Cx(r - norm(z - a))` THEN
13088   MP_TAC(ISPECL [`IMAGE (g:complex->complex) (cball(a,r))`; `Cx(&0)`]
13089         DISTANCE_ATTAINS_SUP) THEN
13090   ANTS_TAC THENL
13091    [ASM_REWRITE_TAC[IMAGE_EQ_EMPTY; CBALL_EQ_EMPTY] THEN
13092     CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
13093     MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN REWRITE_TAC[COMPACT_CBALL] THEN
13094     MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `ball(a:complex,&1)` THEN
13095     REWRITE_TAC[SUBSET_BALLS; DIST_REFL] THEN
13096     CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN EXPAND_TAC "g" THEN
13097     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC THENL
13098      [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
13099       ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; ETA_AX; OPEN_BALL];
13100       REWRITE_TAC[CONTINUOUS_ON_CX_LIFT; LIFT_SUB] THEN
13101       MATCH_MP_TAC CONTINUOUS_ON_SUB THEN REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
13102       MATCH_MP_TAC CONTINUOUS_ON_LIFT_NORM_COMPOSE THEN
13103       SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_ID; CONTINUOUS_ON_CONST]];
13104     REWRITE_TAC[EXISTS_IN_IMAGE; FORALL_IN_IMAGE; IN_CBALL] THEN
13105     REWRITE_TAC[NORM_ARITH `dist(a,b) = norm(b - a)`] THEN
13106     REWRITE_TAC[COMPLEX_SUB_RZERO] THEN
13107     DISCH_THEN(X_CHOOSE_THEN `p:complex` STRIP_ASSUME_TAC)] THEN
13108   SUBGOAL_THEN `norm(p - a:complex) < r` ASSUME_TAC THENL
13109    [ASM_REWRITE_TAC[REAL_LT_LE] THEN DISCH_TAC THEN
13110     FIRST_X_ASSUM(MP_TAC o SPEC `a:complex`) THEN
13111     ASM_SIMP_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; REAL_LT_IMP_LE] THEN
13112     EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
13113     ASM_REWRITE_TAC[REAL_SUB_REFL; COMPLEX_SUB_RZERO; COMPLEX_NORM_CX] THEN
13114     REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0] THEN ASM_REAL_ARITH_TAC;
13115     ALL_TAC] THEN
13116   ABBREV_TAC `t = (r - norm(p - a:complex)) / &2` THEN
13117   SUBGOAL_THEN `&0 < t` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13118   EXISTS_TAC `(f:complex->complex) p` THEN
13119   EXISTS_TAC `(&3 - &2 * sqrt (&2)) * t * norm (complex_derivative f p)` THEN
13120   MP_TAC(ISPECL [`f:complex->complex`; `p:complex`; `t:real`]
13121         BLOCH_LEMMA) THEN
13122   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
13123    [CONJ_TAC THENL
13124      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13125         HOLOMORPHIC_ON_SUBSET)) THEN
13126       REWRITE_TAC[SUBSET_BALLS; dist; COMPLEX_SUB_RZERO] THEN
13127       ASM_REAL_ARITH_TAC;
13128       X_GEN_TAC `z:complex` THEN REWRITE_TAC[IN_BALL] THEN DISCH_TAC THEN
13129       SUBGOAL_THEN `norm(z - a:complex) < r` ASSUME_TAC THENL
13130        [REPEAT(POP_ASSUM MP_TAC) THEN NORM_ARITH_TAC; ALL_TAC] THEN
13131       FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
13132       ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN EXPAND_TAC "g" THEN
13133       REWRITE_TAC[COMPLEX_NORM_MUL] THEN
13134       ASM_SIMP_TAC[COMPLEX_NORM_CX; GSYM REAL_LE_RDIV_EQ;
13135                    REAL_ARITH `z < r ==> &0 < abs(r - z)`] THEN
13136       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
13137       GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
13138       REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
13139       MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
13140       ASM_SIMP_TAC[GSYM real_div; REAL_LE_LDIV_EQ; REAL_ARITH
13141        `z < r ==> &0 < abs(r - z)`] THEN
13142       REPEAT(POP_ASSUM MP_TAC) THEN NORM_ARITH_TAC];
13143     DISCH_TAC THEN CONJ_TAC THENL
13144      [FIRST_X_ASSUM(MP_TAC o SPEC `a:complex`) THEN
13145       ASM_SIMP_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; REAL_LT_IMP_LE] THEN
13146       EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
13147       ASM_REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_MUL_LID] THEN
13148       ASM_SIMP_TAC[REAL_SUB_RZERO; real_abs; REAL_SUB_LE; REAL_LT_IMP_LE;
13149                    COMPLEX_SUB_REFL; COMPLEX_NORM_0] THEN
13150       EXPAND_TAC "t" THEN
13151       REWRITE_TAC[REAL_ARITH
13152        `a < b * c / &2 * d <=> a < (d * c) * (b / &2)`] THEN
13153       SUBGOAL_THEN `sqrt (&2) < &2113 / &1494` ASSUME_TAC THENL
13154        [MATCH_MP_TAC REAL_LT_LSQRT THEN CONV_TAC REAL_RAT_REDUCE_CONV;
13155         ALL_TAC] THEN
13156       SUBGOAL_THEN `&0 < &3 - &2 * sqrt(&2)` ASSUME_TAC THENL
13157        [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13158       ASM_SIMP_TAC[GSYM REAL_LT_LDIV_EQ; REAL_HALF] THEN
13159       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LTE_TRANS) THEN
13160       ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_HALF] THEN
13161       EXPAND_TAC "r" THEN ASM_REAL_ARITH_TAC;
13162       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13163         SUBSET_TRANS)) THEN
13164       MATCH_MP_TAC IMAGE_SUBSET THEN
13165       REWRITE_TAC[SUBSET_BALLS; dist; COMPLEX_SUB_RZERO] THEN
13166       REPEAT(POP_ASSUM MP_TAC) THEN NORM_ARITH_TAC]]);;
13167
13168 let BLOCH = prove
13169  (`!f a r r'.
13170       &0 < r /\ f holomorphic_on ball(a,r) /\
13171       r' <= r * norm(complex_derivative f a) / &12
13172       ==> ?b. ball(b,r') SUBSET IMAGE f (ball(a,r))`,
13173   REPEAT GEN_TAC THEN
13174   ASM_CASES_TAC `complex_derivative f a = Cx(&0)` THENL
13175    [ASM_SIMP_TAC[COMPLEX_NORM_0; real_div; REAL_MUL_RZERO; REAL_MUL_LZERO;
13176                  BALL_EMPTY; EMPTY_SUBSET];
13177     ALL_TAC] THEN
13178   ABBREV_TAC `C = complex_derivative f a` THEN
13179   SUBGOAL_THEN `&0 < norm(C:complex)` ASSUME_TAC THENL
13180    [ASM_MESON_TAC[COMPLEX_NORM_NZ]; STRIP_TAC] THEN
13181   MP_TAC(ISPECL
13182    [`\z. (f:complex->complex)(a + Cx r * z) / (C * Cx r)`; `Cx(&0)`]
13183    BLOCH_UNIT) THEN
13184   SUBGOAL_THEN
13185    `!z. z IN ball(Cx(&0),&1)
13186         ==> ((\z. f (a + Cx r * z) / (C * Cx r)) has_complex_derivative
13187              (complex_derivative f (a + Cx r * z) / C)) (at z)`
13188   ASSUME_TAC THENL
13189    [REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
13190     SUBGOAL_THEN
13191      `complex_derivative f (a + Cx r * z) / C =
13192       (complex_derivative f (a + Cx r * z) * Cx r) / (C * Cx r)`
13193     SUBST1_TAC THENL
13194      [ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ; COMPLEX_FIELD
13195         `~(r = Cx(&0)) /\ ~(c = Cx(&0)) ==> (d * r) / (c * r) = d / c`];
13196       ALL_TAC] THEN
13197     MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_CDIV_AT THEN
13198     GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
13199     MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN CONJ_TAC THENL
13200      [COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING; ALL_TAC] THEN
13201     REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
13202     FIRST_ASSUM(MATCH_MP_TAC o
13203      MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
13204        HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT)) THEN
13205     REWRITE_TAC[OPEN_BALL; IN_BALL; NORM_ARITH `dist(a,a + b) = norm b`] THEN
13206     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
13207     ASM_SIMP_TAC[REAL_ARITH `&0 < r ==> (abs r * z < r <=> &0 < r * (&1 - z))`;
13208                  REAL_LT_MUL; REAL_SUB_LT];
13209     ALL_TAC] THEN
13210   ANTS_TAC THENL
13211    [SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
13212     CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
13213     FIRST_X_ASSUM(MP_TAC o SPEC `Cx(&0)`) THEN
13214     ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_LT_01] THEN
13215     DISCH_THEN(SUBST1_TAC o MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
13216     ASM_SIMP_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_RID; COMPLEX_DIV_REFL];
13217     ALL_TAC] THEN
13218   REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
13219   MAP_EVERY X_GEN_TAC [`b:complex`; `t:real`] THEN STRIP_TAC THEN
13220   EXISTS_TAC `(C * Cx r) * b` THEN
13221   FIRST_ASSUM(MP_TAC o ISPEC `\z. (C * Cx r) * z` o MATCH_MP IMAGE_SUBSET) THEN
13222   REWRITE_TAC[GSYM IMAGE_o; o_DEF] THEN
13223   ASM_SIMP_TAC[COMPLEX_DIV_LMUL; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
13224   GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o LAND_CONV) [GSYM o_DEF] THEN
13225   REWRITE_TAC[IMAGE_o] THEN MATCH_MP_TAC(SET_RULE
13226    `v SUBSET s /\ t SUBSET w
13227     ==> s SUBSET IMAGE f t ==> v SUBSET IMAGE f w`) THEN
13228   CONJ_TAC THENL
13229    [REWRITE_TAC[SUBSET; IN_IMAGE; IN_BALL; dist] THEN
13230     X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
13231     EXISTS_TAC `x / (C * Cx r)` THEN
13232     ASM_SIMP_TAC[COMPLEX_DIV_LMUL; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
13233     MATCH_MP_TAC REAL_LT_LCANCEL_IMP THEN EXISTS_TAC `norm(C * Cx r)` THEN
13234     ASM_SIMP_TAC[COMPLEX_NORM_NZ; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
13235     REWRITE_TAC[GSYM COMPLEX_NORM_MUL; COMPLEX_SUB_LDISTRIB] THEN
13236     ASM_SIMP_TAC[COMPLEX_DIV_LMUL; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
13237     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13238       REAL_LTE_TRANS)) THEN
13239     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13240       REAL_LE_TRANS)) THEN
13241     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
13242     ASM_SIMP_TAC[REAL_ARITH `&0 < r ==> a * abs r = r * a`] THEN
13243     ASM_REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
13244     ASM_SIMP_TAC[REAL_LE_LMUL_EQ; COMPLEX_NORM_NZ] THEN ASM_REAL_ARITH_TAC;
13245     REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0] THEN
13246     REWRITE_TAC[OPEN_BALL; IN_BALL; NORM_ARITH `dist(a,a + b) = norm b`] THEN
13247     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
13248     ASM_SIMP_TAC[REAL_ARITH `&0 < r ==> (abs r * z < r <=> &0 < r * (&1 - z))`;
13249                  REAL_LT_MUL; REAL_SUB_LT]]);;
13250
13251 let BLOCH_COROLLARY = prove
13252  (`!f s a t r.
13253       f holomorphic_on s /\ a IN s /\
13254       (!z. z IN frontier s ==> t <= dist(a,z)) /\
13255       r <= t * norm(complex_derivative f a) / &12
13256       ==> ?b. ball(b,r) SUBSET IMAGE f s`,
13257   REPEAT STRIP_TAC THEN FIRST_ASSUM(DISJ_CASES_THEN MP_TAC o
13258     MATCH_MP (REAL_ARITH `r <= t ==> r <= &0 \/ &0 < t`)) THEN
13259   SIMP_TAC[BALL_EMPTY; EMPTY_SUBSET] THEN
13260   ASM_CASES_TAC `complex_derivative f a = Cx(&0)` THEN
13261   ASM_REWRITE_TAC[COMPLEX_NORM_0] THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13262   ASM_SIMP_TAC[REAL_LT_MUL_EQ; REAL_ARITH `&0 < x / &12 <=> &0 < x`;
13263                COMPLEX_NORM_NZ] THEN
13264   DISCH_TAC THEN
13265   SUBGOAL_THEN `ball(a:complex,t) SUBSET s` ASSUME_TAC THENL
13266    [MP_TAC(ISPECL [`ball(a:complex,t)`; `s:complex->bool`]
13267           CONNECTED_INTER_FRONTIER) THEN
13268     REWRITE_TAC[CONNECTED_BALL; SET_RULE `s DIFF t = {} <=> s SUBSET t`] THEN
13269     MATCH_MP_TAC(TAUT `~p /\ r ==> (~p /\ ~q ==> ~r) ==> q`) THEN
13270     CONJ_TAC THENL
13271      [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `a:complex` THEN
13272
13273       ASM_REWRITE_TAC[IN_INTER; CENTRE_IN_BALL];
13274       REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_BALL] THEN
13275       ASM_MESON_TAC[REAL_NOT_LE]];
13276     ALL_TAC] THEN
13277   MP_TAC(ISPECL
13278    [`f:complex->complex`; `a:complex`; `t:real`; `r:real`] BLOCH) THEN
13279   ASM_REWRITE_TAC[] THEN
13280   ANTS_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
13281   MATCH_MP_TAC MONO_EXISTS THEN ASM SET_TAC[]);;
13282
13283 (* ------------------------------------------------------------------------- *)
13284 (* Schottky's theorem.                                                       *)
13285 (* ------------------------------------------------------------------------- *)
13286
13287 let SCHOTTKY = prove
13288  (`!f r. f holomorphic_on cball(Cx(&0),&1) /\ norm(f(Cx(&0))) <= r /\
13289          (!z. z IN cball(Cx(&0),&1) ==> ~(f z = Cx(&0) \/ f z = Cx(&1)))
13290          ==> !t z. &0 < t /\ t < &1 /\ norm(z) <= t
13291                    ==> norm(f z)
13292                        <= exp(pi * exp(pi *
13293                                        (&2 + &2 * r + &12 * t / (&1 - t))))`,
13294   let lemma0 = prove
13295    (`!f s a.
13296           f holomorphic_on s /\
13297           contractible s /\
13298           a IN s /\
13299           (!z. z IN s ==> ~(f z = Cx (&1)) /\ ~(f z = --Cx (&1)))
13300           ==> (?g. g holomorphic_on s /\
13301                    norm(g a) <= &1 + norm(f a) / &3 /\
13302                    (!z. z IN s ==> f z = ccos(Cx pi * g z)))`,
13303     REPEAT GEN_TAC THEN
13304     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC o MATCH_MP
13305           CONTRACTIBLE_IMP_HOLOMORPHIC_ACS_BOUNDED) THEN
13306     EXISTS_TAC `\z:complex. g z / Cx pi` THEN
13307     ASM_SIMP_TAC[COMPLEX_DIV_LMUL; CX_INJ; PI_NZ; COMPLEX_NORM_DIV;
13308                  HOLOMORPHIC_ON_DIV; HOLOMORPHIC_ON_CONST; REAL_LE_LDIV_EQ;
13309                  COMPLEX_NORM_CX; REAL_ABS_PI; PI_POS] THEN
13310     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
13311      `x <= pi + a ==> a * &3 <= n * pi ==> x <= (&1 + n / &3) * pi`)) THEN
13312     MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
13313     MP_TAC PI_APPROX_32 THEN REAL_ARITH_TAC) in
13314   let lemma1 = prove
13315    (`!n. 0 < n ==> &0 < &n + sqrt(&n pow 2 - &1)`,
13316     MESON_TAC[REAL_LTE_ADD; REAL_OF_NUM_LT; SQRT_POS_LE; REAL_POW_LE_1;
13317               REAL_SUB_LE; REAL_OF_NUM_LE; LE_1]) in
13318   let lemma2 = prove
13319    (`!x. &0 <= x
13320          ==> ?n. 0 < n /\
13321                  abs(x - log(&n + sqrt(&n pow 2 - &1)) / pi) < &1 / &2`,
13322     REPEAT STRIP_TAC THEN MP_TAC(SPEC
13323      `\n. 0 < n /\ log(&n + sqrt(&n pow 2 - &1)) / pi <= x` num_MAX) THEN
13324     SIMP_TAC[] THEN
13325     MATCH_MP_TAC(TAUT `p /\ (q ==> r) ==> (p <=> q) ==> r`) THEN
13326     REPEAT CONJ_TAC THENL
13327      [EXISTS_TAC `1` THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
13328       ASM_REWRITE_TAC[ARITH; SQRT_0; REAL_ADD_RID; LOG_1] THEN
13329       REWRITE_TAC[real_div; REAL_MUL_LZERO] THEN ASM_REAL_ARITH_TAC;
13330       MP_TAC(ISPEC `exp(x * pi)` REAL_ARCH_SIMPLE) THEN
13331       MATCH_MP_TAC MONO_EXISTS THEN
13332       X_GEN_TAC `n:num` THEN DISCH_TAC THEN X_GEN_TAC `m:num` THEN
13333       DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
13334       SIMP_TAC[REAL_LE_LDIV_EQ; PI_POS] THEN
13335       GEN_REWRITE_TAC LAND_CONV [GSYM REAL_EXP_MONO_LE] THEN
13336       ASM_SIMP_TAC[lemma1; EXP_LOG] THEN
13337       REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN MATCH_MP_TAC(REAL_ARITH
13338        `e <= n /\ &0 <= x ==> m + x <= e ==> m <= n`) THEN
13339       ASM_SIMP_TAC[SQRT_POS_LE; REAL_POW_LE_1; REAL_SUB_LE;
13340                    REAL_OF_NUM_LE; LE_1];
13341       DISCH_THEN(X_CHOOSE_THEN `n:num`
13342        (CONJUNCTS_THEN2 (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)
13343                         (MP_TAC o SPEC `n + 1`))) THEN
13344       REWRITE_TAC[ARITH_RULE `~(n + 1 <= n) /\ 0 < n + 1`] THEN
13345       REWRITE_TAC[REAL_NOT_LE; IMP_IMP] THEN
13346       DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
13347        `x < b /\ a <= x ==> b - a < &1
13348         ==> abs(x - a) < &1 / &2 \/ abs(x - b) < &1 / &2`)) THEN
13349       ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[ARITH_RULE `0 < n + 1`]] THEN
13350       REWRITE_TAC[REAL_ARITH `x / pi - y / pi = (x - y) / pi`] THEN
13351       SIMP_TAC[PI_POS; REAL_LT_LDIV_EQ; REAL_MUL_LID] THEN
13352       MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&3` THEN
13353       CONJ_TAC THENL [ALL_TAC; MP_TAC PI_APPROX_32 THEN REAL_ARITH_TAC] THEN
13354       ASM_SIMP_TAC[lemma1; GSYM LOG_DIV; ARITH_RULE `0 < n + 1`] THEN
13355       FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP (ARITH_RULE
13356        `0 < n ==> n = 1 \/ 2 <= n`))
13357       THENL
13358        [ASM_REWRITE_TAC[] THEN CONV_TAC NUM_REDUCE_CONV THEN
13359         CONV_TAC REAL_RAT_REDUCE_CONV THEN
13360         REWRITE_TAC[SQRT_0; REAL_ADD_RID; REAL_DIV_1] THEN
13361         ONCE_REWRITE_TAC[GSYM REAL_EXP_MONO_LE] THEN
13362         SIMP_TAC[EXP_LOG; REAL_LTE_ADD; SQRT_POS_LE; REAL_POS; REAL_OF_NUM_LT;
13363                  ARITH] THEN
13364         MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&1 + &3` THEN
13365         SIMP_TAC[REAL_EXP_LE_X; REAL_POS] THEN
13366         REWRITE_TAC[REAL_ARITH `&2 + s <= a <=> s <= a - &2`] THEN
13367         MATCH_MP_TAC REAL_LE_LSQRT THEN CONV_TAC REAL_RAT_REDUCE_CONV;
13368         MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `log(&2)` THEN
13369         CONJ_TAC THENL
13370          [MATCH_MP_TAC LOG_MONO_LE_IMP THEN
13371           ASM_SIMP_TAC[lemma1; ARITH_RULE `0 < n + 1`; REAL_LT_DIV;
13372                        REAL_LE_LDIV_EQ] THEN
13373           REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN MATCH_MP_TAC(REAL_ARITH
13374            `&1 <= n /\ s <= &2 * t ==> (n + &1) + s <= &2 * (n + t)`) THEN
13375           ASM_SIMP_TAC[REAL_OF_NUM_LE; LE_1] THEN
13376           MATCH_MP_TAC REAL_LE_LSQRT THEN
13377           ASM_SIMP_TAC[REAL_SUB_LE; REAL_POW_LE_1; REAL_ARITH `&1 <= &n + &1`;
13378             REAL_ARITH `&0 <= &2 * x <=> &0 <= x`; REAL_POW_MUL; SQRT_POW_2;
13379             REAL_LE_MUL; REAL_POS; SQRT_POS_LE; REAL_OF_NUM_LE; LE_1] THEN
13380           MATCH_MP_TAC(REAL_ARITH
13381            `&2 <= n /\ &2 * n <= n * n
13382             ==> (n + &1) pow 2 - &1 <= &2 pow 2 * (n pow 2 - &1)`) THEN
13383           ASM_SIMP_TAC[REAL_LE_RMUL; REAL_OF_NUM_LE; LE_0];
13384           ONCE_REWRITE_TAC[GSYM REAL_EXP_MONO_LE] THEN
13385           SIMP_TAC[EXP_LOG; REAL_OF_NUM_LT; ARITH] THEN
13386           MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&1 + &3` THEN
13387           SIMP_TAC[REAL_EXP_LE_X; REAL_POS] THEN REAL_ARITH_TAC]]]) in
13388   let lemma3 = prove
13389    (`!z.
13390       z IN
13391        ({complex(m,log(&n + sqrt(&n pow 2 - &1)) / pi) | integer m /\ 0 < n}
13392         UNION
13393         {complex(m,--log(&n + sqrt(&n pow 2 - &1)) / pi) | integer m /\ 0 < n})
13394          ==> ccos(Cx(pi) * ccos(Cx pi * z)) = Cx(&1) \/
13395              ccos(Cx(pi) * ccos(Cx pi * z)) = --Cx(&1)`,
13396     REWRITE_TAC[COMPLEX_RING
13397      `x = Cx(&1) \/ x = --Cx(&1) <=> Cx(&1) - x pow 2 = Cx(&0)`] THEN
13398     REWRITE_TAC[COMPLEX_POW_EQ_0; ARITH_EQ; CSIN_EQ_0;
13399      REWRITE_RULE[COMPLEX_RING
13400      `s pow 2 + c pow 2 = Cx(&1) <=>
13401       Cx(&1) - c pow 2 = s pow 2`] CSIN_CIRCLE] THEN
13402     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[CX_MUL] THEN
13403     REWRITE_TAC[COMPLEX_EQ_MUL_LCANCEL; CX_INJ; PI_NZ] THEN
13404     REWRITE_TAC[IN_UNION; TAUT `p \/ q ==> r <=> (p ==> r) /\ (q ==> r)`] THEN
13405     REWRITE_TAC[FORALL_AND_THM; FORALL_IN_GSPEC] THEN
13406     REWRITE_TAC[complex_mul; RE; IM; RE_CX; IM_CX; REAL_MUL_LZERO] THEN
13407     ASM_SIMP_TAC[REAL_DIV_LMUL; PI_NZ; REAL_ADD_RID; REAL_SUB_RZERO] THEN
13408     ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
13409     REWRITE_TAC[ccos; COMPLEX_MUL_LNEG; CEXP_NEG] THEN CONJ_TAC THENL
13410      [ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
13411        `~(e = Cx(&0))
13412         ==> ((e + inv e) / Cx(&2) = n <=>
13413              inv e pow 2 - Cx(&2) * n * inv e + Cx(&1) = Cx(&0))`];
13414       ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
13415        `~(e = Cx(&0))
13416         ==> ((e + inv e) / Cx(&2) = n <=>
13417              e pow 2 - Cx(&2) * n * e + Cx(&1) = Cx(&0))`]] THEN
13418     SIMP_TAC[COMPLEX_TRAD; COMPLEX_RING
13419       `ii * (a + ii * b) = --b + ii * a`] THEN
13420     REWRITE_TAC[GSYM COMPLEX_TRAD; GSYM CX_NEG; CEXP_COMPLEX] THEN
13421     SIMP_TAC[REAL_EXP_NEG; EXP_LOG; lemma1] THEN
13422     SIMP_TAC[SIN_INTEGER_PI; REAL_INV_INV] THEN
13423     REWRITE_TAC[COMPLEX_TRAD; COMPLEX_MUL_RZERO; COMPLEX_ADD_RID] THEN
13424     REWRITE_TAC[GSYM CX_POW; GSYM CX_MUL; GSYM CX_ADD; GSYM CX_ADD;
13425                 GSYM CX_SUB; GSYM CX_INV; CX_INJ] THEN
13426     REWRITE_TAC[REAL_INV_MUL; REAL_INV_INV; REAL_POW_MUL] THEN
13427     ONCE_REWRITE_TAC[GSYM COS_ABS] THEN REWRITE_TAC[REAL_ABS_MUL] THEN
13428     MAP_EVERY X_GEN_TAC [`i:real`; `n:num`] THEN REWRITE_TAC[integer] THEN
13429     DISCH_THEN(CONJUNCTS_THEN2
13430      (X_CHOOSE_THEN `m:num` SUBST_ALL_TAC) ASSUME_TAC) THEN
13431     REWRITE_TAC[GSYM integer] THEN REWRITE_TAC[real_abs; PI_POS_LE] THEN
13432     REWRITE_TAC[COS_NPI; REAL_POW_INV; REAL_POW_POW] THEN
13433     REWRITE_TAC[REAL_POW_NEG; EVEN_MULT; ARITH; REAL_POW_ONE] THEN
13434     (ASM_CASES_TAC `EVEN m` THEN
13435      ASM_REWRITE_TAC[REAL_INV_NEG; REAL_INV_1; REAL_MUL_RID] THEN
13436      REWRITE_TAC[REAL_ARITH `a - &2 * n * x * --(&1) = a - &2 * --n * x`] THENL
13437       [EXISTS_TAC `&n:real`; EXISTS_TAC `--(&n):real`] THEN
13438      REWRITE_TAC[REAL_NEG_NEG; REAL_RING
13439      `(n + s) pow 2 - &2 * n * (n + s) + &1 = &0 <=>
13440       s pow 2 = n pow 2 - &1`] THEN
13441      SIMP_TAC[INTEGER_CLOSED] THEN MATCH_MP_TAC SQRT_POW_2 THEN
13442      ASM_SIMP_TAC[REAL_SUB_LE; REAL_POW_LE_1; REAL_OF_NUM_LE; LE_1])) in
13443   REPEAT GEN_TAC THEN STRIP_TAC THEN
13444   MP_TAC(ISPECL
13445    [`\z:complex. Cx(&2) * f z - Cx(&1)`; `cball(Cx(&0),&1)`; `Cx(&0)`]
13446         lemma0) THEN
13447   ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_MUL;
13448                HOLOMORPHIC_ON_CONST; CENTRE_IN_CBALL; REAL_POS;
13449                COMPLEX_RING `Cx(&2) * z - Cx(&1) = Cx(&1) <=> z = Cx(&1)`;
13450                COMPLEX_RING `Cx(&2) * z - Cx(&1) = --Cx(&1) <=> z = Cx(&0)`;
13451                CONVEX_IMP_CONTRACTIBLE; CONVEX_CBALL] THEN
13452   ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
13453   DISCH_THEN(X_CHOOSE_THEN `h:complex->complex` STRIP_ASSUME_TAC) THEN
13454   MP_TAC(ISPECL
13455    [`h:complex->complex`; `cball(Cx(&0),&1)`; `Cx(&0)`]
13456         lemma0) THEN
13457   ASM_SIMP_TAC[CENTRE_IN_CBALL; REAL_POS; CONVEX_IMP_CONTRACTIBLE;
13458                CONVEX_CBALL] THEN
13459   ANTS_TAC THENL
13460    [X_GEN_TAC `z:complex` THEN REPEAT STRIP_TAC THEN
13461     REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`)) THEN
13462     ASM_REWRITE_TAC[COMPLEX_MUL_RID; COMPLEX_MUL_RNEG; CCOS_NEG;
13463                     GSYM CX_COS; COS_PI; CX_NEG] THEN
13464     CONV_TAC COMPLEX_RING;
13465     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC)] THEN
13466   MAP_EVERY UNDISCH_TAC
13467    [`!z. z IN cball (Cx (&0),&1)
13468           ==> Cx(&2) * f z - Cx(&1) = ccos(Cx pi * h z)`;
13469     `!z. z IN cball(Cx(&0),&1) ==> h z = ccos(Cx pi * g z)`] THEN
13470   SIMP_TAC[] THEN DISCH_THEN(K ALL_TAC) THEN DISCH_TAC THEN
13471   SUBGOAL_THEN
13472    `norm(g(Cx(&0)):complex) <= &2 + norm(f(Cx(&0)):complex)`
13473   ASSUME_TAC THENL
13474    [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13475       REAL_LE_TRANS)) THEN
13476     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
13477      `h <= p ==> p / &3 <= &1 + f ==> &1 + h / &3 <= &2 + f`)) THEN
13478     MP_TAC(ISPEC `&1` COMPLEX_NORM_CX) THEN
13479     REWRITE_TAC[GSYM COMPLEX_CMUL] THEN CONV_TAC NORM_ARITH;
13480     MAP_EVERY (C UNDISCH_THEN (K ALL_TAC))
13481      [`h holomorphic_on cball(Cx (&0),&1)`;
13482       `norm(g(Cx(&0)):complex) <= &1 + norm(h(Cx(&0)):complex) / &3`;
13483       `norm(h(Cx(&0)):complex) <=
13484        &1 + norm(Cx(&2) * f(Cx(&0)) - Cx(&1)) / &3`]] THEN
13485   MAP_EVERY X_GEN_TAC [`t:real`; `z:complex`] THEN STRIP_TAC THEN
13486   SUBGOAL_THEN `z IN ball(Cx(&0),&1)` ASSUME_TAC THENL
13487    [REWRITE_TAC[COMPLEX_IN_BALL_0] THEN ASM_REAL_ARITH_TAC;
13488     FIRST_ASSUM(ASSUME_TAC o MATCH_MP
13489       (REWRITE_RULE[SUBSET] BALL_SUBSET_CBALL))] THEN
13490   SUBGOAL_THEN
13491    `norm(g(z) - g(Cx(&0))) <= &12 * t / (&1 - t)`
13492   ASSUME_TAC THENL
13493    [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
13494     REWRITE_TAC[RIGHT_IMP_EXISTS_THM; SKOLEM_THM] THEN
13495     DISCH_THEN(X_CHOOSE_TAC `g':complex->complex`) THEN
13496     MP_TAC(ISPECL [`g:complex->complex`; `g':complex->complex`;
13497                    `linepath(Cx(&0),z)`; `cball(Cx(&0),&1)`]
13498         PATH_INTEGRAL_PRIMITIVE) THEN
13499     ASM_REWRITE_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH;
13500                     PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
13501     ASM_SIMP_TAC[CONVEX_CONTAINS_SEGMENT_IMP; CONVEX_CBALL] THEN
13502     REWRITE_TAC[CENTRE_IN_CBALL; REAL_POS] THEN
13503     DISCH_THEN(MP_TAC o SPEC `&12 / (&1 - t)` o MATCH_MP
13504      (ONCE_REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_BOUND_LINEPATH)) THEN
13505     ANTS_TAC THENL
13506      [ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_SUB_LT; REAL_LT_IMP_LE] THEN
13507       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
13508       MP_TAC(ISPECL [`Cx(&0)`; `z:complex`; `w:complex`] SEGMENT_BOUND) THEN
13509       ASM_REWRITE_TAC[COMPLEX_SUB_RZERO] THEN STRIP_TAC THEN
13510       MP_TAC(ISPECL
13511        [`g:complex->complex`; `cball(Cx(&0),&1)`; `w:complex`;
13512         `&1 - t`; `&1`] BLOCH_COROLLARY) THEN
13513       ASM_REWRITE_TAC[FRONTIER_CBALL; COMPLEX_IN_CBALL_0;
13514                       COMPLEX_IN_SPHERE_0] THEN
13515       MATCH_MP_TAC(TAUT
13516        `p /\ q /\ ~s /\ (~r ==> t) ==> (p /\ q /\ r ==> s) ==> t`) THEN
13517       REWRITE_TAC[REAL_NOT_LE] THEN REPEAT CONJ_TAC THENL
13518        [ASM_REAL_ARITH_TAC;
13519         MAP_EVERY UNDISCH_TAC
13520          [`norm(w:complex) <= norm(z:complex)`; `norm(z:complex) <= t`] THEN
13521         CONV_TAC NORM_ARITH;
13522         MATCH_MP_TAC(SET_RULE
13523          `!t u. (!b. (?w. w IN t /\ w IN ball(b,&1)) \/
13524                      (?w. w IN u /\ w IN ball(b,&1))) /\
13525                 (!x. x IN d ==> ~(g x IN t UNION u))
13526                 ==> ~(?b. ball(b,&1) SUBSET IMAGE g d)`) THEN
13527         MAP_EVERY EXISTS_TAC
13528          [`{ complex(m,log(&n + sqrt(&n pow 2 - &1)) / pi) |
13529               integer m /\ 0 < n}`;
13530           `{ complex(m,--log(&n + sqrt(&n pow 2 - &1)) / pi) |
13531              integer m /\ 0 < n}`] THEN
13532         REWRITE_TAC[EXISTS_IN_GSPEC] THEN CONJ_TAC THENL
13533          [X_GEN_TAC `b:complex` THEN REWRITE_TAC[OR_EXISTS_THM] THEN
13534           MP_TAC(ISPEC `Re b` INTEGER_ROUND) THEN
13535           MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `m:real` THEN
13536           STRIP_TAC THEN ASM_REWRITE_TAC[IN_BALL] THEN
13537           DISJ_CASES_TAC(REAL_ARITH `&0 <= Im b \/ &0 <= --(Im b)`) THENL
13538            [MP_TAC(SPEC `Im b` lemma2); MP_TAC(SPEC `--(Im b)` lemma2)] THEN
13539           ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
13540           X_GEN_TAC `n:num` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THENL
13541            [DISJ1_TAC; DISJ2_TAC] THEN
13542           REWRITE_TAC[dist] THEN
13543           W(MP_TAC o PART_MATCH lhand COMPLEX_NORM_LE_RE_IM o lhand o snd) THEN
13544           MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LET_TRANS) THEN
13545           MATCH_MP_TAC(REAL_ARITH
13546            `x <= &1 / &2 /\ y < &1 / &2 ==> x + y < &1`) THEN
13547           ASM_REWRITE_TAC[RE_SUB; IM_SUB; RE; IM] THEN ASM_REAL_ARITH_TAC;
13548           X_GEN_TAC `v:complex` THEN DISCH_TAC THEN
13549           DISCH_THEN(DISJ_CASES_TAC o MATCH_MP lemma3) THEN
13550           REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `v:complex`)) THEN
13551           ASM_REWRITE_TAC[] THEN CONV_TAC COMPLEX_RING];
13552           REWRITE_TAC[REAL_ARITH `a * c / &12 < &1 <=> c * a < &12`] THEN
13553           ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_SUB_LT] THEN MATCH_MP_TAC
13554            (NORM_ARITH `x = y ==> norm(x) < d ==> norm(y) <= d`) THEN
13555           MATCH_MP_TAC COMPLEX_DERIVATIVE_UNIQUE_AT THEN
13556           MAP_EVERY EXISTS_TAC [`g:complex->complex`; `w:complex`] THEN
13557           REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
13558           MATCH_MP_TAC(TAUT `(q ==> p) /\ q ==> p /\ q`) THEN
13559           CONJ_TAC THENL [MESON_TAC[complex_differentiable]; ALL_TAC] THEN
13560           MATCH_MP_TAC(MESON[]
13561            `!s. (g has_complex_derivative g') (at x within s) /\
13562                 ((g has_complex_derivative g') (at x within s) <=>
13563                  (g has_complex_derivative g') (at x))
13564                 ==> (g has_complex_derivative g') (at x)`) THEN
13565           EXISTS_TAC `cball(Cx(&0),&1)` THEN CONJ_TAC THENL
13566            [FIRST_X_ASSUM MATCH_MP_TAC THEN
13567             REWRITE_TAC[COMPLEX_IN_CBALL_0] THEN ASM_REAL_ARITH_TAC;
13568             REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN;
13569                         HAS_COMPLEX_DERIVATIVE_AT] THEN
13570             MATCH_MP_TAC LIM_WITHIN_INTERIOR THEN
13571             REWRITE_TAC[INTERIOR_CBALL; COMPLEX_IN_BALL_0] THEN
13572             ASM_REAL_ARITH_TAC]];
13573       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
13574       ONCE_REWRITE_TAC[REAL_ARITH `&12 * t / s = &12 / s * t`] THEN
13575       MATCH_MP_TAC REAL_LE_LMUL THEN
13576       ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_SUB_LT; REAL_LT_IMP_LE] THEN
13577       ASM_REWRITE_TAC[COMPLEX_SUB_RZERO]];
13578     GEN_REWRITE_TAC (LAND_CONV o RAND_CONV)
13579      [COMPLEX_RING `y = (Cx(&1) + (Cx(&2) * y - Cx (&1))) / Cx(&2)`] THEN
13580     ASM_SIMP_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
13581     ONCE_REWRITE_TAC[REAL_ARITH `x / &2 <= y <=> x <= &2 * y`] THEN
13582     W(MP_TAC o PART_MATCH lhand NORM_CCOS_PLUS1_LE o lhand o snd) THEN
13583     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
13584     MATCH_MP_TAC REAL_LE_LMUL THEN
13585     REWRITE_TAC[REAL_POS; REAL_EXP_MONO_LE; COMPLEX_NORM_MUL] THEN
13586     REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_PI] THEN
13587     MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[PI_POS_LE] THEN
13588     W(MP_TAC o PART_MATCH lhand NORM_CCOS_LE o lhand o snd) THEN
13589     MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
13590     REWRITE_TAC[REAL_EXP_MONO_LE; COMPLEX_NORM_MUL] THEN
13591     REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_PI] THEN
13592     MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[PI_POS_LE] THEN
13593     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
13594      `norm(z - w) <= c ==> norm w <= a + b ==> norm z <= a + b + c`)) THEN
13595     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13596         REAL_LE_TRANS)) THEN
13597     UNDISCH_TAC `norm(f(Cx(&0)):complex) <= r` THEN
13598     CONV_TAC NORM_ARITH]);;
13599
13600 (* ------------------------------------------------------------------------- *)
13601 (* The Little Picard Theorem.                                                *)
13602 (* ------------------------------------------------------------------------- *)
13603
13604 let LANDAU_PICARD = prove
13605  (`?R. (!z. &0 < R z) /\
13606        !f. f holomorphic_on cball(Cx(&0),R(f(Cx(&0)))) /\
13607            (!z. z IN cball(Cx(&0),R(f(Cx(&0))))
13608                 ==> ~(f(z) = Cx(&0)) /\ ~(f(z) = Cx(&1)))
13609            ==> norm(complex_derivative f (Cx(&0))) < &1`,
13610   ABBREV_TAC
13611    `R = \z:complex. &3 * exp(pi * exp(pi * (&2 + &2 * norm(z) + &12)))` THEN
13612   EXISTS_TAC `R:complex->real` THEN
13613   MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
13614    [EXPAND_TAC "R" THEN
13615     REWRITE_TAC[REAL_EXP_POS_LT; REAL_ARITH `&0 < &3 * x <=> &0 < x`];
13616     DISCH_TAC] THEN
13617   REPEAT STRIP_TAC THEN
13618   ABBREV_TAC `r = (R:complex->real)(f(Cx(&0)))` THEN
13619   SUBGOAL_THEN `&0 < r` ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
13620   ABBREV_TAC `g = \z. (f:complex->complex)(Cx r * z)` THEN
13621   SUBGOAL_THEN
13622    `!z. z IN cball(Cx(&0),&1) ==> (Cx r * z) IN cball(Cx(&0),r)`
13623   ASSUME_TAC THENL
13624    [REWRITE_TAC[COMPLEX_IN_CBALL_0; COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
13625     ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH
13626      `&0 < r ==> (abs r * z <= r <=> r * z <= r * &1)`];
13627     ALL_TAC] THEN
13628   SUBGOAL_THEN `g holomorphic_on cball(Cx(&0),&1)` ASSUME_TAC THENL
13629    [EXPAND_TAC "g" THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
13630     MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
13631     SIMP_TAC[HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST] THEN
13632     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13633       HOLOMORPHIC_ON_SUBSET)) THEN
13634     ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE];
13635     ALL_TAC] THEN
13636   MP_TAC(ISPECL [`g:complex->complex`; `norm(f(Cx(&0)):complex)`]
13637     SCHOTTKY) THEN
13638   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
13639    [EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_MUL_RZERO; REAL_LE_REFL] THEN
13640     GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[DE_MORGAN_THM] THEN
13641     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC[];
13642     ALL_TAC] THEN
13643   DISCH_THEN(MP_TAC o SPEC `&1 / &2`) THEN
13644   CONV_TAC REAL_RAT_REDUCE_CONV THEN
13645   MP_TAC(ASSUME `(R:complex->real)(f(Cx(&0))) = r`) THEN
13646   EXPAND_TAC "R" THEN
13647   SIMP_TAC[REAL_ARITH `&3 * x = r <=> x = r / &3`] THEN
13648   DISCH_THEN SUBST1_TAC THEN DISCH_THEN(LABEL_TAC "*") THEN
13649   MP_TAC(ISPECL
13650    [`g:complex->complex`; `Cx(&0)`; `&1 / &2`; `r / &3`; `1`]
13651         CAUCHY_INEQUALITY) THEN
13652   CONV_TAC NUM_REDUCE_CONV THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
13653   REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_1] THEN
13654   ASM_SIMP_TAC[COMPLEX_SUB_LZERO; NORM_NEG; REAL_EQ_IMP_LE] THEN
13655   ANTS_TAC THENL
13656    [CONJ_TAC THENL
13657      [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; ALL_TAC] THEN
13658     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13659       HOLOMORPHIC_ON_SUBSET)) THEN
13660     REWRITE_TAC[SUBSET_BALLS; DIST_REFL] THEN CONV_TAC REAL_RAT_REDUCE_CONV;
13661     ALL_TAC] THEN
13662   SUBGOAL_THEN
13663    `complex_derivative g (Cx(&0)) = Cx r * complex_derivative f (Cx(&0))`
13664   SUBST1_TAC THENL
13665    [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN EXPAND_TAC "g" THEN
13666     REWRITE_TAC[] THEN ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
13667     ONCE_REWRITE_TAC[GSYM o_DEF] THEN MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
13668     CONJ_TAC THENL
13669      [COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_MUL_LID]; ALL_TAC] THEN
13670     REWRITE_TAC[COMPLEX_MUL_LZERO; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
13671     MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
13672     EXISTS_TAC `ball(Cx(&0),r)` THEN
13673     ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
13674     ASM_MESON_TAC[BALL_SUBSET_CBALL; HOLOMORPHIC_ON_SUBSET];
13675     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
13676     ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH
13677      `&0 < r ==> (abs r * z <= &1 * r / &3 / (&1 / &2) <=>
13678                   r * z <= r * &2 / &3)`] THEN
13679     REAL_ARITH_TAC]);;
13680
13681 let LITTLE_PICARD = prove
13682  (`!f a b.
13683       f holomorphic_on (:complex) /\
13684       ~(a = b) /\ IMAGE f (:complex) INTER {a,b} = {}
13685       ==> ?c. f = \x. c`,
13686   let lemma = prove
13687    (`!f. f holomorphic_on (:complex) /\
13688          (!z. ~(f z = Cx(&0)) /\ ~(f z = Cx(&1)))
13689          ==> ?c. f = \x. c`,
13690     X_CHOOSE_THEN `R:complex->real` MP_TAC LANDAU_PICARD THEN
13691     REPEAT STRIP_TAC THEN
13692     MP_TAC(ISPECL [`f:complex->complex`; `(:complex)`]
13693       HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
13694     REWRITE_TAC[IN_UNIV; FUN_EQ_THM; CONNECTED_UNIV; OPEN_UNIV] THEN
13695     DISCH_THEN MATCH_MP_TAC THEN X_GEN_TAC `w:complex` THEN
13696     ASM_CASES_TAC `complex_derivative f w = Cx(&0)` THENL
13697      [FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
13698       REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
13699       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_UNIV; IN_UNIV];
13700       MATCH_MP_TAC(TAUT `F ==> p`)] THEN
13701     FIRST_X_ASSUM(MP_TAC o SPEC
13702      `\z. (f:complex->complex)(w + z / complex_derivative f w)`) THEN
13703     ASM_REWRITE_TAC[NOT_IMP] THEN CONJ_TAC THENL
13704      [GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
13705       MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
13706        [ALL_TAC; ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV]] THEN
13707       REWRITE_TAC[HOLOMORPHIC_ON_DIFFERENTIABLE] THEN
13708       REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC;
13709       SUBGOAL_THEN
13710        `complex_derivative (\z. f (w + z / complex_derivative f w)) (Cx(&0)) =
13711         complex_derivative f w * inv(complex_derivative f w)`
13712       SUBST1_TAC THENL
13713        [ALL_TAC;
13714         ASM_SIMP_TAC[COMPLEX_MUL_RINV; COMPLEX_NORM_CX; REAL_ABS_NUM;
13715                      REAL_LT_REFL]] THEN
13716       ONCE_REWRITE_TAC[GSYM o_DEF] THEN
13717       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
13718       MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN CONJ_TAC THENL
13719        [COMPLEX_DIFF_TAC THEN
13720         REWRITE_TAC[COMPLEX_ADD_LID; COMPLEX_MUL_LID; complex_div];
13721         REWRITE_TAC[complex_div; COMPLEX_MUL_LZERO; COMPLEX_ADD_RID] THEN
13722         REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
13723         ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_UNIV;
13724                       IN_UNIV]]]) in
13725   REPEAT STRIP_TAC THEN
13726   MP_TAC(SPEC `\x:complex. Cx(&1) / (b - a) * (f x - b) + Cx(&1)` lemma) THEN
13727   ASM_SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_SUB;
13728                HOLOMORPHIC_ON_CONST] THEN
13729   ASM_SIMP_TAC[FUN_EQ_THM; COMPLEX_FIELD
13730    `~(a = b)
13731     ==> (Cx(&1) / (b - a) * (f - b) + Cx(&1) = c <=>
13732          f = b + (b - a) / Cx(&1) * (c - Cx(&1)))`] THEN
13733   ANTS_TAC THENL [ALL_TAC; MESON_TAC[]] THEN
13734   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I
13735    [SET_RULE `IMAGE f UNIV INTER t = {} <=> !x. ~(f x IN t)`]) THEN
13736   MATCH_MP_TAC MONO_FORALL THEN
13737   REWRITE_TAC[CONTRAPOS_THM; IN_INSERT; NOT_IN_EMPTY] THEN
13738   CONV_TAC COMPLEX_RING);;
13739
13740 (* ------------------------------------------------------------------------- *)
13741 (* A couple of little applications of Little Picard.                         *)
13742 (* ------------------------------------------------------------------------- *)
13743
13744 let HOLOMORPHIC_PERIODIC_FIXPOINT = prove
13745  (`!f p. f holomorphic_on (:complex) /\ ~(p = Cx(&0)) /\ (!z. f(z + p) = f(z))
13746          ==> ?x. f(x) = x`,
13747   REWRITE_TAC[MESON[] `(?x. P x) <=> ~(!x. ~P x)`] THEN REPEAT STRIP_TAC THEN
13748   MP_TAC(ISPECL
13749    [`\z:complex. f(z) - z`; `Cx(&0)`; `p:complex`] LITTLE_PICARD) THEN
13750   ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; NOT_IMP] THEN
13751   REWRITE_TAC[SET_RULE `IMAGE f UNIV INTER {a,b} = {} <=>
13752                           !x. ~(f x = a) /\ ~(f x = b)`] THEN
13753   CONJ_TAC THENL
13754    [REWRITE_TAC[COMPLEX_RING `a - b:complex = c <=> a = b + c`;
13755                 COMPLEX_ADD_RID] THEN
13756     ASM_MESON_TAC[];
13757     REWRITE_TAC[NOT_EXISTS_THM; FUN_EQ_THM] THEN GEN_TAC THEN
13758     DISCH_THEN(fun th ->
13759      MP_TAC(SPEC `p + p:complex` th) THEN
13760      MP_TAC(SPEC `p:complex` th)) THEN
13761     ASM_REWRITE_TAC[] THEN
13762     UNDISCH_TAC `~(p = Cx(&0))` THEN CONV_TAC COMPLEX_RING]);;
13763
13764 let HOLOMORPHIC_INVOLUTION_POINT = prove
13765  (`!f. f holomorphic_on (:complex) /\ ~(?a. f = \x. a + x) ==> ?x. f(f x) = x`,
13766   REWRITE_TAC[MESON[] `(?x. P x) <=> ~(!x. ~P x)`] THEN REPEAT STRIP_TAC THEN
13767   SUBGOAL_THEN `!z:complex. ~(f z = z)` ASSUME_TAC THENL
13768    [ASM_MESON_TAC[]; ALL_TAC] THEN
13769   MP_TAC(ISPECL [`\x. (f(f x) - x) / (f x - x)`; `Cx(&0)`; `Cx(&1)`]
13770         LITTLE_PICARD) THEN
13771   REWRITE_TAC[NOT_IMP; CX_INJ; REAL_OF_NUM_EQ; ARITH_EQ] THEN
13772   REWRITE_TAC[SET_RULE `IMAGE f UNIV INTER {a,b} = {} <=>
13773                           !x. ~(f x = a) /\ ~(f x = b)`] THEN
13774   ASM_SIMP_TAC[FUN_EQ_THM; COMPLEX_FIELD
13775      `~(a:complex = b) ==> (x / (a - b) = c <=> x = c * (a - b))`] THEN
13776   REPEAT CONJ_TAC THENL
13777    [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
13778     ASM_SIMP_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
13779     MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
13780     ASM_REWRITE_TAC[HOLOMORPHIC_ON_ID] THEN
13781     GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
13782     MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
13783     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV];
13784     ASM_REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_MUL_LID; COMPLEX_SUB_0] THEN
13785     REWRITE_TAC[COMPLEX_RING `x - a:complex = y - a <=> x = y`] THEN
13786     ASM_MESON_TAC[];
13787     DISCH_THEN(X_CHOOSE_THEN `c:complex` MP_TAC)] THEN
13788   ASM_CASES_TAC `c = Cx(&0)` THEN
13789   ASM_REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_SUB_0] THEN
13790   ASM_CASES_TAC `c = Cx(&1)` THEN
13791   ASM_REWRITE_TAC[COMPLEX_RING `ffx - x = Cx(&1) * (fx - x) <=> ffx = fx`] THEN
13792   REWRITE_TAC[COMPLEX_RING
13793    `ffx - x = c * (fx - x) <=> (ffx - c * fx) = x * (Cx(&1) - c)`] THEN
13794   DISCH_TAC THEN
13795   MP_TAC(SPECL
13796    [`complex_derivative f o f`; `Cx(&0)`; `c:complex`] LITTLE_PICARD) THEN
13797   REWRITE_TAC[SET_RULE `IMAGE f UNIV INTER {a,b} = {} <=>
13798                           !x. ~(f x = a) /\ ~(f x = b)`] THEN
13799   ASM_REWRITE_TAC[o_THM; NOT_IMP] THEN REPEAT CONJ_TAC THENL
13800    [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
13801     ASM_MESON_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_UNIV; SUBSET_UNIV;
13802                   HOLOMORPHIC_ON_SUBSET];
13803     MP_TAC(MATCH_MP MONO_FORALL (GEN `z:complex` (SPECL
13804      [`\x:complex. f(f x) - c * f x`; `z:complex`;
13805       `complex_derivative f z * (complex_derivative f (f z) - c)`;
13806       `Cx(&1) * (Cx(&1) - c)`] COMPLEX_DERIVATIVE_UNIQUE_AT))) THEN
13807     ANTS_TAC THENL
13808      [REPEAT STRIP_TAC THENL
13809        [REWRITE_TAC[COMPLEX_RING `a * (b - c):complex = b * a - c * a`] THEN
13810         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN CONJ_TAC THENL
13811          [ONCE_REWRITE_TAC[GSYM o_DEF] THEN MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT;
13812           MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_LMUL_AT] THEN
13813         REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
13814         ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; IN_UNIV; OPEN_UNIV];
13815         ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_RMUL_AT THEN
13816         REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_ID]];
13817       DISCH_THEN(fun th -> X_GEN_TAC `z:complex` THEN REPEAT STRIP_TAC THEN
13818                         MP_TAC th)
13819       THENL [DISCH_THEN(MP_TAC o SPEC `(f:complex->complex) z`);
13820              DISCH_THEN(MP_TAC o SPEC `z:complex`)] THEN
13821       ASM_REWRITE_TAC[] THEN
13822       UNDISCH_TAC `~(c = Cx(&1))` THEN CONV_TAC COMPLEX_RING];
13823       REWRITE_TAC[FUN_EQ_THM; o_THM] THEN
13824       DISCH_THEN(X_CHOOSE_TAC `k:complex`) THEN
13825       SUBGOAL_THEN `open(IMAGE (f:complex->complex) (:complex))`
13826       ASSUME_TAC THENL
13827        [MATCH_MP_TAC(REWRITE_RULE[RIGHT_IMP_FORALL_THM; IMP_IMP]
13828          OPEN_MAPPING_THM) THEN
13829         EXISTS_TAC `(:complex)` THEN
13830         ASM_REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; SUBSET_UNIV; IN_UNIV] THEN
13831         ASM_MESON_TAC[];
13832         ALL_TAC] THEN
13833       MP_TAC(ISPECL
13834         [`\z. complex_derivative f z - k`; `(:complex)`;
13835          `IMAGE (f:complex->complex) (:complex)`; `(f:complex->complex) z`]
13836         ANALYTIC_CONTINUATION) THEN
13837       REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; SUBSET_UNIV; IN_UNIV] THEN
13838       ASM_REWRITE_TAC[FORALL_IN_IMAGE; COMPLEX_SUB_0; NOT_IMP] THEN
13839       REPEAT CONJ_TAC THENL
13840        [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN REWRITE_TAC[ETA_AX] THEN
13841         ASM_MESON_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_UNIV; SUBSET_UNIV;
13842                       HOLOMORPHIC_ON_SUBSET; HOLOMORPHIC_ON_CONST];
13843         MATCH_MP_TAC LIMPT_OF_OPEN THEN ASM_REWRITE_TAC[] THEN SET_TAC[];
13844         DISCH_TAC] THEN
13845       MP_TAC(ISPECL
13846        [`\x:complex. f x - k * x`; `(:complex)`]
13847         HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
13848       REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; IN_UNIV; NOT_IMP] THEN
13849       CONJ_TAC THENL
13850        [X_GEN_TAC `z:complex` THEN
13851         SUBST1_TAC(COMPLEX_RING `Cx(&0) = k - k * Cx(&1)`) THEN
13852         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN CONJ_TAC THENL
13853          [ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE;
13854                         HOLOMORPHIC_ON_OPEN; OPEN_UNIV; IN_UNIV;
13855                         complex_differentiable];
13856           COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING];
13857         DISCH_THEN(X_CHOOSE_THEN `l:complex` MP_TAC) THEN
13858         REWRITE_TAC[COMPLEX_RING `a - b:complex = c <=> a = b + c`] THEN
13859         DISCH_THEN(fun th -> RULE_ASSUM_TAC(REWRITE_RULE[th; FUN_EQ_THM])) THEN
13860         ASM_CASES_TAC `k = Cx(&1)` THENL
13861          [UNDISCH_TAC `!a:complex. ~(!x. k * x + l = a + x)` THEN
13862           ASM_REWRITE_TAC[COMPLEX_MUL_LID] THEN MESON_TAC[COMPLEX_ADD_SYM];
13863           UNDISCH_TAC `!z:complex. ~(k * z + l = z)` THEN
13864           ASM_SIMP_TAC[COMPLEX_FIELD
13865            `~(k = Cx(&1)) ==> (k * z + l = z <=> z = l / (Cx(&1) - k))`] THEN
13866           MESON_TAC[]]]]);;
13867
13868 (* ------------------------------------------------------------------------- *)
13869 (* Montel's theorem: a sequence of holomorphic functions uniformly bounded   *)
13870 (* on compact subsets of an open set S has a subsequence that converges to a *)
13871 (* holomorphic function, and converges *uniformly* on compact subsets of S.  *)
13872 (* ------------------------------------------------------------------------- *)
13873
13874 let MONTEL = prove
13875  (`!(f:num->complex->complex) p s.
13876     open s /\ (!h. h IN p ==> h holomorphic_on s) /\
13877     (!k. compact k /\ k SUBSET s
13878          ==> ?b. !h z. h IN p /\ z IN k ==> norm(h z) <= b) /\
13879     (!n. (f n) IN p)
13880     ==> ?g r. g holomorphic_on s /\
13881               (!m n:num. m < n ==> r m < r n) /\
13882               (!x. x IN s ==> ((\n. f (r n) x) --> g(x)) sequentially) /\
13883               (!k e. compact k /\ k SUBSET s /\ &0 < e
13884                      ==> ?N. !n x. n >= N /\ x IN k
13885                                    ==> norm(f (r n) x - g x) < e)`,
13886   REPEAT GEN_TAC THEN
13887   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
13888   SPEC_TAC(`f:num->complex->complex`,`f:num->complex->complex`) THEN
13889   REWRITE_TAC[LIM_SEQUENTIALLY] THEN
13890   REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP; GSYM GE; dist] THEN
13891   FIRST_ASSUM(MP_TAC o MATCH_MP OPEN_UNION_COMPACT_SUBSETS) THEN
13892   DISCH_THEN(X_CHOOSE_THEN `k:num->complex->bool`
13893    (fun th -> FIRST_X_ASSUM(MP_TAC o GEN `i:num `o
13894                 SPEC `(k:num->complex->bool) i`) THEN
13895               STRIP_ASSUME_TAC th)) THEN
13896   ASM_REWRITE_TAC[SKOLEM_THM; LEFT_IMP_EXISTS_THM] THEN
13897   X_GEN_TAC `B:num->real` THEN DISCH_TAC THEN
13898   SUBGOAL_THEN
13899    `!(f:num->complex->complex) (i:num).
13900         (!n. f n IN p)
13901         ==>  ?r g. (!m n:num. m < n ==> r m < r n) /\
13902                    (!e. &0 < e ==> ?N. !n x. n >= N /\ x IN k i
13903                                              ==> norm((f o r) n x - g x) < e)`
13904   MP_TAC THENL
13905    [REPEAT STRIP_TAC THEN REWRITE_TAC[o_THM] THEN
13906     MP_TAC(ISPECL [`f:num->complex->complex`; `(k:num->complex->bool) i`;
13907                    `(B:num->real) i`] ARZELA_ASCOLI) THEN
13908     ANTS_TAC THENL [ASM_SIMP_TAC[]; MESON_TAC[]] THEN
13909     MAP_EVERY X_GEN_TAC [`z:complex`; `e:real`] THEN STRIP_TAC THEN
13910     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
13911     DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
13912     ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[SUBSET; IN_CBALL]] THEN
13913     DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
13914     SUBGOAL_THEN
13915      `?M. &0 < M /\
13916           !n w. dist(z,w) <= &2 / &3 * r
13917                 ==> norm((f:num->complex->complex) n w) <= M`
13918     STRIP_ASSUME_TAC THENL
13919      [FIRST_X_ASSUM(MP_TAC o SPEC `cball(z:complex,&2 / &3 * r)`) THEN
13920       ASM_SIMP_TAC[SUBSET; IN_CBALL; COMPACT_CBALL;
13921               NORM_ARITH `dist(a,b) <= &2 / &3 * r ==> dist(a,b) <= r`] THEN
13922       DISCH_THEN(X_CHOOSE_THEN `N:num` (MP_TAC o SPEC `N:num`)) THEN
13923       REWRITE_TAC[GE; LE_REFL] THEN DISCH_TAC THEN
13924       EXISTS_TAC `abs(B(N:num)) + &1` THEN
13925       REWRITE_TAC[REAL_ARITH `&0 < abs x + &1`] THEN
13926       ASM_MESON_TAC[SUBSET; REAL_ARITH `x <= b ==> x <= abs b + &1`];
13927       ALL_TAC] THEN
13928     EXISTS_TAC `min (r / &3) ((e * r) / (&6 * M))` THEN
13929     ASM_SIMP_TAC[REAL_LT_MIN; REAL_LT_DIV;
13930                  REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
13931     MAP_EVERY X_GEN_TAC [`n:num`; `y:complex`] THEN STRIP_TAC THEN
13932     MP_TAC
13933      (ISPECL [`(f:num->complex->complex) n`;  `cball(z:complex,&2 / &3 * r)`;
13934               `circlepath(z:complex,&2 / &3 * r)`]
13935         CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE) THEN
13936     REWRITE_TAC[CONVEX_CBALL; VALID_PATH_CIRCLEPATH] THEN
13937     REWRITE_TAC[PATHSTART_CIRCLEPATH; PATHFINISH_CIRCLEPATH] THEN
13938     SIMP_TAC[INTERIOR_CBALL; IN_BALL; WINDING_NUMBER_CIRCLEPATH;
13939              NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
13940     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH;
13941                  REAL_ARITH `&0 < r ==> &0 <= &2 / &3 * r`] THEN
13942     REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
13943     SIMP_TAC[SUBSET; IN_CBALL; IN_DELETE; IN_ELIM_THM; REAL_LE_REFL;
13944              NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
13945     ONCE_REWRITE_TAC[TAUT `p ==> ~q <=> q ==> ~p`] THEN
13946     SIMP_TAC[FORALL_UNWIND_THM2; IMP_CONJ; REAL_LT_IMP_NE] THEN
13947     REWRITE_TAC[RIGHT_FORALL_IMP_THM; COMPLEX_MUL_LID] THEN ANTS_TAC THENL
13948      [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13949       EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[SUBSET; IN_CBALL] THEN
13950       ASM_SIMP_TAC[NORM_ARITH `dist(a,b) <= &2 / &3 * r ==> dist(a,b) <= r`];
13951       ALL_TAC] THEN
13952     DISCH_THEN(fun th ->
13953       MP_TAC(SPEC `y:complex` th) THEN MP_TAC(SPEC `z:complex` th)) THEN
13954     ASM_SIMP_TAC[VECTOR_SUB_REFL; NORM_0; REAL_LT_MUL; REAL_LT_DIV;
13955       REAL_OF_NUM_LT; ARITH; NORM_ARITH
13956        `norm(z - y) < r / &3 ==> norm(y - z) < &2 / &3 * r`] THEN
13957     REWRITE_TAC[IMP_IMP] THEN
13958     DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
13959     DISCH_THEN(MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
13960         HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH)) THEN
13961     REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB; COMPLEX_NORM_MUL] THEN
13962     REWRITE_TAC[COMPLEX_NORM_II; COMPLEX_NORM_CX; REAL_ABS_PI;
13963                 REAL_ABS_NUM; REAL_MUL_LID] THEN
13964     DISCH_THEN(MP_TAC o SPEC `e / r:real`) THEN
13965     ASM_SIMP_TAC[REAL_FIELD
13966      `&0 < r ==> e / r * &2 * pi * c * r = &2 * pi * e * c`] THEN
13967     SIMP_TAC[REAL_LE_LMUL_EQ; REAL_OF_NUM_LT; ARITH; PI_POS] THEN
13968     ANTS_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
13969     ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH;
13970                  REAL_LT_MUL] THEN
13971     X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
13972     SUBGOAL_THEN `~(w:complex = z) /\ ~(w = y)` STRIP_ASSUME_TAC THENL
13973      [CONJ_TAC THEN DISCH_THEN SUBST_ALL_TAC THEN
13974       RULE_ASSUM_TAC(REWRITE_RULE[NORM_0; VECTOR_SUB_REFL]) THEN
13975       RULE_ASSUM_TAC(REWRITE_RULE[NORM_SUB]) THEN ASM_REAL_ARITH_TAC;
13976       ALL_TAC] THEN
13977     ASM_SIMP_TAC[COMPLEX_FIELD
13978      `~(w:complex = z) /\ ~(w = y)
13979       ==> (a / (w - z) - a / (w - y) =
13980            (a * (z - y)) / ((w - z) * (w - y)))`] THEN
13981     REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV] THEN
13982     ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LT_MUL; NORM_POS_LT; VECTOR_SUB_EQ;
13983      REAL_FIELD `&0 < r ==> e / r * (&2 / &3 * r) * x = &2 / &3 * e * x`] THEN
13984     MATCH_MP_TAC REAL_LE_TRANS THEN
13985     EXISTS_TAC `M * (e * r) / (&6 * M)` THEN CONJ_TAC THENL
13986      [MATCH_MP_TAC REAL_LE_MUL2 THEN
13987       ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE] THEN
13988       FIRST_X_ASSUM MATCH_MP_TAC THEN
13989       ASM_REWRITE_TAC[NORM_ARITH `dist(x,y) = norm(y - x)`; REAL_LE_REFL];
13990       ASM_SIMP_TAC[REAL_FIELD `&0 < M ==> M * e / (&6 * M) = e / &6`] THEN
13991       MATCH_MP_TAC(REAL_ARITH
13992        `&0 < x /\ x <= y * &3 ==> x / &6 <= &2 / &3 * y`) THEN
13993       ASM_SIMP_TAC[REAL_LT_MUL; GSYM REAL_MUL_ASSOC; REAL_LE_LMUL_EQ] THEN
13994       MAP_EVERY UNDISCH_TAC
13995        [`norm(w - z:complex) = &2 / &3 * r`;
13996         `norm(z - y:complex) < r / &3`] THEN
13997       CONV_TAC NORM_ARITH];
13998     ALL_TAC] THEN
13999   REWRITE_TAC[RIGHT_EXISTS_AND_THM] THEN
14000   DISCH_THEN(fun th -> X_GEN_TAC `f:num->complex->complex` THEN
14001                        DISCH_TAC THEN MP_TAC th) THEN
14002   DISCH_THEN(MP_TAC o GENL [`i:num`; `r:num->num`] o
14003     SPECL [`(f:num->complex->complex) o (r:num->num)`; `i:num`]) THEN
14004   GEN_REWRITE_TAC
14005    (LAND_CONV o funpow 2 BINDER_CONV o LAND_CONV o ONCE_DEPTH_CONV)
14006    [o_THM] THEN ASM_REWRITE_TAC[GSYM o_ASSOC] THEN
14007   DISCH_THEN(MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
14008     SUBSEQUENCE_DIAGONALIZATION_LEMMA)) THEN
14009   ANTS_TAC THENL
14010    [SIMP_TAC[o_THM; GE] THEN REPEAT GEN_TAC THEN
14011     DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
14012     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
14013     MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `e:real` THEN
14014     MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
14015     DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN
14016     EXISTS_TAC `MAX M N` THEN
14017     REWRITE_TAC[ARITH_RULE `MAX m n <= x <=> m <= x /\ n <= x`] THEN
14018     ASM_MESON_TAC[LE_TRANS];
14019     ALL_TAC] THEN
14020   DISCH_THEN(MP_TAC o SPEC `I:num->num`) THEN
14021   REWRITE_TAC[I_O_ID; RIGHT_AND_EXISTS_THM] THEN
14022   ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
14023   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `r:num->num` THEN
14024   REWRITE_TAC[o_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
14025   SUBGOAL_THEN
14026    `!x. x IN s
14027         ==> ?l. !e. &0 < e
14028                     ==> ?N:num. !n. n >= N
14029                                 ==> norm((f:num->complex->complex) (r n) x - l)
14030                                     < e`
14031   MP_TAC THENL
14032    [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
14033     FIRST_X_ASSUM(MP_TAC o SPEC `{z:complex}`) THEN
14034     ASM_REWRITE_TAC[COMPACT_SING; SING_SUBSET] THEN
14035     DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
14036     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SKOLEM_THM]) THEN
14037     DISCH_THEN(X_CHOOSE_THEN `G:num->complex->complex` MP_TAC) THEN
14038     DISCH_THEN(LABEL_TAC "*" o SPEC `N:num`) THEN
14039     EXISTS_TAC `(G:num->complex->complex) N z` THEN
14040     X_GEN_TAC `e:real` THEN DISCH_TAC THEN
14041     REMOVE_THEN "*" (MP_TAC o SPEC `e:real`) THEN
14042     ASM_REWRITE_TAC[] THEN
14043     DISCH_THEN(X_CHOOSE_THEN `M:num` STRIP_ASSUME_TAC) THEN
14044     EXISTS_TAC `MAX M N` THEN
14045     REWRITE_TAC[ARITH_RULE `a >= MAX m n <=> a >= m /\ a >= n`] THEN
14046     ASM_MESON_TAC[GE_REFL];
14047     ALL_TAC] THEN
14048   GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [RIGHT_IMP_EXISTS_THM] THEN
14049   REWRITE_TAC[SKOLEM_THM; RIGHT_IMP_FORALL_THM; IMP_IMP] THEN
14050   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
14051   DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
14052   MATCH_MP_TAC(TAUT `b /\ (b ==> a) ==> a /\ b`) THEN CONJ_TAC THENL
14053    [MAP_EVERY X_GEN_TAC [`t:complex->bool`; `e:real`] THEN STRIP_TAC THEN
14054     FIRST_X_ASSUM(MP_TAC o SPEC `t:complex->bool`) THEN ASM_REWRITE_TAC[] THEN
14055     DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN
14056     FIRST_X_ASSUM(X_CHOOSE_THEN `h:complex->complex` (LABEL_TAC "*") o
14057       SPEC `N:num`) THEN
14058     SUBGOAL_THEN
14059      `!w. w IN t ==> g w = (h:complex->complex) w`
14060      (fun th -> ASM_MESON_TAC[GE_REFL; SUBSET; th]) THEN
14061     X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
14062     MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN
14063     EXISTS_TAC `\n:num. (f:num->complex->complex)(r n) w` THEN
14064     ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; LIM_SEQUENTIALLY] THEN
14065     REWRITE_TAC[GSYM GE; dist; o_THM] THEN
14066     ASM_MESON_TAC[SUBSET; GE_REFL];
14067     DISCH_THEN(LABEL_TAC "*")] THEN
14068   MATCH_MP_TAC HOLOMORPHIC_UNIFORM_SEQUENCE THEN
14069   EXISTS_TAC `(f:num->complex->complex) o (r:num->num)` THEN
14070   ASM_SIMP_TAC[o_THM] THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
14071   FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
14072   DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
14073   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
14074   STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
14075   REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN ASM_MESON_TAC[COMPACT_CBALL; GE]);;
14076
14077 (* ------------------------------------------------------------------------- *)
14078 (* Moebius functions are biholomorphisms of the unit disc.                   *)
14079 (* ------------------------------------------------------------------------- *)
14080
14081 let moebius_function = new_definition
14082   `!t w z. moebius_function t w z =
14083            cexp (ii * Cx t) * (z - w) / (Cx(&1) - cnj w * z)`;;
14084
14085 let MOEBIUS_FUNCTION_SIMPLE = prove
14086  (`!w z. moebius_function (&0) w z = (z - w) / (Cx(&1) - cnj w * z)`,
14087   REWRITE_TAC[moebius_function; COMPLEX_MUL_RZERO; CEXP_0; COMPLEX_MUL_LID]);;
14088
14089 let MOEBIUS_FUNCTION_EQ_ZERO = prove
14090   (`!t w. moebius_function t w w = Cx(&0)`,
14091    REWRITE_TAC [moebius_function] THEN CONV_TAC COMPLEX_FIELD);;
14092
14093 let MOEBIUS_FUNCTION_OF_ZERO = prove
14094   (`!t w. moebius_function t w (Cx(&0)) = -- cexp (ii * Cx t) * w`,
14095    REWRITE_TAC [moebius_function] THEN CONV_TAC COMPLEX_FIELD);;
14096
14097 let MOEBIUS_FUNCTION_NORM_LT_1 = prove
14098   (`!t w z. norm w < &1 /\ norm z < &1
14099             ==> norm (moebius_function t w z) < &1`,
14100    REPEAT STRIP_TAC THEN SUBGOAL_THEN
14101      `!a. &0 <= a /\ &0 < &1 - a pow 2 ==> a < &1` MATCH_MP_TAC THENL
14102    [GEN_TAC THEN ASM_CASES_TAC `&0 <= a` THEN
14103     ASM_REWRITE_TAC [REAL_FIELD `&1 - a pow 2 = (&1 - a) * (&1 + a)`;
14104                      REAL_MUL_POS_LT] THEN
14105     REAL_ARITH_TAC;
14106     ALL_TAC] THEN
14107    REWRITE_TAC [NORM_POS_LE] THEN
14108    SUBGOAL_THEN `~(Cx (&1) - cnj w * z = Cx (&0))` ASSUME_TAC THENL
14109    [REWRITE_TAC [COMPLEX_SUB_0] THEN
14110     SUBGOAL_THEN `~(norm (Cx(&1)) = norm (cnj w * z))`
14111      (fun th -> MESON_TAC [th]) THEN
14112     REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL; COMPLEX_NORM_CNJ] THEN
14113     MATCH_MP_TAC (REAL_ARITH `a * b < &1  ==> ~(&1 = a * b)`) THEN
14114     STRIP_ASSUME_TAC (NORM_ARITH `norm (z:complex) = &0 \/ &0 < norm z`) THENL
14115     [ASM_REWRITE_TAC [REAL_MUL_RZERO; REAL_LT_01];
14116      MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (z:complex)` THEN
14117      ASM_SIMP_TAC[REAL_LT_RMUL; REAL_MUL_LID]];
14118    ALL_TAC] THEN
14119    SUBGOAL_THEN
14120     `&1 - norm (moebius_function t w z) pow 2 =
14121      ((&1 - norm w pow 2) / (norm (Cx(&1) - cnj w * z) pow 2)) *
14122      (&1 - norm z pow 2)`
14123    SUBST1_TAC THENL
14124    [REWRITE_TAC [moebius_function;
14125                  GSYM CX_INJ; CX_SUB; CX_MUL; CX_DIV; CX_POW; CNJ_SUB; CNJ_CX;
14126                  CNJ_MUL; CNJ_DIV; CNJ_CNJ; COMPLEX_NORM_POW_2] THEN
14127     SUBGOAL_THEN
14128       `cnj (cexp (ii * Cx t)) * (cexp (ii * Cx t)) = Cx(&1) /\
14129        ~(Cx(&1) - cnj w * z = Cx(&0)) /\ ~(Cx(&1) - w * cnj z = Cx(&0))`
14130      MP_TAC THENL [ALL_TAC; CONV_TAC COMPLEX_FIELD] THEN
14131     REWRITE_TAC [CNJ_CEXP; CNJ_MUL; CNJ_II; CNJ_CX;
14132                   COMPLEX_MUL_LNEG; CEXP_NEG_LMUL] THEN ASM_REWRITE_TAC [] THEN
14133     SUBGOAL_THEN `~(cnj (Cx (&1) - cnj w * z) = Cx (&0))` MP_TAC THENL
14134     [ASM_REWRITE_TAC [CNJ_EQ_0];
14135      REWRITE_TAC [CNJ_SUB; CNJ_CX; CNJ_MUL; CNJ_CNJ]];
14136     SUBGOAL_THEN `!u:complex. norm u < &1 ==> &0 < &1 - norm u pow 2`
14137       ASSUME_TAC THENL
14138     [REWRITE_TAC [REAL_FIELD `!a. &1 - a pow 2 = (&1 - a) * (&1 + a)`] THEN
14139      ASM_SIMP_TAC [REAL_LT_MUL; REAL_SUB_LT; REAL_LTE_ADD; REAL_LT_01;
14140                    NORM_POS_LE];
14141      SUBGOAL_THEN `&0 < norm (Cx (&1) - cnj w * z) pow 2`
14142       (fun th -> ASM_MESON_TAC [th; REAL_LT_MUL; REAL_LT_DIV]) THEN
14143      ASM_REWRITE_TAC [REAL_RING `!a:real. a pow 2 =  a * a`;
14144                       REAL_LT_SQUARE; COMPLEX_NORM_ZERO]]]);;
14145
14146 let MOEBIUS_FUNCTION_HOLOMORPHIC = prove
14147   (`!t w. norm w < &1 ==> moebius_function t w holomorphic_on ball(Cx(&0),&1)`,
14148    let LEMMA_1 = prove
14149     (`!a b:complex. norm a < &1 /\ norm b < &1 ==> ~(Cx(&1) - a * b = Cx(&0))`,
14150      GEN_TAC THEN GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC [COMPLEX_SUB_0] THEN
14151      SUBGOAL_THEN `~(norm (Cx(&1)) = norm (a * b))`
14152        (fun th -> MESON_TAC[th]) THEN
14153      REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL] THEN
14154      MATCH_MP_TAC (REAL_ARITH `!x y. y < x ==> ~(x = y)`) THEN
14155      ASM_CASES_TAC `b = Cx(&0)` THEN
14156      ASM_REWRITE_TAC [COMPLEX_NORM_NUM; REAL_MUL_RZERO; REAL_LT_01] THEN
14157      MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (b:complex)` THEN
14158      CONJ_TAC THENL
14159      [MATCH_MP_TAC REAL_LT_RMUL THEN ASM_REWRITE_TAC [COMPLEX_NORM_NZ];
14160       ASM_REWRITE_TAC [REAL_MUL_LID]]) in
14161    REPEAT STRIP_TAC THEN
14162    SUBST1_TAC (GSYM (ISPEC `moebius_function t w` ETA_AX)) THEN
14163    REWRITE_TAC [moebius_function] THEN
14164    MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN  CONJ_TAC THENL
14165    [MATCH_MP_TAC (REWRITE_RULE [o_DEF] HOLOMORPHIC_ON_COMPOSE_GEN) THEN
14166     EXISTS_TAC `(:complex)` THEN REWRITE_TAC [HOLOMORPHIC_ON_CEXP; IN_UNIV] THEN
14167     SIMP_TAC [HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_CONST];
14168     MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
14169     SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST;
14170              HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_MUL] THEN
14171     ASM_SIMP_TAC[COMPLEX_IN_BALL_0; LEMMA_1; COMPLEX_NORM_CNJ]]);;
14172
14173 let MOEBIUS_FUNCTION_COMPOSE = prove
14174  (`!w1 w2 z.
14175      -- w1 = w2  /\ norm w1 < &1 /\ norm z < &1
14176      ==> moebius_function (&0) w1 (moebius_function (&0) w2 z) = z`,
14177   let LEMMA_1 = prove
14178    (`!a b:complex. norm a < &1 /\ norm b < &1
14179                    ==> ~(Cx(&1) - a * b = Cx(&0))`,
14180     GEN_TAC THEN GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC [COMPLEX_SUB_0] THEN
14181     SUBGOAL_THEN `~(norm (Cx(&1)) = norm (a * b))`
14182       (fun th -> MESON_TAC[th]) THEN
14183     REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL] THEN
14184     MATCH_MP_TAC (REAL_ARITH `!x y. y < x ==> ~(x = y)`) THEN
14185     ASM_CASES_TAC `b = Cx(&0)` THEN
14186     ASM_REWRITE_TAC [COMPLEX_NORM_NUM; REAL_MUL_RZERO; REAL_LT_01] THEN
14187     MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (b:complex)` THEN
14188     CONJ_TAC THENL
14189     [MATCH_MP_TAC REAL_LT_RMUL THEN ASM_REWRITE_TAC [COMPLEX_NORM_NZ];
14190      ASM_REWRITE_TAC [REAL_MUL_LID]]) in
14191   let LEMMA_1_ALT = prove
14192     (`!a b:complex. norm a < &1 /\ norm b < &1
14193                     ==> ~(Cx(&1) + a * b = Cx(&0))`,
14194      REPEAT GEN_TAC THEN STRIP_TAC THEN
14195      SUBST1_TAC (COMPLEX_RING `a : complex = -- (-- a)`) THEN
14196      ABBREV_TAC `u : complex= -- a` THEN
14197      REWRITE_TAC [COMPLEX_MUL_LNEG; GSYM complex_sub] THEN
14198      MATCH_MP_TAC LEMMA_1 THEN EXPAND_TAC "u" THEN
14199      ASM_REWRITE_TAC[NORM_NEG]) in
14200   REPEAT STRIP_TAC THEN
14201   SUBGOAL_THEN `norm (w2:complex) < &1` ASSUME_TAC THENL
14202    [EXPAND_TAC "w2" THEN ASM_REWRITE_TAC [NORM_NEG]; ALL_TAC] THEN
14203   REWRITE_TAC [moebius_function; COMPLEX_MUL_RZERO;
14204                CEXP_0; COMPLEX_MUL_LID] THEN
14205   MATCH_MP_TAC (COMPLEX_FIELD
14206      `!a b c. ~(b = Cx(&0)) /\ a = b * c ==> a / b = c`) THEN
14207   CONJ_TAC THENL
14208    [ALL_TAC; MP_TAC (SPECL [`cnj w2`;`z:complex`] LEMMA_1) THEN
14209     ASM_REWRITE_TAC [COMPLEX_NORM_CNJ] THEN EXPAND_TAC "w2" THEN
14210     REWRITE_TAC [CNJ_NEG] THEN CONV_TAC COMPLEX_FIELD] THEN
14211   MATCH_MP_TAC (COMPLEX_FIELD
14212       `!a b c d. ~(d = Cx(&0)) /\ ~(d * a - b * c  = Cx(&0))
14213                  ==> ~(a - b * c / d  = Cx(&0))`) THEN
14214   ASM_SIMP_TAC [LEMMA_1; COMPLEX_NORM_CNJ] THEN
14215   ASM_REWRITE_TAC [COMPLEX_MUL_RID] THEN
14216   SUBGOAL_THEN
14217       `Cx(&1) - cnj w2 * z - cnj w1 * (z - w2) =
14218        Cx(&1) + cnj w1 * w2` SUBST1_TAC THENL
14219    [EXPAND_TAC "w2" THEN REWRITE_TAC [CNJ_NEG] THEN CONV_TAC COMPLEX_RING;
14220     ASM_SIMP_TAC [LEMMA_1_ALT; COMPLEX_NORM_CNJ]]);;
14221
14222 let BALL_BIHOLOMORPHISM_EXISTS = prove
14223  (`!a. a IN ball(Cx(&0),&1)
14224        ==> ?f g. f(a) = Cx(&0) /\
14225                  f holomorphic_on ball (Cx(&0),&1) /\
14226                  (!z. z IN ball (Cx(&0),&1) ==> f z IN ball (Cx(&0),&1)) /\
14227                  g holomorphic_on ball (Cx(&0),&1) /\
14228                  (!z. z IN ball (Cx(&0),&1) ==> g z IN ball (Cx(&0),&1)) /\
14229                  (!z. z IN ball (Cx(&0),&1) ==> f (g z) = z) /\
14230                  (!z. z IN ball (Cx(&0),&1) ==> g (f z) = z)`,
14231   REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
14232   EXISTS_TAC `moebius_function (&0) a` THEN
14233   EXISTS_TAC `moebius_function (&0) (--a)` THEN
14234   ASM_SIMP_TAC[COMPLEX_IN_BALL_0; MOEBIUS_FUNCTION_COMPOSE; COMPLEX_NEG_NEG;
14235                NORM_NEG] THEN
14236   ASM_SIMP_TAC[MOEBIUS_FUNCTION_NORM_LT_1; NORM_NEG;
14237                MOEBIUS_FUNCTION_HOLOMORPHIC; MOEBIUS_FUNCTION_EQ_ZERO]);;
14238
14239 let BALL_BIHOLOMORPHISM_MOEBIUS_FUNCTION = prove
14240   (`!f g.
14241       f holomorphic_on ball (Cx(&0),&1) /\
14242       (!z. z IN ball (Cx(&0),&1) ==> f z IN ball (Cx(&0),&1)) /\
14243       g holomorphic_on ball (Cx(&0),&1) /\
14244       (!z. z IN ball (Cx(&0),&1) ==> g z IN ball (Cx(&0),&1)) /\
14245       (!z. z IN ball (Cx(&0),&1) ==> f (g z) = z) /\
14246       (!z. z IN ball (Cx(&0),&1) ==> g (f z) = z)
14247       ==> ?t w. w IN ball (Cx(&0),&1) /\
14248                 (!z. z IN ball (Cx(&0),&1) ==> f z = moebius_function t w z)`,
14249    let LEMMA_1 = prove
14250      (`!a b:complex. norm a < &1 /\ norm b < &1
14251                      ==> ~(Cx(&1) - a * b = Cx(&0))`,
14252       GEN_TAC THEN GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC [COMPLEX_SUB_0] THEN
14253       SUBGOAL_THEN `~(norm (Cx(&1)) = norm (a * b))`
14254         (fun th -> MESON_TAC[th]) THEN
14255       REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL] THEN
14256       MATCH_MP_TAC (REAL_ARITH `!x y. y < x ==> ~(x = y)`) THEN
14257       ASM_CASES_TAC `b = Cx(&0)` THEN
14258       ASM_REWRITE_TAC [COMPLEX_NORM_NUM; REAL_MUL_RZERO; REAL_LT_01] THEN
14259       MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (b:complex)` THEN
14260       CONJ_TAC THENL
14261       [MATCH_MP_TAC REAL_LT_RMUL THEN ASM_REWRITE_TAC [COMPLEX_NORM_NZ];
14262        ASM_REWRITE_TAC [REAL_MUL_LID]]) in
14263    let LEMMA_2 = prove
14264      (`!t w s z. norm w < &1 /\ norm z < &1
14265                  ==> moebius_function t w (cexp (ii * Cx s) * z) =
14266                      moebius_function (t + s) (cexp (-- (ii * Cx s)) * w) z`,
14267       REPEAT STRIP_TAC THEN
14268       REWRITE_TAC[moebius_function; CX_ADD; COMPLEX_ADD_LDISTRIB; CEXP_ADD;
14269                   GSYM COMPLEX_MUL_ASSOC; COMPLEX_EQ_MUL_LCANCEL; CEXP_NZ;
14270                CNJ_MUL] THEN
14271       MATCH_MP_TAC (COMPLEX_FIELD
14272         `!a b c d e. ~(b = Cx(&0)) /\ ~(e = Cx(&0)) /\ e * a = b * c * d
14273                      ==> a / b = c * d / e`) THEN CONJ_TAC THENL
14274       [MATCH_MP_TAC LEMMA_1 THEN
14275        ASM_REWRITE_TAC [COMPLEX_NORM_CNJ; COMPLEX_NORM_MUL; NORM_CEXP_II;
14276                         REAL_MUL_LID];
14277        ALL_TAC] THEN
14278       CONJ_TAC THENL
14279       [REWRITE_TAC [COMPLEX_MUL_ASSOC] THEN MATCH_MP_TAC LEMMA_1 THEN
14280        ASM_REWRITE_TAC [COMPLEX_NORM_MUL; COMPLEX_NORM_CNJ; COMPLEX_NEG_RMUL;
14281                         GSYM CX_NEG; NORM_CEXP_II; REAL_MUL_LID];
14282        REWRITE_TAC [CNJ_CEXP; CNJ_NEG; CNJ_MUL; CNJ_II; CNJ_CX;
14283                     COMPLEX_MUL_LNEG; COMPLEX_NEG_NEG; CEXP_NEG] THEN
14284        ABBREV_TAC `a = cexp (ii * Cx s)` THEN
14285        SUBGOAL_THEN `inv a * a = Cx(&1)` MP_TAC THENL
14286        [ALL_TAC; CONV_TAC COMPLEX_RING] THEN
14287        MATCH_MP_TAC COMPLEX_MUL_LINV THEN EXPAND_TAC "a" THEN
14288        REWRITE_TAC [CEXP_NZ]]) in
14289    REWRITE_TAC [COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
14290    ABBREV_TAC `w:complex = f (Cx(&0))` THEN
14291    SUBGOAL_THEN `norm(w:complex) < &1` ASSUME_TAC THENL
14292    [ASM_MESON_TAC [COMPLEX_NORM_NUM; REAL_LT_01]; ALL_TAC] THEN
14293    SUBGOAL_THEN
14294     `?t. !z. z IN ball (Cx(&0),&1)
14295              ==> moebius_function (&0) w (f z) = cexp (ii * Cx t) * z`
14296     STRIP_ASSUME_TAC THENL
14297    [ALL_TAC;
14298     EXISTS_TAC `t:real` THEN EXISTS_TAC `-- (cexp(-- (ii * Cx t)) * w)` THEN
14299     ASM_REWRITE_TAC [NORM_NEG; COMPLEX_NORM_MUL; COMPLEX_NEG_RMUL;
14300                      GSYM CX_NEG; NORM_CEXP_II; REAL_MUL_LID] THEN
14301     GEN_TAC THEN DISCH_TAC THEN EQ_TRANS_TAC
14302       `moebius_function (&0) (--w)
14303          (moebius_function (&0) w (f (z:complex)))` THENL
14304     [MATCH_MP_TAC EQ_SYM THEN MATCH_MP_TAC MOEBIUS_FUNCTION_COMPOSE THEN
14305      ASM_SIMP_TAC [COMPLEX_NEG_NEG; NORM_NEG];
14306      ASM_SIMP_TAC[COMPLEX_IN_BALL_0] THEN ASM_SIMP_TAC[LEMMA_2; NORM_NEG] THEN
14307      REWRITE_TAC [REAL_ADD_LID; CX_NEG; COMPLEX_MUL_RNEG]]] THEN
14308    MATCH_MP_TAC SECOND_CARTAN_THM_DIM_1 THEN EXISTS_TAC
14309      `\z. g (moebius_function (&0) (--w) z) : complex` THEN
14310    REWRITE_TAC [COMPLEX_IN_BALL_0] THEN REWRITE_TAC [REAL_LT_01] THEN
14311    CONJ_TAC THENL
14312    [MATCH_MP_TAC (REWRITE_RULE [o_DEF] HOLOMORPHIC_ON_COMPOSE_GEN) THEN
14313     EXISTS_TAC `ball(Cx(&0),&1)` THEN
14314     ASM_SIMP_TAC [ETA_AX; MOEBIUS_FUNCTION_HOLOMORPHIC; COMPLEX_IN_BALL_0];
14315     ALL_TAC] THEN CONJ_TAC THENL [ASM_SIMP_TAC [MOEBIUS_FUNCTION_NORM_LT_1];
14316     ALL_TAC] THEN
14317    CONJ_TAC THENL [ASM_REWRITE_TAC [MOEBIUS_FUNCTION_EQ_ZERO]; ALL_TAC] THEN
14318    CONJ_TAC THENL
14319    [MATCH_MP_TAC (REWRITE_RULE [o_DEF] HOLOMORPHIC_ON_COMPOSE_GEN) THEN
14320     EXISTS_TAC `ball(Cx(&0),&1)` THEN
14321     ASM_SIMP_TAC [COMPLEX_IN_BALL_0; MOEBIUS_FUNCTION_NORM_LT_1;
14322                   NORM_NEG] THEN
14323     ASM_SIMP_TAC [ETA_AX; MOEBIUS_FUNCTION_HOLOMORPHIC; NORM_NEG];
14324     ALL_TAC] THEN CONJ_TAC THENL
14325    [ASM_SIMP_TAC [MOEBIUS_FUNCTION_NORM_LT_1; NORM_NEG]; ALL_TAC] THEN
14326    CONJ_TAC THENL
14327    [ASM_REWRITE_TAC [MOEBIUS_FUNCTION_OF_ZERO; COMPLEX_MUL_RZERO; CEXP_0;
14328                      GSYM COMPLEX_NEG_LMUL; COMPLEX_MUL_LID;
14329                       COMPLEX_NEG_NEG] THEN
14330     ASM_MESON_TAC [COMPLEX_NORM_0; REAL_LT_01];
14331     ALL_TAC] THEN CONJ_TAC THENL
14332    [ALL_TAC;
14333     ASM_SIMP_TAC [REWRITE_RULE [COMPLEX_NEG_NEG; NORM_NEG]
14334          (SPECL [`--w:complex`;`w:complex`] MOEBIUS_FUNCTION_COMPOSE)]] THEN
14335     REPEAT STRIP_TAC THEN SUBGOAL_THEN
14336      `f (g (moebius_function (&0) (--w) z) : complex) =
14337       (moebius_function (&0) (--w) z)`
14338      SUBST1_TAC THENL
14339    [FIRST_X_ASSUM MATCH_MP_TAC THEN
14340     ASM_SIMP_TAC [MOEBIUS_FUNCTION_NORM_LT_1; NORM_NEG];
14341     MATCH_MP_TAC MOEBIUS_FUNCTION_COMPOSE THEN ASM_REWRITE_TAC []]);;
14342
14343 (* ------------------------------------------------------------------------- *)
14344 (* Some simple but useful cases of Hurwitz's theorem.                        *)
14345 (* ------------------------------------------------------------------------- *)
14346
14347 let HURWITZ_NO_ZEROS = prove
14348  (`!f:num->complex->complex g s.
14349         open s /\ connected s /\
14350         (!n. (f n) holomorphic_on s) /\ g holomorphic_on s /\
14351         (!k e. compact k /\ k SUBSET s /\ &0 < e
14352                ==> ?N. !n x. n >= N /\ x IN k ==> norm(f n x - g x) < e) /\
14353         ~(?c. !z. z IN s ==> g z = c) /\
14354         (!n z. z IN s ==> ~(f n z = Cx(&0)))
14355         ==> (!z. z IN s ==> ~(g z = Cx(&0)))`,
14356   REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `z0:complex` THEN
14357   REPEAT DISCH_TAC THEN
14358   MP_TAC(ISPECL [`g:complex->complex`; `s:complex->bool`; `z0:complex`]
14359    HOLOMORPHIC_FACTOR_ZERO_NONCONSTANT) THEN ASM_REWRITE_TAC[] THEN
14360   REWRITE_TAC[NOT_EXISTS_THM] THEN
14361   MAP_EVERY X_GEN_TAC [`h:complex->complex`; `r:real`; `m:num`] THEN
14362   STRIP_TAC THEN
14363   MP_TAC(ISPECL
14364    [`sequentially`; `\n:num z. complex_derivative (f n) z / f n z`;
14365     `\z. complex_derivative g z / g z`;  `z0:complex`; `r / &2`]
14366    PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH) THEN
14367   ASM_REWRITE_TAC[REAL_HALF; TRIVIAL_LIMIT_SEQUENTIALLY; NOT_IMP] THEN
14368   SUBGOAL_THEN
14369    `!n:num. ((\z. complex_derivative (f n) z / f n z)
14370              has_path_integral (Cx(&0))) (circlepath(z0,r / &2))`
14371   ASSUME_TAC THENL
14372    [X_GEN_TAC `n:num` THEN MATCH_MP_TAC CAUCHY_THEOREM_DISC_SIMPLE THEN
14373     MAP_EVERY EXISTS_TAC [`z0:complex`; `r:real`] THEN
14374     ASM_SIMP_TAC[VALID_PATH_CIRCLEPATH; PATHSTART_CIRCLEPATH;
14375                  PATHFINISH_CIRCLEPATH; PATH_IMAGE_CIRCLEPATH;
14376                  REAL_HALF; REAL_LT_IMP_LE] THEN
14377     REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
14378     REWRITE_TAC[SUBSET; IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
14379     ASM_SIMP_TAC[IN_ELIM_THM; REAL_ARITH `&0 < r ==> r / &2 < r`] THEN
14380     MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN REPEAT CONJ_TAC THENL
14381      [REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
14382       REWRITE_TAC[OPEN_BALL];
14383       REWRITE_TAC[ETA_AX];
14384       ASM_MESON_TAC[SUBSET]] THEN
14385     ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET];
14386     ALL_TAC] THEN
14387   REPEAT CONJ_TAC THENL
14388    [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
14389     REWRITE_TAC[path_integrable_on] THEN ASM_MESON_TAC[];
14390     MATCH_MP_TAC UNIFORM_LIM_COMPLEX_DIV THEN
14391     REWRITE_TAC[LEFT_EXISTS_AND_THM; CONJ_ASSOC] THEN
14392     REWRITE_TAC[RIGHT_EXISTS_AND_THM; GSYM CONJ_ASSOC] THEN
14393     REWRITE_TAC[LEFT_EXISTS_AND_THM] THEN
14394
14395     ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_HALF; REAL_LT_IMP_LE] THEN
14396     REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
14397     REWRITE_TAC[IN_ELIM_THM] THEN REPEAT CONJ_TAC THENL
14398      [MP_TAC(ISPEC `IMAGE (complex_derivative g) {w | norm(w - z0) = r / &2}`
14399         COMPACT_IMP_BOUNDED) THEN
14400       ANTS_TAC THENL
14401        [MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
14402         REWRITE_TAC[o_DEF;
14403          REWRITE_RULE[sphere; NORM_ARITH `dist(w:real^N,z) = norm(z - w)`]
14404                     COMPACT_SPHERE] THEN
14405         MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
14406         MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
14407         EXISTS_TAC `s:complex->bool` THEN
14408         ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE] THEN
14409         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
14410           SUBSET_TRANS)) THEN
14411         REWRITE_TAC[SUBSET; IN_BALL; IN_ELIM_THM] THEN
14412         UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH;
14413         REWRITE_TAC[bounded; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
14414         MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN DISCH_TAC THEN
14415         MATCH_MP_TAC ALWAYS_EVENTUALLY THEN ASM_SIMP_TAC[]];
14416       MP_TAC(ISPEC `IMAGE (norm o (g:complex->complex))
14417           {w | norm(w - z0) = r / &2}`
14418           COMPACT_ATTAINS_INF) THEN
14419       REWRITE_TAC[EXISTS_IN_IMAGE; FORALL_IN_IMAGE; IMAGE_EQ_EMPTY] THEN
14420       REWRITE_TAC[GSYM IMAGE_o; FORALL_IN_GSPEC; EXISTS_IN_GSPEC; o_THM] THEN
14421       ANTS_TAC THENL
14422        [CONJ_TAC THENL
14423          [MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
14424           REWRITE_TAC[o_DEF;
14425             REWRITE_RULE[sphere; NORM_ARITH `dist(w:real^N,z) = norm(z - w)`]
14426                         COMPACT_SPHERE] THEN
14427           MATCH_MP_TAC CONTINUOUS_ON_LIFT_NORM_COMPOSE THEN
14428           MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
14429           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14430             HOLOMORPHIC_ON_SUBSET)) THEN
14431           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
14432             SUBSET_TRANS)) THEN
14433           REWRITE_TAC[SUBSET; IN_BALL; IN_ELIM_THM] THEN
14434           UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH;
14435           REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN
14436           EXISTS_TAC `z0 + Cx(r / &2)` THEN
14437           REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^N = b`] THEN
14438           REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC];
14439         DISCH_THEN(X_CHOOSE_THEN `ww:complex` MP_TAC) THEN
14440         STRIP_TAC THEN EXISTS_TAC `norm((g:complex->complex) ww)` THEN
14441         ASM_SIMP_TAC[ALWAYS_EVENTUALLY; COMPLEX_NORM_NZ] THEN
14442         DISCH_THEN(ASSUME_TAC o REWRITE_RULE[COMPLEX_NORM_ZERO]) THEN
14443         UNDISCH_TAC `!w. w IN ball(z0,r) ==> g w = (w - z0) pow m * h w` THEN
14444         DISCH_THEN(MP_TAC o SPEC `ww:complex`) THEN
14445         CONV_TAC(ONCE_DEPTH_CONV SYM_CONV) THEN
14446         ASM_SIMP_TAC[COMPLEX_ENTIRE; COMPLEX_POW_EQ_0] THEN
14447         REWRITE_TAC[IN_BALL; GSYM COMPLEX_NORM_ZERO] THEN
14448         ASM_REWRITE_TAC[ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
14449         ASM_REAL_ARITH_TAC];
14450       X_GEN_TAC `e:real` THEN DISCH_TAC THEN
14451       FIRST_ASSUM(MP_TAC o SPECL
14452        [`cball(z0:complex,&3 * r / &4)`; `r / &4 * e / &2`]) THEN
14453       REWRITE_TAC[COMPACT_CBALL] THEN ANTS_TAC THENL
14454        [ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
14455         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
14456           SUBSET_TRANS)) THEN
14457         REWRITE_TAC[SUBSET; IN_BALL; IN_CBALL; IN_ELIM_THM] THEN
14458         UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH;
14459         REWRITE_TAC[GE; EVENTUALLY_SEQUENTIALLY; IN_CBALL; dist] THEN
14460         MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
14461         MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `n:num` THEN
14462         DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
14463         ASM_REWRITE_TAC[] THEN DISCH_TAC] THEN
14464       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
14465       MP_TAC(ISPECL
14466        [`\z. (f:num->complex->complex) n z - g z`;
14467         `w:complex`; `Cx(&0)`; `r / &4`; `r / &4 * e / &2`; `1`]
14468         CAUCHY_HIGHER_COMPLEX_DERIVATIVE_BOUND) THEN
14469       REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_1; COMPLEX_IN_BALL_0] THEN
14470       ANTS_TAC THENL
14471        [CONJ_TAC THENL [ASM_REAL_ARITH_TAC; CONV_TAC NUM_REDUCE_CONV] THEN
14472         REPEAT CONJ_TAC THENL
14473          [ALL_TAC;
14474           MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
14475           X_GEN_TAC `y:complex` THEN REWRITE_TAC[IN_BALL] THEN
14476           DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
14477           MAP_EVERY UNDISCH_TAC
14478            [`norm(w - z0:complex) = r / &2`; `dist(w:complex,y) < r / &4`] THEN
14479           CONV_TAC NORM_ARITH] THEN
14480         (MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
14481          CONJ_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
14482          EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[ETA_AX] THEN
14483          FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
14484           SUBSET_TRANS)) THEN
14485          REWRITE_TAC[SUBSET; IN_BALL; IN_CBALL; IN_ELIM_THM] THEN
14486          UNDISCH_TAC `norm(w - z0:complex) = r / &2` THEN
14487          UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH);
14488         CONV_TAC NUM_REDUCE_CONV THEN
14489         ASM_SIMP_TAC[REAL_FIELD
14490          `&0 < r /\ &0 < e
14491           ==> &1 * (r / &4 * e / &2) / (r / &4) pow 1 = e / &2`] THEN
14492         MATCH_MP_TAC(NORM_ARITH
14493          `x = y /\ &0 < e ==> norm(x) <= e / &2 ==> norm(y) < e`) THEN
14494         ASM_REWRITE_TAC[] THEN
14495         MATCH_MP_TAC COMPLEX_DERIVATIVE_SUB THEN CONJ_TAC THEN
14496         MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
14497         EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
14498         FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
14499         ASM_REWRITE_TAC[IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
14500         ASM_REAL_ARITH_TAC];
14501       X_GEN_TAC `e:real` THEN DISCH_TAC THEN
14502       REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
14503       FIRST_X_ASSUM(MP_TAC o SPECL
14504        [`{w:complex | norm(w - z0) = r / &2}`; `e:real`]) THEN
14505       ASM_REWRITE_TAC[GE; IN_ELIM_THM;
14506          REWRITE_RULE[sphere; NORM_ARITH `dist(w:real^N,z) = norm(z - w)`]
14507                     COMPACT_SPHERE] THEN
14508       ANTS_TAC THENL [ALL_TAC; MESON_TAC[]] THEN
14509       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
14510           SUBSET_TRANS)) THEN
14511       REWRITE_TAC[SUBSET; IN_BALL; IN_ELIM_THM] THEN
14512       UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH];
14513     FIRST_ASSUM(ASSUME_TAC o GEN `n:num` o MATCH_MP PATH_INTEGRAL_UNIQUE o
14514         SPEC `n:num`) THEN
14515     DISCH_THEN(MP_TAC o CONJUNCT2) THEN
14516     ASM_REWRITE_TAC[LIM_CONST_EQ; TRIVIAL_LIMIT_SEQUENTIALLY] THEN
14517     MATCH_MP_TAC(COMPLEX_RING
14518      `!q r. p = q /\ q = r /\ ~(r = Cx(&0)) ==> ~(Cx(&0) = p)`) THEN
14519     MAP_EVERY EXISTS_TAC
14520      [`path_integral (circlepath(z0,r / &2))
14521                      (\z. Cx(&m) / (z - z0) +
14522                           complex_derivative h z / h z)`;
14523       `Cx(&2) * Cx pi * ii * Cx(&m)`] THEN
14524     REPEAT CONJ_TAC THENL
14525      [MATCH_MP_TAC PATH_INTEGRAL_EQ THEN X_GEN_TAC `w:complex` THEN
14526       ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; IN_ELIM_THM; REAL_HALF;
14527         REAL_LT_IMP_LE; sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
14528       ASM_CASES_TAC `w:complex = z0` THEN
14529       ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THENL
14530        [ASM_REAL_ARITH_TAC; DISCH_TAC] THEN
14531       SUBGOAL_THEN `w IN ball(z0:complex,r)` ASSUME_TAC THENL
14532        [REWRITE_TAC[IN_BALL] THEN
14533         MAP_EVERY UNDISCH_TAC [`norm (w - z0) = r / &2`; `&0 < r`] THEN
14534         CONV_TAC NORM_ARITH;
14535         ALL_TAC] THEN
14536       ASM_SIMP_TAC[] THEN
14537       ASM_SIMP_TAC[COMPLEX_ENTIRE; COMPLEX_POW_EQ_0; COMPLEX_SUB_0;
14538             COMPLEX_FIELD `~(y = Cx(&0)) ==> (x / y = w <=> x = y * w)`] THEN
14539       ASM_SIMP_TAC[COMPLEX_FIELD
14540        `~(h = Cx(&0)) ==> (m * h) * (x + y / h) = m * y + m * h * x`] THEN
14541       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
14542       MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
14543       EXISTS_TAC `\w:complex. (w - z0) pow m * h w` THEN
14544       EXISTS_TAC `ball(z0:complex,r)` THEN ASM_SIMP_TAC[OPEN_BALL] THEN
14545       SUBGOAL_THEN
14546        `(w - z0) pow m * h w * Cx(&m) / (w - z0) =
14547         (Cx(&m) * (w - z0) pow (m - 1)) * h w`
14548       SUBST1_TAC THENL
14549        [MATCH_MP_TAC(COMPLEX_FIELD
14550          `w * mm = z /\ ~(w = Cx(&0))
14551           ==> z * h * m / w = (m * mm) * h`) THEN
14552         ASM_REWRITE_TAC[COMPLEX_SUB_0; GSYM(CONJUNCT2 complex_pow)] THEN
14553         AP_TERM_TAC THEN ASM_ARITH_TAC;
14554         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_MUL_AT THEN CONJ_TAC THENL
14555          [COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING;
14556           REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14557           ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_BALL]]];
14558       GEN_REWRITE_TAC RAND_CONV [GSYM COMPLEX_ADD_RID] THEN
14559       MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
14560       MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN CONJ_TAC THENL
14561        [MATCH_MP_TAC CAUCHY_INTEGRAL_CIRCLEPATH_SIMPLE THEN
14562         ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_HALF; HOLOMORPHIC_ON_CONST];
14563         MATCH_MP_TAC CAUCHY_THEOREM_DISC_SIMPLE THEN
14564         MAP_EVERY EXISTS_TAC [`z0:complex`; `r:real`] THEN
14565         ASM_SIMP_TAC[VALID_PATH_CIRCLEPATH; PATHSTART_CIRCLEPATH;
14566                      PATHFINISH_CIRCLEPATH; PATH_IMAGE_CIRCLEPATH;
14567                      REAL_HALF; REAL_LT_IMP_LE] THEN
14568         REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
14569         REWRITE_TAC[SUBSET; IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
14570         ASM_SIMP_TAC[IN_ELIM_THM; REAL_ARITH `&0 < r ==> r / &2 < r`] THEN
14571         MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN ASM_REWRITE_TAC[ETA_AX] THEN
14572         MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
14573         ASM_REWRITE_TAC[OPEN_BALL]];
14574       REWRITE_TAC[COMPLEX_ENTIRE; CX_INJ; PI_NZ; II_NZ; REAL_OF_NUM_EQ] THEN
14575       ASM_SIMP_TAC[LE_1; ARITH_EQ] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
14576       ASM_REWRITE_TAC[CENTRE_IN_BALL]]]);;
14577
14578 let HURWITZ_INJECTIVE = prove
14579  (`!f:num->complex->complex g s.
14580     open s /\ connected s /\
14581     (!n. (f n) holomorphic_on s) /\ g holomorphic_on s /\
14582     (!k e. compact k /\ k SUBSET s /\ &0 < e
14583            ==> ?N. !n x. n >= N /\ x IN k ==> norm(f n x - g x) < e) /\
14584     ~(?c. !z. z IN s ==> g z = c) /\
14585     (!n w z. w IN s /\ z IN s /\ f n w = f n z ==> w = z)
14586     ==> (!w z. w IN s /\ z IN s /\ g w = g z ==> w = z)`,
14587   REPEAT GEN_TAC THEN STRIP_TAC THEN
14588   MAP_EVERY X_GEN_TAC [`z1:complex`; `z2:complex`] THEN
14589   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
14590   ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN REPEAT DISCH_TAC THEN
14591   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN
14592   DISCH_THEN(MP_TAC o SPEC `(g:complex->complex) z2`) THEN
14593   REWRITE_TAC[] THEN X_GEN_TAC `z0:complex` THEN
14594   ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN REPEAT DISCH_TAC THEN
14595   RULE_ASSUM_TAC(REWRITE_RULE[MESON[]
14596    `(!x y. x IN s /\ y IN s /\ g x = g y ==> x = y) <=>
14597     (!x y. x IN s /\ y IN s ==> (g x = g y <=> x = y))`]) THEN
14598   MP_TAC(ISPECL
14599    [`\z. (g:complex->complex) z - g z1`; `s:complex->bool`;
14600     `z2:complex`; `z0:complex`]
14601         ISOLATED_ZEROS) THEN
14602   ASM_SIMP_TAC[COMPLEX_SUB_0; HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID;
14603                HOLOMORPHIC_ON_CONST] THEN
14604   DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
14605   MP_TAC(ISPECL
14606    [`\n z. (f:num->complex->complex) n z - f n z1`;
14607     `\z. (g:complex->complex) z - g z1`; `s DELETE (z1:complex)`]
14608         HURWITZ_NO_ZEROS) THEN
14609   REWRITE_TAC[NOT_IMP; COMPLEX_SUB_0] THEN REPEAT CONJ_TAC THENL
14610    [ASM_SIMP_TAC[OPEN_DELETE];
14611     ASM_SIMP_TAC[CONNECTED_OPEN_DELETE; DIMINDEX_2; LE_REFL];
14612     GEN_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
14613     EXISTS_TAC `s:complex->bool` THEN
14614     ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; ETA_AX; HOLOMORPHIC_ON_CONST] THEN
14615     SET_TAC[];
14616     MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
14617     EXISTS_TAC `s:complex->bool` THEN
14618     ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; ETA_AX; HOLOMORPHIC_ON_CONST] THEN
14619     SET_TAC[];
14620     MAP_EVERY X_GEN_TAC [`k:complex->bool`; `e:real`] THEN STRIP_TAC THEN
14621     FIRST_ASSUM(ASSUME_TAC o MATCH_MP (SET_RULE
14622      `k SUBSET s DELETE z ==> k SUBSET s`)) THEN
14623     FIRST_X_ASSUM(fun th ->
14624      MP_TAC(SPECL [`k:complex->bool`; `e / &2`] th) THEN
14625      MP_TAC(SPECL [`{z1:complex}`; `e / &2`] th)) THEN
14626     ASM_REWRITE_TAC[COMPACT_SING; SING_SUBSET; REAL_HALF] THEN
14627     SIMP_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; IN_SING; FORALL_UNWIND_THM2] THEN
14628     REWRITE_TAC[IMP_IMP; RIGHT_IMP_FORALL_THM] THEN DISCH_THEN(CONJUNCTS_THEN2
14629      (X_CHOOSE_TAC `N1:num`) (X_CHOOSE_TAC `N2:num`)) THEN
14630     EXISTS_TAC `MAX N1 N2` THEN REPEAT STRIP_TAC THEN
14631     UNDISCH_THEN `(g:complex->complex) z1 = g z2` (SUBST1_TAC o SYM) THEN
14632     MATCH_MP_TAC(NORM_ARITH
14633      `norm(x1 - x2) < e / &2 /\ norm(y1 - y2) < e / &2
14634       ==> norm(x1 - y1 - (x2 - y2)) < e`) THEN
14635     ASM_MESON_TAC[ARITH_RULE `x >= MAX m n <=> x >= m /\ x >= n`];
14636     REWRITE_TAC[IN_DELETE; COMPLEX_EQ_SUB_RADD] THEN DISCH_THEN(CHOOSE_THEN
14637      (fun th -> MAP_EVERY (MP_TAC o C SPEC th)
14638                  [`z0:complex`; `z1:complex`; `z2:complex`])) THEN
14639     ASM_MESON_TAC[];
14640     REWRITE_TAC[IN_DELETE] THEN ASM_MESON_TAC[];
14641     REWRITE_TAC[IN_DELETE] THEN ASM_MESON_TAC[]]);;
14642
14643 (* ------------------------------------------------------------------------- *)
14644 (* A big chain of equivalents of simple connectedness for an open set.       *)
14645 (* ------------------------------------------------------------------------- *)
14646
14647 let [SIMPLY_CONNECTED_EQ_WINDING_NUMBER_ZERO;
14648      SIMPLY_CONNECTED_EQ_PATH_INTEGRAL_ZERO;
14649      SIMPLY_CONNECTED_EQ_GLOBAL_PRIMITIVE;
14650      SIMPLY_CONNECTED_EQ_HOLOMORPHIC_LOG;
14651      SIMPLY_CONNECTED_EQ_HOLOMORPHIC_SQRT;
14652      SIMPLY_CONNECTED_EQ_INJECTIVE_HOLOMORPHIC_SQRT;
14653      SIMPLY_CONNECTED_EQ_BIHOLOMORPHIC_TO_DISC;
14654      SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] =
14655  (CONJUNCTS o prove)
14656  (`(!s. open s
14657         ==> (simply_connected s <=>
14658              connected s /\
14659              !g z. path g /\ path_image g SUBSET s /\
14660                    pathfinish g = pathstart g /\ ~(z IN s)
14661                    ==> winding_number(g,z) = Cx(&0))) /\
14662    (!s. open s
14663         ==> (simply_connected s <=>
14664              connected s /\
14665              !g f. valid_path g /\ path_image g SUBSET s /\
14666                    pathfinish g = pathstart g /\ f holomorphic_on s
14667                  ==> (f has_path_integral Cx(&0)) g)) /\
14668    (!s. open s
14669         ==> (simply_connected s <=>
14670              connected s /\
14671              !f. f holomorphic_on s
14672                  ==> ?h. !z. z IN s
14673                              ==> (h has_complex_derivative f(z)) (at z))) /\
14674    (!s. open s
14675         ==> (simply_connected s <=>
14676              connected s /\
14677              !f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0)))
14678                  ==> ?g. g holomorphic_on s /\
14679                          !z. z IN s ==> f z = cexp(g z))) /\
14680    (!s. open s
14681         ==> (simply_connected s <=>
14682              connected s /\
14683              !f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0)))
14684                  ==> ?g. g holomorphic_on s /\
14685                          !z. z IN s ==> f z = g z pow 2)) /\
14686    (!s. open s
14687         ==> (simply_connected s <=>
14688              connected s /\
14689              !f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0))) /\
14690                  (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
14691                  ==> ?g. g holomorphic_on s /\
14692                          !z. z IN s ==> f z = g z pow 2)) /\
14693    (!s. open s
14694         ==> (simply_connected s <=>
14695              s = {} \/ s = (:complex) \/
14696              ?f g. f holomorphic_on s /\ g holomorphic_on ball(Cx(&0),&1) /\
14697                    (!z. z IN s ==> f(z) IN ball(Cx(&0),&1) /\ g(f z) = z) /\
14698                    (!z. z IN ball(Cx(&0),&1) ==> g(z) IN s /\ f(g z) = z))) /\
14699    (!s. open s
14700         ==> (simply_connected(s:complex->bool) <=>
14701              s = {} \/ s homeomorphic ball(Cx(&0),&1)))`,
14702   REWRITE_TAC[AND_FORALL_THM; TAUT
14703    `(p ==> q) /\ (p ==> r) <=> p ==> q /\ r`] THEN
14704   X_GEN_TAC `s:complex->bool` THEN DISCH_TAC THEN MATCH_MP_TAC(TAUT
14705    `(p0 ==> p1) /\ (p1 ==> p2) /\ (p2 ==> p3) /\ (p3 ==> p4) /\
14706     (p4 ==> p5) /\ (p5 ==> p6) /\ (p6 ==> p7) /\ (p7 ==> p8) /\ (p8 ==> p0)
14707     ==> (p0 <=> p1) /\ (p0 <=> p2) /\
14708         (p0 <=> p3) /\ (p0 <=> p4) /\
14709         (p0 <=> p5) /\ (p0 <=> p6) /\ (p0 <=> p7) /\ (p0 <=> p8)`) THEN
14710   REPEAT CONJ_TAC THENL
14711    [SIMP_TAC[SIMPLY_CONNECTED_IMP_CONNECTED] THEN
14712     MESON_TAC[SIMPLY_CONNECTED_IMP_WINDING_NUMBER_ZERO];
14713
14714     REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
14715     MATCH_MP_TAC CAUCHY_THEOREM_GLOBAL THEN
14716     EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
14717     REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
14718     ASM_SIMP_TAC[VALID_PATH_IMP_PATH];
14719
14720     STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `f:complex->complex` THEN
14721     ASM_CASES_TAC `s:complex->bool = {}` THENL
14722      [ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN ASM_MESON_TAC[]; DISCH_TAC] THEN
14723     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
14724     DISCH_THEN(X_CHOOSE_TAC `a:complex`) THEN EXISTS_TAC
14725      `\z. path_integral
14726            (@g. vector_polynomial_function g /\ path_image g SUBSET s /\
14727                 pathstart g = a /\ pathfinish g = z)
14728            f` THEN
14729     X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
14730     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
14731     DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN ASM_REWRITE_TAC[] THEN
14732     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
14733     REWRITE_TAC[has_complex_derivative] THEN
14734     REWRITE_TAC[has_derivative_at; LINEAR_COMPLEX_MUL] THEN
14735     MATCH_MP_TAC LIM_TRANSFORM THEN
14736     EXISTS_TAC `\y. inv(norm(y - x)) % (path_integral(linepath(x,y)) f -
14737                      f x * (y - x))` THEN
14738     REWRITE_TAC[VECTOR_ARITH
14739      `i % (x - a) - i % (y - (z + a)) = i % (x + z - y)`] THEN
14740     CONJ_TAC THENL
14741      [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
14742       EXISTS_TAC `d:real` THEN ASM_REWRITE_TAC[] THEN
14743       X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
14744       REWRITE_TAC[VECTOR_MUL_EQ_0] THEN DISJ2_TAC THEN MP_TAC(ISPEC
14745         `s:complex->bool` CONNECTED_OPEN_VECTOR_POLYNOMIAL_CONNECTED) THEN
14746       ASM_REWRITE_TAC[] THEN
14747       DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[] THEN
14748       SUBGOAL_THEN `(y:complex) IN s` ASSUME_TAC THENL
14749        [ASM_MESON_TAC[SUBSET; IN_CBALL; REAL_LT_IMP_LE; DIST_SYM];
14750         ALL_TAC] THEN
14751       DISCH_THEN(fun th ->
14752         MP_TAC(SPEC `y:complex` th) THEN MP_TAC(SPEC `x:complex` th)) THEN
14753       ASM_REWRITE_TAC[] THEN MAP_EVERY ABBREV_TAC
14754        [`g1 = @g. vector_polynomial_function g /\ path_image g SUBSET s /\
14755                   pathstart g = (a:complex) /\ pathfinish g = x`;
14756         `g2 = @g. vector_polynomial_function g /\ path_image g SUBSET s /\
14757                   pathstart g = (a:complex) /\ pathfinish g = y`] THEN
14758       DISCH_THEN(MP_TAC o SELECT_RULE) THEN ASM_REWRITE_TAC[] THEN
14759       STRIP_TAC THEN DISCH_THEN(MP_TAC o SELECT_RULE) THEN
14760       ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
14761       FIRST_X_ASSUM(MP_TAC o SPECL
14762        [`g1 ++ linepath (x:complex,y) ++ reversepath g2`;
14763         `f:complex->complex`]) THEN
14764       ASM_REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATHFINISH_REVERSEPATH;
14765                       PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
14766       SUBGOAL_THEN `segment[x:complex,y] SUBSET s` ASSUME_TAC THENL
14767        [MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `cball(x:complex,d)` THEN
14768         ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
14769         MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_CBALL] THEN
14770         REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET] THEN
14771         ASM_SIMP_TAC[IN_CBALL; DIST_REFL] THEN
14772         ASM_MESON_TAC[REAL_LT_IMP_LE; DIST_SYM];
14773         ALL_TAC] THEN
14774       SUBGOAL_THEN
14775        `f path_integrable_on g1 /\ f path_integrable_on g2 /\
14776         f path_integrable_on linepath(x,y)`
14777       STRIP_ASSUME_TAC THENL
14778        [REPEAT CONJ_TAC THEN
14779         MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
14780         EXISTS_TAC `s:complex->bool` THEN
14781         ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
14782         ASM_REWRITE_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH];
14783         ALL_TAC] THEN
14784       ANTS_TAC THENL
14785        [ALL_TAC; DISCH_THEN(MP_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE)] THEN
14786       ASM_SIMP_TAC[VALID_PATH_JOIN_EQ; PATHSTART_JOIN; PATHFINISH_JOIN;
14787                    PATHFINISH_REVERSEPATH; PATHSTART_LINEPATH;
14788                    PATHFINISH_LINEPATH; VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION;
14789                    PATH_IMAGE_JOIN; PATH_IMAGE_LINEPATH;
14790                    PATH_IMAGE_REVERSEPATH; PATHSTART_REVERSEPATH;
14791                    VALID_PATH_LINEPATH; VALID_PATH_REVERSEPATH; UNION_SUBSET;
14792                    PATH_INTEGRAL_JOIN; PATH_INTEGRABLE_JOIN;
14793                    PATH_INTEGRABLE_REVERSEPATH; PATH_INTEGRAL_REVERSEPATH] THEN
14794       REWRITE_TAC[COMPLEX_VEC_0] THEN CONV_TAC COMPLEX_RING;
14795       REWRITE_TAC[LIM_AT] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
14796       SUBGOAL_THEN `(f:complex->complex) continuous at x` MP_TAC THENL
14797        [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
14798                       CONTINUOUS_ON_EQ_CONTINUOUS_AT];
14799         ALL_TAC] THEN
14800       REWRITE_TAC[continuous_at; dist; VECTOR_SUB_RZERO] THEN
14801       DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
14802       DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
14803       FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
14804       DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
14805       ASM_REWRITE_TAC[SUBSET; IN_BALL; dist] THEN
14806       DISCH_THEN(X_CHOOSE_THEN `d2:real` STRIP_ASSUME_TAC) THEN
14807       EXISTS_TAC `min d1 d2` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
14808       X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
14809       SUBGOAL_THEN `f path_integrable_on linepath(x,y)` MP_TAC THENL
14810        [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
14811         MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
14812         EXISTS_TAC `s:complex->bool` THEN CONJ_TAC THENL
14813          [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
14814                         CONTINUOUS_ON_EQ_CONTINUOUS_AT];
14815           MATCH_MP_TAC SUBSET_TRANS THEN
14816           EXISTS_TAC `ball(x:complex,d2)` THEN CONJ_TAC THENL
14817            [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
14818             MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
14819             REWRITE_TAC[SUBSET; IN_BALL; IN_INSERT; NOT_IN_EMPTY; dist] THEN
14820             REPEAT STRIP_TAC THEN
14821             ASM_REWRITE_TAC[dist; NORM_0; VECTOR_SUB_REFL] THEN
14822             ASM_MESON_TAC[NORM_SUB];
14823             ASM_REWRITE_TAC[SUBSET; dist; IN_BALL]]];
14824         ALL_TAC] THEN
14825       REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
14826       X_GEN_TAC `z:complex` THEN
14827       MP_TAC(SPECL [`x:complex`; `y:complex`; `(f:complex->complex) x`]
14828                     HAS_PATH_INTEGRAL_CONST_LINEPATH) THEN
14829       REWRITE_TAC[IMP_IMP] THEN
14830       DISCH_THEN(fun th -> ASSUME_TAC(CONJUNCT2 th) THEN MP_TAC th) THEN
14831       FIRST_ASSUM(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
14832       DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
14833       DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_NEG) THEN
14834       REWRITE_TAC[COMPLEX_NEG_SUB] THEN STRIP_TAC THEN
14835       MATCH_MP_TAC(REAL_ARITH `x <= e / &2 /\ &0 < e ==> x < e`) THEN
14836       ASM_REWRITE_TAC[NORM_MUL; REAL_ABS_INV; REAL_ABS_NORM] THEN
14837       ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
14838       ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
14839       MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
14840       EXISTS_TAC `\w. (f:complex->complex) w - f x` THEN
14841       ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> &0 <= e / &2`] THEN
14842       X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
14843       MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
14844       ASM_MESON_TAC[REAL_LET_TRANS; SEGMENT_BOUND]];
14845
14846     STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `f:complex->complex` THEN
14847     ASM_CASES_TAC `s:complex->bool = {}` THENL
14848      [ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN ASM_MESON_TAC[]; STRIP_TAC] THEN
14849     FIRST_X_ASSUM(MP_TAC o SPEC `\z. complex_derivative f z / f z`) THEN
14850     ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE;
14851                  HOLOMORPHIC_ON_DIV; ETA_AX] THEN
14852     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
14853     MP_TAC(ISPECL [`\z:complex. cexp(g z) / f z`; `s:complex->bool`]
14854         HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
14855     ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
14856      [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
14857       SUBGOAL_THEN
14858        `Cx(&0) = ((complex_derivative f z / f z * cexp (g z)) * f z -
14859                   cexp (g z) * complex_derivative f z) / f z pow 2`
14860       SUBST1_TAC THENL
14861        [ASM_SIMP_TAC[COMPLEX_FIELD
14862          `~(z = Cx(&0)) ==> (d / z * e) * z = e * d`] THEN
14863         SIMPLE_COMPLEX_ARITH_TAC;
14864         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DIV_AT THEN
14865         ASM_SIMP_TAC[] THEN CONJ_TAC THENL
14866          [GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
14867           ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
14868           MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
14869           ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_CEXP];
14870           ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; complex_differentiable;
14871                         HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE]]];
14872       DISCH_THEN(X_CHOOSE_THEN `c:complex` MP_TAC) THEN
14873       ASM_CASES_TAC `c = Cx(&0)` THENL
14874        [ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
14875          `~(x = Cx(&0)) /\ ~(y = Cx(&0)) ==> ~(x / y = Cx(&0))`] THEN
14876         ASM_MESON_TAC[];
14877       ASM_SIMP_TAC[COMPLEX_FIELD
14878        `~(y = Cx(&0)) /\ ~(z = Cx(&0))
14879         ==> (x / y = z <=> y = inv(z) * x)`] THEN
14880       DISCH_TAC THEN EXISTS_TAC `\z:complex. clog(inv c) + g z` THEN
14881       ASM_SIMP_TAC[CEXP_CLOG; CEXP_ADD; COMPLEX_INV_EQ_0] THEN
14882       MATCH_MP_TAC HOLOMORPHIC_ON_ADD THEN
14883       REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
14884       ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN]]];
14885
14886     STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
14887     X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
14888     FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`) THEN
14889     ASM_REWRITE_TAC[] THEN
14890     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
14891     EXISTS_TAC `\z:complex. cexp(g z / Cx(&2))` THEN
14892     ASM_SIMP_TAC[GSYM CEXP_N; COMPLEX_RING `Cx(&2) * z / Cx(&2) = z`] THEN
14893     GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
14894     MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
14895     REWRITE_TAC[HOLOMORPHIC_ON_CEXP] THEN
14896     MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
14897     ASM_SIMP_TAC[HOLOMORPHIC_ON_CONST] THEN
14898     CONV_TAC COMPLEX_RING;
14899
14900     MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
14901     MATCH_MP_TAC MONO_FORALL THEN MESON_TAC[];
14902
14903     POP_ASSUM MP_TAC THEN SPEC_TAC(`s:complex->bool`,`s:complex->bool`) THEN
14904     REWRITE_TAC[IMP_IMP; GSYM CONJ_ASSOC; FORALL_AND_THM] THEN
14905     SUBGOAL_THEN
14906      `!s:complex->bool.
14907           open s /\ connected s /\ Cx(&0) IN s /\ s SUBSET ball(Cx(&0),&1) /\
14908           (!f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0))) /\
14909                (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
14910                ==> ?g. g holomorphic_on s /\ (!z. z IN s ==> f z = g z pow 2))
14911           ==> ?f g. f holomorphic_on s /\
14912                     g holomorphic_on ball(Cx(&0),&1) /\
14913                     (!z. z IN s ==> f z IN ball(Cx(&0),&1) /\ g(f z) = z) /\
14914                     (!z. z IN ball(Cx(&0),&1) ==> g z IN s /\ f(g z) = z)`
14915     ASSUME_TAC THENL
14916      [ALL_TAC;
14917       REPEAT STRIP_TAC THEN
14918       ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[] THEN
14919       ASM_CASES_TAC `s = (:complex)` THEN ASM_REWRITE_TAC[] THEN
14920       SUBGOAL_THEN `?a b:complex. a IN s /\ ~(b IN s)` STRIP_ASSUME_TAC THENL
14921        [ASM SET_TAC[]; ALL_TAC] THEN
14922       SUBGOAL_THEN
14923        `?f. f holomorphic_on s /\
14924             f(a) = Cx(&0) /\
14925             IMAGE f s SUBSET ball(Cx(&0),&1) /\
14926             (!w z. w IN s /\ z IN s /\ f w = f z ==> w = z)`
14927       MP_TAC THENL
14928        [FIRST_X_ASSUM(K ALL_TAC o SPEC `(:complex)`) THEN
14929         FIRST_X_ASSUM(MP_TAC o SPEC `\z:complex. z - b`) THEN ANTS_TAC THENL
14930          [SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID;
14931                    COMPLEX_RING `x - b:complex = y - b <=> x = y`] THEN
14932           ASM_MESON_TAC[COMPLEX_SUB_0];
14933          ALL_TAC] THEN
14934         REWRITE_TAC[COMPLEX_EQ_SUB_RADD] THEN
14935         DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
14936         MP_TAC(ISPECL [`s:complex->bool`; `g:complex->complex`]
14937           OPEN_MAPPING_THM) THEN ASM_REWRITE_TAC[] THEN
14938         FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
14939         DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[SUBSET] THEN
14940         DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN ANTS_TAC THENL
14941          [SUBGOAL_THEN `a IN ball(a,d) /\ (a + Cx(d / &2)) IN ball(a,d) /\
14942                         ~(a + Cx(d / &2) = a)`
14943           MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
14944           ASM_REWRITE_TAC[CENTRE_IN_BALL;
14945                           COMPLEX_EQ_ADD_LCANCEL_0; CX_INJ] THEN
14946           REWRITE_TAC[IN_BALL; NORM_ARITH `dist(a,a + d) = norm d`] THEN
14947           REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
14948           ALL_TAC] THEN
14949         DISCH_THEN(MP_TAC o SPEC `ball(a:complex,d)`) THEN
14950         ASM_REWRITE_TAC[OPEN_BALL] THEN REWRITE_TAC[OPEN_CONTAINS_BALL] THEN
14951         DISCH_THEN(MP_TAC o SPEC `(g:complex->complex) a`) THEN
14952         ASM_SIMP_TAC[FUN_IN_IMAGE; CENTRE_IN_BALL] THEN
14953         DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
14954         SUBGOAL_THEN `!z:complex. z IN s ==> ~(g(z) IN ball(--(g a),r))`
14955         MP_TAC THENL
14956          [REWRITE_TAC[IN_BALL] THEN X_GEN_TAC `z:complex` THEN
14957           REPEAT DISCH_TAC THEN
14958           FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
14959           DISCH_THEN(MP_TAC o SPEC `--((g:complex->complex) z)`) THEN
14960           ASM_REWRITE_TAC[IN_BALL; NORM_ARITH `dist(w,--z) = dist(--w,z)`] THEN
14961           REWRITE_TAC[IN_IMAGE; NOT_EXISTS_THM] THEN X_GEN_TAC `w:complex` THEN
14962           ASM_CASES_TAC `w:complex = z` THENL
14963            [ASM_REWRITE_TAC[COMPLEX_RING `--z = z <=> z = Cx(&0)`] THEN
14964             ASM_MESON_TAC[COMPLEX_RING `Cx(&0) pow 2 + b = b`];
14965             ASM_MESON_TAC[COMPLEX_RING `(--z:complex) pow 2 = z pow 2`]];
14966           REWRITE_TAC[IN_BALL; NORM_ARITH `dist(--a,b) = norm(b + a)`] THEN
14967           ASM_CASES_TAC `!z:complex. z IN s ==> ~(g z + g a = Cx(&0))` THENL
14968            [REWRITE_TAC[REAL_NOT_LT] THEN DISCH_TAC;
14969             ASM_MESON_TAC[COMPLEX_NORM_0]] THEN
14970           EXISTS_TAC `\z:complex.
14971             Cx(r / &3) / (g z + g a) - Cx(r / &3) / (g a + g a)` THEN
14972           REWRITE_TAC[COMPLEX_SUB_REFL] THEN CONJ_TAC THENL
14973            [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
14974             REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
14975             MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
14976             ASM_SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_CONST; ETA_AX];
14977             ASM_SIMP_TAC[IMP_CONJ; CX_INJ; REAL_LT_IMP_NZ;
14978              REAL_ARITH `&0 < r ==> ~(r / &3 = &0)`;
14979              COMPLEX_FIELD
14980              `~(a = Cx(&0)) /\ ~(x + k = Cx(&0)) /\ ~(y + k = Cx(&0))
14981               ==> (a / (x + k) - c = a / (y + k) - c <=> x = y)`] THEN
14982             CONJ_TAC THENL [REWRITE_TAC[dist]; ASM_MESON_TAC[]] THEN
14983             REWRITE_TAC[FORALL_IN_IMAGE; COMPLEX_SUB_LZERO; NORM_NEG] THEN
14984             X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
14985             MATCH_MP_TAC(NORM_ARITH
14986              `norm(x) <= &1 / &3 /\ norm(y) <= &1 / &3
14987               ==> norm(x - y) < &1`) THEN
14988             REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_DIV] THEN
14989             ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE; REAL_POS] THEN
14990             REWRITE_TAC[REAL_ARITH
14991              `r / &3 / x <= &1 / &3 <=> r / x <= &1`] THEN
14992             ASM_SIMP_TAC[REAL_LE_LDIV_EQ; NORM_POS_LT; COMPLEX_NORM_NZ] THEN
14993             ASM_SIMP_TAC[REAL_MUL_LID]]];
14994         REWRITE_TAC[MESON[]
14995          `(!x y. P x /\ P y /\ f x = f y ==> x = y) <=>
14996           (!x y. P x /\ P y ==> (f x = f y <=> x = y))`] THEN
14997         DISCH_THEN(X_CHOOSE_THEN `h:complex->complex` STRIP_ASSUME_TAC) THEN
14998         MP_TAC(ISPECL [`h:complex->complex`; `s:complex->bool`]
14999             HOLOMORPHIC_ON_INVERSE) THEN
15000         ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
15001         DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC
15002          (X_CHOOSE_THEN `k:complex->complex` STRIP_ASSUME_TAC)) THEN
15003         FIRST_X_ASSUM(MP_TAC o SPEC `IMAGE (h:complex->complex) s`) THEN
15004         ANTS_TAC THENL
15005          [ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL
15006            [MATCH_MP_TAC CONNECTED_CONTINUOUS_IMAGE THEN
15007             ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
15008             ASM SET_TAC[];
15009             REWRITE_TAC[FORALL_IN_IMAGE]] THEN
15010           X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
15011           FIRST_X_ASSUM(MP_TAC o SPEC
15012            `(f:complex->complex) o (h:complex->complex)`) THEN
15013           ANTS_TAC THENL
15014            [CONJ_TAC THENL
15015              [ASM_MESON_TAC[HOLOMORPHIC_ON_COMPOSE]; ALL_TAC] THEN
15016             ASM_REWRITE_TAC[o_THM] THEN ASM SET_TAC[];
15017             ALL_TAC] THEN
15018           REWRITE_TAC[o_THM] THEN
15019           DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
15020           EXISTS_TAC `(g:complex->complex) o (k:complex->complex)` THEN
15021           ASM_SIMP_TAC[o_THM] THEN MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
15022           ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
15023            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN ASM SET_TAC[];
15024           ALL_TAC] THEN
15025         REWRITE_TAC[FORALL_IN_IMAGE] THEN
15026         DISCH_THEN(X_CHOOSE_THEN `f:complex->complex`
15027           (X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC)) THEN
15028         EXISTS_TAC `(f:complex->complex) o (h:complex->complex)` THEN
15029         EXISTS_TAC `(k:complex->complex) o (g:complex->complex)` THEN
15030         ASM_SIMP_TAC[o_THM; HOLOMORPHIC_ON_COMPOSE] THEN CONJ_TAC THENL
15031          [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE; ASM SET_TAC[]] THEN
15032         ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
15033            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
15034         ASM SET_TAC[]]] THEN
15035     X_GEN_TAC `s:complex->bool` THEN STRIP_TAC THEN
15036     ABBREV_TAC
15037      `ff = { h | h holomorphic_on s /\
15038                  IMAGE h s SUBSET ball(Cx(&0),&1) /\
15039                  h(Cx(&0)) = Cx(&0) /\
15040                  (!x y. x IN s /\ y IN s ==> (h x = h y <=> x = y))}` THEN
15041     SUBGOAL_THEN `(\z:complex. z) IN ff` MP_TAC THENL
15042      [EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM; IMAGE_ID] THEN
15043       ASM_REWRITE_TAC[HOLOMORPHIC_ON_ID];
15044       ASM_CASES_TAC `ff:(complex->complex)->bool = {}` THEN
15045       ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN DISCH_TAC] THEN
15046     SUBGOAL_THEN `!h. h IN ff ==> h holomorphic_on s` ASSUME_TAC THENL
15047      [EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM]; ALL_TAC] THEN
15048     SUBGOAL_THEN
15049      `?f:complex->complex.
15050           f IN ff /\
15051           (!h. h IN ff
15052                ==> norm(complex_derivative h (Cx(&0)))
15053                    <= norm(complex_derivative f (Cx(&0))))`
15054     MP_TAC THENL
15055      [MP_TAC(ISPEC
15056        `{ norm(complex_derivative h (Cx(&0))) | h IN ff}` SUP) THEN
15057       ANTS_TAC THENL
15058        [ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
15059         ASM_REWRITE_TAC[IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
15060         FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
15061         DISCH_THEN(MP_TAC o SPEC `Cx(&0)`) THEN
15062         ASM_REWRITE_TAC[SUBSET; IN_BALL; COMPLEX_SUB_LZERO;
15063                         dist; NORM_NEG] THEN
15064         DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
15065         EXISTS_TAC `inv(r):real` THEN X_GEN_TAC `f:complex->complex` THEN
15066         EXPAND_TAC "ff" THEN
15067         REWRITE_TAC[IN_ELIM_THM; FORALL_IN_IMAGE; SUBSET] THEN
15068         ASM_REWRITE_TAC[SUBSET; IN_BALL; COMPLEX_SUB_LZERO;
15069                         dist; NORM_NEG] THEN
15070         STRIP_TAC THEN
15071         MP_TAC(ISPEC `\z. (f:complex->complex) (Cx(r) * z)`
15072           SCHWARZ_LEMMA) THEN
15073         ASM_REWRITE_TAC[COMPLEX_MUL_RZERO] THEN
15074         SUBGOAL_THEN
15075          `!z. z IN ball(Cx(&0),&1)
15076               ==> ((\z. f (Cx r * z)) has_complex_derivative
15077                    complex_derivative f (Cx(r) * z) * Cx(r)) (at z)`
15078          (LABEL_TAC "*")
15079         THENL
15080          [REPEAT STRIP_TAC THEN MATCH_MP_TAC
15081            (REWRITE_RULE[o_DEF] COMPLEX_DIFF_CHAIN_AT) THEN
15082           CONJ_TAC THENL
15083            [COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_MUL_RID];
15084             REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE]] THEN
15085           MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
15086           EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
15087           FIRST_X_ASSUM MATCH_MP_TAC THEN
15088           REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
15089           ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE] THEN
15090           GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
15091           ASM_SIMP_TAC[GSYM COMPLEX_IN_BALL_0; REAL_LT_LMUL_EQ];
15092           ALL_TAC] THEN
15093         ANTS_TAC THENL
15094          [CONJ_TAC THENL
15095            [REWRITE_TAC[holomorphic_on] THEN
15096             ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
15097             REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15098             FIRST_X_ASSUM MATCH_MP_TAC THEN
15099             REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
15100             ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE] THEN
15101             GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
15102             ASM_SIMP_TAC[GSYM COMPLEX_IN_BALL_0; REAL_LT_LMUL_EQ]];
15103           REMOVE_THEN "*" (MP_TAC o SPEC `Cx(&0)`) THEN
15104           REWRITE_TAC[CENTRE_IN_BALL; REAL_LT_01] THEN
15105           DISCH_THEN(SUBST1_TAC o
15106             MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
15107           DISCH_THEN(MP_TAC o CONJUNCT1 o CONJUNCT2) THEN
15108           REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_NORM_MUL] THEN
15109           ASM_SIMP_TAC[COMPLEX_NORM_CX; real_abs; REAL_LT_IMP_LE] THEN
15110           ASM_SIMP_TAC[GSYM REAL_LE_RDIV_EQ; real_div; REAL_MUL_LID]];
15111         ALL_TAC] THEN
15112       ABBREV_TAC
15113        `l = sup { norm(complex_derivative h (Cx(&0))) | h IN ff}` THEN
15114       REWRITE_TAC[FORALL_IN_GSPEC] THEN DISCH_TAC THEN
15115       SUBGOAL_THEN
15116        `?f. (!n. (f n) IN ff) /\
15117             ((\n. Cx(norm(complex_derivative (f n) (Cx(&0))))) --> Cx(l))
15118             sequentially`
15119       STRIP_ASSUME_TAC THENL
15120        [SUBGOAL_THEN
15121          `!n. ?f. f IN ff /\
15122                   abs(norm(complex_derivative f (Cx (&0))) - l) < inv(&n + &1)`
15123         MP_TAC THENL
15124          [X_GEN_TAC `n:num` THEN
15125           FIRST_ASSUM(MP_TAC o SPEC `l - inv(&n + &1)` o CONJUNCT2) THEN
15126           REWRITE_TAC[REAL_ARITH `l <= l - i <=> ~(&0 < i)`; REAL_LT_INV_EQ;
15127              REAL_ARITH `&0 < &n + &1`; NOT_FORALL_THM; NOT_IMP] THEN
15128           MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `f:complex->complex` THEN
15129           ASM_CASES_TAC `(f:complex->complex) IN ff` THEN
15130           ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(REAL_ARITH
15131            `n <= l ==> ~(n <= l - e) ==> abs(n - l) < e`) THEN
15132           ASM_SIMP_TAC[];
15133           REWRITE_TAC[SKOLEM_THM; FORALL_AND_THM] THEN
15134           MATCH_MP_TAC MONO_EXISTS THEN
15135           X_GEN_TAC `f:num->complex->complex` THEN
15136           STRIP_TAC THEN ASM_REWRITE_TAC[LIM_SEQUENTIALLY] THEN
15137           X_GEN_TAC `e:real` THEN
15138           DISCH_THEN(MP_TAC o GEN_REWRITE_RULE I [REAL_ARCH_INV]) THEN
15139           MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN STRIP_TAC THEN
15140           X_GEN_TAC `m:num` THEN DISCH_TAC THEN REWRITE_TAC[dist] THEN
15141           MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `inv(&m + &1)` THEN
15142           ASM_REWRITE_TAC[COMPLEX_NORM_CX; GSYM CX_SUB] THEN
15143           MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `inv(&N)` THEN
15144           ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_INV2 THEN
15145           ASM_REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_ADD] THEN ASM_ARITH_TAC];
15146         ALL_TAC] THEN
15147       MP_TAC(ISPECL [`f:num->complex->complex`; `ff:(complex->complex)->bool`;
15148                      `s:complex->bool`] MONTEL) THEN
15149       ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
15150        [EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM] THEN
15151         REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_BALL; COMPLEX_SUB_LZERO;
15152                     dist; NORM_NEG] THEN
15153         MESON_TAC[REAL_LT_IMP_LE];
15154         ALL_TAC] THEN
15155       MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
15156       DISCH_THEN(X_CHOOSE_THEN `r:num->num` STRIP_ASSUME_TAC) THEN
15157       SUBGOAL_THEN
15158        `g complex_differentiable (at(Cx(&0))) /\
15159         norm(complex_derivative g (Cx(&0))) = l`
15160       STRIP_ASSUME_TAC THENL
15161        [MP_TAC(ISPECL [`(f:num->complex->complex) o (r:num->num)`;
15162                        `(\n:num z. complex_derivative (f n) z) o (r:num->num)`;
15163                        `g:complex->complex`; `s:complex->bool`]
15164                     HAS_COMPLEX_DERIVATIVE_UNIFORM_SEQUENCE) THEN
15165         ASM_REWRITE_TAC[o_THM] THEN ANTS_TAC THENL
15166          [CONJ_TAC THENL
15167            [REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
15168             REPEAT STRIP_TAC THEN
15169             MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
15170             EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[];
15171             ALL_TAC] THEN
15172           X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
15173           FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
15174           DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
15175           MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
15176           STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `e:real` THEN
15177           DISCH_TAC THEN REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
15178           FIRST_X_ASSUM(MP_TAC o SPECL [`cball(z:complex,d)`; `e:real`]) THEN
15179           ASM_REWRITE_TAC[COMPACT_CBALL; GE] THEN
15180           MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[];
15181           DISCH_THEN(X_CHOOSE_THEN `g':complex->complex` MP_TAC) THEN
15182           DISCH_THEN(MP_TAC o SPEC `Cx(&0)`) THEN
15183           ASM_REWRITE_TAC[IMP_CONJ_ALT] THEN
15184           DISCH_THEN(MP_TAC o ISPEC `\z:complex. Cx(norm z)` o MATCH_MP
15185            (REWRITE_RULE[IMP_CONJ_ALT] LIM_CONTINUOUS_FUNCTION)) THEN
15186           REWRITE_TAC[CONTINUOUS_AT_CX_NORM] THEN DISCH_TAC THEN DISCH_TAC THEN
15187           CONJ_TAC THENL [ASM_MESON_TAC[complex_differentiable]; ALL_TAC] THEN
15188           GEN_REWRITE_TAC I [GSYM CX_INJ] THEN
15189           FIRST_ASSUM(SUBST1_TAC o
15190             MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
15191           MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN EXISTS_TAC
15192            `\n. Cx(norm(complex_derivative(f((r:num->num) n)) (Cx (&0))))` THEN
15193           ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN MP_TAC(ISPECL
15194            [`\n:num. Cx(norm(complex_derivative (f n) (Cx (&0))))`;
15195             `r:num->num`; `Cx l`] LIM_SUBSEQUENCE) THEN
15196           ASM_REWRITE_TAC[o_DEF]];
15197         ALL_TAC] THEN
15198       ASM_SIMP_TAC[] THEN
15199       SUBGOAL_THEN `~(?c. !z. z IN s ==> (g:complex->complex) z = c)`
15200       ASSUME_TAC THENL
15201        [DISCH_THEN(X_CHOOSE_TAC `c:complex`) THEN
15202         SUBGOAL_THEN `complex_derivative g (Cx(&0)) = Cx(&0)` MP_TAC THENL
15203          [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
15204           MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
15205           MAP_EVERY EXISTS_TAC
15206            [`(\z. c):complex->complex`; `s:complex->bool`] THEN
15207           ASM_REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_CONST] THEN ASM_MESON_TAC[];
15208           DISCH_THEN(MP_TAC o AP_TERM `norm:complex->real`) THEN
15209           ASM_REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
15210           DISCH_THEN SUBST_ALL_TAC THEN
15211           FIRST_ASSUM(MP_TAC o SPEC `\z:complex. z` o CONJUNCT1) THEN
15212           ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
15213           REWRITE_TAC[COMPLEX_DERIVATIVE_ID; COMPLEX_NORM_CX] THEN
15214           REAL_ARITH_TAC];
15215         ALL_TAC] THEN
15216       EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN
15217       REPEAT CONJ_TAC THENL
15218        [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0] THEN
15219         SUBGOAL_THEN `!z. z IN s ==> norm((g:complex->complex) z) <= &1`
15220         ASSUME_TAC THENL
15221          [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
15222           MATCH_MP_TAC(ISPEC `sequentially` LIM_NORM_UBOUND) THEN
15223           EXISTS_TAC `\n:num. (f:num->complex->complex) (r n) z` THEN
15224           ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN
15225           MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN
15226           SUBGOAL_THEN
15227            `(f:num->complex->complex) (r(n:num)) IN ff`
15228           MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
15229           EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM] THEN
15230           ASM_SIMP_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0;
15231                        REAL_LT_IMP_LE];
15232           X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
15233           ASM_SIMP_TAC[REAL_LT_LE] THEN DISCH_TAC THEN MP_TAC(ISPECL
15234            [`g:complex->complex`; `s:complex->bool`; `s:complex->bool`;
15235             `z:complex`] MAXIMUM_MODULUS_PRINCIPLE) THEN
15236           ASM_REWRITE_TAC[SUBSET_REFL]];
15237         MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN
15238         EXISTS_TAC `\n:num. (f:num->complex->complex) (r n) (Cx(&0))` THEN
15239         ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN
15240         MATCH_MP_TAC LIM_EVENTUALLY THEN MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
15241         X_GEN_TAC `n:num` THEN
15242         SUBGOAL_THEN `(f:num->complex->complex) (r(n:num)) IN ff`
15243         MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
15244         EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM];
15245         MATCH_MP_TAC(REWRITE_RULE
15246          [MESON[] `(!x y. P x /\ P y /\ f x = f y ==> x = y) <=>
15247                    (!x y. P x /\ P y ==> (f x = f y <=> x = y))`]
15248          HURWITZ_INJECTIVE) THEN
15249         EXISTS_TAC `(f:num->complex->complex) o (r:num->num)` THEN
15250         ASM_SIMP_TAC[o_THM] THEN X_GEN_TAC `n:num` THEN
15251         SUBGOAL_THEN `(f:num->complex->complex) (r(n:num)) IN ff`
15252         MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
15253         EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM]];
15254       ALL_TAC] THEN
15255     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `f:complex->complex` THEN
15256     STRIP_TAC THEN
15257     MP_TAC(SPECL [`f:complex->complex`; `s:complex->bool`]
15258           HOLOMORPHIC_ON_INVERSE) THEN
15259     ANTS_TAC THENL
15260      [UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
15261       REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[];
15262       DISCH_THEN(MP_TAC o CONJUNCT2)] THEN
15263     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
15264     ASM_CASES_TAC `IMAGE (f:complex->complex) s = ball(Cx(&0),&1)` THENL
15265      [ASM_SIMP_TAC[] THEN ASM SET_TAC[]; ALL_TAC] THEN
15266     STRIP_TAC THEN
15267     UNDISCH_TAC `~(IMAGE (f:complex->complex) s = ball(Cx(&0),&1))` THEN
15268     MATCH_MP_TAC(TAUT `p ==> ~p ==> q`) THEN
15269     MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
15270      [UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
15271       REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[];
15272       ALL_TAC] THEN
15273     REWRITE_TAC[SUBSET; COMPLEX_IN_BALL_0] THEN
15274     X_GEN_TAC `a:complex` THEN DISCH_TAC THEN
15275     REWRITE_TAC[IN_IMAGE; MESON[]
15276       `(?x. a = f x /\ x IN s) <=> ~(!x. x IN s ==> ~(f x = a))`] THEN
15277     DISCH_TAC THEN
15278     MP_TAC(ISPEC `a:complex` BALL_BIHOLOMORPHISM_EXISTS) THEN
15279     ASM_REWRITE_TAC[COMPLEX_IN_BALL_0; NOT_EXISTS_THM] THEN
15280     MAP_EVERY X_GEN_TAC [`t:complex->complex`; `t':complex->complex`] THEN
15281     STRIP_TAC THEN
15282     SUBGOAL_THEN
15283      `!z. z IN s ==> norm((f:complex->complex) z) < &1`
15284     ASSUME_TAC THENL
15285      [UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
15286       SIMP_TAC[IN_ELIM_THM; SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0];
15287       ALL_TAC] THEN
15288     SUBGOAL_THEN
15289      `?sq. sq holomorphic_on (IMAGE (t o f) s) /\
15290            !z. z IN s
15291                ==> sq((t:complex->complex) ((f:complex->complex) z)) pow 2 =
15292                    t(f z)`
15293     STRIP_ASSUME_TAC THENL
15294      [UNDISCH_TAC
15295        `!f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx (&0))) /\
15296             (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
15297             ==> ?g. g holomorphic_on s /\
15298                     (!z. z IN s ==> f z = g z pow 2)` THEN
15299       DISCH_THEN(MP_TAC o SPEC
15300        `(t:complex->complex) o (f:complex->complex)`) THEN
15301       ASM_REWRITE_TAC[FORALL_IN_IMAGE; o_THM] THEN ANTS_TAC THENL
15302        [REPEAT CONJ_TAC THENL
15303          [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN ASM_SIMP_TAC[] THEN
15304           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
15305            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
15306           UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
15307           REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[];
15308           UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
15309           REWRITE_TAC[IN_ELIM_THM; SUBSET; FORALL_IN_IMAGE] THEN
15310           RULE_ASSUM_TAC(REWRITE_RULE[SUBSET; COMPLEX_IN_BALL_0]) THEN
15311           REWRITE_TAC[COMPLEX_IN_BALL_0] THEN STRIP_TAC THEN
15312           GEN_TAC THEN DISCH_TAC THEN
15313           DISCH_THEN(MP_TAC o AP_TERM `t':complex->complex`) THEN
15314           ASM_SIMP_TAC[] THEN ASM_MESON_TAC[];
15315           UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
15316           REWRITE_TAC[IN_ELIM_THM] THEN
15317           REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0] THEN
15318           REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
15319           REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN ASM_MESON_TAC[]];
15320         DISCH_THEN(X_CHOOSE_THEN `q:complex->complex` STRIP_ASSUME_TAC) THEN
15321         EXISTS_TAC `(q:complex->complex) o (g:complex->complex) o
15322                     (t':complex->complex)` THEN
15323         ASM_REWRITE_TAC[o_THM] THEN CONJ_TAC THENL
15324          [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
15325            [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC;
15326             ALL_TAC] THEN
15327           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
15328            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
15329           REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0; o_THM] THENL
15330            [ASM_MESON_TAC[]; ASM SET_TAC[]; ASM_MESON_TAC[]];
15331           X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
15332           MATCH_MP_TAC EQ_TRANS THEN
15333           EXISTS_TAC `(q:complex->complex) z pow 2` THEN
15334           CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
15335           AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
15336           UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
15337           REWRITE_TAC[IN_ELIM_THM; SUBSET; FORALL_IN_IMAGE] THEN
15338           REWRITE_TAC[COMPLEX_IN_BALL_0] THEN ASM_MESON_TAC[]]];
15339       ALL_TAC] THEN
15340     SUBGOAL_THEN
15341      `!z. z IN s
15342           ==> norm((sq:complex->complex)
15343                    ((t:complex->complex)((f:complex->complex) z))) < &1`
15344     ASSUME_TAC THENL
15345      [REPEAT STRIP_TAC THEN
15346       GEN_REWRITE_TAC LAND_CONV [GSYM REAL_ABS_NORM] THEN
15347       REWRITE_TAC[GSYM ABS_SQUARE_LT_1; GSYM COMPLEX_NORM_POW] THEN
15348       ASM_SIMP_TAC[];
15349       ALL_TAC] THEN
15350     MP_TAC(ISPEC
15351      `(sq:complex->complex)
15352       ((t:complex->complex)((f:complex->complex) (Cx(&0))))`
15353       BALL_BIHOLOMORPHISM_EXISTS) THEN
15354     ASM_SIMP_TAC[COMPLEX_IN_BALL_0; NOT_IMP; NOT_EXISTS_THM] THEN
15355     MAP_EVERY X_GEN_TAC [`r:complex->complex`; `r':complex->complex`] THEN
15356     STRIP_TAC THEN UNDISCH_TAC
15357      `!h. h IN ff
15358           ==> norm(complex_derivative h (Cx (&0))) <=
15359               norm(complex_derivative f (Cx (&0)))` THEN
15360     DISCH_THEN(fun th -> MP_TAC(SPEC
15361      `(r:complex->complex) o (sq:complex->complex) o
15362       (t:complex->complex) o (f:complex->complex)` th) THEN
15363      MP_TAC(SPEC `\z:complex. z` th)) THEN
15364     ASM_REWRITE_TAC[COMPLEX_DERIVATIVE_ID; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
15365     DISCH_TAC THEN REWRITE_TAC[NOT_IMP; REAL_NOT_LE] THEN
15366     EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM] THEN
15367     MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN REPEAT CONJ_TAC THENL
15368      [REPEAT(MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC) THEN
15369       ASM_SIMP_TAC[] THEN
15370       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
15371            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
15372       REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
15373       ASM_SIMP_TAC[];
15374       REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
15375       ASM_SIMP_TAC[];
15376       ASM_SIMP_TAC[o_THM];
15377       MAP_EVERY X_GEN_TAC [`w:complex`; `z:complex`] THEN STRIP_TAC THEN
15378       EQ_TAC THEN SIMP_TAC[] THEN
15379       DISCH_THEN(MP_TAC o AP_TERM `r':complex->complex`) THEN
15380       ASM_SIMP_TAC[o_THM] THEN
15381       DISCH_THEN(MP_TAC o AP_TERM `\z:complex. z pow 2`) THEN
15382       ASM_SIMP_TAC[] THEN
15383       DISCH_THEN(MP_TAC o AP_TERM `t':complex->complex`) THEN
15384       ASM_SIMP_TAC[] THEN ASM_MESON_TAC[];
15385       STRIP_TAC] THEN
15386     MP_TAC(ISPEC
15387      `(t':complex->complex) o (\z. z pow 2) o (r':complex->complex)`
15388      SCHWARZ_LEMMA) THEN
15389     REWRITE_TAC[] THEN ANTS_TAC THENL
15390      [REPEAT CONJ_TAC THENL
15391        [REPEAT(MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC) THEN
15392         SIMP_TAC[HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_ID] THEN
15393         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
15394            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
15395         REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
15396         ASM_SIMP_TAC[COMPLEX_NORM_POW; ABS_SQUARE_LT_1; REAL_ABS_NORM];
15397         ASM_SIMP_TAC[COMPLEX_NORM_POW; ABS_SQUARE_LT_1; REAL_ABS_NORM; o_THM];
15398         UNDISCH_THEN `(r:complex->complex) ((sq:complex->complex)
15399                       ((t:complex->complex) (f(Cx(&0))))) = Cx (&0)`
15400          (fun th -> GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [SYM th]) THEN
15401         ASM_SIMP_TAC[o_THM] THEN
15402         UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
15403         SIMP_TAC[IN_ELIM_THM]];
15404       DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN MATCH_MP_TAC
15405        (TAUT `~r /\ (p /\ ~q ==> s) ==> p /\ (q' \/ q ==> r) ==> s`) THEN
15406       CONJ_TAC THENL
15407        [REWRITE_TAC[NOT_EXISTS_THM] THEN X_GEN_TAC `c:complex` THEN
15408         ASM_CASES_TAC `c = Cx(&0)` THEN
15409         ASM_SIMP_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_OF_NUM_EQ; ARITH] THEN
15410         DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
15411         DISCH_THEN(fun th ->
15412           MP_TAC(ISPEC `(r:complex->complex) (--(Cx(&1) / Cx(&2)))` th) THEN
15413           MP_TAC(ISPEC `(r:complex->complex) (Cx(&1) / Cx(&2))` th)) THEN
15414         MATCH_MP_TAC(TAUT `(p1 /\ p2) /\ (q1 /\ q2 ==> r)
15415                            ==> (p1 ==> q1) ==> (p2 ==> q2) ==> r`) THEN
15416         CONJ_TAC THENL
15417          [CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15418           REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
15419           REAL_ARITH_TAC;
15420           ALL_TAC] THEN
15421         MATCH_MP_TAC(MESON[]
15422          `~(b1 = b2) /\ a1 = a2 ==> (a1 = b1 /\ a2 = b2 ==> F)`) THEN
15423         CONJ_TAC THENL
15424          [ASM_REWRITE_TAC[COMPLEX_EQ_MUL_LCANCEL] THEN
15425           DISCH_THEN(MP_TAC o AP_TERM `r':complex->complex`) THEN
15426           FIRST_ASSUM(fun th ->
15427             W(MP_TAC o PART_MATCH (lhand o rand) th o
15428                lhand o lhand o snd)) THEN
15429           REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
15430           CONV_TAC REAL_RAT_REDUCE_CONV THEN DISCH_THEN SUBST1_TAC THEN
15431           MATCH_MP_TAC(COMPLEX_RING
15432            `x = --(Cx(&1) / Cx(&2)) ==> ~(Cx(&1) / Cx(&2) = x)`) THEN
15433           FIRST_X_ASSUM MATCH_MP_TAC THEN
15434           REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
15435           CONV_TAC REAL_RAT_REDUCE_CONV;
15436           REWRITE_TAC[o_DEF] THEN AP_TERM_TAC THEN
15437           MATCH_MP_TAC(COMPLEX_RING
15438            `x = Cx(&1) / Cx(&2) /\ y = --(Cx(&1) / Cx(&2))
15439             ==> x pow 2 = y pow 2`) THEN
15440           CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15441           REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
15442           CONV_TAC REAL_RAT_REDUCE_CONV];
15443         REWRITE_TAC[GSYM REAL_LT_LE] THEN DISCH_TAC THEN
15444         UNDISCH_TAC `&1 <= norm (complex_derivative f (Cx (&0)))` THEN
15445         SUBGOAL_THEN
15446          `complex_derivative f (Cx (&0)) =
15447           complex_derivative (t' o (\z:complex. z pow 2) o r') (Cx(&0)) *
15448           complex_derivative
15449             (r o (sq:complex->complex) o (t:complex->complex) o f) (Cx(&0))`
15450          (fun th -> REWRITE_TAC[th; COMPLEX_NORM_MUL])
15451         THENL
15452          [ALL_TAC;
15453           REWRITE_TAC[REAL_ARITH `a * b < b <=> &0 < (&1 - a) * b`] THEN
15454           DISCH_THEN(MP_TAC o MATCH_MP
15455            (REAL_ARITH `&1 <= x ==> ~(x = &0)`)) THEN
15456           SIMP_TAC[REAL_ENTIRE; NORM_EQ_0; GSYM NORM_POS_LT; DE_MORGAN_THM] THEN
15457           ASM_SIMP_TAC[REAL_LT_MUL_EQ] THEN ASM_REAL_ARITH_TAC] THEN
15458         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
15459         MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
15460         EXISTS_TAC `((t':complex->complex) o
15461                      (\z:complex. z pow 2) o (r':complex->complex)) o
15462                     ((r:complex->complex) o (sq:complex->complex) o
15463                      (t:complex->complex) o (f:complex->complex))` THEN
15464         EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
15465          [ASM_SIMP_TAC[o_THM]; ALL_TAC] THEN
15466         MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
15467         ASM_REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
15468         CONJ_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THENL
15469          [EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[];
15470           EXISTS_TAC `ball(Cx(&0),&1)` THEN
15471           ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; REAL_LT_01] THEN
15472           REPEAT(MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC) THEN
15473           SIMP_TAC[HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_ID] THEN
15474           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
15475            (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
15476           REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
15477           ASM_SIMP_TAC[COMPLEX_NORM_POW; ABS_SQUARE_LT_1; REAL_ABS_NORM]]]];
15478     ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[] THEN
15479     ASM_CASES_TAC `s = (:complex)` THEN ASM_REWRITE_TAC[] THENL
15480      [ONCE_REWRITE_TAC[HOMEOMORPHIC_SYM] THEN
15481       MATCH_MP_TAC HOMEOMORPHIC_BALL_UNIV THEN REWRITE_TAC[REAL_LT_01];
15482       REWRITE_TAC[HOMEOMORPHIC_MINIMAL] THEN
15483       REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN
15484       MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]];
15485     STRIP_TAC THEN ASM_REWRITE_TAC[SIMPLY_CONNECTED_EMPTY] THEN
15486     FIRST_ASSUM(MP_TAC o MATCH_MP HOMEOMORPHIC_SIMPLY_CONNECTED_EQ) THEN
15487     SIMP_TAC[CONVEX_IMP_SIMPLY_CONNECTED; CONVEX_BALL]]);;
15488
15489 let CONTRACTIBLE_EQ_SIMPLY_CONNECTED_2D = prove
15490  (`!s:real^2->bool. open s ==> (contractible s <=> simply_connected s)`,
15491   REPEAT STRIP_TAC THEN EQ_TAC THEN
15492   REWRITE_TAC[CONTRACTIBLE_IMP_SIMPLY_CONNECTED] THEN
15493   ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] THEN
15494   STRIP_TAC THEN ASM_REWRITE_TAC[CONTRACTIBLE_EMPTY] THEN
15495   ASM_MESON_TAC[HOMEOMORPHIC_CONTRACTIBLE_EQ; CONVEX_IMP_CONTRACTIBLE;
15496                 CONVEX_BALL]);;
15497
15498 (* ------------------------------------------------------------------------- *)
15499 (* A further chain of equivalents about components of the complement of a    *)
15500 (* simply connected set (following 1.35 in Burckel's book).                  *)
15501 (* ------------------------------------------------------------------------- *)
15502
15503 let [SIMPLY_CONNECTED_EQ_FRONTIER_PROPERTIES;
15504      SIMPLY_CONNECTED_EQ_UNBOUNDED_COMPLEMENT_COMPONENTS;
15505      SIMPLY_CONNECTED_EQ_EMPTY_INSIDE] = (CONJUNCTS o prove)
15506  (`(!s:complex->bool.
15507         open s
15508         ==> (simply_connected s <=>
15509              connected s /\
15510              if bounded s then connected(frontier s)
15511              else !c. c IN components(frontier s) ==> ~bounded c)) /\
15512    (!s. open s
15513         ==> (simply_connected s <=>
15514              connected s /\
15515              !c. c IN components ((:complex) DIFF s) ==> ~bounded c)) /\
15516    (!s:complex->bool.
15517         open s ==> (simply_connected s <=> connected s /\ inside s = {}))`,
15518   REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `s:complex->bool` THEN
15519   ASM_CASES_TAC `open(s:complex->bool)` THEN ASM_REWRITE_TAC[] THEN
15520   MATCH_MP_TAC(TAUT
15521    `(q3 ==> p) /\ (q2 ==> q3) /\ (q1 ==> q2) /\ (p ==> q1)
15522     ==> (p <=> q1) /\ (p <=> q2) /\ (p <=> q3)`) THEN
15523   REPEAT CONJ_TAC THENL
15524    [REWRITE_TAC[INSIDE_OUTSIDE] THEN
15525     REWRITE_TAC[SET_RULE `UNIV DIFF (s UNION t) = {} <=>
15526                           !x. ~(x IN s) ==> x IN t`] THEN
15527     STRIP_TAC THEN ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_WINDING_NUMBER_ZERO] THEN
15528     GEN_TAC THEN X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
15529     MATCH_MP_TAC WINDING_NUMBER_ZERO_IN_OUTSIDE THEN ASM_REWRITE_TAC[] THEN
15530     FIRST_ASSUM(MP_TAC o MATCH_MP OUTSIDE_MONO) THEN ASM SET_TAC[];
15531     REWRITE_TAC[components; FORALL_IN_GSPEC; inside] THEN SET_TAC[];
15532     ASM_CASES_TAC `connected(s:complex->bool)` THEN ASM_REWRITE_TAC[] THEN
15533     COND_CASES_TAC THENL
15534      [DISCH_TAC THEN
15535       REWRITE_TAC[components; FORALL_IN_GSPEC; IN_DIFF; IN_UNIV] THEN
15536       ASM_CASES_TAC `s:complex->bool = {}` THEN
15537       ASM_SIMP_TAC[DIFF_EMPTY; CONNECTED_COMPONENT_EQ_SELF;
15538                    CONNECTED_UNIV; IN_UNIV; NOT_BOUNDED_UNIV] THEN
15539       ASM_CASES_TAC `s = (:complex)` THENL
15540        [ASM_MESON_TAC[NOT_BOUNDED_UNIV]; ALL_TAC] THEN
15541       X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
15542       FIRST_ASSUM(MP_TAC o MATCH_MP OUTSIDE_BOUNDED_NONEMPTY) THEN
15543       REWRITE_TAC[outside; GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN
15544       DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC) THEN
15545       SUBGOAL_THEN
15546        `connected_component ((:complex) DIFF s) w =
15547         connected_component ((:complex) DIFF s) z`
15548        (fun th -> ASM_REWRITE_TAC[th]) THEN
15549       MATCH_MP_TAC JOINABLE_CONNECTED_COMPONENT_EQ THEN
15550       EXISTS_TAC `frontier s :complex->bool` THEN ASM_REWRITE_TAC[] THEN
15551       CONJ_TAC THENL
15552        [REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
15553          `i = s ==> s' DIFF i SUBSET UNIV DIFF s`) THEN
15554         ASM_REWRITE_TAC[INTERIOR_EQ];
15555         ALL_TAC] THEN
15556       ONCE_REWRITE_TAC[GSYM FRONTIER_COMPLEMENT] THEN CONJ_TAC THEN
15557       MATCH_MP_TAC(SET_RULE
15558        `frontier c SUBSET c /\ frontier c SUBSET f /\ ~(frontier c = {})
15559         ==> ~(c INTER f = {})`) THEN
15560       REWRITE_TAC[FRONTIER_OF_CONNECTED_COMPONENT_SUBSET] THEN
15561       ASM_REWRITE_TAC[FRONTIER_EQ_EMPTY; CONNECTED_COMPONENT_EQ_EMPTY;
15562                       IN_DIFF; IN_UNIV; CONNECTED_COMPONENT_EQ_UNIV;
15563                       SET_RULE `UNIV DIFF s = UNIV <=> s = {}`] THEN
15564       REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
15565        `c = s ==> c DIFF i SUBSET s`) THEN
15566       ASM_REWRITE_TAC[CLOSURE_EQ] THEN
15567       MATCH_MP_TAC CLOSED_CONNECTED_COMPONENT THEN
15568       ASM_REWRITE_TAC[GSYM OPEN_CLOSED];
15569       DISCH_TAC THEN REWRITE_TAC[components; FORALL_IN_GSPEC] THEN
15570       X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_DIFF; IN_UNIV] THEN
15571       DISCH_TAC THEN
15572       SUBGOAL_THEN
15573        `?z:complex. z IN frontier s /\
15574                     z IN connected_component ((:real^2) DIFF s) w`
15575       STRIP_ASSUME_TAC THENL
15576        [ONCE_REWRITE_TAC[GSYM FRONTIER_COMPLEMENT] THEN
15577         MATCH_MP_TAC(SET_RULE
15578          `frontier c SUBSET c /\ frontier c SUBSET f /\ ~(frontier c = {})
15579           ==> ?z. z IN f /\ z IN c`) THEN
15580         ASM_REWRITE_TAC[FRONTIER_OF_CONNECTED_COMPONENT_SUBSET] THEN
15581         CONJ_TAC THENL
15582          [REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
15583            `c = s ==> c DIFF i SUBSET s`) THEN
15584           ASM_REWRITE_TAC[CLOSURE_EQ] THEN
15585           MATCH_MP_TAC CLOSED_CONNECTED_COMPONENT THEN
15586           ASM_REWRITE_TAC[GSYM OPEN_CLOSED];
15587           ASM_REWRITE_TAC[FRONTIER_EQ_EMPTY; CONNECTED_COMPONENT_EQ_EMPTY;
15588                           CONNECTED_COMPONENT_EQ_UNIV; IN_DIFF; IN_UNIV] THEN
15589           REWRITE_TAC[SET_RULE `UNIV DIFF s = UNIV <=> s = {}`] THEN
15590           ASM_MESON_TAC[BOUNDED_EMPTY]];
15591         FIRST_X_ASSUM(MP_TAC o SPEC
15592          `connected_component (frontier s) (z:complex)`) THEN
15593         REWRITE_TAC[components; IN_ELIM_THM] THEN
15594         ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[CONTRAPOS_THM]] THEN
15595         MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] BOUNDED_SUBSET) THEN
15596         SUBGOAL_THEN
15597          `connected_component ((:complex) DIFF s) w =
15598           connected_component ((:complex) DIFF s) z`
15599         SUBST1_TAC THENL
15600          [ASM_MESON_TAC[CONNECTED_COMPONENT_EQ];
15601           MATCH_MP_TAC CONNECTED_COMPONENT_MAXIMAL THEN
15602           ASM_REWRITE_TAC[IN; CONNECTED_COMPONENT_REFL_EQ] THEN
15603           REWRITE_TAC[CONNECTED_CONNECTED_COMPONENT] THEN
15604           MATCH_MP_TAC SUBSET_TRANS THEN
15605           EXISTS_TAC `frontier s :complex->bool` THEN
15606           REWRITE_TAC[CONNECTED_COMPONENT_SUBSET] THEN
15607           REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
15608             `i = s ==> s' DIFF i SUBSET UNIV DIFF s`) THEN
15609           ASM_REWRITE_TAC[INTERIOR_EQ]]]];
15610     ALL_TAC] THEN
15611   DISCH_THEN(fun th ->
15612    ASSUME_TAC(MATCH_MP SIMPLY_CONNECTED_IMP_CONNECTED th) THEN MP_TAC th) THEN
15613   ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] THEN STRIP_TAC THEN
15614   ASM_REWRITE_TAC[BOUNDED_EMPTY; FRONTIER_EMPTY; CONNECTED_EMPTY] THEN
15615   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homeomorphic]) THEN
15616   REWRITE_TAC[LEFT_IMP_EXISTS_THM; homeomorphism] THEN
15617   MAP_EVERY X_GEN_TAC [`g:real^2->real^2`; `f:real^2->real^2`] THEN
15618   STRIP_TAC THEN MAP_EVERY ABBREV_TAC
15619    [`D = \n. ball(vec 0:real^2,&1 - inv(&n + &2))`;
15620     `A = \n. {z:real^2 | &1 - inv(&n + &2) < norm z /\ norm z < &1}`;
15621     `X = \n:num. closure(IMAGE (f:real^2->real^2) (A n))`] THEN
15622   SUBGOAL_THEN
15623    `frontier s = INTERS {X n:real^2->bool | n IN (:num)}`
15624   SUBST1_TAC THENL
15625    [ASM_SIMP_TAC[frontier; INTERIOR_OPEN; INTERS_GSPEC; IN_UNIV] THEN
15626     MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
15627      [REWRITE_TAC[SUBSET; IN_DIFF] THEN X_GEN_TAC `x:real^2` THEN
15628       STRIP_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN X_GEN_TAC `n:num` THEN
15629       UNDISCH_TAC `(x:real^2) IN closure s` THEN
15630       SUBGOAL_THEN
15631        `s = IMAGE (f:real^2->real^2) (closure (D(n:num))) UNION IMAGE f (A n)`
15632       SUBST1_TAC THENL
15633        [EXPAND_TAC "s" THEN MATCH_MP_TAC(SET_RULE
15634          `t UNION u = s /\ (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
15635           ==> IMAGE f s = IMAGE f t UNION IMAGE f u`) THEN
15636         CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
15637         MAP_EVERY EXPAND_TAC ["A"; "D"] THEN
15638         SIMP_TAC[CLOSURE_BALL; REAL_SUB_LT; REAL_INV_LT_1;
15639                  REAL_ARITH `&1 < &n + &2`] THEN
15640         REWRITE_TAC[EXTENSION; IN_UNION; COMPLEX_IN_BALL_0; IN_CBALL_0;
15641                    IN_ELIM_THM] THEN GEN_TAC THEN
15642         MATCH_MP_TAC(REAL_ARITH
15643          `&0 < e /\ e <= &1
15644           ==> (x <= &1 - e \/ &1 - e < x /\ x < &1 <=> x < &1)`) THEN
15645         SIMP_TAC[REAL_LT_INV_EQ; REAL_INV_LE_1; REAL_ARITH `&1 <= &n + &2`;
15646                  REAL_ARITH `&0 < &n + &2`];
15647         EXPAND_TAC "X" THEN REWRITE_TAC[CLOSURE_UNION] THEN
15648         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
15649          `~(x IN s) ==> t SUBSET s ==> x IN t UNION u ==> x IN u`)) THEN
15650         EXPAND_TAC "D" THEN
15651         SIMP_TAC[CLOSURE_BALL; REAL_SUB_LT; REAL_INV_LT_1;
15652                  REAL_ARITH `&1 < &n + &2`; COMPACT_CBALL] THEN
15653         MATCH_MP_TAC(SET_RULE
15654          `closure s = s /\ s SUBSET t ==> closure s SUBSET t`) THEN
15655         CONJ_TAC THENL
15656          [MATCH_MP_TAC CLOSURE_CLOSED THEN MATCH_MP_TAC COMPACT_IMP_CLOSED THEN
15657           MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
15658           REWRITE_TAC[COMPACT_CBALL] THEN
15659           FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
15660             CONTINUOUS_ON_SUBSET));
15661           EXPAND_TAC "s" THEN MATCH_MP_TAC IMAGE_SUBSET] THEN
15662         REWRITE_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_CBALL_0] THEN GEN_TAC THEN
15663         MATCH_MP_TAC(REAL_ARITH `&0 < x ==> a <= &1 - x ==> a < &1`) THEN
15664         REWRITE_TAC[REAL_LT_INV_EQ] THEN REAL_ARITH_TAC];
15665       MATCH_MP_TAC(SET_RULE
15666        `s SUBSET t /\ s INTER u = {} ==> s SUBSET t DIFF u`) THEN
15667       CONJ_TAC THENL
15668        [EXPAND_TAC "X" THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN
15669         X_GEN_TAC `x:real^2` THEN DISCH_THEN(MP_TAC o SPEC `0`) THEN
15670         SPEC_TAC(`x:real^2`,`x:real^2`) THEN REWRITE_TAC[GSYM SUBSET] THEN
15671         MATCH_MP_TAC SUBSET_CLOSURE THEN EXPAND_TAC "s" THEN
15672         MATCH_MP_TAC IMAGE_SUBSET THEN EXPAND_TAC "A" THEN
15673         REWRITE_TAC[SUBSET; IN_ELIM_THM; COMPLEX_IN_BALL_0] THEN
15674         REAL_ARITH_TAC;
15675         REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM; NOT_IN_EMPTY] THEN
15676         MAP_EVERY EXPAND_TAC ["s"; "X"] THEN
15677         REWRITE_TAC[TAUT `~(a /\ b) <=> b ==> ~a`; FORALL_IN_IMAGE] THEN
15678         X_GEN_TAC `x:real^2` THEN REWRITE_TAC[COMPLEX_IN_BALL_0] THEN
15679         DISCH_TAC THEN MP_TAC(SPEC `&1 - norm(x:real^2)` REAL_ARCH_INV) THEN
15680         ASM_REWRITE_TAC[REAL_SUB_LT; NOT_FORALL_THM] THEN
15681         MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:num` THEN STRIP_TAC THEN
15682         MATCH_MP_TAC(SET_RULE
15683          `!s. y IN s /\ (s INTER t = {}) ==> ~(y IN t)`) THEN
15684         EXISTS_TAC `IMAGE (f:real^2->real^2) (D(n:num))` THEN CONJ_TAC THENL
15685          [MATCH_MP_TAC FUN_IN_IMAGE THEN EXPAND_TAC "D" THEN
15686           REWRITE_TAC[IN_BALL_0] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
15687            (REAL_ARITH `n < &1 - x ==> m < n ==> x < &1 - m`)) THEN
15688           MATCH_MP_TAC REAL_LT_INV2 THEN
15689           ASM_SIMP_TAC[REAL_OF_NUM_LT; LE_1] THEN REAL_ARITH_TAC;
15690           SUBGOAL_THEN `open(IMAGE (f:real^2->real^2) (D(n:num)))` MP_TAC THENL
15691            [MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
15692             SUBGOAL_THEN `(D:num->real^2->bool) n SUBSET ball(Cx(&0),&1)`
15693             ASSUME_TAC THENL
15694              [EXPAND_TAC "D" THEN REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN
15695               MATCH_MP_TAC SUBSET_BALL THEN
15696               REWRITE_TAC[REAL_ARITH `&1 - x <= &1 <=> &0 <= x`] THEN
15697               REWRITE_TAC[REAL_LE_INV_EQ] THEN REAL_ARITH_TAC;
15698               REPEAT CONJ_TAC THENL
15699                [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
15700                 EXPAND_TAC "D" THEN REWRITE_TAC[OPEN_BALL];
15701                 ASM SET_TAC[]]];
15702             SIMP_TAC[OPEN_INTER_CLOSURE_EQ_EMPTY] THEN DISCH_TAC THEN
15703             MATCH_MP_TAC(SET_RULE
15704              `!u. (!x y. x IN u /\ y IN u /\ f x = f y ==> x = y) /\
15705                   s UNION t SUBSET u /\ s INTER t = {}
15706                   ==> IMAGE f s INTER IMAGE f t = {}`) THEN
15707             EXISTS_TAC `ball(Cx(&0),&1)` THEN
15708             CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
15709             MAP_EVERY EXPAND_TAC ["D"; "A"] THEN
15710             REWRITE_TAC[COMPLEX_IN_BALL_0; IN_BALL_0; SUBSET; NOT_IN_EMPTY;
15711               IN_UNION; IN_ELIM_THM; IN_INTER; EXTENSION] THEN
15712             CONJ_TAC THENL [GEN_TAC; REAL_ARITH_TAC] THEN
15713             MATCH_MP_TAC(REAL_ARITH
15714              `&0 < e ==> x < &1 - e \/ &1 - e < x /\ x < &1 ==> x < &1`) THEN
15715             REWRITE_TAC[REAL_LT_INV_EQ] THEN REAL_ARITH_TAC]]]];
15716     ALL_TAC] THEN
15717   SUBGOAL_THEN `!n. closed((X:num->complex->bool) n)` ASSUME_TAC THENL
15718    [EXPAND_TAC "X" THEN REWRITE_TAC[CLOSED_CLOSURE]; ALL_TAC] THEN
15719   SUBGOAL_THEN `!n. connected((X:num->complex->bool) n)` ASSUME_TAC THENL
15720    [X_GEN_TAC `n:num` THEN EXPAND_TAC "X" THEN
15721     MATCH_MP_TAC CONNECTED_CLOSURE THEN
15722     MATCH_MP_TAC CONNECTED_CONTINUOUS_IMAGE THEN
15723     EXPAND_TAC "A" THEN CONJ_TAC THENL
15724      [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
15725             CONTINUOUS_ON_SUBSET)) THEN
15726       SIMP_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_ELIM_THM];
15727       ONCE_REWRITE_TAC[NORM_ARITH `norm z = norm(z - vec 0)`] THEN
15728       SIMP_TAC[CONNECTED_ANNULUS; DIMINDEX_2; LE_REFL]];
15729     ALL_TAC] THEN
15730   SUBGOAL_THEN
15731    `!n. ((X:num->complex->bool) n) SUBSET closure s`
15732   ASSUME_TAC THENL
15733    [GEN_TAC THEN EXPAND_TAC "X" THEN REWRITE_TAC[] THEN
15734     MATCH_MP_TAC SUBSET_CLOSURE THEN EXPAND_TAC "s" THEN
15735     MATCH_MP_TAC IMAGE_SUBSET THEN  EXPAND_TAC "A" THEN
15736     SIMP_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_ELIM_THM];
15737     ALL_TAC] THEN
15738   SUBGOAL_THEN `!m n. m <= n ==> (X:num->complex->bool) n SUBSET X m`
15739   ASSUME_TAC THENL
15740    [MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN STRIP_TAC THEN
15741     EXPAND_TAC "X" THEN MATCH_MP_TAC SUBSET_CLOSURE THEN
15742     MATCH_MP_TAC IMAGE_SUBSET THEN EXPAND_TAC "A" THEN
15743     REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN GEN_TAC THEN
15744     MATCH_MP_TAC(REAL_ARITH
15745      `n <= m ==> &1 - n < x /\ x < &1 ==> &1 - m < x /\ x < &1`) THEN
15746     MATCH_MP_TAC REAL_LE_INV2 THEN
15747     ASM_REWRITE_TAC[REAL_LE_RADD; REAL_OF_NUM_LE] THEN REAL_ARITH_TAC;
15748     ALL_TAC] THEN
15749   COND_CASES_TAC THENL
15750    [MATCH_MP_TAC CONNECTED_NEST THEN
15751     ASM_REWRITE_TAC[COMPACT_EQ_BOUNDED_CLOSED] THEN
15752     ASM_MESON_TAC[BOUNDED_SUBSET; BOUNDED_CLOSURE];
15753     ALL_TAC] THEN
15754   SUBGOAL_THEN `!n. ~(bounded((X:num->complex->bool) n))` ASSUME_TAC THENL
15755    [X_GEN_TAC `n:num` THEN DISCH_TAC THEN
15756     UNDISCH_TAC `~bounded(s:complex->bool)` THEN EXPAND_TAC "s" THEN
15757     REWRITE_TAC[] THEN MATCH_MP_TAC BOUNDED_SUBSET THEN EXISTS_TAC
15758       `IMAGE (f:complex->complex)
15759              (cball(Cx(&0),&1 - inv(&n + &2)) UNION A n)` THEN
15760     CONJ_TAC THENL
15761      [REWRITE_TAC[IMAGE_UNION; BOUNDED_UNION] THEN CONJ_TAC THENL
15762        [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
15763         MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN SIMP_TAC[COMPACT_CBALL] THEN
15764         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
15765             CONTINUOUS_ON_SUBSET)) THEN
15766         SIMP_TAC[SUBSET; COMPLEX_IN_CBALL_0; COMPLEX_IN_BALL_0] THEN
15767         GEN_TAC THEN MATCH_MP_TAC(REAL_ARITH
15768          `&0 < e ==> x <= &1 - e ==> x < &1`) THEN
15769         ASM_REWRITE_TAC[REAL_LT_INV_EQ] THEN REAL_ARITH_TAC;
15770         FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
15771               BOUNDED_SUBSET)) THEN EXPAND_TAC "X" THEN
15772         REWRITE_TAC[CLOSURE_SUBSET]];
15773       MATCH_MP_TAC IMAGE_SUBSET THEN EXPAND_TAC "A" THEN
15774       REWRITE_TAC[SUBSET; IN_UNION; COMPLEX_IN_BALL_0; COMPLEX_IN_CBALL_0;
15775                   IN_ELIM_THM] THEN REAL_ARITH_TAC];
15776     ALL_TAC] THEN
15777   X_GEN_TAC `c:complex->bool` THEN REPEAT DISCH_TAC THEN
15778   SUBGOAL_THEN `closed(INTERS {X n:complex->bool | n IN (:num)})`
15779   ASSUME_TAC THENL
15780    [ASM_SIMP_TAC[CLOSED_INTERS; FORALL_IN_GSPEC]; ALL_TAC] THEN
15781   SUBGOAL_THEN `closed(c:complex->bool)` ASSUME_TAC THENL
15782    [ASM_MESON_TAC[CLOSED_COMPONENTS]; ALL_TAC] THEN
15783   SUBGOAL_THEN `compact(c:complex->bool)` ASSUME_TAC THENL
15784    [ASM_REWRITE_TAC[COMPACT_EQ_BOUNDED_CLOSED]; ALL_TAC] THEN
15785   SUBGOAL_THEN
15786    `?k:complex->bool.
15787         c SUBSET k /\ compact k /\
15788         k SUBSET INTERS {X n | n IN (:num)} /\
15789         closed(INTERS {X n | n IN (:num)} DIFF k)`
15790   STRIP_ASSUME_TAC THENL
15791    [MP_TAC(ISPECL[`INTERS {X n:complex->bool | n IN (:num)}`;`c:complex->bool`]
15792         SURA_BURA_CLOSED) THEN
15793     ASM_REWRITE_TAC[OPEN_IN_CLOSED_IN_EQ; TOPSPACE_EUCLIDEAN_SUBTOPOLOGY] THEN
15794     MATCH_MP_TAC(MESON[]
15795      `~(c = i {}) /\ (~(f = {}) ==> P)
15796       ==> c = i f ==> P`) THEN
15797     CONJ_TAC THENL
15798      [REWRITE_TAC[INTERS_0] THEN ASM_MESON_TAC[NOT_BOUNDED_UNIV];
15799       REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN MATCH_MP_TAC MONO_EXISTS THEN
15800       X_GEN_TAC `k:complex->bool` THEN REWRITE_TAC[IN_ELIM_THM] THEN
15801       ASM_MESON_TAC[CLOSED_IN_CLOSED_TRANS]];
15802     ALL_TAC] THEN
15803   MP_TAC(ISPECL [`k:complex->bool`;
15804                  `INTERS {X n:complex->bool | n IN (:num)} DIFF k`]
15805         SEPARATION_NORMAL_COMPACT) THEN
15806   ASM_SIMP_TAC[NOT_EXISTS_THM; SET_RULE `k INTER (s DIFF k) = {}`] THEN
15807   MAP_EVERY X_GEN_TAC [`v:complex->bool`; `v':complex->bool`] THEN
15808   STRIP_TAC THEN
15809   SUBGOAL_THEN `v INTER (INTERS {X n:complex->bool | n IN (:num)} DIFF k) = {}`
15810   ASSUME_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
15811   MP_TAC(ISPECL
15812    [`closure(v) DIFF v:complex->bool`;
15813     `{X n INTER closure(v:complex->bool) | n IN (:num)}`]
15814    COMPACT_IMP_FIP) THEN
15815   ASM_SIMP_TAC[COMPACT_DIFF; FORALL_IN_GSPEC; CLOSED_INTER; CLOSED_CLOSURE;
15816                NOT_IMP] THEN
15817   CONJ_TAC THENL
15818    [ALL_TAC;
15819     SUBGOAL_THEN
15820      `INTERS {X n INTER closure v :complex->bool | n IN (:num)} =
15821       INTERS {X n | n IN (:num)} INTER closure v`
15822     SUBST1_TAC THENL
15823      [REWRITE_TAC[INTERS_GSPEC; EXTENSION; IN_ELIM_THM; IN_INTER; IN_UNIV] THEN
15824       MESON_TAC[];
15825       MP_TAC(ISPECL [`v':complex->bool`; `v:complex->bool`]
15826         OPEN_INTER_CLOSURE_EQ_EMPTY) THEN
15827       ASM_REWRITE_TAC[] THEN ASM SET_TAC[]]] THEN
15828   ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
15829   REWRITE_TAC[FINITE_SUBSET_IMAGE; SUBSET_UNIV; LEFT_IMP_EXISTS_THM] THEN
15830   ONCE_REWRITE_TAC[SWAP_FORALL_THM] THEN
15831   REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_UNWIND_THM2] THEN
15832   X_GEN_TAC `i:num->bool` THEN STRIP_TAC THEN
15833   FIRST_ASSUM(MP_TAC o SPEC `\n:num. n` o MATCH_MP UPPER_BOUND_FINITE_SET) THEN
15834   REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
15835   ASM_CASES_TAC `i:num->bool = {}` THENL
15836    [ASM_REWRITE_TAC[IMAGE_CLAUSES; INTERS_0; INTER_UNIV] THEN
15837     MP_TAC(ISPEC `v:complex->bool` FRONTIER_EQ_EMPTY) THEN
15838     ASM_SIMP_TAC[frontier; INTERIOR_OPEN] THEN DISCH_THEN SUBST1_TAC THEN
15839     DISCH_THEN(DISJ_CASES_THEN SUBST_ALL_TAC) THENL
15840      [FIRST_ASSUM(MP_TAC o MATCH_MP IN_COMPONENTS_NONEMPTY) THEN
15841       ASM SET_TAC[];
15842       ASM_MESON_TAC[CLOSURE_UNIV; COMPACT_IMP_BOUNDED; NOT_BOUNDED_UNIV]];
15843     ALL_TAC] THEN
15844   SUBGOAL_THEN `?n:num. n IN i /\ !m. m IN i ==> m <= n`
15845    (X_CHOOSE_TAC `p:num`) THENL
15846    [MAP_EVERY UNDISCH_TAC [`~(i:num->bool = {})`; `FINITE(i:num->bool)`] THEN
15847     POP_ASSUM_LIST(K ALL_TAC) THEN SPEC_TAC(`i:num->bool`,`i:num->bool`) THEN
15848     MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
15849     REWRITE_TAC[EXISTS_IN_INSERT; FORALL_IN_INSERT; NOT_INSERT_EMPTY] THEN
15850     MAP_EVERY X_GEN_TAC [`n:num`; `i:num->bool`] THEN
15851     ASM_CASES_TAC `i:num->bool = {}` THEN
15852     ASM_REWRITE_TAC[LE_REFL; NOT_IN_EMPTY] THEN
15853     DISCH_THEN(X_CHOOSE_THEN `p:num` STRIP_ASSUME_TAC o CONJUNCT1) THEN
15854     DISJ_CASES_TAC(ARITH_RULE `n:num <= p \/ p <= n`) THEN
15855     ASM_MESON_TAC[LE_TRANS];
15856     ALL_TAC] THEN
15857   SUBGOAL_THEN
15858    `INTERS (IMAGE (\n:num. X n INTER closure v) i):complex->bool =
15859     X p INTER closure v`
15860   SUBST1_TAC THENL
15861    [REWRITE_TAC[EXTENSION; INTERS_IMAGE; IN_ELIM_THM; IN_INTER] THEN
15862     ASM SET_TAC[];
15863     ALL_TAC] THEN
15864   DISCH_THEN(ASSUME_TAC o MATCH_MP (SET_RULE
15865     `(c DIFF v) INTER (x INTER c) = {} ==> x INTER c SUBSET v`)) THEN
15866   SUBGOAL_THEN `connected((X:num->complex->bool) p)` MP_TAC THENL
15867    [ASM_MESON_TAC[]; ALL_TAC] THEN
15868   REWRITE_TAC[CONNECTED_CLOPEN] THEN
15869   DISCH_THEN(MP_TAC o SPEC `(X:num->complex->bool) p INTER closure v`) THEN
15870   REWRITE_TAC[NOT_IMP; DE_MORGAN_THM] THEN REPEAT CONJ_TAC THENL
15871    [SUBGOAL_THEN `(X:num->complex->bool) p INTER closure v = X p INTER v`
15872     SUBST1_TAC THENL
15873      [MP_TAC(ISPEC `v:complex->bool` CLOSURE_SUBSET) THEN ASM SET_TAC[];
15874       MATCH_MP_TAC OPEN_IN_OPEN_INTER THEN ASM_REWRITE_TAC[]];
15875     MATCH_MP_TAC CLOSED_IN_CLOSED_INTER THEN REWRITE_TAC[CLOSED_CLOSURE];
15876     MATCH_MP_TAC(SET_RULE `!k. k SUBSET s /\ ~(k = {}) ==> ~(s = {})`) THEN
15877     EXISTS_TAC `k:complex->bool` THEN CONJ_TAC THENL
15878      [MP_TAC(ISPEC `v:complex->bool` CLOSURE_SUBSET) THEN ASM SET_TAC[];
15879       FIRST_ASSUM(MP_TAC o MATCH_MP IN_COMPONENTS_NONEMPTY) THEN
15880       ASM SET_TAC[]];
15881     DISCH_THEN(MP_TAC o AP_TERM `bounded:(complex->bool)->bool`) THEN
15882     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC BOUNDED_SUBSET THEN
15883     EXISTS_TAC `closure v:complex->bool` THEN
15884     ASM_SIMP_TAC[COMPACT_IMP_BOUNDED] THEN SET_TAC[]]);;
15885
15886 (* ------------------------------------------------------------------------- *)
15887 (* Yet another set of equivalences based on *continuous* logs and sqrts.     *)
15888 (* ------------------------------------------------------------------------- *)
15889
15890 let SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG,SIMPLY_CONNECTED_EQ_CONTINUOUS_SQRT =
15891   (CONJ_PAIR o prove)
15892  (`(!s. open s
15893         ==> (simply_connected s <=>
15894              connected s /\
15895              !f. f continuous_on s /\ (!z:complex. z IN s ==> ~(f z = Cx(&0)))
15896                  ==> ?g. g continuous_on s /\
15897                          !z. z IN s ==> f z = cexp(g z))) /\
15898    (!s. open s
15899         ==> (simply_connected s <=>
15900              connected s /\
15901              !f. f continuous_on s /\ (!z:complex. z IN s ==> ~(f z = Cx(&0)))
15902                  ==> ?g. g continuous_on s /\
15903                          !z. z IN s ==> f z = g z pow 2))`,
15904   REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `s:complex->bool` THEN
15905   ASM_CASES_TAC `open(s:complex->bool)` THEN ASM_REWRITE_TAC[] THEN
15906   ASM_CASES_TAC `connected(s:complex->bool)` THEN ASM_REWRITE_TAC[] THENL
15907    [ALL_TAC; ASM_MESON_TAC[SIMPLY_CONNECTED_IMP_CONNECTED]] THEN
15908   MATCH_MP_TAC(TAUT
15909    `(p ==> q) /\ (q ==> r) /\ (r ==> p) ==> (p <=> q) /\ (p <=> r)`) THEN
15910   REPEAT CONJ_TAC THENL
15911    [ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] THEN
15912     STRIP_TAC THEN ASM_REWRITE_TAC[CONTINUOUS_ON_EMPTY; NOT_IN_EMPTY] THEN
15913     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homeomorphic]) THEN
15914     REWRITE_TAC[homeomorphism; LEFT_IMP_EXISTS_THM] THEN
15915     MAP_EVERY X_GEN_TAC [`k:complex->complex`; `h:complex->complex`] THEN
15916     STRIP_TAC THEN X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
15917     MP_TAC(ISPECL
15918      [`(f:complex->complex) o (h:complex->complex)`; `Cx(&0)`; `&1`]
15919         CONTINUOUS_LOGARITHM_ON_BALL) THEN
15920     ASM_REWRITE_TAC[o_THM] THEN ANTS_TAC THENL
15921      [CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
15922       MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
15923       ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
15924       DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
15925       EXISTS_TAC `(g:complex->complex) o (k:complex->complex)` THEN
15926       REWRITE_TAC[o_THM] THEN CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
15927       MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
15928       ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]];
15929     DISCH_TAC THEN X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
15930     FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`) THEN ASM_SIMP_TAC[] THEN
15931     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
15932     EXISTS_TAC `\z:complex. cexp(g z / Cx(&2))` THEN
15933     ASM_SIMP_TAC[GSYM CEXP_N; COMPLEX_RING `Cx(&2) * z / Cx(&2) = z`] THEN
15934     GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
15935     MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
15936     REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
15937     MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN
15938     ASM_SIMP_TAC[CONTINUOUS_ON_CONST] THEN
15939     CONV_TAC COMPLEX_RING;
15940     DISCH_TAC THEN ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOLOMORPHIC_SQRT] THEN
15941     X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
15942     FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`) THEN
15943     ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
15944     MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
15945     STRIP_TAC THEN ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN] THEN
15946     X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
15947     SUBGOAL_THEN `~((g:complex->complex) z = Cx(&0))` ASSUME_TAC THENL
15948      [ASM_MESON_TAC[COMPLEX_RING `Cx(&0) pow 2 = Cx(&0)`]; ALL_TAC] THEN
15949     EXISTS_TAC `complex_derivative f z / (Cx(&2) * g z)` THEN
15950     REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT] THEN
15951     MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
15952     EXISTS_TAC `\x:complex. (f(x) - f(z)) / (x - z) / (g(x) + g(z))` THEN
15953     SUBGOAL_THEN
15954       `?d. &0 < d /\
15955            !w:complex. w IN s /\ w IN ball(z,d) ==> ~(g w + g z = Cx(&0))`
15956     STRIP_ASSUME_TAC THENL
15957      [FIRST_ASSUM(MP_TAC o SPEC `z:complex` o
15958       GEN_REWRITE_RULE I [continuous_on]) THEN ASM_REWRITE_TAC[] THEN
15959       DISCH_THEN(MP_TAC o SPEC `norm((g:complex->complex) z)`) THEN
15960       ASM_REWRITE_TAC[COMPLEX_NORM_NZ] THEN MATCH_MP_TAC MONO_EXISTS THEN
15961       ONCE_REWRITE_TAC[DIST_SYM] THEN
15962       REWRITE_TAC[IN_BALL; GSYM COMPLEX_VEC_0] THEN
15963       MESON_TAC[NORM_ARITH `dist(z,x) < norm z ==> ~(x + z = vec 0)`];
15964       ALL_TAC] THEN
15965     EXISTS_TAC `ball(z:complex,d) INTER s` THEN
15966     ASM_REWRITE_TAC[IN_INTER; CENTRE_IN_BALL] THEN REPEAT CONJ_TAC THENL
15967      [ASM_SIMP_TAC[OPEN_INTER; OPEN_BALL];
15968       ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
15969        `~(x = z) /\ ~(gx + gz = Cx(&0))
15970         ==> (gx pow 2 - gz pow 2) / (x - z) / (gx + gz) =
15971              (gx - gz) / (x - z)`) THEN
15972       ASM_SIMP_TAC[];
15973       MATCH_MP_TAC LIM_COMPLEX_DIV THEN
15974       ASM_REWRITE_TAC[COMPLEX_ENTIRE; GSYM HAS_COMPLEX_DERIVATIVE_AT] THEN
15975       REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE; CX_INJ] THEN
15976       REWRITE_TAC[COMPLEX_MUL_2; REAL_OF_NUM_EQ; ARITH_EQ] THEN CONJ_TAC THENL
15977        [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]; ALL_TAC] THEN
15978       MATCH_MP_TAC LIM_ADD THEN REWRITE_TAC[LIM_CONST; GSYM CONTINUOUS_AT] THEN
15979       ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
15980                     CONTINUOUS_ON_INTERIOR; INTERIOR_OPEN]]]);;
15981
15982 (* ------------------------------------------------------------------------- *)
15983 (* A per-function version for continuous logs, a kind of monodromy.          *)
15984 (* ------------------------------------------------------------------------- *)
15985
15986 let WINDING_NUMBER_COMPOSE_CEXP = prove
15987  (`!p. path p
15988        ==> winding_number(cexp o p,Cx(&0)) =
15989            Cx(&1) / (Cx(&2) * Cx pi * ii) * (pathfinish p - pathstart p)`,
15990   REPEAT STRIP_TAC THEN
15991   SUBGOAL_THEN
15992    `?e. &0 < e /\
15993        !t:real^1. t IN interval[vec 0,vec 1] ==> e <= norm(cexp(p t))`
15994   STRIP_ASSUME_TAC THENL
15995    [EXISTS_TAC `setdist({Cx(&0)},path_image (cexp o p))` THEN
15996     REWRITE_TAC[SETDIST_POS_LE; REAL_ARITH
15997      `&0 < x <=> &0 <= x /\ ~(x = &0)`] THEN
15998     ASM_SIMP_TAC[PATH_CONTINUOUS_IMAGE; CONTINUOUS_ON_CEXP; CLOSED_SING;
15999      SETDIST_EQ_0_CLOSED_COMPACT; COMPACT_PATH_IMAGE; PATH_IMAGE_NONEMPTY] THEN
16000     REWRITE_TAC[NOT_INSERT_EMPTY; path_image; IMAGE_o] THEN CONJ_TAC THENL
16001      [MP_TAC CEXP_NZ THEN SET_TAC[]; REPEAT STRIP_TAC] THEN
16002     ONCE_REWRITE_TAC[GSYM NORM_NEG] THEN
16003     REWRITE_TAC[COMPLEX_RING `--x = Cx(&0) - x`] THEN
16004     REWRITE_TAC[GSYM dist] THEN MATCH_MP_TAC SETDIST_LE_DIST THEN
16005     ASM SET_TAC[];
16006     ALL_TAC] THEN
16007   MP_TAC(ISPECL [`path_image(p:real^1->complex)`; `Cx(&0)`]
16008         BOUNDED_SUBSET_CBALL) THEN
16009   ASM_SIMP_TAC[BOUNDED_PATH_IMAGE; LEFT_IMP_EXISTS_THM] THEN
16010   X_GEN_TAC `B:real` THEN REWRITE_TAC[SUBSET; COMPLEX_IN_CBALL_0] THEN
16011   STRIP_TAC THEN
16012   MP_TAC(ISPECL [`cexp`; `cball(Cx(&0),B + &1)`]
16013         COMPACT_UNIFORMLY_CONTINUOUS) THEN
16014   REWRITE_TAC[CONTINUOUS_ON_CEXP; COMPACT_CBALL] THEN
16015   REWRITE_TAC[uniformly_continuous_on] THEN
16016   DISCH_THEN(MP_TAC o SPEC `e:real`) THEN
16017   ASM_REWRITE_TAC[COMPLEX_IN_CBALL_0] THEN
16018   DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
16019   MP_TAC(ISPECL [`p:real^1->complex`; `min (&1) d`]
16020       PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
16021   ASM_REWRITE_TAC[REAL_LT_MIN; REAL_LT_01; LEFT_IMP_EXISTS_THM] THEN
16022   X_GEN_TAC `g:real^1->complex` THEN STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
16023   EXISTS_TAC `winding_number(cexp o g,Cx(&0))` THEN CONJ_TAC THENL
16024    [CONV_TAC SYM_CONV THEN MATCH_MP_TAC WINDING_NUMBER_NEARBY_PATHS_EQ THEN
16025     ASM_SIMP_TAC[PATH_CONTINUOUS_IMAGE; CONTINUOUS_ON_CEXP;
16026                  PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
16027     ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
16028     REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_SUB_RZERO; o_THM] THEN
16029     REWRITE_TAC[GSYM dist] THEN MATCH_MP_TAC REAL_LTE_TRANS THEN
16030     EXISTS_TAC `e:real` THEN ASM_SIMP_TAC[] THEN
16031     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC[dist] THEN
16032     MATCH_MP_TAC(NORM_ARITH
16033      `norm(g - p) < &1 /\ norm(p) <= B
16034       ==> norm(p) <= B + &1 /\ norm(g) <= B + &1`) THEN
16035     ASM_SIMP_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16036     REWRITE_TAC[path_image] THEN ASM SET_TAC[];
16037     W(MP_TAC o
16038       PART_MATCH (lhs o rand) WINDING_NUMBER_VALID_PATH o lhs o snd) THEN
16039     REWRITE_TAC[PATH_INTEGRAL_INTEGRAL; COMPLEX_SUB_RZERO] THEN ANTS_TAC THENL
16040      [REWRITE_TAC[path_image; IN_IMAGE; o_THM; CEXP_NZ] THEN
16041       REWRITE_TAC[valid_path] THEN
16042       MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
16043       MATCH_MP_TAC DIFFERENTIABLE_ON_COMPOSE THEN
16044       REWRITE_TAC[differentiable_on] THEN REPEAT STRIP_TAC THENL
16045        [MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
16046         REWRITE_TAC[differentiable] THEN
16047         ASM_MESON_TAC[has_vector_derivative;
16048                         HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION];
16049         GEN_REWRITE_TAC LAND_CONV [GSYM ETA_AX] THEN
16050         MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_IMP_DIFFERENTIABLE THEN
16051         COMPLEX_DIFFERENTIABLE_TAC];
16052       DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
16053       EXISTS_TAC `integral (interval [vec 0,vec 1])
16054                     (\x. vector_derivative (g:real^1->complex) (at x))` THEN
16055       CONJ_TAC THENL
16056        [MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
16057         REWRITE_TAC[o_THM] THEN MATCH_MP_TAC(COMPLEX_FIELD
16058          `~(e = Cx(&0)) /\ v' = e * v ==> Cx(&1) / e * v' = v`) THEN
16059         REWRITE_TAC[CEXP_NZ] THEN
16060         MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_UNIQUE_AT THEN
16061         MP_TAC(ISPECL [`g:real^1->complex`; `cexp`;
16062          `\h. drop h % vector_derivative (g:real^1->complex) (at t)`;
16063          `\w. cexp(g(t:real^1)) * w`; `t:real^1`]
16064         DIFF_CHAIN_AT) THEN
16065         REWRITE_TAC[GSYM has_vector_derivative; GSYM has_complex_derivative;
16066                     GSYM VECTOR_DERIVATIVE_WORKS;
16067                     HAS_COMPLEX_DERIVATIVE_CEXP; differentiable] THEN
16068         ANTS_TAC THENL
16069          [ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION;
16070                         has_vector_derivative];
16071           REWRITE_TAC[has_vector_derivative; o_DEF] THEN
16072           MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
16073           REWRITE_TAC[FUN_EQ_THM; COMPLEX_CMUL] THEN
16074           CONV_TAC COMPLEX_RING];
16075         MP_TAC(ISPECL [`g:real^1->complex`;
16076                         `\x. vector_derivative (g:real^1->complex) (at x)`;
16077                        `vec 0:real^1`; `vec 1:real^1`]
16078           FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN
16079         ASM_REWRITE_TAC[DROP_VEC; REAL_POS] THEN ANTS_TAC THENL
16080          [REPEAT STRIP_TAC THEN
16081           MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_AT_WITHIN THEN
16082           REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
16083           REWRITE_TAC[differentiable] THEN
16084           ASM_MESON_TAC[has_vector_derivative;
16085                         HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION];
16086           DISCH_THEN(SUBST1_TAC o MATCH_MP INTEGRAL_UNIQUE) THEN
16087           RULE_ASSUM_TAC(REWRITE_RULE[pathstart; pathfinish]) THEN
16088           ASM_REWRITE_TAC[pathstart; pathfinish]]]]]);;
16089
16090 let MONODROMY_CONTINUOUS_LOG = prove
16091  (`!f:complex->complex s.
16092         open s /\ f continuous_on s /\
16093         (!z. z IN s ==> ~(f z = Cx(&0)))
16094         ==> ((!p. path p /\ path_image p SUBSET s /\
16095                   pathfinish p = pathstart p
16096                   ==> winding_number(f o p,Cx(&0)) = Cx(&0)) <=>
16097              (?g. g continuous_on s /\ !z. z IN s ==> f(z) = cexp(g z)))`,
16098   let lemma = prove
16099    (`!f g s p.
16100            f continuous_on s /\ g continuous_on s /\
16101            (!z:complex. z IN s ==> f(z) = cexp(g z)) /\
16102            path p /\ path_image p SUBSET s
16103            ==> winding_number(f o p,Cx(&0)) =
16104                Cx(&1) / (Cx(&2) * Cx pi * ii) *
16105                (pathfinish(g o p) - pathstart(g o p))`,
16106     REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
16107     EXISTS_TAC `winding_number(cexp o g o (p:real^1->complex),Cx(&0))` THEN
16108     CONJ_TAC THENL
16109      [MATCH_MP_TAC WINDING_NUMBER_NEARBY_PATHS_EQ THEN
16110       REPEAT CONJ_TAC THENL
16111        [MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
16112         REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
16113         MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
16114         ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
16115         MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
16116         ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
16117         REWRITE_TAC[PATHSTART_COMPOSE] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16118         ASM_MESON_TAC[SUBSET; PATHSTART_IN_PATH_IMAGE];
16119         REWRITE_TAC[PATHFINISH_COMPOSE] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16120         ASM_MESON_TAC[SUBSET; PATHFINISH_IN_PATH_IMAGE];
16121         GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[o_THM; COMPLEX_SUB_RZERO] THEN
16122         MATCH_MP_TAC(NORM_ARITH
16123          `x = y /\ ~(z = vec 0) ==> norm(x - y) < norm z`) THEN
16124         REWRITE_TAC[COMPLEX_VEC_0; CEXP_NZ] THEN
16125         FIRST_X_ASSUM MATCH_MP_TAC THEN
16126         ASM_MESON_TAC[SUBSET; path_image; IN_IMAGE]];
16127       MATCH_MP_TAC WINDING_NUMBER_COMPOSE_CEXP THEN
16128       ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
16129       MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
16130       ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]]) in
16131   REPEAT STRIP_TAC THEN EQ_TAC THENL
16132    [ALL_TAC;
16133     DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16134     X_GEN_TAC `p:real^1->complex` THEN STRIP_TAC THEN
16135     MP_TAC(ISPECL [`f:complex->complex`; `g:complex->complex`;
16136                    `s:complex->bool`; `p:real^1->complex`]
16137         lemma) THEN
16138     ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
16139     REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_RZERO]] THEN
16140   DISCH_TAC THEN
16141   EXISTS_TAC `\z. let c = connected_component s (z:complex) in
16142                   let z0 = (@) c in
16143                   let p = @p. path p /\ path_image p SUBSET c /\
16144                               pathstart p = z0 /\ pathfinish p = z in
16145                   Cx(&2) * Cx(pi) * ii * winding_number(f o p,Cx(&0)) +
16146                   clog(f z0)` THEN
16147
16148   CONJ_TAC THENL
16149    [ALL_TAC;
16150     X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
16151     REPEAT LET_TAC THEN
16152     SUBGOAL_THEN `(z:complex) IN c` ASSUME_TAC THENL
16153      [ASM_MESON_TAC[CONNECTED_COMPONENT_REFL; IN]; ALL_TAC] THEN
16154     SUBGOAL_THEN `(z0:complex) IN c` ASSUME_TAC THENL
16155      [EXPAND_TAC "z0" THEN REWRITE_TAC[IN] THEN MATCH_MP_TAC SELECT_AX THEN
16156       ASM_MESON_TAC[IN];
16157       ALL_TAC] THEN
16158     SUBGOAL_THEN `(c:complex->bool) SUBSET s` ASSUME_TAC THENL
16159      [ASM_MESON_TAC[CONNECTED_COMPONENT_SUBSET]; ALL_TAC] THEN
16160     SUBGOAL_THEN `connected(c:complex->bool)` ASSUME_TAC THENL
16161      [ASM_MESON_TAC[CONNECTED_CONNECTED_COMPONENT]; ALL_TAC] THEN
16162     SUBGOAL_THEN `open(c:complex->bool)` ASSUME_TAC THENL
16163      [ASM_MESON_TAC[OPEN_CONNECTED_COMPONENT]; ALL_TAC] THEN
16164     SUBGOAL_THEN `path_connected(c:complex->bool)` ASSUME_TAC THENL
16165      [ASM_MESON_TAC[CONNECTED_OPEN_PATH_CONNECTED]; ALL_TAC] THEN
16166     SUBGOAL_THEN
16167      `path p /\ path_image p SUBSET c /\
16168       pathstart p = z0 /\ pathfinish p = (z:complex)`
16169     STRIP_ASSUME_TAC THENL
16170      [EXPAND_TAC "p" THEN CONV_TAC SELECT_CONV THEN
16171       FIRST_X_ASSUM(MATCH_MP_TAC o REWRITE_RULE[path_connected]) THEN
16172       ASM_REWRITE_TAC[];
16173       ALL_TAC] THEN
16174     MP_TAC(ISPECL [`(f:complex->complex) o (p:real^1->complex)`; `Cx(&0)`]
16175       WINDING_NUMBER_AHLFORS_FULL) THEN
16176     REWRITE_TAC[CEXP_ADD] THEN ANTS_TAC THENL
16177      [CONJ_TAC THENL
16178        [MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
16179         ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
16180         REWRITE_TAC[path_image; IMAGE_o] THEN
16181         REWRITE_TAC[GSYM path_image] THEN ASM SET_TAC[]];
16182       ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
16183       REWRITE_TAC[COMPLEX_SUB_RZERO] THEN DISCH_THEN SUBST1_TAC THEN
16184       AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN MATCH_MP_TAC CEXP_CLOG THEN
16185       ASM SET_TAC[]]] THEN
16186   MATCH_MP_TAC CONTINUOUS_ON_COMPONENTS THEN
16187   ASM_REWRITE_TAC[] THEN X_GEN_TAC `c:complex->bool` THEN DISCH_TAC THEN
16188   ABBREV_TAC `z0:complex = (@) c` THEN
16189   MATCH_MP_TAC CONTINUOUS_ON_EQ THEN
16190   ABBREV_TAC
16191    `g = \z. let p = @p. path p /\ path_image p SUBSET c /\
16192                         pathstart p = z0 /\ pathfinish p = z in
16193             Cx(&2) * Cx(pi) * ii * winding_number(f o p,Cx(&0)) +
16194             clog(f(z0:complex))` THEN
16195   EXISTS_TAC `g:complex->complex` THEN REWRITE_TAC[] THEN CONJ_TAC THENL
16196    [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN EXPAND_TAC "g" THEN
16197     CONV_TAC(TOP_DEPTH_CONV let_CONV) THEN EXPAND_TAC "z0" THEN
16198     SUBGOAL_THEN `connected_component s (z:complex) = c`
16199      (fun th -> REWRITE_TAC[th]) THEN
16200     FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_COMPONENTS]) THEN
16201     ASM_MESON_TAC[CONNECTED_COMPONENT_EQ];
16202     ALL_TAC] THEN
16203   SUBGOAL_THEN `(z0:complex) IN c` ASSUME_TAC THENL
16204    [EXPAND_TAC "z0" THEN REWRITE_TAC[IN] THEN MATCH_MP_TAC SELECT_AX THEN
16205     FIRST_ASSUM(MP_TAC o MATCH_MP IN_COMPONENTS_NONEMPTY) THEN SET_TAC[];
16206     ALL_TAC] THEN
16207   SUBGOAL_THEN `(c:complex->bool) SUBSET s` ASSUME_TAC THENL
16208    [ASM_MESON_TAC[IN_COMPONENTS_SUBSET]; ALL_TAC] THEN
16209   SUBGOAL_THEN `connected(c:complex->bool)` ASSUME_TAC THENL
16210    [ASM_MESON_TAC[IN_COMPONENTS_CONNECTED]; ALL_TAC] THEN
16211   SUBGOAL_THEN `open(c:complex->bool)` ASSUME_TAC THENL
16212    [ASM_MESON_TAC[OPEN_COMPONENTS]; ALL_TAC] THEN
16213   SUBGOAL_THEN `path_connected(c:complex->bool)` ASSUME_TAC THENL
16214    [ASM_MESON_TAC[CONNECTED_OPEN_PATH_CONNECTED]; ALL_TAC] THEN
16215   SUBGOAL_THEN
16216    `!x. x IN c
16217         ==> ?p. path (p:real^1->complex) /\ path_image p SUBSET c /\
16218                 pathstart p = z0 /\ pathfinish p = x /\
16219                 g(x) = Cx(&2) * Cx pi * ii * winding_number(f o p,Cx(&0)) +
16220                        clog (f z0)`
16221    (LABEL_TAC "*")
16222   THENL
16223    [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN EXPAND_TAC "g" THEN
16224     ABBREV_TAC `p = @p. path p /\ path_image p SUBSET c /\
16225                         pathstart p = z0 /\ pathfinish p = (z:complex)` THEN
16226     EXISTS_TAC `p:real^1->complex` THEN
16227     CONV_TAC(TOP_DEPTH_CONV let_CONV) THEN REWRITE_TAC[] THEN
16228     EXPAND_TAC "p" THEN CONV_TAC SELECT_CONV THEN
16229     FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [path_connected]) THEN
16230     ASM_REWRITE_TAC[];
16231     ALL_TAC] THEN
16232   ASM_SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT] THEN
16233   X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16234   FIRST_ASSUM(MP_TAC o SPEC `z:complex` o GEN_REWRITE_RULE I
16235    [OPEN_CONTAINS_BALL]) THEN
16236   ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `e:real` THEN
16237   STRIP_TAC THEN
16238   MP_TAC(SPEC `ball(z:complex,e)` SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG) THEN
16239   SIMP_TAC[OPEN_BALL; CONVEX_BALL; CONVEX_IMP_SIMPLY_CONNECTED] THEN
16240   DISCH_THEN(MP_TAC o SPEC `f:complex->complex` o CONJUNCT2) THEN
16241   ANTS_TAC THENL
16242    [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; SUBSET];
16243     DISCH_THEN(X_CHOOSE_THEN `l:complex->complex` STRIP_ASSUME_TAC)] THEN
16244   REWRITE_TAC[CONTINUOUS_AT] THEN ONCE_REWRITE_TAC[LIM_NULL] THEN
16245   MATCH_MP_TAC LIM_TRANSFORM_AT THEN
16246   ONCE_REWRITE_TAC[DIST_SYM] THEN EXISTS_TAC
16247    `\w. Cx (&2) * Cx pi * ii *
16248         winding_number((f:complex->complex) o linepath(z,w),Cx(&0))` THEN
16249   EXISTS_TAC `e:real` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
16250    [X_GEN_TAC `w:complex` THEN STRIP_TAC THEN REMOVE_THEN "*"
16251      (fun th -> MP_TAC(SPEC `w:complex` th) THEN
16252                 MP_TAC(SPEC `z:complex` th)) THEN
16253     ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
16254     X_GEN_TAC `p:real^1->complex` THEN STRIP_TAC THEN
16255     ANTS_TAC THENL [ASM_MESON_TAC[SUBSET; IN_BALL; DIST_SYM]; ALL_TAC] THEN
16256     DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
16257     ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(COMPLEX_RING
16258      `(z + x) - y = Cx(&0)
16259       ==> a * b * c * x = (a * b * c * y + l) - (a * b * c * z + l)`) THEN
16260     FIRST_X_ASSUM(MP_TAC o SPEC
16261      `p ++ linepath(z:complex,w) ++ reversepath q`) THEN
16262     ASM_SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
16263                  PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
16264                  PATH_JOIN_EQ; PATH_LINEPATH; PATH_REVERSEPATH;
16265                  PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_JOIN] THEN
16266     ASM_REWRITE_TAC[UNION_SUBSET; PATH_IMAGE_REVERSEPATH] THEN ANTS_TAC THENL
16267      [REPEAT STRIP_TAC THEN
16268       MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `c:complex->bool` THEN
16269       ASM_REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
16270       MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,e)` THEN
16271       ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
16272       ASM_REWRITE_TAC[INSERT_SUBSET; CENTRE_IN_BALL; EMPTY_SUBSET] THEN
16273       ASM_REWRITE_TAC[IN_BALL; CONVEX_BALL];
16274       DISCH_THEN(fun th -> GEN_REWRITE_TAC RAND_CONV [GSYM th]) THEN
16275       REWRITE_TAC[PATH_COMPOSE_JOIN; PATH_COMPOSE_REVERSEPATH] THEN
16276       W(MP_TAC o PART_MATCH (lhand o rand) WINDING_NUMBER_JOIN o
16277         rand o snd) THEN
16278       ANTS_TAC THENL
16279        [ALL_TAC;
16280         DISCH_THEN SUBST1_TAC THEN
16281         REWRITE_TAC[VECTOR_SUB; GSYM VECTOR_ADD_ASSOC] THEN
16282         AP_TERM_TAC THEN
16283         W(MP_TAC o PART_MATCH (lhand o rand) WINDING_NUMBER_JOIN o
16284           rand o snd) THEN
16285         ANTS_TAC THENL
16286          [ALL_TAC;
16287           DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN
16288           MATCH_MP_TAC(GSYM WINDING_NUMBER_REVERSEPATH)]] THEN
16289       ASM_SIMP_TAC[PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
16290                  PATHSTART_COMPOSE; PATHFINISH_COMPOSE; PATH_IMAGE_REVERSEPATH;
16291                  PATHSTART_JOIN; PATHFINISH_JOIN; PATH_REVERSEPATH;
16292                  PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_JOIN;
16293                  PATH_IMAGE_JOIN; IN_UNION; DE_MORGAN_THM] THEN
16294       REWRITE_TAC[PATH_IMAGE_COMPOSE; SET_RULE
16295        `~(z IN IMAGE f s) <=> !x. x IN s ==> ~(f x = z)`] THEN
16296       REPEAT CONJ_TAC THEN
16297       ((MATCH_MP_TAC PATH_CONTINUOUS_IMAGE)
16298        ORELSE
16299        (X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
16300         FIRST_X_ASSUM MATCH_MP_TAC)) THEN
16301       ASM_REWRITE_TAC[PATH_LINEPATH] THEN
16302       TRY(FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
16303             CONTINUOUS_ON_SUBSET)) THEN
16304           REWRITE_TAC[SUBSET] THEN X_GEN_TAC `x:complex` THEN STRIP_TAC) THEN
16305       FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
16306       TRY(FIRST_X_ASSUM(fun th ->
16307             MATCH_MP_TAC(GEN_REWRITE_RULE I [SUBSET] th) THEN
16308             FIRST_X_ASSUM ACCEPT_TAC)) THEN
16309       UNDISCH_TAC `(x:complex) IN path_image(linepath(z,w))` THEN
16310       SPEC_TAC(`x:complex`,`x:complex`) THEN
16311       REWRITE_TAC[GSYM SUBSET; PATH_IMAGE_LINEPATH; SEGMENT_CONVEX_HULL] THEN
16312       MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,e)` THEN
16313       ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
16314       ASM_REWRITE_TAC[INSERT_SUBSET; CENTRE_IN_BALL; EMPTY_SUBSET] THEN
16315       ASM_REWRITE_TAC[IN_BALL; CONVEX_BALL]];
16316     MATCH_MP_TAC LIM_TRANSFORM THEN
16317     EXISTS_TAC `\w. Cx(&2) * Cx pi * ii *
16318                     Cx(&1) / (Cx(&2) * Cx pi * ii) *
16319                     (pathfinish(l o linepath(z:complex,w)) -
16320                      pathstart (l o linepath(z,w)))` THEN
16321     REWRITE_TAC[] THEN CONJ_TAC THENL
16322      [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
16323       EXISTS_TAC `e:real` THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
16324       ASM_REWRITE_TAC[] THEN X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
16325       REWRITE_TAC[VECTOR_ARITH `x - y = vec 0 <=> y = x`] THEN
16326       REPLICATE_TAC 3 AP_TERM_TAC THEN MATCH_MP_TAC lemma THEN
16327       EXISTS_TAC `ball(z:complex,e)` THEN ASM_REWRITE_TAC[PATH_LINEPATH] THEN
16328       CONJ_TAC THENL[ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; SUBSET]; ALL_TAC] THEN
16329       REWRITE_TAC[PATH_IMAGE_LINEPATH; SEGMENT_CONVEX_HULL] THEN
16330       MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
16331       ASM_REWRITE_TAC[INSERT_SUBSET; CENTRE_IN_BALL; EMPTY_SUBSET] THEN
16332       ASM_REWRITE_TAC[IN_BALL];
16333       REWRITE_TAC[COMPLEX_VEC_0] THEN
16334       REPEAT(MATCH_MP_TAC LIM_NULL_COMPLEX_LMUL) THEN
16335       REWRITE_TAC[PATHSTART_COMPOSE; PATHSTART_LINEPATH;
16336                   PATHFINISH_COMPOSE; PATHFINISH_LINEPATH] THEN
16337       REWRITE_TAC[GSYM COMPLEX_VEC_0; GSYM LIM_NULL; GSYM CONTINUOUS_AT] THEN
16338       ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; OPEN_BALL;
16339                     CENTRE_IN_BALL]]]);;
16340
16341 (* ------------------------------------------------------------------------- *)
16342 (* The winding number defines a continuous logarithm for the path itself.    *)
16343 (* ------------------------------------------------------------------------- *)
16344
16345 let WINDING_NUMBER_AS_CONTINUOUS_LOGARITHM = prove
16346  (`!p z.
16347       path p /\ ~(z IN path_image p)
16348       ==> ?q. path q /\
16349               pathfinish q - pathstart q =
16350               Cx(&2) * Cx pi * ii * winding_number(p,z) /\
16351               !t. t IN interval[vec 0,vec 1] ==> p(t) = z + cexp(q t)`,
16352   REPEAT STRIP_TAC THEN EXISTS_TAC
16353   `\t:real^1. Cx(&2) * Cx pi * ii * winding_number(subpath (vec 0) t p,z) +
16354               clog(pathstart p - z)` THEN
16355   REPEAT CONJ_TAC THENL
16356    [REWRITE_TAC[path] THEN MATCH_MP_TAC CONTINUOUS_ON_ADD THEN
16357     REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
16358     REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
16359            REWRITE_TAC[CONTINUOUS_ON_CONST]) THEN
16360     REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN
16361     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
16362     SUBGOAL_THEN `~((p:real^1->complex) t = z)` ASSUME_TAC THENL
16363      [ASM_MESON_TAC[path_image; IN_IMAGE]; ALL_TAC] THEN
16364     MP_TAC(SPEC `ball((p:real^1->complex) t,norm(p t - z))`
16365       SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG) THEN
16366     SIMP_TAC[OPEN_BALL; CONVEX_BALL; CONVEX_IMP_SIMPLY_CONNECTED] THEN
16367     DISCH_THEN(MP_TAC o SPEC `\w:complex. w - z` o CONJUNCT2) THEN
16368     SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_ID; CONTINUOUS_ON_CONST] THEN
16369     REWRITE_TAC[COMPLEX_SUB_0] THEN ANTS_TAC THENL
16370      [GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
16371       SIMP_TAC[IN_BALL; dist; REAL_LT_REFL];
16372       DISCH_THEN(X_CHOOSE_THEN `l:complex->complex` STRIP_ASSUME_TAC)] THEN
16373     ONCE_REWRITE_TAC[WINDING_NUMBER_OFFSET] THEN
16374     FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [path]) THEN
16375     GEN_REWRITE_TAC LAND_CONV [continuous_on] THEN
16376     DISCH_THEN(MP_TAC o SPEC `t:real^1`) THEN ASM_REWRITE_TAC[] THEN
16377     DISCH_THEN(MP_TAC o SPEC `norm((p:real^1->complex) t - z)`) THEN
16378     ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_SUB_EQ] THEN
16379     ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL] THEN
16380     DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
16381     REWRITE_TAC[CONTINUOUS_WITHIN] THEN ONCE_REWRITE_TAC[LIM_NULL] THEN
16382     MATCH_MP_TAC LIM_TRANSFORM_WITHIN THEN EXISTS_TAC
16383      `\u. Cx(&1) / (Cx(&2) * Cx pi * ii) *
16384           (pathfinish((l:complex->complex) o subpath t u p) -
16385            pathstart(l o subpath t u p))` THEN
16386     EXISTS_TAC `d:real` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
16387      [X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN
16388       SUBGOAL_THEN
16389        `path_image(subpath t u p) SUBSET ball(p t:complex,norm (p t - z))`
16390       ASSUME_TAC THENL
16391        [REWRITE_TAC[PATH_IMAGE_SUBPATH_GEN] THEN
16392         REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
16393         SUBGOAL_THEN
16394          `segment[t,u] SUBSET interval[vec 0,vec 1] /\
16395           segment[t,u] SUBSET ball(t:real^1,d)`
16396         MP_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
16397         CONJ_TAC THEN REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
16398         MATCH_MP_TAC HULL_MINIMAL THEN
16399         REWRITE_TAC[CONVEX_BALL; CONVEX_INTERVAL] THEN
16400         ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; CENTRE_IN_BALL] THEN
16401         ASM_REWRITE_TAC[ONCE_REWRITE_RULE[DIST_SYM] IN_BALL];
16402         ALL_TAC] THEN
16403       W(MP_TAC o PART_MATCH (rand o rand) WINDING_NUMBER_COMPOSE_CEXP o
16404         lhand o snd) THEN
16405       ANTS_TAC THENL
16406        [MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN ASM_SIMP_TAC[PATH_SUBPATH] THEN
16407         ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
16408         DISCH_THEN(SUBST1_TAC o SYM)] THEN
16409       MATCH_MP_TAC EQ_TRANS THEN
16410       EXISTS_TAC `winding_number((\w. subpath t u p w - z),Cx(&0))` THEN
16411       CONJ_TAC THENL
16412        [MATCH_MP_TAC WINDING_NUMBER_EQUAL THEN
16413         REWRITE_TAC[o_THM; GSYM path_image; SET_RULE
16414          `(!x. x IN s ==> cexp(l(subpath t u p x)) = subpath t u p x - z) <=>
16415           (!y. y IN IMAGE (subpath t u p) s ==> cexp(l y) = y - z)`] THEN
16416         ASM SET_TAC[];
16417         ONCE_REWRITE_TAC[GSYM WINDING_NUMBER_OFFSET] THEN
16418         REWRITE_TAC[ETA_AX] THEN
16419         MP_TAC(ISPECL [`p:real^1->complex`; `vec 0:real^1`; `t:real^1`;
16420                        `u:real^1`; `z:complex`]
16421           WINDING_NUMBER_SUBPATH_COMBINE) THEN
16422         ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL] THEN
16423         CONV_TAC COMPLEX_RING];
16424       REWRITE_TAC[COMPLEX_VEC_0] THEN MATCH_MP_TAC LIM_NULL_COMPLEX_LMUL THEN
16425       REWRITE_TAC[PATHSTART_COMPOSE; PATHSTART_SUBPATH;
16426                   PATHFINISH_COMPOSE; PATHFINISH_SUBPATH] THEN
16427       REWRITE_TAC[GSYM COMPLEX_VEC_0; GSYM LIM_NULL] THEN
16428       REWRITE_TAC[GSYM CONTINUOUS_WITHIN] THEN
16429       GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
16430       MATCH_MP_TAC CONTINUOUS_WITHIN_COMPOSE THEN CONJ_TAC THENL
16431        [ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN; path];
16432         MATCH_MP_TAC CONTINUOUS_AT_WITHIN THEN
16433         UNDISCH_TAC `(l:complex->complex) continuous_on
16434                      ball(p(t:real^1),norm(p t - z))` THEN
16435         SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; OPEN_BALL] THEN
16436         DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[CENTRE_IN_BALL] THEN
16437         ASM_REWRITE_TAC[VECTOR_SUB_EQ; NORM_POS_LT]]];
16438     REWRITE_TAC[pathstart; pathfinish; SUBPATH_REFL; SUBPATH_TRIVIAL] THEN
16439     MATCH_MP_TAC(COMPLEX_FIELD
16440      `w' = Cx(&0)
16441       ==> (a * b * c * w + l) - (a * b * c * w' + l) = a * b * c * w`) THEN
16442     MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
16443     MP_TAC(ISPEC `p:real^1->complex` PATHSTART_IN_PATH_IMAGE) THEN
16444     REWRITE_TAC[pathstart] THEN ASM_MESON_TAC[];
16445     X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
16446     MP_TAC(ISPECL [`subpath (vec 0) t (p:real^1->complex)`; `z:complex`]
16447         WINDING_NUMBER_AHLFORS_FULL) THEN
16448     REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
16449     ASM_SIMP_TAC[ENDS_IN_UNIT_INTERVAL; PATH_SUBPATH; CEXP_ADD;
16450       REWRITE_RULE[SET_RULE `s SUBSET t <=> !x. ~(x IN t) ==> ~(x IN s)`]
16451                   PATH_IMAGE_SUBPATH_SUBSET] THEN
16452     MATCH_MP_TAC(COMPLEX_RING
16453      `t:complex = s ==> p - z = e * s ==> p = z + e * t`) THEN
16454     REWRITE_TAC[pathstart] THEN MATCH_MP_TAC CEXP_CLOG THEN
16455     REWRITE_TAC[COMPLEX_SUB_0] THEN
16456     ASM_MESON_TAC[pathstart; PATHSTART_IN_PATH_IMAGE]]);;
16457
16458 (* ------------------------------------------------------------------------- *)
16459 (* Winding number equality is the same as path/loop homotopy in C - {0}.     *)
16460 (* ------------------------------------------------------------------------- *)
16461
16462 let WINDING_NUMBER_HOMOTOPIC_LOOPS_NULL_EQ = prove
16463  (`!p z. path p /\ ~(z IN path_image p)
16464          ==> (winding_number(p,z) = Cx(&0) <=>
16465               ?a. homotopic_loops ((:complex) DELETE z) p (\t. a))`,
16466   REPEAT STRIP_TAC THEN EQ_TAC THEN STRIP_TAC THENL
16467    [REPEAT STRIP_TAC THEN
16468     MP_TAC(SPECL [`p:real^1->complex`; `z:complex`]
16469           WINDING_NUMBER_AS_CONTINUOUS_LOGARITHM) THEN
16470     ASM_REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_LID; COMPLEX_SUB_0] THEN
16471     DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
16472     EXISTS_TAC `z + Cx(&1)` THEN
16473     MP_TAC(ISPECL [`\r:real^1->complex. pathfinish r = pathstart r`;
16474                    `q:real^1->complex`; `\t:real^1. Cx(&0)`;
16475                    `\w. z + cexp w`;
16476                    `interval[vec 0:real^1,vec 1]`; `(:complex)`;
16477                    `(:complex) DELETE z`]
16478      HOMOTOPIC_WITH_COMPOSE_CONTINUOUS_LEFT) THEN
16479     ASM_SIMP_TAC[CONTINUOUS_ON_CEXP; CONTINUOUS_ON_ADD; CONTINUOUS_ON_CONST;
16480                  CEXP_0; homotopic_loops; o_DEF] THEN
16481     ANTS_TAC THENL
16482      [REWRITE_TAC[CEXP_NZ; COMPLEX_EQ_ADD_LCANCEL_0; SET_RULE
16483        `IMAGE f UNIV SUBSET UNIV DELETE z <=> !x. ~(f x = z)`] THEN
16484       MATCH_MP_TAC HOMOTOPIC_WITH_MONO THEN
16485       EXISTS_TAC `\r:real^1->complex. pathfinish r = pathstart r` THEN
16486       CONJ_TAC THENL
16487        [REWRITE_TAC[GSYM homotopic_loops] THEN
16488         MATCH_MP_TAC HOMOTOPIC_LOOPS_LINEAR THEN
16489         ASM_REWRITE_TAC[SUBSET_UNIV] THEN
16490         REWRITE_TAC[path; pathstart; pathfinish; CONTINUOUS_ON_CONST];
16491         SIMP_TAC[pathstart; pathfinish]];
16492       MATCH_MP_TAC(ONCE_REWRITE_RULE[IMP_CONJ_ALT] HOMOTOPIC_WITH_EQ) THEN
16493      ASM_SIMP_TAC[o_THM; pathstart; pathfinish; ENDS_IN_UNIT_INTERVAL]];
16494    FIRST_ASSUM(MP_TAC o MATCH_MP WINDING_NUMBER_HOMOTOPIC_LOOPS) THEN
16495    ASM_REWRITE_TAC[GSYM LINEPATH_REFL] THEN
16496    DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
16497    FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_SUBSET) THEN
16498    REWRITE_TAC[GSYM LINEPATH_REFL; PATH_IMAGE_LINEPATH; SEGMENT_REFL] THEN
16499    SET_TAC[]]);;
16500
16501 let WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EXPLICIT_EQ = prove
16502  (`!p z. path p /\ ~(z IN path_image p)
16503          ==> (winding_number(p,z) = Cx(&0) <=>
16504               homotopic_paths ((:complex) DELETE z)
16505                               p (linepath(pathstart p,pathstart p)))`,
16506   REPEAT STRIP_TAC THEN EQ_TAC THENL
16507    [ASM_SIMP_TAC[WINDING_NUMBER_HOMOTOPIC_LOOPS_NULL_EQ] THEN
16508     REWRITE_TAC[GSYM LINEPATH_REFL; HOMOTOPIC_LOOPS_IMP_HOMOTOPIC_PATHS_NULL;
16509                 LEFT_IMP_EXISTS_THM];
16510     STRIP_TAC THEN
16511     FIRST_ASSUM(MP_TAC o MATCH_MP WINDING_NUMBER_HOMOTOPIC_PATHS) THEN
16512     ASM_REWRITE_TAC[GSYM LINEPATH_REFL] THEN
16513     DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
16514     ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE]]);;
16515
16516 let WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EQ = prove
16517  (`!p z. path p /\ ~(z IN path_image p)
16518          ==> (winding_number(p,z) = Cx(&0) <=>
16519               ?a. homotopic_paths ((:complex) DELETE z) p (\t. a))`,
16520   REPEAT STRIP_TAC THEN EQ_TAC THENL
16521    [ASM_SIMP_TAC[WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EXPLICIT_EQ] THEN
16522     REWRITE_TAC[GSYM LINEPATH_REFL] THEN MESON_TAC[];
16523     STRIP_TAC THEN
16524     FIRST_ASSUM(MP_TAC o MATCH_MP WINDING_NUMBER_HOMOTOPIC_PATHS) THEN
16525     ASM_REWRITE_TAC[GSYM LINEPATH_REFL] THEN
16526     DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
16527     FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_SUBSET) THEN
16528     REWRITE_TAC[GSYM LINEPATH_REFL; PATH_IMAGE_LINEPATH; SEGMENT_REFL] THEN
16529     SET_TAC[]]);;
16530
16531 let WINDING_NUMBER_HOMOTOPIC_PATHS_EQ = prove
16532  (`!p q z.
16533         path p /\ ~(z IN path_image p) /\
16534         path q /\ ~(z IN path_image q) /\
16535         pathstart q = pathstart p /\ pathfinish q = pathfinish p
16536         ==> (winding_number(p,z) = winding_number(q,z) <=>
16537              homotopic_paths ((:complex) DELETE z) p q)`,
16538   REPEAT STRIP_TAC THEN EQ_TAC THEN
16539   REWRITE_TAC[WINDING_NUMBER_HOMOTOPIC_PATHS] THEN DISCH_TAC THEN
16540   MP_TAC(ISPECL [`p ++ reversepath q:real^1->complex`; `z:complex`]
16541         WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EQ) THEN
16542   ASM_SIMP_TAC[PATH_JOIN; PATH_REVERSEPATH; PATH_IMAGE_JOIN; IN_UNION;
16543                PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
16544                 PATH_IMAGE_REVERSEPATH; WINDING_NUMBER_JOIN;
16545                WINDING_NUMBER_REVERSEPATH; COMPLEX_ADD_RINV] THEN
16546   REWRITE_TAC[GSYM LINEPATH_REFL] THEN STRIP_TAC THEN
16547   FIRST_ASSUM(MP_TAC o MATCH_MP
16548    (REWRITE_RULE[IMP_CONJ] HOMOTOPIC_PATHS_IMP_HOMOTOPIC_LOOPS)) THEN
16549   FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_PATHSTART) THEN
16550   ASM_REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
16551                   PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
16552                   PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
16553   DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
16554   DISCH_THEN(MP_TAC o MATCH_MP
16555     (REWRITE_RULE[IMP_CONJ] HOMOTOPIC_PATHS_LOOP_PARTS)) THEN
16556   ASM_REWRITE_TAC[]);;
16557
16558 let WINDING_NUMBER_HOMOTOPIC_LOOPS_EQ = prove
16559  (`!p q z.
16560         path p /\ pathfinish p = pathstart p /\ ~(z IN path_image p) /\
16561         path q /\ pathfinish q = pathstart q /\ ~(z IN path_image q)
16562         ==> (winding_number(p,z) = winding_number(q,z) <=>
16563              homotopic_loops ((:complex) DELETE z) p q)`,
16564   REPEAT STRIP_TAC THEN EQ_TAC THEN
16565   REWRITE_TAC[WINDING_NUMBER_HOMOTOPIC_LOOPS] THEN DISCH_TAC THEN
16566   SUBGOAL_THEN `~(pathstart p:complex = z) /\ ~(pathstart q = z)`
16567   STRIP_ASSUME_TAC THENL
16568    [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE];
16569     ALL_TAC] THEN
16570   MP_TAC(ISPECL [`(:complex)`; `z:complex`]
16571         PATH_CONNECTED_OPEN_DELETE) THEN
16572   REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; DIMINDEX_2; LE_REFL] THEN
16573   REWRITE_TAC[path_connected] THEN DISCH_THEN(MP_TAC o SPECL
16574    [`pathstart p:complex`; `pathstart q:complex`]) THEN
16575   ASM_REWRITE_TAC[IN_UNIV; IN_DELETE; LEFT_IMP_EXISTS_THM] THEN
16576   X_GEN_TAC `r:real^1->complex` THEN
16577   REWRITE_TAC[SET_RULE `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
16578   STRIP_TAC THEN SUBGOAL_THEN `~(pathstart r:complex = z)`
16579   STRIP_ASSUME_TAC THENL
16580    [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE];
16581     ALL_TAC] THEN
16582   MATCH_MP_TAC HOMOTOPIC_LOOPS_TRANS THEN
16583   EXISTS_TAC `r ++ q ++ reversepath r:real^1->complex` THEN
16584   ASM_SIMP_TAC[HOMOTOPIC_LOOPS_CONJUGATE; SET_RULE
16585     `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
16586   MATCH_MP_TAC HOMOTOPIC_PATHS_IMP_HOMOTOPIC_LOOPS THEN
16587   ASM_REWRITE_TAC[PATHFINISH_JOIN; PATHFINISH_REVERSEPATH] THEN
16588   W(MP_TAC o PART_MATCH (rand o rand) WINDING_NUMBER_HOMOTOPIC_PATHS_EQ o
16589     snd) THEN
16590   ASM_SIMP_TAC[PATH_JOIN; PATH_REVERSEPATH; PATHSTART_JOIN; PATHFINISH_JOIN;
16591                PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
16592                PATH_IMAGE_JOIN; IN_UNION; PATH_IMAGE_REVERSEPATH;
16593                WINDING_NUMBER_JOIN; WINDING_NUMBER_REVERSEPATH] THEN
16594   DISCH_THEN(SUBST1_TAC o SYM) THEN SIMPLE_COMPLEX_ARITH_TAC);;
16595
16596 (* ------------------------------------------------------------------------- *)
16597 (* A few simple corollaries from the various equivalences.                   *)
16598 (* ------------------------------------------------------------------------- *)
16599
16600 let SIMPLY_CONNECTED_INSIDE_SIMPLE_PATH = prove
16601  (`!p:real^1->real^2.
16602      simple_path p ==> simply_connected(inside(path_image p))`,
16603   REPEAT STRIP_TAC THEN
16604   FIRST_ASSUM(ASSUME_TAC o MATCH_MP SIMPLE_PATH_IMP_PATH) THEN
16605   ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_EMPTY_INSIDE;
16606                OPEN_INSIDE; CLOSED_PATH_IMAGE; INSIDE_INSIDE_EQ_EMPTY;
16607                CONNECTED_PATH_IMAGE] THEN
16608   ASM_CASES_TAC `pathstart(p):real^2 = pathfinish p` THEN
16609   ASM_SIMP_TAC[JORDAN_INSIDE_OUTSIDE; INSIDE_ARC_EMPTY; ARC_SIMPLE_PATH] THEN
16610   REWRITE_TAC[CONNECTED_EMPTY]);;
16611
16612 let SIMPLY_CONNECTED_INTER = prove
16613  (`!s t:real^2->bool.
16614         open s /\ open t /\ simply_connected s /\ simply_connected t /\
16615         connected (s INTER t)
16616         ==> simply_connected (s INTER t)`,
16617   REPEAT GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
16618   SIMP_TAC[SIMPLY_CONNECTED_EQ_WINDING_NUMBER_ZERO; OPEN_INTER] THEN
16619   REWRITE_TAC[SUBSET; IN_INTER] THEN MESON_TAC[]);;
16620
16621 (* ------------------------------------------------------------------------- *)
16622 (* Pick out the Riemann Mapping Theorem from the earlier chain.              *)
16623 (* ------------------------------------------------------------------------- *)
16624
16625 let RIEMANN_MAPPING_THEOREM = prove
16626  (`!s. open s /\ simply_connected s <=>
16627        s = {} \/
16628        s = (:real^2) \/
16629        ?f g. f holomorphic_on s /\
16630              g holomorphic_on ball(Cx(&0),&1) /\
16631              (!z. z IN s ==> f z IN ball(Cx(&0),&1) /\ g(f z) = z) /\
16632              (!z. z IN ball(Cx(&0),&1) ==> g z IN s /\ f(g z) = z)`,
16633   GEN_TAC THEN MATCH_MP_TAC(TAUT
16634    `(a ==> (b <=> c)) /\ (c ==> a) ==> (a /\ b <=> c)`) THEN
16635   REWRITE_TAC[SIMPLY_CONNECTED_EQ_BIHOLOMORPHIC_TO_DISC] THEN STRIP_TAC THEN
16636   ASM_REWRITE_TAC[OPEN_EMPTY; OPEN_UNIV] THEN
16637   SUBGOAL_THEN `s = IMAGE (g:complex->complex) (ball(Cx(&0),&1))`
16638   SUBST1_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
16639   MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
16640   ASM_SIMP_TAC[OPEN_BALL; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
16641   ASM_MESON_TAC[]);;