1 (* ========================================================================= *)
2 (* Complex path integrals and Cauchy's theorem. *)
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 (* ========================================================================= *)
9 needs "Library/binomial.ml";;
10 needs "Library/iter.ml";;
11 needs "Multivariate/realanalysis.ml";;
13 prioritize_complex();;
15 (* ------------------------------------------------------------------------- *)
16 (* A couple of extra tactics used in some proofs below. *)
17 (* ------------------------------------------------------------------------- *)
20 SUBGOAL_THEN tm STRIP_ASSUME_TAC;;
23 MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC tm THEN CONJ_TAC;;
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 (* ------------------------------------------------------------------------- *)
30 parse_as_infix("piecewise_differentiable_on",(12,"right"));;
32 let piecewise_differentiable_on = new_definition
33 `f piecewise_differentiable_on i <=>
35 (?s. FINITE s /\ !x. x IN (i DIFF s) ==> f differentiable at x)`;;
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]);;
41 let PIECEWISE_DIFFERENTIABLE_ON_SUBSET = prove
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]);;
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]);;
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]);;
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`,
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`
81 (CONJUNCTS_THEN2 ASSUME_TAC (X_CHOOSE_THEN `kt:real^N->bool`
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[]);;
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;
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[]]]);;
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]`,
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`
124 (CONJUNCTS_THEN2 ASSUME_TAC (X_CHOOSE_THEN `t:real^1->bool`
125 STRIP_ASSUME_TAC))) THEN
127 [SUBGOAL_THEN `interval[a:real^1,b] = interval[a,c] UNION interval[c,b]`
129 [REWRITE_TAC[EXTENSION; IN_UNION; IN_INTERVAL_1] 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];
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
145 [GEN_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
146 REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB] THEN
148 FIRST_X_ASSUM MATCH_MP_TAC THEN
149 ASM_REWRITE_TAC[IN_INTERVAL_1; IN_DIFF]]));;
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]);;
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)`]);;
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]);;
181 (* ------------------------------------------------------------------------- *)
182 (* Valid paths, and their start and finish. *)
183 (* ------------------------------------------------------------------------- *)
185 let valid_path = new_definition
186 `valid_path (f:real^1->complex) <=>
187 f piecewise_differentiable_on interval[vec 0,vec 1]`;;
189 let closed_path = new_definition
190 `closed_path g <=> pathstart g = pathfinish g`;;
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
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
209 `((f:complex->complex) o (g:real^1->complex))
210 differentiable (at t within (interval(vec 0,vec 1) DIFF s))`
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
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]]]);;
227 (* ------------------------------------------------------------------------- *)
228 (* In particular, all results for paths apply. *)
229 (* ------------------------------------------------------------------------- *)
231 let VALID_PATH_IMP_PATH = prove
232 (`!g. valid_path g ==> path g`,
233 SIMP_TAC[valid_path; path; piecewise_differentiable_on]);;
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]);;
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]);;
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]);;
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]);;
251 (* ------------------------------------------------------------------------- *)
252 (* Theorems about rectifiable valid paths. *)
253 (* ------------------------------------------------------------------------- *)
255 let RECTIFIABLE_VALID_PATH = prove
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]);;
264 let PATH_LENGTH_VALID_PATH = prove
265 (`!g. valid_path g /\ rectifiable_path 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
271 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_LENGTH_DIFFERENTIABLE THEN
272 ASM_MESON_TAC[FINITE_IMP_COUNTABLE]);;
274 (* ------------------------------------------------------------------------- *)
275 (* Negligibility of valid_path image *)
276 (* ------------------------------------------------------------------------- *)
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]);;
293 (* ------------------------------------------------------------------------- *)
294 (* Integrals along a path (= piecewise differentiable function on [0,1]). *)
295 (* ------------------------------------------------------------------------- *)
297 parse_as_infix("has_path_integral",(12,"right"));;
298 parse_as_infix("path_integrable_on",(12,"right"));;
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]))
304 (interval[vec 0,vec 1])`;;
306 let path_integral = new_definition
307 `path_integral g f = @i. (f has_path_integral i) (g)`;;
309 let path_integrable_on = new_definition
310 `f path_integrable_on g <=> ?i. (f has_path_integral i) g`;;
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]);;
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]);;
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
327 REWRITE_TAC[has_path_integral] THEN MESON_TAC[HAS_INTEGRAL_UNIQUE]);;
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[]);;
333 (* ------------------------------------------------------------------------- *)
334 (* Show that we can forget about the localized derivative. *)
335 (* ------------------------------------------------------------------------- *)
337 let VECTOR_DERIVATIVE_WITHIN_INTERIOR = prove
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]);;
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
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]);;
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]);;
372 (* ------------------------------------------------------------------------- *)
373 (* Reversing a path. *)
374 (* ------------------------------------------------------------------------- *)
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`]]);;
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`]);;
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]);;
445 let PATH_INTEGRABLE_REVERSEPATH_EQ = prove
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]);;
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]);;
458 (* ------------------------------------------------------------------------- *)
459 (* Joining two paths together. *)
460 (* ------------------------------------------------------------------------- *)
462 let VALID_PATH_JOIN_EQ = prove
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
471 [DISCH_THEN(X_CHOOSE_THEN `s:real^1->bool` STRIP_ASSUME_TAC) THEN
473 [EXISTS_TAC `(vec 0) INSERT (vec 1) INSERT
474 {x:real^1 | ((&1 / &2) % x) IN s}` THEN
476 [REWRITE_TAC[FINITE_INSERT] THEN MATCH_MP_TAC FINITE_IMAGE_INJ THEN
477 ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC;
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;
488 `(g1:real^1->complex) = (\x. g1 (&2 % x)) o (\x. &1 / &2 % x)`
490 [REWRITE_TAC[FUN_EQ_THM; o_THM] THEN GEN_TAC THEN AP_TERM_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;
500 REWRITE_TAC[joinpaths] THEN
501 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
504 EXISTS_TAC `(vec 0) INSERT (vec 1) INSERT
505 {x:real^1 | ((&1 / &2) % (x + vec 1)) IN s}` THEN
507 [REWRITE_TAC[FINITE_INSERT] THEN MATCH_MP_TAC FINITE_IMAGE_INJ THEN
508 ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC;
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;
519 `(g2:real^1->complex) =
520 (\x. g2 (&2 % x - vec 1)) o (\x. &1 / &2 % (x + vec 1))`
522 [REWRITE_TAC[FUN_EQ_THM; o_THM] THEN GEN_TAC THEN AP_TERM_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
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
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;
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
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
559 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
561 [GEN_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
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
570 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
572 [GEN_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_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);;
583 let VALID_PATH_JOIN = prove
585 valid_path g1 /\ valid_path g2 /\ pathfinish g1 = pathstart g2
586 ==> valid_path(g1 ++ g2)`,
587 MESON_TAC[VALID_PATH_JOIN_EQ]);;
589 let HAS_PATH_INTEGRAL_JOIN = prove
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
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
637 [REWRITE_TAC[FINITE_INSERT] THEN MATCH_MP_TAC FINITE_IMAGE_INJ THEN
638 ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC;
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
655 [GEN_TAC THEN COND_CASES_TAC THEN REWRITE_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
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
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]));;
677 let PATH_INTEGRABLE_JOIN = prove
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
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))
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))
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`]
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
726 ASM_SIMP_TAC[REAL_ARITH `x <= &1 ==> &1 / &2 * x <= &1 / &2`] THEN
727 AP_TERM_TAC THEN VECTOR_ARITH_TAC;
729 AP_TERM_TAC THEN ASM_SIMP_TAC[REAL_ARITH
730 `&0 <= t /\ ~(t = &0) ==> ~(&1 / &2 * t + &1 / &2 <= &1 / &2)`] 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;
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
742 [ASM_MESON_TAC[REAL_ARITH
743 `t <= &1 /\ ~(t = &1) /\ abs(x - &1 / &2 * t) < abs(t - &1) / &2
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
751 [ASM_MESON_TAC[REAL_ARITH
752 `&0 <= t /\ abs(x - (&1 / &2 * t + &1 / &2)) < abs(t) / &2
753 ==> ~(x <= &1 / &2)`];
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
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
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
774 [FIRST_X_ASSUM MATCH_MP_TAC THEN
775 ASM_REWRITE_TAC[IN_DIFF; IN_INTERVAL_1; DROP_VEC];
777 REWRITE_TAC[GSYM DROP_EQ; DROP_CMUL; DROP_ADD; DROP_SUB; LIFT_DROP;
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]);;
790 (* ------------------------------------------------------------------------- *)
791 (* Reparametrizing to shift the starting point of a (closed) path. *)
792 (* ------------------------------------------------------------------------- *)
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;
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
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
824 let HAS_PATH_INTEGRAL_SHIFTPATH = prove
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
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))`
837 [MATCH_MP_TAC(INST_TYPE [`:1`,`:M`; `:2`,`:N`] HAS_INTEGRAL_UNIQUE) THEN
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
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
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
875 [REPEAT STRIP_TAC THEN REPEAT COND_CASES_TAC THEN ASM_REWRITE_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
889 SUBGOAL_THEN `(\x. f (g x) * vector_derivative g (at x)) integrable_on
890 (interval [a,vec 1])`
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];
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
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
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
924 [REPEAT STRIP_TAC THEN REPEAT COND_CASES_TAC THEN ASM_REWRITE_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
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];
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
942 SUBGOAL_THEN `(\x. f (g x) * vector_derivative g (at x)) integrable_on
943 (interval [vec 0,a])`
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];
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`]]);;
962 let HAS_PATH_INTEGRAL_SHIFTPATH_EQ = prove
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
971 `(f has_path_integral i) (shiftpath (vec 1 - a) (shiftpath a g))`
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;
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];
991 MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
992 MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
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;
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]);;
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]);;
1008 (* ------------------------------------------------------------------------- *)
1009 (* More about straight-line paths. *)
1010 (* ------------------------------------------------------------------------- *)
1012 let HAS_VECTOR_DERIVATIVE_LINEPATH_WITHIN = prove
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]);;
1021 let HAS_VECTOR_DERIVATIVE_LINEPATH_AT = prove
1023 (linepath(a,b) has_vector_derivative (b - a)) (at x)`,
1024 MESON_TAC[WITHIN_UNIV; HAS_VECTOR_DERIVATIVE_LINEPATH_WITHIN]);;
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]);;
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]);;
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]);;
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]);;
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
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]);;
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
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]);;
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]);;
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]);;
1084 (* ------------------------------------------------------------------------- *)
1085 (* Relation to subpath construction. *)
1086 (* ------------------------------------------------------------------------- *)
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
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]]]);;
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]);;
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]);;
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]);;
1137 let HAS_PATH_INTEGRAL_SUBPATH = prove
1139 valid_path g /\ f path_integrable_on g /\
1140 u IN interval[vec 0,vec 1] /\ v IN interval[vec 0,vec 1] /\
1142 ==> (f has_path_integral
1143 integral (interval[u,v])
1144 (\x. f(g x) * vector_derivative g (at x)))
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
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;
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;
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]]);;
1214 let PATH_INTEGRABLE_SUBPATH = prove
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`)
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]]);;
1228 let HAS_INTEGRAL_PATH_INTEGRAL_SUBPATH = prove
1230 valid_path g /\ f path_integrable_on g /\
1231 u IN interval[vec 0,vec 1] /\ v IN interval[vec 0,vec 1] /\
1233 ==> (((\x. f(g x) * vector_derivative g (at x))) has_integral
1234 path_integral (subpath u v g) f)
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]]);;
1245 let PATH_INTEGRAL_SUBPATH_INTEGRAL = prove
1247 valid_path g /\ f path_integrable_on g /\
1248 u IN interval[vec 0,vec 1] /\ v IN interval[vec 0,vec 1] /\
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]);;
1256 let PATH_INTEGRAL_SUBPATH_COMBINE = prove
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
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`
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]);;
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]);;
1308 (* ------------------------------------------------------------------------- *)
1309 (* Easier to reason about segments via convex hulls. *)
1310 (* ------------------------------------------------------------------------- *)
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[]);;
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);;
1330 let POINTS_IN_CONVEX_HULL = prove
1331 (`!x s. x IN s ==> x IN convex hull s`,
1332 MESON_TAC[SUBSET; HULL_SUBSET]);;
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]);;
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);;
1349 (* ------------------------------------------------------------------------- *)
1350 (* Cauchy's theorem where there's a primitive. *)
1351 (* ------------------------------------------------------------------------- *)
1353 let PATH_INTEGRAL_PRIMITIVE_LEMMA = prove
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];
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])))`
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];
1386 `(g:real^1->complex) differentiable (at x within interval[a,b])`
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];
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]);;
1403 let PATH_INTEGRAL_PRIMITIVE = prove
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
1415 let CAUCHY_THEOREM_PRIMITIVE = prove
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]);;
1423 (* ------------------------------------------------------------------------- *)
1424 (* Existence of path integral for continuous function. *)
1425 (* ------------------------------------------------------------------------- *)
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]);;
1443 (* ------------------------------------------------------------------------- *)
1444 (* A complex-specific theorem for integrals. *)
1445 (* ------------------------------------------------------------------------- *)
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);;
1453 (* ------------------------------------------------------------------------- *)
1454 (* Arithmetical combining theorems. *)
1455 (* ------------------------------------------------------------------------- *)
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]);;
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]);;
1469 let HAS_PATH_INTEGRAL_ADD = prove
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]);;
1476 let HAS_PATH_INTEGRAL_SUB = prove
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]);;
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]);;
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]);;
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]);;
1500 let HAS_PATH_INTEGRAL_EQ = prove
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`,
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[]);;
1510 let HAS_PATH_INTEGRAL_BOUND_LINEPATH = prove
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
1529 let HAS_PATH_INTEGRAL_BOUND_LINEPATH_STRONG = prove
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]]);;
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]);;
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[]);;
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[]);;
1588 (* ------------------------------------------------------------------------- *)
1589 (* Same thing non-relationally. *)
1590 (* ------------------------------------------------------------------------- *)
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]);;
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]);;
1604 let PATH_INTEGRAL_ADD = prove
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]);;
1613 let PATH_INTEGRAL_SUB = prove
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]);;
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]);;
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]);;
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]);;
1641 let PATH_INTEGRAL_EQ = prove
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]);;
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]);;
1654 let PATH_INTEGRAL_BOUND_LINEPATH = prove
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]);;
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]);;
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]);;
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]);;
1683 (* ------------------------------------------------------------------------- *)
1684 (* Arithmetic theorems for path integrability. *)
1685 (* ------------------------------------------------------------------------- *)
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]);;
1692 let PATH_INTEGRABLE_ADD = prove
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]);;
1698 let PATH_INTEGRABLE_SUB = prove
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]);;
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]);;
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]);;
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]);;
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]);;
1728 (* ------------------------------------------------------------------------- *)
1729 (* Considering a path integral "backwards". *)
1730 (* ------------------------------------------------------------------------- *)
1732 let HAS_PATH_INTEGRAL_REVERSE_LINEPATH = prove
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]);;
1739 let PATH_INTEGRAL_REVERSE_LINEPATH = prove
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]);;
1750 (* ------------------------------------------------------------------------- *)
1751 (* Splitting a path integral in a flat way. *)
1752 (* ------------------------------------------------------------------------- *)
1754 let HAS_PATH_INTEGRAL_SPLIT = prove
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;
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;
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
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;
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;
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
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]);;
1833 let PATH_INTEGRAL_SPLIT = prove
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]);;
1855 let PATH_INTEGRAL_SPLIT_LINEPATH = prove
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
1866 (* ------------------------------------------------------------------------- *)
1867 (* The special case of midpoints used in the main quadrisection. *)
1868 (* ------------------------------------------------------------------------- *)
1870 let HAS_PATH_INTEGRAL_MIDPOINT = prove
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);;
1880 let PATH_INTEGRAL_MIDPOINT = prove
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);;
1891 (* ------------------------------------------------------------------------- *)
1892 (* A couple of special case lemmas that are useful below. *)
1893 (* ------------------------------------------------------------------------- *)
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);;
1905 let HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL = prove
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
1924 MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN ASM_REWRITE_TAC[]);;
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 (* ------------------------------------------------------------------------- *)
1931 let PATH_INTEGRAL_SWAP = prove
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
1943 `integral (interval[vec 0,vec 1])
1944 (\x. path_integral h
1945 (\y. f (g x) y * vector_derivative g (at x)))` THEN
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
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))`
1958 [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART];
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]];
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
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
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)))`
1985 [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART];
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
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
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];
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
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)))`
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]]);;
2052 (* ------------------------------------------------------------------------- *)
2053 (* The key quadrisection step. *)
2054 (* ------------------------------------------------------------------------- *)
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 \/
2064 let CAUCHY_THEOREM_QUADRISECTION = prove
2066 f continuous_on (convex hull {a,b,c}) /\
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
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)`
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];
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]);;
2142 (* ------------------------------------------------------------------------- *)
2143 (* Yet at small enough scales this cannot be the case. *)
2144 (* ------------------------------------------------------------------------- *)
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]);;
2161 let HOLOMORPHIC_POINT_SMALL_TRIANGLE = prove
2163 x IN s /\ f continuous_on s /\
2164 f complex_differentiable (at x within s) /\
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
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))`
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];
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
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
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];
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)
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;
2288 (* ------------------------------------------------------------------------- *)
2289 (* Hence the most basic theorem for a triangle. *)
2290 (* ------------------------------------------------------------------------- *)
2292 let CAUCHY_THEOREM_TRIANGLE = prove
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))`,
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)
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
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
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'`;
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
2345 `f path_integrable_on (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`
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];
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
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];
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];
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}`
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
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
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
2403 REWRITE_TAC[FORALL_AND_THM] THEN STRIP_TAC 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];
2416 MP_TAC(ISPECL [`f:complex->complex`; `convex hull {a:complex,b,c}`;
2417 `x:complex`; `e / &10`] HOLOMORPHIC_POINT_SMALL_TRIANGLE) THEN
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];
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[]);;
2449 (* ------------------------------------------------------------------------- *)
2450 (* Version needing function holomorphic in interior only. *)
2451 (* ------------------------------------------------------------------------- *)
2453 let CAUCHY_THEOREM_FLAT_LEMMA = prove
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]]);;
2481 let CAUCHY_THEOREM_FLAT = prove
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
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)`];
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]);;
2503 let CAUCHY_THEOREM_TRIANGLE_INTERIOR = prove
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
2514 !y. y IN IMAGE (f:complex->complex) (convex hull {a,b,c})
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
2522 `?C. &0 < C /\ !x:complex. x IN convex hull {a,b,c} ==> norm(x) <= C`
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];
2529 `(f:complex->complex) uniformly_continuous_on (convex hull {a,b,c})`
2531 [MATCH_MP_TAC COMPACT_UNIFORMLY_CONTINUOUS THEN
2532 ASM_SIMP_TAC[FINITE_IMP_COMPACT_CONVEX_HULL; FINITE_RULES; FINITE_INSERT];
2534 REWRITE_TAC[uniformly_continuous_on] THEN DISCH_TAC THEN
2536 `f path_integrable_on
2537 (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`
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];
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];
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];
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];
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)`
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];
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];
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
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
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];
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];
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`
2621 ASM_REWRITE_TAC[COMPLEX_RING
2622 `(ab' - ab) + (bc' - bc) + (ca' - ca) =
2623 (ab' + bc' + ca') - (ab + bc + ca)`] 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)))`
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
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
2643 `!x y. x IN convex hull {a,b,c} /\ y IN convex hull {a,b,c}
2644 ==> norm(x - y) <= &2 * C`
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[];
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
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];
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
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
2692 [FIRST_X_ASSUM MATCH_MP_TAC THEN
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];
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`;
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];
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];
2718 MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2721 MP_TAC(PART_MATCH (lhand o rand) LINEPATH_IN_PATH (lhand w))) THEN
2722 ASM_MESON_TAC[SUBSET];
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];
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
2742 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
2743 REWRITE_TAC[DROP_VEC] THEN REAL_ARITH_TAC;
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
2750 [FIRST_X_ASSUM MATCH_MP_TAC THEN
2751 ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET; HULL_SUBSET; IN_INSERT];
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]));;
2760 (* ------------------------------------------------------------------------- *)
2761 (* Version allowing finite number of exceptional points. *)
2762 (* ------------------------------------------------------------------------- *)
2764 let CAUCHY_THEOREM_TRIANGLE_COFINITE = prove
2766 f continuous_on (convex hull {a,b,c}) /\
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];
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
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))`
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
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];
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
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];
2827 `f path_integrable_on
2828 (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`
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];
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
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]`
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]);;
2862 (* ------------------------------------------------------------------------- *)
2863 (* Existence of a primitive. *)
2864 (* ------------------------------------------------------------------------- *)
2866 let STARLIKE_CONVEX_SUBSET = prove
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
2882 let TRIANGLE_PATH_INTEGRALS_STARLIKE_PRIMITIVE = prove
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
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
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];
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
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]];
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]]);;
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]);;
2995 (* ------------------------------------------------------------------------- *)
2996 (* Cauchy's theorem for an open starlike set. *)
2997 (* ------------------------------------------------------------------------- *)
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]);;
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]);;
3019 (* ------------------------------------------------------------------------- *)
3020 (* For a convex set we can avoid assuming openness and boundary analyticity. *)
3021 (* ------------------------------------------------------------------------- *)
3023 let TRIANGLE_PATH_INTEGRALS_CONVEX_PRIMITIVE = prove
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
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
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
3056 REWRITE_TAC[LIM_WITHIN] THEN X_GEN_TAC `e:real` THEN DISCH_TAC 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[];
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]]]);;
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)))
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
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)
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
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[]);;
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]);;
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;
3152 (* ------------------------------------------------------------------------- *)
3153 (* In particular for a disc. *)
3154 (* ------------------------------------------------------------------------- *)
3156 let CAUCHY_THEOREM_DISC = prove
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]);;
3167 let CAUCHY_THEOREM_DISC_SIMPLE = prove
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]);;
3176 (* ------------------------------------------------------------------------- *)
3177 (* Generalize integrability to local primitives. *)
3178 (* ------------------------------------------------------------------------- *)
3180 let PATH_INTEGRAL_LOCAL_PRIMITIVE_LEMMA = prove
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
3195 let PATH_INTEGRAL_LOCAL_PRIMITIVE_ANY = prove
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];
3229 let PATH_INTEGRAL_LOCAL_PRIMITIVE = prove
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]);;
3242 (* ------------------------------------------------------------------------- *)
3243 (* In particular if a function is holomorphic. *)
3244 (* ------------------------------------------------------------------------- *)
3246 let PATH_INTEGRABLE_HOLOMORPHIC = prove
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
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]]);;
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]);;
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 (* ------------------------------------------------------------------------- *)
3289 let PATH_INTEGRAL_NEARBY_ENDS,PATH_INTEGRAL_NEARBY_LOOP = (CONJ_PAIR o prove)
3291 open s /\ path p /\ path_image p SUBSET s
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) /\
3302 open s /\ path p /\ path_image p SUBSET s
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
3320 `!z. z IN path_image p ==> ?e. &0 < e /\ ball(z:complex,e) SUBSET s`
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
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`];
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
3351 `!i:real^1. i IN k ==> &0 < ee((p i):complex)`
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`
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
3378 `q /\ (p1 \/ p2 ==> q ==> r) ==> (p1 ==> q /\ r) /\ (p2 ==> q /\ r)`) THEN
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
3394 DISCH_TAC THEN STRIP_TAC THEN
3395 X_GEN_TAC `f:complex->complex` THEN DISCH_TAC] 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)`
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
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
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
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
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
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]];
3465 MATCH_MP_TAC(TAUT `p /\ q /\ (p ==> r ==> s) ==> (p /\ q ==> r) ==> s`) THEN
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;
3473 [SUBGOAL_THEN `drop(&n / &N % vec 1) <= drop(&(SUC n) / &N % vec 1)`
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
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
3482 `(p /\ r) /\ (p /\ r ==> q /\ s) ==> p /\ q /\ r /\ s`) THEN
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
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
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]]);;
3561 (* ------------------------------------------------------------------------- *)
3562 (* Hence we can treat even non-rectifiable paths as having a "length" *)
3563 (* for bounds on analytic functions in open sets. *)
3564 (* ------------------------------------------------------------------------- *)
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]);;
3577 let PATH_INTEGRAL_BOUND_EXISTS = prove
3578 (`!s g. open s /\ valid_path g /\ path_image g SUBSET s
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]))`
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];
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
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
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]]);;
3630 (* ------------------------------------------------------------------------- *)
3631 (* Winding number. *)
3632 (* ------------------------------------------------------------------------- *)
3634 let winding_number = new_definition
3635 `winding_number(g,z) =
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`;;
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]);;
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
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[]);;
3660 let WINDING_NUMBER = prove
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
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
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`];
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`];
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]);;
3709 let WINDING_NUMBER_UNIQUE = prove
3711 path g /\ ~(z IN path_image g) /\
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
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]);;
3743 let WINDING_NUMBER_UNIQUE_LOOP = prove
3745 path g /\ ~(z IN path_image g) /\ pathfinish g = pathstart g /\
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
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]);;
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);;
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]);;
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;
3805 let WINDING_NUMBER_JOIN = prove
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
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[]]);;
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);;
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];
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);;
3877 let WINDING_NUMBER_SPLIT_LINEPATH = prove
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]]);;
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]);;
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
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`]);;
3940 (* ------------------------------------------------------------------------- *)
3941 (* A combined theorem deducing several things piecewise. *)
3942 (* ------------------------------------------------------------------------- *)
3944 let WINDING_NUMBER_JOIN_POS_COMBINED = prove
3947 ~(z IN path_image g1) /\
3948 &0 < Re(winding_number(g1,z))) /\
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);;
3961 (* ------------------------------------------------------------------------- *)
3962 (* Useful sufficient conditions for the winding number to be positive etc. *)
3963 (* ------------------------------------------------------------------------- *)
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);;
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)
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];
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);;
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
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)
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]]);;
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];
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]);;
4077 (* ------------------------------------------------------------------------- *)
4078 (* The winding number is an integer (proof from Ahlfors's book). *)
4079 (* ------------------------------------------------------------------------- *)
4081 let WINDING_NUMBER_AHLFORS_LEMMA = prove
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]) /
4090 (g(b) - z) = g(a) - z`,
4093 (g has_vector_derivative g') (at x within s) /\
4094 (f has_vector_derivative (g' / (g x - z))) (at x within s) /\
4096 ==> ((\x. cexp(--f x) * (g x - z)) has_vector_derivative Cx(&0))
4098 REPEAT STRIP_TAC THEN
4100 `cexp(--f x) * (g' - Cx(&0)) +
4101 (cexp(--f x) * --(g' / ((g:real^1->complex) x - z))) * (g x - z) = Cx(&0)`
4104 [FIRST_X_ASSUM(MP_TAC o check (is_neg o concl)) THEN
4105 CONV_TAC COMPLEX_FIELD;
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])
4118 [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4119 SIMPLE_COMPLEX_ARITH_TAC;
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
4128 ==> ?h. !y. norm(y - w) < norm(w - z)
4129 ==> (h has_complex_derivative inv(y - z)) (at y)`
4132 [REPEAT STRIP_TAC THEN
4133 MP_TAC(ISPECL [`\w:complex. inv(w - z)`;
4134 `ball(w:complex,norm(w - z))`;
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))`
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];
4149 REWRITE_TAC[IN_BALL; dist] THEN MESON_TAC[NORM_SUB];
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]) /
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];
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
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];
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))`;
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))`
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];
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];
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];
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
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])
4247 [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4248 SIMPLE_COMPLEX_ARITH_TAC;
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
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)`
4264 [SUBGOAL_THEN `(g:real^1->complex) continuous (at t within interval[a,b])`
4266 [ASM_MESON_TAC[PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON;
4267 CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN];
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];
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
4283 DISJ_CASES_TAC(REAL_ARITH `drop t <= drop u \/ drop u <= drop t`) THENL
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))`
4292 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE THEN
4293 ASM_MESON_TAC[IN_INTERVAL_1];
4295 SIMP_TAC[COMPLEX_RING `a + x = a + y <=> y:complex = x`];
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))`
4304 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE THEN
4305 ASM_MESON_TAC[IN_INTERVAL_1];
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])
4316 [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4317 SIMPLE_COMPLEX_ARITH_TAC;
4319 MATCH_MP_TAC DIFF_CHAIN_WITHIN THEN
4320 REWRITE_TAC[GSYM has_complex_derivative; GSYM has_vector_derivative] THEN
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];
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
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
4345 let WINDING_NUMBER_AHLFORS = prove
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[]);;
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)) *
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
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]);;
4383 (* ------------------------------------------------------------------------- *)
4384 (* State in terms of complex integers. Note the useful equality version. *)
4385 (* ------------------------------------------------------------------------- *)
4387 let complex_integer = new_definition
4388 `complex_integer z <=> integer(Re z) /\ Im z = &0`;;
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[]);;
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
4409 `complex_integer(winding_number(p,z)) <=>
4410 pathfinish p = pathstart p`
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
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
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]]);;
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]);;
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 (* ------------------------------------------------------------------------- *)
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
4467 ==> ?a. &0 < a /\ z + (Cx a * (w - z)) IN path_image g`,
4468 REPEAT STRIP_TAC THEN
4470 `!t. t IN interval[vec 0,vec 1] ==> ~((g:real^1->complex) t = z)`
4472 [UNDISCH_TAC `~((z:complex) IN path_image g)` THEN
4473 REWRITE_TAC[path_image; IN_IMAGE] THEN MESON_TAC[];
4475 ABBREV_TAC `r:complex = (w - z) / (pathstart g - z)` THEN
4476 STRIP_ASSUME_TAC(GSYM(SPEC `r:complex` ARG)) 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;
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[];
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];
4508 [`g:real^1->complex`; `z:complex`; `vec 0:real^1`; `t:real^1`]
4509 WINDING_NUMBER_AHLFORS) THEN
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[];
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;
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
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];
4536 ASM_SIMP_TAC[COMPLEX_DIV_RMUL; COMPLEX_SUB_0; GSYM CX_INV; GSYM CX_MUL;
4537 COMPLEX_MUL_ASSOC; GSYM real_div] 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];
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]);;
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
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]);;
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]);;
4576 (* ------------------------------------------------------------------------- *)
4577 (* One way of proving that WN=1 for a loop. *)
4578 (* ------------------------------------------------------------------------- *)
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)`,
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);;
4591 (* ------------------------------------------------------------------------- *)
4592 (* Continuity of winding number and invariance on connected sets. *)
4593 (* ------------------------------------------------------------------------- *)
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
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
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
4670 [ASM_MESON_TAC[REAL_ARITH `&0 < d /\ ~(&3 / &4 * d < x) ==> x < d`];
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
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
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;
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;
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))`
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;
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;
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];
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);;
4737 let CONTINUOUS_ON_WINDING_NUMBER = prove
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]);;
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[];
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
4759 `complex_integer(winding_number(g,w)) /\
4760 complex_integer(winding_number(g,z))`
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]);;
4769 let WINDING_NUMBER_EQ = prove
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]);;
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]);;
4793 (* ------------------------------------------------------------------------- *)
4794 (* Winding number is zero "outside" a curve, in various senses. *)
4795 (* ------------------------------------------------------------------------- *)
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];
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
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
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
4840 [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
4841 SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
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]]);;
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
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)`]);;
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]);;
4891 (* ------------------------------------------------------------------------- *)
4892 (* If a path winds round a set, it winds rounds its inside. *)
4893 (* ------------------------------------------------------------------------- *)
4895 let WINDING_NUMBER_AROUND_INSIDE = prove
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)`,
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]];
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
4924 (* ------------------------------------------------------------------------- *)
4925 (* Bounding a WN by 1/2 for a path and point in opposite halfspaces. *)
4926 (* ------------------------------------------------------------------------- *)
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
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
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]]);;
4955 let WINDING_NUMBER_IVT_POS = prove
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]);;
4970 let WINDING_NUMBER_IVT_NEG = prove
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]);;
4985 let WINDING_NUMBER_IVT_ABS = prove
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);;
5001 let WINDING_NUMBER_LT_HALF = prove
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`,
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
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
5031 SUBGOAL_THEN `&0 < a dot ((g:real^1->complex) t - z) /\
5032 &0 < a dot (g(vec 0) - z)`
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
5058 let WINDING_NUMBER_LE_HALF = prove
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
5090 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
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]);;
5097 let WINDING_NUMBER_LT_HALF_LINEPATH = prove
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;
5109 (* ------------------------------------------------------------------------- *)
5110 (* Positivity of WN for a linepath. *)
5111 (* ------------------------------------------------------------------------- *)
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
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];
5130 `segment[a,b] SUBSET
5131 {y | Im((b - a) * cnj(b - z)) <= Im((b - a) * cnj(y - z))}`
5133 [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
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
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
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]]);;
5155 (* ------------------------------------------------------------------------- *)
5156 (* Winding number for a triangle. *)
5157 (* ------------------------------------------------------------------------- *)
5159 let WINDING_NUMBER_TRIANGLE = prove
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)`,
5165 (`!a b c. vec 0 IN interior(convex hull {a,b,c})
5166 ==> ~(Im(a / b) <= &0 /\ &0 <= Im(b / c))`,
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
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
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
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))
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
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
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
5251 (linepath(c,b) ++ linepath(b,a) ++ linepath(a,c),z) = Cx(&1)`
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);;
5267 (* ------------------------------------------------------------------------- *)
5268 (* Cauchy's integral formula, again for a convex enclosing set. *)
5269 (* ------------------------------------------------------------------------- *)
5271 let CAUCHY_INTEGRAL_FORMULA_WEAK = prove
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)`;
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
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];
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
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];
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);;
5337 let CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE = prove
5339 convex s /\ f holomorphic_on 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]);;
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 (* ------------------------------------------------------------------------- *)
5357 let CAUCHY_THEOREM_HOMOTOPIC_PATHS = prove
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
5369 `!t. t IN interval[vec 0:real^1,vec 1]
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
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`
5387 [X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
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
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`];
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
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
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
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[];
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
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];
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
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
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
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]);;
5551 let CAUCHY_THEOREM_HOMOTOPIC_LOOPS = prove
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
5562 `!t. t IN interval[vec 0:real^1,vec 1]
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
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`
5578 [X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
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
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`];
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
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
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
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[];
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
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];
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
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
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
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]);;
5741 let CAUCHY_THEOREM_NULL_HOMOTOPIC = prove
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
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]]);;
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]]);;
5779 (* ------------------------------------------------------------------------- *)
5780 (* More winding number properties, including the fact that it's +-1 inside *)
5781 (* a simple closed curve. *)
5782 (* ------------------------------------------------------------------------- *)
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
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
5809 `path_integral p (\w. Cx(&1) / (w - z)) =
5810 path_integral q (\w. Cx(&1) / (w - z))`
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];
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]);;
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
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
5856 `path_integral p (\w. Cx(&1) / (w - z)) =
5857 path_integral q (\w. Cx(&1) / (w - z))`
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];
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]);;
5877 let WINDING_NUMBER_PATHS_LINEAR_EQ = prove
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[]);;
5888 let WINDING_NUMBER_LOOPS_LINEAR_EQ = prove
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[]);;
5899 let WINDING_NUMBER_NEARBY_PATHS_EQ = prove
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[]);;
5910 let WINDING_NUMBER_NEARBY_LOOPS_EQ = prove
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[]);;
5921 let WINDING_NUMBER_SUBPATH_COMBINE = prove
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
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[]]);;
5940 let WINDING_NUMBER_STRONG = prove
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
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
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]]]);;
5983 let WINDING_NUMBER_FROM_INNERPATH = prove
5984 (`!c1 c2 c a b z:complex d.
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
6005 [`c ++ reversepath(c2:real^1->complex)`; `z:complex`]
6006 WINDING_NUMBER_ZERO_IN_OUTSIDE) 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
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
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]]);;
6026 let SIMPLE_CLOSED_PATH_WINDING_NUMBER_INSIDE = prove
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))`,
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))) /\
6039 (p ++ linepath(a - e % basis 1,a + e % basis 1),z)) = &1`,
6040 REPEAT STRIP_TAC THEN
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
6047 `(a:complex) IN frontier(inside
6048 (path_image(p ++ linepath(a - e % basis 1,a + e % basis 1))))`
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;
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
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
6078 `~collinear{a - e % basis 1,c:complex,a + e % basis 1}`
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];
6089 `~(interior(convex hull {a - e % basis 1,c:complex,a + e % basis 1}) = {})`
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[];
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
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`;
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
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;
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
6151 ==> s SUBSET b /\ k SUBSET p
6152 ==> (s UNION k) INTER p = k`)) THEN
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
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
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
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
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))) /\
6224 (p ++ linepath(a - d % basis 1,a + e % basis 1),z)) = &1`,
6225 REPEAT STRIP_TAC THEN
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
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
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
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) /\
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
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];
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)`;
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];
6354 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN
6356 `(p <=> p') /\ (p /\ p' ==> (q <=> q')) ==> p /\ q ==> p' /\ q'`) THEN
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
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
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
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
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];
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
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
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
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))`
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
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
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
6472 SUBGOAL_THEN `~(a - d % basis 1:complex = a + e % basis 1)`
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
6480 `path_image q INTER segment[a - d % basis 1,a + e % basis 1] =
6481 {a - d % basis 1:complex,a + e % basis 1}`
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
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;
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
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
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`;
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
6547 `path_image (subpath (vec 0) t q) UNION
6548 path_image (subpath (vec 1) t q) :complex->bool =
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
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[];
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
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
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
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
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
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
6616 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
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
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
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
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
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
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
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
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]]);;
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]);;
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
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]]);;
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]);;
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);;
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
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
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[]);;
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]);;
6810 (* ------------------------------------------------------------------------- *)
6811 (* Partial circle path. *)
6812 (* ------------------------------------------------------------------------- *)
6814 let partcirclepath = new_definition
6815 `partcirclepath(z,r,s,t) =
6816 \x. z + Cx(r) * cexp(ii * linepath(Cx(s),Cx(t)) x)`;;
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]);;
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]);;
6830 let HAS_VECTOR_DERIVATIVE_PARTCIRCLEPATH = prove
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)))
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);;
6839 let VECTOR_DERIVATIVE_PARTCIRCLEPATH = prove
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]);;
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]);;
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]);;
6859 let PATH_IMAGE_PARTCIRCLEPATH = prove
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
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];
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]);;
6893 let PATH_IMAGE_PARTCIRCLEPATH_SUBSET = prove
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
6904 let IN_PATH_IMAGE_PARTCIRCLEPATH = prove
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[]);;
6912 let HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG = prove
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
6919 ==> norm(i) <= B * r * (t - s)`,
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
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
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
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
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];
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
6991 {z | norm(z) <= &1 /\ cexp((ii * Cx(t - s)) * z) = w}}` THEN
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];
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[];
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);;
7017 let HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH = prove
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))
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]);;
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];
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;
7056 CONV_TAC COMPLEX_RING);;
7058 let WINDING_NUMBER_PARTCIRCLEPATH_POS_LT = prove
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];
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;
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]);;
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`,
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;
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];
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
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;
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]);;
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;
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
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
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);;
7201 (* ------------------------------------------------------------------------- *)
7202 (* Special case of one complete circle. *)
7203 (* ------------------------------------------------------------------------- *)
7205 let circlepath = new_definition
7206 `circlepath(z,r) = partcirclepath(z,r,&0,&2 * pi)`;;
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]);;
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]);;
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);;
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))))
7230 REWRITE_TAC[CIRCLEPATH] THEN
7231 MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_REAL_COMPLEX THEN
7232 COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING);;
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]);;
7240 let VALID_PATH_CIRCLEPATH = prove
7241 (`!z r. valid_path (circlepath(z,r))`,
7242 REWRITE_TAC[circlepath; VALID_PATH_PARTCIRCLEPATH]);;
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;
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];
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]);;
7295 let HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH_STRONG = prove
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)`]);;
7311 let HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH = prove
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)`]);;
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]);;
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);;
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
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
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]]);;
7350 (* ------------------------------------------------------------------------- *)
7351 (* Hence the Cauchy formula for points inside a circle. *)
7352 (* ------------------------------------------------------------------------- *)
7354 let CAUCHY_INTEGRAL_CIRCLEPATH = prove
7356 f continuous_on cball(z,r) /\
7357 f holomorphic_on 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);;
7380 let CAUCHY_INTEGRAL_CIRCLEPATH_SIMPLE = prove
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]);;
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 (* ------------------------------------------------------------------------- *)
7394 let PATH_INTEGRAL_UNIFORM_LIMIT = prove
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 /\
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
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
7444 `drop(integral (interval[vec 0,vec 1]) (\x:real^1. lift(e / &2)))` THEN
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]);;
7463 let PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH = prove
7465 &0 < r /\ ~(trivial_limit net) /\
7466 eventually (\n:A. (f n) path_integrable_on circlepath(z,r)) net /\
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]);;
7483 (* ------------------------------------------------------------------------- *)
7484 (* General stepping result for derivative formulas. *)
7485 (* ------------------------------------------------------------------------- *)
7487 let CAUCHY_NEXT_DERIVATIVE = prove
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))))
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
7511 `\u x:complex. f'(x) * (inv(x - u) pow k - inv(x - w) pow 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
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];
7560 (\n. !x. x IN path_image g
7562 ((inv (x - n) pow k - inv (x - w) pow k) /
7563 (n - w) / Cx(&k) - inv(x - w) pow (k + 1)) <
7568 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
7569 SUBGOAL_THEN `bounded(IMAGE (f':complex->complex) (path_image g))`
7571 [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
7572 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
7573 ASM_SIMP_TAC[COMPACT_VALID_PATH_IMAGE];
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
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;
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;
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];
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;
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`]);;
7680 let CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH = prove
7683 (f continuous_on path_image(circlepath(z,r))) /\
7685 ==> ((\u. f(u) / (u - w) pow k) has_path_integral g w)
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))))
7694 REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_CASES_TAC `&0 <= r` THENL
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
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)`
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]]);;
7715 (* ------------------------------------------------------------------------- *)
7716 (* In particular, the first derivative formula. *)
7717 (* ------------------------------------------------------------------------- *)
7719 let CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH = prove
7721 f continuous_on cball(z,r) /\
7722 f holomorphic_on 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)))
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
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];
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);;
7749 (* ------------------------------------------------------------------------- *)
7750 (* Existence of all higher derivatives. *)
7751 (* ------------------------------------------------------------------------- *)
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];
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];
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
7779 [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
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]);;
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]);;
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]);;
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
7814 ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; higher_complex_derivative]);;
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]);;
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]);;
7834 (* ------------------------------------------------------------------------- *)
7835 (* Morera's theorem. *)
7836 (* ------------------------------------------------------------------------- *)
7838 let MORERA_LOCAL_TRIANGLE_GEN = prove
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;
7855 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `ball(a:complex,e)` THEN
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]);;
7865 let MORERA_LOCAL_TRIANGLE = prove
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
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[]);;
7903 (* ------------------------------------------------------------------------- *)
7904 (* Combining theorems for higher derivatives including Leibniz rule. *)
7905 (* ------------------------------------------------------------------------- *)
7907 let HIGHER_COMPLEX_DERIVATIVE_EQ_ITER = prove
7908 (`!n. higher_complex_derivative n = ITER n complex_derivative`,
7910 ASM_REWRITE_TAC [FUN_EQ_THM; ITER; higher_complex_derivative]);;
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]);;
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]);;
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]);;
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
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]);;
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]]);;
7954 let HIGHER_COMPLEX_DERIVATIVE_NEG = prove
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]);;
7970 let HIGHER_COMPLEX_DERIVATIVE_ADD = prove
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]);;
7987 let HIGHER_COMPLEX_DERIVATIVE_SUB = prove
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]);;
8004 let HIGHER_COMPLEX_DERIVATIVE_MUL = prove
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))`
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]]);;
8050 let HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN = prove
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]);;
8061 let HIGHER_COMPLEX_DERIVATIVE_COMPOSE_LINEAR = prove
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
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
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]]];
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;
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]]]);;
8118 let HIGHER_COMPLEX_DERIVATIVE_ADD_AT = prove
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]);;
8127 let HIGHER_COMPLEX_DERIVATIVE_SUB_AT = prove
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]);;
8136 let HIGHER_COMPLEX_DERIVATIVE_NEG_AT = prove
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]);;
8144 let HIGHER_COMPLEX_DERIVATIVE_MUL_AT = prove
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]);;
8154 (* ------------------------------------------------------------------------- *)
8155 (* Nonexistence of isolated singularities and a stronger integral formula. *)
8156 (* ------------------------------------------------------------------------- *)
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`,
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
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
8175 ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; CENTRE_IN_BALL; REAL_LT_MIN;
8176 complex_differentiable]] 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))`
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;
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
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
8206 [MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
8208 REWRITE_TAC[SUBSET; IN_BALL] THEN REAL_ARITH_TAC]));;
8210 let CAUCHY_INTEGRAL_FORMULA_CONVEX = prove
8212 convex s /\ FINITE k /\ f continuous_on s /\
8213 (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x) /\
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]]);;
8231 (* ------------------------------------------------------------------------- *)
8232 (* Formula for higher derivatives. *)
8233 (* ------------------------------------------------------------------------- *)
8235 let CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH = prove
8237 f continuous_on cball(z,r) /\
8238 f holomorphic_on ball(z,r) /\
8240 ==> ((\u. f(u) / (u - w) pow (k + 1))
8242 ((Cx(&2) * Cx(pi) * ii) / Cx(&(FACT k)) *
8243 higher_complex_derivative k f w))
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
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];
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];
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[]]);;
8291 let CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH = prove
8293 f continuous_on cball(z,r) /\
8294 f holomorphic_on 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[]);;
8310 (* ------------------------------------------------------------------------- *)
8311 (* A holomorphic function is analytic, i.e. has local power series. *)
8312 (* ------------------------------------------------------------------------- *)
8314 let HOLOMORPHIC_POWER_SERIES = prove
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
8321 `?r. &0 < r /\ f holomorphic_on cball(z,r) /\ w IN ball(z,r)`
8323 [EXISTS_TAC `(r + dist(w:complex,z)) / &2` THEN REPEAT CONJ_TAC THENL
8325 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
8326 EXISTS_TAC `ball(z:complex,r)` THEN ASM_REWRITE_TAC[SUBSET];
8328 UNDISCH_TAC `(w:complex) IN ball(z,r)` THEN
8329 REWRITE_TAC[IN_BALL; IN_CBALL] THEN NORM_ARITH_TAC;
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];
8339 `((\k. path_integral (circlepath(z,r)) (\u. f u / (u - z) pow (k + 1)) *
8341 sums path_integral (circlepath(z,r)) (\u. f u / (u - w))) (from 0)`
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))
8367 (\k. f u * (w - z) pow k / (u - z) pow (k + 1)))` THEN
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
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;
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];
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];
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
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];
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
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
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
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
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];
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];
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]);;
8473 (* ------------------------------------------------------------------------- *)
8474 (* Liouville's theorem. *)
8475 (* ------------------------------------------------------------------------- *)
8477 let LIOUVILLE_THEOREM = prove
8478 (`!f. f holomorphic_on (:complex) /\ bounded (IMAGE f (:complex))
8479 ==> ?c. !z. f(z) = c`,
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
8505 MP_TAC(SPECL [`f:complex->complex`; `w:complex`;
8506 `R:real`; `w:complex`]
8507 CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH) THEN
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];
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
8525 `Cx(&1) / (Cx(&2) * Cx pi * ii) *
8526 path_integral (circlepath (w,R)) (\u. f u / (u - w) pow 2) =
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
8536 ==> &1 / (&2 * pi * &1) * B / R pow 2 * &2 * pi * R = B / R`]);;
8538 (* ------------------------------------------------------------------------- *)
8539 (* These weaker versions don't even need the derivative formula. *)
8540 (* ------------------------------------------------------------------------- *)
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;
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)`]]);;
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
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
8605 (* ------------------------------------------------------------------------- *)
8606 (* In particular we get the Fundamental Theorem of Algebra. *)
8607 (* ------------------------------------------------------------------------- *)
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]]]);;
8624 (* ------------------------------------------------------------------------- *)
8625 (* Weierstrass convergence theorem. *)
8626 (* ------------------------------------------------------------------------- *)
8628 let HOLOMORPHIC_UNIFORM_LIMIT = prove
8629 (`!net:(A net) f g z r.
8630 ~(trivial_limit net) /\
8632 (\n. (f n) continuous_on cball(z,r) /\
8633 (f n) holomorphic_on ball(z,r))
8636 ==> eventually (\n. !x. x IN cball(z,r) ==> norm(f n x - g x) < e)
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];
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
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];
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
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`
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];
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];
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];
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];
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];
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
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
8745 `((\n:A. Cx(&2) * Cx pi * ii * f n w)
8746 --> path_integral (circlepath (z,r)) (\u. g u / (u - w))) net`
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];
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`]);;
8763 (* ------------------------------------------------------------------------- *)
8764 (* Version showing that the limit is the limit of the derivatives. *)
8765 (* ------------------------------------------------------------------------- *)
8767 let HAS_COMPLEX_DERIVATIVE_UNIFORM_LIMIT = prove
8768 (`!net:(A net) f f' g z r.
8769 &0 < r /\ ~(trivial_limit net) /\
8771 (\n. (f n) continuous_on cball(z,r) /\
8773 ==> ((f n) has_complex_derivative (f' n w)) (at w)))
8776 ==> eventually (\n. !x. x IN cball(z,r) ==> norm(f n x - g x) < e)
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
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[];
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
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[];
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];
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];
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];
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];
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]);;
8878 (* ------------------------------------------------------------------------- *)
8879 (* Some more simple/convenient versions for applications. *)
8880 (* ------------------------------------------------------------------------- *)
8882 let HOLOMORPHIC_UNIFORM_SEQUENCE = prove
8885 (!n. (f n) holomorphic_on s) /\
8887 ==> ?d. &0 < d /\ cball(x,d) SUBSET s /\
8889 ==> eventually (\n. !y. y IN cball(x,d)
8890 ==> norm(f n y - g y) < e)
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;
8904 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8905 ASM_MESON_TAC[CENTRE_IN_BALL]]);;
8907 let HAS_COMPLEX_DERIVATIVE_UNIFORM_SEQUENCE = prove
8910 (!n x. x IN s ==> ((f n) has_complex_derivative f' n x) (at x)) /\
8912 ==> ?d. &0 < d /\ cball(x,d) SUBSET s /\
8914 ==> eventually (\n. !y. y IN cball(x,d)
8915 ==> norm(f n y - g y) < e)
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]]);;
8935 (* ------------------------------------------------------------------------- *)
8936 (* A one-stop shop for an analytic function defined by a series. *)
8937 (* ------------------------------------------------------------------------- *)
8939 let SERIES_AND_DERIVATIVE_COMPARISON = prove
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)`,
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]);;
8968 (* ------------------------------------------------------------------------- *)
8969 (* A version where we only have local uniform/comparative convergence. *)
8970 (* ------------------------------------------------------------------------- *)
8972 let SERIES_AND_DERIVATIVE_COMPARISON_LOCAL = prove
8975 (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
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]);;
9015 (* ------------------------------------------------------------------------- *)
9016 (* Sometimes convenient to compare with a complex series of +ve reals. *)
9017 (* ------------------------------------------------------------------------- *)
9019 let SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX = prove
9022 (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
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]);;
9049 let SERIES_DIFFERENTIABLE_COMPARISON_COMPLEX = prove
9052 (!n x. n IN k /\ x IN s ==> (f n) complex_differentiable (at x)) /\
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)))
9059 ==> ((\n. f n x) sums g x) k /\
9060 g complex_differentiable (at x)`,
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
9071 (* ------------------------------------------------------------------------- *)
9072 (* In particular, a power series is analytic inside circle of convergence. *)
9073 (* ------------------------------------------------------------------------- *)
9075 let POWER_SERIES_AND_DERIVATIVE_0 = prove
9076 (`!k a r. summable k (\n. a(n) * Cx(r) pow n)
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])
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
9092 [REPEAT STRIP_TAC THEN COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING;
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)`;
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);;
9113 let POWER_SERIES_AND_DERIVATIVE = prove
9115 summable k (\n. a(n) * Cx(r) pow n)
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
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]);;
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
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;
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;
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);;
9173 let HOLOMORPHIC_IFF_POWER_SERIES = prove
9174 (`!f z r. f holomorphic_on ball(z,r) <=>
9176 ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
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))`;
9186 ASM_REWRITE_TAC[]);;
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]);;
9194 let ANALYTIC_IFF_POWER_SERIES = prove
9195 (`!f z r. f analytic_on ball(z,r) <=>
9197 ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
9201 SIMP_TAC[ANALYTIC_ON_OPEN; OPEN_BALL] THEN
9202 REWRITE_TAC[HOLOMORPHIC_IFF_POWER_SERIES]);;
9204 (* ------------------------------------------------------------------------- *)
9205 (* Equality between holomorphic functions, on open ball then connected set. *)
9206 (* ------------------------------------------------------------------------- *)
9208 let HOLOMORPHIC_FUN_EQ_ON_BALL = prove
9210 f holomorphic_on ball(z,r) /\ g holomorphic_on ball(z,r) /\
9212 (!n. higher_complex_derivative n f z = higher_complex_derivative n g z)
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]);;
9220 let HOLOMORPHIC_FUN_EQ_0_ON_BALL = prove
9222 w IN ball(z,r) /\ f holomorphic_on ball(z,r) /\
9223 (!n. higher_complex_derivative n f z = 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
9231 let HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED = prove
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
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]];
9256 `closed_in (subtopology euclidean s)
9258 (\n. {w | w IN s /\ higher_complex_derivative n f w = Cx(&0)})
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
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[]]]);;
9273 let HOLOMORPHIC_FUN_EQ_ON_CONNECTED = prove
9275 open s /\ connected s /\ f holomorphic_on s /\ g holomorphic_on s /\
9277 (!n. higher_complex_derivative n f z = higher_complex_derivative n g z)
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]);;
9290 let HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED = prove
9294 f holomorphic_on 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
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]);;
9313 (* ------------------------------------------------------------------------- *)
9314 (* Some basic lemmas about poles/singularities. *)
9315 (* ------------------------------------------------------------------------- *)
9317 let POLE_LEMMA = prove
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
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)`
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
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]];
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
9353 `(\z. if z = a then complex_derivative f a else (f z - f a) / (z - a))
9354 holomorphic_on ball(a,e)`
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[];
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[]);;
9391 let POLE_LEMMA_OPEN = prove
9393 open s /\ f holomorphic_on s
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];
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]);;
9413 let POLE_THEOREM = prove
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);;
9429 let POLE_THEOREM_OPEN = prove
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);;
9445 let POLE_THEOREM_0 = prove
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
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);;
9461 let POLE_THEOREM_OPEN_0 = prove
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
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);;
9477 let POLE_THEOREM_ANALYTIC = prove
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]);;
9497 let POLE_THEOREM_ANALYTIC_0 = prove
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
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);;
9515 let POLE_THEOREM_ANALYTIC_OPEN_SUPERSET = prove
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]);;
9524 let POLE_THEOREM_ANALYTIC_OPEN_SUPERSET_0 = prove
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
9532 `(\z. if z = a then complex_derivative g a
9533 else f(z) - g(a) / (z - a)) analytic_on s`
9535 [MATCH_MP_TAC POLE_THEOREM_ANALYTIC_OPEN_SUPERSET THEN ASM_MESON_TAC[];
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);;
9541 let HOLOMORPHIC_ON_EXTEND_LIM,HOLOMORPHIC_ON_EXTEND_BOUNDED =
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))) /\
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`
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
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
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;
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];
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
9606 `g = \z. if z = a then complex_derivative h a
9607 else (h z - h a) / (z - a)` THEN
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]]);;
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 (* ------------------------------------------------------------------------- *)
9623 let CAUCHY_INTEGRAL_FORMULA_GLOBAL = prove
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
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
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])
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[];
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
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];
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
9690 `bounded(IMAGE (g':real^1->complex) (interval[vec 0,vec 1]))`
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
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];
9742 `!y. ~(y IN path_image g)
9743 ==> (\x. (f x - f y) / (x - y)) path_integrable_on g`
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];
9757 `!y:complex. d y path_integrable_on g`
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[]];
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")))
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
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
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
9789 [X_GEN_TAC `x:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9790 SIMPLE_COMPLEX_ARITH_TAC;
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[];
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
9810 SUBGOAL_THEN `!z. (h:complex->complex) z = Cx(&0)` ASSUME_TAC THENL
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
9835 compact t /\ path_image g SUBSET interior t /\ t SUBSET u`
9836 STRIP_ASSUME_TAC THENL
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];
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
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;
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
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];
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
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]];
9909 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `L * (e / &2 / L)` THEN
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];
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];
9941 `(\y. (d:complex->complex->complex) (fstcart y) (sndcart y)) continuous_on
9942 {pastecart x z | x IN u /\ z IN u}`
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);
9953 `(\y. (f(sndcart y) - f(fstcart y)) / (sndcart y - fstcart y))
9954 continuous at (pastecart x z)`
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];
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
9972 `open({pastecart x z | x IN u /\ z IN u} DIFF
9973 {y | y IN UNIV /\ fstcart y - sndcart y = Cx(&0)})`
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
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];
10010 SUBGOAL_THEN `e / &2 = e / &2 / norm(z' - x') * norm(z' - x':complex)`
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) /
10016 ASM_SIMP_TAC[REAL_LE_DIV; NORM_POS_LE; REAL_LT_IMP_LE; REAL_HALF] THEN
10018 [ASM_SIMP_TAC[COMPLEX_FIELD
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];
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
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
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[]];
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
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
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
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
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}`
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
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;
10133 CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
10136 `!w. w IN u ==> (\z. d z w) holomorphic_on u`
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
10142 `((\y. (d:complex->complex->complex) (fstcart y) (sndcart y)) o
10143 (\z. pastecart y z))
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]];
10175 `!w a b:complex. w IN u /\ segment[a,b] SUBSET u
10176 ==> (\z. d z w) path_integrable_on (linepath(a,b))`
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];
10184 segment[a,b] SUBSET u
10185 ==> (\w. path_integral (linepath(a,b)) (\z. d z w))
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
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)}`
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
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)`
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
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]];
10243 `!a b. segment[a,b] SUBSET u
10244 ==> (\w. path_integral (linepath (a,b)) (\z. d z w))
10245 path_integrable_on g`
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
10251 `((\w. path_integral (linepath(a,b)) (\z. d z w)) o (g:real^1->complex))
10252 continuous_on interval[vec 0,vec 1]`
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]];
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))`
10270 MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`; `c:complex`] 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
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[]]);;
10311 let CAUCHY_THEOREM_GLOBAL = prove
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`]]);;
10338 let CAUCHY_THEOREM_GLOBAL_OUTSIDE = prove
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
10350 (* ------------------------------------------------------------------------- *)
10351 (* First Cartan Theorem. *)
10352 (* ------------------------------------------------------------------------- *)
10354 let HIGHER_COMPLEX_DERIVATIVE_COMP_LEMMA = prove
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)) /\
10361 ==> higher_complex_derivative i (g o f) z =
10362 higher_complex_derivative i g (f z)`,
10363 REPEAT GEN_TAC 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
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
10388 MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
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]];
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
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
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 []]]]);;
10446 let HIGHER_COMPLEX_DERIVATIVE_COMP_ITER_LEMMA = prove
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)) /\
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
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 []];
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 []]]);;
10490 let HIGHER_COMPLEX_DERIVATIVE_ITER_TOP_LEMMA = prove
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)) /\
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
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 [];
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];
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)`];
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];
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
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
10561 [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
10563 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
10564 ASM_MESON_TAC []]];
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
10582 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10583 ASM_REWRITE_TAC[]];
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
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`];
10602 ASM_SIMP_TAC [] THEN
10604 `higher_complex_derivative (SUC (n - i)) (ITER m f) z = Cx(&0)`
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]];
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)`];
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
10631 `(\w. complex_derivative f (ITER m f w)) = complex_derivative f o ITER m f`
10633 THENL [REWRITE_TAC [FUN_EQ_THM; o_THM]; ALL_TAC] 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)`
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
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]]);;
10657 let CAUCHY_HIGHER_COMPLEX_DERIVATIVE_BOUND = prove
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`
10668 [EQ_TRANS_TAC `higher_complex_derivative n (\w. f w) z -
10669 higher_complex_derivative n (\w. y) z` THENL
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]];
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`
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]];
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
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
10702 `!w:complex. f w IN ball(y,B0) ==> norm (f w - y) < B0`
10704 [ASM_MESON_TAC [dist; DIST_SYM; IN_BALL; CENTRE_IN_BALL];
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];
10722 `!w:complex. f w IN ball(y,B0) ==> norm (f w - y) <= B0`
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]]];
10729 REWRITE_TAC [COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_II;
10730 COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_ABS_PI;
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];
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]]);;
10748 let FIRST_CARTAN_THM_DIM_1 = prove
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
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
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]];
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]];
10785 ASSERT_TAC `ball(z:complex,r) SUBSET s` THENL
10786 [ASM_MESON_TAC [SUBSET_TRANS; BALL_SUBSET_CBALL]; ALL_TAC] THEN
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]];
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`
10798 [MATCH_MP_TAC (GSYM HIGHER_COMPLEX_DERIVATIVE_ITER_TOP_LEMMA) THEN
10799 EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [];
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
10815 [ASM_MESON_TAC [CONTINUOUS_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
10816 ASM SET_TAC []]]]);;
10818 (* ------------------------------------------------------------------------- *)
10819 (* Second Cartan Theorem. *)
10820 (* ------------------------------------------------------------------------- *)
10822 let SECOND_CARTAN_THM_DIM_1 = prove
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
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
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
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`
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
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];
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`
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]]];
10910 `!n. 2 <= n ==> higher_complex_derivative n f (Cx(&0)) = Cx(&0)`
10912 [GEN_TAC THEN DISCH_TAC THEN SUBGOAL_THEN
10914 (!u. norm u = &1 ==> u pow n * z = u * z) ==> z = Cx(&0)`
10916 [REPEAT STRIP_TAC THEN MATCH_MP_TAC
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
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
10936 (SPECL [`f:complex->complex`; `\z. c*z`; `Cx(&0)`;
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)
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
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];
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`
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)`
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`
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];
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)`
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];
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
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]];
11033 `complex_derivative f (u * g (Cx (&0))) *
11034 (u * complex_derivative g (Cx (&0))) = u`
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)`
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];
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[]];
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]];
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
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`
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]]]);;
11128 (* ------------------------------------------------------------------------- *)
11129 (* Cauchy's inequality. *)
11130 (* ------------------------------------------------------------------------- *)
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]]]]]]);;
11170 (* ------------------------------------------------------------------------- *)
11171 (* A holomorphic function f has only isolated zeros unless f is 0. *)
11172 (* ------------------------------------------------------------------------- *)
11174 let ISOLATED_ZEROS = prove
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.
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]]]]]]]);;
11346 (* ------------------------------------------------------------------------- *)
11347 (* Analytic continuation. *)
11348 (* ------------------------------------------------------------------------- *)
11350 let ANALYTIC_CONTINUATION = prove
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]]);;
11391 (* ------------------------------------------------------------------------- *)
11392 (* Open mapping theorem. *)
11393 (* ------------------------------------------------------------------------- *)
11395 let OPEN_MAPPING_THM = prove
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]];
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[]]]]]]]);;
11685 (* ------------------------------------------------------------------------- *)
11686 (* Maximum modulus principle. *)
11687 (* ------------------------------------------------------------------------- *)
11689 let MAXIMUM_MODULUS_PRINCIPLE = prove
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);;
11753 (* ------------------------------------------------------------------------- *)
11754 (* Factoring out a zero according to its order. *)
11755 (* ------------------------------------------------------------------------- *)
11757 let HOLOMORPHIC_FACTOR_ORDER_OF_ZERO = prove
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
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)`
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;
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
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];
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])
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[]]];
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[];
11834 `!w. w IN ball(z,r) ==> f w - f z = (w - z) pow n * g(w)`
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[];
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
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]];
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)`]);;
11878 let HOLOMORPHIC_FACTOR_ORDER_OF_ZERO_STRONG = prove
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
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
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`
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
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]]]);;
11948 let HOLOMORPHIC_FACTOR_ZERO_NONCONSTANT = prove
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)
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
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
11978 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
11979 HOLOMORPHIC_ON_SUBSET)) THEN
11982 (* ------------------------------------------------------------------------- *)
11983 (* Relating invertibility and nonvanishing of derivative. *)
11984 (* ------------------------------------------------------------------------- *)
11986 let HAS_COMPLEX_DERIVATIVE_LOCALLY_INJECTIVE = prove
11988 f holomorphic_on s /\ open s /\ z IN s /\
11989 ~(complex_derivative f z = Cx(&0))
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];
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]]);;
12026 let HAS_COMPLEX_DERIVATIVE_LOCALLY_INVERTIBLE = prove
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]);;
12048 let HOLOMORPHIC_INJECTIVE_IMP_REGULAR = prove
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
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
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))
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`];
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
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;
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
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
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
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]]]]);;
12166 (* ------------------------------------------------------------------------- *)
12167 (* Hence a nice clean inverse function theorem. *)
12168 (* ------------------------------------------------------------------------- *)
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) /\
12176 ==> complex_derivative f z * complex_derivative g (f z) =
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];
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
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
12197 [ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE; HOLOMORPHIC_ON_OPEN;
12198 complex_differentiable];
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]);;
12208 (* ------------------------------------------------------------------------- *)
12209 (* Holomorphism of covering maps and lifts. *)
12210 (* ------------------------------------------------------------------------- *)
12212 let COVERING_SPACE_LIFT_IS_HOLOMORPHIC = prove
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
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
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[]]);;
12257 let COVERING_SPACE_LIFT_HOLOMORPHIC = prove
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[]);;
12274 (* ------------------------------------------------------------------------- *)
12275 (* The Schwarz lemma. *)
12276 (* ------------------------------------------------------------------------- *)
12278 let SCHWARZ_LEMMA = prove
12279 (`!f. f holomorphic_on ball(Cx(&0),&1) /\
12280 (!z:complex. norm z < &1 ==> norm (f z) < &1) /\
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)`,
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`
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]];
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`
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]]])
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])
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])
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`
12379 [GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC
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
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
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
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
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]]]]);;
12482 (* ------------------------------------------------------------------------- *)
12483 (* The Schwarz reflection principle. *)
12484 (* ------------------------------------------------------------------------- *)
12486 let HOLOMORPHIC_ON_PASTE_ACROSS_LINE = prove
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} /\
12492 ==> f holomorphic_on s`,
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
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} /\
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
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
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
12539 REWRITE_TAC[HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL]]) in
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} /\
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`]
12555 MP_TAC(ISPECL [`d:complex`; `a:complex`; `c:complex`; `k:real`]
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];
12564 [`f:complex->complex`; `c:complex`; `a:complex`; `a':complex`]
12565 PATH_INTEGRAL_SPLIT_LINEPATH) THEN
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];
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') ++
12588 CAUCHY_THEOREM_CONVEX) THEN
12590 `(q /\ q' ==> r) /\ (p /\ p') ==> (p ==> q) ==> (p' ==> q') ==> r`) THEN
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
12617 convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
12619 f holomorphic_on {z | z IN s /\ d dot z < k} /\
12620 f holomorphic_on {z | z IN s /\ k < d dot z} /\
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[];
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
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} /\
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[]);;
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)))
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];
12691 `(cnj o f o cnj) holomorphic_on {z | z IN s /\ Im z < &0}`
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;
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
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
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[]]]);;
12736 (* ------------------------------------------------------------------------- *)
12737 (* Bloch's theorem. *)
12738 (* ------------------------------------------------------------------------- *)
12740 let BLOCH_LEMMA = prove
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))`,
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))))
12754 (&3 - &2 * sqrt(&2)) *
12755 r * norm(complex_derivative f (Cx(&0))))
12756 SUBSET IMAGE f (ball(Cx(&0),r))`
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
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])
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`];
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;
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`];
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
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`
12834 [REPEAT STRIP_TAC THEN
12836 [`complex_derivative f`;
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
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
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];
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)))
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
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]];
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
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
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
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;
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;
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
13023 [MATCH_MP_TAC REAL_LT_RSQRT; MATCH_MP_TAC REAL_LT_LSQRT] THEN
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];
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
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;
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
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);;
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
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;
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`]
13122 ASM_REWRITE_TAC[] THEN ANTS_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;
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]]);;
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];
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
13182 [`\z. (f:complex->complex)(a + Cx r * z) / (C * Cx r)`; `Cx(&0)`]
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)`
13189 [REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
13191 `complex_derivative f (a + Cx r * z) / C =
13192 (complex_derivative f (a + Cx r * z) * Cx r) / (C * Cx r)`
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`];
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];
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];
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
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]]);;
13251 let BLOCH_COROLLARY = prove
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
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
13271 [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `a:complex` THEN
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]];
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[]);;
13283 (* ------------------------------------------------------------------------- *)
13284 (* Schottky's theorem. *)
13285 (* ------------------------------------------------------------------------- *)
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
13292 <= exp(pi * exp(pi *
13293 (&2 + &2 * r + &12 * t / (&1 - t))))`,
13296 f holomorphic_on 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
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
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
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`))
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;
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
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
13391 ({complex(m,log(&n + sqrt(&n pow 2 - &1)) / pi) | integer m /\ 0 < n}
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
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
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
13445 [`\z:complex. Cx(&2) * f z - Cx(&1)`; `cball(Cx(&0),&1)`; `Cx(&0)`]
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
13455 [`h:complex->complex`; `cball(Cx(&0),&1)`; `Cx(&0)`]
13457 ASM_SIMP_TAC[CENTRE_IN_CBALL; REAL_POS; CONVEX_IMP_CONTRACTIBLE;
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
13472 `norm(g(Cx(&0)):complex) <= &2 + norm(f(Cx(&0)):complex)`
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
13491 `norm(g(z) - g(Cx(&0))) <= &12 * t / (&1 - t)`
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
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
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
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]);;
13600 (* ------------------------------------------------------------------------- *)
13601 (* The Little Picard Theorem. *)
13602 (* ------------------------------------------------------------------------- *)
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`,
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`];
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
13622 `!z. z IN cball(Cx(&0),&1) ==> (Cx r * z) IN cball(Cx(&0),r)`
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)`];
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];
13636 MP_TAC(ISPECL [`g:complex->complex`; `norm(f(Cx(&0)):complex)`]
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[];
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
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
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;
13663 `complex_derivative g (Cx(&0)) = Cx r * complex_derivative f (Cx(&0))`
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
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
13681 let LITTLE_PICARD = prove
13683 f holomorphic_on (:complex) /\
13684 ~(a = b) /\ IMAGE f (:complex) INTER {a,b} = {}
13685 ==> ?c. f = \x. c`,
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;
13710 `complex_derivative (\z. f (w + z / complex_derivative f w)) (Cx(&0)) =
13711 complex_derivative f w * inv(complex_derivative f w)`
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;
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
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);;
13740 (* ------------------------------------------------------------------------- *)
13741 (* A couple of little applications of Little Picard. *)
13742 (* ------------------------------------------------------------------------- *)
13744 let HOLOMORPHIC_PERIODIC_FIXPOINT = prove
13745 (`!f p. f holomorphic_on (:complex) /\ ~(p = Cx(&0)) /\ (!z. f(z + p) = f(z))
13747 REWRITE_TAC[MESON[] `(?x. P x) <=> ~(!x. ~P x)`] THEN REPEAT STRIP_TAC THEN
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
13754 [REWRITE_TAC[COMPLEX_RING `a - b:complex = c <=> a = b + c`;
13755 COMPLEX_ADD_RID] THEN
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]);;
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
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
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
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
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))`
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
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[];
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
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
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 (* ------------------------------------------------------------------------- *)
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) /\
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
13899 `!(f:num->complex->complex) (i:num).
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)`
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
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`];
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
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`];
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;
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;
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];
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
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
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];
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
14028 ==> ?N:num. !n. n >= N
14029 ==> norm((f:num->complex->complex) (r n) x - l)
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];
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
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]);;
14077 (* ------------------------------------------------------------------------- *)
14078 (* Moebius functions are biholomorphisms of the unit disc. *)
14079 (* ------------------------------------------------------------------------- *)
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)`;;
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]);;
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);;
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);;
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
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]];
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)`
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
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`
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;
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]]]);;
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
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]]);;
14173 let MOEBIUS_FUNCTION_COMPOSE = prove
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
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
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
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]]);;
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;
14236 ASM_SIMP_TAC[MOEBIUS_FUNCTION_NORM_LT_1; NORM_NEG;
14237 MOEBIUS_FUNCTION_HOLOMORPHIC; MOEBIUS_FUNCTION_EQ_ZERO]);;
14239 let BALL_BIHOLOMORPHISM_MOEBIUS_FUNCTION = prove
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
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;
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;
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
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
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
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];
14317 CONJ_TAC THENL [ASM_REWRITE_TAC [MOEBIUS_FUNCTION_EQ_ZERO]; ALL_TAC] THEN
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;
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
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
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)`
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 []]);;
14343 (* ------------------------------------------------------------------------- *)
14344 (* Some simple but useful cases of Hurwitz's theorem. *)
14345 (* ------------------------------------------------------------------------- *)
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
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
14369 `!n:num. ((\z. complex_derivative (f n) z / f n z)
14370 has_path_integral (Cx(&0))) (circlepath(z0,r / &2))`
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];
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
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
14401 [MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
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
14423 [MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
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
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
14471 [CONJ_TAC THENL [ASM_REAL_ARITH_TAC; CONV_TAC NUM_REDUCE_CONV] THEN
14472 REPEAT CONJ_TAC THENL
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
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
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;
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
14546 `(w - z0) pow m * h w * Cx(&m) / (w - z0) =
14547 (Cx(&m) * (w - z0) pow (m - 1)) * h w`
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]]]);;
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
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
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
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
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
14640 REWRITE_TAC[IN_DELETE] THEN ASM_MESON_TAC[];
14641 REWRITE_TAC[IN_DELETE] THEN ASM_MESON_TAC[]]);;
14643 (* ------------------------------------------------------------------------- *)
14644 (* A big chain of equivalents of simple connectedness for an open set. *)
14645 (* ------------------------------------------------------------------------- *)
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)
14657 ==> (simply_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))) /\
14663 ==> (simply_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)) /\
14669 ==> (simply_connected s <=>
14671 !f. f holomorphic_on s
14673 ==> (h has_complex_derivative f(z)) (at z))) /\
14675 ==> (simply_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))) /\
14681 ==> (simply_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)) /\
14687 ==> (simply_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)) /\
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))) /\
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];
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];
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
14726 (@g. vector_polynomial_function g /\ path_image g SUBSET s /\
14727 pathstart g = a /\ pathfinish g = z)
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
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];
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];
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];
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];
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]]];
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]];
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
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`
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
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]]];
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;
14900 MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
14901 MATCH_MP_TAC MONO_FORALL THEN MESON_TAC[];
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
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)`
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
14923 `?f. f holomorphic_on s /\
14925 IMAGE f s SUBSET ball(Cx(&0),&1) /\
14926 (!w z. w IN s /\ z IN s /\ f w = f z ==> w = z)`
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];
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;
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))`
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)`;
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
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];
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
15015 [ASM_MESON_TAC[HOLOMORPHIC_ON_COMPOSE]; ALL_TAC] THEN
15016 ASM_REWRITE_TAC[o_THM] THEN ASM SET_TAC[];
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[];
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
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
15049 `?f:complex->complex.
15052 ==> norm(complex_derivative h (Cx(&0)))
15053 <= norm(complex_derivative f (Cx(&0))))`
15056 `{ norm(complex_derivative h (Cx(&0))) | h IN ff}` SUP) THEN
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
15071 MP_TAC(ISPEC `\z. (f:complex->complex) (Cx(r) * z)`
15072 SCHWARZ_LEMMA) THEN
15073 ASM_REWRITE_TAC[COMPLEX_MUL_RZERO] 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)`
15080 [REPEAT STRIP_TAC THEN MATCH_MP_TAC
15081 (REWRITE_RULE[o_DEF] COMPLEX_DIFF_CHAIN_AT) THEN
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];
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]];
15113 `l = sup { norm(complex_derivative h (Cx(&0))) | h IN ff}` THEN
15114 REWRITE_TAC[FORALL_IN_GSPEC] THEN DISCH_TAC THEN
15116 `?f. (!n. (f n) IN ff) /\
15117 ((\n. Cx(norm(complex_derivative (f n) (Cx(&0))))) --> Cx(l))
15119 STRIP_ASSUME_TAC THENL
15121 `!n. ?f. f IN ff /\
15122 abs(norm(complex_derivative f (Cx (&0))) - l) < inv(&n + &1)`
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
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];
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];
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
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
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[];
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]];
15198 ASM_SIMP_TAC[] THEN
15199 SUBGOAL_THEN `~(?c. !z. z IN s ==> (g:complex->complex) z = c)`
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
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`
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
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;
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]];
15255 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `f:complex->complex` THEN
15257 MP_TAC(SPECL [`f:complex->complex`; `s:complex->bool`]
15258 HOLOMORPHIC_ON_INVERSE) THEN
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
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[];
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
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
15283 `!z. z IN s ==> norm((f:complex->complex) z) < &1`
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];
15289 `?sq. sq holomorphic_on (IMAGE (t o f) s) /\
15291 ==> sq((t:complex->complex) ((f:complex->complex) z)) pow 2 =
15293 STRIP_ASSUME_TAC THENL
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;
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[]]];
15342 ==> norm((sq:complex->complex)
15343 ((t:complex->complex)((f:complex->complex) z))) < &1`
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
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
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
15374 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
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[];
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
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
15417 [CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15418 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
15421 MATCH_MP_TAC(MESON[]
15422 `~(b1 = b2) /\ a1 = a2 ==> (a1 = b1 /\ a2 = b2 ==> F)`) THEN
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
15446 `complex_derivative f (Cx (&0)) =
15447 complex_derivative (t' o (\z:complex. z pow 2) o r') (Cx(&0)) *
15449 (r o (sq:complex->complex) o (t:complex->complex) o f) (Cx(&0))`
15450 (fun th -> REWRITE_TAC[th; COMPLEX_NORM_MUL])
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]]);;
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;
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 (* ------------------------------------------------------------------------- *)
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.
15508 ==> (simply_connected s <=>
15510 if bounded s then connected(frontier s)
15511 else !c. c IN components(frontier s) ==> ~bounded c)) /\
15513 ==> (simply_connected s <=>
15515 !c. c IN components ((:complex) DIFF s) ==> ~bounded c)) /\
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
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
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
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
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];
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
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
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
15597 `connected_component ((:complex) DIFF s) w =
15598 connected_component ((:complex) DIFF s) z`
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]]]];
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
15623 `frontier s = INTERS {X n:real^2->bool | n IN (:num)}`
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
15631 `s = IMAGE (f:real^2->real^2) (closure (D(n:num))) UNION IMAGE f (A n)`
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
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
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
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
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)`
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];
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]]]];
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]];
15731 `!n. ((X:num->complex->bool) n) SUBSET closure s`
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];
15738 SUBGOAL_THEN `!m n. m <= n ==> (X:num->complex->bool) n SUBSET X m`
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;
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];
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
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];
15777 X_GEN_TAC `c:complex->bool` THEN REPEAT DISCH_TAC THEN
15778 SUBGOAL_THEN `closed(INTERS {X n:complex->bool | n IN (:num)})`
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
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
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]];
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
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
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;
15820 `INTERS {X n INTER closure v :complex->bool | n IN (:num)} =
15821 INTERS {X n | n IN (:num)} INTER closure v`
15823 [REWRITE_TAC[INTERS_GSPEC; EXTENSION; IN_ELIM_THM; IN_INTER; IN_UNIV] THEN
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
15842 ASM_MESON_TAC[CLOSURE_UNIV; COMPACT_IMP_BOUNDED; NOT_BOUNDED_UNIV]];
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];
15858 `INTERS (IMAGE (\n:num. X n INTER closure v) i):complex->bool =
15859 X p INTER closure v`
15861 [REWRITE_TAC[EXTENSION; INTERS_IMAGE; IN_ELIM_THM; IN_INTER] 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`
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
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[]]);;
15886 (* ------------------------------------------------------------------------- *)
15887 (* Yet another set of equivalences based on *continuous* logs and sqrts. *)
15888 (* ------------------------------------------------------------------------- *)
15890 let SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG,SIMPLY_CONNECTED_EQ_CONTINUOUS_SQRT =
15891 (CONJ_PAIR o prove)
15893 ==> (simply_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))) /\
15899 ==> (simply_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
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
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
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)`];
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
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]]]);;
15982 (* ------------------------------------------------------------------------- *)
15983 (* A per-function version for continuous logs, a kind of monodromy. *)
15984 (* ------------------------------------------------------------------------- *)
15986 let WINDING_NUMBER_COMPOSE_CEXP = prove
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
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
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
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[];
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
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
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]]]]]);;
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)))`,
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
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
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`]
16138 ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
16139 REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_RZERO]] THEN
16141 EXISTS_TAC `\z. let c = connected_component s (z:complex) 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)) +
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
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
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
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
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
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];
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[];
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
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)) +
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
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
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
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
16280 DISCH_THEN SUBST1_TAC THEN
16281 REWRITE_TAC[VECTOR_SUB; GSYM VECTOR_ADD_ASSOC] THEN
16283 W(MP_TAC o PART_MATCH (lhand o rand) WINDING_NUMBER_JOIN o
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)
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]]]);;
16341 (* ------------------------------------------------------------------------- *)
16342 (* The winding number defines a continuous logarithm for the path itself. *)
16343 (* ------------------------------------------------------------------------- *)
16345 let WINDING_NUMBER_AS_CONTINUOUS_LOGARITHM = prove
16347 path p /\ ~(z IN path_image p)
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
16389 `path_image(subpath t u p) SUBSET ball(p t:complex,norm (p t - z))`
16391 [REWRITE_TAC[PATH_IMAGE_SUBPATH_GEN] THEN
16392 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] 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];
16403 W(MP_TAC o PART_MATCH (rand o rand) WINDING_NUMBER_COMPOSE_CEXP o
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
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
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
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]]);;
16458 (* ------------------------------------------------------------------------- *)
16459 (* Winding number equality is the same as path/loop homotopy in C - {0}. *)
16460 (* ------------------------------------------------------------------------- *)
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)`;
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
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
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
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];
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]]);;
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[];
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
16531 let WINDING_NUMBER_HOMOTOPIC_PATHS_EQ = prove
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[]);;
16558 let WINDING_NUMBER_HOMOTOPIC_LOOPS_EQ = prove
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];
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];
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
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);;
16596 (* ------------------------------------------------------------------------- *)
16597 (* A few simple corollaries from the various equivalences. *)
16598 (* ------------------------------------------------------------------------- *)
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]);;
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[]);;
16621 (* ------------------------------------------------------------------------- *)
16622 (* Pick out the Riemann Mapping Theorem from the earlier chain. *)
16623 (* ------------------------------------------------------------------------- *)
16625 let RIEMANN_MAPPING_THEOREM = prove
16626 (`!s. open s /\ simply_connected s <=>
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