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/moretop.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 POINTS_IN_CONVEX_HULL = prove
1323 (`!x s. x IN s ==> x IN convex hull s`,
1324 MESON_TAC[SUBSET; HULL_SUBSET]);;
1326 let CONVEX_HULL_SUBSET = prove
1327 (`(!x. x IN s ==> x IN convex hull t)
1328 ==> (convex hull s) SUBSET (convex hull t)`,
1329 REPEAT STRIP_TAC THEN MATCH_MP_TAC HULL_MINIMAL THEN
1330 ASM_REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET]);;
1332 let NOT_IN_INTERIOR_CONVEX_HULL_3 = prove
1333 (`!a b c:complex. ~(a IN interior(convex hull {a,b,c})) /\
1334 ~(b IN interior(convex hull {a,b,c})) /\
1335 ~(c IN interior(convex hull {a,b,c}))`,
1336 REPEAT GEN_TAC THEN REPEAT CONJ_TAC THEN
1337 MATCH_MP_TAC NOT_IN_INTERIOR_CONVEX_HULL THEN
1338 ASM_SIMP_TAC[CARD_CLAUSES; FINITE_INSERT; FINITE_EMPTY; IN_INSERT] THEN
1339 REWRITE_TAC[DIMINDEX_2] THEN ARITH_TAC);;
1341 (* ------------------------------------------------------------------------- *)
1342 (* Cauchy's theorem where there's a primitive. *)
1343 (* ------------------------------------------------------------------------- *)
1345 let PATH_INTEGRAL_PRIMITIVE_LEMMA = prove
1347 ~(interval[a,b] = {}) /\
1348 (!x. x IN s ==> (f has_complex_derivative f'(x)) (at x within s)) /\
1349 g piecewise_differentiable_on interval[a,b] /\
1350 (!x. x IN interval[a,b] ==> g(x) IN s)
1351 ==> ((\x. f'(g x) * vector_derivative g (at x within interval[a,b]))
1352 has_integral (f(g b) - f(g a))) (interval[a,b])`,
1353 REPEAT GEN_TAC THEN REWRITE_TAC[valid_path; piecewise_differentiable_on] THEN
1354 REWRITE_TAC[INTERVAL_EQ_EMPTY_1; REAL_NOT_LT] THEN
1355 DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
1356 FIRST_X_ASSUM(X_CHOOSE_THEN `k:real^1->bool` STRIP_ASSUME_TAC) THEN
1357 MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR_STRONG THEN
1358 EXISTS_TAC `k:real^1->bool` THEN ASM_REWRITE_TAC[DROP_VEC; REAL_POS] THEN
1359 ASM_SIMP_TAC[FINITE_IMP_COUNTABLE; GSYM o_DEF] THEN CONJ_TAC THENL
1360 [MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN ASM_REWRITE_TAC[] THEN
1361 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
1362 ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
1363 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
1364 ASM_MESON_TAC[holomorphic_on];
1366 X_GEN_TAC `x:real^1` THEN
1367 REPEAT STRIP_TAC THEN REWRITE_TAC[has_vector_derivative; COMPLEX_CMUL] THEN
1368 SUBGOAL_THEN `(f has_complex_derivative f'(g x))
1369 (at (g x) within (IMAGE g (interval[a:real^1,b])))`
1371 [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_WITHIN_SUBSET THEN
1372 EXISTS_TAC `s:complex->bool` THEN
1373 ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
1374 FIRST_X_ASSUM MATCH_MP_TAC THEN
1375 ASM_MESON_TAC[INTERVAL_OPEN_SUBSET_CLOSED; SUBSET; IN_DIFF];
1378 `(g:real^1->complex) differentiable (at x within interval[a,b])`
1380 [MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
1381 FIRST_X_ASSUM MATCH_MP_TAC THEN
1382 ASM_MESON_TAC[INTERVAL_OPEN_SUBSET_CLOSED; SUBSET; IN_DIFF];
1384 GEN_REWRITE_TAC LAND_CONV [VECTOR_DERIVATIVE_WORKS] THEN
1385 REWRITE_TAC[has_vector_derivative; IMP_IMP; has_complex_derivative] THEN
1386 DISCH_THEN(MP_TAC o MATCH_MP DIFF_CHAIN_WITHIN) THEN
1387 DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1388 HAS_DERIVATIVE_WITHIN_SUBSET)) THEN
1389 DISCH_THEN(MP_TAC o SPEC `interval(a:real^1,b)`) THEN
1390 RULE_ASSUM_TAC(REWRITE_RULE[IN_DIFF]) THEN
1391 ASM_SIMP_TAC[INTERVAL_OPEN_SUBSET_CLOSED; OPEN_INTERVAL;
1392 HAS_DERIVATIVE_WITHIN_OPEN] THEN
1393 REWRITE_TAC[o_DEF; COMPLEX_CMUL] THEN REWRITE_TAC[COMPLEX_MUL_AC]);;
1395 let PATH_INTEGRAL_PRIMITIVE = prove
1397 (!x. x IN s ==> (f has_complex_derivative f'(x)) (at x within s)) /\
1398 valid_path g /\ (path_image g) SUBSET s
1399 ==> (f' has_path_integral (f(pathfinish g) - f(pathstart g))) (g)`,
1400 REWRITE_TAC[valid_path; path_image; pathfinish; pathstart] THEN
1401 REWRITE_TAC[has_path_integral] THEN
1402 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_PRIMITIVE_LEMMA THEN
1403 ASM_REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC; REAL_POS; REAL_NOT_LT] THEN
1404 RULE_ASSUM_TAC(REWRITE_RULE[SUBSET; FORALL_IN_IMAGE]) THEN
1407 let CAUCHY_THEOREM_PRIMITIVE = prove
1409 (!x. x IN s ==> (f has_complex_derivative f'(x)) (at x within s)) /\
1410 valid_path g /\ (path_image g) SUBSET s /\
1411 pathfinish g = pathstart g
1412 ==> (f' has_path_integral Cx(&0)) (g)`,
1413 MESON_TAC[PATH_INTEGRAL_PRIMITIVE; COMPLEX_SUB_REFL]);;
1415 (* ------------------------------------------------------------------------- *)
1416 (* Existence of path integral for continuous function. *)
1417 (* ------------------------------------------------------------------------- *)
1419 let PATH_INTEGRABLE_CONTINUOUS_LINEPATH = prove
1420 (`!f a b. f continuous_on segment[a,b]
1421 ==> f path_integrable_on (linepath(a,b))`,
1422 REPEAT GEN_TAC THEN REWRITE_TAC[path_integrable_on; has_path_integral] THEN
1423 DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
1424 REWRITE_TAC[GSYM integrable_on] THEN MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
1425 MATCH_MP_TAC CONTINUOUS_ON_EQ THEN
1426 EXISTS_TAC `\x. f(linepath(a,b) x) * (b - a)` THEN
1427 SIMP_TAC[VECTOR_DERIVATIVE_LINEPATH_WITHIN] THEN
1428 ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
1429 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_LMUL THEN
1430 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
1431 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
1432 ASM_REWRITE_TAC[GSYM path_image; ETA_AX; PATH_IMAGE_LINEPATH] THEN
1433 REWRITE_TAC[CONTINUOUS_ON_LINEPATH]);;
1435 (* ------------------------------------------------------------------------- *)
1436 (* Arithmetical combining theorems. *)
1437 (* ------------------------------------------------------------------------- *)
1439 let HAS_PATH_INTEGRAL_CONST_LINEPATH = prove
1440 (`!a b c. ((\x. c) has_path_integral (c * (b - a))) (linepath(a,b))`,
1441 REPEAT GEN_TAC THEN REWRITE_TAC[HAS_PATH_INTEGRAL_LINEPATH] THEN
1442 MP_TAC(ISPECL [`vec 0:real^1`; `vec 1:real^1`; `c * (b - a):complex`]
1443 HAS_INTEGRAL_CONST) THEN
1444 REWRITE_TAC[CONTENT_UNIT; VECTOR_MUL_LID]);;
1446 let HAS_PATH_INTEGRAL_NEG = prove
1447 (`!f i g. (f has_path_integral i) g
1448 ==> ((\x. --(f x)) has_path_integral (--i)) g`,
1449 REWRITE_TAC[has_path_integral; COMPLEX_MUL_LNEG; HAS_INTEGRAL_NEG]);;
1451 let HAS_PATH_INTEGRAL_ADD = prove
1453 (f1 has_path_integral i1) g /\ (f2 has_path_integral i2) g
1454 ==> ((\x. f1(x) + f2(x)) has_path_integral (i1 + i2)) g`,
1455 REWRITE_TAC[has_path_integral; COMPLEX_ADD_RDISTRIB] THEN
1456 SIMP_TAC[HAS_INTEGRAL_ADD]);;
1458 let HAS_PATH_INTEGRAL_SUB = prove
1460 (f1 has_path_integral i1) g /\ (f2 has_path_integral i2) g
1461 ==> ((\x. f1(x) - f2(x)) has_path_integral (i1 - i2)) g`,
1462 REWRITE_TAC[has_path_integral; COMPLEX_SUB_RDISTRIB] THEN
1463 SIMP_TAC[HAS_INTEGRAL_SUB]);;
1465 let HAS_PATH_INTEGRAL_COMPLEX_LMUL = prove
1466 (`!f g i c. (f has_path_integral i) g
1467 ==> ((\x. c * f x) has_path_integral (c * i)) g`,
1468 REWRITE_TAC[has_path_integral; HAS_INTEGRAL_COMPLEX_LMUL;
1469 GSYM COMPLEX_MUL_ASSOC]);;
1471 let HAS_PATH_INTEGRAL_COMPLEX_RMUL = prove
1472 (`!f g i c. (f has_path_integral i) g
1473 ==> ((\x. f x * c) has_path_integral (i * c)) g`,
1474 ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
1475 REWRITE_TAC[HAS_PATH_INTEGRAL_COMPLEX_LMUL]);;
1477 let HAS_PATH_INTEGRAL_COMPLEX_DIV = prove
1478 (`!f g i c. (f has_path_integral i) g
1479 ==> ((\x. f x / c) has_path_integral (i / c)) g`,
1480 REWRITE_TAC[complex_div; HAS_PATH_INTEGRAL_COMPLEX_RMUL]);;
1482 let HAS_PATH_INTEGRAL_EQ = prove
1484 (!x. x IN path_image p ==> f x = g x) /\
1485 (f has_path_integral y) p
1486 ==> (g has_path_integral y) p`,
1488 REWRITE_TAC[path_image; IN_IMAGE; has_path_integral; IMP_CONJ] THEN
1489 DISCH_TAC THEN MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_EQ) THEN
1490 ASM_SIMP_TAC[] THEN ASM_MESON_TAC[]);;
1492 let HAS_PATH_INTEGRAL_BOUND_LINEPATH = prove
1494 (f has_path_integral i) (linepath(a,b)) /\
1495 &0 <= B /\ (!x. x IN segment[a,b] ==> norm(f x) <= B)
1496 ==> norm(i) <= B * norm(b - a)`,
1497 REPEAT GEN_TAC THEN REWRITE_TAC[has_path_integral] THEN STRIP_TAC THEN
1498 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
1499 REWRITE_TAC[GSYM CONTENT_UNIT_1] THEN MATCH_MP_TAC HAS_INTEGRAL_BOUND THEN
1500 EXISTS_TAC `\x. f (linepath (a,b) x) *
1501 vector_derivative (linepath (a,b))
1502 (at x within interval [vec 0,vec 1])` THEN
1503 ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE;
1504 VECTOR_DERIVATIVE_LINEPATH_WITHIN] THEN
1505 REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
1506 MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
1507 FIRST_X_ASSUM MATCH_MP_TAC THEN
1508 REWRITE_TAC[GSYM PATH_IMAGE_LINEPATH; path_image] THEN
1511 let HAS_PATH_INTEGRAL_BOUND_LINEPATH_STRONG = prove
1514 (f has_path_integral i) (linepath(a,b)) /\
1515 &0 <= B /\ (!x. x IN segment[a,b] DIFF k ==> norm(f x) <= B)
1516 ==> norm(i) <= B * norm(b - a)`,
1517 REPEAT GEN_TAC THEN ASM_CASES_TAC `b:complex = a` THENL
1518 [ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0; REAL_MUL_RZERO] THEN
1519 STRIP_TAC THEN SUBGOAL_THEN `i = Cx(&0)`
1520 (fun th -> REWRITE_TAC[th; COMPLEX_NORM_0; REAL_LE_REFL]) THEN
1521 MATCH_MP_TAC HAS_PATH_INTEGRAL_UNIQUE THEN
1522 ASM_MESON_TAC[HAS_PATH_INTEGRAL_TRIVIAL];
1523 STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
1524 EXISTS_TAC `\x. if x IN k then Cx(&0) else (f:complex->complex) x` THEN
1525 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
1526 [ALL_TAC; ASM SET_TAC[COMPLEX_NORM_0]] THEN
1527 UNDISCH_TAC `(f has_path_integral i) (linepath (a,b))` THEN
1528 MATCH_MP_TAC EQ_IMP THEN REWRITE_TAC[has_path_integral] THEN
1529 MATCH_MP_TAC HAS_INTEGRAL_SPIKE_EQ THEN
1530 EXISTS_TAC `{t | t IN interval[vec 0,vec 1] /\
1531 linepath(a:complex,b) t IN k}` THEN
1532 CONJ_TAC THENL [MATCH_MP_TAC NEGLIGIBLE_FINITE; SET_TAC[]] THEN
1533 MATCH_MP_TAC FINITE_FINITE_PREIMAGE_GENERAL THEN ASM_REWRITE_TAC[] THEN
1534 X_GEN_TAC `c:complex` THEN DISCH_TAC THEN
1535 MATCH_MP_TAC(MESON[FINITE_SING; FINITE_SUBSET]
1536 `(?a. s SUBSET {a}) ==> FINITE s`) THEN
1537 MATCH_MP_TAC(SET_RULE
1538 `(!a b. a IN s /\ b IN s ==> a = b) ==> (?a. s SUBSET {a})`) THEN
1539 MAP_EVERY X_GEN_TAC [`s:real^1`; `t:real^1`] THEN
1540 REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
1541 FIRST_X_ASSUM(MP_TAC o SYM) THEN FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
1542 REWRITE_TAC[linepath; VECTOR_ARITH
1543 `(&1 - s) % a + s % b:real^N = (&1 - t) % a + t % b <=>
1544 (s - t) % (b - a) = vec 0`] THEN
1545 ASM_REWRITE_TAC[VECTOR_MUL_EQ_0; VECTOR_SUB_EQ; REAL_SUB_0] THEN
1546 REWRITE_TAC[DROP_EQ]]);;
1548 let HAS_PATH_INTEGRAL_0 = prove
1549 (`!g. ((\x. Cx(&0)) has_path_integral Cx(&0)) g`,
1550 REWRITE_TAC[has_path_integral; COMPLEX_MUL_LZERO] THEN
1551 REWRITE_TAC[GSYM COMPLEX_VEC_0; HAS_INTEGRAL_0]);;
1553 let HAS_PATH_INTEGRAL_IS_0 = prove
1554 (`!f g. (!z. z IN path_image g ==> f(z) = Cx(&0))
1555 ==> (f has_path_integral Cx(&0)) g`,
1556 REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_EQ THEN
1557 EXISTS_TAC `\z:complex. Cx(&0)` THEN
1558 ASM_REWRITE_TAC[HAS_PATH_INTEGRAL_0] THEN ASM_MESON_TAC[]);;
1560 let HAS_PATH_INTEGRAL_VSUM = prove
1561 (`!f p s. FINITE s /\ (!a. a IN s ==> (f a has_path_integral i a) p)
1562 ==> ((\x. vsum s (\a. f a x)) has_path_integral vsum s i) p`,
1563 GEN_TAC THEN GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
1564 MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
1565 SIMP_TAC[VSUM_CLAUSES; HAS_PATH_INTEGRAL_0; COMPLEX_VEC_0; IN_INSERT] THEN
1566 REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN
1567 ASM_REWRITE_TAC[ETA_AX] THEN CONJ_TAC THEN
1568 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC[]);;
1570 (* ------------------------------------------------------------------------- *)
1571 (* Same thing non-relationally. *)
1572 (* ------------------------------------------------------------------------- *)
1574 let PATH_INTEGRAL_CONST_LINEPATH = prove
1575 (`!a b c. path_integral (linepath(a,b)) (\x. c) = c * (b - a)`,
1576 REPEAT GEN_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1577 REWRITE_TAC[HAS_PATH_INTEGRAL_CONST_LINEPATH]);;
1579 let PATH_INTEGRAL_NEG = prove
1580 (`!f g. f path_integrable_on g
1581 ==> path_integral g (\x. --(f x)) = --(path_integral g f)`,
1582 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1583 MATCH_MP_TAC HAS_PATH_INTEGRAL_NEG THEN
1584 ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1586 let PATH_INTEGRAL_ADD = prove
1588 f1 path_integrable_on g /\ f2 path_integrable_on g
1589 ==> path_integral g (\x. f1(x) + f2(x)) =
1590 path_integral g f1 + path_integral g f2`,
1591 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1592 MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN
1593 ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1595 let PATH_INTEGRAL_SUB = prove
1597 f1 path_integrable_on g /\ f2 path_integrable_on g
1598 ==> path_integral g (\x. f1(x) - f2(x)) =
1599 path_integral g f1 - path_integral g f2`,
1600 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1601 MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
1602 ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1604 let PATH_INTEGRAL_COMPLEX_LMUL = prove
1605 (`!f g c. f path_integrable_on g
1606 ==> path_integral g (\x. c * f x) = c * path_integral g f`,
1607 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1608 MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_LMUL THEN
1609 ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1611 let PATH_INTEGRAL_COMPLEX_RMUL = prove
1612 (`!f g c. f path_integrable_on g
1613 ==> path_integral g (\x. f x * c) = path_integral g f * c`,
1614 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1615 MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_RMUL THEN
1616 ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1618 let PATH_INTEGRAL_COMPLEX_DIV = prove
1619 (`!f g c. f path_integrable_on g
1620 ==> path_integral g (\x. f x / c) = path_integral g f / c`,
1621 REWRITE_TAC[complex_div; PATH_INTEGRAL_COMPLEX_RMUL]);;
1623 let PATH_INTEGRAL_EQ = prove
1625 (!x. x IN path_image p ==> f x = g x)
1626 ==> path_integral p f = path_integral p g`,
1627 REPEAT STRIP_TAC THEN REWRITE_TAC[path_integral] THEN
1628 AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN
1629 ASM_MESON_TAC[HAS_PATH_INTEGRAL_EQ]);;
1631 let PATH_INTEGRAL_EQ_0 = prove
1632 (`!f g. (!z. z IN path_image g ==> f(z) = Cx(&0))
1633 ==> path_integral g f = Cx(&0)`,
1634 MESON_TAC[HAS_PATH_INTEGRAL_IS_0; PATH_INTEGRAL_UNIQUE]);;
1636 let PATH_INTEGRAL_BOUND_LINEPATH = prove
1638 f path_integrable_on (linepath(a,b)) /\
1639 &0 <= B /\ (!x. x IN segment[a,b] ==> norm(f x) <= B)
1640 ==> norm(path_integral (linepath(a,b)) f) <= B * norm(b - a)`,
1641 REPEAT STRIP_TAC THEN
1642 MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
1643 EXISTS_TAC `f:complex->complex` THEN
1644 ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1646 let PATH_INTEGRAL_0 = prove
1647 (`!g. path_integral g (\x. Cx(&0)) = Cx(&0)`,
1648 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1649 REWRITE_TAC[HAS_PATH_INTEGRAL_0]);;
1651 let PATH_INTEGRAL_VSUM = prove
1652 (`!f p s. FINITE s /\ (!a. a IN s ==> (f a) path_integrable_on p)
1653 ==> path_integral p (\x. vsum s (\a. f a x)) =
1654 vsum s (\a. path_integral p (f a))`,
1655 REPEAT STRIP_TAC THEN
1656 MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1657 MATCH_MP_TAC HAS_PATH_INTEGRAL_VSUM THEN
1658 ASM_SIMP_TAC[HAS_PATH_INTEGRAL_INTEGRAL]);;
1660 let PATH_INTEGRABLE_EQ = prove
1661 (`!f g p. (!x. x IN path_image p ==> f x = g x) /\ f path_integrable_on p
1662 ==> g path_integrable_on p`,
1663 REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_EQ]);;
1665 (* ------------------------------------------------------------------------- *)
1666 (* Arithmetic theorems for path integrability. *)
1667 (* ------------------------------------------------------------------------- *)
1669 let PATH_INTEGRABLE_NEG = prove
1670 (`!f g. f path_integrable_on g
1671 ==> (\x. --(f x)) path_integrable_on g`,
1672 REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_NEG]);;
1674 let PATH_INTEGRABLE_ADD = prove
1676 f1 path_integrable_on g /\ f2 path_integrable_on g
1677 ==> (\x. f1(x) + f2(x)) path_integrable_on g`,
1678 REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_ADD]);;
1680 let PATH_INTEGRABLE_SUB = prove
1682 f1 path_integrable_on g /\ f2 path_integrable_on g
1683 ==> (\x. f1(x) - f2(x)) path_integrable_on g`,
1684 REWRITE_TAC[path_integrable_on] THEN MESON_TAC[HAS_PATH_INTEGRAL_SUB]);;
1686 let PATH_INTEGRABLE_COMPLEX_LMUL = prove
1687 (`!f g c. f path_integrable_on g
1688 ==> (\x. c * f x) path_integrable_on g`,
1689 REWRITE_TAC[path_integrable_on] THEN
1690 MESON_TAC[HAS_PATH_INTEGRAL_COMPLEX_LMUL]);;
1692 let PATH_INTEGRABLE_COMPLEX_RMUL = prove
1693 (`!f g c. f path_integrable_on g
1694 ==> (\x. f x * c) path_integrable_on g`,
1695 ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
1696 REWRITE_TAC[PATH_INTEGRABLE_COMPLEX_LMUL]);;
1698 let PATH_INTEGRABLE_COMPLEX_DIV = prove
1699 (`!f g c. f path_integrable_on g
1700 ==> (\x. f x / c) path_integrable_on g`,
1701 REWRITE_TAC[path_integrable_on] THEN
1702 MESON_TAC[HAS_PATH_INTEGRAL_COMPLEX_DIV]);;
1704 let PATH_INTEGRABLE_VSUM = prove
1705 (`!f g s. FINITE s /\ (!a. a IN s ==> f a path_integrable_on g)
1706 ==> (\x. vsum s (\a. f a x)) path_integrable_on g`,
1707 REWRITE_TAC[path_integrable_on] THEN
1708 MESON_TAC[HAS_PATH_INTEGRAL_VSUM]);;
1710 (* ------------------------------------------------------------------------- *)
1711 (* Considering a path integral "backwards". *)
1712 (* ------------------------------------------------------------------------- *)
1714 let HAS_PATH_INTEGRAL_REVERSE_LINEPATH = prove
1716 (f has_path_integral i) (linepath(a,b))
1717 ==> (f has_path_integral (--i)) (linepath(b,a))`,
1718 MESON_TAC[REVERSEPATH_LINEPATH; VALID_PATH_LINEPATH;
1719 HAS_PATH_INTEGRAL_REVERSEPATH]);;
1721 let PATH_INTEGRAL_REVERSE_LINEPATH = prove
1723 f continuous_on (segment[a,b])
1724 ==> path_integral(linepath(a,b)) f =
1725 --(path_integral(linepath(b,a)) f)`,
1726 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1727 MATCH_MP_TAC HAS_PATH_INTEGRAL_REVERSE_LINEPATH THEN
1728 MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
1729 MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
1730 ASM_MESON_TAC[SEGMENT_SYM]);;
1732 (* ------------------------------------------------------------------------- *)
1733 (* Splitting a path integral in a flat way. *)
1734 (* ------------------------------------------------------------------------- *)
1736 let HAS_PATH_INTEGRAL_SPLIT = prove
1738 &0 <= k /\ k <= &1 /\ c - a = k % (b - a) /\
1739 (f has_path_integral i) (linepath(a,c)) /\
1740 (f has_path_integral j) (linepath(c,b))
1741 ==> (f has_path_integral (i + j)) (linepath(a,b))`,
1742 REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1743 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1744 ASM_CASES_TAC `k = &0` THENL
1745 [ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ] THEN
1746 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
1747 ASM_MESON_TAC[HAS_PATH_INTEGRAL_TRIVIAL; PATH_INTEGRAL_UNIQUE;
1750 ASM_CASES_TAC `k = &1` THEN ASM_REWRITE_TAC[VECTOR_MUL_LID] THENL
1751 [REWRITE_TAC[VECTOR_ARITH `c - a = b - a <=> c = b:real^N`] THEN
1752 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
1753 ASM_MESON_TAC[HAS_PATH_INTEGRAL_TRIVIAL; PATH_INTEGRAL_UNIQUE;
1756 REWRITE_TAC[HAS_PATH_INTEGRAL_LINEPATH] THEN
1757 REWRITE_TAC[linepath] THEN REPEAT GEN_TAC THEN
1758 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1759 DISCH_THEN(CONJUNCTS_THEN
1760 (MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_AFFINITY))) THEN
1761 DISCH_THEN(ASSUME_TAC o SPECL
1762 [`inv(&1 - k):real`; `--(k / (&1 - k)) % vec 1:real^1`]) THEN
1763 DISCH_THEN(MP_TAC o SPECL [`inv(k):real`; `vec 0:real^1`]) THEN
1764 POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[REAL_INV_EQ_0; REAL_SUB_0] THEN
1765 REWRITE_TAC[REAL_INV_INV; DIMINDEX_1; REAL_POW_1; REAL_ABS_INV] THEN
1766 REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
1767 REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
1768 ASM_REWRITE_TAC[REAL_SUB_LE; REAL_ARITH `~(&1 < &0)`] THEN
1769 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_NEG_0; VECTOR_ADD_RID] THEN
1770 REWRITE_TAC[VECTOR_MUL_ASSOC; VECTOR_MUL_LNEG] THEN
1771 ASM_SIMP_TAC[REAL_FIELD
1772 `~(k = &1) ==> (&1 - k) * --(k / (&1 - k)) = --k`] THEN
1773 REWRITE_TAC[VECTOR_ADD_LID; VECTOR_MUL_LNEG; VECTOR_NEG_NEG;
1774 VECTOR_ARITH `(&1 - k) % x + k % x:real^1 = x`] THEN
1775 REWRITE_TAC[DROP_ADD; DROP_CMUL; DROP_NEG; DROP_VEC; REAL_MUL_RID] THEN
1776 FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP (VECTOR_ARITH
1777 `c - a = x ==> c = x + a`)) THEN
1778 REWRITE_TAC[VECTOR_ARITH `b - (k % (b - a) + a) = (&1 - k) % (b - a)`] THEN
1780 `!x. (&1 - (inv (&1 - k) * drop x + --(k / (&1 - k)))) % (k % (b - a) + a) +
1781 (inv (&1 - k) * drop x + --(k / (&1 - k))) % b =
1782 (&1 - drop x) % a + drop x % b`
1783 (fun th -> REWRITE_TAC[th]) THENL
1784 [REWRITE_TAC[VECTOR_ARITH
1785 `x % (k % (b - a) + a) + y % b =
1786 (x * (&1 - k)) % a + (y + x * k) % b`] THEN
1787 GEN_TAC THEN BINOP_TAC THEN BINOP_TAC THEN REWRITE_TAC[] THEN
1788 REPEAT(POP_ASSUM MP_TAC) THEN CONV_TAC REAL_FIELD;
1791 `!x. (&1 - inv k * drop x) % a + (inv k * drop x) % (k % (b - a) + a) =
1792 (&1 - drop x) % a + drop x % b`
1793 (fun th -> REWRITE_TAC[th]) THENL
1794 [REWRITE_TAC[VECTOR_ARITH
1795 `x % a + y % (k % (b - a) + a) =
1796 (x + y * (&1 - k)) % a + (y * k) % b`] THEN
1797 GEN_TAC THEN BINOP_TAC THEN BINOP_TAC THEN REWRITE_TAC[] THEN
1798 REPEAT(POP_ASSUM MP_TAC) THEN CONV_TAC REAL_FIELD;
1801 DISCH_THEN(MP_TAC o SPEC `inv(k:real)` o MATCH_MP HAS_INTEGRAL_CMUL) THEN
1802 FIRST_ASSUM(MP_TAC o SPEC `inv(&1 - k)` o MATCH_MP HAS_INTEGRAL_CMUL) THEN
1803 ASM_SIMP_TAC[REAL_ARITH `&0 <= k ==> abs k = k`;
1804 REAL_ARITH `k <= &1 ==> abs(&1 - k) = &1 - k`] THEN
1805 ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_MUL_LINV; REAL_SUB_0] THEN
1806 REWRITE_TAC[IMP_IMP; VECTOR_MUL_LID] THEN
1807 REWRITE_TAC[COMPLEX_CMUL] THEN
1808 ONCE_REWRITE_TAC[COMPLEX_RING
1809 `Cx(inv a) * b * Cx(a) * c = (Cx(inv a) * Cx a) * b * c`] THEN
1810 ASM_SIMP_TAC[GSYM CX_MUL; REAL_MUL_LINV; REAL_SUB_0; COMPLEX_MUL_LID] THEN
1812 MATCH_MP_TAC HAS_INTEGRAL_COMBINE THEN EXISTS_TAC `k % vec 1:real^1` THEN
1813 ASM_REWRITE_TAC[DROP_CMUL; DROP_VEC; REAL_MUL_RID]);;
1815 let PATH_INTEGRAL_SPLIT = prove
1817 &0 <= k /\ k <= &1 /\ c - a = k % (b - a) /\
1818 f continuous_on (segment[a,b])
1819 ==> path_integral(linepath(a,b)) f =
1820 path_integral(linepath(a,c)) f +
1821 path_integral(linepath(c,b)) f`,
1822 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1823 MATCH_MP_TAC HAS_PATH_INTEGRAL_SPLIT THEN
1824 MAP_EVERY EXISTS_TAC [`c:complex`; `k:real`] THEN ASM_REWRITE_TAC[] THEN
1825 CONJ_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
1826 MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
1827 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
1828 EXISTS_TAC `segment[a:complex,b]` THEN ASM_REWRITE_TAC[] THEN
1829 REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
1830 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
1831 ASM_SIMP_TAC[POINTS_IN_CONVEX_HULL; IN_INSERT] THEN
1832 FIRST_ASSUM(SUBST1_TAC o MATCH_MP (VECTOR_ARITH
1833 `c - a = k % (b - a) ==> c = (&1 - k) % a + k % b`)) THEN
1834 MATCH_MP_TAC IN_CONVEX_SET THEN
1835 ASM_SIMP_TAC[CONVEX_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT]);;
1837 let PATH_INTEGRAL_SPLIT_LINEPATH = prove
1839 f continuous_on segment[a,b] /\ c IN segment[a,b]
1840 ==> path_integral(linepath (a,b)) f =
1841 path_integral(linepath (a,c)) f +
1842 path_integral(linepath (c,b)) f`,
1843 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_SPLIT THEN
1844 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_SEGMENT]) THEN
1845 MATCH_MP_TAC MONO_EXISTS THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
1848 (* ------------------------------------------------------------------------- *)
1849 (* The special case of midpoints used in the main quadrisection. *)
1850 (* ------------------------------------------------------------------------- *)
1852 let HAS_PATH_INTEGRAL_MIDPOINT = prove
1854 (f has_path_integral i) (linepath(a,midpoint(a,b))) /\
1855 (f has_path_integral j) (linepath(midpoint(a,b),b))
1856 ==> (f has_path_integral (i + j)) (linepath(a,b))`,
1857 REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_SPLIT THEN
1858 MAP_EVERY EXISTS_TAC [`midpoint(a:complex,b)`; `&1 / &2`] THEN
1859 ASM_REWRITE_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
1860 REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);;
1862 let PATH_INTEGRAL_MIDPOINT = prove
1864 f continuous_on (segment[a,b])
1865 ==> path_integral(linepath(a,b)) f =
1866 path_integral(linepath(a,midpoint(a,b))) f +
1867 path_integral(linepath(midpoint(a,b),b)) f`,
1868 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_SPLIT THEN
1869 EXISTS_TAC `&1 / &2` THEN
1870 ASM_REWRITE_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
1871 REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);;
1873 (* ------------------------------------------------------------------------- *)
1874 (* A couple of special case lemmas that are useful below. *)
1875 (* ------------------------------------------------------------------------- *)
1877 let TRIANGLE_LINEAR_HAS_CHAIN_INTEGRAL = prove
1878 (`!a b c m d. ((\x. m * x + d) has_path_integral Cx(&0))
1879 (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`,
1880 REPEAT GEN_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_PRIMITIVE THEN
1881 MAP_EVERY EXISTS_TAC [`\x. m / Cx(&2) * x pow 2 + d * x`; `(:complex)`] THEN
1882 SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH; SUBSET_UNIV;
1883 PATHFINISH_LINEPATH; VALID_PATH_JOIN; VALID_PATH_LINEPATH] THEN
1884 REPEAT STRIP_TAC THEN COMPLEX_DIFF_TAC THEN CONV_TAC NUM_REDUCE_CONV THEN
1885 CONV_TAC COMPLEX_RING);;
1887 let HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL = prove
1889 (f has_path_integral i)
1890 (linepath(a,b) ++ linepath(b,c) ++ linepath(c,d))
1891 ==> path_integral (linepath(a,b)) f +
1892 path_integral (linepath(b,c)) f +
1893 path_integral (linepath(c,d)) f = i`,
1894 REPEAT STRIP_TAC THEN
1895 FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
1896 FIRST_X_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE) THEN
1897 SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_LINEPATH; VALID_PATH_JOIN;
1898 PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
1899 PATHFINISH_LINEPATH] THEN
1900 STRIP_TAC THEN CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1901 REPEAT(MATCH_MP_TAC HAS_PATH_INTEGRAL_JOIN THEN
1902 SIMP_TAC[VALID_PATH_LINEPATH; VALID_PATH_JOIN;
1903 PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
1904 PATHFINISH_LINEPATH] THEN
1906 MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN ASM_REWRITE_TAC[]);;
1908 (* ------------------------------------------------------------------------- *)
1909 (* Reversing the order in a double path integral. The condition is *)
1910 (* stronger than needed but it's often true in typical situations. *)
1911 (* ------------------------------------------------------------------------- *)
1913 let PATH_INTEGRAL_SWAP = prove
1915 (\y. f (fstcart y) (sndcart y)) continuous_on
1916 (path_image g PCROSS path_image h) /\
1917 valid_path g /\ valid_path h /\
1918 (\t. vector_derivative g (at t)) continuous_on interval[vec 0,vec 1] /\
1919 (\t. vector_derivative h (at t)) continuous_on interval[vec 0,vec 1]
1920 ==> path_integral g (\w. path_integral h (f w)) =
1921 path_integral h (\z. path_integral g (\w. f w z))`,
1922 REWRITE_TAC[PCROSS] THEN REPEAT STRIP_TAC THEN
1923 ONCE_REWRITE_TAC[PATH_INTEGRAL_INTEGRAL] THEN MATCH_MP_TAC EQ_TRANS THEN
1925 `integral (interval[vec 0,vec 1])
1926 (\x. path_integral h
1927 (\y. f (g x) y * vector_derivative g (at x)))` THEN
1929 [MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `x:real^1` THEN
1930 DISCH_TAC THEN REWRITE_TAC[] THEN
1931 CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_COMPLEX_RMUL THEN
1932 REWRITE_TAC[PATH_INTEGRABLE_ON] THEN
1933 MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
1934 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN ASM_REWRITE_TAC[] THEN
1936 `(\t:real^1. (f:complex->complex->complex) (g x) (h t)) =
1937 (\y. f (fstcart y) (sndcart y)) o
1938 (\t. pastecart (g(x:real^1)) (h t))`
1940 [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART];
1942 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
1943 [MATCH_MP_TAC CONTINUOUS_ON_PASTECART THEN
1944 ASM_SIMP_TAC[CONTINUOUS_ON_CONST; GSYM path; VALID_PATH_IMP_PATH];
1945 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1946 CONTINUOUS_ON_SUBSET)) THEN
1947 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM] THEN
1948 ASM_SIMP_TAC[path_image; FUN_IN_IMAGE]];
1950 MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
1951 `integral (interval[vec 0,vec 1])
1952 (\y. path_integral g
1953 (\x. f x (h y) * vector_derivative h (at y)))` THEN
1956 MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `y:real^1` THEN
1957 DISCH_TAC THEN REWRITE_TAC[] THEN
1958 MATCH_MP_TAC PATH_INTEGRAL_COMPLEX_RMUL THEN
1959 REWRITE_TAC[PATH_INTEGRABLE_ON] THEN
1960 MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
1961 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN ASM_REWRITE_TAC[] THEN
1963 `(\t:real^1. (f:complex->complex->complex) (g t) (h y)) =
1964 (\z. f (fstcart z) (sndcart z)) o
1965 (\t. pastecart (g t) (h(y:real^1)))`
1967 [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART];
1969 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
1970 [MATCH_MP_TAC CONTINUOUS_ON_PASTECART THEN
1971 ASM_SIMP_TAC[CONTINUOUS_ON_CONST; GSYM path; VALID_PATH_IMP_PATH];
1972 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1973 CONTINUOUS_ON_SUBSET)) THEN
1974 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM] THEN
1975 ASM_SIMP_TAC[path_image; FUN_IN_IMAGE]]] THEN
1976 REWRITE_TAC[PATH_INTEGRAL_INTEGRAL] THEN
1977 W(MP_TAC o PART_MATCH (lhand o rand)
1978 INTEGRAL_SWAP_CONTINUOUS o lhs o snd) THEN
1979 REWRITE_TAC[] THEN ANTS_TAC THENL
1981 DISCH_THEN(fun th -> GEN_REWRITE_TAC LAND_CONV [th]) THEN
1982 REPEAT(MATCH_MP_TAC INTEGRAL_EQ THEN
1983 REWRITE_TAC[] THEN REPEAT STRIP_TAC) THEN
1984 REWRITE_TAC[COMPLEX_MUL_AC]] THEN
1985 REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC) THENL
1988 `(\z:real^(1,1)finite_sum. vector_derivative g (at (fstcart z))) =
1989 (\t. vector_derivative (g:real^1->complex) (at t)) o fstcart`
1990 SUBST1_TAC THENL [REWRITE_TAC[o_DEF]; ALL_TAC] THEN
1991 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
1992 SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_FSTCART] THEN
1993 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
1994 CONTINUOUS_ON_SUBSET)) THEN
1995 SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM; PCROSS;
1996 FORALL_PASTECART; GSYM PCROSS_INTERVAL; FSTCART_PASTECART];
1998 `(\z:real^(1,1)finite_sum. vector_derivative h (at (sndcart z))) =
1999 (\t. vector_derivative (h:real^1->complex) (at t)) o sndcart`
2000 SUBST1_TAC THENL [REWRITE_TAC[o_DEF]; ALL_TAC] THEN
2001 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
2002 SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_SNDCART] THEN
2003 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
2004 CONTINUOUS_ON_SUBSET)) THEN
2005 SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM; PCROSS;
2006 FORALL_PASTECART; GSYM PCROSS_INTERVAL; SNDCART_PASTECART]] THEN
2008 `(\z. f (g (fstcart z)) (h (sndcart z))) =
2009 (\y. (f:complex->complex->complex) (fstcart y) (sndcart y)) o
2010 (\p. pastecart (g(fstcart p:real^1)) (h(sndcart p:real^1)))`
2012 [REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART]; ALL_TAC] THEN
2013 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
2014 [MATCH_MP_TAC CONTINUOUS_ON_PASTECART THEN
2015 CONJ_TAC THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
2016 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
2017 SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_FSTCART; LINEAR_SNDCART] THEN
2018 REWRITE_TAC[GSYM PCROSS_INTERVAL; PCROSS; GSYM SIMPLE_IMAGE] THEN
2019 REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART;
2020 SET_RULE `{f x | x IN {g a b | P a /\ Q b}} =
2021 {f(g a b) | P a /\ Q b}`] THEN
2022 REPEAT(FIRST_X_ASSUM(ASSUME_TAC o REWRITE_RULE[path] o
2023 MATCH_MP VALID_PATH_IMP_PATH)) THEN
2024 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
2025 CONTINUOUS_ON_SUBSET)) THEN
2026 SIMP_TAC[SUBSET; FORALL_IN_GSPEC];
2027 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
2028 CONTINUOUS_ON_SUBSET)) THEN
2029 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM;
2030 FORALL_PASTECART; GSYM PCROSS_INTERVAL; PCROSS;
2031 path_image; FSTCART_PASTECART; SNDCART_PASTECART] THEN
2032 SIMP_TAC[FUN_IN_IMAGE]]);;
2034 (* ------------------------------------------------------------------------- *)
2035 (* The key quadrisection step. *)
2036 (* ------------------------------------------------------------------------- *)
2038 let NORM_SUM_LEMMA = prove
2039 (`norm(a + b + c + d:complex) >= e
2040 ==> norm(a) >= e / &4 \/
2041 norm(b) >= e / &4 \/
2042 norm(c) >= e / &4 \/
2046 let CAUCHY_THEOREM_QUADRISECTION = prove
2048 f continuous_on (convex hull {a,b,c}) /\
2052 norm(path_integral(linepath(a,b)) f +
2053 path_integral(linepath(b,c)) f +
2054 path_integral(linepath(c,a)) f) >= e * K pow 2
2055 ==> ?a' b' c'. a' IN convex hull {a,b,c} /\
2056 b' IN convex hull {a,b,c} /\
2057 c' IN convex hull {a,b,c} /\
2058 dist(a',b') <= K / &2 /\
2059 dist(b',c') <= K / &2 /\
2060 dist(c',a') <= K / &2 /\
2061 norm(path_integral(linepath(a',b')) f +
2062 path_integral(linepath(b',c')) f +
2063 path_integral(linepath(c',a')) f)
2064 >= e * (K / &2) pow 2`,
2065 REPEAT STRIP_TAC THEN MAP_EVERY ABBREV_TAC
2066 [`a':complex = midpoint(b,c)`;
2067 `b':complex = midpoint(c,a)`;
2068 `c':complex = midpoint(a,b)`] THEN
2070 `path_integral(linepath(a,b)) f +
2071 path_integral(linepath(b,c)) f +
2072 path_integral(linepath(c,a)) f =
2073 (path_integral(linepath(a,c')) f +
2074 path_integral(linepath(c',b')) f +
2075 path_integral(linepath(b',a)) f) +
2076 (path_integral(linepath(a',c')) f +
2077 path_integral(linepath(c',b)) f +
2078 path_integral(linepath(b,a')) f) +
2079 (path_integral(linepath(a',c)) f +
2080 path_integral(linepath(c,b')) f +
2081 path_integral(linepath(b',a')) f) +
2082 (path_integral(linepath(a',b')) f +
2083 path_integral(linepath(b',c')) f +
2084 path_integral(linepath(c',a')) f)`
2086 [MP_TAC(SPEC `f:complex->complex` PATH_INTEGRAL_MIDPOINT) THEN DISCH_THEN
2087 (fun th -> MP_TAC(SPECL [`a:complex`; `b:complex`] th) THEN
2088 MP_TAC(SPECL [`b:complex`; `c:complex`] th) THEN
2089 MP_TAC(SPECL [`c:complex`; `a:complex`] th)) THEN
2090 MP_TAC(SPEC `f:complex->complex` PATH_INTEGRAL_REVERSE_LINEPATH) THEN DISCH_THEN
2091 (fun th -> MP_TAC(SPECL [`a':complex`; `b':complex`] th) THEN
2092 MP_TAC(SPECL [`b':complex`; `c':complex`] th) THEN
2093 MP_TAC(SPECL [`c':complex`; `a':complex`] th)) THEN
2094 ASM_REWRITE_TAC[] THEN
2095 REPEAT(MATCH_MP_TAC(TAUT
2096 `((a /\ c ==> b /\ d) ==> e) ==> (a ==> b) ==> (c ==> d) ==> e`)) THEN
2097 ANTS_TAC THENL [ALL_TAC; CONV_TAC COMPLEX_RING] THEN
2098 REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2099 REPEAT CONJ_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2100 EXISTS_TAC `convex hull {a:complex,b,c}` THEN ASM_REWRITE_TAC[] THEN
2101 MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2102 SIMP_TAC[IN_INSERT; NOT_IN_EMPTY;
2103 TAUT `(a \/ b ==> c) <=> (a ==> c) /\ (b ==> c)`] THEN
2104 MAP_EVERY EXPAND_TAC ["a'"; "b'"; "c'"] THEN
2105 SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT];
2107 REWRITE_TAC[REAL_ARITH `e * (K / &2) pow 2 = (e * K pow 2) / &4`] THEN
2108 FIRST_X_ASSUM(MP_TAC o MATCH_MP NORM_SUM_LEMMA) THEN STRIP_TAC THENL
2109 [MAP_EVERY EXISTS_TAC [`a:complex`; `c':complex`; `b':complex`];
2110 MAP_EVERY EXISTS_TAC [`a':complex`; `c':complex`; `b:complex`];
2111 MAP_EVERY EXISTS_TAC [`a':complex`; `c:complex`; `b':complex`];
2112 MAP_EVERY EXISTS_TAC [`a':complex`; `b':complex`; `c':complex`]] THEN
2113 ASM_REWRITE_TAC[] THEN
2114 MAP_EVERY EXPAND_TAC ["a'"; "b'"; "c'"] THEN
2115 SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT] THEN
2116 REWRITE_TAC[midpoint; dist; GSYM VECTOR_SUB_LDISTRIB;
2117 VECTOR_ARITH `a - inv(&2) % (a + b) = inv(&2) % (a - b)`;
2118 VECTOR_ARITH `inv(&2) % (c + a) - a = inv(&2) % (c - a)`;
2119 VECTOR_ARITH `(a + b) - (c + a) = b - c`;
2120 VECTOR_ARITH `(b + c) - (c + a) = b - a`] THEN
2121 SIMP_TAC[NORM_MUL; REAL_ARITH `abs(inv(&2)) * x <= k / &2 <=> x <= k`] THEN
2122 ASM_REWRITE_TAC[GSYM dist] THEN ASM_MESON_TAC[DIST_SYM]);;
2124 (* ------------------------------------------------------------------------- *)
2125 (* Yet at small enough scales this cannot be the case. *)
2126 (* ------------------------------------------------------------------------- *)
2128 let TRIANGLE_POINTS_CLOSER = prove
2129 (`!a b c x y:real^N.
2130 x IN convex hull {a,b,c} /\
2131 y IN convex hull {a,b,c}
2132 ==> norm(x - y) <= norm(a - b) \/
2133 norm(x - y) <= norm(b - c) \/
2134 norm(x - y) <= norm(c - a)`,
2135 REPEAT STRIP_TAC THEN MP_TAC(ISPEC `{a:real^N,b,c}` SIMPLEX_EXTREMAL_LE) THEN
2136 REWRITE_TAC[FINITE_INSERT; FINITE_RULES; NOT_INSERT_EMPTY] THEN
2137 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2138 REPEAT STRIP_TAC THEN
2139 FIRST_X_ASSUM(MP_TAC o SPECL [`x:real^N`; `y:real^N`]) THEN
2140 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
2141 ASM_MESON_TAC[NORM_POS_LE; REAL_LE_TRANS; NORM_SUB]);;
2143 let HOLOMORPHIC_POINT_SMALL_TRIANGLE = prove
2145 x IN s /\ f continuous_on s /\
2146 f complex_differentiable (at x within s) /\
2149 !a b c. dist(a,b) <= k /\ dist(b,c) <= k /\ dist(c,a) <= k /\
2150 x IN convex hull {a,b,c} /\ convex hull {a,b,c} SUBSET s
2151 ==> norm(path_integral(linepath(a,b)) f +
2152 path_integral(linepath(b,c)) f +
2153 path_integral(linepath(c,a)) f)
2154 <= e * (dist(a,b) + dist(b,c) + dist(c,a)) pow 2`,
2155 REPEAT STRIP_TAC THEN
2156 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [complex_differentiable]) THEN
2157 DISCH_THEN(X_CHOOSE_THEN `f':complex` MP_TAC) THEN
2158 GEN_REWRITE_TAC LAND_CONV [has_complex_derivative] THEN
2159 REWRITE_TAC[HAS_DERIVATIVE_WITHIN_ALT] THEN
2160 DISCH_THEN(MP_TAC o SPEC `e:real` o CONJUNCT2) THEN
2161 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
2162 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV)
2163 [TAUT `a /\ b ==> c <=> b ==> a ==> c`] THEN
2164 REWRITE_TAC[APPROACHABLE_LT_LE] THEN
2165 ONCE_REWRITE_TAC[TAUT `b ==> a ==> c <=> a /\ b ==> c`] THEN
2166 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN STRIP_TAC THEN
2167 ASM_REWRITE_TAC[dist] THEN
2168 MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`; `c:complex`] THEN
2171 `path_integral (linepath(a,b)) f +
2172 path_integral (linepath(b,c)) f +
2173 path_integral (linepath(c,a)) f =
2174 path_integral (linepath(a,b)) (\y. f y - f x - f' * (y - x)) +
2175 path_integral (linepath(b,c)) (\y. f y - f x - f' * (y - x)) +
2176 path_integral (linepath(c,a)) (\y. f y - f x - f' * (y - x))`
2179 `path_integral (linepath(a,b)) (\y. f y - f x - f' * (y - x)) =
2180 path_integral (linepath(a,b)) f -
2181 path_integral (linepath(a,b)) (\y. f x + f' * (y - x)) /\
2182 path_integral (linepath(b,c)) (\y. f y - f x - f' * (y - x)) =
2183 path_integral (linepath(b,c)) f -
2184 path_integral (linepath(b,c)) (\y. f x + f' * (y - x)) /\
2185 path_integral (linepath(c,a)) (\y. f y - f x - f' * (y - x)) =
2186 path_integral (linepath(c,a)) f -
2187 path_integral (linepath(c,a)) (\y. f x + f' * (y - x))`
2188 (REPEAT_TCL CONJUNCTS_THEN SUBST1_TAC) THENL
2189 [REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a - b - c = a - (b + c)`] THEN
2190 REPEAT CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
2191 MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
2192 CONJ_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
2193 MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2194 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2195 EXISTS_TAC `s:complex->bool` THEN
2196 ASM_SIMP_TAC[CONTINUOUS_ON_ID; CONTINUOUS_ON_ADD; CONTINUOUS_ON_CONST;
2197 CONTINUOUS_ON_COMPLEX_MUL; CONTINUOUS_ON_SUB] THEN
2198 MATCH_MP_TAC SUBSET_TRANS THEN
2199 EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2200 ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2201 MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2202 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
2203 ASM_SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT];
2205 REWRITE_TAC[COMPLEX_RING
2206 `x + y + z = (x - x') + (y - y') + (z - z') <=>
2207 x' + y' + z' = Cx(&0)`] THEN
2208 MP_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`;
2209 `f':complex`; `f x - f' * x`]
2210 TRIANGLE_LINEAR_HAS_CHAIN_INTEGRAL) THEN
2211 REWRITE_TAC[COMPLEX_RING
2212 `f' * x' + f x - f' * x = f x + f' * (x' - x)`] THEN
2213 DISCH_THEN(MP_TAC o MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2216 ONCE_REWRITE_TAC[NORM_SUB] THEN MATCH_MP_TAC(REAL_ARITH
2217 `&0 <= x * y /\ &0 <= x * z /\ &0 <= y * z /\
2218 a <= (e * (x + y + z)) * x +
2219 (e * (x + y + z)) * y +
2220 (e * (x + y + z)) * z
2221 ==> a <= e * (x + y + z) pow 2`) THEN
2222 SIMP_TAC[REAL_LE_MUL; NORM_POS_LE] THEN
2223 REPEAT(MATCH_MP_TAC NORM_TRIANGLE_LE THEN
2224 MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC) THEN
2225 (MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
2226 EXISTS_TAC `\y:complex. f y - f x - f' * (y - x)` THEN
2227 ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_ADD; REAL_LT_IMP_LE; NORM_POS_LE] THEN
2229 [MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
2230 MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2231 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
2232 ASM_SIMP_TAC[CONTINUOUS_ON_SUB; ETA_AX; CONTINUOUS_ON_COMPLEX_MUL;
2233 CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
2234 MATCH_MP_TAC SUBSET_TRANS THEN
2235 EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2236 ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2237 MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2238 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
2239 ASM_SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL; IN_INSERT];
2241 X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
2242 MATCH_MP_TAC REAL_LE_TRANS THEN
2243 EXISTS_TAC `e * norm(y - x:complex)` THEN CONJ_TAC THENL
2244 [FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL
2245 [MATCH_MP_TAC(SET_RULE `!t. y IN t /\ t SUBSET s ==> y IN s`) THEN
2246 EXISTS_TAC `convex hull {a:complex,b,c}` THEN ASM_REWRITE_TAC[];
2247 MATCH_MP_TAC(REAL_ARITH
2248 `!n1 n2 n3. n1 <= d /\ n2 <= d /\ n3 <= d /\
2249 (n <= n1 \/ n <= n2 \/ n <= n3)
2251 MAP_EVERY EXISTS_TAC
2252 [`norm(a - b:complex)`; `norm(b - c:complex)`;
2253 `norm(c - a:complex)`] THEN
2254 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC TRIANGLE_POINTS_CLOSER];
2255 ASM_SIMP_TAC[REAL_LE_LMUL_EQ] THEN
2256 ONCE_REWRITE_TAC[NORM_SUB] THEN
2257 MATCH_MP_TAC(REAL_ARITH
2258 `(x <= a \/ x <= b \/ x <= c) /\ (&0 <= a /\ &0 <= b /\ &0 <= c)
2259 ==> x <= a + b + c`) THEN
2260 REWRITE_TAC[NORM_POS_LE] THEN MATCH_MP_TAC TRIANGLE_POINTS_CLOSER THEN
2261 ASM_REWRITE_TAC[]] THEN
2262 REPEAT CONJ_TAC THEN
2263 FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
2264 `x IN s ==> s SUBSET t ==> x IN t`)) THEN
2265 REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2266 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN REPEAT STRIP_TAC THEN
2267 ASM_SIMP_TAC[MIDPOINTS_IN_CONVEX_HULL; POINTS_IN_CONVEX_HULL;
2270 (* ------------------------------------------------------------------------- *)
2271 (* Hence the most basic theorem for a triangle. *)
2272 (* ------------------------------------------------------------------------- *)
2274 let CAUCHY_THEOREM_TRIANGLE = prove
2276 f holomorphic_on (convex hull {a,b,c})
2277 ==> (f has_path_integral Cx(&0))
2278 (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`,
2282 (!abc:A n. P abc n ==> ?abc'. P abc' (SUC n) /\ Q abc' abc)
2283 ==> ?ABC. ABC 0 = abc /\ !n. P (ABC n) n /\ Q (ABC(SUC n)) (ABC n)`,
2284 REPEAT STRIP_TAC THEN
2285 (MP_TAC o prove_recursive_functions_exist num_RECURSION)
2287 !n. ABC(SUC n) = @abc. P abc (SUC n) /\ Q abc (ABC n)` THEN
2288 MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN
2289 STRIP_TAC THEN CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
2290 REWRITE_TAC[FORALL_AND_THM] THEN
2291 MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
2292 [INDUCT_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; ALL_TAC] THEN
2293 DISCH_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]) in
2297 (!a b c n. P a b c n
2298 ==> ?a' b' c'. P a' b' c' (SUC n) /\ Q a' b' c' a b c)
2299 ==> ?A B C. A 0 = a /\ B 0 = b /\ C 0 = c /\
2300 !n. P (A n) (B n) (C n) n /\
2301 Q (A(SUC n)) (B(SUC n)) (C(SUC n)) (A n) (B n) (C n)`,
2302 REPEAT STRIP_TAC THEN
2304 [`\(a,b,c). (P:A->A->A->num->bool) a b c`;
2305 `\(a,b,c) (a',b',c'). (Q:A->A->A->A->A->A->bool) a b c a' b' c'`;
2308 REWRITE_TAC[FORALL_PAIR_THM; EXISTS_PAIR_THM] THEN
2309 ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
2310 DISCH_THEN(X_CHOOSE_THEN `ABC:num->A#A#A` STRIP_ASSUME_TAC) THEN
2311 MAP_EVERY EXISTS_TAC
2312 [`(\(a,b,c). a) o (ABC:num->A#A#A)`;
2313 `(\(a,b,c). b) o (ABC:num->A#A#A)`;
2314 `(\(a,b,c). c) o (ABC:num->A#A#A)`] THEN
2315 REWRITE_TAC[o_THM] THEN
2316 REPEAT(CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC]) THEN
2317 X_GEN_TAC `n:num` THEN
2318 FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN
2319 SPEC_TAC(`(ABC:num->A#A#A) (SUC n)`,`y:A#A#A`) THEN
2320 SPEC_TAC(`(ABC:num->A#A#A) n`,`x:A#A#A`) THEN
2321 REWRITE_TAC[FORALL_PAIR_THM]) in
2322 REPEAT STRIP_TAC THEN
2323 STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2324 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2325 FIRST_ASSUM(ASSUME_TAC o MATCH_MP HOLOMORPHIC_ON_IMP_CONTINUOUS_ON) THEN
2327 `f path_integrable_on (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`
2329 [SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN; VALID_PATH_LINEPATH;
2330 PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
2331 PATHFINISH_LINEPATH] THEN
2332 ASM_MESON_TAC[PATH_INTEGRABLE_CONTINUOUS_LINEPATH; CONTINUOUS_ON_SUBSET];
2334 SIMP_TAC[path_integrable_on] THEN DISCH_THEN(X_CHOOSE_TAC `y:complex`) THEN
2335 ASM_CASES_TAC `y = Cx(&0)` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
2337 `K = &1 + max (dist(a:complex,b)) (max (dist(b,c)) (dist(c,a)))` THEN
2338 SUBGOAL_THEN `&0 < K` ASSUME_TAC THENL
2339 [EXPAND_TAC "K" THEN MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < &1 + x`) THEN
2340 REWRITE_TAC[REAL_LE_MAX; DIST_POS_LE];
2342 ABBREV_TAC `e = norm(y:complex) / K pow 2` THEN
2343 SUBGOAL_THEN `&0 < e` ASSUME_TAC THENL
2344 [EXPAND_TAC "e" THEN
2345 ASM_SIMP_TAC[REAL_LT_DIV; REAL_POW_LT; COMPLEX_NORM_NZ];
2348 `?A B C. A 0 = a /\ B 0 = b /\ C 0 = c /\
2349 !n. (convex hull {A n,B n,C n} SUBSET convex hull {a,b,c} /\
2350 dist(A n,B n) <= K / &2 pow n /\
2351 dist(B n,C n) <= K / &2 pow n /\
2352 dist(C n,A n) <= K / &2 pow n /\
2353 norm(path_integral(linepath (A n,B n)) f +
2354 path_integral(linepath (B n,C n)) f +
2355 path_integral(linepath (C n,A n)) f) >=
2356 e * (K / &2 pow n) pow 2) /\
2357 convex hull {A(SUC n),B(SUC n),C(SUC n)} SUBSET
2358 convex hull {A n,B n,C n}`
2360 [MATCH_MP_TAC lemma3 THEN CONJ_TAC THENL
2361 [ASM_REWRITE_TAC[real_pow; REAL_DIV_1; CONJ_ASSOC; SUBSET_REFL] THEN
2362 CONJ_TAC THENL [EXPAND_TAC "K" THEN REAL_ARITH_TAC; ALL_TAC] THEN
2364 ASM_SIMP_TAC[REAL_DIV_RMUL; REAL_LT_IMP_NZ; REAL_POW_LT] THEN
2365 MATCH_MP_TAC(REAL_ARITH `x = y ==> x >= y`) THEN AP_TERM_TAC THEN
2366 FIRST_ASSUM(SUBST1_TAC o SYM o
2367 MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2371 [`a':complex`; `b':complex`; `c':complex`; `n:num`] THEN
2372 REPEAT STRIP_TAC THEN
2373 MP_TAC(SPECL [`f:complex->complex`; `a':complex`; `b':complex`;
2374 `c':complex`; `e:real`; `K / &2 pow n`]
2375 CAUCHY_THEOREM_QUADRISECTION) THEN
2376 ASM_REWRITE_TAC[] THEN
2377 ANTS_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2378 REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN STRIP_TAC THEN
2379 ASM_REWRITE_TAC[real_pow; REAL_FIELD `x / (&2 * y) = x / y / &2`] THEN
2380 MATCH_MP_TAC(SET_RULE
2381 `s SUBSET t /\ t SUBSET u ==> s SUBSET u /\ s SUBSET t`) THEN
2382 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2385 REWRITE_TAC[FORALL_AND_THM] THEN STRIP_TAC THEN
2387 `?x:complex. !n:num. x IN convex hull {A n,B n,C n}`
2388 STRIP_ASSUME_TAC THENL
2389 [MATCH_MP_TAC BOUNDED_CLOSED_NEST THEN REPEAT CONJ_TAC THENL
2390 [GEN_TAC THEN MATCH_MP_TAC COMPACT_IMP_CLOSED;
2391 REWRITE_TAC[CONVEX_HULL_EQ_EMPTY; NOT_INSERT_EMPTY];
2392 MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN ASM_REWRITE_TAC[] THEN
2393 MESON_TAC[SUBSET_REFL; SUBSET_TRANS];
2394 MATCH_MP_TAC COMPACT_IMP_BOUNDED] THEN
2395 MATCH_MP_TAC FINITE_IMP_COMPACT_CONVEX_HULL THEN
2396 REWRITE_TAC[FINITE_INSERT; FINITE_RULES];
2398 MP_TAC(ISPECL [`f:complex->complex`; `convex hull {a:complex,b,c}`;
2399 `x:complex`; `e / &10`] HOLOMORPHIC_POINT_SMALL_TRIANGLE) THEN
2401 [ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; complex_differentiable] THEN
2402 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
2403 ASM_MESON_TAC[holomorphic_on; SUBSET];
2405 DISCH_THEN(X_CHOOSE_THEN `k:real` STRIP_ASSUME_TAC) THEN
2406 MP_TAC(SPEC `K:real / k` REAL_ARCH_POW2) THEN
2407 ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN
2408 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2409 SIMP_TAC[GSYM REAL_LT_LDIV_EQ; REAL_POW_LT; REAL_OF_NUM_LT; ARITH] THEN
2410 DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN FIRST_X_ASSUM(MP_TAC o SPECL
2411 [`(A:num->complex) n`; `(B:num->complex) n`; `(C:num->complex) n`]) THEN
2412 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
2413 [ASM_MESON_TAC[REAL_LE_TRANS; REAL_LT_IMP_LE]; ALL_TAC] THEN
2414 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN DISCH_THEN(K ALL_TAC) THEN
2415 REWRITE_TAC[REAL_NOT_LE] THEN
2416 MATCH_MP_TAC REAL_LTE_TRANS THEN
2417 EXISTS_TAC `e * (K / &2 pow n) pow 2` THEN
2418 CONJ_TAC THENL [ALL_TAC; ASM_REWRITE_TAC[GSYM real_ge]] THEN
2419 ASM_SIMP_TAC[real_div; GSYM REAL_MUL_ASSOC; REAL_LT_LMUL_EQ] THEN
2420 MATCH_MP_TAC(REAL_ARITH
2421 `&0 < x /\ y <= &9 * x ==> inv(&10) * y < x`) THEN
2422 ASM_SIMP_TAC[REAL_POW_LT; REAL_LT_MUL; REAL_LT_INV_EQ;
2423 REAL_OF_NUM_LT; ARITH] THEN
2424 REWRITE_TAC[REAL_ARITH `&9 * x pow 2 = (&3 * x) pow 2`] THEN
2425 MATCH_MP_TAC REAL_POW_LE2 THEN
2426 SIMP_TAC[REAL_LE_ADD; DIST_POS_LE; GSYM real_div] THEN
2427 MATCH_MP_TAC(REAL_ARITH
2428 `x <= a /\ y <= a /\ z <= a ==> x + y + z <= &3 * a`) THEN
2429 ASM_REWRITE_TAC[]);;
2431 (* ------------------------------------------------------------------------- *)
2432 (* Version needing function holomorphic in interior only. *)
2433 (* ------------------------------------------------------------------------- *)
2435 let CAUCHY_THEOREM_FLAT_LEMMA = prove
2437 f continuous_on convex hull {a,b,c} /\ c - a = k % (b - a) /\ &0 <= k
2438 ==> path_integral (linepath(a,b)) f +
2439 path_integral (linepath(b,c)) f +
2440 path_integral (linepath(c,a)) f = Cx(&0)`,
2441 REPEAT STRIP_TAC THEN
2442 STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2443 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2444 ASM_CASES_TAC `k <= &1` THENL
2445 [MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `b:complex`; `c:complex`;
2446 `k:real`] PATH_INTEGRAL_SPLIT) THEN
2447 ASM_REWRITE_TAC[] THEN
2448 ANTS_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2449 DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC(COMPLEX_RING
2450 `x = --b /\ y = --a ==> (x + y) + (a + b) = Cx(&0)`) THEN
2451 CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_REVERSE_LINEPATH THEN
2452 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
2453 MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `c:complex`; `b:complex`;
2454 `inv k:real`] PATH_INTEGRAL_SPLIT) THEN
2455 ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_LE_INV_EQ; REAL_MUL_LINV; REAL_INV_LE_1;
2456 VECTOR_MUL_LID; REAL_ARITH `~(k <= &1) ==> ~(k = &0) /\ &1 <= k`] THEN
2457 ANTS_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2458 MATCH_MP_TAC(COMPLEX_RING
2459 `ac = --ca ==> ac = ab + bc ==> ab + bc + ca = Cx(&0)`) THEN
2460 MATCH_MP_TAC PATH_INTEGRAL_REVERSE_LINEPATH THEN
2461 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]]);;
2463 let CAUCHY_THEOREM_FLAT = prove
2465 f continuous_on convex hull {a,b,c} /\ c - a = k % (b - a)
2466 ==> path_integral (linepath(a,b)) f +
2467 path_integral (linepath(b,c)) f +
2468 path_integral (linepath(c,a)) f = Cx(&0)`,
2469 REPEAT STRIP_TAC THEN ASM_CASES_TAC `&0 <= k` THENL
2470 [ASM_MESON_TAC[CAUCHY_THEOREM_FLAT_LEMMA]; ALL_TAC] THEN
2471 STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2472 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2473 MP_TAC(ISPECL [`f:complex->complex`; `b:complex`; `a:complex`; `c:complex`;
2474 `&1 - k`] CAUCHY_THEOREM_FLAT_LEMMA) THEN
2476 [ASM_MESON_TAC[INSERT_AC; REAL_ARITH `~(&0 <= k) ==> &0 <= &1 - k`;
2477 VECTOR_ARITH `b - a = k % (c - a) ==> (b - c) = (&1 - k) % (a - c)`];
2479 MATCH_MP_TAC(COMPLEX_RING
2480 `ab = --ba /\ ac = --ca /\ bc = --cb
2481 ==> ba + ac + cb = Cx(&0) ==> ab + bc + ca = Cx(&0)`) THEN
2482 REPEAT CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_REVERSE_LINEPATH THEN
2483 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]);;
2485 let CAUCHY_THEOREM_TRIANGLE_INTERIOR = prove
2487 f continuous_on (convex hull {a,b,c}) /\
2488 f holomorphic_on interior (convex hull {a,b,c})
2489 ==> (f has_path_integral Cx(&0))
2490 (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a))`,
2491 REPEAT STRIP_TAC THEN
2492 STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2493 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2496 !y. y IN IMAGE (f:complex->complex) (convex hull {a,b,c})
2499 [REWRITE_TAC[GSYM BOUNDED_POS] THEN MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
2500 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
2501 ASM_SIMP_TAC[FINITE_IMP_COMPACT_CONVEX_HULL; FINITE_INSERT; FINITE_RULES];
2502 REWRITE_TAC[FORALL_IN_IMAGE] THEN STRIP_TAC] THEN
2504 `?C. &0 < C /\ !x:complex. x IN convex hull {a,b,c} ==> norm(x) <= C`
2506 [REWRITE_TAC[GSYM BOUNDED_POS] THEN
2507 MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
2508 ASM_SIMP_TAC[FINITE_IMP_COMPACT_CONVEX_HULL; FINITE_INSERT; FINITE_RULES];
2511 `(f:complex->complex) uniformly_continuous_on (convex hull {a,b,c})`
2513 [MATCH_MP_TAC COMPACT_UNIFORMLY_CONTINUOUS THEN
2514 ASM_SIMP_TAC[FINITE_IMP_COMPACT_CONVEX_HULL; FINITE_RULES; FINITE_INSERT];
2516 REWRITE_TAC[uniformly_continuous_on] THEN DISCH_TAC THEN
2518 `f path_integrable_on
2519 (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`
2521 [SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN; VALID_PATH_LINEPATH;
2522 PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
2523 PATHFINISH_LINEPATH] THEN
2524 ASM_MESON_TAC[PATH_INTEGRABLE_CONTINUOUS_LINEPATH; CONTINUOUS_ON_SUBSET];
2526 SIMP_TAC[path_integrable_on] THEN DISCH_THEN(X_CHOOSE_TAC `y:complex`) THEN
2527 ASM_CASES_TAC `y = Cx(&0)` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
2528 UNDISCH_TAC `~(y = Cx(&0))` THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
2529 DISCH_THEN(K ALL_TAC) THEN REWRITE_TAC[] THEN
2530 FIRST_ASSUM(ASSUME_TAC o SYM o MATCH_MP
2531 HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2532 ASM_REWRITE_TAC[] THEN
2533 ASM_CASES_TAC `c:complex = a` THENL
2534 [MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2535 EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ];
2537 ASM_CASES_TAC `b:complex = c` THENL
2538 [ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = c + a + b`] THEN
2539 MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2540 EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ] THEN
2541 ASM_MESON_TAC[INSERT_AC];
2543 ASM_CASES_TAC `a:complex = b` THENL
2544 [ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = b + c + a`] THEN
2545 MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2546 EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ] THEN
2547 ASM_MESON_TAC[INSERT_AC];
2549 ASM_CASES_TAC `interior(convex hull {a:complex,b,c}) = {}` THENL
2550 [MATCH_MP_TAC CAUCHY_THEOREM_FLAT THEN
2551 SUBGOAL_THEN `{a:complex,b,c} HAS_SIZE (dimindex(:2) + 1)`
2553 [ASM_SIMP_TAC[HAS_SIZE; CARD_CLAUSES; FINITE_INSERT; FINITE_EMPTY] THEN
2554 ASM_REWRITE_TAC[DIMINDEX_2; ARITH; IN_INSERT; NOT_IN_EMPTY];
2556 DISCH_THEN(MP_TAC o MATCH_MP INTERIOR_CONVEX_HULL_EQ_EMPTY) THEN
2557 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
2558 SUBGOAL_THEN `collinear{a:complex,b,c}` MP_TAC THENL
2559 [ASM_REWRITE_TAC[COLLINEAR_3_EQ_AFFINE_DEPENDENT]; ALL_TAC] THEN
2560 ONCE_REWRITE_TAC[SET_RULE `{a,b,c} = {b,a,c}`] THEN
2561 ONCE_REWRITE_TAC[COLLINEAR_3] THEN
2562 ASM_REWRITE_TAC[COLLINEAR_LEMMA; VECTOR_SUB_EQ];
2564 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
2565 DISCH_THEN(X_CHOOSE_TAC `d:complex`) THEN FIRST_X_ASSUM(MP_TAC o SYM) THEN
2567 ASM_REWRITE_TAC[] THEN ASM_CASES_TAC `y = Cx(&0)` THEN ASM_REWRITE_TAC[] THEN
2568 FIRST_X_ASSUM(MP_TAC o SPEC `norm(y:complex) / &24 / C`) THEN
2569 SUBGOAL_THEN `&0 < norm(y:complex) / &24 / C` ASSUME_TAC THENL
2570 [ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH; NORM_POS_LE; REAL_LTE_ADD;
2571 COMPLEX_NORM_NZ; COMPLEX_SUB_0];
2572 ASM_REWRITE_TAC[dist]] THEN
2573 DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN ABBREV_TAC
2575 (min (d1 / (&4 * C))
2576 ((norm(y:complex) / &24 / C) / B))` THEN
2577 SUBGOAL_THEN `&0 < e` ASSUME_TAC THENL
2578 [EXPAND_TAC "e" THEN
2579 ASM_SIMP_TAC[REAL_HALF; REAL_LT_MIN; REAL_LT_DIV; COMPLEX_NORM_NZ;
2580 REAL_LT_MUL; REAL_OF_NUM_LT; ARITH];
2582 ABBREV_TAC `shrink = \x:complex. x - e % (x - d)` THEN
2583 SUBGOAL_THEN `shrink (a:complex) IN interior(convex hull {a,b,c}) /\
2584 shrink b IN interior(convex hull {a,b,c}) /\
2585 shrink c IN interior(convex hull {a,b,c})`
2586 STRIP_ASSUME_TAC THENL
2587 [REPEAT CONJ_TAC THEN EXPAND_TAC "shrink" THEN
2588 MATCH_MP_TAC IN_INTERIOR_CONVEX_SHRINK THEN
2589 ASM_REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
2590 (CONJ_TAC THENL [ALL_TAC; EXPAND_TAC "e" THEN REAL_ARITH_TAC]) THEN
2591 MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2592 REWRITE_TAC[IN_INSERT];
2595 `norm((path_integral(linepath(shrink a,shrink b)) f -
2596 path_integral(linepath(a,b)) f) +
2597 (path_integral(linepath(shrink b,shrink c)) f -
2598 path_integral(linepath(b,c)) f) +
2599 (path_integral(linepath(shrink c,shrink a)) f -
2600 path_integral(linepath(c,a)) f)) <= norm(y:complex) / &2`
2603 ASM_REWRITE_TAC[COMPLEX_RING
2604 `(ab' - ab) + (bc' - bc) + (ca' - ca) =
2605 (ab' + bc' + ca') - (ab + bc + ca)`] THEN
2607 `(f has_path_integral (Cx(&0)))
2608 (linepath (shrink a,shrink b) ++
2609 linepath (shrink b,shrink c) ++
2610 linepath (shrink c,shrink (a:complex)))`
2612 [MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE THEN
2613 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
2614 EXISTS_TAC `interior(convex hull {a:complex,b,c})` THEN
2615 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HULL_MINIMAL THEN
2616 SIMP_TAC[CONVEX_INTERIOR; CONVEX_CONVEX_HULL] THEN
2619 DISCH_THEN(MP_TAC o MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL) THEN
2620 SIMP_TAC[] THEN DISCH_THEN(K ALL_TAC) THEN
2621 REWRITE_TAC[COMPLEX_SUB_LZERO; NORM_NEG] THEN
2622 MATCH_MP_TAC(REAL_ARITH `&0 <= y /\ ~(y = &0) ==> ~(y <= y / &2)`) THEN
2623 ASM_REWRITE_TAC[COMPLEX_NORM_ZERO; NORM_POS_LE]] THEN
2625 `!x y. x IN convex hull {a,b,c} /\ y IN convex hull {a,b,c}
2626 ==> norm(x - y) <= &2 * C`
2628 [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_MUL_2; VECTOR_SUB] THEN
2629 MATCH_MP_TAC NORM_TRIANGLE_LE THEN REWRITE_TAC[NORM_NEG] THEN
2630 MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_SIMP_TAC[];
2632 REWRITE_TAC[REAL_ARITH `x / &2 = x / &6 + x / &6 + x / &6`] THEN
2633 REPEAT(MATCH_MP_TAC NORM_TRIANGLE_LE THEN
2634 MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC) THEN
2635 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
2636 GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM CONTENT_UNIT_1] THEN
2637 MATCH_MP_TAC HAS_INTEGRAL_BOUND THENL
2638 [EXISTS_TAC `\x. f(linepath(shrink a,shrink b) x) *
2639 (shrink b - shrink a) -
2640 f(linepath(a,b) x) * (b - a)`;
2641 EXISTS_TAC `\x. f(linepath(shrink b,shrink c) x) *
2642 (shrink c - shrink b) -
2643 f(linepath(b,c) x) * (c - b)`;
2644 EXISTS_TAC `\x. f(linepath(shrink c,shrink a) x) *
2645 (shrink a - shrink c) -
2646 f(linepath(c,a) x) * (a - c)`] THEN
2647 ASM_SIMP_TAC[COMPLEX_NORM_NZ; REAL_ARITH `&0 < x ==> &0 <= x / &6`] THEN
2649 [MATCH_MP_TAC HAS_INTEGRAL_SUB THEN
2650 REWRITE_TAC[GSYM HAS_PATH_INTEGRAL_LINEPATH] THEN
2651 CONJ_TAC THEN MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
2652 MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2653 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2654 EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2655 ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2656 MATCH_MP_TAC HULL_MINIMAL THEN
2657 REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET; IN_INSERT; NOT_IN_EMPTY] THEN
2658 ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
2660 REPEAT STRIP_TAC THEN
2661 ONCE_REWRITE_TAC[COMPLEX_RING
2662 `f' * x' - f * x = f' * (x' - x) + x * (f' - f):complex`] THEN
2663 MATCH_MP_TAC NORM_TRIANGLE_LE THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
2664 MATCH_MP_TAC REAL_LE_TRANS THEN
2665 EXISTS_TAC `B * (norm(y:complex) / &24 / C / B) * &2 * C +
2666 (&2 * C) * (norm y / &24 / C)` THEN
2669 MATCH_MP_TAC REAL_EQ_IMP_LE THEN
2670 MAP_EVERY UNDISCH_TAC [`&0 < B`; `&0 < C`] THEN CONV_TAC REAL_FIELD] THEN
2671 MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THEN
2672 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THENL
2674 [FIRST_X_ASSUM MATCH_MP_TAC THEN
2676 MP_TAC(PART_MATCH (lhand o rand) LINEPATH_IN_PATH (lhand w))) THEN
2677 ASM_REWRITE_TAC[] THEN
2678 W(fun (asl,w) -> SPEC_TAC(lhand(rand w),`x:complex`)) THEN
2679 REWRITE_TAC[GSYM SUBSET; SEGMENT_CONVEX_HULL] THEN
2680 MATCH_MP_TAC HULL_MINIMAL THEN
2681 REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET; IN_INSERT; NOT_IN_EMPTY] THEN
2682 ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
2684 EXPAND_TAC "shrink" THEN
2685 REWRITE_TAC[VECTOR_ARITH `(b - e % (b - d)) - (a - e % (a - d)) -
2686 (b - a) = e % (a - b)`] THEN
2687 REWRITE_TAC[NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
2688 ASM_SIMP_TAC[NORM_POS_LE; REAL_ARITH `&0 < x ==> abs x = x`;
2690 CONJ_TAC THENL [EXPAND_TAC "e" THEN REAL_ARITH_TAC; ALL_TAC] THEN
2691 FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THEN
2692 MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2693 REWRITE_TAC[IN_INSERT];
2696 [FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THEN
2697 MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2698 REWRITE_TAC[IN_INSERT];
2700 MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2703 MP_TAC(PART_MATCH (lhand o rand) LINEPATH_IN_PATH (lhand w))) THEN
2704 ASM_MESON_TAC[SUBSET];
2708 MP_TAC(PART_MATCH (lhand o rand) LINEPATH_IN_PATH (lhand w))) THEN
2709 ASM_REWRITE_TAC[] THEN
2710 W(fun (asl,w) -> SPEC_TAC(lhand(rand w),`x:complex`)) THEN
2711 REWRITE_TAC[GSYM SUBSET; SEGMENT_CONVEX_HULL] THEN
2712 MATCH_MP_TAC HULL_MINIMAL THEN
2713 REWRITE_TAC[CONVEX_CONVEX_HULL; SUBSET; IN_INSERT; NOT_IN_EMPTY] THEN
2714 ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
2716 REWRITE_TAC[linepath] THEN REWRITE_TAC[VECTOR_ARITH
2717 `((&1 - x) % a' + x % b') - ((&1 - x) % a + x % b) =
2718 (&1 - x) % (a' - a) + x % (b' - b)`] THEN
2719 EXPAND_TAC "shrink" THEN REWRITE_TAC[VECTOR_ARITH `a - b - a = --b`] THEN
2720 MATCH_MP_TAC NORM_TRIANGLE_LT THEN REWRITE_TAC[NORM_MUL; NORM_NEG] THEN
2721 MATCH_MP_TAC REAL_CONVEX_BOUND_LT THEN ONCE_REWRITE_TAC[TAUT
2722 `a /\ b /\ c /\ d /\ e <=> (c /\ d /\ e) /\ a /\ b`] THEN
2724 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
2725 REWRITE_TAC[DROP_VEC] THEN REAL_ARITH_TAC;
2728 MATCH_MP_TAC REAL_LET_TRANS THEN
2729 EXISTS_TAC `e * &2 * C` THEN
2730 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH `&0 < x ==> abs x = x`] THEN
2732 [FIRST_X_ASSUM MATCH_MP_TAC THEN
2733 ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET; HULL_SUBSET; IN_INSERT];
2735 ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
2736 EXPAND_TAC "e" THEN REWRITE_TAC[REAL_MIN_LT] THEN
2737 DISJ2_TAC THEN DISJ1_TAC THEN
2738 REWRITE_TAC[REAL_FIELD `d / (a * b) = inv(a:real) * d / b`] THEN
2739 REWRITE_TAC[REAL_ARITH `inv(&4) * x < inv(&2) * x <=> &0 < x`] THEN
2740 ASM_SIMP_TAC[REAL_LT_DIV]));;
2742 (* ------------------------------------------------------------------------- *)
2743 (* Version allowing finite number of exceptional points. *)
2744 (* ------------------------------------------------------------------------- *)
2746 let CAUCHY_THEOREM_TRIANGLE_COFINITE = prove
2748 f continuous_on (convex hull {a,b,c}) /\
2750 (!x. x IN interior(convex hull {a,b,c}) DIFF s
2751 ==> f complex_differentiable (at x))
2752 ==> (f has_path_integral Cx(&0))
2753 (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`,
2754 GEN_TAC THEN GEN_TAC THEN WF_INDUCT_TAC `CARD(s:complex->bool)` THEN
2755 REPEAT STRIP_TAC THEN ASM_CASES_TAC `s:complex->bool = {}` THENL
2756 [MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_INTERIOR THEN
2757 ASM_REWRITE_TAC[holomorphic_on] THEN X_GEN_TAC `z:complex` THEN
2758 DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
2759 ASM_REWRITE_TAC[complex_differentiable; IN_DIFF; NOT_IN_EMPTY] THEN
2760 MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
2762 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
2763 DISCH_THEN(X_CHOOSE_TAC `d:complex`) THEN
2764 FIRST_X_ASSUM(MP_TAC o SPEC `s DELETE (d:complex)`) THEN
2765 ASM_SIMP_TAC[CARD_DELETE; CARD_EQ_0;
2766 ARITH_RULE `n - 1 < n <=> ~(n = 0)`] THEN
2767 ASM_CASES_TAC `(d:complex) IN convex hull {a,b,c}` THENL
2769 DISCH_THEN MATCH_MP_TAC THEN
2770 ASM_REWRITE_TAC[FINITE_DELETE; IN_DIFF; IN_DELETE] THEN
2771 REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2772 ASM_REWRITE_TAC[IN_DIFF] THEN ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET]] THEN
2773 DISCH_TAC THEN SUBGOAL_THEN
2774 `(f has_path_integral Cx(&0))
2775 (linepath(a,b) ++ linepath(b,d) ++ linepath(d,a)) /\
2776 (f has_path_integral Cx(&0))
2777 (linepath(b,c) ++ linepath(c,d) ++ linepath(d,b)) /\
2778 (f has_path_integral Cx(&0))
2779 (linepath(c,a) ++ linepath(a,d) ++ linepath(d,c))`
2781 [RULE_ASSUM_TAC(REWRITE_RULE[IMP_IMP; RIGHT_IMP_FORALL_THM]) THEN
2782 REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2783 ASM_REWRITE_TAC[FINITE_DELETE] THEN
2785 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2786 EXISTS_TAC `convex hull {a:complex,b,c}` THEN ASM_REWRITE_TAC[] THEN
2787 MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2788 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2789 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2790 MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN
2791 REWRITE_TAC[IN_INSERT];
2793 ASM_REWRITE_TAC[FINITE_DELETE; IN_DIFF; IN_DELETE] THEN
2794 REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
2795 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [DE_MORGAN_THM]) THEN
2796 (ASM_CASES_TAC `x:complex = d` THEN ASM_REWRITE_TAC[] THENL
2797 [ASM_MESON_TAC[NOT_IN_INTERIOR_CONVEX_HULL_3]; ALL_TAC]) THEN
2798 DISCH_TAC THEN ASM_REWRITE_TAC[IN_DIFF] THEN
2799 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
2801 ==> interior s SUBSET interior t ==> x IN interior t`)) THEN
2802 MATCH_MP_TAC SUBSET_INTERIOR THEN
2803 MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2804 SIMP_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2805 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2806 MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN REWRITE_TAC[IN_INSERT];
2809 `f path_integrable_on
2810 (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a))`
2812 [SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN; VALID_PATH_LINEPATH;
2813 PATHSTART_JOIN; PATHFINISH_JOIN; PATHSTART_LINEPATH;
2814 PATHFINISH_LINEPATH] THEN
2815 STRIP_ASSUME_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`]
2816 SEGMENTS_SUBSET_CONVEX_HULL) THEN
2817 ASM_MESON_TAC[PATH_INTEGRABLE_CONTINUOUS_LINEPATH; CONTINUOUS_ON_SUBSET];
2819 REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
2820 X_GEN_TAC `y:complex` THEN
2821 DISCH_THEN(fun th -> ASSUME_TAC th THEN MP_TAC th) THEN
2822 REWRITE_TAC[IMP_IMP] THEN
2823 DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN
2824 (MP_TAC o MATCH_MP HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL)) THEN
2825 ASM_CASES_TAC `y = Cx(&0)` THEN ASM_REWRITE_TAC[] THENL
2826 [ASM_MESON_TAC[]; UNDISCH_TAC `~(y = Cx(&0))`] THEN
2828 SUBGOAL_THEN `(f:complex->complex) continuous_on segment[a,d] /\
2829 f continuous_on segment[b,d] /\
2830 f continuous_on segment[c,d]`
2833 DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN (MP_TAC o MATCH_MP
2834 PATH_INTEGRAL_REVERSE_LINEPATH)) THEN
2835 CONV_TAC COMPLEX_RING] THEN
2836 REPEAT CONJ_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2837 EXISTS_TAC `convex hull {a:complex,b,c}` THEN
2838 ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2839 MATCH_MP_TAC CONVEX_HULL_SUBSET THEN
2840 SIMP_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
2841 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2842 MATCH_MP_TAC(REWRITE_RULE[SUBSET] HULL_SUBSET) THEN REWRITE_TAC[IN_INSERT]);;
2844 (* ------------------------------------------------------------------------- *)
2845 (* Existence of a primitive. *)
2846 (* ------------------------------------------------------------------------- *)
2848 let STARLIKE_CONVEX_SUBSET = prove
2850 a IN s /\ segment[b,c] SUBSET s /\
2851 (!x. x IN s ==> segment[a,x] SUBSET s)
2852 ==> convex hull {a,b,c} SUBSET s`,
2853 REPEAT STRIP_TAC THEN
2854 MP_TAC(ISPECL [`{b:real^N,c}`; `a:real^N`] CONVEX_HULL_INSERT) THEN
2855 REWRITE_TAC[NOT_INSERT_EMPTY] THEN DISCH_THEN SUBST1_TAC THEN
2856 REWRITE_TAC[SUBSET; IN_ELIM_THM; LEFT_IMP_EXISTS_THM] THEN
2857 MAP_EVERY X_GEN_TAC [`x:real^N`; `u:real`; `v:real`; `d:real^N`] THEN
2858 STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `d:real^N`) THEN ANTS_TAC THENL
2859 [ASM_MESON_TAC[SUBSET; SEGMENT_CONVEX_HULL];
2860 ASM_REWRITE_TAC[SUBSET] THEN DISCH_THEN MATCH_MP_TAC THEN
2861 REWRITE_TAC[SEGMENT_CONVEX_HULL; CONVEX_HULL_2; IN_ELIM_THM] THEN
2864 let TRIANGLE_PATH_INTEGRALS_STARLIKE_PRIMITIVE = prove
2866 a IN s /\ open s /\ f continuous_on s /\
2867 (!z. z IN s ==> segment[a,z] SUBSET s) /\
2868 (!b c. segment[b,c] SUBSET s
2869 ==> path_integral (linepath(a,b)) f +
2870 path_integral (linepath(b,c)) f +
2871 path_integral (linepath(c,a)) f = Cx(&0))
2872 ==> ?g. !z. z IN s ==> (g has_complex_derivative f(z)) (at z)`,
2873 REPEAT STRIP_TAC THEN
2874 EXISTS_TAC `\x. path_integral (linepath(a,x)) f` THEN
2875 X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
2876 REWRITE_TAC[has_complex_derivative] THEN
2877 REWRITE_TAC[has_derivative_at; LINEAR_COMPLEX_MUL] THEN
2878 MATCH_MP_TAC LIM_TRANSFORM THEN
2879 EXISTS_TAC `\y. inv(norm(y - x)) % (path_integral(linepath(x,y)) f -
2880 f x * (y - x))` THEN
2881 REWRITE_TAC[VECTOR_ARITH
2882 `i % (x - a) - i % (y - (z + a)) = i % (x + z - y)`] THEN
2884 [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
2885 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
2886 DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN ASM_REWRITE_TAC[] THEN
2887 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
2888 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2889 X_GEN_TAC `y:complex` THEN REWRITE_TAC[dist] THEN STRIP_TAC THEN
2890 REWRITE_TAC[VECTOR_MUL_EQ_0] THEN DISJ2_TAC THEN
2891 MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `y:complex`]
2892 PATH_INTEGRAL_REVERSE_LINEPATH) THEN
2894 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
2895 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
2896 FIRST_X_ASSUM MATCH_MP_TAC THEN
2897 FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
2898 ASM_REWRITE_TAC[IN_BALL; ONCE_REWRITE_RULE[NORM_SUB] dist];
2899 REWRITE_TAC[COMPLEX_VEC_0] THEN MATCH_MP_TAC(COMPLEX_RING
2900 `ax + xy + ya = Cx(&0) ==> ay = --ya ==> xy + ax - ay = Cx(&0)`) THEN
2901 FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_X_ASSUM(MATCH_MP_TAC o
2902 MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT] SUBSET_TRANS)) THEN
2903 REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2904 MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
2905 REWRITE_TAC[SUBSET; IN_BALL; IN_INSERT; NOT_IN_EMPTY] THEN
2906 REPEAT STRIP_TAC THEN
2907 ASM_REWRITE_TAC[dist; NORM_0; VECTOR_SUB_REFL] THEN
2908 ASM_MESON_TAC[NORM_SUB]];
2909 REWRITE_TAC[LIM_AT] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
2910 SUBGOAL_THEN `(f:complex->complex) continuous at x` MP_TAC THENL
2911 [MATCH_MP_TAC CONTINUOUS_ON_INTERIOR THEN ASM_MESON_TAC[INTERIOR_OPEN];
2913 REWRITE_TAC[continuous_at; dist; VECTOR_SUB_RZERO] THEN
2914 DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
2915 DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
2916 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
2917 DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
2918 ASM_REWRITE_TAC[SUBSET; IN_BALL; dist] THEN
2919 DISCH_THEN(X_CHOOSE_THEN `d2:real` STRIP_ASSUME_TAC) THEN
2920 EXISTS_TAC `min d1 d2` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
2921 X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
2922 SUBGOAL_THEN `f path_integrable_on linepath(x,y)` MP_TAC THENL
2923 [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
2924 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
2925 ASM_REWRITE_TAC[] THEN
2926 MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(x:complex,d2)` THEN
2928 [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
2929 MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
2930 REWRITE_TAC[SUBSET; IN_BALL; IN_INSERT; NOT_IN_EMPTY] THEN
2931 REPEAT STRIP_TAC THEN
2932 ASM_REWRITE_TAC[dist; NORM_0; VECTOR_SUB_REFL] THEN
2933 ASM_MESON_TAC[NORM_SUB];
2934 ASM_REWRITE_TAC[SUBSET; IN_BALL; dist]];
2936 REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
2937 X_GEN_TAC `z:complex` THEN
2938 MP_TAC(SPECL [`x:complex`; `y:complex`; `(f:complex->complex) x`]
2939 HAS_PATH_INTEGRAL_CONST_LINEPATH) THEN
2940 REWRITE_TAC[IMP_IMP] THEN
2941 DISCH_THEN(fun th -> ASSUME_TAC(CONJUNCT2 th) THEN MP_TAC th) THEN
2942 FIRST_ASSUM(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
2943 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
2944 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_NEG) THEN
2945 REWRITE_TAC[COMPLEX_NEG_SUB] THEN STRIP_TAC THEN
2946 MATCH_MP_TAC(REAL_ARITH `x <= e / &2 /\ &0 < e ==> x < e`) THEN
2947 ASM_REWRITE_TAC[NORM_MUL; REAL_ABS_INV; REAL_ABS_NORM] THEN
2948 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
2949 ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
2950 MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
2951 EXISTS_TAC `\w. (f:complex->complex) w - f x` THEN
2952 ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> &0 <= e / &2`] THEN
2953 X_GEN_TAC `w:complex` THEN STRIP_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
2954 FIRST_X_ASSUM MATCH_MP_TAC THEN
2955 ASM_MESON_TAC[REAL_LET_TRANS; SEGMENT_BOUND]]);;
2957 let HOLOMORPHIC_STARLIKE_PRIMITIVE = prove
2958 (`!f s k. open s /\ starlike s /\ FINITE k /\ f continuous_on s /\
2959 (!x. x IN s DIFF k ==> f complex_differentiable at x)
2960 ==> ?g. !x. x IN s ==> (g has_complex_derivative f(x)) (at x)`,
2961 REPEAT STRIP_TAC THEN
2962 FIRST_X_ASSUM(X_CHOOSE_THEN `a:complex` STRIP_ASSUME_TAC o
2963 GEN_REWRITE_RULE I [starlike]) THEN
2964 MATCH_MP_TAC TRIANGLE_PATH_INTEGRALS_STARLIKE_PRIMITIVE THEN
2965 EXISTS_TAC `a:complex` THEN ASM_REWRITE_TAC[] THEN
2966 MAP_EVERY X_GEN_TAC [`x:complex`; `y:complex`] THEN STRIP_TAC THEN
2967 MATCH_MP_TAC HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL THEN
2968 MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_COFINITE THEN
2969 EXISTS_TAC `k:complex->bool` THEN ASM_REWRITE_TAC[] THEN
2970 SUBGOAL_THEN `convex hull {a:complex,x,y} SUBSET s` ASSUME_TAC THENL
2971 [MATCH_MP_TAC STARLIKE_CONVEX_SUBSET THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN
2972 CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
2973 REWRITE_TAC[IN_DIFF] THEN REPEAT STRIP_TAC THEN
2974 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_DIFF] THEN
2975 ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET]);;
2977 (* ------------------------------------------------------------------------- *)
2978 (* Cauchy's theorem for an open starlike set. *)
2979 (* ------------------------------------------------------------------------- *)
2981 let CAUCHY_THEOREM_STARLIKE = prove
2982 (`!f s k g. open s /\ starlike s /\ FINITE k /\ f continuous_on s /\
2983 (!x. x IN s DIFF k ==> f complex_differentiable at x) /\
2984 valid_path g /\ (path_image g) SUBSET s /\
2985 pathfinish g = pathstart g
2986 ==> (f has_path_integral Cx(&0)) (g)`,
2987 MESON_TAC[HOLOMORPHIC_STARLIKE_PRIMITIVE; CAUCHY_THEOREM_PRIMITIVE;
2988 HAS_COMPLEX_DERIVATIVE_AT_WITHIN]);;
2990 let CAUCHY_THEOREM_STARLIKE_SIMPLE = prove
2991 (`!f s g. open s /\ starlike s /\ f holomorphic_on s /\
2992 valid_path g /\ (path_image g) SUBSET s /\
2993 pathfinish g = pathstart g
2994 ==> (f has_path_integral Cx(&0)) (g)`,
2995 REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_STARLIKE THEN
2996 MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
2997 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; FINITE_RULES] THEN
2998 REWRITE_TAC[IN_DIFF; NOT_IN_EMPTY; complex_differentiable] THEN
2999 ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; holomorphic_on]);;
3001 (* ------------------------------------------------------------------------- *)
3002 (* For a convex set we can avoid assuming openness and boundary analyticity. *)
3003 (* ------------------------------------------------------------------------- *)
3005 let TRIANGLE_PATH_INTEGRALS_CONVEX_PRIMITIVE = prove
3007 a IN s /\ convex s /\ f continuous_on s /\
3008 (!b c. b IN s /\ c IN s
3009 ==> path_integral (linepath(a,b)) f +
3010 path_integral (linepath(b,c)) f +
3011 path_integral (linepath(c,a)) f = Cx(&0))
3012 ==> ?g. !z. z IN s ==> (g has_complex_derivative f(z)) (at z within s)`,
3013 REPEAT STRIP_TAC THEN
3014 EXISTS_TAC `\x. path_integral (linepath(a,x)) f` THEN
3015 X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
3016 REWRITE_TAC[has_complex_derivative] THEN
3017 REWRITE_TAC[has_derivative_within; LINEAR_COMPLEX_MUL] THEN
3018 MATCH_MP_TAC LIM_TRANSFORM THEN
3019 EXISTS_TAC `\y. inv(norm(y - x)) % (path_integral(linepath(x,y)) f -
3020 f x * (y - x))` THEN
3021 REWRITE_TAC[VECTOR_ARITH
3022 `i % (x - a) - i % (y - (z + a)) = i % (x + z - y)`] THEN
3024 [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_WITHIN] THEN
3025 EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN
3026 X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
3027 REWRITE_TAC[VECTOR_MUL_EQ_0] THEN DISJ2_TAC THEN
3028 MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `y:complex`]
3029 PATH_INTEGRAL_REVERSE_LINEPATH) THEN
3031 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
3032 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
3033 REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
3034 MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
3035 REWRITE_TAC[COMPLEX_VEC_0] THEN MATCH_MP_TAC(COMPLEX_RING
3036 `ax + xy + ya = Cx(&0) ==> ay = --ya ==> xy + ax - ay = Cx(&0)`) THEN
3038 REWRITE_TAC[LIM_WITHIN] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3040 `(f:complex->complex) continuous (at x within s)` MP_TAC THENL
3041 [ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN]; ALL_TAC] THEN
3042 REWRITE_TAC[continuous_within; dist; VECTOR_SUB_RZERO] THEN
3043 DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
3044 DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
3045 EXISTS_TAC `d1:real` THEN ASM_REWRITE_TAC[] THEN
3046 X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
3047 SUBGOAL_THEN `f path_integrable_on linepath(x,y)` MP_TAC THENL
3048 [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
3049 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
3050 ASM_REWRITE_TAC[] THEN REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
3051 MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
3053 REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
3054 X_GEN_TAC `z:complex` THEN
3055 MP_TAC(SPECL [`x:complex`; `y:complex`; `(f:complex->complex) x`]
3056 HAS_PATH_INTEGRAL_CONST_LINEPATH) THEN
3057 REWRITE_TAC[IMP_IMP] THEN
3058 DISCH_THEN(fun th -> ASSUME_TAC(CONJUNCT2 th) THEN MP_TAC th) THEN
3059 FIRST_ASSUM(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
3060 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
3061 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_NEG) THEN
3062 REWRITE_TAC[COMPLEX_NEG_SUB] THEN STRIP_TAC THEN
3063 MATCH_MP_TAC(REAL_ARITH `x <= e / &2 /\ &0 < e ==> x < e`) THEN
3064 ASM_REWRITE_TAC[NORM_MUL; REAL_ABS_INV; REAL_ABS_NORM] THEN
3065 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
3066 ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
3067 MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
3068 EXISTS_TAC `\w. (f:complex->complex) w - f x` THEN
3069 ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> &0 <= e / &2`] THEN
3070 X_GEN_TAC `w:complex` THEN STRIP_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
3071 FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL
3072 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
3073 `w IN t ==> t SUBSET s ==> w IN s`)) THEN
3074 REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
3075 MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
3076 ASM_MESON_TAC[REAL_LET_TRANS; SEGMENT_BOUND]]]);;
3078 let PATHINTEGRAL_CONVEX_PRIMITIVE = prove
3079 (`!f s. convex s /\ f continuous_on s /\
3080 (!a b c. a IN s /\ b IN s /\ c IN s
3081 ==> (f has_path_integral Cx(&0))
3082 (linepath (a,b) ++ linepath(b,c) ++ linepath(c,a)))
3084 ==> (g has_complex_derivative f(x)) (at x within s)`,
3085 REPEAT STRIP_TAC THEN
3086 ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN
3087 FIRST_X_ASSUM(X_CHOOSE_THEN `a:complex` STRIP_ASSUME_TAC o
3088 GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
3089 MATCH_MP_TAC TRIANGLE_PATH_INTEGRALS_CONVEX_PRIMITIVE THEN
3090 EXISTS_TAC `a:complex` THEN ASM_REWRITE_TAC[] THEN
3091 REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL THEN
3094 let HOLOMORPHIC_CONVEX_PRIMITIVE = prove
3095 (`!f s k. convex s /\ FINITE k /\ f continuous_on s /\
3096 (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x)
3098 ==> (g has_complex_derivative f(x)) (at x within s)`,
3099 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATHINTEGRAL_CONVEX_PRIMITIVE THEN
3100 ASM_REWRITE_TAC[] THEN
3101 REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_COFINITE THEN
3102 EXISTS_TAC `k:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
3103 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
3105 X_GEN_TAC `w:complex` THEN
3106 DISCH_THEN(fun th -> FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
3107 SPEC_TAC(`w:complex`,`w:complex`) THEN ASM_REWRITE_TAC[GSYM SUBSET] THEN
3108 MATCH_MP_TAC(SET_RULE `s SUBSET t ==> (s DIFF k) SUBSET (t DIFF k)`) THEN
3109 MATCH_MP_TAC SUBSET_INTERIOR] THEN
3110 MATCH_MP_TAC HULL_MINIMAL THEN ASM_REWRITE_TAC[] THEN ASM SET_TAC[]);;
3112 let CAUCHY_THEOREM_CONVEX = prove
3113 (`!f s k g. convex s /\ FINITE k /\ f continuous_on s /\
3114 (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x) /\
3115 valid_path g /\ (path_image g) SUBSET s /\
3116 pathfinish g = pathstart g
3117 ==> (f has_path_integral Cx(&0)) (g)`,
3118 MESON_TAC[HOLOMORPHIC_CONVEX_PRIMITIVE; CAUCHY_THEOREM_PRIMITIVE]);;
3120 let CAUCHY_THEOREM_CONVEX_SIMPLE = prove
3121 (`!f s g. convex s /\ f holomorphic_on s /\
3122 valid_path g /\ (path_image g) SUBSET s /\
3123 pathfinish g = pathstart g
3124 ==> (f has_path_integral Cx(&0)) (g)`,
3125 REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_CONVEX THEN
3126 MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
3127 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; FINITE_RULES] THEN
3128 REWRITE_TAC[IN_DIFF; NOT_IN_EMPTY; complex_differentiable] THEN
3129 SUBGOAL_THEN `f holomorphic_on (interior s)` MP_TAC THENL
3130 [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; INTERIOR_SUBSET]; ALL_TAC] THEN
3131 MESON_TAC[holomorphic_on; HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN;
3134 (* ------------------------------------------------------------------------- *)
3135 (* In particular for a disc. *)
3136 (* ------------------------------------------------------------------------- *)
3138 let CAUCHY_THEOREM_DISC = prove
3140 FINITE k /\ f continuous_on cball(a,e) /\
3141 (!x. x IN ball(a,e) DIFF k ==> f complex_differentiable at x) /\
3142 valid_path g /\ (path_image g) SUBSET cball(a,e) /\
3143 pathfinish g = pathstart g
3144 ==> (f has_path_integral Cx(&0)) (g)`,
3145 REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_CONVEX THEN
3146 MAP_EVERY EXISTS_TAC [`cball(a:complex,e)`; `k:complex->bool`] THEN
3147 ASM_REWRITE_TAC[INTERIOR_CBALL; CONVEX_CBALL]);;
3149 let CAUCHY_THEOREM_DISC_SIMPLE = prove
3151 f holomorphic_on ball(a,e) /\
3152 valid_path g /\ (path_image g) SUBSET ball(a,e) /\
3153 pathfinish g = pathstart g
3154 ==> (f has_path_integral Cx(&0)) (g)`,
3155 REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_CONVEX_SIMPLE THEN
3156 EXISTS_TAC `ball(a:complex,e)` THEN ASM_REWRITE_TAC[CONVEX_BALL; OPEN_BALL]);;
3158 (* ------------------------------------------------------------------------- *)
3159 (* Generalize integrability to local primitives. *)
3160 (* ------------------------------------------------------------------------- *)
3162 let PATH_INTEGRAL_LOCAL_PRIMITIVE_LEMMA = prove
3164 (!x. x IN s ==> (f has_complex_derivative f' x) (at x within s)) /\
3165 g piecewise_differentiable_on interval[a,b] /\
3166 (!x. x IN interval[a,b] ==> g(x) IN s)
3167 ==> (\x. f' (g x) * vector_derivative g (at x within interval[a,b]))
3168 integrable_on interval[a,b]`,
3169 REPEAT STRIP_TAC THEN
3170 ASM_CASES_TAC `interval[a:real^1,b] = {}` THENL
3171 [ASM_REWRITE_TAC[INTEGRABLE_ON_EMPTY];
3172 REWRITE_TAC[integrable_on] THEN
3173 EXISTS_TAC `(f:complex->complex) (g(b:real^1)) - f(g a)` THEN
3174 MATCH_MP_TAC PATH_INTEGRAL_PRIMITIVE_LEMMA THEN
3177 let PATH_INTEGRAL_LOCAL_PRIMITIVE_ANY = prove
3182 ==> (h has_complex_derivative f(y)) (at y within s)) /\
3183 g piecewise_differentiable_on interval[a,b] /\
3184 (!x. x IN interval[a,b] ==> g(x) IN s)
3185 ==> (\x. f(g x) * vector_derivative g (at x)) integrable_on interval[a,b]`,
3186 REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_ON_LITTLE_SUBINTERVALS THEN
3187 X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
3188 FIRST_X_ASSUM(MP_TAC o SPEC `(g:real^1->complex) x`) THEN
3189 ASM_SIMP_TAC[LEFT_IMP_EXISTS_THM] THEN
3190 MAP_EVERY X_GEN_TAC [`d:real`; `h:complex->complex`] THEN STRIP_TAC THEN
3191 FIRST_ASSUM(MP_TAC o MATCH_MP
3192 PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON) THEN
3193 REWRITE_TAC[continuous_on] THEN DISCH_THEN(MP_TAC o SPEC `x:real^1`) THEN
3194 ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `d:real`) THEN
3195 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
3196 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
3197 SIMP_TAC[integrable_on; GSYM HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
3198 REWRITE_TAC[GSYM integrable_on] THEN
3199 MATCH_MP_TAC PATH_INTEGRAL_LOCAL_PRIMITIVE_LEMMA THEN
3200 MAP_EVERY EXISTS_TAC
3201 [`h:complex->complex`; `IMAGE (g:real^1->complex) (interval[u,v])`] THEN
3202 REWRITE_TAC[FORALL_IN_IMAGE] THEN REPEAT STRIP_TAC THENL
3203 [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_WITHIN_SUBSET THEN
3204 EXISTS_TAC `s:complex->bool` THEN
3205 CONJ_TAC THENL [FIRST_X_ASSUM MATCH_MP_TAC; ASM SET_TAC[]] THEN
3206 REWRITE_TAC[GSYM dist] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3207 ASM_MESON_TAC[SUBSET; IN_BALL; DIST_SYM];
3208 ASM_MESON_TAC[PIECEWISE_DIFFERENTIABLE_ON_SUBSET];
3211 let PATH_INTEGRAL_LOCAL_PRIMITIVE = prove
3216 ==> (h has_complex_derivative f(y)) (at y within s)) /\
3217 valid_path g /\ (path_image g) SUBSET s
3218 ==> f path_integrable_on g`,
3219 REWRITE_TAC[valid_path; path_image; SUBSET; FORALL_IN_IMAGE] THEN
3220 REWRITE_TAC[path_integrable_on; has_path_integral] THEN
3221 REWRITE_TAC[HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
3222 REWRITE_TAC[GSYM integrable_on; PATH_INTEGRAL_LOCAL_PRIMITIVE_ANY]);;
3224 (* ------------------------------------------------------------------------- *)
3225 (* In particular if a function is holomorphic. *)
3226 (* ------------------------------------------------------------------------- *)
3228 let PATH_INTEGRABLE_HOLOMORPHIC = prove
3230 open s /\ FINITE k /\
3231 f continuous_on s /\
3232 (!x. x IN s DIFF k ==> f complex_differentiable at x) /\
3233 valid_path g /\ path_image g SUBSET s
3234 ==> f path_integrable_on g`,
3235 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_LOCAL_PRIMITIVE THEN
3236 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
3237 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3238 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
3239 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
3240 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN STRIP_TAC THEN
3241 MP_TAC(ISPECL [`f:complex->complex`; `ball(z:complex,d)`;
3242 `k:complex->bool`] HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
3244 [ASM_REWRITE_TAC[CONVEX_BALL; DIFF_EMPTY] THEN CONJ_TAC THENL
3245 [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
3246 GEN_TAC THEN DISCH_THEN(fun th ->
3247 FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
3248 SIMP_TAC[IN_DIFF] THEN ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET];
3249 MATCH_MP_TAC MONO_EXISTS THEN
3250 SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL] THEN
3251 ONCE_REWRITE_TAC[NORM_SUB] THEN REWRITE_TAC[IN_BALL; dist] THEN
3252 ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN]]);;
3254 let PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE = prove
3255 (`!f g s. open s /\ f holomorphic_on s /\ valid_path g /\ path_image g SUBSET s
3256 ==> f path_integrable_on g`,
3257 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC THEN
3258 MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
3259 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; FINITE_RULES; DIFF_EMPTY] THEN
3260 ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; complex_differentiable]);;
3262 (* ------------------------------------------------------------------------- *)
3263 (* Key fact that path integral is the same for a "nearby" path. This is the *)
3264 (* main lemma for the homotopy form of Cauchy's theorem and is also useful *)
3265 (* if we want "without loss of generality" to assume some niceness of our *)
3266 (* path (e.g. smoothness). It can also be used to define the integrals of *)
3267 (* analytic functions over arbitrary continuous paths. This is just done for *)
3268 (* winding numbers now; I'm not sure if it's worth going further with that. *)
3269 (* ------------------------------------------------------------------------- *)
3271 let PATH_INTEGRAL_NEARBY_ENDS,PATH_INTEGRAL_NEARBY_LOOP = (CONJ_PAIR o prove)
3273 open s /\ path p /\ path_image p SUBSET s
3275 !g h. valid_path g /\ valid_path h /\
3276 (!t. t IN interval[vec 0,vec 1]
3277 ==> norm(g t - p t) < d /\ norm(h t - p t) < d) /\
3278 pathstart h = pathstart g /\ pathfinish h = pathfinish g
3279 ==> path_image g SUBSET s /\
3280 path_image h SUBSET s /\
3281 !f. f holomorphic_on s
3282 ==> path_integral h f = path_integral g f) /\
3284 open s /\ path p /\ path_image p SUBSET s
3286 !g h. valid_path g /\ valid_path h /\
3287 (!t. t IN interval[vec 0,vec 1]
3288 ==> norm(g t - p t) < d /\ norm(h t - p t) < d) /\
3289 pathfinish g = pathstart g /\ pathfinish h = pathstart h
3290 ==> path_image g SUBSET s /\
3291 path_image h SUBSET s /\
3292 !f. f holomorphic_on s
3293 ==> path_integral h f = path_integral g f)`,
3294 REWRITE_TAC[AND_FORALL_THM] THEN REPEAT GEN_TAC THEN
3295 MAP_EVERY (fun t -> ASM_CASES_TAC t THEN ASM_REWRITE_TAC[])
3296 [`open(s:complex->bool)`;
3297 `path(p:real^1->complex)`;
3298 `path_image(p:real^1->complex) SUBSET s`] THEN
3299 REWRITE_TAC[RIGHT_IMP_EXISTS_THM] THEN
3300 MATCH_MP_TAC(MESON[] `(?x. P x /\ Q x) ==> (?x. P x) /\ (?x. Q x)`) THEN
3302 `!z. z IN path_image p ==> ?e. &0 < e /\ ball(z:complex,e) SUBSET s`
3304 [ASM_MESON_TAC[OPEN_CONTAINS_BALL; SUBSET]; ALL_TAC] THEN
3305 GEN_REWRITE_TAC (LAND_CONV o TOP_DEPTH_CONV)
3306 [RIGHT_IMP_EXISTS_THM; RIGHT_AND_EXISTS_THM; SKOLEM_THM] THEN
3307 REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `ee:complex->real` THEN
3308 DISCH_THEN(LABEL_TAC "*") THEN
3309 FIRST_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_HEINE_BOREL o
3310 MATCH_MP COMPACT_PATH_IMAGE) THEN
3311 DISCH_THEN(MP_TAC o SPEC
3312 `IMAGE (\z:complex. ball(z,ee z / &3)) (path_image p)`) THEN
3314 [REWRITE_TAC[FORALL_IN_IMAGE; OPEN_BALL; SUBSET] THEN
3315 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3316 REWRITE_TAC[UNIONS_IMAGE; IN_ELIM_THM] THEN EXISTS_TAC `z:complex` THEN
3317 ASM_SIMP_TAC[CENTRE_IN_BALL; REAL_ARITH `&0 < e / &3 <=> &0 < e`];
3319 REWRITE_TAC[path_image; GSYM IMAGE_o] THEN REWRITE_TAC[GSYM path_image] THEN
3320 ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN
3321 REWRITE_TAC[CONJ_ASSOC; FINITE_SUBSET_IMAGE] THEN
3322 REWRITE_TAC[LEFT_AND_EXISTS_THM; MESON[]
3323 `(?f s. (P s /\ f = g s) /\ Q f) <=> ?s. P s /\ Q(g s)`] THEN
3324 REWRITE_TAC[UNIONS_IMAGE; LEFT_IMP_EXISTS_THM] THEN
3325 X_GEN_TAC `k:real^1->bool` THEN
3326 DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
3327 GEN_REWRITE_TAC LAND_CONV [SUBSET] THEN REWRITE_TAC[IN_ELIM_THM; o_THM] THEN
3328 ASM_CASES_TAC `k:real^1->bool = {}` THENL
3329 [ASM_REWRITE_TAC[NOT_IN_EMPTY; GSYM NOT_EXISTS_THM; MEMBER_NOT_EMPTY] THEN
3330 REWRITE_TAC[PATH_IMAGE_NONEMPTY];
3331 DISCH_THEN(LABEL_TAC "+")] THEN
3333 `!i:real^1. i IN k ==> &0 < ee((p i):complex)`
3335 [ASM_MESON_TAC[SUBSET; path_image; IN_IMAGE]; ALL_TAC] THEN
3336 ABBREV_TAC `e = inf(IMAGE ((ee:complex->real) o (p:real^1->complex)) k)` THEN
3337 MP_TAC(ISPEC `IMAGE ((ee:complex->real) o (p:real^1->complex)) k`
3339 MP_TAC(ISPECL [`IMAGE ((ee:complex->real) o (p:real^1->complex)) k`; `&0`]
3340 REAL_LT_INF_FINITE) THEN
3341 ASM_SIMP_TAC[FINITE_IMAGE; IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
3342 ASM_REWRITE_TAC[o_THM] THEN DISCH_TAC THEN
3343 DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
3344 EXISTS_TAC `e / &3` THEN
3345 MP_TAC(ISPECL [`p:real^1->complex`; `interval[vec 0:real^1,vec 1]`]
3346 COMPACT_UNIFORMLY_CONTINUOUS) THEN REWRITE_TAC[COMPACT_INTERVAL] THEN
3347 ANTS_TAC THENL [ASM_MESON_TAC[path]; ALL_TAC] THEN
3348 REWRITE_TAC[uniformly_continuous_on] THEN
3349 DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN
3350 ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &3 <=> &0 < e`] THEN
3351 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
3352 REWRITE_TAC[RIGHT_IMP_FORALL_THM; AND_FORALL_THM] THEN
3353 MAP_EVERY X_GEN_TAC [`g:real^1->complex`; `h:real^1->complex`] THEN
3354 MAP_EVERY (fun t -> ASM_CASES_TAC t THEN ASM_REWRITE_TAC[])
3355 [`!t. t IN interval[vec 0,vec 1]
3356 ==> norm((g:real^1->complex) t - p t) < e / &3 /\
3357 norm((h:real^1->complex) t - p t) < e / &3`;
3358 `valid_path(g:real^1->complex)`; `valid_path(h:real^1->complex)`] THEN
3360 `q /\ (p1 \/ p2 ==> q ==> r) ==> (p1 ==> q /\ r) /\ (p2 ==> q /\ r)`) THEN
3362 [CONJ_TAC THEN REWRITE_TAC[path_image; SUBSET; FORALL_IN_IMAGE] THEN
3363 X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
3364 REMOVE_THEN "+" (MP_TAC o SPEC `(p:real^1->complex) t`) THEN
3365 ASM_SIMP_TAC[path_image; FUN_IN_IMAGE; IN_BALL] THEN
3366 DISCH_THEN(X_CHOOSE_THEN `u:real^1` STRIP_ASSUME_TAC) THENL
3367 [SUBGOAL_THEN `(g:real^1->complex) t IN ball(p(u:real^1),ee(p u))`
3368 MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[path_image; IN_IMAGE; SUBSET]];
3369 SUBGOAL_THEN `(h:real^1->complex) t IN ball(p(u:real^1),ee(p u))`
3370 MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[path_image; IN_IMAGE; SUBSET]]] THEN
3371 REWRITE_TAC[IN_BALL] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
3372 (NORM_ARITH `dist(gu,gt) < eu / &3
3373 ==> norm(ht - gt) < e / &3 /\ e <= eu
3374 ==> dist(gu,ht) < eu`)) THEN
3376 DISCH_TAC THEN STRIP_TAC THEN
3377 X_GEN_TAC `f:complex->complex` THEN DISCH_TAC] THEN
3379 `?ff. !z. z IN path_image p
3380 ==> &0 < ee z /\ ball(z,ee z) SUBSET s /\
3381 !w. w IN ball(z,ee z)
3382 ==> (ff z has_complex_derivative f w) (at w)`
3384 [REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_EXISTS_IMP_THM;
3385 RIGHT_EXISTS_AND_THM] THEN
3386 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3387 REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
3388 ASM_REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
3389 MP_TAC(ISPECL [`f:complex->complex`; `ball(z:complex,ee z)`;
3390 `{}:complex->bool`] HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
3391 SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL] THEN
3392 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[CONVEX_BALL; FINITE_EMPTY] THEN
3393 SIMP_TAC[DIFF_EMPTY; INTERIOR_OPEN; OPEN_BALL] THEN
3394 SUBGOAL_THEN `f holomorphic_on ball(z,ee z)` MP_TAC THENL
3395 [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
3397 SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
3398 SIMP_TAC[holomorphic_on; HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL;
3399 complex_differentiable]];
3400 REMOVE_THEN "*" (K ALL_TAC) THEN
3401 DISCH_THEN(CHOOSE_THEN (LABEL_TAC "*"))] THEN
3402 MP_TAC(ISPEC `d:real` REAL_ARCH_INV) THEN ASM_REWRITE_TAC[] THEN
3403 DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
3406 ==> path_integral(subpath (vec 0) (&n / &N % vec 1) h) f -
3407 path_integral(subpath (vec 0) (&n / &N % vec 1) g) f =
3408 path_integral(linepath (g(&n / &N % vec 1),h(&n / &N % vec 1))) f -
3409 path_integral(linepath (g(vec 0),h(vec 0))) f`
3410 (MP_TAC o SPEC `N:num`) THENL
3412 ASM_SIMP_TAC[LE_REFL; REAL_DIV_REFL; REAL_OF_NUM_EQ; VECTOR_MUL_LID] THEN
3413 FIRST_X_ASSUM(DISJ_CASES_THEN MP_TAC) THEN
3414 REWRITE_TAC[pathstart; pathfinish] THEN STRIP_TAC THEN
3415 ASM_REWRITE_TAC[SUBPATH_TRIVIAL; PATH_INTEGRAL_TRIVIAL] THEN
3416 CONV_TAC COMPLEX_RING] THEN
3418 [REWRITE_TAC[real_div; REAL_MUL_LZERO; VECTOR_MUL_LZERO] THEN
3419 FIRST_X_ASSUM(DISJ_CASES_THEN MP_TAC) THEN
3420 REWRITE_TAC[pathstart; pathfinish] THEN REPEAT STRIP_TAC THEN
3421 ASM_REWRITE_TAC[PATH_INTEGRAL_TRIVIAL; PATH_INTEGRAL_SUBPATH_REFL] THEN
3422 REWRITE_TAC[COMPLEX_SUB_REFL];
3423 DISCH_TAC THEN FIRST_X_ASSUM(K ALL_TAC o check (is_disj o concl))] THEN
3424 REMOVE_THEN "+" (MP_TAC o SPEC `(p:real^1->complex)(&n / &N % vec 1)`) THEN
3425 REWRITE_TAC[IN_BALL] THEN ANTS_TAC THENL
3426 [REWRITE_TAC[path_image] THEN MATCH_MP_TAC FUN_IN_IMAGE THEN
3427 REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN
3428 ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
3429 REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC;
3430 DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC)] THEN
3432 [`(ff:complex->complex->complex) (p(t:real^1))`; `f:complex->complex`;
3433 `subpath (&n / &N % vec 1) (&(SUC n) / &N % vec 1) (g:real^1->complex) ++
3434 linepath(g (&(SUC n) / &N % vec 1),h(&(SUC n) / &N % vec 1)) ++
3435 subpath (&(SUC n) / &N % vec 1) (&n / &N % vec 1) h ++
3436 linepath(h (&n / &N % vec 1),g (&n / &N % vec 1))`;
3437 `ball((p:real^1->complex) t,ee(p t))`] CAUCHY_THEOREM_PRIMITIVE) THEN
3438 ASM_SIMP_TAC[VALID_PATH_JOIN_EQ; PATHSTART_JOIN; PATHFINISH_JOIN;
3439 PATHSTART_SUBPATH; PATHFINISH_SUBPATH; PATH_IMAGE_JOIN; PATHSTART_LINEPATH;
3440 PATHFINISH_LINEPATH; VALID_PATH_LINEPATH; UNION_SUBSET] THEN
3441 ONCE_REWRITE_TAC[IMP_CONJ] THEN ANTS_TAC THENL
3442 [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
3443 REMOVE_THEN "*" (MP_TAC o SPEC `(p:real^1->complex) t`) THEN ANTS_TAC THENL
3444 [ASM_MESON_TAC[path_image; IN_IMAGE; SUBSET];
3445 ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN; CENTRE_IN_BALL]];
3447 MATCH_MP_TAC(TAUT `p /\ q /\ (p ==> r ==> s) ==> (p /\ q ==> r) ==> s`) THEN
3449 [CONJ_TAC THEN MATCH_MP_TAC VALID_PATH_SUBPATH THEN ASM_REWRITE_TAC[] THEN
3450 REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN
3451 ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
3452 REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC;
3455 [SUBGOAL_THEN `drop(&n / &N % vec 1) <= drop(&(SUC n) / &N % vec 1)`
3457 [ASM_SIMP_TAC[DROP_CMUL; DROP_VEC; REAL_MUL_RID; REAL_LE_DIV2_EQ;
3458 REAL_OF_NUM_LT; LE_1; REAL_OF_NUM_LE] THEN
3460 ASM_SIMP_TAC[PATH_IMAGE_SUBPATH; PATH_IMAGE_LINEPATH] THEN
3461 ONCE_REWRITE_TAC[GSYM REVERSEPATH_SUBPATH] THEN
3462 ASM_SIMP_TAC[PATH_IMAGE_SUBPATH; PATH_IMAGE_REVERSEPATH]] THEN
3464 `(p /\ r) /\ (p /\ r ==> q /\ s) ==> p /\ q /\ r /\ s`) THEN
3466 [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
3467 REWRITE_TAC[AND_FORALL_THM; TAUT
3468 `(p ==> q) /\ (p ==> r) <=> p ==> q /\ r`] THEN
3469 X_GEN_TAC `u:real^1` THEN REWRITE_TAC[IN_INTERVAL_1] THEN
3470 REWRITE_TAC[DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN STRIP_TAC THEN
3471 REWRITE_TAC[IN_BALL] THEN
3472 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
3473 `!e pu. dist(pt,pn) < ee / &3
3474 ==> dist(pn,pu) < e / &3 /\ e <= ee /\
3475 norm(gu - pu) < e / &3 /\ norm(hu - pu) < e / &3
3476 ==> dist(pt,gu) < ee /\ dist(pt,hu) < ee`)) THEN
3477 MAP_EVERY EXISTS_TAC [`e:real`; `(p:real^1->complex) u`] THEN
3479 SUBGOAL_THEN `(u:real^1) IN interval[vec 0,vec 1]` ASSUME_TAC THENL
3480 [REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN CONJ_TAC THENL
3481 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
3482 REAL_LE_TRANS)) THEN ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS];
3483 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
3484 REAL_LE_TRANS)) THEN
3485 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
3486 ASM_REWRITE_TAC[REAL_MUL_LID; REAL_OF_NUM_LE]];
3487 ASM_SIMP_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3488 ASM_REWRITE_TAC[] THEN
3489 REWRITE_TAC[DIST_REAL; GSYM drop; IN_INTERVAL_1;
3490 DROP_VEC; DROP_CMUL; REAL_MUL_RID] THEN
3491 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_POS; REAL_LE_DIV;
3492 REAL_OF_NUM_LT; LE_1; REAL_MUL_LID; REAL_OF_NUM_LE;
3493 ARITH_RULE `SUC n <= N ==> n <= N`] THEN
3494 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
3495 `u <= s ==> n <= u /\ s - n < d ==> abs(n - u) < d`)) THEN
3496 ASM_REWRITE_TAC[] THEN
3497 REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB] THEN
3498 SIMP_TAC[REAL_OF_NUM_SUB; ARITH_RULE `n <= SUC n`] THEN
3499 ASM_REWRITE_TAC[ARITH_RULE `SUC n - n = 1`; REAL_MUL_LID]];
3500 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [SUBSET] THEN
3501 REWRITE_TAC[FORALL_IN_IMAGE] THEN STRIP_TAC THEN
3502 REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN CONJ_TAC THEN
3503 MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
3504 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET] THEN
3505 CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3506 REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; REAL_NOT_LT] THEN
3507 REWRITE_TAC[DROP_VEC; DROP_CMUL; REAL_MUL_RID] THEN
3508 ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_POS; REAL_LE_DIV;
3509 REAL_OF_NUM_LT; LE_1; REAL_MUL_LID; REAL_OF_NUM_LE] THEN
3511 STRIP_TAC THEN DISCH_THEN(fun th ->
3512 MP_TAC(MATCH_MP PATH_INTEGRAL_UNIQUE th) THEN
3513 MP_TAC(MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE th)) THEN
3514 ASM_SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN_EQ; VALID_PATH_LINEPATH;
3515 PATHSTART_SUBPATH; PATHFINISH_SUBPATH; PATHSTART_JOIN; PATHFINISH_JOIN;
3516 PATHSTART_LINEPATH; PATHFINISH_LINEPATH; VALID_PATH_LINEPATH;
3517 PATH_INTEGRAL_JOIN] THEN
3518 STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o check(is_imp o concl)) THEN
3519 ASM_SIMP_TAC[ARITH_RULE `SUC n <= N ==> n <= N`] THEN
3520 MATCH_MP_TAC(COMPLEX_RING
3521 `hn - he = hn' /\ gn + gd = gn' /\ hgn = --ghn
3522 ==> hn - gn = ghn - gh0
3523 ==> gd + ghn' + he + hgn = Cx(&0)
3524 ==> hn' - gn' = ghn' - gh0`) THEN
3525 REPEAT CONJ_TAC THENL
3526 [ASM_SIMP_TAC[complex_sub; GSYM PATH_INTEGRAL_REVERSEPATH] THEN
3527 REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
3528 MATCH_MP_TAC PATH_INTEGRAL_SUBPATH_COMBINE;
3529 MATCH_MP_TAC PATH_INTEGRAL_SUBPATH_COMBINE;
3530 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV)
3531 [GSYM REVERSEPATH_LINEPATH] THEN
3532 MATCH_MP_TAC PATH_INTEGRAL_REVERSEPATH] THEN
3533 ASM_REWRITE_TAC[VALID_PATH_LINEPATH] THEN
3534 ASM_REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; DROP_VEC; REAL_MUL_RID] THEN
3535 ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1;
3536 REAL_MUL_LID; REAL_OF_NUM_LE] THEN
3537 ASM_SIMP_TAC[ARITH_RULE `SUC n <= N ==> n <= N`] THEN
3538 TRY(MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
3539 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN NO_TAC) THEN
3540 ASM_MESON_TAC[PATH_INTEGRABLE_REVERSEPATH; VALID_PATH_LINEPATH;
3541 REVERSEPATH_LINEPATH]]);;
3543 (* ------------------------------------------------------------------------- *)
3544 (* Hence we can treat even non-rectifiable paths as having a "length" *)
3545 (* for bounds on analytic functions in open sets. *)
3546 (* ------------------------------------------------------------------------- *)
3548 let VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION = prove
3549 (`!p:real^1->complex.
3550 vector_polynomial_function p ==> valid_path p`,
3551 REPEAT STRIP_TAC THEN REWRITE_TAC[valid_path] THEN
3552 MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
3553 MATCH_MP_TAC DIFFERENTIABLE_AT_IMP_DIFFERENTIABLE_ON THEN
3554 REWRITE_TAC[VECTOR_DERIVATIVE_WORKS] THEN
3555 REPEAT STRIP_TAC THEN REWRITE_TAC[vector_derivative] THEN
3556 CONV_TAC SELECT_CONV THEN
3557 ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION]);;
3559 let PATH_INTEGRAL_BOUND_EXISTS = prove
3560 (`!s g. open s /\ valid_path g /\ path_image g SUBSET s
3562 !f B. f holomorphic_on s /\ (!z. z IN s ==> norm(f z) <= B)
3563 ==> norm(path_integral g f) <= L * B`,
3564 REPEAT STRIP_TAC THEN
3565 MP_TAC(ISPECL [`s:complex->bool`; `g:real^1->complex`]
3566 PATH_INTEGRAL_NEARBY_ENDS) THEN
3567 ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
3568 DISCH_THEN(X_CHOOSE_THEN `d:real` (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
3569 DISCH_THEN(MP_TAC o SPEC `g:real^1->complex`) THEN
3570 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
3571 DISCH_THEN(STRIP_ASSUME_TAC o GSYM) THEN
3572 MP_TAC(ISPECL [`g:real^1->complex`; `d:real`]
3573 PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
3574 ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
3575 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3576 FIRST_X_ASSUM(MP_TAC o SPEC `p:real^1->complex`) THEN
3577 ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN STRIP_TAC THEN
3578 FIRST_ASSUM(X_CHOOSE_THEN `p':real^1->complex` STRIP_ASSUME_TAC o
3579 MATCH_MP HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION) THEN
3580 SUBGOAL_THEN `bounded(IMAGE (p':real^1->complex) (interval[vec 0,vec 1]))`
3582 [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
3583 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
3584 REWRITE_TAC[COMPACT_INTERVAL] THEN
3585 ASM_MESON_TAC[CONTINUOUS_VECTOR_POLYNOMIAL_FUNCTION;
3586 CONTINUOUS_AT_IMP_CONTINUOUS_ON];
3587 REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE]] THEN
3588 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `L:real` THEN STRIP_TAC THEN
3589 ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
3590 SUBGOAL_THEN `f path_integrable_on p /\ valid_path p` STRIP_ASSUME_TAC THENL
3591 [ASM_MESON_TAC[PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE;
3592 VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION];
3594 MP_TAC(ISPECL [`f:complex->complex`; `p:real^1->complex`]
3595 PATH_INTEGRAL_INTEGRAL) THEN ASM_REWRITE_TAC[] THEN
3596 DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
3597 `drop(integral (interval[vec 0,vec 1]) (\x:real^1. lift(L * B)))` THEN
3599 [MATCH_MP_TAC INTEGRAL_NORM_BOUND_INTEGRAL THEN
3600 ASM_REWRITE_TAC[INTEGRABLE_CONST; GSYM PATH_INTEGRABLE_ON] THEN
3601 X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
3602 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
3603 REWRITE_TAC[LIFT_DROP; COMPLEX_NORM_MUL] THEN
3604 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN
3606 [FIRST_X_ASSUM MATCH_MP_TAC THEN
3607 ASM_MESON_TAC[path_image; SUBSET; IN_IMAGE];
3608 ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_UNIQUE_AT]];
3609 REWRITE_TAC[INTEGRAL_CONST; CONTENT_UNIT_1; VECTOR_MUL_LID] THEN
3610 REWRITE_TAC[LIFT_DROP; REAL_LE_REFL]]);;
3612 (* ------------------------------------------------------------------------- *)
3613 (* Winding number. *)
3614 (* ------------------------------------------------------------------------- *)
3616 let winding_number = new_definition
3617 `winding_number(g,z) =
3619 ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3620 pathstart p = pathstart g /\
3621 pathfinish p = pathfinish g /\
3622 (!t. t IN interval[vec 0,vec 1] ==> norm(g t - p t) < e) /\
3623 path_integral p (\w. Cx(&1) / (w - z)) =
3624 Cx(&2) * Cx(pi) * ii * n`;;
3626 let CX_2PII_NZ = prove
3627 (`~(Cx(&2) * Cx(pi) * ii = Cx(&0))`,
3628 SIMP_TAC[COMPLEX_ENTIRE; CX_PI_NZ; II_NZ; CX_INJ; REAL_OF_NUM_EQ; ARITH]);;
3630 let PATH_INTEGRABLE_INVERSEDIFF = prove
3631 (`!g z. valid_path g /\ ~(z IN path_image g)
3632 ==> (\w. Cx(&1) / (w - z)) path_integrable_on g`,
3633 REPEAT STRIP_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
3634 EXISTS_TAC `(:complex) DELETE z` THEN
3635 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN; SET_RULE
3636 `s SUBSET (UNIV DELETE x) <=> ~(x IN s)`] THEN
3637 X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_UNIV; IN_DELETE] THEN
3639 W(MP_TAC o DISCH_ALL o COMPLEX_DIFF_CONV o snd o dest_exists o snd) THEN
3640 ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN MESON_TAC[]);;
3642 let WINDING_NUMBER = prove
3644 path g /\ ~(z IN path_image g) /\ &0 < e
3645 ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3646 pathstart p = pathstart g /\
3647 pathfinish p = pathfinish g /\
3648 (!t. t IN interval[vec 0,vec 1] ==> norm(g t - p t) < e) /\
3649 path_integral p (\w. Cx(&1) / (w - z)) =
3650 Cx(&2) * Cx(pi) * ii * winding_number(g,z)`,
3651 REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
3652 GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN DISCH_TAC THEN
3653 REWRITE_TAC[winding_number] THEN CONV_TAC SELECT_CONV THEN
3654 MP_TAC(ISPECL [`(:complex) DELETE z`; `g:real^1->complex`]
3655 PATH_INTEGRAL_NEARBY_ENDS) THEN
3656 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN
3657 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
3658 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
3659 MP_TAC(ISPECL [`g:real^1->complex`; `d / &2`]
3660 PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
3661 ASM_REWRITE_TAC[REAL_HALF] THEN
3662 DISCH_THEN(X_CHOOSE_THEN `h:real^1->complex` STRIP_ASSUME_TAC) THEN
3663 EXISTS_TAC `Cx(&1) / (Cx(&2) * Cx pi * ii) *
3664 path_integral h (\w. Cx(&1) / (w - z))` THEN
3665 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3666 MP_TAC(ISPECL [`g:real^1->complex`; `min d e / &2`]
3667 PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
3668 ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN
3669 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `p:real^1->complex` THEN
3671 ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION; CX_2PII_NZ; COMPLEX_FIELD
3672 `~(a * b * c = Cx(&0))
3673 ==> a * b * c * Cx(&1) / (a * b * c) * z = z`] THEN
3674 FIRST_X_ASSUM(MP_TAC o SPECL [`h:real^1->complex`; `p:real^1->complex`]) THEN
3676 [ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
3677 ASM_MESON_TAC[NORM_ARITH
3678 `norm(h - g) < d / &2 /\ norm(p - g) < min d e / &2
3679 ==> norm(h - g) < d /\ norm(p - g) < d`];
3681 REWRITE_TAC[SET_RULE `t SUBSET UNIV DELETE x <=> ~(x IN t)`] THEN
3682 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
3683 [ASM_MESON_TAC[NORM_SUB; REAL_ARITH `&0 < e /\ x < min d e / &2 ==> x < e`];
3685 FIRST_X_ASSUM MATCH_MP_TAC THEN
3686 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN] THEN
3687 REWRITE_TAC[IN_DELETE; IN_UNIV; GSYM complex_differentiable] THEN
3688 REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC THEN
3689 ASM_REWRITE_TAC[COMPLEX_SUB_0]);;
3691 let WINDING_NUMBER_UNIQUE = prove
3693 path g /\ ~(z IN path_image g) /\
3695 ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3696 pathstart p = pathstart g /\
3697 pathfinish p = pathfinish g /\
3698 (!t. t IN interval[vec 0,vec 1]
3699 ==> norm(g t - p t) < e) /\
3700 path_integral p (\w. Cx(&1) / (w - z)) =
3701 Cx(&2) * Cx(pi) * ii * n)
3702 ==> winding_number(g,z) = n`,
3703 REPEAT STRIP_TAC THEN
3704 MP_TAC(ISPECL [`(:complex) DELETE z`; `g:real^1->complex`]
3705 PATH_INTEGRAL_NEARBY_ENDS) THEN
3706 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN
3707 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
3708 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
3709 FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3710 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3711 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`] WINDING_NUMBER) THEN
3712 DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3713 DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
3714 FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `q:real^1->complex`]) THEN
3715 ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[NORM_SUB] THEN ASM_SIMP_TAC[] THEN
3716 STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `\w. Cx(&1) / (w - z)`) THEN
3718 [ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN] THEN
3719 REWRITE_TAC[IN_DELETE; IN_UNIV; GSYM complex_differentiable] THEN
3720 REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC THEN
3721 ASM_REWRITE_TAC[COMPLEX_SUB_0];
3722 ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN
3723 CONV_TAC COMPLEX_RING]);;
3725 let WINDING_NUMBER_UNIQUE_LOOP = prove
3727 path g /\ ~(z IN path_image g) /\ pathfinish g = pathstart g /\
3729 ==> ?p. valid_path p /\ ~(z IN path_image p) /\
3730 pathfinish p = pathstart p /\
3731 (!t. t IN interval[vec 0,vec 1]
3732 ==> norm(g t - p t) < e) /\
3733 path_integral p (\w. Cx(&1) / (w - z)) =
3734 Cx(&2) * Cx(pi) * ii * n)
3735 ==> winding_number(g,z) = n`,
3736 REPEAT STRIP_TAC THEN
3737 MP_TAC(ISPECL [`(:complex) DELETE z`; `g:real^1->complex`]
3738 PATH_INTEGRAL_NEARBY_LOOP) THEN
3739 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN
3740 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
3741 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
3742 FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3743 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3744 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`] WINDING_NUMBER) THEN
3745 DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
3746 DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
3747 FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `q:real^1->complex`]) THEN
3748 ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[NORM_SUB] THEN ASM_SIMP_TAC[] THEN
3749 STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `\w. Cx(&1) / (w - z)`) THEN
3751 [ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; HOLOMORPHIC_ON_OPEN] THEN
3752 REWRITE_TAC[IN_DELETE; IN_UNIV; GSYM complex_differentiable] THEN
3753 REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC THEN
3754 ASM_REWRITE_TAC[COMPLEX_SUB_0];
3755 ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN
3756 CONV_TAC COMPLEX_RING]);;
3758 let WINDING_NUMBER_VALID_PATH = prove
3759 (`!g z. valid_path g /\ ~(z IN path_image g)
3760 ==> winding_number(g,z) =
3761 Cx(&1) / (Cx(&2) * Cx(pi) * ii) *
3762 path_integral g (\w. Cx(&1) / (w - z))`,
3763 REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
3764 ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
3765 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3766 EXISTS_TAC `g:real^1->complex` THEN
3767 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
3768 MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_FIELD);;
3770 let HAS_PATH_INTEGRAL_WINDING_NUMBER = prove
3771 (`!g z. valid_path g /\ ~(z IN path_image g)
3772 ==> ((\w. Cx(&1) / (w - z)) has_path_integral
3773 (Cx(&2) * Cx(pi) * ii * winding_number(g,z))) g`,
3774 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH] THEN
3775 ASM_SIMP_TAC[CX_2PII_NZ; COMPLEX_FIELD
3776 `~(a * b * c = Cx(&0))
3777 ==> a * b * c * Cx(&1) / (a * b * c) * z = z`] THEN
3778 MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
3779 ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF]);;
3781 let WINDING_NUMBER_TRIVIAL = prove
3782 (`!a z. ~(z = a) ==> winding_number(linepath(a,a),z) = Cx(&0)`,
3783 SIMP_TAC[VALID_PATH_LINEPATH; PATH_INTEGRAL_TRIVIAL; COMPLEX_MUL_RZERO;
3784 WINDING_NUMBER_VALID_PATH; PATH_IMAGE_LINEPATH; SEGMENT_REFL;
3787 let WINDING_NUMBER_JOIN = prove
3789 path g1 /\ path g2 /\ pathfinish g1 = pathstart g2 /\
3790 ~(z IN path_image g1) /\ ~(z IN path_image g2)
3791 ==> winding_number(g1 ++ g2,z) =
3792 winding_number(g1,z) + winding_number(g2,z)`,
3793 REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
3794 ASM_SIMP_TAC[PATH_JOIN; PATH_IMAGE_JOIN; IN_UNION] THEN
3795 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3796 MP_TAC(ISPECL [`g2:real^1->complex`; `z:complex`; `e:real`]
3797 WINDING_NUMBER) THEN
3798 MP_TAC(ISPECL [`g1:real^1->complex`; `z:complex`; `e:real`]
3799 WINDING_NUMBER) THEN
3800 ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
3801 X_GEN_TAC `p1:real^1->complex` THEN STRIP_TAC THEN
3802 X_GEN_TAC `p2:real^1->complex` THEN STRIP_TAC THEN
3803 EXISTS_TAC `p1 ++ p2:real^1->complex` THEN
3804 ASM_SIMP_TAC[VALID_PATH_JOIN; PATHSTART_JOIN; PATHFINISH_JOIN] THEN
3805 ASM_SIMP_TAC[PATH_IMAGE_JOIN; IN_UNION] THEN CONJ_TAC THENL
3806 [REWRITE_TAC[joinpaths; IN_INTERVAL_1; DROP_VEC] THEN REPEAT STRIP_TAC THEN
3807 COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
3808 FIRST_X_ASSUM MATCH_MP_TAC THEN
3809 ASM_REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; DROP_CMUL; DROP_SUB] THEN
3811 W(MP_TAC o PART_MATCH (lhs o rand) PATH_INTEGRAL_JOIN o lhand o snd) THEN
3812 ASM_REWRITE_TAC[COMPLEX_ADD_LDISTRIB] THEN
3813 DISCH_THEN MATCH_MP_TAC THEN
3814 CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_INVERSEDIFF THEN
3815 ASM_REWRITE_TAC[]]);;
3817 let WINDING_NUMBER_REVERSEPATH = prove
3818 (`!g z. path g /\ ~(z IN path_image g)
3819 ==> winding_number(reversepath g,z) = --(winding_number(g,z))`,
3820 REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
3821 ASM_SIMP_TAC[PATH_REVERSEPATH; PATH_IMAGE_REVERSEPATH] THEN
3822 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3823 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `e:real`]
3824 WINDING_NUMBER) THEN
3825 ASM_REWRITE_TAC[] THEN
3826 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3827 EXISTS_TAC `reversepath p:real^1->complex` THEN
3828 ASM_SIMP_TAC[VALID_PATH_REVERSEPATH; PATH_IMAGE_REVERSEPATH;
3829 PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
3830 PATH_INTEGRAL_REVERSEPATH; PATH_INTEGRABLE_INVERSEDIFF] THEN
3831 REWRITE_TAC[COMPLEX_MUL_RNEG; reversepath; IN_INTERVAL_1; DROP_VEC] THEN
3832 REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
3833 REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; DROP_SUB] THEN ASM_REAL_ARITH_TAC);;
3835 let WINDING_NUMBER_SHIFTPATH = prove
3836 (`!g a z. path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g) /\
3837 a IN interval[vec 0,vec 1]
3838 ==> winding_number(shiftpath a g,z) = winding_number(g,z)`,
3839 REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_UNIQUE_LOOP THEN
3840 ASM_SIMP_TAC[PATH_SHIFTPATH; PATH_IMAGE_SHIFTPATH] THEN CONJ_TAC THENL
3841 [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL_1; DROP_VEC]) THEN
3842 ASM_SIMP_TAC[PATHSTART_SHIFTPATH; PATHFINISH_SHIFTPATH];
3844 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3845 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `e:real`]
3846 WINDING_NUMBER) THEN ASM_REWRITE_TAC[] THEN
3847 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
3848 EXISTS_TAC `shiftpath a p:real^1->complex` THEN
3849 ASM_SIMP_TAC[VALID_PATH_SHIFTPATH; PATH_IMAGE_SHIFTPATH;
3850 PATH_INTEGRAL_SHIFTPATH; PATH_INTEGRABLE_INVERSEDIFF] THEN
3851 RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL_1; DROP_VEC]) THEN
3852 ASM_SIMP_TAC[PATHSTART_SHIFTPATH; PATHFINISH_SHIFTPATH] THEN
3853 SIMP_TAC[COMPLEX_MUL_RNEG; shiftpath; IN_INTERVAL_1; DROP_ADD; DROP_VEC] THEN
3854 REPEAT STRIP_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
3855 FIRST_X_ASSUM MATCH_MP_TAC THEN
3856 REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; DROP_SUB; DROP_ADD] THEN
3857 ASM_REAL_ARITH_TAC);;
3859 let WINDING_NUMBER_SPLIT_LINEPATH = prove
3861 c IN segment[a,b] /\ ~(z IN segment[a,b])
3862 ==> winding_number(linepath(a,b),z) =
3863 winding_number(linepath(a,c),z) +
3864 winding_number(linepath(c,b),z)`,
3865 REPEAT STRIP_TAC THEN
3866 SUBGOAL_THEN `~((z:complex) IN segment[a,c]) /\ ~(z IN segment[c,b])`
3867 STRIP_ASSUME_TAC THENL
3868 [CONJ_TAC THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
3869 `~(z IN s) ==> t SUBSET s ==> ~(z IN t)`)) THEN
3870 ASM_REWRITE_TAC[SUBSET_SEGMENT; ENDS_IN_SEGMENT];
3871 ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; PATH_IMAGE_LINEPATH;
3872 VALID_PATH_LINEPATH] THEN
3873 REWRITE_TAC[GSYM COMPLEX_ADD_LDISTRIB] THEN AP_TERM_TAC THEN
3874 MATCH_MP_TAC PATH_INTEGRAL_SPLIT_LINEPATH THEN
3875 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN
3876 SIMP_TAC[CONTINUOUS_ON_CONST; CONTINUOUS_ON_SUB; CONTINUOUS_ON_ID] THEN
3877 ASM_MESON_TAC[COMPLEX_SUB_0]]);;
3879 let WINDING_NUMBER_EQUAL = prove
3880 (`!p q z. (!t. t IN interval[vec 0,vec 1] ==> p t = q t)
3881 ==> winding_number(p,z) = winding_number(q,z)`,
3882 REPEAT STRIP_TAC THEN SIMP_TAC[winding_number; PATH_INTEGRAL_INTEGRAL] THEN
3883 AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3884 X_GEN_TAC `W:complex` THEN REWRITE_TAC[] THEN
3885 AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3886 X_GEN_TAC `e:real` THEN REWRITE_TAC[] THEN
3887 ASM_CASES_TAC `&0 < e` THEN ASM_REWRITE_TAC[] THEN
3888 AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3889 X_GEN_TAC `g:real^1->complex` THEN
3890 ASM_SIMP_TAC[pathstart; pathfinish; ENDS_IN_UNIT_INTERVAL]);;
3892 let WINDING_NUMBER_OFFSET = prove
3893 (`!p z. winding_number(p,z) = winding_number((\w. p w - z),Cx(&0))`,
3894 REPEAT GEN_TAC THEN REWRITE_TAC[winding_number; PATH_INTEGRAL_INTEGRAL] THEN
3895 AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3896 X_GEN_TAC `W:complex` THEN REWRITE_TAC[] THEN
3897 AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
3898 X_GEN_TAC `e:real` THEN REWRITE_TAC[] THEN
3899 ASM_CASES_TAC `&0 < e` THEN
3900 ASM_REWRITE_TAC[path_image; valid_path; pathstart; pathfinish] THEN
3902 DISCH_THEN(X_CHOOSE_THEN `g:real^1->complex` STRIP_ASSUME_TAC) THENL
3903 [EXISTS_TAC `\t. (g:real^1->complex) t - z`;
3904 EXISTS_TAC `\t. (g:real^1->complex) t + z`] THEN
3905 ASM_REWRITE_TAC[COMPLEX_RING `(p - z) - (g - z):complex = p - g`;
3906 COMPLEX_RING `p - (g + z):complex = p - z - g`;
3907 COMPLEX_RING `(p - z) + z:complex = p`;
3908 COMPLEX_SUB_RZERO] THEN
3909 RULE_ASSUM_TAC(REWRITE_RULE[IN_IMAGE]) THEN
3910 ASM_SIMP_TAC[PIECEWISE_DIFFERENTIABLE_ADD; PIECEWISE_DIFFERENTIABLE_SUB;
3911 DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE;
3912 DIFFERENTIABLE_ON_CONST; IN_IMAGE] THEN
3913 ASM_REWRITE_TAC[COMPLEX_RING `Cx(&0) = w - z <=> z = w`;
3914 COMPLEX_RING `z = w + z <=> Cx(&0) = w`] THEN
3915 FIRST_X_ASSUM(fun th -> GEN_REWRITE_TAC RAND_CONV [SYM th]) THEN
3916 MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
3917 REWRITE_TAC[COMPLEX_RING `(w + z) - z = w - Cx(&0)`] THEN AP_TERM_TAC THEN
3918 REWRITE_TAC[vector_derivative; has_vector_derivative; HAS_DERIVATIVE_AT;
3919 COMPLEX_RING `(x - z) - (w - z):complex = x - w`;
3920 COMPLEX_RING `(x + z) - (w + z):complex = x - w`]);;
3922 (* ------------------------------------------------------------------------- *)
3923 (* A combined theorem deducing several things piecewise. *)
3924 (* ------------------------------------------------------------------------- *)
3926 let WINDING_NUMBER_JOIN_POS_COMBINED = prove
3929 ~(z IN path_image g1) /\
3930 &0 < Re(winding_number(g1,z))) /\
3932 ~(z IN path_image g2) /\
3933 &0 < Re(winding_number(g2,z))) /\
3934 pathfinish g1 = pathstart g2
3935 ==> valid_path(g1 ++ g2) /\
3936 ~(z IN path_image(g1 ++ g2)) /\
3937 &0 < Re(winding_number(g1 ++ g2,z))`,
3938 REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_SIMP_TAC[VALID_PATH_JOIN] THEN
3939 ASM_SIMP_TAC[PATH_IMAGE_JOIN; VALID_PATH_IMP_PATH; IN_UNION] THEN
3940 ASM_SIMP_TAC[WINDING_NUMBER_JOIN; VALID_PATH_IMP_PATH; RE_ADD] THEN
3941 ASM_REAL_ARITH_TAC);;
3943 (* ------------------------------------------------------------------------- *)
3944 (* Useful sufficient conditions for the winding number to be positive etc. *)
3945 (* ------------------------------------------------------------------------- *)
3947 let RE_WINDING_NUMBER = prove
3948 (`!g z. valid_path g /\ ~(z IN path_image g)
3949 ==> Re(winding_number(g,z)) =
3950 Im(path_integral g (\w. Cx(&1) / (w - z))) / (&2 * pi)`,
3951 SIMP_TAC[WINDING_NUMBER_VALID_PATH; complex_div; COMPLEX_MUL_LID] THEN
3952 REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM CX_MUL] THEN
3953 REWRITE_TAC[COMPLEX_INV_MUL; GSYM CX_INV; COMPLEX_INV_II] THEN
3954 REWRITE_TAC[COMPLEX_MUL_LNEG; COMPLEX_MUL_RNEG; RE_NEG] THEN
3955 REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; RE_MUL_CX; RE_MUL_II] THEN
3956 MP_TAC PI_POS THEN CONV_TAC REAL_FIELD);;
3958 let WINDING_NUMBER_POS_LE = prove
3959 (`!g z. valid_path g /\ ~(z IN path_image g) /\
3960 (!x. x IN interval(vec 0,vec 1)
3961 ==> &0 <= Im(vector_derivative g (at x) * cnj(g x - z)))
3962 ==> &0 <= Re(winding_number(g,z))`,
3963 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[RE_WINDING_NUMBER] THEN
3964 MATCH_MP_TAC REAL_LE_DIV THEN
3965 SIMP_TAC[REAL_LE_MUL; REAL_POS; PI_POS; REAL_LT_IMP_LE; IM_DEF] THEN
3966 MATCH_MP_TAC(INST_TYPE [`:1`,`:M`; `:2`,`:N`]
3967 HAS_INTEGRAL_COMPONENT_POS) THEN
3968 MAP_EVERY EXISTS_TAC
3969 [`\x:real^1. if x IN interval(vec 0,vec 1)
3970 then Cx(&1) / (g x - z) * vector_derivative g (at x)
3972 `interval[vec 0:real^1,vec 1]`] THEN
3973 REWRITE_TAC[ARITH; DIMINDEX_2] THEN CONJ_TAC THENL
3974 [MATCH_MP_TAC HAS_INTEGRAL_SPIKE_INTERIOR THEN
3975 EXISTS_TAC `\x:real^1. Cx(&1) / (g x - z) * vector_derivative g (at x)` THEN
3976 ASM_SIMP_TAC[] THEN REWRITE_TAC[GSYM HAS_PATH_INTEGRAL] THEN
3977 MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
3978 ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF];
3980 X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN COND_CASES_TAC THEN
3981 ASM_REWRITE_TAC[GSYM IM_DEF; IM_CX; REAL_LE_REFL] THEN
3982 FIRST_X_ASSUM(MP_TAC o SPEC `x:real^1`) THEN
3983 ASM_REWRITE_TAC[complex_div; COMPLEX_MUL_LID] THEN
3984 REWRITE_TAC[complex_inv; complex_inv; complex_mul; RE; IM; cnj] THEN
3985 REWRITE_TAC[real_div; REAL_RING
3986 `(a * x) * b + (--c * x) * d:real = x * (a * b - c * d)`] THEN
3987 REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN
3988 SIMP_TAC[REAL_POW_2; REAL_LE_INV_EQ; REAL_LE_ADD; REAL_LE_SQUARE] THEN
3989 ASM_REAL_ARITH_TAC);;
3991 let WINDING_NUMBER_POS_LT_LEMMA = prove
3992 (`!g z e. valid_path g /\ ~(z IN path_image g) /\ &0 < e /\
3993 (!x. x IN interval(vec 0,vec 1)
3994 ==> e <= Im(vector_derivative g (at x) / (g x - z)))
3995 ==> &0 < Re(winding_number(g,z))`,
3996 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[RE_WINDING_NUMBER] THEN
3997 MATCH_MP_TAC REAL_LT_DIV THEN
3998 SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; ARITH; PI_POS] THEN
3999 MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `Im(ii * Cx e)` THEN
4001 [ASM_REWRITE_TAC[COMPLEX_MUL_LNEG; IM_MUL_II; IM_NEG; RE_CX]; ALL_TAC] THEN
4002 REWRITE_TAC[IM_DEF] THEN
4003 MATCH_MP_TAC(ISPECL [`\x:real^1. ii * Cx e`;
4004 `\x:real^1. if x IN interval(vec 0,vec 1)
4005 then Cx(&1) / (g x - z) * vector_derivative g (at x)
4007 `interval[vec 0:real^1,vec 1]`; `ii * Cx e`;
4008 `path_integral g (\w. Cx(&1) / (w - z))`; `2`]
4009 HAS_INTEGRAL_COMPONENT_LE) THEN
4010 REWRITE_TAC[DIMINDEX_2; ARITH] THEN REPEAT CONJ_TAC THENL
4011 [GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_MUL_LID] THEN
4012 ONCE_REWRITE_TAC[GSYM CONTENT_UNIT_1] THEN
4013 REWRITE_TAC[HAS_INTEGRAL_CONST];
4014 MATCH_MP_TAC HAS_INTEGRAL_SPIKE_INTERIOR THEN
4015 EXISTS_TAC `\x:real^1. Cx(&1) / (g x - z) * vector_derivative g (at x)` THEN
4016 ASM_SIMP_TAC[] THEN REWRITE_TAC[GSYM HAS_PATH_INTEGRAL] THEN
4017 MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
4018 ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF];
4019 X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN COND_CASES_TAC THEN
4020 ASM_REWRITE_TAC[GSYM IM_DEF; IM_CX; REAL_LE_REFL] THEN
4021 REWRITE_TAC[IM_MUL_II; RE_CX] THEN
4022 FIRST_X_ASSUM(MP_TAC o SPEC `x:real^1`) THEN
4023 ASM_REWRITE_TAC[complex_div; COMPLEX_MUL_LID; COMPLEX_MUL_SYM]]);;
4025 let WINDING_NUMBER_POS_LT = prove
4026 (`!g z e. valid_path g /\ ~(z IN path_image g) /\ &0 < e /\
4027 (!x. x IN interval(vec 0,vec 1)
4028 ==> e <= Im(vector_derivative g (at x) * cnj(g x - z)))
4029 ==> &0 < Re(winding_number(g,z))`,
4030 REPEAT STRIP_TAC THEN
4031 SUBGOAL_THEN `bounded (IMAGE (\w. w - z) (path_image g))` MP_TAC THENL
4032 [REWRITE_TAC[path_image; GSYM IMAGE_o] THEN
4033 MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
4034 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
4035 REWRITE_TAC[COMPACT_INTERVAL] THEN
4036 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
4037 SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
4038 MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON THEN
4039 ASM_REWRITE_TAC[GSYM valid_path];
4041 REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
4042 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
4043 MATCH_MP_TAC WINDING_NUMBER_POS_LT_LEMMA THEN
4044 EXISTS_TAC `e:real / B pow 2` THEN
4045 ASM_SIMP_TAC[REAL_LT_DIV; REAL_POW_LT] THEN
4046 X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
4047 ONCE_REWRITE_TAC[COMPLEX_DIV_CNJ] THEN
4048 REWRITE_TAC[real_div; complex_div; GSYM CX_INV; GSYM CX_POW] THEN
4049 REWRITE_TAC[IM_MUL_CX] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
4050 ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LE_INV_EQ; REAL_POW_LE] THEN
4051 MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL
4052 [MATCH_MP_TAC REAL_POW_LT THEN REWRITE_TAC[NORM_POS_LT; VECTOR_SUB_EQ] THEN
4053 UNDISCH_TAC `~((z:complex) IN path_image g)`;
4054 MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[NORM_POS_LE] THEN
4055 FIRST_X_ASSUM MATCH_MP_TAC] THEN
4056 REWRITE_TAC[path_image; IN_IMAGE] THEN
4057 ASM_MESON_TAC[SUBSET; INTERVAL_OPEN_SUBSET_CLOSED]);;
4059 (* ------------------------------------------------------------------------- *)
4060 (* The winding number is an integer (proof from Ahlfors's book). *)
4061 (* ------------------------------------------------------------------------- *)
4063 let WINDING_NUMBER_AHLFORS_LEMMA = prove
4065 g piecewise_differentiable_on interval [a,b] /\
4066 drop a <= drop b /\ (!x. x IN interval [a,b] ==> ~(g x = z))
4067 ==> (\x. vector_derivative g (at x within interval[a,b]) / (g(x) - z))
4068 integrable_on interval[a,b] /\
4069 cexp(--(integral (interval[a,b])
4070 (\x. vector_derivative g (at x within interval[a,b]) /
4072 (g(b) - z) = g(a) - z`,
4075 (g has_vector_derivative g') (at x within s) /\
4076 (f has_vector_derivative (g' / (g x - z))) (at x within s) /\
4078 ==> ((\x. cexp(--f x) * (g x - z)) has_vector_derivative Cx(&0))
4080 REPEAT STRIP_TAC THEN
4082 `cexp(--f x) * (g' - Cx(&0)) +
4083 (cexp(--f x) * --(g' / ((g:real^1->complex) x - z))) * (g x - z) = Cx(&0)`
4086 [FIRST_X_ASSUM(MP_TAC o check (is_neg o concl)) THEN
4087 CONV_TAC COMPLEX_FIELD;
4089 MATCH_MP_TAC(ISPEC `( * ):complex->complex->complex`
4090 HAS_VECTOR_DERIVATIVE_BILINEAR_WITHIN) THEN
4091 REWRITE_TAC[BILINEAR_COMPLEX_MUL; GSYM COMPLEX_VEC_0] THEN
4092 ASM_SIMP_TAC[HAS_VECTOR_DERIVATIVE_SUB; ETA_AX;
4093 HAS_VECTOR_DERIVATIVE_CONST] THEN
4094 GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
4095 REWRITE_TAC[has_vector_derivative] THEN
4096 SUBGOAL_THEN `!x y. (\z. drop z % (x * y :complex)) =
4097 (\w. x * w) o (\z. drop z % y)`
4098 (fun th -> REWRITE_TAC[th])
4100 [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4101 SIMPLE_COMPLEX_ARITH_TAC;
4103 MATCH_MP_TAC DIFF_CHAIN_WITHIN THEN
4104 REWRITE_TAC[GSYM has_complex_derivative; GSYM has_vector_derivative] THEN
4105 SIMP_TAC[HAS_COMPLEX_DERIVATIVE_CEXP; HAS_COMPLEX_DERIVATIVE_AT_WITHIN] THEN
4106 ASM_SIMP_TAC[HAS_VECTOR_DERIVATIVE_NEG]) in
4107 REPEAT GEN_TAC THEN STRIP_TAC THEN
4110 ==> ?h. !y. norm(y - w) < norm(w - z)
4111 ==> (h has_complex_derivative inv(y - z)) (at y)`
4114 [REPEAT STRIP_TAC THEN
4115 MP_TAC(ISPECL [`\w:complex. inv(w - z)`;
4116 `ball(w:complex,norm(w - z))`;
4118 HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
4119 SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL; INTERIOR_OPEN] THEN
4120 REWRITE_TAC[CONVEX_BALL; FINITE_RULES; DIFF_EMPTY] THEN ANTS_TAC THENL
4121 [SUBGOAL_THEN `(\w. inv(w - z)) holomorphic_on ball(w:complex,norm(w - z))`
4123 MESON_TAC[HOLOMORPHIC_ON_OPEN; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
4124 OPEN_BALL; complex_differentiable; th]) THEN
4125 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; IN_BALL] THEN
4126 X_GEN_TAC `u:complex` THEN DISCH_TAC THEN
4127 EXISTS_TAC `--Cx(&1) / (u - z) pow 2` THEN COMPLEX_DIFF_TAC THEN
4128 REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_SUB_0] THEN
4129 ASM_MESON_TAC[REAL_LT_REFL; dist];
4131 REWRITE_TAC[IN_BALL; dist] THEN MESON_TAC[NORM_SUB];
4134 `!t. t IN interval[a,b]
4135 ==> (\x. vector_derivative g (at x within interval[a,b]) / (g(x) - z))
4136 integrable_on interval[a,t] /\
4137 cexp(--(integral (interval[a,t])
4138 (\x. vector_derivative g (at x within interval[a,b]) /
4140 (g(t) - z) = g(a) - z`
4141 (fun th -> MATCH_MP_TAC th THEN
4142 ASM_REWRITE_TAC[IN_INTERVAL_1; REAL_LE_REFL]) THEN
4143 REWRITE_TAC[TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
4144 REWRITE_TAC[FORALL_AND_THM] THEN
4145 MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
4146 [REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
4147 MAP_EVERY EXISTS_TAC [`a:real^1`; `b:real^1`] THEN
4148 ASM_REWRITE_TAC[SUBSET_INTERVAL_1; REAL_LE_REFL] THEN
4149 CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[IN_INTERVAL_1]] THEN
4150 REWRITE_TAC[integrable_on; complex_div] THEN
4151 ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
4152 REWRITE_TAC[HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
4153 REWRITE_TAC[GSYM integrable_on] THEN
4154 MATCH_MP_TAC PATH_INTEGRAL_LOCAL_PRIMITIVE_ANY THEN
4155 EXISTS_TAC `(:complex) DELETE z` THEN
4156 ASM_SIMP_TAC[IN_DELETE; IN_UNIV;
4157 DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE] THEN
4158 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
4159 EXISTS_TAC `norm(w - z:complex)` THEN
4160 ASM_REWRITE_TAC[COMPLEX_NORM_NZ; COMPLEX_SUB_0] THEN
4161 ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
4163 DISCH_TAC THEN MATCH_MP_TAC HAS_DERIVATIVE_ZERO_UNIQUE_STRONG_INTERVAL THEN
4164 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [piecewise_differentiable_on]) THEN
4165 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
4166 MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[IN_DIFF; FINITE_IMP_COUNTABLE] THEN
4167 X_GEN_TAC `k:real^1->bool` THEN STRIP_TAC THEN
4168 ASM_SIMP_TAC[CONVEX_INTERVAL; INTEGRAL_REFL] THEN
4169 REWRITE_TAC[COMPLEX_VEC_0; COMPLEX_NEG_0; CEXP_0; COMPLEX_MUL_LID] THEN
4171 [MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
4172 ASM_SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; ETA_AX;
4173 PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON] THEN
4174 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
4175 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
4176 REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
4177 MATCH_MP_TAC CONTINUOUS_ON_NEG THEN
4178 MATCH_MP_TAC INDEFINITE_INTEGRAL_CONTINUOUS_RIGHT THEN
4179 FIRST_X_ASSUM MATCH_MP_TAC THEN
4180 ASM_REWRITE_TAC[IN_INTERVAL_1; REAL_LE_REFL];
4182 X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
4183 MP_TAC(ISPECL [`\w:complex. inv(w - z)`;
4184 `ball((g:real^1->complex) t,dist(g t,z))`;
4186 HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
4187 SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL; INTERIOR_OPEN] THEN
4188 REWRITE_TAC[CONVEX_BALL; FINITE_RULES; DIFF_EMPTY] THEN ANTS_TAC THENL
4189 [SUBGOAL_THEN `(\w. inv(w - z)) holomorphic_on ball(g(t:real^1),dist(g t,z))`
4191 MESON_TAC[HOLOMORPHIC_ON_OPEN; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
4192 OPEN_BALL; complex_differentiable; th]) THEN
4193 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; IN_BALL] THEN
4194 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
4195 EXISTS_TAC `--Cx(&1) / (w - z) pow 2` THEN COMPLEX_DIFF_TAC THEN
4196 REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_SUB_0] THEN
4197 ASM_MESON_TAC[REAL_LT_REFL];
4199 REWRITE_TAC[IN_BALL; dist] THEN
4200 DISCH_THEN(X_CHOOSE_TAC `h:complex->complex`) THEN
4201 SUBGOAL_THEN `(\h. Cx(&0)) = (\h. drop h % Cx(&0))` SUBST1_TAC THENL
4202 [REWRITE_TAC[FUN_EQ_THM; GSYM COMPLEX_VEC_0; VECTOR_MUL_RZERO];
4204 REWRITE_TAC[GSYM has_vector_derivative] THEN MATCH_MP_TAC lemma THEN
4205 EXISTS_TAC `vector_derivative g (at t within interval[a,b]):complex` THEN
4206 REPEAT CONJ_TAC THENL
4207 [REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
4208 ASM_MESON_TAC[DIFFERENTIABLE_AT_WITHIN];
4210 ASM_MESON_TAC[]] THEN
4211 REWRITE_TAC[has_vector_derivative] THEN
4212 MATCH_MP_TAC HAS_DERIVATIVE_TRANSFORM_WITHIN THEN
4213 ASM_REWRITE_TAC[GSYM has_vector_derivative] THEN
4214 EXISTS_TAC `\u. integral (interval [a,t])
4215 (\x. vector_derivative g (at x within interval [a,b]) /
4216 ((g:real^1->complex) x - z)) + (h(g(u)) - h(g(t)))` THEN
4217 REWRITE_TAC[LEFT_EXISTS_AND_THM; CONJ_ASSOC] THEN
4218 REWRITE_TAC[GSYM CONJ_ASSOC] THEN CONJ_TAC THENL
4220 ONCE_REWRITE_TAC[COMPLEX_RING `a + (b - c) = b + (a - c):complex`] THEN
4221 GEN_REWRITE_TAC LAND_CONV [GSYM VECTOR_ADD_RID] THEN
4222 MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_ADD THEN
4223 REWRITE_TAC[HAS_VECTOR_DERIVATIVE_CONST] THEN
4224 REWRITE_TAC[has_vector_derivative] THEN
4225 SUBGOAL_THEN `!x y. (\h. drop h % x / y) =
4226 (\x. inv(y) * x) o (\h. drop h % x)`
4227 (fun th -> REWRITE_TAC[th])
4229 [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4230 SIMPLE_COMPLEX_ARITH_TAC;
4232 GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
4233 MATCH_MP_TAC DIFF_CHAIN_WITHIN THEN
4234 REWRITE_TAC[GSYM has_complex_derivative; GSYM has_vector_derivative] THEN
4235 REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
4236 CONJ_TAC THENL [ASM_MESON_TAC[DIFFERENTIABLE_AT_WITHIN]; ALL_TAC] THEN
4237 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
4238 FIRST_X_ASSUM MATCH_MP_TAC THEN
4239 REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; COMPLEX_NORM_NZ] THEN
4240 ASM_SIMP_TAC[COMPLEX_SUB_0]] THEN
4243 !y:real^1. y IN interval[a,b] /\ dist(y,t) < d
4244 ==> dist(g y:complex,g t) < norm(g t - z) /\ ~(y IN k)`
4246 [SUBGOAL_THEN `(g:real^1->complex) continuous (at t within interval[a,b])`
4248 [ASM_MESON_TAC[PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON;
4249 CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN];
4251 REWRITE_TAC[continuous_within] THEN
4252 DISCH_THEN(MP_TAC o SPEC `norm((g:real^1->complex) t - z)`) THEN
4253 ASM_SIMP_TAC[COMPLEX_NORM_NZ; COMPLEX_SUB_0] THEN
4254 DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
4255 FIRST_X_ASSUM(X_CHOOSE_THEN `d2:real` STRIP_ASSUME_TAC o
4256 SPEC `t:real^1` o MATCH_MP FINITE_SET_AVOID) THEN
4257 EXISTS_TAC `min d1 d2` THEN ASM_SIMP_TAC[REAL_LT_MIN] THEN
4258 ASM_MESON_TAC[DIST_SYM; REAL_NOT_LE];
4260 REWRITE_TAC[TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
4261 REWRITE_TAC[FORALL_AND_THM] THEN
4262 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN STRIP_TAC THEN
4263 ASM_REWRITE_TAC[] THEN X_GEN_TAC `u:real^1` THEN REWRITE_TAC[dist] THEN
4265 DISJ_CASES_TAC(REAL_ARITH `drop t <= drop u \/ drop u <= drop t`) THENL
4267 `integral (interval [a,u])
4268 (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) =
4269 integral (interval [a,t])
4270 (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) +
4271 integral (interval [t,u])
4272 (\x. vector_derivative g (at x within interval [a,b]) / (g x - z))`
4274 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE THEN
4275 ASM_MESON_TAC[IN_INTERVAL_1];
4277 SIMP_TAC[COMPLEX_RING `a + x = a + y <=> y:complex = x`];
4279 `integral (interval [a,t])
4280 (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) =
4281 integral (interval [a,u])
4282 (\x. vector_derivative g (at x within interval [a,b]) / (g x - z)) +
4283 integral (interval [u,t])
4284 (\x. vector_derivative g (at x within interval [a,b]) / (g x - z))`
4286 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE THEN
4287 ASM_MESON_TAC[IN_INTERVAL_1];
4289 SIMP_TAC[COMPLEX_RING `(a + x) + (w - z) = a <=> x:complex = z - w`]] THEN
4290 (MATCH_MP_TAC INTEGRAL_UNIQUE THEN
4291 MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS THEN
4292 ASM_REWRITE_TAC[GSYM o_DEF] THEN X_GEN_TAC `x:real^1` THEN
4293 REPEAT STRIP_TAC THEN REWRITE_TAC[has_vector_derivative; COMPLEX_CMUL] THEN
4294 SUBGOAL_THEN `!x y. (\h. Cx(drop h) * x / y) =
4295 (\x. inv(y) * x) o (\h. drop h % x)`
4296 (fun th -> REWRITE_TAC[th])
4298 [REWRITE_TAC[FUN_EQ_THM; o_THM; COMPLEX_CMUL] THEN
4299 SIMPLE_COMPLEX_ARITH_TAC;
4301 MATCH_MP_TAC DIFF_CHAIN_WITHIN THEN
4302 REWRITE_TAC[GSYM has_complex_derivative; GSYM has_vector_derivative] THEN
4304 [MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_WITHIN_SUBSET THEN
4305 EXISTS_TAC `interval[a:real^1,b]` THEN
4306 REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN CONJ_TAC THENL
4307 [MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
4308 FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL
4309 [ALL_TAC; FIRST_X_ASSUM MATCH_MP_TAC];
4311 REPEAT(FIRST_X_ASSUM(MP_TAC o
4312 check (fun t -> not(is_forall (concl t))))) THEN
4313 REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB] THEN
4314 REWRITE_TAC[SUBSET_INTERVAL_1; IN_INTERVAL_1; REAL_LE_REFL] THEN
4317 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
4318 FIRST_X_ASSUM MATCH_MP_TAC THEN GEN_REWRITE_TAC LAND_CONV [GSYM dist] THEN
4319 ONCE_REWRITE_TAC[DIST_SYM] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
4320 CONJ_TAC THENL [ASM_MESON_TAC[IN_INTERVAL_1; REAL_LE_TRANS]; ALL_TAC] THEN
4321 REPEAT(FIRST_X_ASSUM(MP_TAC o
4322 check (fun t -> not(is_forall (concl t))))) THEN
4323 REWRITE_TAC[dist; NORM_REAL; GSYM drop; DROP_SUB] THEN
4324 REWRITE_TAC[SUBSET_INTERVAL_1; IN_INTERVAL_1; REAL_LE_REFL] THEN
4327 let WINDING_NUMBER_AHLFORS = prove
4329 g piecewise_differentiable_on interval [a,b] /\
4330 drop a <= drop b /\ (!x. x IN interval [a,b] ==> ~(g x = z))
4331 ==> (\x. vector_derivative g (at x) / (g(x) - z))
4332 integrable_on interval[a,b] /\
4333 cexp(--(integral (interval[a,b])
4334 (\x. vector_derivative g (at x) / (g(x) - z)))) *
4335 (g(b) - z) = g(a) - z`,
4336 REPEAT GEN_TAC THEN STRIP_TAC THEN
4337 REWRITE_TAC[integrable_on; integral] THEN
4338 REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] complex_div] THEN
4339 REWRITE_TAC[GSYM HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
4340 ONCE_REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM](GSYM complex_div)] THEN
4341 REWRITE_TAC[GSYM integral; GSYM integrable_on] THEN
4342 MATCH_MP_TAC WINDING_NUMBER_AHLFORS_LEMMA THEN ASM_REWRITE_TAC[]);;
4344 let WINDING_NUMBER_AHLFORS_FULL = prove
4345 (`!p z. path p /\ ~(z IN path_image p)
4346 ==> pathfinish p - z =
4347 cexp(Cx(&2) * Cx pi * ii * winding_number(p,z)) *
4349 REPEAT STRIP_TAC THEN
4350 MP_TAC(ISPECL [`p:real^1->complex`; `z:complex`; `&1`] WINDING_NUMBER) THEN
4351 ASM_REWRITE_TAC[REAL_LT_01; LEFT_IMP_EXISTS_THM] THEN
4352 X_GEN_TAC `g:real^1->complex` THEN STRIP_TAC THEN
4353 REPEAT(FIRST_X_ASSUM(SUBST_ALL_TAC o SYM)) THEN
4354 RULE_ASSUM_TAC(REWRITE_RULE[valid_path; path_image; IN_IMAGE;
4355 NOT_EXISTS_THM]) THEN
4357 [`g:real^1->complex`; `z:complex`; `vec 0:real^1`; `vec 1:real^1`]
4358 WINDING_NUMBER_AHLFORS) THEN
4359 ASM_SIMP_TAC[DROP_VEC; REAL_POS; pathstart; pathfinish] THEN ANTS_TAC THENL
4360 [ASM_MESON_TAC[]; DISCH_THEN(SUBST1_TAC o SYM o CONJUNCT2)] THEN
4361 REWRITE_TAC[GSYM CEXP_ADD; COMPLEX_MUL_ASSOC; PATH_INTEGRAL_INTEGRAL] THEN
4362 REWRITE_TAC[SIMPLE_COMPLEX_ARITH `Cx(&1) / z * w = w / z`] THEN
4363 REWRITE_TAC[GSYM complex_sub; COMPLEX_SUB_REFL; CEXP_0; COMPLEX_MUL_LID]);;
4365 (* ------------------------------------------------------------------------- *)
4366 (* State in terms of complex integers. Note the useful equality version. *)
4367 (* ------------------------------------------------------------------------- *)
4369 let complex_integer = new_definition
4370 `complex_integer z <=> integer(Re z) /\ Im z = &0`;;
4372 let COMPLEX_INTEGER = prove
4373 (`complex_integer z <=> ?n. integer n /\ z = Cx n`,
4374 REWRITE_TAC[COMPLEX_EQ; RE_CX; IM_CX; complex_integer] THEN MESON_TAC[]);;
4376 let INTEGER_WINDING_NUMBER_EQ = prove
4377 (`!g z. path g /\ ~(z IN path_image g)
4378 ==> (complex_integer(winding_number(g,z)) <=>
4379 pathfinish g = pathstart g)`,
4380 REPEAT STRIP_TAC THEN
4381 MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_BALL) THEN
4382 ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4383 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4384 ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_BALL] THEN
4385 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
4386 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `e:real`]
4387 WINDING_NUMBER) THEN
4388 ASM_REWRITE_TAC[] THEN
4389 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
4391 `complex_integer(winding_number(p,z)) <=>
4392 pathfinish p = pathstart p`
4395 `path_integral p (\w. Cx(&1) / (w - z)) =
4396 Cx(&2) * Cx pi * ii * winding_number (g,z)` (K ALL_TAC) THEN
4397 ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH];
4398 ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; CX_2PII_NZ; COMPLEX_FIELD
4399 `~(a * b * c = Cx(&0))
4400 ==> Cx(&1) / (a * b * c) * a * b * c * z = z`]] THEN
4401 UNDISCH_THEN `pathstart p:complex = pathstart g` (SUBST_ALL_TAC o SYM) THEN
4402 UNDISCH_THEN `pathfinish p:complex = pathfinish g` (SUBST_ALL_TAC o SYM) THEN
4403 RULE_ASSUM_TAC(REWRITE_RULE[valid_path; path_image]) THEN
4404 REWRITE_TAC[pathfinish; pathstart] THEN
4405 MATCH_MP_TAC EQ_TRANS THEN
4406 EXISTS_TAC `cexp(path_integral p (\w. Cx(&1) / (w - z))) = Cx(&1)` THEN
4408 [REWRITE_TAC[CEXP_EQ_1; complex_integer] THEN
4409 REWRITE_TAC[complex_div; COMPLEX_MUL_LID; COMPLEX_INV_MUL] THEN
4410 SIMP_TAC[GSYM CX_INV; GSYM CX_MUL; COMPLEX_MUL_ASSOC; COMPLEX_INV_II] THEN
4411 REWRITE_TAC[RE_MUL_CX; IM_MUL_CX; GSYM COMPLEX_MUL_ASSOC] THEN
4412 REWRITE_TAC[COMPLEX_MUL_LNEG; RE_MUL_II; IM_MUL_II; RE_NEG; IM_NEG] THEN
4413 REWRITE_TAC[REAL_NEGNEG; REAL_ENTIRE; REAL_INV_EQ_0; REAL_NEG_EQ_0] THEN
4414 SIMP_TAC[REAL_OF_NUM_EQ; ARITH; REAL_LT_IMP_NZ; PI_POS] THEN
4415 SIMP_TAC[PI_POS; REAL_FIELD
4416 `&0 < p ==> (x = &2 * n * p <=> (inv(&2) * inv(p)) * x = n)`] THEN
4418 MP_TAC(ISPECL [`p:real^1->complex`; `z:complex`;
4419 `vec 0:real^1`; `vec 1:real^1`]
4420 WINDING_NUMBER_AHLFORS) THEN
4421 ASM_REWRITE_TAC[DROP_VEC; REAL_POS] THEN
4422 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
4423 DISCH_THEN(MP_TAC o CONJUNCT2) THEN
4424 REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] complex_div] THEN
4425 REWRITE_TAC[integral; GSYM HAS_INTEGRAL_LOCALIZED_VECTOR_DERIVATIVE] THEN
4426 REWRITE_TAC[GSYM has_path_integral; GSYM path_integral] THEN
4427 REWRITE_TAC[CEXP_NEG; COMPLEX_MUL_RID] THEN
4428 MATCH_MP_TAC(COMPLEX_FIELD
4429 `~(i = Cx(&0)) /\ ~(g0 = z)
4430 ==> (inv i * (g1 - z) = g0 - z ==> (i = Cx(&1) <=> g1 = g0))`) THEN
4431 REWRITE_TAC[CEXP_NZ] THEN
4432 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [IN_IMAGE]) THEN
4433 REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN MESON_TAC[REAL_POS; DROP_VEC]]);;
4435 let INTEGER_WINDING_NUMBER = prove
4436 (`!g z. path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g)
4437 ==> complex_integer(winding_number(g,z))`,
4438 MESON_TAC[INTEGER_WINDING_NUMBER_EQ]);;
4440 (* ------------------------------------------------------------------------- *)
4441 (* For |WN| >= 1 the path must contain points in every direction. *)
4442 (* We can thus bound the WN of a path that doesn't meet some "cut". *)
4443 (* ------------------------------------------------------------------------- *)
4445 let WINDING_NUMBER_POS_MEETS = prove
4446 (`!g z. valid_path g /\ ~(z IN path_image g) /\
4447 Re(winding_number(g,z)) >= &1
4449 ==> ?a. &0 < a /\ z + (Cx a * (w - z)) IN path_image g`,
4450 REPEAT STRIP_TAC THEN
4452 `!t. t IN interval[vec 0,vec 1] ==> ~((g:real^1->complex) t = z)`
4454 [UNDISCH_TAC `~((z:complex) IN path_image g)` THEN
4455 REWRITE_TAC[path_image; IN_IMAGE] THEN MESON_TAC[];
4457 ABBREV_TAC `r:complex = (w - z) / (pathstart g - z)` THEN
4458 STRIP_ASSUME_TAC(GSYM(SPEC `r:complex` ARG)) THEN
4460 `?t. t IN interval[vec 0,vec 1] /\
4461 Im(integral (interval[vec 0,t])
4462 (\x. vector_derivative g (at x) / (g x - z))) = Arg r`
4463 STRIP_ASSUME_TAC THENL
4464 [REWRITE_TAC[IM_DEF] THEN MATCH_MP_TAC IVT_INCREASING_COMPONENT_ON_1 THEN
4465 ASM_SIMP_TAC[DIMINDEX_2; DROP_VEC; ARITH; INTEGRAL_REFL; REAL_POS;
4468 [MATCH_MP_TAC INDEFINITE_INTEGRAL_CONTINUOUS_RIGHT THEN
4469 REWRITE_TAC[ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] complex_div] THEN
4470 REWRITE_TAC[GSYM PATH_INTEGRABLE_ON] THEN
4471 REWRITE_TAC[SIMPLE_COMPLEX_ARITH `inv z = Cx(&1) / z`] THEN
4472 MATCH_MP_TAC PATH_INTEGRABLE_INVERSEDIFF THEN ASM_REWRITE_TAC[];
4474 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2 * pi` THEN
4475 ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN
4476 UNDISCH_TAC `Re(winding_number (g,z)) >= &1` THEN
4477 ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; GSYM IM_DEF] THEN
4478 REWRITE_TAC[path_integral; HAS_PATH_INTEGRAL; GSYM integral] THEN
4479 SUBST1_TAC(COMPLEX_FIELD `ii = --inv ii`) THEN
4480 REWRITE_TAC[complex_div; COMPLEX_INV_MUL; COMPLEX_INV_NEG] THEN
4481 REWRITE_TAC[GSYM CX_INV; GSYM CX_MUL; COMPLEX_MUL_ASSOC] THEN
4482 REWRITE_TAC[RE_MUL_CX; RE; COMPLEX_MUL_RNEG; RE_NEG; COMPLEX_MUL_LNEG;
4483 COMPLEX_INV_INV; GSYM COMPLEX_MUL_ASSOC; RE_MUL_II] THEN
4484 REWRITE_TAC[REAL_MUL_RNEG; REAL_NEGNEG] THEN
4485 SIMP_TAC[REAL_ARITH `((&1 * inv(&2)) * p) * x >= &1 <=> &2 <= x * p`] THEN
4486 SIMP_TAC[GSYM real_div; REAL_LE_RDIV_EQ; PI_POS] THEN
4487 REWRITE_TAC[COMPLEX_MUL_LID; COMPLEX_MUL_AC];
4490 [`g:real^1->complex`; `z:complex`; `vec 0:real^1`; `t:real^1`]
4491 WINDING_NUMBER_AHLFORS) THEN
4493 [REPEAT CONJ_TAC THENL
4494 [MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_SUBSET THEN
4495 EXISTS_TAC `interval[vec 0:real^1,vec 1]` THEN
4496 RULE_ASSUM_TAC(REWRITE_RULE[valid_path]) THEN ASM_REWRITE_TAC[];
4499 DISCH_THEN(fun th -> FIRST_ASSUM MATCH_MP_TAC THEN MP_TAC th)] THEN
4500 UNDISCH_TAC `(t:real^1) IN interval[vec 0,vec 1]` THEN
4501 REWRITE_TAC[SUBSET; IN_INTERVAL_1; DROP_VEC] THEN REAL_ARITH_TAC;
4503 DISCH_THEN(MP_TAC o CONJUNCT2) THEN REWRITE_TAC[CEXP_NEG] THEN
4504 ABBREV_TAC `i = integral (interval [vec 0,t])
4505 (\x. vector_derivative g (at x) / (g x - z))` THEN
4506 SUBST1_TAC(SPEC `i:complex` COMPLEX_EXPAND) THEN
4507 ASM_REWRITE_TAC[CEXP_ADD; COMPLEX_INV_MUL; GSYM CX_EXP] THEN
4508 UNDISCH_TAC `Cx(norm r) * cexp(ii * Cx(Arg r)) = r` THEN
4509 REWRITE_TAC[IMP_IMP] THEN DISCH_THEN(MP_TAC o MATCH_MP (COMPLEX_FIELD
4510 `x * e = r /\ (y * inv e) * w = z
4511 ==> ~(e = Cx(&0)) ==> x * y * w = r * z`)) THEN
4512 REWRITE_TAC[CEXP_NZ] THEN
4514 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV) [pathstart] THEN
4515 SUBGOAL_THEN `~((g:real^1->complex)(vec 0) = z)` ASSUME_TAC THENL
4516 [FIRST_ASSUM MATCH_MP_TAC THEN SIMP_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS];
4518 ASM_SIMP_TAC[COMPLEX_DIV_RMUL; COMPLEX_SUB_0; GSYM CX_INV; GSYM CX_MUL;
4519 COMPLEX_MUL_ASSOC; GSYM real_div] THEN
4521 EXISTS_TAC `exp(Re i) / norm(r:complex)` THEN
4522 SUBGOAL_THEN `~(r = Cx(&0))` ASSUME_TAC THENL
4523 [EXPAND_TAC "r" THEN MATCH_MP_TAC(COMPLEX_FIELD
4524 `~(x = Cx(&0)) /\ ~(y = Cx(&0)) ==> ~(x / y = Cx(&0))`) THEN
4525 ASM_REWRITE_TAC[COMPLEX_SUB_0; pathstart];
4527 ASM_SIMP_TAC[REAL_LT_DIV; REAL_EXP_POS_LT; COMPLEX_NORM_NZ] THEN
4528 REWRITE_TAC[path_image; IN_IMAGE] THEN
4529 EXISTS_TAC `t:real^1` THEN ASM_REWRITE_TAC[] THEN
4530 MATCH_MP_TAC(COMPLEX_FIELD
4531 `inv i * (gt - z) = wz /\ ~(i = Cx(&0)) ==> z + i * wz = gt`) THEN
4532 ASM_REWRITE_TAC[GSYM CX_INV; REAL_INV_DIV; CX_INJ] THEN
4533 MATCH_MP_TAC(REAL_FIELD `~(x = &0) /\ ~(y = &0) ==> ~(x / y = &0)`) THEN
4534 ASM_REWRITE_TAC[REAL_EXP_NZ; COMPLEX_NORM_ZERO]);;
4536 let WINDING_NUMBER_BIG_MEETS = prove
4537 (`!g z. valid_path g /\ ~(z IN path_image g) /\
4538 abs(Re(winding_number(g,z))) >= &1
4540 ==> ?a. &0 < a /\ z + (Cx a * (w - z)) IN path_image g`,
4541 REPEAT GEN_TAC THEN REWRITE_TAC[real_abs] THEN COND_CASES_TAC THEN
4542 ASM_SIMP_TAC[WINDING_NUMBER_POS_MEETS] THEN
4543 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
4544 ASM_SIMP_TAC[GSYM RE_NEG; VALID_PATH_IMP_PATH;
4545 GSYM WINDING_NUMBER_REVERSEPATH] THEN
4546 DISCH_TAC THEN ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
4547 MATCH_MP_TAC WINDING_NUMBER_POS_MEETS THEN
4548 ASM_SIMP_TAC[PATH_IMAGE_REVERSEPATH; VALID_PATH_REVERSEPATH]);;
4550 let WINDING_NUMBER_LT_1 = prove
4551 (`!g w z. valid_path g /\ ~(z IN path_image g) /\ ~(w = z) /\
4552 (!a. &0 < a ==> ~(z + (Cx a * (w - z)) IN path_image g))
4553 ==> Re(winding_number(g,z)) < &1`,
4554 REPEAT STRIP_TAC THEN
4555 REWRITE_TAC[GSYM REAL_NOT_LE; GSYM real_ge] THEN
4556 ASM_MESON_TAC[WINDING_NUMBER_POS_MEETS]);;
4558 (* ------------------------------------------------------------------------- *)
4559 (* One way of proving that WN=1 for a loop. *)
4560 (* ------------------------------------------------------------------------- *)
4562 let WINDING_NUMBER_EQ_1 = prove
4563 (`!g z. valid_path g /\ ~(z IN path_image g) /\ pathfinish g = pathstart g /\
4564 &0 < Re(winding_number(g,z)) /\ Re(winding_number(g,z)) < &2
4565 ==> winding_number(g,z) = Cx(&1)`,
4567 REPLICATE_TAC 3 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
4568 SUBGOAL_THEN `complex_integer(winding_number(g,z))` MP_TAC THENL
4569 [ASM_SIMP_TAC[INTEGER_WINDING_NUMBER; VALID_PATH_IMP_PATH]; ALL_TAC] THEN
4570 SIMP_TAC[complex_integer; COMPLEX_EQ; RE_CX; IM_CX] THEN
4571 SIMP_TAC[REAL_LT_INTEGERS; INTEGER_CLOSED] THEN REAL_ARITH_TAC);;
4573 (* ------------------------------------------------------------------------- *)
4574 (* Continuity of winding number and invariance on connected sets. *)
4575 (* ------------------------------------------------------------------------- *)
4577 let CONTINUOUS_AT_WINDING_NUMBER = prove
4578 (`!g z. path g /\ ~(z IN path_image g)
4579 ==> (\w. winding_number(g,w)) continuous (at z)`,
4580 REPEAT STRIP_TAC THEN
4581 MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_CBALL) THEN
4582 ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE] THEN
4583 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4584 ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_CBALL] THEN
4585 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
4586 MP_TAC(ISPECL [`(:complex) DIFF cball(z,e / &2)`; `g:real^1->complex`]
4587 PATH_INTEGRAL_NEARBY_ENDS) THEN
4588 ASM_SIMP_TAC[OPEN_DIFF; OPEN_UNIV; CLOSED_CBALL] THEN ANTS_TAC THENL
4589 [REWRITE_TAC[SUBSET; IN_DIFF; IN_CBALL; SUBSET; IN_UNIV] THEN
4590 GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
4591 REWRITE_TAC[] THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
4594 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
4595 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `min d e / &2`]
4596 WINDING_NUMBER) THEN
4597 ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN
4598 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
4599 MATCH_MP_TAC CONTINUOUS_TRANSFORM_AT THEN
4600 MAP_EVERY EXISTS_TAC [`\w. winding_number(p,w)`; `min d e / &2`] THEN
4601 ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN CONJ_TAC THENL
4602 [X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
4603 MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN
4604 ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
4605 MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
4606 [REWRITE_TAC[path_image; IN_IMAGE] THEN
4607 DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC) THEN
4608 FIRST_X_ASSUM(MP_TAC o SPEC `(g:real^1->complex) t`) THEN
4609 FIRST_X_ASSUM(MP_TAC o SPEC `t:real^1`) THEN
4610 ASM_SIMP_TAC[path_image; FUN_IN_IMAGE] THEN
4611 UNDISCH_TAC `dist (w:complex,z) < min d e / &2` THEN
4612 ASM_REWRITE_TAC[] THEN CONV_TAC NORM_ARITH;
4613 DISCH_TAC THEN X_GEN_TAC `k:real` THEN DISCH_TAC THEN
4614 MP_TAC(ISPECL [`g:real^1->complex`; `w:complex`; `min k (min d e) / &2`]
4615 WINDING_NUMBER) THEN
4616 ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN ANTS_TAC THENL
4617 [FIRST_X_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
4620 DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
4621 EXISTS_TAC `p:real^1->complex` THEN ASM_REWRITE_TAC[] THEN
4622 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
4623 FIRST_X_ASSUM(fun th -> GEN_REWRITE_TAC RAND_CONV [SYM th]) THEN
4624 CONV_TAC SYM_CONV THEN FIRST_X_ASSUM(MP_TAC o SPECL
4625 [`p:real^1->complex`; `q:real^1->complex`]) THEN
4626 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
4627 [X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
4628 REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `t:real^1`)) THEN
4629 ASM_REWRITE_TAC[] THEN CONV_TAC NORM_ARITH;
4630 DISCH_THEN(MATCH_MP_TAC o last o CONJUNCTS)] THEN
4631 MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
4632 SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
4633 IN_DELETE; IN_UNIV; COMPLEX_SUB_0] THEN
4634 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN SIMP_TAC[IN_DIFF] THEN
4635 REWRITE_TAC[IN_UNIV; IN_CBALL] THEN
4636 ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC];
4637 UNDISCH_TAC `~((z:complex) IN path_image p)` THEN
4638 UNDISCH_TAC `valid_path(p:real^1->complex)` THEN
4639 POP_ASSUM_LIST(K ALL_TAC) THEN SPEC_TAC(`z:complex`,`z:complex`) THEN
4640 SPEC_TAC(`p:real^1->complex`,`g:real^1->complex`)] THEN
4641 REPEAT STRIP_TAC THEN
4642 MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_BALL) THEN
4643 ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4644 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4645 ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_BALL] THEN
4646 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
4647 MP_TAC(ISPECL [`(:complex) DIFF cball(z, &3 / &4 * d)`; `g:real^1->complex`]
4648 PATH_INTEGRAL_BOUND_EXISTS) THEN
4649 ASM_REWRITE_TAC[GSYM closed; CLOSED_CBALL; SUBSET; IN_DIFF;
4650 IN_CBALL; IN_UNIV; REAL_NOT_LE] THEN
4652 [ASM_MESON_TAC[REAL_ARITH `&0 < d /\ ~(&3 / &4 * d < x) ==> x < d`];
4654 DISCH_THEN(X_CHOOSE_THEN `L:real` STRIP_ASSUME_TAC) THEN
4655 REWRITE_TAC[continuous_at] THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
4656 EXISTS_TAC `min (d / &4) (e / &2 * d pow 2 / L / &4)` THEN
4657 ASM_SIMP_TAC[REAL_LT_MIN; REAL_POW_LT; REAL_LT_DIV; REAL_LT_MUL; REAL_HALF;
4658 REAL_ARITH `&0 < x / &4 <=> &0 < x`] THEN
4659 X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
4660 SUBGOAL_THEN `~((w:complex) IN path_image g)` ASSUME_TAC THENL
4661 [FIRST_X_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
4664 ASM_SIMP_TAC[dist; WINDING_NUMBER_VALID_PATH; GSYM COMPLEX_SUB_LDISTRIB] THEN
4665 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_CX] THEN
4666 REWRITE_TAC[REAL_ABS_NUM; COMPLEX_NORM_II; REAL_ABS_PI] THEN
4667 REWRITE_TAC[real_div; REAL_MUL_LID; REAL_MUL_RID] THEN
4668 MATCH_MP_TAC(REAL_ARITH
4669 `inv p * x <= &1 * x /\ x < e ==> inv p * x < e`) THEN
4671 [MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
4672 MATCH_MP_TAC REAL_INV_LE_1 THEN MP_TAC PI_APPROX_32 THEN REAL_ARITH_TAC;
4674 MATCH_MP_TAC(REAL_ARITH `!d. &0 < e /\ d = e / &2 /\ x <= d ==> x < e`) THEN
4675 EXISTS_TAC `L * (e / &2 * d pow 2 / L / &4) * inv(d / &2) pow 2` THEN
4676 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
4677 [MAP_EVERY UNDISCH_TAC [`&0 < d`; `&0 < L`] THEN CONV_TAC REAL_FIELD;
4680 `path_integral g (\x. Cx(&1) / (x - w)) -
4681 path_integral g (\x. Cx(&1) / (x - z)) =
4682 path_integral g (\x. Cx(&1) / (x - w) - Cx(&1) / (x - z))`
4684 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_SUB THEN
4685 CONJ_TAC THEN MATCH_MP_TAC PATH_INTEGRABLE_INVERSEDIFF THEN
4686 ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
4687 ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC;
4689 FIRST_X_ASSUM MATCH_MP_TAC THEN
4690 SIMP_TAC[HOLOMORPHIC_ON_OPEN; GSYM closed; CLOSED_CBALL] THEN
4691 REWRITE_TAC[IN_UNIV; IN_DIFF; IN_CBALL; REAL_NOT_LE; AND_FORALL_THM] THEN
4692 X_GEN_TAC `x:complex` THEN
4693 REWRITE_TAC[TAUT `(a ==> b) /\ (a ==> c) <=> a ==> b /\ c`] THEN
4694 DISCH_TAC THEN REWRITE_TAC[GSYM complex_differentiable] THEN
4695 SUBGOAL_THEN `~(x:complex = w) /\ ~(x = z)` STRIP_ASSUME_TAC THENL
4696 [CONJ_TAC THEN DISCH_THEN SUBST_ALL_TAC THEN
4697 REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM REAL_NOT_LE])) THEN
4698 CONV_TAC NORM_ARITH;
4701 [MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
4702 CONJ_TAC THEN MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
4703 ASM_SIMP_TAC[COMPLEX_SUB_0; COMPLEX_DIFFERENTIABLE_SUB;
4704 COMPLEX_DIFFERENTIABLE_ID; COMPLEX_DIFFERENTIABLE_CONST];
4706 ASM_SIMP_TAC[COMPLEX_FIELD
4707 `~(x = w) /\ ~(x = z)
4708 ==> Cx(&1) / (x - w) - Cx(&1) / (x - z) =
4709 (w - z) * inv((x - w) * (x - z))`] THEN
4710 REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
4711 ASM_SIMP_TAC[NORM_POS_LE; GSYM dist; REAL_LT_IMP_LE] THEN
4712 REWRITE_TAC[COMPLEX_NORM_INV; REAL_POW_INV] THEN
4713 MATCH_MP_TAC REAL_LE_INV2 THEN
4714 ASM_SIMP_TAC[REAL_POW_2; REAL_LT_MUL; REAL_HALF; COMPLEX_NORM_MUL] THEN
4715 MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_SIMP_TAC[REAL_HALF; REAL_LT_IMP_LE] THEN
4716 REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM REAL_NOT_LE])) THEN
4717 CONV_TAC NORM_ARITH);;
4719 let CONTINUOUS_ON_WINDING_NUMBER = prove
4721 ==> (\w. winding_number(g,w)) continuous_on
4722 ((:complex) DIFF path_image g)`,
4723 SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; GSYM closed;
4724 OPEN_UNIV; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4725 SIMP_TAC[IN_DIFF; IN_UNIV; CONTINUOUS_AT_WINDING_NUMBER]);;
4727 let WINDING_NUMBER_CONSTANT = prove
4728 (`!s g. path g /\ pathfinish g = pathstart g /\
4729 connected s /\ s INTER path_image g = {}
4730 ==> ?k. !z. z IN s ==> winding_number(g,z) = k`,
4731 REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_DISCRETE_RANGE_CONSTANT THEN
4732 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
4733 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
4734 EXISTS_TAC `(:complex) DIFF path_image g` THEN
4735 ASM_SIMP_TAC[CONTINUOUS_ON_WINDING_NUMBER] THEN ASM SET_TAC[];
4737 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
4738 EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN
4739 X_GEN_TAC `w:complex` THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
4741 `complex_integer(winding_number(g,w)) /\
4742 complex_integer(winding_number(g,z))`
4744 [CONJ_TAC THEN MATCH_MP_TAC INTEGER_WINDING_NUMBER THEN
4745 ASM_REWRITE_TAC[] THEN ASM SET_TAC[];
4746 REWRITE_TAC[COMPLEX_INTEGER] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]] THEN
4747 REWRITE_TAC[GSYM CX_SUB; CX_INJ; COMPLEX_NORM_CX] THEN
4748 REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_ABS_INTEGER_LEMMA THEN
4749 ASM_SIMP_TAC[REAL_SUB_0; INTEGER_CLOSED]);;
4751 let WINDING_NUMBER_EQ = prove
4753 path g /\ pathfinish g = pathstart g /\
4754 w IN s /\ z IN s /\ connected s /\ s INTER path_image g = {}
4755 ==> winding_number(g,w) = winding_number(g,z)`,
4756 MESON_TAC[WINDING_NUMBER_CONSTANT]);;
4758 let OPEN_WINDING_NUMBER_LEVELSETS = prove
4759 (`!g k. path g /\ pathfinish g = pathstart g
4760 ==> open {z | ~(z IN path_image g) /\ winding_number(g,z) = k}`,
4761 REPEAT STRIP_TAC THEN REWRITE_TAC[open_def; IN_ELIM_THM] THEN
4762 X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
4763 MP_TAC(ISPEC `(:complex) DIFF path_image g` OPEN_CONTAINS_BALL) THEN
4764 ASM_SIMP_TAC[GSYM closed; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
4765 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
4766 ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; SUBSET; IN_BALL] THEN
4767 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
4768 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `w:complex` THEN
4769 REPEAT STRIP_TAC THENL [ASM_MESON_TAC[DIST_SYM]; ALL_TAC] THEN
4770 MP_TAC(ISPECL [`ball(z:complex,e)`; `g:real^1->complex`]
4771 WINDING_NUMBER_CONSTANT) THEN
4772 ASM_SIMP_TAC[CONNECTED_BALL; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_BALL] THEN
4773 ASM_MESON_TAC[DIST_REFL; DIST_SYM]);;
4775 (* ------------------------------------------------------------------------- *)
4776 (* Winding number is zero "outside" a curve, in various senses. *)
4777 (* ------------------------------------------------------------------------- *)
4779 let WINDING_NUMBER_ZERO_IN_OUTSIDE = prove
4780 (`!g z. path g /\ pathfinish g = pathstart g /\ z IN outside(path_image g)
4781 ==> winding_number(g,z) = Cx(&0)`,
4782 REPEAT STRIP_TAC THEN
4783 MP_TAC(ISPECL [`path_image(g:real^1->complex)`; `Cx(&0)`]
4784 BOUNDED_SUBSET_BALL) THEN ASM_SIMP_TAC[BOUNDED_PATH_IMAGE] THEN
4785 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
4786 SUBGOAL_THEN `?w. ~(w IN ball(Cx(&0),B + &1))` STRIP_ASSUME_TAC THENL
4787 [MATCH_MP_TAC(SET_RULE `~(s = UNIV) ==> ?z. ~(z IN s)`) THEN
4788 MESON_TAC[BOUNDED_BALL; NOT_BOUNDED_UNIV];
4790 MP_TAC(ISPECL [`Cx(&0)`; `B:real`; `B + &1`] SUBSET_BALL) THEN
4791 REWRITE_TAC[REAL_ARITH `B <= B + &1`] THEN DISCH_TAC THEN
4792 MP_TAC(ISPECL [`path_image(g:real^1->complex)`; `ball(Cx(&0),B + &1)`]
4793 OUTSIDE_SUBSET_CONVEX) THEN
4794 ASM_REWRITE_TAC[CONVEX_BALL] THEN
4795 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
4796 REWRITE_TAC[SUBSET; IN_UNIV; IN_DIFF] THEN DISCH_TAC THEN
4797 MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC `winding_number(g,w)` THEN
4799 [MP_TAC(ISPECL [`outside(path_image(g:real^1->complex))`;
4800 `g:real^1->complex`] WINDING_NUMBER_CONSTANT) THEN
4801 ASM_SIMP_TAC[OUTSIDE_NO_OVERLAP; CONNECTED_OUTSIDE;
4802 DIMINDEX_2; LE_REFL; BOUNDED_PATH_IMAGE] THEN
4804 MATCH_MP_TAC WINDING_NUMBER_UNIQUE THEN ASM_REWRITE_TAC[] THEN
4805 MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
4806 [ASM SET_TAC[]; DISCH_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC] THEN
4807 MP_TAC(ISPECL [`g:real^1->complex`; `min e (&1)`]
4808 PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
4809 ASM_REWRITE_TAC[REAL_LT_MIN; REAL_LT_01] THEN
4810 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `p:real^1->complex` THEN
4811 STRIP_TAC THEN ONCE_REWRITE_TAC[NORM_SUB] THEN
4812 ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN CONJ_TAC THENL
4813 [UNDISCH_TAC `~(w IN ball (Cx(&0),B + &1))` THEN
4814 REWRITE_TAC[CONTRAPOS_THM; path_image; IN_BALL] THEN
4815 SPEC_TAC(`w:complex`,`x:complex`) THEN REWRITE_TAC[FORALL_IN_IMAGE];
4816 REWRITE_TAC[COMPLEX_MUL_RZERO] THEN
4817 MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
4818 MATCH_MP_TAC CAUCHY_THEOREM_CONVEX_SIMPLE THEN
4819 EXISTS_TAC `ball(Cx(&0),B + &1)` THEN
4820 ASM_SIMP_TAC[CONVEX_BALL; VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
4822 [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
4823 SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
4826 REWRITE_TAC[path_image; SUBSET; FORALL_IN_IMAGE; IN_BALL]]] THEN
4827 X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
4828 REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
4829 MATCH_MP_TAC(NORM_ARITH
4830 `!g:real^1->complex. norm(p t - g t) < &1 /\ norm(g t) <= B
4831 ==> norm(p t) < B + &1`) THEN
4832 EXISTS_TAC `g:real^1->complex` THEN
4833 UNDISCH_TAC `path_image g SUBSET ball (Cx(&0),B)` THEN
4834 ASM_SIMP_TAC[SUBSET; IN_BALL; path_image; FORALL_IN_IMAGE] THEN
4835 ASM_SIMP_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG; REAL_LT_IMP_LE]]);;
4837 let WINDING_NUMBER_ZERO_OUTSIDE = prove
4838 (`!g s z. path g /\ convex s /\ pathfinish g = pathstart g /\
4839 ~(z IN s) /\ path_image g SUBSET s
4840 ==> winding_number(g,z) = Cx(&0)`,
4841 REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_ZERO_IN_OUTSIDE THEN
4842 ASM_REWRITE_TAC[] THEN
4843 MP_TAC(ISPECL [`path_image(g:real^1->complex)`; `s:complex->bool`]
4844 OUTSIDE_SUBSET_CONVEX) THEN
4847 let WINDING_NUMBER_ZERO_ATINFINITY = prove
4848 (`!g. path g /\ pathfinish g = pathstart g
4849 ==> ?B. !z. B <= norm(z) ==> winding_number(g,z) = Cx(&0)`,
4850 REPEAT STRIP_TAC THEN
4851 SUBGOAL_THEN `bounded (path_image g :complex->bool)` MP_TAC THENL
4852 [ASM_SIMP_TAC[BOUNDED_PATH_IMAGE]; ALL_TAC] THEN
4853 REWRITE_TAC[bounded] THEN DISCH_THEN(X_CHOOSE_TAC `B:real`) THEN
4854 EXISTS_TAC `B + &1` THEN REPEAT STRIP_TAC THEN
4855 MATCH_MP_TAC WINDING_NUMBER_ZERO_OUTSIDE THEN
4856 EXISTS_TAC `cball(Cx(&0),B)` THEN ASM_REWRITE_TAC[CONVEX_CBALL] THEN
4857 REWRITE_TAC[SUBSET; IN_CBALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
4858 ASM_MESON_TAC[REAL_ARITH `~(B + &1 <= z /\ z <= B)`]);;
4860 let WINDING_NUMBER_ZERO_POINT = prove
4861 (`!g s. path g /\ pathfinish g = pathstart g /\
4862 open s /\ path_image g SUBSET s
4863 ==> ?z. z IN s /\ winding_number(g,z) = Cx(&0)`,
4864 REPEAT STRIP_TAC THEN
4865 MP_TAC(ISPECL [`path_image g:complex->bool`; `s:complex->bool`]
4866 OUTSIDE_COMPACT_IN_OPEN) THEN
4867 ASM_SIMP_TAC[COMPACT_PATH_IMAGE] THEN ANTS_TAC THENL
4868 [ASM_MESON_TAC[SUBSET_EMPTY; PATH_IMAGE_NONEMPTY]; ALL_TAC] THEN
4869 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN MATCH_MP_TAC MONO_EXISTS THEN
4870 GEN_TAC THEN REWRITE_TAC[IN_INTER] THEN
4871 ASM_SIMP_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE]);;
4873 (* ------------------------------------------------------------------------- *)
4874 (* If a path winds round a set, it winds rounds its inside. *)
4875 (* ------------------------------------------------------------------------- *)
4877 let WINDING_NUMBER_AROUND_INSIDE = prove
4879 path g /\ pathfinish g = pathstart g /\
4880 closed s /\ connected s /\ s INTER path_image g = {} /\
4881 z IN s /\ ~(winding_number(g,z) = Cx(&0))
4882 ==> !w. w IN s UNION inside(s)
4883 ==> winding_number(g,w) = winding_number(g,z)`,
4885 [`g:real^1->complex`; `s:complex->bool`; `z0:complex`] THEN STRIP_TAC THEN
4886 SUBGOAL_THEN `!z. z IN s ==> winding_number(g,z) = winding_number(g,z0)`
4887 ASSUME_TAC THENL [ASM_MESON_TAC[WINDING_NUMBER_EQ]; ALL_TAC] THEN
4888 ABBREV_TAC `k = winding_number (g,z0)` THEN
4889 SUBGOAL_THEN `(s:complex->bool) SUBSET inside(path_image g)` ASSUME_TAC THENL
4890 [REWRITE_TAC[SUBSET; INSIDE_OUTSIDE; IN_DIFF; IN_UNIV; IN_UNION] THEN
4891 X_GEN_TAC `z:complex` THEN REPEAT STRIP_TAC THENL
4892 [ASM SET_TAC[]; ASM_MESON_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE]];
4894 X_GEN_TAC `z:complex` THEN REWRITE_TAC[IN_UNION] THEN
4895 STRIP_TAC THEN ASM_SIMP_TAC[] THEN
4896 MP_TAC(ISPECL [`s:complex->bool`;
4897 `path_image g:complex->bool`]
4898 INSIDE_INSIDE_COMPACT_CONNECTED) THEN
4899 ASM_SIMP_TAC[COMPACT_PATH_IMAGE; CONNECTED_PATH_IMAGE] THEN STRIP_TAC THEN
4900 EXPAND_TAC "k" THEN MATCH_MP_TAC WINDING_NUMBER_EQ THEN
4901 EXISTS_TAC `s UNION inside s :complex->bool` THEN
4902 ASM_SIMP_TAC[CONNECTED_WITH_INSIDE; IN_UNION] THEN
4903 MP_TAC(ISPEC `path_image g :complex->bool` INSIDE_NO_OVERLAP) THEN
4906 (* ------------------------------------------------------------------------- *)
4907 (* Bounding a WN by 1/2 for a path and point in opposite halfspaces. *)
4908 (* ------------------------------------------------------------------------- *)
4910 let WINDING_NUMBER_SUBPATH_CONTINUOUS = prove
4911 (`!g z. valid_path g /\ ~(z IN path_image g)
4912 ==> (\a. winding_number(subpath (vec 0) a g,z)) continuous_on
4913 interval[vec 0,vec 1]`,
4914 REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_EQ THEN EXISTS_TAC
4915 `\a. Cx(&1) / (Cx(&2) * Cx pi * ii) *
4916 integral (interval[vec 0,a])
4917 (\t. Cx(&1) / (g t - z) * vector_derivative g (at t))` THEN
4919 [X_GEN_TAC `a:real^1` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
4920 MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
4921 `Cx(&1) / (Cx(&2) * Cx pi * ii) *
4922 path_integral (subpath (vec 0) a g) (\w. Cx(&1) / (w - z))` THEN
4924 [AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN
4925 MATCH_MP_TAC PATH_INTEGRAL_SUBPATH_INTEGRAL THEN
4926 ASM_SIMP_TAC[ENDS_IN_UNIT_INTERVAL; PATH_INTEGRABLE_INVERSEDIFF] THEN
4927 ASM_MESON_TAC[IN_INTERVAL_1];
4928 REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN CONV_TAC SYM_CONV THEN
4929 MATCH_MP_TAC WINDING_NUMBER_VALID_PATH THEN
4930 ASM_MESON_TAC[VALID_PATH_SUBPATH; SUBSET; VALID_PATH_IMP_PATH;
4931 ENDS_IN_UNIT_INTERVAL; PATH_IMAGE_SUBPATH_SUBSET]];
4932 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_LMUL THEN
4933 MATCH_MP_TAC INDEFINITE_INTEGRAL_CONTINUOUS_RIGHT THEN
4934 REWRITE_TAC[GSYM PATH_INTEGRABLE_ON] THEN
4935 ASM_SIMP_TAC[PATH_INTEGRABLE_INVERSEDIFF]]);;
4937 let WINDING_NUMBER_IVT_POS = prove
4939 valid_path g /\ ~(z IN path_image g) /\
4940 &0 <= w /\ w <= Re(winding_number(g,z))
4941 ==> ?t. t IN interval[vec 0,vec 1] /\
4942 Re(winding_number(subpath (vec 0) t g,z)) = w`,
4943 REPEAT STRIP_TAC THEN REWRITE_TAC[RE_DEF] THEN
4944 MATCH_MP_TAC IVT_INCREASING_COMPONENT_ON_1 THEN
4945 ASM_SIMP_TAC[WINDING_NUMBER_SUBPATH_CONTINUOUS] THEN
4946 ASM_REWRITE_TAC[SUBPATH_TRIVIAL; GSYM RE_DEF; DIMINDEX_2; ARITH] THEN
4947 REWRITE_TAC[DROP_VEC; REAL_POS; SUBPATH_REFL] THEN
4948 MP_TAC(ISPECL [`(g:real^1->complex) (vec 0)`; `z:complex`]
4949 WINDING_NUMBER_TRIVIAL) THEN
4950 ASM_MESON_TAC[pathstart; PATHSTART_IN_PATH_IMAGE; RE_CX]);;
4952 let WINDING_NUMBER_IVT_NEG = prove
4954 valid_path g /\ ~(z IN path_image g) /\
4955 Re(winding_number(g,z)) <= w /\ w <= &0
4956 ==> ?t. t IN interval[vec 0,vec 1] /\
4957 Re(winding_number(subpath (vec 0) t g,z)) = w`,
4958 REPEAT STRIP_TAC THEN REWRITE_TAC[RE_DEF] THEN
4959 MATCH_MP_TAC IVT_DECREASING_COMPONENT_ON_1 THEN
4960 ASM_SIMP_TAC[WINDING_NUMBER_SUBPATH_CONTINUOUS] THEN
4961 ASM_REWRITE_TAC[SUBPATH_TRIVIAL; GSYM RE_DEF; DIMINDEX_2; ARITH] THEN
4962 REWRITE_TAC[DROP_VEC; REAL_POS; SUBPATH_REFL] THEN
4963 MP_TAC(ISPECL [`(g:real^1->complex) (vec 0)`; `z:complex`]
4964 WINDING_NUMBER_TRIVIAL) THEN
4965 ASM_MESON_TAC[pathstart; PATHSTART_IN_PATH_IMAGE; RE_CX]);;
4967 let WINDING_NUMBER_IVT_ABS = prove
4969 valid_path g /\ ~(z IN path_image g) /\
4970 &0 <= w /\ w <= abs(Re(winding_number(g,z)))
4971 ==> ?t. t IN interval[vec 0,vec 1] /\
4972 abs(Re(winding_number(subpath (vec 0) t g,z))) = w`,
4973 REPEAT GEN_TAC THEN ASM_CASES_TAC `&0 <= Re(winding_number(g,z))` THEN
4974 ASM_REWRITE_TAC[real_abs] THEN REWRITE_TAC[GSYM real_abs] THEN
4975 REPEAT STRIP_TAC THENL
4976 [MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `w:real`]
4977 WINDING_NUMBER_IVT_POS);
4978 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `--w:real`]
4979 WINDING_NUMBER_IVT_NEG)] THEN
4980 (ANTS_TAC THENL [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; ALL_TAC]) THEN
4981 MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[] THEN ASM_REAL_ARITH_TAC);;
4983 let WINDING_NUMBER_LT_HALF = prove
4985 valid_path g /\ a dot z <= b /\ path_image g SUBSET {w | a dot w > b}
4986 ==> abs(Re(winding_number(g,z))) < &1 / &2`,
4989 valid_path g /\ ~(z IN path_image g) /\
4990 a dot z <= b /\ path_image g SUBSET {w | a dot w > b}
4991 ==> Re(winding_number(g,z)) < &1 / &2`,
4992 REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LE] THEN STRIP_TAC THEN
4993 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `&1 / &2`]
4994 WINDING_NUMBER_IVT_POS) THEN
4995 CONV_TAC REAL_RAT_REDUCE_CONV THEN ASM_REWRITE_TAC[NOT_EXISTS_THM] THEN
4996 X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
4997 MP_TAC(ISPECL [`subpath (vec 0) t (g:real^1->complex)`; `z:complex`]
4998 WINDING_NUMBER_AHLFORS_FULL) THEN
4999 ASM_SIMP_TAC[VALID_PATH_SUBPATH; VALID_PATH_IMP_PATH;
5000 ENDS_IN_UNIT_INTERVAL; NOT_IMP] THEN
5002 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
5003 `~(z IN t) ==> s SUBSET t ==> ~(z IN s)`)) THEN
5004 ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; ENDS_IN_UNIT_INTERVAL;
5005 VALID_PATH_IMP_PATH];
5006 ASM_REWRITE_TAC[EULER; RE_MUL_CX; RE_MUL_II; IM_MUL_CX; IM_MUL_II] THEN
5007 REWRITE_TAC[REAL_ARITH `&2 * pi * &1 / &2 = pi`; SIN_PI; COS_PI] THEN
5008 REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_RID] THEN
5009 REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
5010 REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM CX_MUL] THEN
5011 REWRITE_TAC[REAL_MUL_RNEG; REAL_MUL_RID; GSYM COMPLEX_CMUL] THEN
5013 SUBGOAL_THEN `&0 < a dot ((g:real^1->complex) t - z) /\
5014 &0 < a dot (g(vec 0) - z)`
5016 [REWRITE_TAC[DOT_RSUB; REAL_SUB_LT] THEN CONJ_TAC THEN
5017 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `b:real` THEN
5018 ASM_REWRITE_TAC[GSYM real_gt] THEN
5019 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
5020 `g SUBSET {z | a dot z > b} ==> t IN g ==> a dot t > b`)) THEN
5021 REWRITE_TAC[path_image] THEN MATCH_MP_TAC FUN_IN_IMAGE THEN
5022 ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL];
5023 ASM_REWRITE_TAC[DOT_RMUL] THEN
5024 DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
5025 ASM_SIMP_TAC[REAL_LT_MUL_EQ] THEN
5026 MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(&0 < -- x)`) THEN
5027 REWRITE_TAC[REAL_EXP_POS_LT]]]) in
5028 REPEAT STRIP_TAC THEN
5029 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
5030 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
5031 ASM_REWRITE_TAC[IN_ELIM_THM; REAL_ARITH `a:real > b <=> ~(a <= b)`] THEN
5032 DISCH_TAC THEN MATCH_MP_TAC(REAL_ARITH `x < a /\ --x < a ==> abs x < a`) THEN
5033 CONJ_TAC THENL [ASM_MESON_TAC[lemma]; ALL_TAC] THEN
5034 MP_TAC(ISPECL [`reversepath g:real^1->complex`; `z:complex`;
5035 `a:complex`; `b:real`] lemma) THEN
5036 ASM_SIMP_TAC[VALID_PATH_REVERSEPATH; PATH_IMAGE_REVERSEPATH;
5037 WINDING_NUMBER_REVERSEPATH; VALID_PATH_IMP_PATH; RE_NEG] THEN
5040 let WINDING_NUMBER_LE_HALF = prove
5042 valid_path g /\ ~(z IN path_image g) /\
5043 ~(a = vec 0) /\ a dot z <= b /\ path_image g SUBSET {w | a dot w >= b}
5044 ==> abs(Re(winding_number(g,z))) <= &1 / &2`,
5045 REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN
5046 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
5047 CONTINUOUS_AT_WINDING_NUMBER) THEN
5048 ASM_SIMP_TAC[VALID_PATH_IMP_PATH; continuous_at] THEN
5049 DISCH_THEN(MP_TAC o SPEC `abs(Re(winding_number(g,z))) - &1 / &2`) THEN
5050 ASM_REWRITE_TAC[REAL_SUB_LT] THEN
5051 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
5052 FIRST_X_ASSUM(MP_TAC o SPEC `z - d / &2 / norm(a) % a:complex`) THEN
5053 REWRITE_TAC[NORM_ARITH `dist(z - d:complex,z) = norm d`] THEN
5054 ASM_SIMP_TAC[NORM_MUL; REAL_ABS_DIV; REAL_ABS_NORM; REAL_DIV_RMUL;
5055 NORM_EQ_0; NOT_IMP] THEN
5056 CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
5057 MATCH_MP_TAC(NORM_ARITH
5058 `abs(Re w' - Re w) <= norm(w' - w) /\ abs(Re w') < &1 / &2
5059 ==> ~(dist(w',w) < abs(Re w) - &1 / &2)`) THEN
5060 REWRITE_TAC[GSYM RE_SUB] THEN CONJ_TAC THENL
5061 [SIMP_TAC[COMPONENT_LE_NORM; RE_DEF; DIMINDEX_2; ARITH]; ALL_TAC] THEN
5062 MATCH_MP_TAC WINDING_NUMBER_LT_HALF THEN EXISTS_TAC `a:complex` THEN
5063 EXISTS_TAC `b - d / &3 * norm(a:complex)` THEN
5064 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
5065 [REWRITE_TAC[DOT_RSUB; DOT_RMUL; GSYM NORM_POW_2] THEN
5066 ASM_SIMP_TAC[NORM_EQ_0; REAL_FIELD
5067 `~(a = &0) ==> x / a * a pow 2 = x * a`] THEN
5068 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
5069 `a:real <= b ==> d <= e ==> a - e <= b - d`)) THEN
5070 MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
5072 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5074 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN MATCH_MP_TAC(REAL_ARITH
5075 `&0 < e ==> !x. a dot x >= b ==> a dot x > b - e`) THEN
5076 MATCH_MP_TAC REAL_LT_MUL THEN ASM_SIMP_TAC[NORM_POS_LT] THEN
5077 ASM_REAL_ARITH_TAC]);;
5079 let WINDING_NUMBER_LT_HALF_LINEPATH = prove
5081 ~(z IN segment[a,b])
5082 ==> abs(Re(winding_number(linepath(a,b),z))) < &1 / &2`,
5083 REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_LT_HALF THEN
5084 MP_TAC(ISPECL [`segment[a:complex,b]`; `z:complex`]
5085 SEPARATING_HYPERPLANE_CLOSED_POINT) THEN
5086 ASM_REWRITE_TAC[CONVEX_SEGMENT; CLOSED_SEGMENT] THEN
5087 REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN
5088 SIMP_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH; SUBSET; IN_ELIM_THM;
5091 (* ------------------------------------------------------------------------- *)
5092 (* Positivity of WN for a linepath. *)
5093 (* ------------------------------------------------------------------------- *)
5095 let WINDING_NUMBER_LINEPATH_POS_LT = prove
5096 (`!a b z. &0 < Im((b - a) * cnj(b - z))
5097 ==> &0 < Re(winding_number(linepath(a,b),z))`,
5098 REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_POS_LT THEN
5099 EXISTS_TAC `Im((b - a) * cnj(b - z))` THEN
5100 ASM_REWRITE_TAC[VALID_PATH_LINEPATH; VECTOR_DERIVATIVE_LINEPATH_AT] THEN
5102 [POP_ASSUM MP_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
5103 SPEC_TAC(`z:complex`,`z:complex`) THEN
5104 REWRITE_TAC[path_image; FORALL_IN_IMAGE; linepath] THEN
5105 REWRITE_TAC[VECTOR_ARITH
5106 `b - ((&1 - x) % a + x % b) = (&1 - x) % (b - a)`] THEN
5107 REWRITE_TAC[COMPLEX_CMUL; CNJ_MUL; CNJ_CX] THEN
5108 REWRITE_TAC[COMPLEX_RING `a * Cx x * cnj a = Cx x * a * cnj a`] THEN
5109 SIMP_TAC[COMPLEX_MUL_CNJ; GSYM CX_POW; GSYM CX_MUL; IM_CX; REAL_LT_REFL];
5112 `segment[a,b] SUBSET
5113 {y | Im((b - a) * cnj(b - z)) <= Im((b - a) * cnj(y - z))}`
5115 [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
5117 [REWRITE_TAC[SET_RULE `{a,b} SUBSET {y | P y} <=> P a /\ P b`] THEN
5118 POP_ASSUM MP_TAC THEN
5119 REWRITE_TAC[cnj; complex_mul; RE; IM; RE_SUB; IM_SUB] THEN
5122 REWRITE_TAC[COMPLEX_SUB_LDISTRIB; IM_SUB; CNJ_SUB; REAL_LE_SUB_LADD] THEN
5123 REWRITE_TAC[CONVEX_ALT; cnj; complex_mul; RE; IM; RE_SUB; IM_SUB] THEN
5124 REWRITE_TAC[IN_ELIM_THM; IM_ADD; RE_ADD; IM_CMUL; RE_CMUL] THEN
5125 REWRITE_TAC[REAL_NEG_ADD; REAL_NEG_RMUL] THEN
5126 ONCE_REWRITE_TAC[REAL_ARITH
5127 `e <= ab * ((&1 - u) * x + u * y) + ab' * ((&1 - u) * x' + u * y') <=>
5128 (&1 - u) * e + u * e <=
5129 (&1 - u) * (ab * x + ab' * x') + u * (ab * y + ab' * y')`] THEN
5130 REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_ADD2 THEN
5131 CONJ_TAC THEN MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN
5133 REWRITE_TAC[GSYM PATH_IMAGE_LINEPATH] THEN
5134 REWRITE_TAC[SUBSET; path_image; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
5135 ASM_MESON_TAC[SUBSET; INTERVAL_OPEN_SUBSET_CLOSED]]);;
5137 (* ------------------------------------------------------------------------- *)
5138 (* Winding number for a triangle. *)
5139 (* ------------------------------------------------------------------------- *)
5141 let WINDING_NUMBER_TRIANGLE = prove
5143 z IN interior(convex hull {a,b,c})
5144 ==> winding_number(linepath(a,b) ++ linepath(b,c) ++ linepath(c,a),z) =
5145 if &0 < Im((b - a) * cnj (b - z)) then Cx(&1) else --Cx(&1)`,
5147 (`!a b c. vec 0 IN interior(convex hull {a,b,c})
5148 ==> ~(Im(a / b) <= &0 /\ &0 <= Im(b / c))`,
5150 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN SIMP_TAC[] THEN
5151 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)
5152 [GSYM COMPLEX_INV_DIV] THEN
5153 REWRITE_TAC[IM_COMPLEX_INV_GE_0] THEN
5154 GEOM_BASIS_MULTIPLE_TAC 1 `b:complex` THEN
5155 REWRITE_TAC[COMPLEX_CMUL; COMPLEX_BASIS; GSYM CX_MUL; REAL_MUL_RID] THEN
5156 X_GEN_TAC `x:real` THEN GEN_REWRITE_TAC LAND_CONV [REAL_LE_LT] THEN
5157 REWRITE_TAC[IM_DIV_CX] THEN ASM_CASES_TAC `x = &0` THEN
5158 ASM_REWRITE_TAC[NOT_IN_INTERIOR_CONVEX_HULL_3; COMPLEX_VEC_0] THEN
5159 DISCH_TAC THEN REPEAT GEN_TAC THEN
5160 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_MUL_LZERO] THEN STRIP_TAC THEN
5161 MATCH_MP_TAC(SET_RULE
5162 `!s. ~(x IN s) /\ t SUBSET s ==> ~(x IN t)`) THEN
5163 EXISTS_TAC `interior {z | Im z <= &0}` THEN CONJ_TAC THENL
5164 [REWRITE_TAC[IM_DEF; INTERIOR_HALFSPACE_COMPONENT_LE] THEN
5165 REWRITE_TAC[GSYM COMPLEX_VEC_0; IN_ELIM_THM; VEC_COMPONENT] THEN
5167 MATCH_MP_TAC SUBSET_INTERIOR THEN MATCH_MP_TAC HULL_MINIMAL THEN
5168 REWRITE_TAC[CONVEX_HALFSPACE_IM_LE] THEN
5169 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_ELIM_THM] THEN
5170 REWRITE_TAC[IM_CX; REAL_LE_REFL]]) in
5172 (`z IN interior(convex hull {a,b,c})
5173 ==> &0 < Im((b - a) * cnj (b - z)) /\
5174 &0 < Im((c - b) * cnj (c - z)) /\
5175 &0 < Im((a - c) * cnj (a - z)) \/
5176 Im((b - a) * cnj (b - z)) < &0 /\
5177 &0 < Im((b - c) * cnj (b - z)) /\
5178 &0 < Im((a - b) * cnj (a - z)) /\
5179 &0 < Im((c - a) * cnj (c - z))`,
5180 GEOM_ORIGIN_TAC `z:complex` THEN
5181 REWRITE_TAC[VECTOR_SUB_RZERO; COMPLEX_SUB_RDISTRIB] THEN
5182 REWRITE_TAC[COMPLEX_MUL_CNJ; IM_SUB; GSYM CX_POW; IM_CX] THEN
5183 REWRITE_TAC[REAL_ARITH `&0 < &0 - x <=> x < &0`;
5184 REAL_ARITH `&0 - x < &0 <=> &0 < x`] THEN
5185 REWRITE_TAC[GSYM IM_COMPLEX_DIV_GT_0; GSYM IM_COMPLEX_DIV_LT_0] THEN
5186 REPEAT STRIP_TAC THEN
5187 GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [GSYM COMPLEX_INV_DIV] THEN
5188 REWRITE_TAC[IM_COMPLEX_INV_LT_0; IM_COMPLEX_INV_GT_0] THEN
5189 GEN_REWRITE_TAC (RAND_CONV o LAND_CONV o LAND_CONV o RAND_CONV)
5190 [GSYM COMPLEX_INV_DIV] THEN
5191 REWRITE_TAC[IM_COMPLEX_INV_LT_0] THEN
5192 MP_TAC(ISPECL [`a:complex`; `b:complex`; `c:complex`] lemma1) THEN
5193 MP_TAC(ISPECL [`b:complex`; `c:complex`; `a:complex`] lemma1) THEN
5194 MP_TAC(ISPECL [`c:complex`; `a:complex`; `b:complex`] lemma1) THEN
5195 POP_ASSUM MP_TAC THEN SIMP_TAC[INSERT_AC] THEN REAL_ARITH_TAC) in
5198 z IN interior(convex hull {a,b,c}) /\
5199 &0 < Im((b - a) * cnj (b - z)) /\
5200 &0 < Im((c - b) * cnj (c - z)) /\
5201 &0 < Im((a - c) * cnj (a - z))
5203 (linepath(a,b) ++ linepath(b,c) ++ linepath(c,a),z) = Cx(&1)`,
5204 REPEAT STRIP_TAC THEN
5205 MATCH_MP_TAC WINDING_NUMBER_EQ_1 THEN
5206 REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; CONJ_ASSOC;
5207 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
5209 [REWRITE_TAC[GSYM CONJ_ASSOC] THEN
5210 REPEAT(MATCH_MP_TAC WINDING_NUMBER_JOIN_POS_COMBINED THEN
5211 REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
5212 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
5214 ASM_SIMP_TAC[WINDING_NUMBER_LINEPATH_POS_LT; VALID_PATH_LINEPATH] THEN
5215 RULE_ASSUM_TAC(REWRITE_RULE
5216 [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
5217 ASM_REWRITE_TAC[PATH_IMAGE_LINEPATH];
5218 RULE_ASSUM_TAC(REWRITE_RULE
5219 [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
5220 ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_IMAGE_JOIN; PATH_JOIN; IN_UNION;
5221 PATH_LINEPATH; PATHSTART_JOIN; PATHFINISH_JOIN; RE_ADD;
5222 PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
5223 MATCH_MP_TAC(REAL_ARITH
5224 `abs a < &1 / &2 /\ abs b < &1 / &2 /\ abs c < &1 / &2
5225 ==> a + b + c < &2`) THEN
5226 REPEAT CONJ_TAC THEN MATCH_MP_TAC WINDING_NUMBER_LT_HALF_LINEPATH THEN
5227 ASM_REWRITE_TAC[]]) in
5228 REPEAT STRIP_TAC THEN
5229 FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP lemma2) THEN
5230 ASM_SIMP_TAC[lemma3; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
5233 (linepath(c,b) ++ linepath(b,a) ++ linepath(a,c),z) = Cx(&1)`
5235 [MATCH_MP_TAC lemma3 THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[INSERT_AC];
5236 COND_CASES_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC]] THEN
5237 DISCH_THEN(SUBST1_TAC o SYM) THEN CONV_TAC SYM_CONV THEN
5238 REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
5239 RULE_ASSUM_TAC(REWRITE_RULE
5240 [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
5241 FIRST_ASSUM(ASSUME_TAC o ONCE_REWRITE_RULE[SEGMENT_SYM] o CONJUNCT2) THEN
5242 ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_IMAGE_JOIN; PATH_JOIN; IN_UNION;
5243 PATH_LINEPATH; PATHSTART_JOIN; PATHFINISH_JOIN; RE_ADD;
5244 PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
5245 ASM_SIMP_TAC[COMPLEX_NEG_ADD; GSYM WINDING_NUMBER_REVERSEPATH;
5246 PATH_IMAGE_LINEPATH; PATH_LINEPATH; REVERSEPATH_LINEPATH] THEN
5247 CONV_TAC COMPLEX_RING);;
5249 (* ------------------------------------------------------------------------- *)
5250 (* Cauchy's integral formula, again for a convex enclosing set. *)
5251 (* ------------------------------------------------------------------------- *)
5253 let CAUCHY_INTEGRAL_FORMULA_WEAK = prove
5255 convex s /\ FINITE k /\ f continuous_on s /\
5256 (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x) /\
5257 z IN interior(s) DIFF k /\
5258 valid_path g /\ (path_image g) SUBSET (s DELETE z) /\
5259 pathfinish g = pathstart g
5260 ==> ((\w. f(w) / (w - z)) has_path_integral
5261 (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
5262 REWRITE_TAC[IN_DIFF] THEN REPEAT STRIP_TAC THEN
5263 FIRST_ASSUM(MP_TAC o SPEC `z:complex`) THEN ANTS_TAC THENL
5264 [ASM_REWRITE_TAC[]; ALL_TAC] THEN
5265 REWRITE_TAC[complex_differentiable; LEFT_IMP_EXISTS_THM] THEN
5266 X_GEN_TAC `f':complex` THEN DISCH_TAC THEN MP_TAC(SPECL
5267 [`\w:complex. if w = z then f' else (f w - f z) / (w - z)`;
5269 `(z:complex) INSERT k`;
5270 `g:real^1->complex`] CAUCHY_THEOREM_CONVEX) THEN
5271 REWRITE_TAC[IN_DIFF; IN_INSERT; DE_MORGAN_THM] THEN ANTS_TAC THENL
5272 [ASM_REWRITE_TAC[FINITE_INSERT] THEN REPEAT CONJ_TAC THENL
5274 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
5275 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_AT THEN
5276 EXISTS_TAC `\w:complex. (f w - f z) / (w - z)` THEN
5277 EXISTS_TAC `dist(w:complex,z)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
5278 CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC] THEN
5279 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
5280 ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
5281 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
5282 ASM_SIMP_TAC[ETA_AX; COMPLEX_DIFFERENTIABLE_CONST;
5283 COMPLEX_DIFFERENTIABLE_ID];
5285 REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN
5286 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
5287 ASM_CASES_TAC `w:complex = z` THENL
5289 MATCH_MP_TAC CONTINUOUS_TRANSFORM_WITHIN THEN
5290 EXISTS_TAC `\w:complex. (f w - f z) / (w - z)` THEN
5291 EXISTS_TAC `dist(w:complex,z)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
5292 CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC] THEN
5293 MATCH_MP_TAC CONTINUOUS_COMPLEX_DIV_WITHIN THEN
5294 RULE_ASSUM_TAC(REWRITE_RULE[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN]) THEN
5295 ASM_SIMP_TAC[CONTINUOUS_CONST; CONTINUOUS_SUB; CONTINUOUS_WITHIN_ID;
5296 ETA_AX; COMPLEX_SUB_0]] THEN
5297 FIRST_X_ASSUM SUBST_ALL_TAC THEN REWRITE_TAC[CONTINUOUS_WITHIN] THEN
5298 MATCH_MP_TAC LIM_TRANSFORM_AWAY_WITHIN THEN
5299 EXISTS_TAC `\w:complex. (f w - f z) / (w - z)` THEN SIMP_TAC[] THEN
5300 EXISTS_TAC `z + Cx(&1)` THEN
5301 CONJ_TAC THENL [CONV_TAC COMPLEX_RING; ALL_TAC] THEN
5302 REWRITE_TAC[GSYM HAS_COMPLEX_DERIVATIVE_WITHIN] THEN
5303 ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
5305 MP_TAC(SPECL [`g:real^1->complex`; `z:complex`]
5306 HAS_PATH_INTEGRAL_WINDING_NUMBER) THEN
5307 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5308 DISCH_THEN(MP_TAC o SPEC `(f:complex->complex) z` o MATCH_MP
5309 HAS_PATH_INTEGRAL_COMPLEX_LMUL) THEN REWRITE_TAC[IMP_IMP] THEN
5310 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_ADD) THEN
5311 REWRITE_TAC[COMPLEX_RING
5312 `f * Cx(&2) * a * b * c + Cx(&0) = Cx(&2) * a * b * c * f`] THEN
5313 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_EQ) THEN
5314 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
5315 SUBGOAL_THEN `~(w:complex = z)` MP_TAC THENL
5316 [ASM SET_TAC[]; ALL_TAC] THEN
5317 ASM_REWRITE_TAC[] THEN CONV_TAC COMPLEX_FIELD);;
5319 let CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE = prove
5321 convex s /\ f holomorphic_on s /\
5323 valid_path g /\ (path_image g) SUBSET (s DELETE z) /\
5324 pathfinish g = pathstart g
5325 ==> ((\w. f(w) / (w - z)) has_path_integral
5326 (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
5327 REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_INTEGRAL_FORMULA_WEAK THEN
5328 MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
5329 ASM_REWRITE_TAC[DIFF_EMPTY; FINITE_RULES] THEN
5330 SIMP_TAC[OPEN_INTERIOR; complex_differentiable; GSYM HOLOMORPHIC_ON_OPEN] THEN
5331 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
5332 HOLOMORPHIC_ON_SUBSET; INTERIOR_SUBSET]);;
5334 (* ------------------------------------------------------------------------- *)
5335 (* Homotopy forms of Cauchy's theorem. The first two proofs are almost the *)
5336 (* same and could potentially be unified with a little more work. *)
5337 (* ------------------------------------------------------------------------- *)
5339 let CAUCHY_THEOREM_HOMOTOPIC_PATHS = prove
5341 open s /\ f holomorphic_on s /\
5342 valid_path g /\ valid_path h /\ homotopic_paths s g h
5343 ==> path_integral g f = path_integral h f`,
5344 REPEAT STRIP_TAC THEN
5345 FIRST_ASSUM(ASSUME_TAC o SYM o MATCH_MP HOMOTOPIC_PATHS_IMP_PATHSTART) THEN
5346 FIRST_ASSUM(ASSUME_TAC o SYM o MATCH_MP HOMOTOPIC_PATHS_IMP_PATHFINISH) THEN
5347 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homotopic_paths]) THEN
5348 REWRITE_TAC[homotopic_with; LEFT_IMP_EXISTS_THM; PCROSS] THEN
5349 X_GEN_TAC `k:real^(1,1)finite_sum->complex` THEN STRIP_TAC THEN
5351 `!t. t IN interval[vec 0:real^1,vec 1]
5353 !t1 t2. t1 IN interval[vec 0:real^1,vec 1] /\
5354 t2 IN interval[vec 0,vec 1] /\
5355 norm(t1 - t) < e /\ norm(t2 - t) < e
5357 !g1 g2. valid_path g1 /\ valid_path g2 /\
5358 (!u. u IN interval[vec 0,vec 1]
5359 ==> norm(g1 u - k(pastecart t1 u)) < d /\
5360 norm(g2 u - k(pastecart t2 u)) < d) /\
5361 pathstart g1 = pathstart g /\
5362 pathfinish g1 = pathfinish g /\
5363 pathstart g2 = pathstart g /\
5364 pathfinish g2 = pathfinish g
5365 ==> path_image g1 SUBSET s /\
5366 path_image g2 SUBSET s /\
5367 path_integral g2 f = path_integral g1 f`
5369 [X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
5371 [`s:complex->bool`; `\u. (k:real^(1,1)finite_sum->complex)(pastecart t u)`]
5372 PATH_INTEGRAL_NEARBY_ENDS) THEN
5373 REWRITE_TAC[] THEN ANTS_TAC THENL
5374 [ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[GSYM o_DEF] THEN
5375 REWRITE_TAC[path_image; path; IMAGE_o] THEN CONJ_TAC THENL
5376 [ALL_TAC; ASM SET_TAC[]] THEN
5377 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5378 SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5379 CONTINUOUS_ON_CONST] THEN
5380 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5381 CONTINUOUS_ON_SUBSET)) THEN ASM SET_TAC[];
5382 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC)] THEN
5383 FIRST_ASSUM(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5384 COMPACT_UNIFORMLY_CONTINUOUS)) THEN
5385 SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS; COMPACT_INTERVAL] THEN
5386 REWRITE_TAC[uniformly_continuous_on] THEN
5387 DISCH_THEN(MP_TAC o SPEC `e / &4`) THEN
5388 ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5389 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
5390 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5391 REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
5392 REWRITE_TAC[FORALL_IN_GSPEC] THEN
5393 REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP; GSYM CONJ_ASSOC] THEN
5394 DISCH_THEN(MP_TAC o MATCH_MP (MESON[]
5395 `(!t x t' x'. P t x t' x') ==> (!t t' u. P t u t' u)`)) THEN
5396 REWRITE_TAC[dist; NORM_PASTECART; PASTECART_SUB] THEN
5397 REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5398 CONV_TAC REAL_RAT_REDUCE_CONV THEN
5399 REWRITE_TAC[TAUT `a /\ b /\ c /\ b /\ d <=> a /\ c /\ b /\ d`] THEN
5400 SIMP_TAC[REAL_ADD_RID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
5401 ASM_REWRITE_TAC[] THEN
5402 MAP_EVERY X_GEN_TAC [`t1:real^1`; `t2:real^1`] THEN
5403 STRIP_TAC THEN EXISTS_TAC `e / &4` THEN
5404 ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5405 MAP_EVERY X_GEN_TAC [`g1:real^1->complex`; `g2:real^1->complex`] THEN
5406 STRIP_TAC THEN FIRST_X_ASSUM
5407 (MP_TAC o SPECL [`g1:real^1->complex`; `g2:real^1->complex`]) THEN
5408 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
5409 X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN
5410 ASM_MESON_TAC[NORM_ARITH
5411 `norm(g1 - k1) < e / &4 /\ norm(g2 - k2) < e / &4 /\
5412 norm(k1 - kt) < e / &4 /\ norm(k2 - kt) < e / &4
5413 ==> norm(g1 - kt) < e /\ norm(g2 - kt) < e`];
5414 GEN_REWRITE_TAC (LAND_CONV o BINDER_CONV) [RIGHT_IMP_EXISTS_THM] THEN
5415 REWRITE_TAC[ SKOLEM_THM; LEFT_IMP_EXISTS_THM]] THEN
5416 X_GEN_TAC `ee:real^1->real` THEN DISCH_THEN(LABEL_TAC "*") THEN
5417 MP_TAC(ISPEC `interval[vec 0:real^1,vec 1]` COMPACT_IMP_HEINE_BOREL) THEN
5418 REWRITE_TAC[COMPACT_INTERVAL] THEN
5419 DISCH_THEN(MP_TAC o SPEC
5420 `IMAGE (\t:real^1. ball(t,ee t / &3)) (interval[vec 0,vec 1])`) THEN
5422 [REWRITE_TAC[FORALL_IN_IMAGE; OPEN_BALL; SUBSET] THEN
5423 X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
5424 REWRITE_TAC[UNIONS_IMAGE; IN_ELIM_THM] THEN EXISTS_TAC `t:real^1` THEN
5425 ASM_SIMP_TAC[CENTRE_IN_BALL; REAL_ARITH `&0 < e / &3 <=> &0 < e`];
5427 ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN
5428 REWRITE_TAC[CONJ_ASSOC; FINITE_SUBSET_IMAGE] THEN
5429 REWRITE_TAC[LEFT_AND_EXISTS_THM; MESON[]
5430 `(?f s. (P s /\ f = g s) /\ Q f) <=> ?s. P s /\ Q(g s)`] THEN
5431 REWRITE_TAC[UNIONS_IMAGE; LEFT_IMP_EXISTS_THM] THEN
5432 X_GEN_TAC `k:real^1->bool` THEN
5433 DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
5434 GEN_REWRITE_TAC LAND_CONV [SUBSET] THEN REWRITE_TAC[IN_ELIM_THM] THEN
5435 ASM_CASES_TAC `k:real^1->bool = {}` THENL
5436 [ASM_REWRITE_TAC[NOT_IN_EMPTY; GSYM NOT_EXISTS_THM; MEMBER_NOT_EMPTY] THEN
5437 REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN REAL_ARITH_TAC;
5438 DISCH_THEN(LABEL_TAC "+")] THEN
5439 SUBGOAL_THEN `!i:real^1. i IN k ==> &0 < ee(i)`
5440 ASSUME_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
5441 ABBREV_TAC `e = inf(IMAGE (ee:real^1->real) k)` THEN
5442 MP_TAC(ISPEC `IMAGE (ee:real^1->real) k` INF_FINITE) THEN
5443 MP_TAC(ISPECL [`IMAGE (ee:real^1->real) k`; `&0`]
5444 REAL_LT_INF_FINITE) THEN
5445 ASM_SIMP_TAC[FINITE_IMAGE; IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
5446 DISCH_TAC THEN DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
5447 MP_TAC(ISPEC `e / &3` REAL_ARCH_INV) THEN
5448 ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &3 <=> &0 < e`] THEN
5449 DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
5454 (!u. u IN interval [vec 0,vec 1]
5455 ==> norm(j u - k(pastecart (lift(&n / &N)) u)) < d) /\
5456 pathstart j = pathstart g /\
5457 pathfinish j = pathfinish g
5458 ==> path_image j SUBSET s /\
5459 path_integral j f = path_integral g f`
5460 (MP_TAC o SPEC `N:num`) THENL
5462 REWRITE_TAC[LE_REFL; LEFT_IMP_EXISTS_THM] THEN
5463 GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5464 DISCH_THEN(MP_TAC o SPEC `h:real^1->complex`) THEN
5465 ASM_SIMP_TAC[REAL_DIV_REFL; REAL_OF_NUM_EQ; LIFT_NUM] THEN
5466 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[]] THEN
5468 [REMOVE_THEN "*" (MP_TAC o SPEC `vec 0:real^1`) THEN
5469 ASM_REWRITE_TAC[real_div; REAL_MUL_LZERO; LE_0; LIFT_NUM] THEN
5470 REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL] THEN
5471 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5472 REPEAT(DISCH_THEN(MP_TAC o SPEC `vec 0:real^1`) THEN
5473 REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL]) THEN
5474 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5475 MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN STRIP_TAC THEN
5476 ASM_REWRITE_TAC[] THEN X_GEN_TAC `j:real^1->complex` THEN
5477 STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
5478 [`g:real^1->complex`; `j:real^1->complex`]) THEN
5479 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[];
5481 SUBGOAL_THEN `lift(&n / &N) IN interval[vec 0,vec 1] /\
5482 lift(&(SUC n) / &N) IN interval[vec 0,vec 1]`
5483 STRIP_ASSUME_TAC THENL
5484 [REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; LIFT_DROP] THEN
5485 ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
5486 REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_LID; REAL_OF_NUM_LE] THEN
5489 REMOVE_THEN "+" (MP_TAC o SPEC `lift(&n / &N)`) THEN ASM_REWRITE_TAC[] THEN
5490 DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC) THEN
5491 FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN
5492 ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
5493 DISCH_THEN(X_CHOOSE_THEN `d1:real`
5494 (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "1"))) THEN
5495 REMOVE_THEN "*" (MP_TAC o SPEC `t:real^1`) THEN
5496 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5497 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5498 DISCH_THEN(MP_TAC o SPECL [`lift(&n / &N)`; `lift(&(SUC n) / &N)`]) THEN
5499 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
5500 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
5501 MATCH_MP_TAC(NORM_ARITH
5502 `!e. norm(n' - n:real^N) < e / &3 /\ e <= ee
5503 ==> dist(t,n) < ee / &3 ==> norm(n - t) < ee /\ norm(n' - t) < ee`) THEN
5504 EXISTS_TAC `e:real` THEN
5505 REWRITE_TAC[NORM_REAL; GSYM drop; DROP_SUB; LIFT_DROP] THEN
5506 REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB] THEN
5507 SIMP_TAC[REAL_OF_NUM_SUB; ARITH_RULE `n <= SUC n`] THEN
5508 REWRITE_TAC[ARITH_RULE `SUC n - n = 1`; REAL_MUL_LID] THEN
5509 REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN
5510 ASM_SIMP_TAC[GSYM real_div];
5512 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d2:real` THEN
5513 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
5514 X_GEN_TAC `j:real^1->complex` THEN STRIP_TAC THEN
5516 [`\u:real^1. (k(pastecart (lift (&n / &N)) u):complex)`;
5517 `min d1 d2`] PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
5518 ASM_SIMP_TAC[REAL_LT_MIN; REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5520 [REWRITE_TAC[path] THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
5521 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5522 SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5523 CONTINUOUS_ON_CONST] THEN
5524 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5525 CONTINUOUS_ON_SUBSET)) THEN
5527 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC)] THEN
5528 REMOVE_THEN "1" (MP_TAC o SPEC `p:real^1->complex`) THEN
5529 ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN STRIP_TAC THEN
5530 FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `j:real^1->complex`]) THEN
5531 ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION]);;
5533 let CAUCHY_THEOREM_HOMOTOPIC_LOOPS = prove
5535 open s /\ f holomorphic_on s /\
5536 valid_path g /\ valid_path h /\ homotopic_loops s g h
5537 ==> path_integral g f = path_integral h f`,
5538 REPEAT STRIP_TAC THEN
5539 FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_LOOP) THEN
5540 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homotopic_loops]) THEN
5541 REWRITE_TAC[homotopic_with; PCROSS; LEFT_IMP_EXISTS_THM] THEN
5542 X_GEN_TAC `k:real^(1,1)finite_sum->complex` THEN STRIP_TAC THEN
5544 `!t. t IN interval[vec 0:real^1,vec 1]
5546 !t1 t2. t1 IN interval[vec 0:real^1,vec 1] /\
5547 t2 IN interval[vec 0,vec 1] /\
5548 norm(t1 - t) < e /\ norm(t2 - t) < e
5550 !g1 g2. valid_path g1 /\ valid_path g2 /\
5551 (!u. u IN interval[vec 0,vec 1]
5552 ==> norm(g1 u - k(pastecart t1 u)) < d /\
5553 norm(g2 u - k(pastecart t2 u)) < d) /\
5554 pathfinish g1 = pathstart g1 /\
5555 pathfinish g2 = pathstart g2
5556 ==> path_image g1 SUBSET s /\
5557 path_image g2 SUBSET s /\
5558 path_integral g2 f = path_integral g1 f`
5560 [X_GEN_TAC `t:real^1` THEN STRIP_TAC THEN
5562 [`s:complex->bool`; `\u. (k:real^(1,1)finite_sum->complex)(pastecart t u)`]
5563 PATH_INTEGRAL_NEARBY_LOOP) THEN
5564 REWRITE_TAC[] THEN ANTS_TAC THENL
5565 [ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[GSYM o_DEF] THEN
5566 REWRITE_TAC[path_image; path; IMAGE_o] THEN CONJ_TAC THENL
5567 [ALL_TAC; ASM SET_TAC[]] THEN
5568 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5569 SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5570 CONTINUOUS_ON_CONST] THEN
5571 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5572 CONTINUOUS_ON_SUBSET)) THEN ASM SET_TAC[];
5573 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC)] THEN
5574 FIRST_ASSUM(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5575 COMPACT_UNIFORMLY_CONTINUOUS)) THEN
5576 SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS; COMPACT_INTERVAL] THEN
5577 REWRITE_TAC[uniformly_continuous_on] THEN
5578 DISCH_THEN(MP_TAC o SPEC `e / &4`) THEN
5579 ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5580 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
5581 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5582 REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
5583 REWRITE_TAC[FORALL_IN_GSPEC] THEN
5584 REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP; GSYM CONJ_ASSOC] THEN
5585 DISCH_THEN(MP_TAC o MATCH_MP (MESON[]
5586 `(!t x t' x'. P t x t' x') ==> (!t t' u. P t u t' u)`)) THEN
5587 REWRITE_TAC[dist; NORM_PASTECART; PASTECART_SUB] THEN
5588 REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5589 CONV_TAC REAL_RAT_REDUCE_CONV THEN
5590 REWRITE_TAC[TAUT `a /\ b /\ c /\ b /\ d <=> a /\ c /\ b /\ d`] THEN
5591 SIMP_TAC[REAL_ADD_RID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
5592 ASM_REWRITE_TAC[] THEN
5593 MAP_EVERY X_GEN_TAC [`t1:real^1`; `t2:real^1`] THEN
5594 STRIP_TAC THEN EXISTS_TAC `e / &4` THEN
5595 ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5596 MAP_EVERY X_GEN_TAC [`g1:real^1->complex`; `g2:real^1->complex`] THEN
5597 STRIP_TAC THEN FIRST_X_ASSUM
5598 (MP_TAC o SPECL [`g1:real^1->complex`; `g2:real^1->complex`]) THEN
5599 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
5600 X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN
5601 ASM_MESON_TAC[NORM_ARITH
5602 `norm(g1 - k1) < e / &4 /\ norm(g2 - k2) < e / &4 /\
5603 norm(k1 - kt) < e / &4 /\ norm(k2 - kt) < e / &4
5604 ==> norm(g1 - kt) < e /\ norm(g2 - kt) < e`];
5605 GEN_REWRITE_TAC (LAND_CONV o BINDER_CONV) [RIGHT_IMP_EXISTS_THM] THEN
5606 REWRITE_TAC[ SKOLEM_THM; LEFT_IMP_EXISTS_THM]] THEN
5607 X_GEN_TAC `ee:real^1->real` THEN DISCH_THEN(LABEL_TAC "*") THEN
5608 MP_TAC(ISPEC `interval[vec 0:real^1,vec 1]` COMPACT_IMP_HEINE_BOREL) THEN
5609 REWRITE_TAC[COMPACT_INTERVAL] THEN
5610 DISCH_THEN(MP_TAC o SPEC
5611 `IMAGE (\t:real^1. ball(t,ee t / &3)) (interval[vec 0,vec 1])`) THEN
5613 [REWRITE_TAC[FORALL_IN_IMAGE; OPEN_BALL; SUBSET] THEN
5614 X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
5615 REWRITE_TAC[UNIONS_IMAGE; IN_ELIM_THM] THEN EXISTS_TAC `t:real^1` THEN
5616 ASM_SIMP_TAC[CENTRE_IN_BALL; REAL_ARITH `&0 < e / &3 <=> &0 < e`];
5618 ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN
5619 REWRITE_TAC[CONJ_ASSOC; FINITE_SUBSET_IMAGE] THEN
5620 REWRITE_TAC[LEFT_AND_EXISTS_THM; MESON[]
5621 `(?f s. (P s /\ f = g s) /\ Q f) <=> ?s. P s /\ Q(g s)`] THEN
5622 REWRITE_TAC[UNIONS_IMAGE; LEFT_IMP_EXISTS_THM] THEN
5623 X_GEN_TAC `k:real^1->bool` THEN
5624 DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
5625 GEN_REWRITE_TAC LAND_CONV [SUBSET] THEN REWRITE_TAC[IN_ELIM_THM] THEN
5626 ASM_CASES_TAC `k:real^1->bool = {}` THENL
5627 [ASM_REWRITE_TAC[NOT_IN_EMPTY; GSYM NOT_EXISTS_THM; MEMBER_NOT_EMPTY] THEN
5628 REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN REAL_ARITH_TAC;
5629 DISCH_THEN(LABEL_TAC "+")] THEN
5630 SUBGOAL_THEN `!i:real^1. i IN k ==> &0 < ee(i)`
5631 ASSUME_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
5632 ABBREV_TAC `e = inf(IMAGE (ee:real^1->real) k)` THEN
5633 MP_TAC(ISPEC `IMAGE (ee:real^1->real) k` INF_FINITE) THEN
5634 MP_TAC(ISPECL [`IMAGE (ee:real^1->real) k`; `&0`]
5635 REAL_LT_INF_FINITE) THEN
5636 ASM_SIMP_TAC[FINITE_IMAGE; IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
5637 DISCH_TAC THEN DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
5638 MP_TAC(ISPEC `e / &3` REAL_ARCH_INV) THEN
5639 ASM_REWRITE_TAC[REAL_ARITH `&0 < e / &3 <=> &0 < e`] THEN
5640 DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
5645 (!u. u IN interval [vec 0,vec 1]
5646 ==> norm(j u - k(pastecart (lift(&n / &N)) u)) < d) /\
5647 pathfinish j = pathstart j
5648 ==> path_image j SUBSET s /\
5649 path_integral j f = path_integral g f`
5650 (MP_TAC o SPEC `N:num`) THENL
5652 REWRITE_TAC[LE_REFL; LEFT_IMP_EXISTS_THM] THEN
5653 GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5654 DISCH_THEN(MP_TAC o SPEC `h:real^1->complex`) THEN
5655 ASM_SIMP_TAC[REAL_DIV_REFL; REAL_OF_NUM_EQ; LIFT_NUM] THEN
5656 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[]] THEN
5658 [REMOVE_THEN "*" (MP_TAC o SPEC `vec 0:real^1`) THEN
5659 ASM_REWRITE_TAC[real_div; REAL_MUL_LZERO; LE_0; LIFT_NUM] THEN
5660 REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL] THEN
5661 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5662 REPEAT(DISCH_THEN(MP_TAC o SPEC `vec 0:real^1`) THEN
5663 REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; REAL_POS; REAL_LE_REFL]) THEN
5664 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN
5665 MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN STRIP_TAC THEN
5666 ASM_REWRITE_TAC[] THEN X_GEN_TAC `j:real^1->complex` THEN
5667 STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
5668 [`g:real^1->complex`; `j:real^1->complex`]) THEN
5669 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THEN MESON_TAC[];
5671 SUBGOAL_THEN `lift(&n / &N) IN interval[vec 0,vec 1] /\
5672 lift(&(SUC n) / &N) IN interval[vec 0,vec 1]`
5673 STRIP_ASSUME_TAC THENL
5674 [REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; LIFT_DROP] THEN
5675 ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
5676 REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_LID; REAL_OF_NUM_LE] THEN
5679 REMOVE_THEN "+" (MP_TAC o SPEC `lift(&n / &N)`) THEN ASM_REWRITE_TAC[] THEN
5680 DISCH_THEN(X_CHOOSE_THEN `t:real^1` STRIP_ASSUME_TAC) THEN
5681 FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN
5682 ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
5683 DISCH_THEN(X_CHOOSE_THEN `d1:real`
5684 (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "1"))) THEN
5685 REMOVE_THEN "*" (MP_TAC o SPEC `t:real^1`) THEN
5686 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5687 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5688 DISCH_THEN(MP_TAC o SPECL [`lift(&n / &N)`; `lift(&(SUC n) / &N)`]) THEN
5689 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
5690 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
5691 MATCH_MP_TAC(NORM_ARITH
5692 `!e. norm(n' - n:real^N) < e / &3 /\ e <= ee
5693 ==> dist(t,n) < ee / &3 ==> norm(n - t) < ee /\ norm(n' - t) < ee`) THEN
5694 EXISTS_TAC `e:real` THEN
5695 REWRITE_TAC[NORM_REAL; GSYM drop; DROP_SUB; LIFT_DROP] THEN
5696 REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB] THEN
5697 SIMP_TAC[REAL_OF_NUM_SUB; ARITH_RULE `n <= SUC n`] THEN
5698 REWRITE_TAC[ARITH_RULE `SUC n - n = 1`; REAL_MUL_LID] THEN
5699 REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN
5700 ASM_SIMP_TAC[GSYM real_div];
5702 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d2:real` THEN
5703 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
5704 X_GEN_TAC `j:real^1->complex` THEN STRIP_TAC THEN
5706 [`\u:real^1. (k(pastecart (lift (&n / &N)) u):complex)`;
5707 `min d1 d2`] PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
5708 ASM_SIMP_TAC[REAL_LT_MIN; REAL_ARITH `&0 < e / &4 <=> &0 < e`] THEN
5710 [REWRITE_TAC[path] THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
5711 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
5712 SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
5713 CONTINUOUS_ON_CONST] THEN
5714 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5715 CONTINUOUS_ON_SUBSET)) THEN
5717 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC)] THEN
5718 REMOVE_THEN "1" (MP_TAC o SPEC `p:real^1->complex`) THEN
5719 ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN STRIP_TAC THEN
5720 FIRST_X_ASSUM(MP_TAC o SPECL [`p:real^1->complex`; `j:real^1->complex`]) THEN
5721 ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION]);;
5723 let CAUCHY_THEOREM_NULL_HOMOTOPIC = prove
5725 open s /\ f holomorphic_on s /\ a IN s /\ valid_path g /\
5726 homotopic_loops s g (linepath(a,a))
5727 ==> (f has_path_integral Cx(&0)) g`,
5728 REPEAT STRIP_TAC THEN
5729 FIRST_ASSUM(ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_SUBSET) THEN
5731 (MESON[HAS_PATH_INTEGRAL_INTEGRAL; path_integrable_on; PATH_INTEGRAL_UNIQUE]
5732 `!p. f path_integrable_on g /\ (f has_path_integral y) p /\
5733 path_integral g f = path_integral p f
5734 ==> (f has_path_integral y) g`) THEN
5735 EXISTS_TAC `linepath(a:complex,a)` THEN REPEAT CONJ_TAC THENL
5736 [ASM_MESON_TAC[PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE];
5737 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
5738 DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[] THEN
5739 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
5740 MATCH_MP_TAC CAUCHY_THEOREM_CONVEX_SIMPLE THEN
5741 EXISTS_TAC `ball(a:complex,e)` THEN
5742 ASM_REWRITE_TAC[VALID_PATH_LINEPATH; CONVEX_BALL; PATH_IMAGE_LINEPATH;
5743 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
5744 ASM_REWRITE_TAC[SEGMENT_REFL; SING_SUBSET; IN_BALL; CENTRE_IN_BALL] THEN
5745 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET];
5746 MATCH_MP_TAC CAUCHY_THEOREM_HOMOTOPIC_LOOPS THEN
5747 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[VALID_PATH_LINEPATH]]);;
5749 let CAUCHY_THEOREM_SIMPLY_CONNECTED = prove
5750 (`!f g s. open s /\ simply_connected s /\ f holomorphic_on s /\
5751 valid_path g /\ path_image g SUBSET s /\ pathfinish g = pathstart g
5752 ==> (f has_path_integral Cx(&0)) g`,
5753 REWRITE_TAC[SIMPLY_CONNECTED_EQ_CONTRACTIBLE_PATH] THEN REPEAT STRIP_TAC THEN
5754 MATCH_MP_TAC CAUCHY_THEOREM_NULL_HOMOTOPIC THEN
5755 MAP_EVERY EXISTS_TAC [`s:complex->bool`; `pathstart g :complex`] THEN
5756 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
5757 [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; SUBSET];
5758 MATCH_MP_TAC HOMOTOPIC_PATHS_IMP_HOMOTOPIC_LOOPS THEN
5759 ASM_SIMP_TAC[PATHFINISH_LINEPATH; VALID_PATH_IMP_PATH]]);;
5761 (* ------------------------------------------------------------------------- *)
5762 (* More winding number properties, including the fact that it's +-1 inside *)
5763 (* a simple closed curve. *)
5764 (* ------------------------------------------------------------------------- *)
5766 let WINDING_NUMBER_HOMOTOPIC_PATHS = prove
5767 (`!g h z. homotopic_paths ((:complex) DELETE z) g h
5768 ==> winding_number(g,z) = winding_number(h,z)`,
5769 REPEAT STRIP_TAC THEN
5770 FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_PATH) THEN
5771 FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_SUBSET) THEN
5772 REWRITE_TAC[SET_RULE `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5774 MP_TAC(ISPECL [`g:real^1->complex`; `(:complex) DELETE z`]
5775 HOMOTOPIC_NEARBY_PATHS) THEN
5776 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5777 `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5778 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
5779 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `d:real`]
5780 WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5781 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
5782 MP_TAC(ISPECL [`h:real^1->complex`; `(:complex) DELETE z`]
5783 HOMOTOPIC_NEARBY_PATHS) THEN
5784 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5785 `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5786 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
5787 MP_TAC(ISPECL [`h:real^1->complex`; `z:complex`; `e:real`]
5788 WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5789 DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
5791 `path_integral p (\w. Cx(&1) / (w - z)) =
5792 path_integral q (\w. Cx(&1) / (w - z))`
5794 [MATCH_MP_TAC CAUCHY_THEOREM_HOMOTOPIC_PATHS THEN
5795 EXISTS_TAC `(:complex) DELETE z` THEN
5796 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN CONJ_TAC THENL
5797 [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
5798 SIMP_TAC[HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID;
5799 HOLOMORPHIC_ON_SUB; IN_DELETE; COMPLEX_SUB_0];
5801 MATCH_MP_TAC HOMOTOPIC_PATHS_TRANS THEN
5802 EXISTS_TAC `g:real^1->complex` THEN CONJ_TAC THENL
5803 [ONCE_REWRITE_TAC[HOMOTOPIC_PATHS_SYM] THEN
5804 FIRST_X_ASSUM MATCH_MP_TAC THEN
5805 ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH];
5806 MATCH_MP_TAC HOMOTOPIC_PATHS_TRANS THEN
5807 EXISTS_TAC `h:real^1->complex` THEN ASM_REWRITE_TAC[] THEN
5808 FIRST_X_ASSUM MATCH_MP_TAC THEN
5809 ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH]];
5810 ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_RING]);;
5812 let WINDING_NUMBER_HOMOTOPIC_LOOPS = prove
5813 (`!g h z. homotopic_loops ((:complex) DELETE z) g h
5814 ==> winding_number(g,z) = winding_number(h,z)`,
5815 REPEAT STRIP_TAC THEN
5816 FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_PATH) THEN
5817 FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_LOOP) THEN
5818 FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_SUBSET) THEN
5819 REWRITE_TAC[SET_RULE `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5821 MP_TAC(ISPECL [`g:real^1->complex`; `(:complex) DELETE z`]
5822 HOMOTOPIC_NEARBY_LOOPS) THEN
5823 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5824 `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5825 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
5826 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`; `d:real`]
5827 WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5828 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
5829 MP_TAC(ISPECL [`h:real^1->complex`; `(:complex) DELETE z`]
5830 HOMOTOPIC_NEARBY_LOOPS) THEN
5831 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV; SET_RULE
5832 `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
5833 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
5834 MP_TAC(ISPECL [`h:real^1->complex`; `z:complex`; `e:real`]
5835 WINDING_NUMBER) THEN ASM_SIMP_TAC[] THEN
5836 DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
5838 `path_integral p (\w. Cx(&1) / (w - z)) =
5839 path_integral q (\w. Cx(&1) / (w - z))`
5841 [MATCH_MP_TAC CAUCHY_THEOREM_HOMOTOPIC_LOOPS THEN
5842 EXISTS_TAC `(:complex) DELETE z` THEN
5843 ASM_SIMP_TAC[OPEN_DELETE; OPEN_UNIV] THEN CONJ_TAC THENL
5844 [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
5845 SIMP_TAC[HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID;
5846 HOLOMORPHIC_ON_SUB; IN_DELETE; COMPLEX_SUB_0];
5848 MATCH_MP_TAC HOMOTOPIC_LOOPS_TRANS THEN
5849 EXISTS_TAC `g:real^1->complex` THEN CONJ_TAC THENL
5850 [ONCE_REWRITE_TAC[HOMOTOPIC_LOOPS_SYM] THEN
5851 FIRST_X_ASSUM MATCH_MP_TAC THEN
5852 ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH];
5853 MATCH_MP_TAC HOMOTOPIC_LOOPS_TRANS THEN
5854 EXISTS_TAC `h:real^1->complex` THEN ASM_REWRITE_TAC[] THEN
5855 FIRST_X_ASSUM MATCH_MP_TAC THEN
5856 ASM_MESON_TAC[NORM_SUB; VALID_PATH_IMP_PATH]];
5857 ASM_REWRITE_TAC[] THEN MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_RING]);;
5859 let WINDING_NUMBER_PATHS_LINEAR_EQ = prove
5862 pathstart h = pathstart g /\
5863 pathfinish h = pathfinish g /\
5864 (!t. t IN interval[vec 0,vec 1] ==> ~(z IN segment[g t,h t]))
5865 ==> winding_number(h,z) = winding_number(g,z)`,
5866 REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5867 MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
5868 MATCH_MP_TAC HOMOTOPIC_PATHS_LINEAR THEN ASM SET_TAC[]);;
5870 let WINDING_NUMBER_LOOPS_LINEAR_EQ = prove
5873 pathfinish g = pathstart g /\
5874 pathfinish h = pathstart h /\
5875 (!t. t IN interval[vec 0,vec 1] ==> ~(z IN segment[g t,h t]))
5876 ==> winding_number(h,z) = winding_number(g,z)`,
5877 REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5878 MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_LOOPS THEN
5879 MATCH_MP_TAC HOMOTOPIC_LOOPS_LINEAR THEN ASM SET_TAC[]);;
5881 let WINDING_NUMBER_NEARBY_PATHS_EQ = prove
5884 pathstart h = pathstart g /\
5885 pathfinish h = pathfinish g /\
5886 (!t. t IN interval[vec 0,vec 1] ==> norm(h t - g t) < norm(g t - z))
5887 ==> winding_number(h,z) = winding_number(g,z)`,
5888 REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5889 MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
5890 MATCH_MP_TAC HOMOTOPIC_PATHS_NEARBY_EXPLICIT THEN ASM SET_TAC[]);;
5892 let WINDING_NUMBER_NEARBY_LOOPS_EQ = prove
5895 pathfinish g = pathstart g /\
5896 pathfinish h = pathstart h /\
5897 (!t. t IN interval[vec 0,vec 1] ==> norm(h t - g t) < norm(g t - z))
5898 ==> winding_number(h,z) = winding_number(g,z)`,
5899 REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5900 MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_LOOPS THEN
5901 MATCH_MP_TAC HOMOTOPIC_LOOPS_NEARBY_EXPLICIT THEN ASM SET_TAC[]);;
5903 let WINDING_NUMBER_SUBPATH_COMBINE = prove
5905 path g /\ ~(z IN path_image g) /\
5906 u IN interval [vec 0,vec 1] /\
5907 v IN interval [vec 0,vec 1] /\
5908 w IN interval [vec 0,vec 1]
5909 ==> winding_number(subpath u v g,z) +
5910 winding_number(subpath v w g,z) =
5911 winding_number(subpath u w g,z)`,
5912 REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
5913 EXISTS_TAC `winding_number(subpath u v g ++ subpath v w g,z)` THEN
5915 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC WINDING_NUMBER_JOIN THEN
5916 ASM_SIMP_TAC[PATH_SUBPATH; PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
5917 ASM_MESON_TAC[SUBSET; PATH_IMAGE_SUBPATH_SUBSET];
5918 MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
5919 MATCH_MP_TAC HOMOTOPIC_JOIN_SUBPATHS THEN
5920 ASM_REWRITE_TAC[] THEN ASM SET_TAC[]]);;
5922 let WINDING_NUMBER_STRONG = prove
5924 path g /\ ~(z IN path_image g) /\ &0 < e
5925 ==> ?p. vector_polynomial_function p /\ valid_path p /\
5926 ~(z IN path_image p) /\
5927 pathstart p = pathstart g /\
5928 pathfinish p = pathfinish g /\
5929 (!t. t IN interval[vec 0,vec 1] ==> norm(g t - p t) < e) /\
5930 path_integral p (\w. Cx(&1) / (w - z)) =
5931 Cx(&2) * Cx(pi) * ii * winding_number(g,z)`,
5932 REPEAT STRIP_TAC THEN
5935 !t. t IN interval[vec 0,vec 1] ==> d <= norm((g:real^1->complex) t - z)`
5936 STRIP_ASSUME_TAC THENL
5937 [EXISTS_TAC `setdist({z:complex},path_image g)` THEN
5938 REWRITE_TAC[SETDIST_POS_LE; REAL_ARITH
5939 `&0 < x <=> &0 <= x /\ ~(x = &0)`] THEN
5940 ASM_SIMP_TAC[SETDIST_EQ_0_CLOSED_COMPACT; CLOSED_SING; COMPACT_PATH_IMAGE;
5941 PATH_IMAGE_NONEMPTY] THEN
5942 CONJ_TAC THENL [ASM SET_TAC[]; REPEAT STRIP_TAC] THEN
5943 REWRITE_TAC[ONCE_REWRITE_RULE[DIST_SYM] (GSYM dist)] THEN
5944 MATCH_MP_TAC SETDIST_LE_DIST THEN REWRITE_TAC[path_image] THEN
5946 MP_TAC(ISPECL [`g:real^1->complex`; `min d e`]
5947 PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
5948 ASM_REWRITE_TAC[REAL_LT_MIN] THEN MATCH_MP_TAC MONO_EXISTS THEN
5949 X_GEN_TAC `p:real^1->complex` THEN STRIP_TAC THEN
5950 ONCE_REWRITE_TAC[NORM_SUB] THEN
5951 ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
5952 MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
5953 [REWRITE_TAC[path_image; IN_IMAGE] THEN
5954 ASM_MESON_TAC[NORM_SUB; REAL_NOT_LT];
5955 DISCH_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
5956 `!w'. ~(a * b * c = Cx(&0)) /\ w' = w /\ w' = Cx(&1) / (a * b * c) * i
5957 ==> i = a * b * c * w`) THEN
5958 EXISTS_TAC `winding_number(p,z)` THEN
5959 REWRITE_TAC[CX_2PII_NZ] THEN CONJ_TAC THENL
5960 [MATCH_MP_TAC WINDING_NUMBER_NEARBY_PATHS_EQ; ALL_TAC] THEN
5961 ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; VALID_PATH_IMP_PATH;
5962 VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
5963 ASM_MESON_TAC[REAL_LTE_TRANS; NORM_SUB]]]);;
5965 let WINDING_NUMBER_FROM_INNERPATH = prove
5966 (`!c1 c2 c a b z:complex d.
5968 simple_path c1 /\ pathstart c1 = a /\ pathfinish c1 = b /\
5969 simple_path c2 /\ pathstart c2 = a /\ pathfinish c2 = b /\
5970 simple_path c /\ pathstart c = a /\ pathfinish c = b /\
5971 path_image c1 INTER path_image c2 = {a,b} /\
5972 path_image c1 INTER path_image c = {a,b} /\
5973 path_image c2 INTER path_image c = {a,b} /\
5974 ~(path_image c INTER inside(path_image c1 UNION path_image c2) = {}) /\
5975 z IN inside(path_image c1 UNION path_image c) /\
5976 winding_number(c1 ++ reversepath c,z) = d /\ ~(d = Cx(&0))
5977 ==> z IN inside(path_image c1 UNION path_image c2) /\
5978 winding_number(c1 ++ reversepath c2,z) = d`,
5979 REPEAT GEN_TAC THEN STRIP_TAC THEN
5980 MP_TAC(ISPECL [`c1:real^1->complex`; `c2:real^1->complex`;
5981 `c:real^1->complex`; `a:complex`; `b:complex`]
5982 SPLIT_INSIDE_SIMPLE_CLOSED_CURVE) THEN
5983 ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
5984 CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
5985 UNDISCH_TAC `winding_number(c1 ++ reversepath c,z) = d` THEN
5987 [`c ++ reversepath(c2:real^1->complex)`; `z:complex`]
5988 WINDING_NUMBER_ZERO_IN_OUTSIDE) THEN
5990 `~((z:complex) IN path_image c) /\
5991 ~(z IN path_image c1) /\
5992 ~(z IN path_image c2)`
5993 STRIP_ASSUME_TAC THENL
5994 [MP_TAC(ISPEC `(path_image c1 UNION path_image c):complex->bool`
5995 INSIDE_NO_OVERLAP) THEN
5996 MP_TAC(ISPEC `(path_image c1 UNION path_image c2):complex->bool`
5997 INSIDE_NO_OVERLAP) THEN
5999 ASM_SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_JOIN;
6000 PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH; PATH_IMAGE_REVERSEPATH;
6001 PATH_JOIN; PATH_REVERSEPATH; SIMPLE_PATH_IMP_PATH;
6002 WINDING_NUMBER_JOIN; WINDING_NUMBER_REVERSEPATH] THEN
6004 [ASM_REWRITE_TAC[OUTSIDE_INSIDE; IN_DIFF; IN_UNION; IN_UNIV] THEN
6005 ONCE_REWRITE_TAC[UNION_COMM] THEN ASM SET_TAC[];
6006 CONV_TAC COMPLEX_RING]]);;
6008 let SIMPLE_CLOSED_PATH_WINDING_NUMBER_INSIDE = prove
6010 ==> (!z. z IN inside(path_image g) ==> winding_number(g,z) = Cx(&1)) \/
6011 (!z. z IN inside(path_image g) ==> winding_number(g,z) = --Cx(&1))`,
6015 simple_path(p ++ linepath(a - e % basis 1,a + e % basis 1)) /\
6016 pathstart p = a + e % basis 1 /\ pathfinish p = a - e % basis 1 /\
6017 ball(a,e) INTER path_image p = {}
6018 ==> ?z. z IN inside(path_image
6019 (p ++ linepath(a - e % basis 1,a + e % basis 1))) /\
6021 (p ++ linepath(a - e % basis 1,a + e % basis 1),z)) = &1`,
6022 REPEAT STRIP_TAC THEN
6024 [`p:real^1->complex`; `linepath(a - e % basis 1,a + e % basis 1)`]
6025 SIMPLE_PATH_JOIN_LOOP_EQ) THEN
6026 ASM_REWRITE_TAC[PATHFINISH_LINEPATH; PATHSTART_LINEPATH] THEN
6029 `(a:complex) IN frontier(inside
6030 (path_image(p ++ linepath(a - e % basis 1,a + e % basis 1))))`
6033 (MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] JORDAN_INSIDE_OUTSIDE)) THEN
6034 ASM_REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
6035 PATHFINISH_LINEPATH] THEN
6036 STRIP_TAC THEN ASM_SIMP_TAC[PATH_IMAGE_JOIN; PATHSTART_LINEPATH] THEN
6037 REWRITE_TAC[IN_UNION; PATH_IMAGE_LINEPATH] THEN DISJ2_TAC THEN
6038 REWRITE_TAC[IN_SEGMENT] THEN EXISTS_TAC `&1 / &2` THEN
6039 CONV_TAC REAL_RAT_REDUCE_CONV THEN VECTOR_ARITH_TAC;
6041 REWRITE_TAC[FRONTIER_STRADDLE] THEN
6042 DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
6043 DISCH_THEN(X_CHOOSE_THEN `c:complex` STRIP_ASSUME_TAC o CONJUNCT1) THEN
6045 `path_image (p ++ linepath(a - e % basis 1:complex,a + e % basis 1))`
6046 INSIDE_NO_OVERLAP) THEN
6047 REWRITE_TAC[EXTENSION] THEN DISCH_THEN(MP_TAC o SPEC `c:complex`) THEN
6048 ASM_REWRITE_TAC[IN_INTER; NOT_IN_EMPTY] THEN
6049 ASM_SIMP_TAC[PATH_IMAGE_JOIN; PATHSTART_LINEPATH; PATH_IMAGE_LINEPATH] THEN
6050 REWRITE_TAC[IN_UNION; DE_MORGAN_THM] THEN
6051 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6052 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [SEGMENT_AS_BALL] THEN
6053 ASM_REWRITE_TAC[IN_INTER;
6054 VECTOR_ARITH `inv(&2) % ((a - e) + (a + e)):complex = a`;
6055 VECTOR_ARITH `(a + e) - (a - e):complex = &2 % e`] THEN
6056 ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6057 ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> (abs(&2) * abs e * &1) / &2 = e`] THEN
6058 ASM_SIMP_TAC[IN_CBALL; REAL_LT_IMP_LE] THEN STRIP_TAC THEN
6060 `~collinear{a - e % basis 1,c:complex,a + e % basis 1}`
6063 [`a - e % basis 1:complex`; `a + e % basis 1:complex`; `c:complex`]
6064 COLLINEAR_3_AFFINE_HULL) THEN
6065 ASM_SIMP_TAC[VECTOR_ARITH `a - x:complex = a + x <=> x = vec 0`;
6066 BASIS_NONZERO; DIMINDEX_2; ARITH; VECTOR_MUL_EQ_0;
6067 REAL_LT_IMP_NZ] THEN
6068 REWRITE_TAC[INSERT_AC];
6071 `~(interior(convex hull {a - e % basis 1,c:complex,a + e % basis 1}) = {})`
6073 [ASM_SIMP_TAC[INTERIOR_CONVEX_HULL_3_MINIMAL] THEN
6074 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN
6075 REPEAT(ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN EXISTS_TAC `&1 / &3`) THEN
6076 CONV_TAC REAL_RAT_REDUCE_CONV THEN MESON_TAC[];
6078 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN
6079 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
6080 FIRST_ASSUM(MP_TAC o AP_TERM `norm:complex->real` o
6081 MATCH_MP WINDING_NUMBER_TRIANGLE) THEN
6082 REWRITE_TAC[] THEN ONCE_REWRITE_TAC[COND_RAND] THEN
6083 REWRITE_TAC[NORM_NEG; COND_ID; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
6086 [`linepath(a + e % basis 1:complex,a - e % basis 1)`;
6087 `p:real^1->complex`;
6088 `linepath(a + e % basis 1:complex,c) ++ linepath(c,a - e % basis 1)`;
6089 `a + e % basis 1:complex`; `a - e % basis 1:complex`;
6092 (linepath(a - e % basis 1,c) ++
6093 linepath(c,a + e % basis 1) ++
6094 linepath(a + e % basis 1,a - e % basis 1),
6095 z)`] WINDING_NUMBER_FROM_INNERPATH) THEN
6096 ASM_SIMP_TAC[SIMPLE_PATH_LINEPATH; PATHSTART_JOIN; PATHFINISH_JOIN;
6097 VECTOR_ARITH `a + x:complex = a - x <=> x = vec 0`;
6098 BASIS_NONZERO; DIMINDEX_2; ARITH; VECTOR_MUL_EQ_0;
6099 REAL_LT_IMP_NZ; PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
6100 ARC_IMP_SIMPLE_PATH; PATH_IMAGE_JOIN; PATH_IMAGE_LINEPATH] THEN
6104 `(p ==> p') /\ (p /\ q ==> q') ==> p /\ q ==> p' /\ q'`) THEN
6105 CONJ_TAC THENL [MESON_TAC[UNION_COMM; SEGMENT_SYM]; ALL_TAC] THEN
6106 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (SUBST_ALL_TAC o SYM)) THEN
6107 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
6108 `norm(z:complex) = &1 ==> u = --z ==> norm u = &1`)) THEN
6109 GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV)
6110 [GSYM REVERSEPATH_LINEPATH] THEN
6111 ASM_SIMP_TAC[GSYM REVERSEPATH_JOINPATHS; PATHSTART_LINEPATH] THEN
6112 ONCE_REWRITE_TAC[COMPLEX_RING `a:complex = --b <=> b = --a`] THEN
6113 MATCH_MP_TAC WINDING_NUMBER_REVERSEPATH THEN
6114 ASM_SIMP_TAC[PATH_JOIN; PATHSTART_LINEPATH; PATH_IMAGE_JOIN;
6115 PATH_LINEPATH; ARC_IMP_PATH; PATH_IMAGE_LINEPATH] THEN
6116 ONCE_REWRITE_TAC[SEGMENT_SYM] THEN ONCE_REWRITE_TAC[UNION_COMM] THEN
6117 ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]] THEN
6118 REPEAT CONJ_TAC THENL
6119 [MATCH_MP_TAC ARC_IMP_SIMPLE_PATH THEN MATCH_MP_TAC ARC_JOIN THEN
6120 REWRITE_TAC[ARC_LINEPATH_EQ; PATHSTART_LINEPATH;
6121 PATHFINISH_LINEPATH] THEN
6122 REPEAT(CONJ_TAC THENL
6123 [DISCH_THEN SUBST_ALL_TAC THEN
6124 RULE_ASSUM_TAC(REWRITE_RULE[INSERT_AC; COLLINEAR_2]) THEN
6125 FIRST_X_ASSUM CONTR_TAC;
6127 REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
6128 MATCH_MP_TAC(SET_RULE `s = t ==> s SUBSET t`) THEN
6129 MATCH_MP_TAC INTER_SEGMENT THEN ASM_MESON_TAC[INSERT_AC];
6130 REWRITE_TAC[SEGMENT_CLOSED_OPEN] THEN
6131 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6133 ==> s SUBSET b /\ k SUBSET p
6134 ==> (s UNION k) INTER p = k`)) THEN
6136 [REWRITE_TAC[SUBSET; IN_SEGMENT; IN_BALL] THEN
6137 REWRITE_TAC[VECTOR_ARITH
6138 `(&1 - u) % (a + e) + u % (a - e):complex =
6139 a + (&1 - &2 * u) % e`] THEN
6140 REPEAT STRIP_TAC THEN
6141 ASM_REWRITE_TAC[NORM_ARITH `dist(a:complex,a + e) = norm e`] THEN
6142 SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6143 MATCH_MP_TAC(REAL_ARITH
6144 `x * e < &1 * e /\ &0 < e ==> x * abs e * &1 < e`) THEN
6145 ASM_SIMP_TAC[REAL_LT_RMUL_EQ] THEN ASM_REAL_ARITH_TAC;
6146 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET] THEN
6147 ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE]];
6148 MATCH_MP_TAC(SET_RULE
6149 `s INTER t1 = {a} /\ s INTER t2 = {b}
6150 ==> s INTER (t1 UNION t2) = {a,b}`) THEN
6152 [GEN_REWRITE_TAC (LAND_CONV o LAND_CONV) [SEGMENT_SYM];
6153 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [SEGMENT_SYM]] THEN
6154 MATCH_MP_TAC INTER_SEGMENT THEN DISJ2_TAC THEN
6155 ASM_MESON_TAC[INSERT_AC];
6156 MATCH_MP_TAC(SET_RULE
6157 `s INTER t1 = {a} /\ s INTER t2 = {b}
6158 ==> s INTER (t1 UNION t2) = {a,b}`) THEN
6159 CONJ_TAC THENL [ONCE_REWRITE_TAC[SEGMENT_SYM]; ALL_TAC] THEN
6160 REWRITE_TAC[SEGMENT_CLOSED_OPEN] THEN
6161 MATCH_MP_TAC(SET_RULE
6162 `b IN p /\ ~(c IN p) /\ p INTER s = {}
6163 ==> p INTER (s UNION {c,b}) = {b}`) THEN
6165 [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE];
6166 ASM_REWRITE_TAC[]]) THEN
6167 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6168 `b INTER p = {} ==> s SUBSET b ==> p INTER s = {}`)) THEN
6169 REWRITE_TAC[GSYM INTERIOR_CBALL] THEN
6170 MATCH_MP_TAC IN_INTERIOR_CLOSURE_CONVEX_SEGMENT THEN
6171 ASM_REWRITE_TAC[CONVEX_CBALL; INTERIOR_CBALL; IN_BALL] THEN
6172 MATCH_MP_TAC(REWRITE_RULE[SUBSET] CLOSURE_SUBSET) THEN
6173 REWRITE_TAC[IN_CBALL;
6174 NORM_ARITH `dist(a:complex,a - e) = norm e`;
6175 NORM_ARITH `dist(a:complex,a + e) = norm e`] THEN
6176 ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6178 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `c:complex` THEN
6179 REWRITE_TAC[IN_INTER; ENDS_IN_SEGMENT; IN_UNION] THEN
6180 FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6181 `c IN s ==> s = t ==> c IN t`)) THEN
6182 ASM_SIMP_TAC[PATH_IMAGE_JOIN; PATHSTART_LINEPATH] THEN
6183 REWRITE_TAC[UNION_COMM; PATH_IMAGE_LINEPATH; SEGMENT_SYM];
6184 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [GSYM
6185 INSIDE_OF_TRIANGLE]) THEN
6186 REWRITE_TAC[UNION_ACI; SEGMENT_SYM];
6187 ASM_SIMP_TAC[REVERSEPATH_JOINPATHS; PATHSTART_JOIN; PATHFINISH_JOIN;
6188 PATHSTART_LINEPATH; PATHFINISH_LINEPATH; REVERSEPATH_LINEPATH] THEN
6189 RULE_ASSUM_TAC(REWRITE_RULE
6190 [INTERIOR_OF_TRIANGLE; IN_DIFF; IN_UNION; DE_MORGAN_THM]) THEN
6191 ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_JOIN; PATH_LINEPATH;
6192 PATH_IMAGE_JOIN; IN_UNION; PATHSTART_JOIN; PATHFINISH_JOIN;
6193 PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
6194 CONV_TAC COMPLEX_RING;
6195 DISCH_THEN SUBST_ALL_TAC THEN
6196 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE LAND_CONV [COMPLEX_NORM_CX]) THEN
6201 simple_path(p ++ linepath(a - d % basis 1,a + e % basis 1)) /\
6202 pathstart p = a + e % basis 1 /\ pathfinish p = a - d % basis 1
6203 ==> ?z. z IN inside(path_image
6204 (p ++ linepath(a - d % basis 1,a + e % basis 1))) /\
6206 (p ++ linepath(a - d % basis 1,a + e % basis 1),z)) = &1`,
6207 REPEAT STRIP_TAC THEN
6209 [`p:real^1->complex`; `linepath(a - d % basis 1,a + e % basis 1)`]
6210 SIMPLE_PATH_JOIN_LOOP_EQ) THEN
6211 ASM_REWRITE_TAC[PATHFINISH_LINEPATH; PATHSTART_LINEPATH] THEN
6212 REWRITE_TAC[ARC_LINEPATH_EQ; PATH_IMAGE_LINEPATH] THEN STRIP_TAC THEN
6213 SUBGOAL_THEN `~((a:complex) IN path_image p)` ASSUME_TAC THENL
6214 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6215 `p INTER s SUBSET {d,e}
6216 ==> a IN s /\ ~(d = a) /\ ~(e = a) ==> ~(a IN p)`)) THEN
6217 REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6218 REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6219 NORM_ARITH `dist(a - d:complex,a) + dist(a,a + e) = norm(d) + norm(e)`;
6220 VECTOR_ARITH `a + e:complex = a <=> e = vec 0`;
6221 VECTOR_ARITH `a - d:complex = a <=> d = vec 0`] THEN
6222 SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; NORM_MUL; VECTOR_MUL_EQ_0] THEN
6223 ASM_SIMP_TAC[BASIS_NONZERO; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6226 MP_TAC(ISPEC `(:complex) DIFF path_image p` OPEN_CONTAINS_BALL) THEN
6227 ASM_SIMP_TAC[GSYM closed; CLOSED_ARC_IMAGE; IN_UNIV; IN_DIFF] THEN
6228 DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[] THEN
6229 REWRITE_TAC[SET_RULE `s SUBSET UNIV DIFF t <=> s INTER t = {}`] THEN
6230 DISCH_THEN(X_CHOOSE_THEN `k:real` STRIP_ASSUME_TAC) THEN
6231 ABBREV_TAC `kde:real = min k (min d e) / &2` THEN
6232 SUBGOAL_THEN `&0 < kde /\ kde < k /\ kde < d /\ kde < e`
6233 STRIP_ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
6235 [`linepath(a + kde % basis 1,a + e % basis 1) ++ p ++
6236 linepath(a - d % basis 1,a - kde % basis 1)`;
6237 `a:complex`; `kde:real`] lemma1) THEN
6238 ASM_SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_JOIN;
6239 PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH;
6240 SIMPLE_PATH_JOIN_LOOP_EQ] THEN
6242 [REPEAT CONJ_TAC THENL
6243 [MATCH_MP_TAC ARC_JOIN THEN
6244 ASM_SIMP_TAC[ARC_JOIN_EQ; PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
6245 PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_LINEPATH;
6246 ARC_LINEPATH_EQ; PATH_IMAGE_JOIN] THEN
6247 REWRITE_TAC[VECTOR_ARITH `a + e:complex = a + d <=> e - d = vec 0`;
6248 VECTOR_ARITH `a - d:complex = a - e <=> e - d = vec 0`] THEN
6249 REWRITE_TAC[GSYM VECTOR_SUB_RDISTRIB; VECTOR_MUL_EQ_0; REAL_SUB_0] THEN
6250 ASM_SIMP_TAC[BASIS_NONZERO; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6251 ASM_SIMP_TAC[REAL_LT_IMP_NE] THEN
6252 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6253 `p INTER de SUBSET {e,d}
6254 ==> dk SUBSET de /\ ke SUBSET de /\ ~(e IN dk) /\ ~(d IN ke) /\
6256 ==> p INTER dk SUBSET {d} /\ ke INTER (p UNION dk) SUBSET {e}`)) THEN
6257 REWRITE_TAC[SUBSET_SEGMENT; ENDS_IN_SEGMENT] THEN
6258 REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6259 REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e) /\
6260 dist(a + d,a - e) = norm(d + e) /\
6261 dist(a - d,a - e) = norm(d - e) /\
6262 dist(a + d,a + e) = norm(d - e)`] THEN
6263 REWRITE_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB] THEN
6264 ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6265 REPEAT(CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC]) THEN
6266 REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_INTER; NOT_IN_EMPTY] THEN
6267 MATCH_MP_TAC(MESON[REAL_LT_ANTISYM]
6268 `!a:complex. (!x. x IN t ==> x$1 < a$1) /\ (!x. x IN s ==> a$1 < x$1)
6269 ==> !x. ~(x IN s /\ x IN t)`) THEN
6270 EXISTS_TAC `a:complex` THEN
6271 SIMP_TAC[IN_SEGMENT; LEFT_IMP_EXISTS_THM] THEN
6272 SIMP_TAC[VECTOR_SUB_COMPONENT; VECTOR_ADD_COMPONENT;
6273 VECTOR_MUL_COMPONENT; BASIS_COMPONENT; DIMINDEX_2; ARITH] THEN
6274 REWRITE_TAC[REAL_ARITH
6275 `(a < (&1 - u) * (a + x) + u * (a + y) <=>
6276 &0 < (&1 - u) * x + u * y) /\
6277 ((&1 - u) * (a - x) + u * (a - y) < a <=>
6278 &0 < (&1 - u) * x + u * y)`] THEN
6279 REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_MUL_RID] THEN
6280 REWRITE_TAC[REAL_ARITH `&0 < (&1 - u) * x + u * y <=>
6281 (&1 - u) * --x + u * --y < &0`] THEN
6282 MATCH_MP_TAC REAL_CONVEX_BOUND_LT THEN ASM_REAL_ARITH_TAC;
6283 REWRITE_TAC[ARC_LINEPATH_EQ; VECTOR_MUL_EQ_0;
6284 VECTOR_ARITH `a - k:complex = a + k <=> k = vec 0`] THEN
6285 ASM_SIMP_TAC[REAL_LT_IMP_NZ; BASIS_NONZERO; DIMINDEX_2; ARITH];
6286 MATCH_MP_TAC(SET_RULE
6287 `kk INTER p = {} /\ kk INTER ke = {kp} /\ dk INTER kk = {kn}
6288 ==> (ke UNION p UNION dk) INTER kk SUBSET {kp,kn}`) THEN
6290 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6291 `b INTER p = {} ==> s SUBSET b ==> s INTER p = {}`)) THEN
6292 SIMP_TAC[SUBSET; IN_SEGMENT; IN_BALL; LEFT_IMP_EXISTS_THM] THEN
6293 REWRITE_TAC[VECTOR_ARITH
6294 `(&1 - u) % (a - d) + u % (a + d):complex = a - (&1 - &2 * u) % d`;
6295 NORM_ARITH `dist(a:complex,a - d) = norm d`] THEN
6296 REPEAT STRIP_TAC THEN
6297 SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6298 MATCH_MP_TAC(REAL_ARITH
6299 `&0 < kd /\ a * kd <= &1 * kd /\ kd < k
6300 ==> a * abs kd * &1 < k`) THEN
6301 ASM_SIMP_TAC[REAL_LE_RMUL_EQ] THEN ASM_REAL_ARITH_TAC;
6302 CONJ_TAC THEN MATCH_MP_TAC INTER_SEGMENT THEN DISJ1_TAC THEN
6303 REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6304 REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e) /\
6305 dist(a + d,a - e) = norm(d + e) /\
6306 dist(a - d,a - e) = norm(d - e) /\
6307 dist(a + d,a + e) = norm(d - e)`] THEN
6308 REWRITE_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB] THEN
6309 ASM_SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6310 ASM_REAL_ARITH_TAC];
6311 REWRITE_TAC[UNION_OVER_INTER; EMPTY_UNION] THEN
6312 ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN CONJ_TAC THENL
6313 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6314 `b INTER p = {} ==> c SUBSET b ==> c INTER p = {}`)) THEN
6315 MATCH_MP_TAC SUBSET_BALL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE];
6317 REWRITE_TAC[SET_RULE `s INTER t = {} <=>
6318 !x. x IN t ==> ~(x IN s)`] THEN
6319 SIMP_TAC[IN_SEGMENT; LEFT_IMP_EXISTS_THM; IN_BALL] THEN
6320 REWRITE_TAC[VECTOR_ARITH
6321 `(&1 - u) % (a - d) + u % (a - e):complex =
6322 a - ((&1 - u) % d + u % e) /\
6323 (&1 - u) % (a + d) + u % (a + e):complex =
6324 a + ((&1 - u) % d + u % e)`;
6326 `dist(a:complex,a + d) = norm d /\ dist(a,a - e) = norm e`] THEN
6327 REWRITE_TAC[VECTOR_MUL_ASSOC; GSYM VECTOR_ADD_RDISTRIB] THEN
6328 SIMP_TAC[NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6329 REWRITE_TAC[REAL_NOT_LT; REAL_MUL_RID] THEN REPEAT STRIP_TAC THEN
6330 MATCH_MP_TAC(REAL_ARITH `x <= y ==> x <= abs y`) THEN
6331 REWRITE_TAC[REAL_ARITH
6332 `(k <= (&1 - u) * k + u * e <=> &0 <= u * (e - k)) /\
6333 (k <= (&1 - u) * d + u * k <=> &0 <= (&1 - u) * (d - k))`] THEN
6334 MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC];
6336 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN
6338 `(p <=> p') /\ (p /\ p' ==> (q <=> q')) ==> p /\ q ==> p' /\ q'`) THEN
6340 [AP_TERM_TAC THEN AP_TERM_TAC THEN
6341 ONCE_REWRITE_TAC[SET_RULE
6342 `(c UNION p UNION a) UNION b = p UNION (a UNION b UNION c)`] THEN
6344 W(MP_TAC o PART_MATCH (lhand o rand) UNION_SEGMENT o
6345 rand o lhand o snd) THEN
6346 REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between;
6347 NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6348 NORM_ARITH `dist(a + d:complex,a + e) = norm(d - e)`] THEN
6349 ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB;
6350 NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6351 ANTS_TAC THENL [ASM_REAL_ARITH_TAC; DISCH_THEN SUBST1_TAC] THEN
6352 MATCH_MP_TAC UNION_SEGMENT THEN
6353 REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between;
6354 NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6355 NORM_ARITH `dist(a - d:complex,a - e) = norm(d - e)`] THEN
6356 ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB;
6357 NORM_MUL; NORM_BASIS; DIMINDEX_2; ARITH] THEN
6360 DISCH_THEN(CONJUNCTS_THEN (MP_TAC o MATCH_MP
6361 (MESON[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]
6362 `z IN inside s ==> ~(z IN s)`))) THEN
6363 REWRITE_TAC[IN_UNION; DE_MORGAN_THM] THEN REPEAT STRIP_TAC THEN
6364 AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
6365 ASM_SIMP_TAC[WINDING_NUMBER_JOIN; PATH_JOIN; ARC_IMP_PATH; PATH_LINEPATH;
6366 PATH_IMAGE_JOIN; IN_UNION; PATH_IMAGE_LINEPATH; PATHSTART_JOIN;
6367 PATHFINISH_JOIN; PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
6368 MATCH_MP_TAC(COMPLEX_RING
6369 `d + k + e:complex = z ==> (e + p + d) + k = p + z`) THEN
6370 MATCH_MP_TAC EQ_TRANS THEN
6372 `winding_number(linepath (a - d % basis 1:complex,a - kde % basis 1),z) +
6373 winding_number(linepath (a - kde % basis 1,a + e % basis 1),z)` THEN
6374 CONJ_TAC THENL [AP_TERM_TAC; ALL_TAC] THEN CONV_TAC SYM_CONV THEN
6375 MATCH_MP_TAC WINDING_NUMBER_SPLIT_LINEPATH THEN
6376 ASM_REWRITE_TAC[] THENL
6380 `~(z IN segment[a - kde % basis 1:complex,a + kde % basis 1]) /\
6381 ~(z IN segment[a + kde % basis 1,a + e % basis 1])`
6382 MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
6383 MATCH_MP_TAC(SET_RULE
6384 `s UNION t = u ==> ~(z IN s) /\ ~(z IN t) ==> ~(z IN u)`) THEN
6385 MATCH_MP_TAC UNION_SEGMENT];
6387 REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6388 REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6389 NORM_ARITH `dist(a - d:complex,a - e) = norm(d - e)`;
6390 NORM_ARITH `dist(a + d:complex,a + e) = norm(d - e)`] THEN
6391 ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; GSYM VECTOR_SUB_RDISTRIB; NORM_MUL;
6392 NORM_BASIS; DIMINDEX_2; ARITH] THEN
6393 ASM_REAL_ARITH_TAC) in
6395 (`!p:real^1->complex.
6396 simple_path p /\ pathfinish p = pathstart p
6397 ==> ?z. z IN inside(path_image p) /\ norm(winding_number(p,z)) = &1`,
6398 GEN_TAC THEN STRIP_TAC THEN
6399 MP_TAC(ISPEC `p:real^1->complex` JORDAN_INSIDE_OUTSIDE) THEN
6400 ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
6401 UNDISCH_TAC `~(inside(path_image p):complex->bool = {})` THEN
6402 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN
6403 DISCH_THEN(X_CHOOSE_TAC `a:complex`) THEN
6404 MP_TAC(ISPECL [`inside(path_image p):complex->bool`;
6405 `a:complex`; `basis 1:complex`]
6406 RAY_TO_FRONTIER) THEN
6407 MP_TAC(ISPECL [`inside(path_image p):complex->bool`;
6408 `a:complex`; `--basis 1:complex`]
6409 RAY_TO_FRONTIER) THEN
6410 ASM_SIMP_TAC[INTERIOR_OPEN; VECTOR_NEG_EQ_0; BASIS_NONZERO;
6411 DIMINDEX_2; ARITH] THEN
6412 REWRITE_TAC[VECTOR_ARITH `a + d % --b:complex = a - d % b`] THEN
6413 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
6414 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
6416 `?t. t IN interval[vec 0,vec 1] /\
6417 (p:real^1->complex) t = a - d % basis 1`
6418 STRIP_ASSUME_TAC THENL
6419 [RULE_ASSUM_TAC(REWRITE_RULE[path_image; IN_IMAGE]) THEN
6423 `?q. simple_path q /\
6424 pathstart q:complex = a - d % basis 1 /\
6425 pathfinish q = a - d % basis 1 /\
6426 path_image q = path_image p /\
6427 (!z. z IN inside(path_image p)
6428 ==> winding_number(q,z) = winding_number(p,z))`
6430 [EXISTS_TAC `shiftpath t (p:real^1->complex)` THEN
6431 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6432 ASM_SIMP_TAC[PATHSTART_SHIFTPATH; PATHFINISH_SHIFTPATH; DROP_VEC;
6433 SIMPLE_PATH_SHIFTPATH; PATH_IMAGE_SHIFTPATH] THEN
6434 REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_SHIFTPATH THEN
6435 ASM_SIMP_TAC[SIMPLE_PATH_IMP_PATH] THEN
6436 ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6437 DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` MP_TAC) THEN
6438 REPLICATE_TAC 3 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
6439 REWRITE_TAC[IMP_CONJ] THEN DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
6441 `?z. z IN inside(path_image q) /\ norm(winding_number(q,z)) = &1`
6442 (fun th -> MESON_TAC[th]) THEN
6443 POP_ASSUM_LIST(MP_TAC o end_itlist CONJ o rev o
6444 filter (fun tm -> not(free_in `t:real^1` (concl tm) or
6445 free_in `p:real^1->complex` (concl tm)))) THEN
6448 `?t. t IN interval[vec 0,vec 1] /\
6449 (q:real^1->complex) t = a + e % basis 1`
6450 STRIP_ASSUME_TAC THENL
6451 [RULE_ASSUM_TAC(REWRITE_RULE[path_image; IN_IMAGE]) THEN
6454 SUBGOAL_THEN `~(a - d % basis 1:complex = a + e % basis 1)`
6456 [REWRITE_TAC[VECTOR_ARITH
6457 `a - d % l:complex = a + e % l <=> (e + d) % l = vec 0`] THEN
6458 SIMP_TAC[VECTOR_MUL_EQ_0; BASIS_NONZERO; DIMINDEX_2; ARITH] THEN
6462 `path_image q INTER segment[a - d % basis 1,a + e % basis 1] =
6463 {a - d % basis 1:complex,a + e % basis 1}`
6465 [REWRITE_TAC[SEGMENT_CLOSED_OPEN] THEN
6466 MATCH_MP_TAC(SET_RULE
6467 `a IN p /\ b IN p /\ p INTER s = {}
6468 ==> p INTER (s UNION {a,b}) = {a,b}`) THEN
6469 CONJ_TAC THENL [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE]; ALL_TAC] THEN
6470 CONJ_TAC THENL [ASM_MESON_TAC[path_image; IN_IMAGE]; ALL_TAC] THEN
6471 ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6472 ENDS_IN_UNIT_INTERVAL] THEN
6473 REWRITE_TAC[SET_RULE `s INTER t = {} <=> !x. x IN t ==> ~(x IN s)`] THEN
6474 REWRITE_TAC[IN_SEGMENT; VECTOR_ARITH
6475 `(&1 - u) % (a - d % l) + u % (a + e % l):complex =
6476 a + (u * e - (&1 - u) * d) % l`] THEN
6477 X_GEN_TAC `y:complex` THEN
6478 DISCH_THEN(X_CHOOSE_THEN `k:real` STRIP_ASSUME_TAC o CONJUNCT2) THEN
6479 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(MESON
6480 [INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]
6481 `x IN inside s ==> ~(x IN s)`) THEN
6482 ASM_CASES_TAC `&0 <= k * e - (&1 - k) * d` THENL
6484 ONCE_REWRITE_TAC[VECTOR_ARITH
6485 `a + (s - t) % l:complex = a - (t - s) % l`]] THEN
6486 FIRST_X_ASSUM MATCH_MP_TAC THEN
6487 ASM_SIMP_TAC[REAL_ARITH `~(&0 <= a - b) ==> &0 <= b - a`] THEN
6488 REWRITE_TAC[REAL_ARITH `k * e - (&1 - k) * d < e <=>
6489 &0 < (&1 - k) * (d + e)`] THEN
6490 REWRITE_TAC[REAL_ARITH `(&1 - k) * d - k * e < d <=>
6491 &0 < k * (d + e)`] THEN
6492 MATCH_MP_TAC REAL_LT_MUL THEN ASM_REAL_ARITH_TAC;
6495 [`subpath t (vec 0) (q:real^1->complex)`;
6496 `a:complex`; `d:real`; `e:real`] lemma2) THEN
6497 ASM_SIMP_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH;
6498 PATH_IMAGE_JOIN; PATHSTART_LINEPATH] THEN
6500 [CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[pathstart]] THEN
6501 MATCH_MP_TAC SIMPLE_PATH_JOIN_LOOP THEN
6502 ASM_REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH;
6503 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
6504 ASM_REWRITE_TAC[ARC_LINEPATH_EQ] THEN REPEAT CONJ_TAC THENL
6505 [MATCH_MP_TAC ARC_SIMPLE_PATH_SUBPATH THEN
6506 RULE_ASSUM_TAC(REWRITE_RULE[pathstart]) THEN
6507 ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL];
6508 RULE_ASSUM_TAC(REWRITE_RULE[pathstart]) THEN ASM_REWRITE_TAC[];
6509 REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
6510 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6511 `p INTER s = {a,b} ==> p' SUBSET p ==> p' INTER s SUBSET {b,a}`)) THEN
6512 ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6513 ENDS_IN_UNIT_INTERVAL]];
6514 DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC)] THEN
6516 [`subpath (vec 0) t (q:real^1->complex)`;
6517 `subpath (vec 1) t (q:real^1->complex)`;
6518 `linepath(a - d % basis 1:complex,a + e % basis 1)`;
6519 `a - d % basis 1:complex`; `a + e % basis 1:complex`;
6522 (subpath t (vec 0) q ++
6523 linepath (a - d % basis 1,a + e % basis 1),z)`]
6524 WINDING_NUMBER_FROM_INNERPATH) THEN
6525 ASM_REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH;
6526 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
6527 REWRITE_TAC[REVERSEPATH_SUBPATH; REVERSEPATH_LINEPATH] THEN
6529 `path_image (subpath (vec 0) t q) UNION
6530 path_image (subpath (vec 1) t q) :complex->bool =
6533 [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6534 SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN
6535 ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6536 REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
6537 SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6538 REWRITE_TAC[GSYM IMAGE_UNION; PATH_IMAGE_REVERSEPATH] THEN
6539 SUBGOAL_THEN `interval[vec 0:real^1,t] UNION interval[t,vec 1] =
6540 interval[vec 0,vec 1]`
6541 (fun th -> ASM_REWRITE_TAC[th; GSYM path_image]) THEN
6542 REWRITE_TAC[EXTENSION; IN_UNION; IN_INTERVAL_1; DROP_VEC] THEN
6546 [RULE_ASSUM_TAC(REWRITE_RULE[pathstart; pathfinish]) THEN
6547 REPLICATE_TAC 2 (ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
6548 [MATCH_MP_TAC SIMPLE_PATH_SUBPATH THEN
6549 ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL] THEN ASM_MESON_TAC[];
6551 ASM_REWRITE_TAC[SIMPLE_PATH_LINEPATH_EQ; PATH_IMAGE_LINEPATH] THEN
6552 REPEAT CONJ_TAC THENL
6553 [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6554 SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN
6555 ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6556 REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
6557 SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6558 MATCH_MP_TAC(SET_RULE
6559 `a IN s /\ a IN t /\ b IN s /\ b IN t /\
6560 (!x. x IN s ==> !y. y IN t ==> x = y ==> x = a \/ x = b)
6561 ==> s INTER t = {a,b}`) THEN
6562 REPEAT CONJ_TAC THENL
6563 [REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `vec 0:real^1` THEN
6564 ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6566 REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `vec 1:real^1` THEN
6567 ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6569 REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `t:real^1` THEN
6570 ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6572 REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `t:real^1` THEN
6573 ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6576 REWRITE_TAC[FORALL_IN_IMAGE; IN_INTERVAL_1; DROP_VEC] THEN
6577 X_GEN_TAC `s:real^1` THEN STRIP_TAC THEN
6578 X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN DISCH_TAC THEN
6579 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [simple_path]) THEN
6580 DISCH_THEN(MP_TAC o SPECL [`s:real^1`; `u:real^1`] o CONJUNCT2) THEN
6581 ASM_REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN
6582 ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
6583 DISCH_THEN(REPEAT_TCL DISJ_CASES_THEN
6584 (REPEAT_TCL CONJUNCTS_THEN SUBST_ALL_TAC)) THEN
6585 ASM_REWRITE_TAC[] THEN SUBGOAL_THEN `drop u = drop t` MP_TAC THENL
6586 [ASM_REAL_ARITH_TAC; ASM_MESON_TAC[DROP_EQ]];
6587 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6589 ==> a IN q /\ b IN q /\ q SUBSET p ==> q INTER s = {a,b}`)) THEN
6590 ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6591 ENDS_IN_UNIT_INTERVAL] THEN
6592 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6593 SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6594 REWRITE_TAC[IN_IMAGE] THEN CONJ_TAC THENL
6595 [EXISTS_TAC `vec 0:real^1`; EXISTS_TAC `t:real^1`] THEN
6596 ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6598 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6600 ==> a IN q /\ b IN q /\ q SUBSET p ==> q INTER s = {a,b}`)) THEN
6601 ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; SIMPLE_PATH_IMP_PATH;
6602 ENDS_IN_UNIT_INTERVAL] THEN
6603 ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6604 REWRITE_TAC[REVERSEPATH_SUBPATH] THEN
6605 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1]) THEN
6606 SIMP_TAC[DROP_VEC; PATH_IMAGE_SUBPATH] THEN STRIP_TAC THEN
6607 REWRITE_TAC[IN_IMAGE] THEN CONJ_TAC THENL
6608 [EXISTS_TAC `vec 1:real^1`; EXISTS_TAC `t:real^1`] THEN
6609 ASM_REWRITE_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
6611 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_INTER] THEN
6612 EXISTS_TAC `a:complex` THEN
6613 ASM_REWRITE_TAC[GSYM BETWEEN_IN_SEGMENT; between] THEN
6614 REWRITE_TAC[NORM_ARITH `dist(a - d:complex,a + e) = norm(d + e)`;
6615 NORM_ARITH `dist(a - d:complex,a) = norm(d)`;
6616 NORM_ARITH `dist(a:complex,a + e) = norm e`] THEN
6617 ASM_SIMP_TAC[GSYM VECTOR_ADD_RDISTRIB; NORM_MUL;
6618 NORM_BASIS; DIMINDEX_2; ARITH] THEN
6620 ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6621 RULE_ASSUM_TAC(REWRITE_RULE[PATH_IMAGE_LINEPATH]) THEN
6622 ASM_REWRITE_TAC[REVERSEPATH_SUBPATH];
6623 W(MP_TAC o PART_MATCH (rand o rand) WINDING_NUMBER_REVERSEPATH o
6626 [ASM_SIMP_TAC[PATH_JOIN_EQ; PATH_IMAGE_JOIN; PATH_LINEPATH;
6627 SIMPLE_PATH_IMP_PATH; PATHSTART_LINEPATH; PATHFINISH_SUBPATH;
6628 PATH_SUBPATH; ENDS_IN_UNIT_INTERVAL] THEN
6629 ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6630 DISCH_THEN(SUBST1_TAC o SYM) THEN
6631 ASM_SIMP_TAC[REVERSEPATH_JOINPATHS; REVERSEPATH_LINEPATH;
6632 REVERSEPATH_SUBPATH; PATHFINISH_SUBPATH;
6633 PATHSTART_LINEPATH] THEN
6634 MATCH_MP_TAC(MESON[COMPLEX_ADD_SYM]
6635 `winding_number(g ++ h,z) =
6636 winding_number(g,z) + winding_number(h,z) /\
6637 winding_number(h ++ g,z) =
6638 winding_number(h,z) + winding_number(g,z)
6639 ==> winding_number(g ++ h,z) =winding_number(h ++ g,z)`) THEN
6640 CONJ_TAC THEN MATCH_MP_TAC WINDING_NUMBER_JOIN THEN
6641 ASM_SIMP_TAC[PATH_LINEPATH; PATH_SUBPATH; PATH_SUBPATH;
6642 SIMPLE_PATH_IMP_PATH; ENDS_IN_UNIT_INTERVAL;
6643 PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
6644 PATHSTART_SUBPATH; PATHFINISH_SUBPATH]
6645 THENL [ALL_TAC; ONCE_REWRITE_TAC[CONJ_SYM]] THEN
6646 REWRITE_TAC[SET_RULE
6647 `~(z IN s) /\ ~(z IN t) <=> ~(z IN s UNION t)`] THEN
6648 ONCE_REWRITE_TAC[GSYM PATH_IMAGE_REVERSEPATH] THEN
6649 REWRITE_TAC[REVERSEPATH_LINEPATH; REVERSEPATH_SUBPATH] THEN
6650 ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]];
6651 REWRITE_TAC[COMPLEX_NEG_EQ_0] THEN DISCH_THEN SUBST_ALL_TAC THEN
6652 RULE_ASSUM_TAC(REWRITE_RULE
6653 [COMPLEX_NORM_CX; REAL_OF_NUM_EQ; REAL_ABS_NUM; ARITH]) THEN
6654 FIRST_X_ASSUM CONTR_TAC];
6655 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6656 ONCE_REWRITE_TAC[COMPLEX_RING `a:complex = --b <=> --a = b`] THEN
6657 DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
6658 RULE_ASSUM_TAC(REWRITE_RULE[NORM_NEG])] THEN
6659 EXISTS_TAC `z:complex` THEN ASM_REWRITE_TAC[] THEN
6661 `winding_number(subpath (vec 0) t q ++ subpath t (vec 1) q,z) =
6662 winding_number(subpath (vec 0) (vec 1) q,z)`
6663 (fun th -> ASM_MESON_TAC[th; SUBPATH_TRIVIAL]) THEN
6664 MATCH_MP_TAC EQ_TRANS THEN
6665 EXISTS_TAC `winding_number(subpath (vec 0) t q,z) +
6666 winding_number(subpath t (vec 1) q,z)` THEN
6668 [MATCH_MP_TAC WINDING_NUMBER_JOIN THEN
6669 ASM_SIMP_TAC[PATH_SUBPATH; ENDS_IN_UNIT_INTERVAL; SIMPLE_PATH_IMP_PATH;
6670 PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
6671 SUBGOAL_THEN `~((z:complex) IN path_image q)` MP_TAC THENL
6672 [ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6673 MATCH_MP_TAC(SET_RULE
6674 `s1 SUBSET s /\ s2 SUBSET s
6675 ==> ~(z IN s) ==> ~(z IN s1) /\ ~(z IN s2)`) THEN
6676 ASM_SIMP_TAC[PATH_IMAGE_SUBPATH_SUBSET; ENDS_IN_UNIT_INTERVAL;
6677 SIMPLE_PATH_IMP_PATH]];
6678 MATCH_MP_TAC WINDING_NUMBER_SUBPATH_COMBINE THEN
6679 ASM_REWRITE_TAC[ENDS_IN_INTERVAL; GSYM IN_INTERVAL_1] THEN
6680 ASM_SIMP_TAC[UNIT_INTERVAL_NONEMPTY; SIMPLE_PATH_IMP_PATH] THEN
6681 ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY]]) in
6682 GEN_TAC THEN DISCH_TAC THEN
6683 ASM_CASES_TAC `pathfinish g:complex = pathstart g` THENL
6684 [ALL_TAC; ASM_MESON_TAC[INSIDE_SIMPLE_CURVE_IMP_CLOSED]] THEN
6685 MATCH_MP_TAC(MESON[]
6686 `(?k. !z. z IN s ==> f z = k) /\
6687 (?z. z IN s /\ (f z = a \/ f z = b))
6688 ==> (!z. z IN s ==> f z = a) \/ (!z. z IN s ==> f z = b)`) THEN
6690 [MATCH_MP_TAC WINDING_NUMBER_CONSTANT THEN
6691 ASM_SIMP_TAC[INSIDE_NO_OVERLAP; SIMPLE_PATH_IMP_PATH] THEN
6692 ASM_SIMP_TAC[JORDAN_INSIDE_OUTSIDE];
6693 MP_TAC(SPEC `g:real^1->complex` lemma3) THEN ASM_REWRITE_TAC[] THEN
6694 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN
6695 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
6696 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
6697 INTEGER_WINDING_NUMBER) THEN
6699 [ASM_SIMP_TAC[SIMPLE_PATH_IMP_PATH] THEN
6700 ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6701 SIMP_TAC[complex_integer; COMPLEX_EQ; IM_NEG; IM_CX] THEN
6702 SIMP_TAC[GSYM real; REAL_NORM; RE_NEG; RE_CX] THEN REAL_ARITH_TAC]]);;
6704 let SIMPLE_CLOSED_PATH_ABS_WINDING_NUMBER_INSIDE = prove
6705 (`!g z. simple_path g /\ z IN inside(path_image g)
6706 ==> abs(Re(winding_number(g,z))) = &1`,
6707 REPEAT STRIP_TAC THEN FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP
6708 SIMPLE_CLOSED_PATH_WINDING_NUMBER_INSIDE) THEN
6709 ASM_SIMP_TAC[RE_NEG; RE_CX; REAL_ABS_NUM; REAL_ABS_NEG]);;
6711 let SIMPLE_CLOSED_PATH_NORM_WINDING_NUMBER_INSIDE = prove
6712 (`!g z. simple_path g /\ z IN inside(path_image g)
6713 ==> norm(winding_number(g,z)) = &1`,
6714 REPEAT STRIP_TAC THEN
6715 SUBGOAL_THEN `pathfinish g:complex = pathstart g` ASSUME_TAC THENL
6716 [ASM_MESON_TAC[INSIDE_SIMPLE_CURVE_IMP_CLOSED]; ALL_TAC] THEN
6717 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
6718 INTEGER_WINDING_NUMBER) THEN
6720 [ASM_SIMP_TAC[SIMPLE_PATH_IMP_PATH] THEN
6721 ASM_MESON_TAC[INSIDE_NO_OVERLAP; IN_INTER; NOT_IN_EMPTY];
6722 ASM_SIMP_TAC[complex_integer; GSYM real; REAL_NORM;
6723 SIMPLE_CLOSED_PATH_ABS_WINDING_NUMBER_INSIDE]]);;
6725 let SIMPLE_CLOSED_PATH_WINDING_NUMBER_CASES = prove
6726 (`!g z. simple_path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g)
6727 ==> winding_number(g,z) IN {--Cx(&1),Cx(&0),Cx(&1)}`,
6728 REPEAT STRIP_TAC THEN
6729 MP_TAC(ISPEC `path_image g:complex->bool` INSIDE_UNION_OUTSIDE) THEN
6730 REWRITE_TAC[EXTENSION; IN_DIFF; IN_UNIV; IN_UNION] THEN
6731 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
6732 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN STRIP_TAC THEN
6733 ASM_SIMP_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE; SIMPLE_PATH_IMP_PATH] THEN
6734 ASM_MESON_TAC[SIMPLE_CLOSED_PATH_WINDING_NUMBER_INSIDE]);;
6736 let SIMPLE_CLOSED_PATH_WINDING_NUMBER_POS = prove
6737 (`!g z. simple_path g /\ pathfinish g = pathstart g /\ ~(z IN path_image g) /\
6738 &0 < Re(winding_number(g,z))
6739 ==> winding_number(g,z) = Cx(&1)`,
6740 REPEAT STRIP_TAC THEN
6741 MP_TAC(ISPECL [`g:real^1->complex`; `z:complex`]
6742 SIMPLE_CLOSED_PATH_WINDING_NUMBER_CASES) THEN
6743 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
6744 STRIP_TAC THEN UNDISCH_TAC `&0 < Re(winding_number(g,z))` THEN
6745 ASM_REWRITE_TAC[RE_NEG; RE_CX] THEN REAL_ARITH_TAC);;
6747 let SIMPLY_CONNECTED_IMP_WINDING_NUMBER_ZERO = prove
6748 (`!s g z. simply_connected s /\
6749 path g /\ path_image g SUBSET s /\
6750 pathfinish g = pathstart g /\ ~(z IN s)
6751 ==> winding_number(g,z) = Cx(&0)`,
6752 REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
6753 EXISTS_TAC `winding_number(linepath(pathstart g,pathstart g),z)` THEN
6755 [MATCH_MP_TAC WINDING_NUMBER_HOMOTOPIC_PATHS THEN
6756 MATCH_MP_TAC HOMOTOPIC_LOOPS_IMP_HOMOTOPIC_PATHS_NULL THEN
6757 EXISTS_TAC `pathstart(g:real^1->complex)` THEN
6758 MATCH_MP_TAC HOMOTOPIC_LOOPS_SUBSET THEN
6759 EXISTS_TAC `s:complex->bool` THEN
6760 CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
6761 FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [simply_connected]) THEN
6762 ASM_REWRITE_TAC[PATH_LINEPATH; PATHSTART_LINEPATH;
6763 PATHFINISH_LINEPATH; PATH_IMAGE_LINEPATH; SEGMENT_REFL;
6764 INSERT_SUBSET; EMPTY_SUBSET];
6765 MATCH_MP_TAC WINDING_NUMBER_TRIVIAL] THEN
6766 MP_TAC(ISPEC `g:real^1->complex` PATHSTART_IN_PATH_IMAGE) THEN
6769 let NO_BOUNDED_CONNECTED_COMPONENT_IMP_WINDING_NUMBER_ZERO = prove
6770 (`!s. ~(?z. ~(z IN s) /\ bounded(connected_component ((:complex) DIFF s) z))
6771 ==> !g z. path g /\ path_image g SUBSET s /\
6772 pathfinish g = pathstart g /\ ~(z IN s)
6773 ==> winding_number(g,z) = Cx(&0)`,
6774 REWRITE_TAC[NOT_EXISTS_THM] THEN REPEAT STRIP_TAC THEN
6775 MATCH_MP_TAC WINDING_NUMBER_ZERO_IN_OUTSIDE THEN
6776 ASM_REWRITE_TAC[outside; IN_ELIM_THM] THEN
6777 CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
6778 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
6779 ASM_REWRITE_TAC[CONTRAPOS_THM] THEN
6780 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] BOUNDED_SUBSET) THEN
6781 MATCH_MP_TAC CONNECTED_COMPONENT_MONO THEN ASM SET_TAC[]);;
6783 let NO_BOUNDED_PATH_COMPONENT_IMP_WINDING_NUMBER_ZERO = prove
6784 (`!s. ~(?z. ~(z IN s) /\ bounded(path_component ((:complex) DIFF s) z))
6785 ==> !g z. path g /\ path_image g SUBSET s /\
6786 pathfinish g = pathstart g /\ ~(z IN s)
6787 ==> winding_number(g,z) = Cx(&0)`,
6788 GEN_TAC THEN DISCH_TAC THEN
6789 MATCH_MP_TAC NO_BOUNDED_CONNECTED_COMPONENT_IMP_WINDING_NUMBER_ZERO THEN
6790 ASM_MESON_TAC[PATH_COMPONENT_SUBSET_CONNECTED_COMPONENT; BOUNDED_SUBSET]);;
6792 (* ------------------------------------------------------------------------- *)
6793 (* Partial circle path. *)
6794 (* ------------------------------------------------------------------------- *)
6796 let partcirclepath = new_definition
6797 `partcirclepath(z,r,s,t) =
6798 \x. z + Cx(r) * cexp(ii * linepath(Cx(s),Cx(t)) x)`;;
6800 let PATHSTART_PARTCIRCLEPATH = prove
6801 (`!r z s t. pathstart(partcirclepath(z,r,s,t)) =
6802 z + Cx(r) * cexp(ii * Cx(s))`,
6803 REWRITE_TAC[pathstart; partcirclepath;
6804 REWRITE_RULE[pathstart] PATHSTART_LINEPATH]);;
6806 let PATHFINISH_PARTCIRCLEPATH = prove
6807 (`!r z s t. pathfinish(partcirclepath(z,r,s,t)) =
6808 z + Cx(r) * cexp(ii * Cx(t))`,
6809 REWRITE_TAC[pathfinish; partcirclepath;
6810 REWRITE_RULE[pathfinish] PATHFINISH_LINEPATH]);;
6812 let HAS_VECTOR_DERIVATIVE_PARTCIRCLEPATH = prove
6814 ((partcirclepath(z,r,s,t)) has_vector_derivative
6815 (ii * Cx(r) * (Cx t - Cx s) * cexp(ii * linepath(Cx(s),Cx(t)) x)))
6817 REWRITE_TAC[partcirclepath; linepath; COMPLEX_CMUL; CX_SUB] THEN
6818 REPEAT GEN_TAC THEN MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_REAL_COMPLEX THEN
6819 COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING);;
6821 let VECTOR_DERIVATIVE_PARTCIRCLEPATH = prove
6823 vector_derivative (partcirclepath(z,r,s,t)) (at x) =
6824 ii * Cx(r) * (Cx t - Cx s) * cexp(ii * linepath(Cx(s),Cx(t)) x)`,
6825 REPEAT GEN_TAC THEN MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
6826 REWRITE_TAC[HAS_VECTOR_DERIVATIVE_PARTCIRCLEPATH]);;
6828 let VALID_PATH_PARTCIRCLEPATH = prove
6829 (`!z r s t. valid_path(partcirclepath(z,r,s,t))`,
6830 REPEAT GEN_TAC THEN REWRITE_TAC[valid_path] THEN
6831 MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
6832 REWRITE_TAC[differentiable_on] THEN X_GEN_TAC `x:real^1` THEN STRIP_TAC THEN
6833 MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
6834 REWRITE_TAC[VECTOR_DERIVATIVE_WORKS; VECTOR_DERIVATIVE_PARTCIRCLEPATH;
6835 HAS_VECTOR_DERIVATIVE_PARTCIRCLEPATH]);;
6837 let PATH_PARTCIRCLEPATH = prove
6838 (`!z r s t. path(partcirclepath(z,r,s,t))`,
6839 SIMP_TAC[VALID_PATH_PARTCIRCLEPATH; VALID_PATH_IMP_PATH]);;
6841 let PATH_IMAGE_PARTCIRCLEPATH = prove
6844 ==> path_image(partcirclepath(z,r,s,t)) =
6845 {z + Cx(r) * cexp(ii * Cx x) | s <= x /\ x <= t}`,
6846 REPEAT STRIP_TAC THEN REWRITE_TAC[path_image; partcirclepath] THEN
6847 REWRITE_TAC[EXTENSION; TAUT `(a <=> b) <=> (a ==> b) /\ (b ==> a)`] THEN
6848 REWRITE_TAC[FORALL_AND_THM; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
6850 [X_GEN_TAC `x:real^1` THEN REWRITE_TAC[IN_INTERVAL_1; DROP_VEC] THEN
6851 DISCH_TAC THEN EXISTS_TAC `(&1 - drop x) * s + drop x * t` THEN
6852 REWRITE_TAC[linepath; CX_ADD; CX_SUB; COMPLEX_CMUL; CX_MUL] THEN
6853 REWRITE_TAC[REAL_ARITH `s <= (&1 - x) * s + x * t <=> &0 <= x * (t - s)`;
6854 REAL_ARITH `(&1 - x) * s + x * t <= t <=> &0 <= (&1 - x) * (t - s)`] THEN
6855 ASM_SIMP_TAC[REAL_LE_MUL; REAL_SUB_LE];
6857 X_GEN_TAC `w:complex` THEN
6858 DISCH_THEN(X_CHOOSE_THEN `x:real` STRIP_ASSUME_TAC) THEN
6859 ASM_REWRITE_TAC[IN_IMAGE] THEN ASM_CASES_TAC `s:real < t` THENL
6860 [EXISTS_TAC `lift((x - s) / (t - s))` THEN
6861 ASM_SIMP_TAC[IN_INTERVAL_1; REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_SUB_LT;
6862 LIFT_DROP; DROP_VEC; linepath; REAL_MUL_LZERO; REAL_MUL_LID;
6863 REAL_SUB_LE; REAL_ARITH `x - s:real <= t - s <=> x <= t`] THEN
6864 AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
6865 REWRITE_TAC[COMPLEX_CMUL; CX_SUB; CX_DIV] THEN
6866 SUBGOAL_THEN `~(Cx(s) = Cx(t))` MP_TAC THENL
6867 [ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NE]; CONV_TAC COMPLEX_FIELD];
6868 UNDISCH_TAC `s:real <= t` THEN ASM_REWRITE_TAC[REAL_LE_LT] THEN
6869 DISCH_THEN SUBST_ALL_TAC THEN EXISTS_TAC `vec 0:real^1` THEN
6870 SIMP_TAC[IN_INTERVAL_1; DROP_VEC; linepath; VECTOR_MUL_LZERO;
6871 REAL_SUB_RZERO; VECTOR_MUL_LID; VECTOR_ADD_RID; REAL_POS] THEN
6872 AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
6873 REWRITE_TAC[CX_INJ] THEN ASM_REAL_ARITH_TAC]);;
6875 let PATH_IMAGE_PARTCIRCLEPATH_SUBSET = prove
6878 ==> path_image(partcirclepath(z,r,s,t)) SUBSET sphere(z,r)`,
6879 SIMP_TAC[PATH_IMAGE_PARTCIRCLEPATH] THEN
6880 SIMP_TAC[SUBSET; IN_ELIM_THM; IN_SPHERE; LEFT_IMP_EXISTS_THM] THEN
6881 REWRITE_TAC[NORM_ARITH `dist(z,z + a) = norm a`] THEN
6882 REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP; COMPLEX_NORM_CX;
6883 RE_MUL_II; IM_CX; REAL_NEG_0; REAL_EXP_0] THEN
6886 let IN_PATH_IMAGE_PARTCIRCLEPATH = prove
6888 &0 <= r /\ s <= t /\ w IN path_image(partcirclepath(z,r,s,t))
6889 ==> norm(w - z) = r`,
6890 MP_TAC PATH_IMAGE_PARTCIRCLEPATH_SUBSET THEN
6891 REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN
6892 REWRITE_TAC[SUBSET; IN_SPHERE; dist; NORM_SUB] THEN SET_TAC[]);;
6894 let HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG = prove
6897 (f has_path_integral i) (partcirclepath(z,r,s,t)) /\
6898 &0 <= B /\ &0 < r /\ s <= t /\
6899 (!x. x IN path_image(partcirclepath(z,r,s,t)) DIFF k
6901 ==> norm(i) <= B * r * (t - s)`,
6903 (`!b w. FINITE {z | norm(z) <= b /\ cexp(z) = w}`,
6904 REPEAT GEN_TAC THEN ASM_CASES_TAC `w = Cx(&0)` THEN
6905 ASM_REWRITE_TAC[CEXP_NZ; SET_RULE `{x | F} = {}`; FINITE_RULES] THEN
6906 FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP CEXP_CLOG) THEN
6907 REWRITE_TAC[CEXP_EQ] THEN
6908 REWRITE_TAC[SET_RULE
6909 `{z | P z /\ ?n. Q n /\ z = f n} = IMAGE f {n | Q n /\ P(f n)}`] THEN
6910 MATCH_MP_TAC FINITE_IMAGE THEN
6911 MATCH_MP_TAC FINITE_SUBSET THEN
6912 EXISTS_TAC `{n | integer n /\
6913 norm(Cx(&2 * n * pi) * ii) <= b + norm(clog w)}` THEN
6915 [ALL_TAC; SIMP_TAC[SUBSET; IN_ELIM_THM] THEN NORM_ARITH_TAC] THEN
6916 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
6917 REWRITE_TAC[REAL_MUL_RID; REAL_ABS_MUL; REAL_ABS_NUM; REAL_ABS_PI] THEN
6918 ASM_SIMP_TAC[REAL_MUL_ASSOC; GSYM REAL_LE_RDIV_EQ; PI_POS] THEN
6919 REWRITE_TAC[REAL_ARITH `&2 * x <= a <=> x <= a / &2`] THEN
6920 REWRITE_TAC[GSYM REAL_BOUNDS_LE; FINITE_INTSEG]) in
6922 (`!a b. ~(a = Cx(&0)) ==> FINITE {z | norm(z) <= b /\ cexp(a * z) = w}`,
6923 REPEAT STRIP_TAC THEN MATCH_MP_TAC FINITE_SUBSET THEN
6925 `IMAGE (\z. z / a) {z | norm(z) <= b * norm(a) /\ cexp(z) = w}` THEN
6926 SIMP_TAC[lemma1; FINITE_IMAGE] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
6927 REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN
6928 ASM_SIMP_TAC[COMPLEX_FIELD `~(a = Cx(&0)) ==> (x = y / a <=> a * x = y)`;
6929 UNWIND_THM1; COMPLEX_NORM_MUL; REAL_LE_LMUL; NORM_POS_LE]) in
6930 REPEAT GEN_TAC THEN REWRITE_TAC[HAS_PATH_INTEGRAL] THEN STRIP_TAC THEN
6931 MP_TAC(ASSUME `s <= t`) THEN GEN_REWRITE_TAC LAND_CONV [REAL_LE_LT] THEN
6934 FIRST_X_ASSUM SUBST_ALL_TAC THEN
6935 REPEAT(POP_ASSUM MP_TAC) THEN
6936 REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH] THEN
6937 REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_LZERO; COMPLEX_MUL_RZERO] THEN
6938 SIMP_TAC[GSYM COMPLEX_VEC_0; HAS_INTEGRAL_0_EQ; NORM_0] THEN
6939 REAL_ARITH_TAC] THEN
6940 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
6941 REWRITE_TAC[GSYM CONTENT_UNIT_1] THEN MATCH_MP_TAC HAS_INTEGRAL_BOUND THEN
6942 EXISTS_TAC `\x. if (partcirclepath(z,r,s,t) x) IN k then Cx(&0)
6943 else f(partcirclepath(z,r,s,t) x) *
6944 vector_derivative (partcirclepath(z,r,s,t)) (at x)` THEN
6945 ASM_SIMP_TAC[] THEN CONJ_TAC THENL
6946 [ASM_MESON_TAC[REAL_LE_MUL; REAL_POS; REAL_LT_IMP_LE; REAL_SUB_LE];
6949 [MATCH_MP_TAC HAS_INTEGRAL_SPIKE THEN
6950 EXISTS_TAC `\x. f(partcirclepath(z,r,s,t) x) *
6951 vector_derivative (partcirclepath(z,r,s,t)) (at x)` THEN
6952 EXISTS_TAC `{x | x IN interval[vec 0,vec 1] /\
6953 (partcirclepath(z,r,s,t) x) IN k}` THEN
6954 ASM_SIMP_TAC[IN_DIFF; IN_ELIM_THM; IMP_CONJ] THEN
6955 MATCH_MP_TAC NEGLIGIBLE_FINITE THEN
6956 MATCH_MP_TAC FINITE_FINITE_PREIMAGE_GENERAL THEN ASM_REWRITE_TAC[] THEN
6957 X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
6958 REWRITE_TAC[partcirclepath] THEN
6959 ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ; COMPLEX_FIELD
6960 `~(r = Cx(&0)) ==> (z + r * e = y <=> e = (y - z) / r)`] THEN
6961 REWRITE_TAC[linepath; COMPLEX_CMUL] THEN
6962 REWRITE_TAC[GSYM CX_MUL; GSYM CX_ADD] THEN
6963 REWRITE_TAC[REAL_ARITH `(&1 - t) * x + t * y = x + t * (y - x)`] THEN
6964 REWRITE_TAC[CX_ADD; COMPLEX_ADD_LDISTRIB; CEXP_ADD] THEN
6965 SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
6966 `~(e = Cx(&0)) ==> (e * x = y <=> x = y / e)`] THEN
6967 ABBREV_TAC `w = (y - z) / Cx r / cexp(ii * Cx s)` THEN
6968 REWRITE_TAC[CX_MUL; COMPLEX_RING
6969 `ii * Cx x * Cx(t - s) = (ii * Cx(t - s)) * Cx x`] THEN
6970 MATCH_MP_TAC FINITE_SUBSET THEN
6973 {z | norm(z) <= &1 /\ cexp((ii * Cx(t - s)) * z) = w}}` THEN
6975 [MATCH_MP_TAC FINITE_IMAGE_INJ THEN REWRITE_TAC[CX_INJ; DROP_EQ] THEN
6976 MATCH_MP_TAC lemma2 THEN
6977 REWRITE_TAC[COMPLEX_RING `ii * x = Cx(&0) <=> x = Cx(&0)`] THEN
6978 ASM_SIMP_TAC[CX_INJ; REAL_SUB_0; REAL_LT_IMP_NE];
6979 SIMP_TAC[SUBSET; IN_ELIM_THM; IN_INTERVAL_1; DROP_VEC] THEN
6980 SIMP_TAC[COMPLEX_NORM_CX] THEN REAL_ARITH_TAC];
6982 X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
6983 COND_CASES_TAC THEN ASM_REWRITE_TAC[COMPLEX_NORM_0] THEN
6984 ASM_SIMP_TAC[REAL_LE_MUL; REAL_LT_IMP_LE; REAL_SUB_LE] THEN
6985 REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH] THEN
6986 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
6987 REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_LID] THEN
6988 REWRITE_TAC[NORM_CEXP; RE_MUL_II; IM_LINEPATH_CX] THEN
6989 REWRITE_TAC[REAL_EXP_0; REAL_NEG_0; REAL_MUL_RID] THEN
6990 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN CONJ_TAC THENL
6991 [FIRST_X_ASSUM MATCH_MP_TAC THEN
6992 REWRITE_TAC[path_image] THEN ASM SET_TAC[];
6994 SIMP_TAC[REAL_LE_MUL; NORM_POS_LE; REAL_ABS_POS] THEN
6995 MATCH_MP_TAC REAL_LE_MUL2 THEN
6996 ASM_SIMP_TAC[NORM_POS_LE; GSYM CX_SUB; COMPLEX_NORM_CX] THEN
6997 ASM_REAL_ARITH_TAC);;
6999 let HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH = prove
7001 (f has_path_integral i) (partcirclepath(z,r,s,t)) /\
7002 &0 <= B /\ &0 < r /\ s <= t /\
7003 (!x. x IN path_image(partcirclepath(z,r,s,t))
7005 ==> norm(i) <= B * r * (t - s)`,
7006 REPEAT STRIP_TAC THEN
7007 MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG THEN
7008 MAP_EVERY EXISTS_TAC
7009 [`f:complex->complex`; `z:complex`; `{}:complex->bool`] THEN
7010 ASM_REWRITE_TAC[FINITE_RULES; IN_DIFF; NOT_IN_EMPTY]);;
7012 let PATH_INTEGRABLE_CONTINUOUS_PARTCIRCLEPATH = prove
7013 (`!f z r s t. f continuous_on path_image(partcirclepath(z,r,s,t))
7014 ==> f path_integrable_on (partcirclepath(z,r,s,t))`,
7015 REPEAT GEN_TAC THEN REWRITE_TAC[path_integrable_on; HAS_PATH_INTEGRAL] THEN
7016 REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH; GSYM integrable_on] THEN
7017 DISCH_TAC THEN MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
7018 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC THENL
7019 [ONCE_REWRITE_TAC[GSYM o_DEF] THEN
7020 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
7021 ASM_REWRITE_TAC[GSYM path_image; ETA_AX] THEN
7022 MATCH_MP_TAC PIECEWISE_DIFFERENTIABLE_ON_IMP_CONTINUOUS_ON THEN
7023 ASM_REWRITE_TAC[GSYM valid_path; VALID_PATH_PARTCIRCLEPATH];
7025 REWRITE_TAC[linepath] THEN
7026 REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
7027 REWRITE_TAC[CONTINUOUS_ON_CONST]) THEN
7028 ONCE_REWRITE_TAC[GSYM o_DEF] THEN
7029 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
7030 REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
7031 REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
7032 REWRITE_TAC[CONTINUOUS_ON_CONST]) THEN
7033 REWRITE_TAC[VECTOR_ARITH `(&1 - x) % s + x % t = s + x % (t - s)`] THEN
7034 MATCH_MP_TAC CONTINUOUS_ON_ADD THEN REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
7035 MATCH_MP_TAC LINEAR_CONTINUOUS_ON THEN
7036 REWRITE_TAC[linear; DROP_ADD; DROP_CMUL; CX_ADD; COMPLEX_CMUL; CX_MUL;
7038 CONV_TAC COMPLEX_RING);;
7040 let WINDING_NUMBER_PARTCIRCLEPATH_POS_LT = prove
7042 s < t /\ norm(w - z) < r
7043 ==> &0 < Re(winding_number(partcirclepath(z,r,s,t),w))`,
7044 REPEAT STRIP_TAC THEN MATCH_MP_TAC WINDING_NUMBER_POS_LT THEN
7045 EXISTS_TAC `r * (t - s) * (r - norm(w - z:complex))` THEN
7046 FIRST_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
7047 `n < r ==> &0 <= n ==> &0 < r`)) THEN
7048 REWRITE_TAC[NORM_POS_LE] THEN DISCH_TAC THEN
7049 ASM_SIMP_TAC[REAL_LT_MUL; REAL_SUB_LT; VALID_PATH_PARTCIRCLEPATH] THEN
7050 ASM_REWRITE_TAC[VALID_PATH_PARTCIRCLEPATH] THEN CONJ_TAC THENL
7051 [ASM_MESON_TAC[IN_PATH_IMAGE_PARTCIRCLEPATH; REAL_LT_IMP_LE; REAL_LT_REFL];
7053 X_GEN_TAC `x:real^1` THEN DISCH_TAC THEN
7054 REWRITE_TAC[VECTOR_DERIVATIVE_PARTCIRCLEPATH] THEN
7055 REWRITE_TAC[partcirclepath] THEN
7056 REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; IM_MUL_II; RE_MUL_CX; GSYM CX_SUB] THEN
7057 REWRITE_TAC[CNJ_ADD; CNJ_SUB; CNJ_MUL; CNJ_CX] THEN
7058 REWRITE_TAC[COMPLEX_RING
7059 `c * ((z + r * c') - w):complex = r * c * c' - c * (w - z)`] THEN
7060 REWRITE_TAC[COMPLEX_MUL_CNJ; NORM_CEXP; RE_MUL_II] THEN
7061 REWRITE_TAC[IM_LINEPATH_CX; REAL_NEG_0; REAL_EXP_0; COMPLEX_MUL_RID;
7063 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_SUB_LT; RE_SUB; RE_CX] THEN
7064 MATCH_MP_TAC(REAL_ARITH
7065 `norm(x) <= norm(y) /\ abs(Re(x)) <= norm(x)
7066 ==> r - norm(y) <= r - Re x`) THEN
7067 REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN
7068 REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP; RE_MUL_II; IM_LINEPATH_CX] THEN
7069 REWRITE_TAC[REAL_EXP_0; REAL_NEG_0; REAL_MUL_LID; GSYM CNJ_SUB] THEN
7070 REWRITE_TAC[COMPLEX_NORM_CNJ; REAL_LE_REFL]);;
7072 let SIMPLE_PATH_PARTCIRCLEPATH = prove
7073 (`!z r s t. simple_path(partcirclepath(z,r,s,t)) <=>
7074 ~(r = &0) /\ ~(s = t) /\ abs(s - t) <= &2 * pi`,
7076 (`(!x y. (&0 <= x /\ x <= &1) /\ (&0 <= y /\ y <= &1) ==> P(abs(x - y))) <=>
7077 (!x. &0 <= x /\ x <= &1 ==> P x)`,
7078 MESON_TAC[REAL_ARITH `(&0 <= x /\ x <= &1) /\ (&0 <= y /\ y <= &1)
7079 ==> &0 <= abs(x - y) /\ abs(x - y) <= &1`;
7080 REAL_ARITH `&0 <= &0 /\ &0 <= &1`;
7081 REAL_ARITH `(&0 <= x ==> abs(x - &0) = x)`]) in
7082 REPEAT GEN_TAC THEN REWRITE_TAC[simple_path; PATH_PARTCIRCLEPATH] THEN
7083 REWRITE_TAC[partcirclepath] THEN
7084 SIMP_TAC[COMPLEX_RING `z + r * x = z + r * y <=> r * (x - y) = Cx(&0)`] THEN
7085 REWRITE_TAC[COMPLEX_ENTIRE; CX_INJ] THEN
7086 ASM_CASES_TAC `r = &0` THEN ASM_REWRITE_TAC[] THENL
7087 [DISCH_THEN(MP_TAC o SPECL [`lift(&1 / &3)`; `lift(&1 / &2)`]) THEN
7088 REWRITE_TAC[IN_INTERVAL_1; LIFT_DROP; GSYM LIFT_NUM; LIFT_EQ] THEN
7089 CONV_TAC REAL_RAT_REDUCE_CONV;
7091 ASM_CASES_TAC `s:real = t` THEN ASM_REWRITE_TAC[] THENL
7092 [DISCH_THEN(MP_TAC o SPECL [`lift(&1 / &3)`; `lift(&1 / &2)`]) THEN
7093 REWRITE_TAC[linepath; VECTOR_ARITH `(&1 - t) % x + t % x = x`] THEN
7094 REWRITE_TAC[IN_INTERVAL_1; LIFT_DROP; GSYM LIFT_NUM; LIFT_EQ] THEN
7095 CONV_TAC REAL_RAT_REDUCE_CONV THEN REWRITE_TAC[COMPLEX_SUB_0];
7097 REWRITE_TAC[COMPLEX_SUB_0; CEXP_EQ] THEN
7098 REWRITE_TAC[COMPLEX_RING
7099 `ii * x = ii * y + z * ii <=> ii * (x - (y + z)) = Cx(&0)`] THEN
7100 REWRITE_TAC[COMPLEX_ENTIRE; II_NZ; LINEPATH_CX] THEN
7101 REWRITE_TAC[GSYM CX_SUB; GSYM CX_ADD; CX_INJ] THEN
7102 REWRITE_TAC[REAL_ARITH
7103 `((&1 - x) * s + x * t) - (((&1 - y) * s + y * t) + z) = &0 <=>
7104 (x - y) * (t - s) = z`] THEN
7105 REWRITE_TAC[GSYM DROP_EQ; DROP_VEC; IN_INTERVAL_1] THEN
7107 `&0 <= x /\ x <= &1 /\ &0 <= y /\ y <= &1
7108 ==> (x = y \/ x = &0 /\ y = &1 \/ x = &1 /\ y = &0 <=>
7109 abs(x - y) = &0 \/ abs(x - y) = &1)`] THEN
7110 SIMP_TAC[PI_POS; REAL_FIELD
7111 `&0 < pi ==> (x = &2 * n * pi <=> n = x / (&2 * pi))`] THEN
7112 REWRITE_TAC[ONCE_REWRITE_RULE[CONJ_SYM] UNWIND_THM2] THEN
7113 ONCE_REWRITE_TAC[GSYM INTEGER_ABS] THEN
7114 REWRITE_TAC[GSYM FORALL_DROP; REAL_ABS_MUL; REAL_ABS_DIV] THEN
7115 REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_PI] THEN
7116 ONCE_REWRITE_TAC[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`] THEN
7117 REWRITE_TAC[lemma] THEN EQ_TAC THENL
7118 [DISCH_THEN(MP_TAC o SPEC `(&2 * pi) / abs(t - s)`) THEN
7119 ASM_SIMP_TAC[REAL_ABS_SUB; REAL_FIELD
7120 `~(s = t) ==> x / abs(s - t) * abs(s - t) = x`] THEN
7121 ASM_SIMP_TAC[PI_POS; INTEGER_CLOSED; REAL_FIELD
7122 `&0 < pi ==> (&2 * pi) / (&2 * pi) = &1`] THEN
7123 ASM_SIMP_TAC[REAL_EQ_LDIV_EQ; REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ;
7124 GSYM REAL_ABS_NZ; REAL_SUB_0] THEN
7125 MP_TAC PI_POS THEN REAL_ARITH_TAC;
7126 DISCH_TAC THEN X_GEN_TAC `x:real` THEN REPEAT STRIP_TAC THEN
7127 FIRST_X_ASSUM(MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
7128 REAL_ABS_INTEGER_LEMMA)) THEN
7129 SIMP_TAC[REAL_ABS_DIV; REAL_ABS_MUL; REAL_ABS_ABS; REAL_ABS_NUM;
7131 SIMP_TAC[REAL_EQ_LDIV_EQ; REAL_LE_RDIV_EQ; PI_POS; REAL_LT_MUL;
7132 REAL_OF_NUM_LT; ARITH] THEN
7133 ASM_CASES_TAC `x = &0` THEN ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN
7134 ASM_REWRITE_TAC[REAL_ENTIRE; REAL_MUL_LID;
7135 REAL_ARITH `abs(t - s) = &0 <=> s = t`] THEN
7136 DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
7137 `p <= x * abs(s - t)
7138 ==> abs(s - t) <= p ==> &1 * abs(s - t) <= x * abs(s - t)`)) THEN
7139 ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN ASM_REWRITE_TAC[] THEN
7140 ASM_SIMP_TAC[REAL_LE_RMUL_EQ; GSYM REAL_ABS_NZ; REAL_SUB_0] THEN
7141 ASM_REAL_ARITH_TAC]);;
7143 let ARC_PARTCIRCLEPATH = prove
7144 (`!z r s t. ~(r = &0) /\ ~(s = t) /\ abs(s - t) < &2 * pi
7145 ==> arc(partcirclepath(z,r,s,t))`,
7146 REPEAT STRIP_TAC THEN REWRITE_TAC[arc; PATH_PARTCIRCLEPATH] THEN
7147 REWRITE_TAC[partcirclepath] THEN
7148 SIMP_TAC[COMPLEX_RING `z + r * x = z + r * y <=> r * (x - y) = Cx(&0)`] THEN
7149 ASM_REWRITE_TAC[COMPLEX_ENTIRE; CX_INJ] THEN
7150 REWRITE_TAC[COMPLEX_SUB_0; CEXP_EQ] THEN
7151 REWRITE_TAC[COMPLEX_RING
7152 `ii * x = ii * y + z * ii <=> ii * (x - (y + z)) = Cx(&0)`] THEN
7153 REWRITE_TAC[COMPLEX_ENTIRE; II_NZ; LINEPATH_CX] THEN
7154 REWRITE_TAC[GSYM CX_SUB; GSYM CX_ADD; CX_INJ] THEN
7155 REWRITE_TAC[REAL_ARITH
7156 `((&1 - x) * s + x * t) - (((&1 - y) * s + y * t) + z) = &0 <=>
7157 (x - y) * (t - s) = z`] THEN
7158 REPEAT GEN_TAC THEN DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
7159 FIRST_X_ASSUM(X_CHOOSE_THEN `n:real` MP_TAC) THEN
7160 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
7161 ASM_CASES_TAC `n = &0` THEN
7162 ASM_REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_ENTIRE; REAL_SUB_0;
7164 MP_TAC(SPEC `n:real` REAL_ABS_INTEGER_LEMMA) THEN
7165 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
7166 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN DISCH_THEN(K ALL_TAC) THEN
7167 MATCH_MP_TAC(REAL_ARITH `abs x < abs y ==> ~(x = y)`) THEN
7168 REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NUM; REAL_ABS_PI] THEN
7169 MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `&1 * &2 * pi` THEN
7172 ONCE_REWRITE_TAC[REAL_ARITH `&2 * n * pi = n * &2 * pi`] THEN
7173 MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN
7174 MP_TAC PI_POS THEN REAL_ARITH_TAC] THEN
7175 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&1 * abs(t - s)` THEN
7178 ASM_REWRITE_TAC[REAL_MUL_LID] THEN ASM_MESON_TAC[REAL_ABS_SUB]] THEN
7179 MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN
7180 REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERVAL_1])) THEN
7181 REWRITE_TAC[DROP_VEC] THEN REAL_ARITH_TAC);;
7183 (* ------------------------------------------------------------------------- *)
7184 (* Special case of one complete circle. *)
7185 (* ------------------------------------------------------------------------- *)
7187 let circlepath = new_definition
7188 `circlepath(z,r) = partcirclepath(z,r,&0,&2 * pi)`;;
7190 let CIRCLEPATH = prove
7191 (`circlepath(z,r) = \x. z + Cx(r) * cexp(Cx(&2) * Cx pi * ii * Cx(drop x))`,
7192 REWRITE_TAC[circlepath; partcirclepath; linepath; COMPLEX_CMUL] THEN
7193 REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_LID] THEN
7194 REWRITE_TAC[CX_MUL; COMPLEX_MUL_AC]);;
7196 let PATHSTART_CIRCLEPATH = prove
7197 (`!r z. pathstart(circlepath(z,r)) = z + Cx(r)`,
7198 REWRITE_TAC[circlepath; PATHSTART_PARTCIRCLEPATH] THEN
7199 REWRITE_TAC[COMPLEX_MUL_RZERO; CEXP_0; COMPLEX_MUL_RID]);;
7201 let PATHFINISH_CIRCLEPATH = prove
7202 (`!r z. pathfinish(circlepath(z,r)) = z + Cx(r)`,
7203 REWRITE_TAC[circlepath; PATHFINISH_PARTCIRCLEPATH] THEN
7204 REWRITE_TAC[CEXP_EULER; GSYM CX_COS; GSYM CX_SIN] THEN
7205 REWRITE_TAC[SIN_NPI; COS_NPI; REAL_POW_NEG; ARITH; REAL_POW_ONE] THEN
7206 CONV_TAC COMPLEX_RING);;
7208 let HAS_VECTOR_DERIVATIVE_CIRCLEPATH = prove
7209 (`((circlepath (z,r)) has_vector_derivative
7210 (Cx(&2) * Cx(pi) * ii * Cx(r) * cexp(Cx(&2) * Cx pi * ii * Cx(drop x))))
7212 REWRITE_TAC[CIRCLEPATH] THEN
7213 MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_REAL_COMPLEX THEN
7214 COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING);;
7216 let VECTOR_DERIVATIVE_CIRCLEPATH = prove
7217 (`vector_derivative (circlepath (z,r)) (at x) =
7218 Cx(&2) * Cx(pi) * ii * Cx(r) * cexp(Cx(&2) * Cx pi * ii * Cx(drop x))`,
7219 MATCH_MP_TAC VECTOR_DERIVATIVE_AT THEN
7220 REWRITE_TAC[HAS_VECTOR_DERIVATIVE_CIRCLEPATH]);;
7222 let VALID_PATH_CIRCLEPATH = prove
7223 (`!z r. valid_path (circlepath(z,r))`,
7224 REWRITE_TAC[circlepath; VALID_PATH_PARTCIRCLEPATH]);;
7226 let PATH_IMAGE_CIRCLEPATH = prove
7227 (`!z r. &0 <= r ==> path_image (circlepath(z,r)) = sphere(z,r)`,
7228 REPEAT STRIP_TAC THEN REWRITE_TAC[CIRCLEPATH; path_image] THEN
7229 REWRITE_TAC[sphere; NORM_ARITH `dist(w,z) = norm(z - w)`] THEN
7230 MATCH_MP_TAC SUBSET_ANTISYM THEN REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
7231 REWRITE_TAC[IN_ELIM_THM; COMPLEX_RING `(z + r) - z = r:complex`] THEN
7232 REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP] THEN CONJ_TAC THENL
7233 [ONCE_REWRITE_TAC[COMPLEX_RING
7234 `Cx(&2) * p * i * z = (Cx(&2) * p * z) * i`] THEN
7235 REWRITE_TAC[RE_MUL_II; GSYM CX_MUL; IM_CX] THEN
7236 REWRITE_TAC[REAL_EXP_NEG; REAL_EXP_0; REAL_MUL_RID; COMPLEX_NORM_CX] THEN
7237 POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
7239 X_GEN_TAC `x:complex` THEN DISCH_TAC THEN ABBREV_TAC `w:complex = x - z` THEN
7240 FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP (COMPLEX_RING
7241 `x - z = w:complex ==> x = z + w`)) THEN
7242 REWRITE_TAC[IN_IMAGE; COMPLEX_RING `z + a = z + b:complex <=> a = b`] THEN
7243 ASM_CASES_TAC `w = Cx(&0)` THENL
7244 [UNDISCH_THEN `norm(w:complex) = r` (MP_TAC o SYM) THEN
7245 ASM_REWRITE_TAC[COMPLEX_NORM_0; REAL_ABS_ZERO] THEN
7246 DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[COMPLEX_MUL_LZERO] THEN
7247 REWRITE_TAC[MEMBER_NOT_EMPTY; INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
7248 REWRITE_TAC[REAL_NOT_LT; REAL_POS];
7250 MP_TAC(SPECL [`Re(w / Cx(norm w))`; `Im(w / Cx(norm w))`]
7251 SINCOS_TOTAL_2PI) THEN
7252 REWRITE_TAC[GSYM COMPLEX_SQNORM] THEN
7253 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NORM] THEN
7254 ASM_SIMP_TAC[REAL_DIV_REFL; REAL_POW_ONE; COMPLEX_NORM_ZERO] THEN
7255 DISCH_THEN(X_CHOOSE_THEN `t:real` (STRIP_ASSUME_TAC o GSYM)) THEN
7256 EXISTS_TAC `lift(t / (&2 * pi))` THEN
7257 ONCE_REWRITE_TAC[COMPLEX_RING
7258 `Cx(&2) * p * i * z = i * (Cx(&2) * p * z)`] THEN
7259 REWRITE_TAC[CEXP_EULER; LIFT_DROP; CX_DIV; CX_MUL] THEN
7260 ASM_SIMP_TAC[CX_PI_NZ; COMPLEX_FIELD
7261 `~(p = Cx(&0)) ==> Cx(&2) * p * t / (Cx(&2) * p) = t`] THEN
7262 ASM_REWRITE_TAC[GSYM CX_COS; GSYM CX_SIN] THEN CONJ_TAC THENL
7263 [REWRITE_TAC[complex_div; GSYM CX_INV] THEN
7264 REWRITE_TAC[SIMPLE_COMPLEX_ARITH `Re(w * Cx x) = Re(w) * x`;
7265 SIMPLE_COMPLEX_ARITH `Im(w * Cx x) = Im(w) * x`] THEN
7266 REWRITE_TAC[COMPLEX_ADD_LDISTRIB; GSYM CX_MUL] THEN
7267 SUBGOAL_THEN `!z:real. r * z * inv r = z` MP_TAC THENL
7268 [SUBGOAL_THEN `~(r = &0)` MP_TAC THENL [ALL_TAC; CONV_TAC REAL_FIELD] THEN
7269 ASM_MESON_TAC[COMPLEX_NORM_ZERO];
7270 ONCE_REWRITE_TAC[COMPLEX_RING `t * ii * s = ii * t * s`] THEN
7271 SIMP_TAC[GSYM CX_MUL; GSYM COMPLEX_EXPAND]];
7272 REWRITE_TAC[IN_INTERVAL_1; DROP_VEC; LIFT_DROP] THEN
7273 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_LT_MUL;
7274 PI_POS; REAL_OF_NUM_LT; ARITH] THEN
7275 ASM_REAL_ARITH_TAC]);;
7277 let HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH_STRONG = prove
7280 (f has_path_integral i) (circlepath(z,r)) /\
7281 &0 <= B /\ &0 < r /\
7282 (!x. norm(x - z) = r /\ ~(x IN k) ==> norm(f x) <= B)
7283 ==> norm(i) <= B * (&2 * pi * r)`,
7284 REWRITE_TAC[circlepath] THEN REPEAT STRIP_TAC THEN
7285 SUBST1_TAC(REAL_ARITH `B * (&2 * pi * r) = B * r * (&2 * pi - &0)`) THEN
7286 MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG THEN
7287 MAP_EVERY EXISTS_TAC
7288 [`f:complex->complex`; `z:complex`; `k:complex->bool`] THEN
7289 ASM_SIMP_TAC[REAL_LE_MUL; REAL_POS; REAL_LT_IMP_LE; PI_POS; IN_DIFF] THEN
7290 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; GSYM circlepath; REAL_LT_IMP_LE] THEN
7291 ASM_REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(w,z) = norm(z - w)`]);;
7293 let HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH = prove
7295 (f has_path_integral i) (circlepath(z,r)) /\
7296 &0 <= B /\ &0 < r /\ (!x. norm(x - z) = r ==> norm(f x) <= B)
7297 ==> norm(i) <= B * (&2 * pi * r)`,
7298 REWRITE_TAC[circlepath] THEN REPEAT STRIP_TAC THEN
7299 SUBST1_TAC(REAL_ARITH `B * (&2 * pi * r) = B * r * (&2 * pi - &0)`) THEN
7300 MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH THEN
7301 MAP_EVERY EXISTS_TAC [`f:complex->complex`; `z:complex`] THEN
7302 ASM_SIMP_TAC[REAL_LE_MUL; REAL_POS; REAL_LT_IMP_LE; PI_POS] THEN
7303 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; GSYM circlepath; REAL_LT_IMP_LE] THEN
7304 ASM_REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(w,z) = norm(z - w)`]);;
7306 let PATH_INTEGRABLE_CONTINUOUS_CIRCLEPATH = prove
7307 (`!f z r. f continuous_on path_image(circlepath(z,r))
7308 ==> f path_integrable_on (circlepath(z,r))`,
7309 SIMP_TAC[PATH_INTEGRABLE_CONTINUOUS_PARTCIRCLEPATH; circlepath]);;
7311 let SIMPLE_PATH_CIRCLEPATH = prove
7312 (`!z r. simple_path(circlepath(z,r)) <=> ~(r = &0)`,
7313 REWRITE_TAC[circlepath; SIMPLE_PATH_PARTCIRCLEPATH] THEN
7314 MP_TAC PI_POS THEN REAL_ARITH_TAC);;
7316 let WINDING_NUMBER_CIRCLEPATH = prove
7317 (`!z r w. norm(w - z) < r ==> winding_number(circlepath(z,r),w) = Cx(&1)`,
7318 REPEAT STRIP_TAC THEN
7319 MATCH_MP_TAC SIMPLE_CLOSED_PATH_WINDING_NUMBER_POS THEN
7320 REWRITE_TAC[SIMPLE_PATH_CIRCLEPATH;
7321 PATHSTART_CIRCLEPATH; PATHFINISH_CIRCLEPATH; CONJ_ASSOC] THEN
7323 [FIRST_X_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
7324 `n < r ==> (&0 <= n ==> &0 <= r /\ &0 < r) /\ n < r`)) THEN
7325 SIMP_TAC[NORM_POS_LE; PATH_IMAGE_CIRCLEPATH; IN_ELIM_THM] THEN
7326 ASM_REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(w,z) = norm(z - w)`] THEN
7328 REWRITE_TAC[circlepath] THEN
7329 MATCH_MP_TAC WINDING_NUMBER_PARTCIRCLEPATH_POS_LT THEN
7330 ASM_SIMP_TAC[REAL_LT_MUL; PI_POS; REAL_OF_NUM_LT; ARITH]]);;
7332 (* ------------------------------------------------------------------------- *)
7333 (* Hence the Cauchy formula for points inside a circle. *)
7334 (* ------------------------------------------------------------------------- *)
7336 let CAUCHY_INTEGRAL_CIRCLEPATH = prove
7338 f continuous_on cball(z,r) /\
7339 f holomorphic_on ball(z,r) /\
7341 ==> ((\u. f(u) / (u - w)) has_path_integral
7342 (Cx(&2) * Cx(pi) * ii * f(w))) (circlepath(z,r))`,
7343 REPEAT STRIP_TAC THEN
7344 MP_TAC(SPECL [`f:complex->complex`; `cball(z:complex,r)`;
7345 `{}:complex->bool`; `circlepath(z,r)`; `w:complex`]
7346 CAUCHY_INTEGRAL_FORMULA_WEAK) THEN
7347 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
7348 ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[dist] THEN DISCH_TAC THEN
7349 ASM_SIMP_TAC[WINDING_NUMBER_CIRCLEPATH; COMPLEX_MUL_LID] THEN
7350 DISCH_THEN MATCH_MP_TAC THEN
7351 ASM_REWRITE_TAC[VALID_PATH_CIRCLEPATH; PATHSTART_CIRCLEPATH; FINITE_RULES;
7352 PATHFINISH_CIRCLEPATH; CONVEX_CBALL; INTERIOR_CBALL; DIFF_EMPTY] THEN
7353 REWRITE_TAC[complex_differentiable] THEN
7354 CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL]; ALL_TAC] THEN
7355 FIRST_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
7356 `n < r ==> &0 <= n ==> &0 <= r`)) THEN
7357 SIMP_TAC[NORM_POS_LE; PATH_IMAGE_CIRCLEPATH] THEN
7358 REWRITE_TAC[SET_RULE `s SUBSET c DELETE q <=> s SUBSET c /\ ~(q IN s)`] THEN
7359 REWRITE_TAC[SPHERE_SUBSET_CBALL; IN_SPHERE] THEN
7360 UNDISCH_TAC `norm(w - z:complex) < r` THEN CONV_TAC NORM_ARITH);;
7362 let CAUCHY_INTEGRAL_CIRCLEPATH_SIMPLE = prove
7364 f holomorphic_on cball(z,r) /\ w IN ball(z,r)
7365 ==> ((\u. f(u) / (u - w)) has_path_integral
7366 (Cx(&2) * Cx(pi) * ii * f(w))) (circlepath(z,r))`,
7367 REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_INTEGRAL_CIRCLEPATH THEN
7368 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
7369 ASM_MESON_TAC[BALL_SUBSET_CBALL; HOLOMORPHIC_ON_SUBSET]);;
7371 (* ------------------------------------------------------------------------- *)
7372 (* Uniform convergence of path integral when the derivative of the path is *)
7373 (* bounded, and in particular for the special case of a circle. *)
7374 (* ------------------------------------------------------------------------- *)
7376 let PATH_INTEGRAL_UNIFORM_LIMIT = prove
7378 ~(trivial_limit net) /\ valid_path g /\
7379 (!t. t IN interval[vec 0,vec 1]
7380 ==> norm(vector_derivative g (at t)) <= B) /\
7381 eventually (\n:A. (f n) path_integrable_on g) net /\
7383 ==> eventually (\n. !x. x IN path_image g
7384 ==> norm(f n x - l x) < e) net)
7385 ==> l path_integrable_on g /\
7386 ((\n. path_integral g (f n)) --> path_integral g l) net`,
7387 REPEAT GEN_TAC THEN STRIP_TAC THEN
7388 MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
7389 [REWRITE_TAC[path_integrable_on; HAS_PATH_INTEGRAL; GSYM integrable_on] THEN
7390 MATCH_MP_TAC INTEGRABLE_UNIFORM_LIMIT THEN
7391 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
7392 FIRST_X_ASSUM(MP_TAC o SPEC `e / (abs B + &1)`) THEN
7393 ASM_SIMP_TAC[REAL_LT_DIV; REAL_ARITH `&0 < abs B + &1`] THEN
7394 UNDISCH_TAC `eventually (\n:A. (f n) path_integrable_on g) net` THEN
7395 REWRITE_TAC[IMP_IMP; GSYM EVENTUALLY_AND] THEN
7396 DISCH_THEN(MP_TAC o MATCH_MP EVENTUALLY_HAPPENS) THEN
7397 ASM_REWRITE_TAC[path_image; path_integrable_on; FORALL_IN_IMAGE] THEN
7398 REWRITE_TAC[HAS_PATH_INTEGRAL; GSYM integrable_on] THEN
7399 DISCH_THEN(X_CHOOSE_THEN `a:A` STRIP_ASSUME_TAC) THEN
7400 EXISTS_TAC `\x. f (a:A) (g x) * vector_derivative g (at x)` THEN
7401 ASM_REWRITE_TAC[GSYM COMPLEX_SUB_RDISTRIB] THEN
7402 X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
7403 MATCH_MP_TAC REAL_LE_TRANS THEN
7404 EXISTS_TAC `e / (abs B + &1) * B` THEN CONJ_TAC THENL
7405 [REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
7406 ASM_SIMP_TAC[NORM_POS_LE] THEN ONCE_REWRITE_TAC[NORM_SUB] THEN
7407 ASM_SIMP_TAC[REAL_LT_IMP_LE];
7408 REWRITE_TAC[REAL_ARITH `e / x * B <= e <=> &0 <= e * (&1 - B / x)`] THEN
7409 MATCH_MP_TAC REAL_LE_MUL THEN
7410 ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_SUB_LE; REAL_LE_LDIV_EQ;
7411 REAL_ARITH `&0 < abs B + &1`] THEN
7414 DISCH_TAC THEN ONCE_REWRITE_TAC[LIM_NULL] THEN REWRITE_TAC[tendsto] THEN
7415 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
7416 FIRST_X_ASSUM(MP_TAC o SPEC `e / &2 / (abs B + &1)`) THEN
7417 ASM_SIMP_TAC[REAL_LT_DIV; REAL_ARITH `&0 < abs B + &1`; REAL_HALF] THEN
7418 UNDISCH_TAC `eventually (\n:A. (f n) path_integrable_on g) net` THEN
7419 REWRITE_TAC[IMP_IMP; GSYM EVENTUALLY_AND] THEN
7420 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
7421 X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
7422 ASM_SIMP_TAC[PATH_INTEGRAL_INTEGRAL; DIST_0; GSYM INTEGRAL_SUB;
7423 GSYM PATH_INTEGRABLE_ON; ETA_AX] THEN
7424 MATCH_MP_TAC REAL_LET_TRANS THEN
7426 `drop(integral (interval[vec 0,vec 1]) (\x:real^1. lift(e / &2)))` THEN
7428 [MATCH_MP_TAC INTEGRAL_NORM_BOUND_INTEGRAL THEN
7429 ASM_SIMP_TAC[INTEGRABLE_SUB; GSYM PATH_INTEGRABLE_ON; ETA_AX] THEN
7430 REWRITE_TAC[INTEGRABLE_CONST; GSYM COMPLEX_SUB_RDISTRIB; LIFT_DROP] THEN
7431 X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
7432 EXISTS_TAC `e / &2 / (abs B + &1) * B` THEN CONJ_TAC THENL
7433 [REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
7434 ASM_SIMP_TAC[NORM_POS_LE] THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
7435 FIRST_X_ASSUM MATCH_MP_TAC THEN
7436 REWRITE_TAC[IN_IMAGE; path_image] THEN ASM_MESON_TAC[];
7437 REWRITE_TAC[REAL_ARITH `e / x * B <= e <=> &0 <= e * (&1 - B / x)`] THEN
7438 MATCH_MP_TAC REAL_LE_MUL THEN
7439 ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_SUB_LE; REAL_LE_LDIV_EQ;
7440 REAL_ARITH `&0 < abs B + &1`] THEN
7441 ASM_REAL_ARITH_TAC];
7442 REWRITE_TAC[INTEGRAL_CONST; CONTENT_UNIT_1; VECTOR_MUL_LID; LIFT_DROP] THEN
7443 ASM_REAL_ARITH_TAC]);;
7445 let PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH = prove
7447 &0 < r /\ ~(trivial_limit net) /\
7448 eventually (\n:A. (f n) path_integrable_on circlepath(z,r)) net /\
7450 ==> eventually (\n. !x. x IN path_image (circlepath(z,r))
7451 ==> norm(f n x - l x) < e) net)
7452 ==> l path_integrable_on circlepath(z,r) /\
7453 ((\n. path_integral (circlepath(z,r)) (f n))
7454 --> path_integral (circlepath(z,r)) l) net`,
7455 REPEAT GEN_TAC THEN STRIP_TAC THEN
7456 MATCH_MP_TAC PATH_INTEGRAL_UNIFORM_LIMIT THEN EXISTS_TAC `&2 * pi * r` THEN
7457 ASM_SIMP_TAC[PI_POS; REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
7458 REWRITE_TAC[VALID_PATH_CIRCLEPATH; VECTOR_DERIVATIVE_CIRCLEPATH] THEN
7459 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
7460 REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_PI; REAL_MUL_LID] THEN
7461 REWRITE_TAC[NORM_CEXP; RE_MUL_CX; RE_MUL_II; IM_CX] THEN
7462 REWRITE_TAC[REAL_NEG_0; REAL_MUL_RZERO; REAL_EXP_0; REAL_MUL_RID] THEN
7463 ASM_SIMP_TAC[real_abs; REAL_LE_REFL; REAL_LT_IMP_LE]);;
7465 (* ------------------------------------------------------------------------- *)
7466 (* General stepping result for derivative formulas. *)
7467 (* ------------------------------------------------------------------------- *)
7469 let CAUCHY_NEXT_DERIVATIVE = prove
7472 open s /\ valid_path g /\
7473 (!t. t IN interval[vec 0,vec 1]
7474 ==> norm(vector_derivative g (at t)) <= B) /\
7475 f' continuous_on path_image g /\
7476 (!w. w IN s DIFF path_image g
7477 ==> ((\u. f'(u) / (u - w) pow k) has_path_integral f w) g)
7478 ==> !w. w IN s DIFF path_image g
7479 ==> (\u. f'(u) / (u - w) pow (k + 1)) path_integrable_on g /\
7480 (f has_complex_derivative
7481 (Cx(&k) * path_integral g (\u. f'(u) / (u - w) pow (k + 1))))
7483 REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `w:complex` THEN
7484 REWRITE_TAC[IN_DIFF] THEN STRIP_TAC THEN
7485 MP_TAC(ISPEC `s DIFF path_image(g:real^1->complex)`
7486 OPEN_CONTAINS_BALL) THEN
7487 ASM_SIMP_TAC[OPEN_DIFF; CLOSED_PATH_IMAGE; VALID_PATH_IMP_PATH] THEN
7488 DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
7489 ASM_REWRITE_TAC[IN_DIFF] THEN
7490 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
7493 `\u x:complex. f'(x) * (inv(x - u) pow k - inv(x - w) pow k) /
7495 `B:real`; `g:real^1->complex`;
7496 `\u. f'(u) / (u - w) pow (k + 1)`]
7497 PATH_INTEGRAL_UNIFORM_LIMIT) THEN
7498 REWRITE_TAC[] THEN ANTS_TAC THENL
7500 MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
7501 DISCH_THEN(MP_TAC o SPEC `Cx(&k)` o MATCH_MP LIM_COMPLEX_LMUL) THEN
7502 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT] THEN
7503 MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
7504 LIM_TRANSFORM_AT) THEN
7505 EXISTS_TAC `d:real` THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `u:complex` THEN
7506 REWRITE_TAC[dist] THEN STRIP_TAC THEN
7507 SUBGOAL_THEN `~(u:complex = w)` ASSUME_TAC THENL
7508 [ASM_MESON_TAC[COMPLEX_SUB_0; COMPLEX_NORM_0; REAL_LT_REFL]; ALL_TAC] THEN
7509 ASM_SIMP_TAC[CX_INJ; REAL_OF_NUM_EQ; COMPLEX_FIELD
7510 `~(y = Cx(&0)) ==> (y * x = z <=> x = z / y)`] THEN
7511 ASM_SIMP_TAC[COMPLEX_SUB_0; CX_INJ; REAL_OF_NUM_EQ; COMPLEX_SUB_LDISTRIB;
7512 COMPLEX_FIELD `~(c = Cx(&0)) ==> (a - b) / c = a / c - b / c`] THEN
7513 MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
7514 MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
7515 REWRITE_TAC[complex_div; COMPLEX_MUL_ASSOC] THEN
7516 REWRITE_TAC[GSYM complex_div] THEN
7517 CONJ_TAC THEN REPEAT(MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_DIV) THEN
7518 REWRITE_TAC[GSYM complex_div; COMPLEX_POW_INV] THEN
7519 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
7520 FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
7521 ASM_REWRITE_TAC[IN_BALL; dist; VECTOR_SUB_REFL; NORM_0] THEN
7522 ASM_MESON_TAC[NORM_SUB]] THEN
7523 ASM_REWRITE_TAC[TRIVIAL_LIMIT_AT] THEN CONJ_TAC THENL
7524 [REWRITE_TAC[EVENTUALLY_AT] THEN EXISTS_TAC `d:real` THEN
7525 ASM_REWRITE_TAC[] THEN X_GEN_TAC `u:complex` THEN
7526 REWRITE_TAC[dist] THEN STRIP_TAC THEN
7527 REWRITE_TAC[complex_div; COMPLEX_MUL_ASSOC] THEN
7528 REPEAT(MATCH_MP_TAC PATH_INTEGRABLE_COMPLEX_RMUL) THEN
7529 REWRITE_TAC[COMPLEX_SUB_LDISTRIB; COMPLEX_POW_INV; GSYM complex_div] THEN
7530 MATCH_MP_TAC PATH_INTEGRABLE_SUB THEN
7531 REWRITE_TAC[path_integrable_on] THEN CONJ_TAC THENL
7532 [EXISTS_TAC `(f:complex->complex) u`;
7533 EXISTS_TAC `(f:complex->complex) w`] THEN
7534 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
7535 FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
7536 REWRITE_TAC[IN_BALL; dist; VECTOR_SUB_REFL; NORM_0] THEN
7537 ASM_MESON_TAC[NORM_SUB];
7542 (\n. !x. x IN path_image g
7544 ((inv (x - n) pow k - inv (x - w) pow k) /
7545 (n - w) / Cx(&k) - inv(x - w) pow (k + 1)) <
7550 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
7551 SUBGOAL_THEN `bounded(IMAGE (f':complex->complex) (path_image g))`
7553 [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
7554 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
7555 ASM_SIMP_TAC[COMPACT_VALID_PATH_IMAGE];
7557 REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
7558 DISCH_THEN(X_CHOOSE_THEN `C:real` STRIP_ASSUME_TAC) THEN
7559 FIRST_X_ASSUM(MP_TAC o SPEC `e / C:real`) THEN
7560 ASM_SIMP_TAC[REAL_LT_DIV] THEN
7561 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
7562 X_GEN_TAC `u:complex` THEN REWRITE_TAC[] THEN
7563 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `x:complex` THEN
7564 DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
7565 ASM_REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC] THEN
7566 REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB; COMPLEX_NORM_MUL] THEN
7567 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_SIMP_TAC[REAL_LT_RDIV_EQ] THEN
7568 MATCH_MP_TAC(REAL_ARITH `a <= b ==> b < x ==> a < x`) THEN
7569 REWRITE_TAC[COMPLEX_POW_INV] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
7570 ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE]] THEN
7571 X_GEN_TAC `e:real` THEN DISCH_TAC THEN REWRITE_TAC[EVENTUALLY_AT] THEN
7572 EXISTS_TAC `min (d / &2) ((e * (d / &2) pow (k + 2)) / (&k + &1))` THEN
7573 ASM_SIMP_TAC[REAL_LT_MIN; REAL_HALF; REAL_POW_LT; REAL_LT_MUL; dist;
7574 REAL_LT_DIV; REAL_ARITH `&0 < &k + &1`] THEN
7575 X_GEN_TAC `u:complex` THEN STRIP_TAC THEN
7576 X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
7577 MP_TAC(ISPECL [`\n w. if n = 0 then inv(x - w) pow k
7578 else if n = 1 then Cx(&k) / (x - w) pow (k + 1)
7579 else (Cx(&k) * Cx(&k + &1)) / (x - w) pow (k + 2)`;
7580 `1`; `ball(w:complex,d / &2)`;
7581 `(&k * (&k + &1)) / (d / &2) pow (k + 2)`]
7582 COMPLEX_TAYLOR) THEN
7583 REWRITE_TAC[] THEN ANTS_TAC THENL
7584 [REWRITE_TAC[CONVEX_BALL; ADD_EQ_0; ARITH] THEN CONJ_TAC THENL
7586 X_GEN_TAC `v:complex` THEN REWRITE_TAC[IN_BALL; dist] THEN DISCH_TAC THEN
7587 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_CX]THEN
7588 REWRITE_TAC[real_div; GSYM REAL_POW_INV; GSYM REAL_MUL_ASSOC] THEN
7589 REWRITE_TAC[REAL_ABS_NUM; REAL_ARITH `abs(&k + &1) = &k + &1`] THEN
7590 REPEAT(MATCH_MP_TAC REAL_LE_LMUL THEN
7591 CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC]) THEN
7592 REWRITE_TAC[REAL_POW_INV] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
7593 ASM_SIMP_TAC[GSYM real_div; REAL_POW_LT; REAL_HALF] THEN
7594 REWRITE_TAC[COMPLEX_NORM_POW] THEN MATCH_MP_TAC REAL_POW_LE2 THEN
7595 ASM_SIMP_TAC[REAL_ARITH `&0 < d ==> &0 <= d / &2`] THEN
7596 UNDISCH_TAC `ball(w:complex,d) SUBSET s DIFF path_image g` THEN
7597 REWRITE_TAC[SUBSET] THEN DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
7598 ASM_REWRITE_TAC[IN_DIFF; IN_BALL] THEN
7599 UNDISCH_TAC `norm(w - v:complex) < d / &2` THEN
7600 CONV_TAC NORM_ARITH] THEN
7601 GEN_TAC THEN X_GEN_TAC `y:complex` THEN
7602 REWRITE_TAC[IN_BALL; dist] THEN STRIP_TAC THEN
7603 SUBGOAL_THEN `~(y:complex = x)` ASSUME_TAC THENL
7604 [DISCH_THEN SUBST_ALL_TAC THEN
7605 UNDISCH_TAC `ball(w:complex,d) SUBSET s DIFF path_image g` THEN
7606 REWRITE_TAC[SUBSET] THEN DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
7607 ASM_REWRITE_TAC[IN_DIFF; IN_BALL; dist] THEN ASM_REAL_ARITH_TAC;
7609 FIRST_X_ASSUM(DISJ_CASES_THEN SUBST_ALL_TAC o MATCH_MP
7610 (ARITH_RULE `i <= 1 ==> i = 0 \/ i = 1`)) THEN
7611 REWRITE_TAC[ARITH] THEN
7612 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
7613 COMPLEX_DIFF_TAC THEN
7614 REWRITE_TAC[COMPLEX_POW_EQ_0; COMPLEX_INV_EQ_0; CONJ_ASSOC;
7615 COMPLEX_MUL_LZERO; COMPLEX_SUB_0; ADD_EQ_0; ARITH] THEN
7616 REWRITE_TAC[COMPLEX_SUB_LZERO; COMPLEX_NEG_NEG; complex_div] THEN
7617 REWRITE_TAC[COMPLEX_MUL_LID; GSYM COMPLEX_MUL_ASSOC;
7618 GSYM COMPLEX_POW_INV; GSYM COMPLEX_INV_MUL; GSYM COMPLEX_POW_ADD] THEN
7619 ASM_SIMP_TAC[ARITH_RULE `~(k = 0) ==> k - 1 + 2 = k + 1`] THEN
7620 REWRITE_TAC[COMPLEX_INV_INV; ADD_SUB; COMPLEX_MUL_RNEG;
7621 COMPLEX_NEG_NEG; COMPLEX_MUL_RID; COMPLEX_POW_POW] THEN
7622 REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; GSYM REAL_OF_NUM_ADD] THEN
7623 AP_TERM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[COMPLEX_POW_INV] THEN
7624 ASM_SIMP_TAC[COMPLEX_POW_EQ_0; COMPLEX_INV_EQ_0; COMPLEX_SUB_0;
7625 COMPLEX_FIELD `~(x = Cx(&0)) /\ ~(y = Cx(&0))
7626 ==> (z * inv x = inv y <=> y * z = x)`] THEN
7627 REWRITE_TAC[GSYM COMPLEX_POW_ADD] THEN AP_TERM_TAC THEN ARITH_TAC;
7629 DISCH_THEN(MP_TAC o SPECL [`w:complex`; `u:complex`]) THEN
7630 ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_HALF; NUMSEG_CONV `0..1`] THEN
7631 ASM_SIMP_TAC[IN_BALL; dist; VSUM_CLAUSES; FINITE_RULES] THEN
7632 ANTS_TAC THENL [ASM_MESON_TAC[NORM_SUB]; ALL_TAC] THEN
7633 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; ARITH] THEN
7634 REWRITE_TAC[complex_pow; VECTOR_ADD_RID; ARITH; FACT] THEN
7635 CONV_TAC NUM_REDUCE_CONV THEN
7636 REWRITE_TAC[COMPLEX_DIV_1; COMPLEX_MUL_RID; COMPLEX_POW_1] THEN
7637 SUBGOAL_THEN `~(u:complex = w)` ASSUME_TAC THENL
7638 [ASM_MESON_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; REAL_LT_REFL];
7640 SUBGOAL_THEN `~(x:complex = w)` ASSUME_TAC THENL
7641 [ASM_MESON_TAC[]; ALL_TAC] THEN
7642 ASM_SIMP_TAC[COMPLEX_SUB_0; COMPLEX_POW_EQ_0; CX_INJ; REAL_OF_NUM_EQ;
7644 `~(d = Cx(&0)) /\ ~(c = Cx(&0)) /\ ~(e = Cx(&0))
7645 ==> a - (b + c / d * e) = ((a - b) / e / c - inv d) * c * e`] THEN
7646 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; REAL_DIV_1] THEN
7647 REWRITE_TAC[REAL_ABS_NUM; GSYM COMPLEX_POW_INV] THEN DISCH_TAC THEN
7648 MATCH_MP_TAC REAL_LT_RCANCEL_IMP THEN
7649 EXISTS_TAC `&k * norm(u - w:complex)` THEN
7650 ASM_SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; LT_NZ] THEN
7651 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
7652 `n <= x ==> x < y ==> n < y`)) THEN
7653 REWRITE_TAC[REAL_POW_2; REAL_MUL_ASSOC] THEN
7654 ASM_SIMP_TAC[REAL_POW_2; REAL_MUL_ASSOC; REAL_LT_RMUL_EQ] THEN
7655 GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
7656 REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
7657 MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[REAL_OF_NUM_LT; LT_NZ] THEN
7658 ONCE_REWRITE_TAC[REAL_ARITH `a * b * c:real = (c * a) * b`] THEN
7659 ASM_SIMP_TAC[GSYM real_div; REAL_LT_LDIV_EQ; REAL_HALF; REAL_POW_LT] THEN
7660 ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_ARITH `&0 < &k + &1`]);;
7662 let CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH = prove
7665 (f continuous_on path_image(circlepath(z,r))) /\
7667 ==> ((\u. f(u) / (u - w) pow k) has_path_integral g w)
7669 ==> !w. w IN ball(z,r)
7670 ==> (\u. f(u) / (u - w) pow (k + 1)) path_integrable_on
7671 (circlepath(z,r)) /\
7672 (g has_complex_derivative
7673 (Cx(&k) * path_integral(circlepath(z,r))
7674 (\u. f(u) / (u - w) pow (k + 1))))
7676 REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_CASES_TAC `&0 <= r` THENL
7678 GEN_TAC THEN REWRITE_TAC[IN_BALL] THEN
7679 MATCH_MP_TAC(TAUT `~p ==> p ==> q`) THEN
7680 UNDISCH_TAC `~(&0 <= r)` THEN CONV_TAC NORM_ARITH] THEN
7682 [`f:complex->complex`; `g:complex->complex`; `circlepath(z,r)`;
7683 `ball(z:complex,r)`; `k:num`; `&2 * pi * r`] CAUCHY_NEXT_DERIVATIVE) THEN
7684 ASM_REWRITE_TAC[OPEN_BALL; VALID_PATH_CIRCLEPATH] THEN
7685 SUBGOAL_THEN `ball(z,r) DIFF path_image(circlepath (z,r)) = ball(z,r)`
7687 [REWRITE_TAC[SET_RULE `s DIFF t = s <=> !x. x IN t ==> ~(x IN s)`] THEN
7688 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; IN_SPHERE; IN_BALL; REAL_LT_REFL];
7689 DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
7690 REWRITE_TAC[VECTOR_DERIVATIVE_CIRCLEPATH] THEN
7691 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
7692 REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_PI; REAL_MUL_LID] THEN
7693 REWRITE_TAC[NORM_CEXP; RE_MUL_CX; RE_MUL_II; IM_CX] THEN
7694 REWRITE_TAC[REAL_NEG_0; REAL_MUL_RZERO; REAL_EXP_0; REAL_MUL_RID] THEN
7695 ASM_SIMP_TAC[real_abs; REAL_LE_REFL]]);;
7697 (* ------------------------------------------------------------------------- *)
7698 (* In particular, the first derivative formula. *)
7699 (* ------------------------------------------------------------------------- *)
7701 let CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH = prove
7703 f continuous_on cball(z,r) /\
7704 f holomorphic_on ball(z,r) /\
7706 ==> (\u. f(u) / (u - w) pow 2) path_integrable_on circlepath(z,r) /\
7707 (f has_complex_derivative
7708 (Cx(&1) / (Cx(&2) * Cx(pi) * ii) *
7709 path_integral(circlepath(z,r)) (\u. f(u) / (u - w) pow 2)))
7711 REPEAT GEN_TAC THEN STRIP_TAC THEN
7712 MP_TAC(SPECL [`f:complex->complex`; `\x:complex. Cx(&2) * Cx(pi) * ii * f x`;
7713 `z:complex`; `r:real`; `1`]
7714 CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
7715 ASM_SIMP_TAC[COMPLEX_POW_1; ARITH; CAUCHY_INTEGRAL_CIRCLEPATH] THEN
7717 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `cball(z:complex,r)` THEN
7718 ASM_REWRITE_TAC[] THEN
7719 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
7720 DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
7721 `n < r ==> &0 <= n ==> &0 <= r`)) THEN
7722 SIMP_TAC[DIST_POS_LE; PATH_IMAGE_CIRCLEPATH; SPHERE_SUBSET_CBALL];
7724 DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN ASM_REWRITE_TAC[] THEN
7725 MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[COMPLEX_MUL_LID] THEN
7726 DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
7727 MATCH_MP HAS_COMPLEX_DERIVATIVE_LMUL_AT) THEN
7728 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
7729 REWRITE_TAC[FUN_EQ_THM] THEN MP_TAC CX_2PII_NZ THEN CONV_TAC COMPLEX_FIELD);;
7731 (* ------------------------------------------------------------------------- *)
7732 (* Existence of all higher derivatives. *)
7733 (* ------------------------------------------------------------------------- *)
7735 let HOLOMORPHIC_DERIVATIVE = prove
7736 (`!f f' s. open s /\ (!z. z IN s ==> (f has_complex_derivative f'(z)) (at z))
7737 ==> f' holomorphic_on s`,
7738 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN] THEN
7739 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7740 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
7741 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
7742 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
7743 MP_TAC(SPECL [`\x. Cx(&1) / (Cx(&2) * Cx pi * ii) * f(x:complex)`;
7744 `f':complex->complex`; `z:complex`; `r:real`; `2`]
7745 CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
7746 ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[CENTRE_IN_BALL]] THEN
7747 SUBGOAL_THEN `f holomorphic_on cball(z,r)` ASSUME_TAC THENL
7748 [ASM_REWRITE_TAC[holomorphic_on] THEN
7749 ASM_MESON_TAC[SUBSET; HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
7751 REWRITE_TAC[ARITH] THEN CONJ_TAC THENL
7752 [MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_LMUL THEN
7753 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `cball(z:complex,r)` THEN
7754 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
7755 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE; SPHERE_SUBSET_CBALL];
7757 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
7758 MP_TAC(SPECL [`f:complex->complex`; `z:complex`; `r:real`; `w:complex`]
7759 CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH) THEN
7761 [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
7765 FIRST_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRAL) THEN
7766 DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
7767 MATCH_MP HAS_PATH_INTEGRAL_COMPLEX_LMUL) THEN
7768 REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC] THEN
7769 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
7770 REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM complex_div] THEN
7771 MATCH_MP_TAC COMPLEX_DERIVATIVE_UNIQUE_AT THEN
7772 MAP_EVERY EXISTS_TAC [`f:complex->complex`; `w:complex`] THEN
7773 ASM_REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC] THEN
7774 ASM_MESON_TAC[SUBSET; BALL_SUBSET_CBALL]);;
7776 let HOLOMORPHIC_COMPLEX_DERIVATIVE = prove
7777 (`!f s. open s /\ f holomorphic_on s
7778 ==> (complex_derivative f) holomorphic_on s`,
7779 REPEAT STRIP_TAC THEN MATCH_MP_TAC HOLOMORPHIC_DERIVATIVE THEN
7780 EXISTS_TAC `f:complex->complex` THEN ASM_REWRITE_TAC[] THEN
7781 ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DERIVATIVE; HOLOMORPHIC_ON_OPEN]);;
7783 let ANALYTIC_COMPLEX_DERIVATIVE = prove
7784 (`!f s. f analytic_on s ==> (complex_derivative f) analytic_on s`,
7785 REPEAT GEN_TAC THEN REWRITE_TAC[analytic_on] THEN DISCH_TAC THEN
7786 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7787 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7788 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
7789 SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_BALL]);;
7791 let HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE = prove
7792 (`!f s n. open s /\ f holomorphic_on s
7793 ==> (higher_complex_derivative n f) holomorphic_on s`,
7794 REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN
7796 ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; higher_complex_derivative]);;
7798 let ANALYTIC_HIGHER_COMPLEX_DERIVATIVE = prove
7799 (`!f s n. f analytic_on s ==> (higher_complex_derivative n f) analytic_on s`,
7800 REPEAT GEN_TAC THEN REWRITE_TAC[analytic_on] THEN DISCH_TAC THEN
7801 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7802 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7803 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
7804 ASM_SIMP_TAC[HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE; OPEN_BALL]);;
7806 let HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE = prove
7807 (`!f s x n. open s /\ f holomorphic_on s /\ x IN s
7808 ==> ((higher_complex_derivative n f) has_complex_derivative
7809 (higher_complex_derivative (SUC n) f x)) (at x)`,
7810 REPEAT STRIP_TAC THEN REWRITE_TAC[higher_complex_derivative] THEN
7811 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
7812 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
7813 EXISTS_TAC `s:complex->bool` THEN
7814 ASM_SIMP_TAC[HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]);;
7816 (* ------------------------------------------------------------------------- *)
7817 (* Morera's theorem. *)
7818 (* ------------------------------------------------------------------------- *)
7820 let MORERA_LOCAL_TRIANGLE_GEN = prove
7823 ==> ?e a. &0 < e /\ z IN ball(a,e) /\ f continuous_on ball(a,e) /\
7824 !b c. segment[b,c] SUBSET ball(a,e)
7825 ==> path_integral (linepath(a,b)) f +
7826 path_integral (linepath(b,c)) f +
7827 path_integral (linepath(c,a)) f = Cx(&0))
7828 ==> f analytic_on s`,
7829 REPEAT STRIP_TAC THEN REWRITE_TAC[analytic_on] THEN
7830 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7831 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7832 ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
7833 MAP_EVERY X_GEN_TAC [`e:real`; `a:complex`] THEN STRIP_TAC THEN
7834 EXISTS_TAC `e - dist(a:complex,z)` THEN CONJ_TAC THENL
7835 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN NORM_ARITH_TAC;
7837 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `ball(a:complex,e)` THEN
7839 [MATCH_MP_TAC HOLOMORPHIC_DERIVATIVE THEN REWRITE_TAC[OPEN_BALL] THEN
7840 MATCH_MP_TAC TRIANGLE_PATH_INTEGRALS_STARLIKE_PRIMITIVE THEN
7841 EXISTS_TAC `a:complex` THEN ASM_REWRITE_TAC[CENTRE_IN_BALL; OPEN_BALL] THEN
7842 REPEAT STRIP_TAC THEN REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
7843 MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
7844 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; CENTRE_IN_BALL];
7845 REWRITE_TAC[SUBSET; IN_BALL] THEN NORM_ARITH_TAC]);;
7847 let MORERA_LOCAL_TRIANGLE = prove
7849 ==> ?t. open t /\ z IN t /\ f continuous_on t /\
7850 !a b c. convex hull {a,b,c} SUBSET t
7851 ==> path_integral (linepath(a,b)) f +
7852 path_integral (linepath(b,c)) f +
7853 path_integral (linepath(c,a)) f = Cx(&0))
7854 ==> f analytic_on s`,
7855 REPEAT GEN_TAC THEN DISCH_TAC THEN
7856 MATCH_MP_TAC MORERA_LOCAL_TRIANGLE_GEN THEN
7857 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
7858 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
7859 ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
7860 X_GEN_TAC `t:complex->bool` THEN STRIP_TAC THEN
7861 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
7862 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
7863 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
7864 EXISTS_TAC `z:complex` THEN ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN
7865 CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
7866 MAP_EVERY X_GEN_TAC [`x:complex`; `w:complex`] THEN DISCH_TAC THEN
7867 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM
7868 (MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT] SUBSET_TRANS)) THEN
7869 MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
7870 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; CENTRE_IN_BALL] THEN
7871 MP_TAC(ISPECL [`x:complex`; `w:complex`] ENDS_IN_SEGMENT) THEN
7874 let MORERA_TRIANGLE = prove
7875 (`!f s. open s /\ f continuous_on s /\
7876 (!a b c. convex hull {a,b,c} SUBSET s
7877 ==> path_integral (linepath(a,b)) f +
7878 path_integral (linepath(b,c)) f +
7879 path_integral (linepath(c,a)) f = Cx(&0))
7880 ==> f analytic_on s`,
7881 REPEAT STRIP_TAC THEN MATCH_MP_TAC MORERA_LOCAL_TRIANGLE THEN
7882 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN EXISTS_TAC `s:complex->bool` THEN
7883 ASM_REWRITE_TAC[]);;
7885 (* ------------------------------------------------------------------------- *)
7886 (* Combining theorems for higher derivatives including Leibniz rule. *)
7887 (* ------------------------------------------------------------------------- *)
7889 let HIGHER_COMPLEX_DERIVATIVE_EQ_ITER = prove
7890 (`!n. higher_complex_derivative n = ITER n complex_derivative`,
7892 ASM_REWRITE_TAC [FUN_EQ_THM; ITER; higher_complex_derivative]);;
7894 let HIGHER_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE = prove
7895 (`!f m n. higher_complex_derivative m (higher_complex_derivative n f) =
7896 higher_complex_derivative (m + n) f`,
7897 REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_EQ_ITER; ITER_ADD]);;
7899 let higher_complex_derivative_alt = prove
7900 (`(!f. higher_complex_derivative 0 f = f) /\
7901 (!f z n. higher_complex_derivative (SUC n) f =
7902 higher_complex_derivative n (complex_derivative f))`,
7903 REWRITE_TAC [HIGHER_COMPLEX_DERIVATIVE_EQ_ITER; ITER_ALT]);;
7905 let HIGHER_COMPLEX_DERIVATIVE_LINEAR = prove
7906 (`!c n. higher_complex_derivative n (\w. c * w) =
7907 \z. if n = 0 then c * z else if n = 1 then c else (Cx(&0))`,
7908 GEN_TAC THEN INDUCT_TAC THEN
7909 ASM_REWRITE_TAC [higher_complex_derivative; NOT_SUC; SUC_INJ; ONE] THEN
7910 STRUCT_CASES_TAC (SPEC `n:num` num_CASES) THEN
7911 REWRITE_TAC [NOT_SUC; SUC_INJ;
7912 COMPLEX_DERIVATIVE_LINEAR; COMPLEX_DERIVATIVE_CONST]);;
7914 let HIGHER_COMPLEX_DERIVATIVE_CONST = prove
7915 (`!i c. higher_complex_derivative i (\w.c) = \w. if i=0 then c else Cx(&0)`,
7916 INDUCT_TAC THEN ASM_REWRITE_TAC [higher_complex_derivative_alt; NOT_SUC;
7917 COMPLEX_DERIVATIVE_CONST; FUN_EQ_THM] THEN
7920 let HIGHER_COMPLEX_DERIVATIVE_ID = prove
7921 (`!z i. higher_complex_derivative i (\w.w) z =
7922 if i = 0 then z else if i = 1 then Cx(&1) else Cx(&0)`,
7923 GEN_TAC THEN INDUCT_TAC THEN
7924 ASM_REWRITE_TAC [higher_complex_derivative_alt; NOT_SUC; ONE; SUC_INJ] THEN
7925 REWRITE_TAC[COMPLEX_DERIVATIVE_ID; HIGHER_COMPLEX_DERIVATIVE_CONST; ONE]);;
7927 let HAS_COMPLEX_DERIVATIVE_ITER_1 = prove
7928 (`!f n z. f z = z /\ (f has_complex_derivative Cx(&1)) (at z)
7929 ==> (ITER n f has_complex_derivative Cx(&1)) (at z)`,
7930 GEN_TAC THEN INDUCT_TAC THEN REPEAT STRIP_TAC THEN
7931 REWRITE_TAC [ITER_POINTLESS; I_DEF; HAS_COMPLEX_DERIVATIVE_ID] THEN
7932 SUBGOAL_THEN `Cx(&1) = Cx(&1) * Cx(&1)` SUBST1_TAC THENL
7933 [REWRITE_TAC [COMPLEX_MUL_LID];
7934 ASM_SIMP_TAC [ITER_FIXPOINT; COMPLEX_DIFF_CHAIN_AT]]);;
7936 let HIGHER_COMPLEX_DERIVATIVE_NEG = prove
7938 open s /\ f holomorphic_on s /\ z IN s
7939 ==> higher_complex_derivative n (\w. --(f w)) z =
7940 --(higher_complex_derivative n f z)`,
7941 REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7942 REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7943 REWRITE_TAC [higher_complex_derivative] THEN REPEAT STRIP_TAC THEN
7944 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7945 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7946 EXISTS_TAC `(\w. --(higher_complex_derivative n f w))` THEN
7947 EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
7948 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_NEG THEN
7949 REWRITE_TAC [ETA_AX; GSYM higher_complex_derivative] THEN
7950 ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]);;
7952 let HIGHER_COMPLEX_DERIVATIVE_ADD = prove
7954 open s /\ f holomorphic_on s /\ g holomorphic_on s /\ z IN s ==>
7955 higher_complex_derivative n (\w. f w + g w) z =
7956 higher_complex_derivative n f z + higher_complex_derivative n g z`,
7957 REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7958 REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7959 REWRITE_TAC [higher_complex_derivative] THEN REPEAT STRIP_TAC THEN
7960 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7961 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7962 EXISTS_TAC `(\w. higher_complex_derivative n f w +
7963 higher_complex_derivative n g w)` THEN
7964 EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
7965 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_ADD THEN
7966 REWRITE_TAC [ETA_AX; GSYM higher_complex_derivative] THEN
7967 ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]);;
7969 let HIGHER_COMPLEX_DERIVATIVE_SUB = prove
7971 open s /\ f holomorphic_on s /\ g holomorphic_on s /\ z IN s ==>
7972 higher_complex_derivative n (\w. f w - g w) z =
7973 higher_complex_derivative n f z - higher_complex_derivative n g z`,
7974 REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7975 REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7976 REWRITE_TAC [higher_complex_derivative] THEN REPEAT STRIP_TAC THEN
7977 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7978 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7979 EXISTS_TAC `(\w. higher_complex_derivative n f w -
7980 higher_complex_derivative n g w)` THEN
7981 EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
7982 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
7983 REWRITE_TAC [ETA_AX; GSYM higher_complex_derivative] THEN
7984 ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]);;
7986 let HIGHER_COMPLEX_DERIVATIVE_MUL = prove
7988 open s /\ f holomorphic_on s /\ g holomorphic_on s /\ z IN s
7989 ==> higher_complex_derivative n (\w. f w * g w) z =
7990 vsum (0..n) (\i. Cx(&(binom(n,i))) *
7991 higher_complex_derivative i f z *
7992 higher_complex_derivative (n-i) g z)`,
7993 REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
7994 REPEAT DISCH_TAC THEN INDUCT_TAC THEN
7995 REPEAT STRIP_TAC THEN REWRITE_TAC [NUMSEG_SING; VSUM_SING; SUB] THEN
7996 REWRITE_TAC [higher_complex_derivative; binom; COMPLEX_MUL_LID] THEN
7997 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
7998 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
7999 EXISTS_TAC `\w. vsum (0..n)
8000 (\i. Cx(&(binom (n,i))) *
8001 higher_complex_derivative i f w *
8002 higher_complex_derivative (n-i) g w)` THEN
8003 EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [] THEN
8004 SUBGOAL_THEN `vsum (0..SUC n) (\i. Cx(&(binom (SUC n,i))) *
8005 higher_complex_derivative i f z *
8006 higher_complex_derivative (SUC n-i) g z) =
8007 vsum (0..n) (\i. Cx(&(binom (n,i))) *
8008 (higher_complex_derivative i f z *
8009 higher_complex_derivative (SUC n-i) g z +
8010 higher_complex_derivative (SUC i) f z *
8011 higher_complex_derivative (n-i) g z))`
8014 `!i. binom(SUC n,i) = binom(n,i) + if i=0 then 0 else binom(n,PRE i)`
8015 (fun th -> REWRITE_TAC[th; GSYM REAL_OF_NUM_ADD; CX_ADD]) THENL
8016 [INDUCT_TAC THEN REWRITE_TAC[binom; NOT_SUC; PRE; ADD_SYM; ADD_0];
8017 REWRITE_TAC [COMPLEX_ADD_LDISTRIB; COMPLEX_ADD_RDISTRIB]] THEN
8018 SIMP_TAC [VSUM_ADD; FINITE_NUMSEG] THEN BINOP_TAC THENL
8019 [REWRITE_TAC [VSUM_CLAUSES_NUMSEG; LE_0] THEN
8020 SUBGOAL_THEN `binom(n,SUC n)=0` SUBST1_TAC THENL
8021 [REWRITE_TAC [BINOM_EQ_0] THEN ARITH_TAC; CONV_TAC COMPLEX_RING];
8022 SIMP_TAC [VSUM_CLAUSES_LEFT; SPEC `SUC n` LE_0] THEN
8023 REWRITE_TAC [COMPLEX_MUL_LZERO; COMPLEX_ADD_LID; GSYM ADD1;
8024 VSUM_SUC; o_DEF; SUB_SUC; NOT_SUC; PRE]];
8025 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_VSUM THEN
8026 REWRITE_TAC [FINITE_NUMSEG; IN_NUMSEG] THEN REPEAT STRIP_TAC THEN
8027 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_LMUL_AT THEN
8028 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_MUL_AT THEN
8029 ASM_SIMP_TAC [ETA_AX; ARITH_RULE `i <= n ==> SUC n - i = SUC (n-i)`] THEN
8030 ASM_MESON_TAC [HAS_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]]);;
8032 let HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN = prove
8034 open s /\ f holomorphic_on s /\ g holomorphic_on s /\
8035 (!w. w IN s ==> f w = g w) /\ z IN s
8036 ==> higher_complex_derivative i f z = higher_complex_derivative i g z`,
8037 REWRITE_TAC [IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN
8038 REPEAT DISCH_TAC THEN INDUCT_TAC THEN REPEAT STRIP_TAC THEN
8039 ASM_SIMP_TAC [higher_complex_derivative] THEN
8040 MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
8041 ASM_MESON_TAC [HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]);;
8043 let HIGHER_COMPLEX_DERIVATIVE_COMPOSE_LINEAR = prove
8045 f holomorphic_on t /\ open s /\ open t /\
8046 (!w. w IN s ==> u * w IN t) /\ z IN s
8047 ==> higher_complex_derivative n (\w. f (u * w)) z =
8048 u pow n * higher_complex_derivative n f (u * z)`,
8049 REWRITE_TAC [RIGHT_FORALL_IMP_THM; IMP_CONJ] THEN
8050 REPEAT GEN_TAC THEN REPEAT DISCH_TAC THEN INDUCT_TAC THEN
8051 REWRITE_TAC [higher_complex_derivative; complex_pow; COMPLEX_MUL_LID] THEN
8052 REPEAT STRIP_TAC THEN EQ_TRANS_TAC
8054 (\z. u pow n * higher_complex_derivative n f (u * z)) z` THENL
8055 [MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
8056 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8057 [MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
8058 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC
8059 (REWRITE_RULE [o_DEF]
8060 (SPECL [`\z:complex. u * z`; `f:complex->complex`]
8061 HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
8062 EXISTS_TAC `t:complex->bool` THEN ASM_REWRITE_TAC[] THEN MATCH_MP_TAC
8063 (REWRITE_RULE [o_DEF]
8064 (SPECL [`\w:complex. u:complex`; `\w:complex. w`]
8065 HOLOMORPHIC_ON_MUL)) THEN
8066 REWRITE_TAC [HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID];
8067 MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
8068 SIMP_TAC [HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_CONST] THEN MATCH_MP_TAC
8069 (REWRITE_RULE [o_DEF]
8070 (SPECL [`\w. u * w`; `higher_complex_derivative f n`]
8071 HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
8072 EXISTS_TAC `t:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8074 (REWRITE_RULE [o_DEF]
8075 (SPECL [`\w:complex. u:complex`; `\w:complex. w`]
8076 HOLOMORPHIC_ON_MUL)) THEN
8077 REWRITE_TAC [HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID];
8078 ASM_SIMP_TAC [HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]]];
8080 `u pow n * complex_derivative
8081 (\z. higher_complex_derivative n f (u * z)) z` THENL
8082 [MATCH_MP_TAC COMPLEX_DERIVATIVE_LMUL THEN
8083 MATCH_MP_TAC ANALYTIC_ON_IMP_DIFFERENTIABLE_AT THEN
8084 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
8085 MATCH_MP_TAC (REWRITE_RULE [o_DEF] ANALYTIC_ON_COMPOSE_GEN) THEN
8086 EXISTS_TAC `t:complex->bool` THEN
8087 ASM_SIMP_TAC [ANALYTIC_ON_LINEAR; ANALYTIC_HIGHER_COMPLEX_DERIVATIVE;
8089 ABBREV_TAC `a = u:complex pow n` THEN
8090 REWRITE_TAC [COMPLEX_MUL_AC; COMPLEX_EQ_MUL_LCANCEL] THEN
8091 ASM_CASES_TAC `a = Cx(&0)` THEN ASM_REWRITE_TAC[] THEN
8092 GEN_REWRITE_TAC RAND_CONV [COMPLEX_MUL_SYM] THEN MATCH_MP_TAC
8093 (REWRITE_RULE [o_DEF; COMPLEX_DIFFERENTIABLE_LINEAR;
8094 COMPLEX_DERIVATIVE_LINEAR]
8095 (SPECL [`\w. u * w`;`higher_complex_derivative n f`]
8096 COMPLEX_DERIVATIVE_CHAIN)) THEN
8097 ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT;
8098 HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]]]);;
8100 let HIGHER_COMPLEX_DERIVATIVE_ADD_AT = prove
8102 f analytic_on {z} /\ g analytic_on {z}
8103 ==> higher_complex_derivative n (\w. f w + g w) z =
8104 higher_complex_derivative n f z +
8105 higher_complex_derivative n g z`,
8106 REWRITE_TAC [ANALYTIC_AT_TWO] THEN
8107 MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_ADD]);;
8109 let HIGHER_COMPLEX_DERIVATIVE_SUB_AT = prove
8111 f analytic_on {z} /\ g analytic_on {z}
8112 ==> higher_complex_derivative n (\w. f w - g w) z =
8113 higher_complex_derivative n f z -
8114 higher_complex_derivative n g z`,
8115 REWRITE_TAC [ANALYTIC_AT_TWO] THEN
8116 MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_SUB]);;
8118 let HIGHER_COMPLEX_DERIVATIVE_NEG_AT = prove
8121 ==> higher_complex_derivative n (\w. --(f w)) z =
8122 --(higher_complex_derivative n f z)`,
8123 REWRITE_TAC [ANALYTIC_AT] THEN
8124 MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_NEG]);;
8126 let HIGHER_COMPLEX_DERIVATIVE_MUL_AT = prove
8128 f analytic_on {z} /\ g analytic_on {z}
8129 ==> higher_complex_derivative n (\w. f w * g w) z =
8130 vsum (0..n) (\i. Cx(&(binom(n,i))) *
8131 higher_complex_derivative i f z *
8132 higher_complex_derivative (n-i) g z)`,
8133 REWRITE_TAC [ANALYTIC_AT_TWO] THEN
8134 MESON_TAC [HIGHER_COMPLEX_DERIVATIVE_MUL]);;
8136 (* ------------------------------------------------------------------------- *)
8137 (* Nonexistence of isolated singularities and a stronger integral formula. *)
8138 (* ------------------------------------------------------------------------- *)
8140 let NO_ISOLATED_SINGULARITY = prove
8141 (`!f s k. open s /\ FINITE k /\
8142 f continuous_on s /\ f holomorphic_on (s DIFF k)
8143 ==> f holomorphic_on s`,
8145 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DIFF; FINITE_IMP_CLOSED; IMP_CONJ] THEN
8146 REWRITE_TAC[GSYM complex_differentiable] THEN REPEAT DISCH_TAC THEN
8147 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8148 ASM_CASES_TAC `(z:complex) IN k` THEN ASM_SIMP_TAC[IN_DIFF] THEN
8149 MP_TAC(ISPECL [`z:complex`; `k:complex->bool`] FINITE_SET_AVOID) THEN
8150 ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `d:real` THEN
8152 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
8153 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
8154 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
8155 SUBGOAL_THEN `f holomorphic_on ball(z,min d e)` MP_TAC THENL
8157 ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; CENTRE_IN_BALL; REAL_LT_MIN;
8158 complex_differentiable]] THEN
8160 `?g. !w. w IN ball(z,min d e)
8161 ==> (g has_complex_derivative f w) (at w within ball(z,min d e))`
8164 SIMP_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN; OPEN_BALL] THEN
8165 MESON_TAC[HOLOMORPHIC_DERIVATIVE; OPEN_BALL]] THEN
8166 MATCH_MP_TAC PATHINTEGRAL_CONVEX_PRIMITIVE THEN
8167 REWRITE_TAC[CONVEX_BALL] THEN CONJ_TAC THENL
8168 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
8169 ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
8170 (SET_RULE `b SUBSET s ==> c SUBSET b ==> c SUBSET s`)) THEN
8171 REWRITE_TAC[SUBSET; IN_BALL] THEN REAL_ARITH_TAC;
8173 REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE_COFINITE THEN
8174 EXISTS_TAC `k:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8175 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
8177 X_GEN_TAC `w:complex` THEN
8178 DISCH_THEN(fun th -> FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
8179 SPEC_TAC(`w:complex`,`w:complex`) THEN ASM_REWRITE_TAC[GSYM SUBSET] THEN
8180 MATCH_MP_TAC(SET_RULE `s SUBSET t ==> (s DIFF k) SUBSET (t DIFF k)`) THEN
8181 MATCH_MP_TAC(SET_RULE
8182 `interior s SUBSET s /\ s SUBSET t ==> interior s SUBSET t`) THEN
8183 REWRITE_TAC[INTERIOR_SUBSET]] THEN
8184 (MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,e)` THEN
8185 ASM_REWRITE_TAC[] THEN
8186 MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,min d e)` THEN
8188 [MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
8190 REWRITE_TAC[SUBSET; IN_BALL] THEN REAL_ARITH_TAC]));;
8192 let CAUCHY_INTEGRAL_FORMULA_CONVEX = prove
8194 convex s /\ FINITE k /\ f continuous_on s /\
8195 (!x. x IN interior(s) DIFF k ==> f complex_differentiable at x) /\
8197 valid_path g /\ (path_image g) SUBSET (s DELETE z) /\
8198 pathfinish g = pathstart g
8199 ==> ((\w. f(w) / (w - z)) has_path_integral
8200 (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
8201 REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_INTEGRAL_FORMULA_WEAK THEN
8202 MAP_EVERY EXISTS_TAC [`s:complex->bool`; `{}:complex->bool`] THEN
8203 ASM_REWRITE_TAC[DIFF_EMPTY; FINITE_RULES] THEN
8204 SIMP_TAC[GSYM HOLOMORPHIC_ON_OPEN; complex_differentiable; OPEN_INTERIOR] THEN
8205 MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN
8206 EXISTS_TAC `k:complex->bool` THEN
8207 ASM_REWRITE_TAC[OPEN_INTERIOR] THEN CONJ_TAC THENL
8208 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `s:complex->bool` THEN
8209 ASM_REWRITE_TAC[INTERIOR_SUBSET];
8210 ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DIFF; FINITE_IMP_CLOSED;
8211 OPEN_INTERIOR; GSYM complex_differentiable]]);;
8213 (* ------------------------------------------------------------------------- *)
8214 (* Formula for higher derivatives. *)
8215 (* ------------------------------------------------------------------------- *)
8217 let CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH = prove
8219 f continuous_on cball(z,r) /\
8220 f holomorphic_on ball(z,r) /\
8222 ==> ((\u. f(u) / (u - w) pow (k + 1))
8224 ((Cx(&2) * Cx(pi) * ii) / Cx(&(FACT k)) *
8225 higher_complex_derivative k f w))
8227 REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
8228 REPEAT GEN_TAC THEN DISCH_TAC THEN DISCH_TAC THEN
8229 ASM_CASES_TAC `&0 < r` THENL
8231 REWRITE_TAC[IN_BALL] THEN
8232 ASM_MESON_TAC[NORM_ARITH `~(&0 < r) ==> ~(dist(a,b) < r)`]] THEN
8233 INDUCT_TAC THEN REWRITE_TAC[higher_complex_derivative] THENL
8234 [REWRITE_TAC[ARITH; COMPLEX_POW_1; FACT; COMPLEX_DIV_1] THEN
8235 ASM_SIMP_TAC[GSYM COMPLEX_MUL_ASSOC; CAUCHY_INTEGRAL_CIRCLEPATH];
8238 [`f:complex->complex`;
8239 `\x. (Cx(&2) * Cx(pi) * ii) / Cx(&(FACT k)) *
8240 higher_complex_derivative k f x`;
8241 `z:complex`; `r:real`; `k + 1`] CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
8242 ASM_REWRITE_TAC[ADD1; ARITH_RULE `(k + 1) + 1 = k + 2`] THEN ANTS_TAC THENL
8243 [REWRITE_TAC[ADD_EQ_0; ARITH_EQ] THEN
8244 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8245 EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[] THEN
8246 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE; SPHERE_SUBSET_CBALL];
8248 DISCH_THEN(fun th ->
8249 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN MP_TAC(SPEC `w:complex` th)) THEN
8250 ASM_REWRITE_TAC[] THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
8251 REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
8252 X_GEN_TAC `y:complex` THEN
8253 DISCH_THEN(fun th -> ASSUME_TAC th THEN MP_TAC th) THEN
8254 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
8255 MATCH_MP_TAC(COMPLEX_FIELD
8256 `~(a = Cx(&0)) /\ ~(b = Cx(&0)) /\ x = b / a * y ==> y = a / b * x`) THEN
8257 REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ] THEN
8258 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
8259 FIRST_ASSUM(MP_TAC o MATCH_MP HAS_COMPLEX_DERIVATIVE_LMUL_AT) THEN
8260 DISCH_THEN(MP_TAC o SPEC `Cx(&(FACT k)) / (Cx(&2) * Cx pi * ii)`) THEN
8261 REWRITE_TAC[] THEN MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN BINOP_TAC THENL
8262 [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN
8263 MATCH_MP_TAC(COMPLEX_FIELD
8264 `~(a = Cx(&0)) /\ ~(b = Cx(&0)) ==> (a / b) * (b / a) * x = x`) THEN
8265 REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ];
8266 REWRITE_TAC[FACT; GSYM REAL_OF_NUM_MUL; GSYM ADD1; CX_MUL] THEN
8267 MATCH_MP_TAC(COMPLEX_FIELD
8268 `z:complex = y /\ ~(d = Cx(&0))
8269 ==> k / d * k1 * z = (k1 * k) / d * y`) THEN
8270 REWRITE_TAC[CX_2PII_NZ] THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
8271 ASM_REWRITE_TAC[]]);;
8273 let CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH = prove
8275 f continuous_on cball(z,r) /\
8276 f holomorphic_on ball(z,r) /\
8278 ==> (\u. f(u) / (u - w) pow (k + 1))
8279 path_integrable_on circlepath(z,r) /\
8280 higher_complex_derivative k f w =
8281 Cx(&(FACT k)) / (Cx(&2) * Cx(pi) * ii) *
8282 path_integral(circlepath(z,r)) (\u. f(u) / (u - w) pow (k + 1))`,
8283 REPEAT GEN_TAC THEN DISCH_TAC THEN
8284 FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP
8285 CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH) THEN
8286 CONJ_TAC THENL [ASM_MESON_TAC[path_integrable_on]; ALL_TAC] THEN
8287 MATCH_MP_TAC(COMPLEX_FIELD
8288 `~(a = Cx(&0)) /\ ~(b = Cx(&0)) /\ x = b / a * y ==> y = a / b * x`) THEN
8289 REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ] THEN
8290 MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN ASM_REWRITE_TAC[]);;
8292 (* ------------------------------------------------------------------------- *)
8293 (* A holomorphic function is analytic, i.e. has local power series. *)
8294 (* ------------------------------------------------------------------------- *)
8296 let HOLOMORPHIC_POWER_SERIES = prove
8298 f holomorphic_on ball(z,r) /\ w IN ball(z,r)
8299 ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) * (w - z) pow n)
8300 sums f(w)) (from 0)`,
8301 REPEAT STRIP_TAC THEN
8303 `?r. &0 < r /\ f holomorphic_on cball(z,r) /\ w IN ball(z,r)`
8305 [EXISTS_TAC `(r + dist(w:complex,z)) / &2` THEN REPEAT CONJ_TAC THENL
8307 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
8308 EXISTS_TAC `ball(z:complex,r)` THEN ASM_REWRITE_TAC[SUBSET];
8310 UNDISCH_TAC `(w:complex) IN ball(z,r)` THEN
8311 REWRITE_TAC[IN_BALL; IN_CBALL] THEN NORM_ARITH_TAC;
8313 POP_ASSUM_LIST(K ALL_TAC) THEN
8314 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
8315 SUBGOAL_THEN `f holomorphic_on ball(z,r) /\ f continuous_on cball(z,r)`
8316 STRIP_ASSUME_TAC THENL
8317 [ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
8318 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN ASM_MESON_TAC[BALL_SUBSET_CBALL];
8321 `((\k. path_integral (circlepath(z,r)) (\u. f u / (u - z) pow (k + 1)) *
8323 sums path_integral (circlepath(z,r)) (\u. f u / (u - w))) (from 0)`
8326 DISCH_THEN(MP_TAC o SPEC `inv(Cx(&2) * Cx(pi) * ii)` o
8327 MATCH_MP SERIES_COMPLEX_LMUL) THEN
8328 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN BINOP_TAC THENL
8329 [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `k:num` THEN
8330 MP_TAC(SPECL [`f:complex->complex`; `z:complex`; `r:real`; `k:num`;
8331 `z:complex`] CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH) THEN
8332 ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN
8333 DISCH_THEN(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
8334 MATCH_MP_TAC(COMPLEX_FIELD
8335 `~(pit = Cx(&0)) /\ ~(fact = Cx(&0))
8336 ==> inv(pit) * ((pit / fact) * d) * wz = d / fact * wz`) THEN
8337 REWRITE_TAC[CX_2PII_NZ; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ];
8338 MP_TAC(SPECL [`f:complex->complex`; `z:complex`; `r:real`; `w:complex`]
8339 CAUCHY_INTEGRAL_CIRCLEPATH_SIMPLE) THEN
8340 ASM_REWRITE_TAC[] THEN
8341 DISCH_THEN(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
8342 MATCH_MP_TAC(COMPLEX_FIELD
8343 `~(x * y * z = Cx(&0)) ==> inv(x * y * z) * x * y * z * w = w`) THEN
8344 REWRITE_TAC[CX_2PII_NZ]]] THEN
8345 REWRITE_TAC[sums; FROM_0; INTER_UNIV] THEN
8346 MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
8347 EXISTS_TAC `\n. path_integral (circlepath(z,r))
8349 (\k. f u * (w - z) pow k / (u - z) pow (k + 1)))` THEN
8351 [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
8352 X_GEN_TAC `k:num` THEN REWRITE_TAC[] THEN
8353 W(MP_TAC o PART_MATCH (lhs o rand) PATH_INTEGRAL_VSUM o lhand o snd) THEN
8355 [REWRITE_TAC[FINITE_NUMSEG] THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN
8356 ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH
8357 `a * b / c:complex = b * a / c`] THEN
8358 MATCH_MP_TAC PATH_INTEGRABLE_COMPLEX_LMUL THEN
8359 ASM_SIMP_TAC[CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH;
8362 DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC VSUM_EQ THEN
8363 X_GEN_TAC `m:num` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
8364 ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a * b / c:complex = a / c * b`] THEN
8365 MATCH_MP_TAC PATH_INTEGRAL_COMPLEX_RMUL THEN
8366 ASM_SIMP_TAC[CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH; CENTRE_IN_BALL];
8368 MATCH_MP_TAC(CONJUNCT2
8369 (REWRITE_RULE[FORALL_AND_THM; TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`]
8370 PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH)) THEN
8371 ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL
8372 [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
8373 X_GEN_TAC `k:num` THEN REWRITE_TAC[] THEN
8374 MATCH_MP_TAC PATH_INTEGRABLE_VSUM THEN
8375 REWRITE_TAC[FINITE_NUMSEG] THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN
8376 ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a * b / c:complex = b * a / c`] THEN
8377 MATCH_MP_TAC PATH_INTEGRABLE_COMPLEX_LMUL THEN
8378 ASM_SIMP_TAC[CAUCHY_HIGHER_DERIVATIVE_INTEGRAL_CIRCLEPATH; CENTRE_IN_BALL];
8380 X_GEN_TAC `e:real` THEN STRIP_TAC THEN
8381 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE; IN_ELIM_THM] THEN
8382 SIMP_TAC[VSUM_COMPLEX_LMUL; FINITE_NUMSEG; complex_div] THEN
8383 REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB; COMPLEX_NORM_MUL] THEN
8384 REWRITE_TAC[COMPLEX_POW_ADD; COMPLEX_INV_MUL; COMPLEX_POW_1] THEN
8385 SIMP_TAC[COMPLEX_MUL_ASSOC; VSUM_COMPLEX_RMUL; FINITE_NUMSEG] THEN
8386 REWRITE_TAC[GSYM complex_div; GSYM COMPLEX_POW_DIV] THEN
8387 REWRITE_TAC[VSUM_GP; CONJUNCT1 LT; CONJUNCT1 complex_pow] THEN
8388 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
8391 !u:complex. u IN cball(z,r) ==> norm(f u:complex) <= B`
8392 STRIP_ASSUME_TAC THENL
8393 [MP_TAC(ISPEC `IMAGE (f:complex->complex) (cball(z,r))`
8394 COMPACT_IMP_BOUNDED) THEN
8395 ASM_SIMP_TAC[COMPACT_CONTINUOUS_IMAGE; COMPACT_CBALL] THEN
8396 REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE];
8398 SUBGOAL_THEN `?k. &0 < k /\ k <= r /\ norm(w - z) <= r - k /\
8399 !u. norm(u - z) = r ==> k <= norm(u - w)`
8400 STRIP_ASSUME_TAC THENL
8401 [EXISTS_TAC `r - dist(z:complex,w)` THEN
8402 REPEAT(POP_ASSUM MP_TAC) THEN REWRITE_TAC[IN_BALL] THEN
8405 REWRITE_TAC[IN_SPHERE; NORM_ARITH `dist(z,x) = r <=> norm(x - z) = r`] THEN
8406 MP_TAC(SPECL [`(r - k) / r:real`; `e / B * k:real`] REAL_ARCH_POW_INV) THEN
8407 ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_LT_DIV; REAL_HALF; REAL_LT_MUL] THEN
8408 ASM_REWRITE_TAC[REAL_ARITH `r - k < &1 * r <=> &0 < k`] THEN
8409 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN
8410 X_GEN_TAC `n:num` THEN DISCH_TAC THEN
8411 X_GEN_TAC `u:complex` THEN DISCH_TAC THEN
8412 SUBGOAL_THEN `~(u:complex = z) /\ ~(u = w)` STRIP_ASSUME_TAC THENL
8413 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
8414 MAP_EVERY UNDISCH_TAC [`&0 < r`; `norm(u - z:complex) = r`] THEN
8417 ASM_SIMP_TAC[COMPLEX_FIELD
8418 `~(u = z) /\ ~(u = w) ==> ~((w - z) / (u - z) = Cx(&1))`] THEN
8419 ASM_SIMP_TAC[COMPLEX_FIELD
8420 `~(u = z) /\ ~(u = w)
8421 ==> x / (Cx(&1) - (w - z) / (u - z)) / (u - z) = x / (u - w)`] THEN
8422 ASM_SIMP_TAC[COMPLEX_FIELD
8424 ==> (Cx(&1) - e) / (u - w) - inv(u - w) = --(e / (u - w))`] THEN
8425 REWRITE_TAC[COMPLEX_NORM_DIV; NORM_NEG; COMPLEX_NORM_POW] THEN
8426 MATCH_MP_TAC REAL_LET_TRANS THEN
8427 EXISTS_TAC `B * ((r - k) / r) pow N / k:real` THEN CONJ_TAC THENL
8429 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
8430 ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_LT_LDIV_EQ]] THEN
8431 MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_SIMP_TAC[NORM_POS_LE] THEN
8432 REPEAT CONJ_TAC THENL
8433 [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_CBALL] THEN
8434 ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[dist; REAL_LE_REFL];
8435 MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[NORM_POS_LE] THEN
8436 MATCH_MP_TAC REAL_POW_LE THEN MATCH_MP_TAC REAL_LE_DIV THEN
8437 ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE];
8439 REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
8440 REWRITE_TAC[GSYM real_div] THEN REPEAT CONJ_TAC THENL
8441 [MATCH_MP_TAC REAL_POW_LE THEN MATCH_MP_TAC REAL_LE_DIV THEN
8442 ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE];
8444 REWRITE_TAC[REAL_LE_INV_EQ; NORM_POS_LE];
8445 MATCH_MP_TAC REAL_LE_INV2 THEN ASM_SIMP_TAC[]] THEN
8446 MATCH_MP_TAC REAL_LE_TRANS THEN
8447 EXISTS_TAC `((r - k) / r:real) pow (SUC n)` THEN CONJ_TAC THENL
8448 [MATCH_MP_TAC REAL_POW_LE2 THEN
8449 ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LE_DIV; NORM_POS_LE; REAL_LT_IMP_LE];
8450 MATCH_MP_TAC REAL_POW_MONO_INV THEN
8451 ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ] THEN
8452 ASM_SIMP_TAC[ARITH_RULE `N <= n ==> N <= SUC n`] THEN
8453 ASM_REAL_ARITH_TAC]);;
8455 (* ------------------------------------------------------------------------- *)
8456 (* These weak Liouville versions don't even need the derivative formula. *)
8457 (* ------------------------------------------------------------------------- *)
8459 let LIOUVILLE_WEAK = prove
8460 (`!f l. f holomorphic_on (:complex) /\ (f --> l) at_infinity
8463 `!f. f holomorphic_on (:complex) /\ (f --> Cx(&0)) at_infinity
8464 ==> !z. f(z) = Cx(&0)`
8467 REPEAT STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o ISPEC
8468 `\z. (f:complex->complex) z - l`) THEN
8469 ASM_SIMP_TAC[VECTOR_SUB_EQ; HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST;
8470 ETA_AX; GSYM LIM_NULL; GSYM COMPLEX_VEC_0]] THEN
8471 REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[TAUT `p = ~ ~ p`] THEN
8472 PURE_REWRITE_TAC[GSYM COMPLEX_NORM_NZ] THEN DISCH_TAC THEN
8473 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [LIM_AT_INFINITY]) THEN
8474 DISCH_THEN(MP_TAC o SPEC `norm((f:complex->complex) z) / &2`) THEN
8475 ASM_REWRITE_TAC[dist; REAL_HALF; COMPLEX_SUB_RZERO] THEN
8476 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
8477 MP_TAC(SPECL [`f:complex->complex`; `z:complex`;
8478 `&1 + abs B + norm(z:complex)`; `z:complex`]
8479 CAUCHY_INTEGRAL_CIRCLEPATH) THEN
8480 ASM_SIMP_TAC[CONVEX_UNIV; INTERIOR_OPEN; OPEN_UNIV; IN_UNIV] THEN
8481 ABBREV_TAC `R = &1 + abs B + norm(z:complex)` THEN
8482 SUBGOAL_THEN `&0 < R` ASSUME_TAC THENL
8483 [ASM_MESON_TAC[NORM_POS_LE; REAL_ABS_POS; REAL_ARITH
8484 `&0 <= x /\ &0 <= y ==> &0 < &1 + x + y`]; ALL_TAC] THEN
8485 ASM_REWRITE_TAC[CENTRE_IN_BALL; NOT_IMP; CONJ_ASSOC] THEN CONJ_TAC THENL
8486 [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
8489 DISCH_THEN(MP_TAC o MATCH_MP
8490 (ONCE_REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH)) THEN
8491 DISCH_THEN(MP_TAC o SPEC `norm((f:complex->complex) z) / &2 / R`) THEN
8492 ASM_SIMP_TAC[REAL_LE_DIV; NORM_POS_LE; REAL_POS; REAL_LT_IMP_LE] THEN
8493 ASM_SIMP_TAC[REAL_FIELD `&0 < R ==> x / R * &2 * pi * R = &2 * pi * x`] THEN
8494 REWRITE_TAC[NOT_IMP; REAL_NOT_LE] THEN CONJ_TAC THENL
8495 [REPEAT STRIP_TAC THEN ASM_SIMP_TAC[COMPLEX_NORM_DIV; REAL_LE_DIV2_EQ] THEN
8496 MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
8497 UNDISCH_TAC `norm(x - z:complex) = R` THEN EXPAND_TAC "R" THEN
8498 MATCH_MP_TAC(REAL_ARITH
8499 `d <= x + z ==> d = &1 + abs b + z ==> x >= b`) THEN
8500 REWRITE_TAC[VECTOR_SUB] THEN MESON_TAC[NORM_TRIANGLE; NORM_NEG];
8501 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_ABS_PI;
8502 COMPLEX_NORM_II] THEN
8503 SIMP_TAC[REAL_LT_LMUL_EQ; REAL_OF_NUM_LT; ARITH; PI_POS; REAL_MUL_LID] THEN
8504 SUBGOAL_THEN `?w:complex. norm w = abs B` MP_TAC THENL
8505 [MESON_TAC[VECTOR_CHOOSE_SIZE; REAL_ABS_POS]; ALL_TAC] THEN
8506 ASM_MESON_TAC[NORM_POS_LE; REAL_ARITH
8507 `abs B >= B /\ (&0 <= x /\ x < z / &2 ==> z / &2 < z)`]]);;
8509 let LIOUVILLE_WEAK_INVERSE = prove
8510 (`!f. f holomorphic_on (:complex) /\
8511 (!B. eventually (\x. norm(f x) >= B) at_infinity)
8512 ==> ?z. f(z) = Cx(&0)`,
8513 REPEAT STRIP_TAC THEN MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN
8514 PURE_REWRITE_TAC[NOT_EXISTS_THM] THEN DISCH_TAC THEN
8515 MP_TAC(SPECL [`\x:complex. Cx(&1) / (f(x))`; `Cx(&0)`] LIOUVILLE_WEAK) THEN
8516 ASM_SIMP_TAC[COMPLEX_FIELD `~(y = Cx(&0)) ==> ~(Cx(&1) / y = Cx(&0))`] THEN
8518 [REWRITE_TAC[holomorphic_on; complex_div; COMPLEX_MUL_LID; IN_UNIV] THEN
8519 GEN_TAC THEN REWRITE_TAC[GSYM complex_differentiable; WITHIN_UNIV] THEN
8520 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_INV_AT THEN ASM_REWRITE_TAC[] THEN
8521 ASM_MESON_TAC[OPEN_UNIV; HOLOMORPHIC_ON_OPEN; IN_UNIV;
8522 complex_differentiable];
8523 REWRITE_TAC[tendsto] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
8524 FIRST_X_ASSUM(MP_TAC o SPEC `&2/ e`) THEN
8525 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8526 REWRITE_TAC[dist; COMPLEX_SUB_RZERO; real_ge; COMPLEX_NORM_DIV;
8527 COMPLEX_NORM_CX; REAL_ABS_POS] THEN
8528 ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_LE_LDIV_EQ; COMPLEX_NORM_NZ] THEN
8531 (* ------------------------------------------------------------------------- *)
8532 (* In particular we get the Fundamental Theorem of Algebra. *)
8533 (* ------------------------------------------------------------------------- *)
8536 (`!a n. a(0) = Cx(&0) \/ ~(!k. k IN 1..n ==> a(k) = Cx(&0))
8537 ==> ?z. vsum(0..n) (\i. a(i) * z pow i) = Cx(&0)`,
8538 REPEAT STRIP_TAC THENL
8539 [EXISTS_TAC `Cx(&0)` THEN
8540 SIMP_TAC[VSUM_CLAUSES_LEFT; LE_0] THEN
8541 ASM_SIMP_TAC[ADD_CLAUSES; COMPLEX_POW_ZERO; LE_1; COMPLEX_ADD_LID;
8542 COMPLEX_MUL_RZERO; COMPLEX_MUL_LZERO] THEN
8543 REWRITE_TAC[GSYM COMPLEX_VEC_0; VSUM_0];
8544 MATCH_MP_TAC LIOUVILLE_WEAK_INVERSE THEN CONJ_TAC THENL
8545 [MATCH_MP_TAC HOLOMORPHIC_ON_VSUM THEN
8546 SIMP_TAC[FINITE_NUMSEG; HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_MUL;
8547 HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID];
8548 ASM_MESON_TAC[COMPLEX_POLYFUN_EXTREMAL]]]);;
8550 (* ------------------------------------------------------------------------- *)
8551 (* Weierstrass convergence theorem. *)
8552 (* ------------------------------------------------------------------------- *)
8554 let HOLOMORPHIC_UNIFORM_LIMIT = prove
8555 (`!net:(A net) f g z r.
8556 ~(trivial_limit net) /\
8558 (\n. (f n) continuous_on cball(z,r) /\
8559 (f n) holomorphic_on ball(z,r))
8562 ==> eventually (\n. !x. x IN cball(z,r) ==> norm(f n x - g x) < e)
8564 ==> g continuous_on cball(z,r) /\ g holomorphic_on ball(z,r)`,
8565 REPEAT GEN_TAC THEN STRIP_TAC THEN
8566 DISJ_CASES_TAC(REAL_ARITH `r <= &0 \/ &0 < r`) THENL
8567 [ASM_SIMP_TAC[BALL_EMPTY; holomorphic_on; NOT_IN_EMPTY] THEN
8568 FIRST_X_ASSUM(DISJ_CASES_TAC o MATCH_MP (REAL_ARITH
8569 `r <= &0 ==> r < &0 \/ r = &0`)) THEN
8570 ASM_SIMP_TAC[continuous_on; CBALL_EMPTY; CBALL_SING; NOT_IN_EMPTY] THEN
8571 SIMP_TAC[IN_SING; DIST_REFL] THEN MESON_TAC[REAL_LT_01];
8573 MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
8574 [MATCH_MP_TAC CONTINUOUS_UNIFORM_LIMIT THEN
8575 MAP_EVERY EXISTS_TAC [`net:A net`; `f:A->complex->complex`] THEN
8576 RULE_ASSUM_TAC(REWRITE_RULE[EVENTUALLY_AND]) THEN
8581 [`\x. Cx(&1) / (Cx(&2) * Cx pi * ii) * g(x:complex)`;
8582 `g:complex->complex`; `z:complex`; `r:real`; `1`]
8583 CAUCHY_NEXT_DERIVATIVE_CIRCLEPATH) THEN
8584 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8585 ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
8586 REWRITE_TAC[ARITH] THEN CONJ_TAC THENL
8587 [MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
8588 REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
8589 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8590 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8591 EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
8592 SIMP_TAC[SPHERE_SUBSET_CBALL];
8594 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN REWRITE_TAC[COMPLEX_POW_1] THEN
8595 REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC] THEN
8596 REWRITE_TAC[GSYM complex_div] THEN REWRITE_TAC[COMPLEX_MUL_ASSOC] THEN
8597 REWRITE_TAC[GSYM complex_div] THEN REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC] THEN
8599 `(\u. g u / (u - w)) path_integrable_on circlepath(z,r) /\
8600 ((\n:A. path_integral(circlepath(z,r))
8601 (\u. f n u / (u - w))) -->
8602 path_integral(circlepath(z,r)) (\u. g u / (u - w))) net`
8604 [MATCH_MP_TAC PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH THEN
8605 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8606 [FIRST_X_ASSUM(fun th -> MP_TAC th THEN
8607 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO)) THEN
8608 X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8609 MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_CIRCLEPATH THEN
8610 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8611 REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8612 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN CONJ_TAC THENL
8613 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8614 EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
8615 SIMP_TAC[SUBSET; IN_CBALL; IN_ELIM_THM; NORM_SUB; dist; REAL_LE_REFL];
8617 ASM_SIMP_TAC[CONTINUOUS_ON_COMPLEX_POW; CONTINUOUS_ON_SUB;
8618 CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
8619 REWRITE_TAC[COMPLEX_POW_EQ_0; ARITH; IN_ELIM_THM] THEN
8620 GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
8621 SIMP_TAC[COMPLEX_SUB_0] THEN DISCH_THEN SUBST_ALL_TAC THEN
8622 ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8624 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
8625 FIRST_X_ASSUM(MP_TAC o SPEC `e * abs(r - norm(w - z:complex))`) THEN
8626 SUBGOAL_THEN `&0 < e * abs(r - norm(w - z:complex))` ASSUME_TAC THENL
8627 [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[GSYM REAL_ABS_NZ] THEN
8628 SIMP_TAC[REAL_SUB_0] THEN
8629 ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8631 ASM_REWRITE_TAC[] THEN
8632 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8633 X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN
8634 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `x:complex` THEN
8635 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8636 REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8637 REWRITE_TAC[IN_ELIM_THM] THEN
8638 DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
8639 ASM_REWRITE_TAC[IN_CBALL] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
8640 ASM_REWRITE_TAC[dist; REAL_LE_REFL] THEN
8641 SUBGOAL_THEN `~(x:complex = w)` ASSUME_TAC THENL
8642 [DISCH_THEN SUBST_ALL_TAC THEN
8643 ASM_MESON_TAC[IN_BALL; dist; NORM_SUB; REAL_LT_REFL];
8645 ASM_SIMP_TAC[COMPLEX_FIELD
8646 `~(x = w) ==> a / (x - w) - b / (x - w) =
8647 (a - b:complex) / (x - w)`] THEN
8648 ASM_SIMP_TAC[COMPLEX_NORM_DIV; REAL_LT_LDIV_EQ; COMPLEX_NORM_NZ;
8649 COMPLEX_POW_EQ_0; COMPLEX_SUB_0] THEN
8650 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x < a ==> x < b`) THEN
8651 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_LT_IMP_LE; COMPLEX_NORM_POW] THEN
8652 MATCH_MP_TAC(REAL_ARITH `w < r /\ r <= x + w ==> abs(r - w) <= x`) THEN
8653 CONJ_TAC THENL [ASM_MESON_TAC[IN_BALL; dist; NORM_SUB]; ALL_TAC] THEN
8654 FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
8655 REWRITE_TAC[GSYM dist] THEN MESON_TAC[DIST_TRIANGLE];
8658 FIRST_X_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRAL) THEN
8659 DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
8660 MATCH_MP HAS_PATH_INTEGRAL_COMPLEX_LMUL) THEN
8661 MATCH_MP_TAC EQ_IMP THEN REWRITE_TAC[] THEN AP_THM_TAC THEN AP_TERM_TAC THEN
8662 MATCH_MP_TAC LIM_UNIQUE THEN
8663 MAP_EVERY EXISTS_TAC [`net:A net`; `\n. (f:A->complex->complex) n w`] THEN
8664 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
8666 REWRITE_TAC[tendsto; dist] THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
8667 FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
8668 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8669 REWRITE_TAC[] THEN ASM_MESON_TAC[SUBSET; BALL_SUBSET_CBALL]] THEN
8671 `((\n:A. Cx(&2) * Cx pi * ii * f n w)
8672 --> path_integral (circlepath (z,r)) (\u. g u / (u - w))) net`
8674 [MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN EXISTS_TAC
8675 `\n:A. path_integral (circlepath (z,r)) (\u. f n u / (u - w))` THEN
8676 ASM_REWRITE_TAC[] THEN
8677 FIRST_X_ASSUM(fun th -> MP_TAC th THEN
8678 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO)) THEN
8679 X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8680 MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
8681 MATCH_MP_TAC CAUCHY_INTEGRAL_CIRCLEPATH THEN
8682 ASM_REWRITE_TAC[ETA_AX];
8684 DISCH_THEN(MP_TAC o SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` o
8685 MATCH_MP LIM_COMPLEX_LMUL) THEN
8686 SIMP_TAC[CX_2PII_NZ; COMPLEX_FIELD
8687 `~(x * y * z = Cx(&0)) ==> Cx(&1) / (x * y * z) * x * y * z * w = w`]);;
8689 (* ------------------------------------------------------------------------- *)
8690 (* Version showing that the limit is the limit of the derivatives. *)
8691 (* ------------------------------------------------------------------------- *)
8693 let HAS_COMPLEX_DERIVATIVE_UNIFORM_LIMIT = prove
8694 (`!net:(A net) f f' g z r.
8695 &0 < r /\ ~(trivial_limit net) /\
8697 (\n. (f n) continuous_on cball(z,r) /\
8699 ==> ((f n) has_complex_derivative (f' n w)) (at w)))
8702 ==> eventually (\n. !x. x IN cball(z,r) ==> norm(f n x - g x) < e)
8704 ==> g continuous_on cball(z,r) /\
8705 ?g'. !w. w IN ball(z,r)
8706 ==> (g has_complex_derivative (g' w)) (at w) /\
8707 ((\n. f' n w) --> g' w) net`,
8708 REPEAT GEN_TAC THEN STRIP_TAC THEN
8709 MP_TAC(SPECL [`net:(A)net`; `f:A->complex->complex`;
8710 `g:complex->complex`; `z:complex`; `r:real`]
8711 HOLOMORPHIC_UNIFORM_LIMIT) THEN
8713 [ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(fun th ->
8714 MP_TAC th THEN MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ]
8715 EVENTUALLY_MONO)) THEN
8716 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN MESON_TAC[];
8718 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8719 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC
8720 (MP_TAC o REWRITE_RULE[RIGHT_IMP_EXISTS_THM])) THEN
8721 REWRITE_TAC[SKOLEM_THM] THEN MATCH_MP_TAC MONO_EXISTS THEN
8722 X_GEN_TAC `g':complex->complex` THEN STRIP_TAC THEN
8723 ASM_SIMP_TAC[] THEN X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
8724 ONCE_REWRITE_TAC[LIM_NULL] THEN MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
8726 `\n. Cx(&1) / (Cx(&2) * Cx pi * ii) *
8727 (path_integral(circlepath(z,r)) (\x. f (n:A) x / (x - w) pow 2) -
8728 path_integral(circlepath(z,r)) (\x. g x / (x - w) pow 2))` THEN
8729 REWRITE_TAC[] THEN CONJ_TAC THENL
8730 [FIRST_X_ASSUM(fun th ->
8731 MP_TAC th THEN MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ]
8732 EVENTUALLY_MONO)) THEN
8733 X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8734 REWRITE_TAC[COMPLEX_SUB_LDISTRIB] THEN BINOP_TAC THEN
8735 MATCH_MP_TAC COMPLEX_DERIVATIVE_UNIQUE_AT THENL
8736 [EXISTS_TAC `(f:A->complex->complex) a`;
8737 EXISTS_TAC `g:complex->complex`] THEN
8738 EXISTS_TAC `w:complex` THEN ASM_SIMP_TAC[] THEN
8739 W(fun (asl,w) -> MP_TAC(PART_MATCH (rand o rand)
8740 CAUCHY_DERIVATIVE_INTEGRAL_CIRCLEPATH w)) THEN
8741 ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8742 ANTS_TAC THEN SIMP_TAC[] THEN ASM_MESON_TAC[];
8744 REWRITE_TAC[COMPLEX_VEC_0] THEN
8745 SUBST1_TAC(SYM(SPEC `Cx(&1) / (Cx(&2) * Cx pi * ii)` COMPLEX_MUL_RZERO)) THEN
8746 MATCH_MP_TAC LIM_COMPLEX_MUL THEN REWRITE_TAC[LIM_CONST] THEN
8747 REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN REWRITE_TAC[GSYM LIM_NULL] THEN
8748 W(fun (asl,w) -> MP_TAC(PART_MATCH (rand o rand)
8749 PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH w)) THEN
8750 ANTS_TAC THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL
8751 [FIRST_X_ASSUM(fun th -> MP_TAC th THEN
8752 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO)) THEN
8753 X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN STRIP_TAC THEN
8754 MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_CIRCLEPATH THEN
8755 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8756 REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8757 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN CONJ_TAC THENL
8758 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
8759 EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
8760 SIMP_TAC[SUBSET; IN_CBALL; IN_ELIM_THM; NORM_SUB; dist; REAL_LE_REFL];
8762 ASM_SIMP_TAC[CONTINUOUS_ON_COMPLEX_POW; CONTINUOUS_ON_SUB;
8763 CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID] THEN
8764 REWRITE_TAC[COMPLEX_POW_EQ_0; ARITH; IN_ELIM_THM] THEN
8765 GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
8766 SIMP_TAC[COMPLEX_SUB_0] THEN DISCH_THEN SUBST_ALL_TAC THEN
8767 ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8769 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
8770 FIRST_X_ASSUM(MP_TAC o SPEC `e * abs(r - norm(w - z:complex)) pow 2`) THEN
8771 SUBGOAL_THEN `&0 < e * abs(r - norm(w - z:complex)) pow 2` ASSUME_TAC THENL
8772 [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[] THEN
8773 MATCH_MP_TAC REAL_POW_LT THEN REWRITE_TAC[GSYM REAL_ABS_NZ] THEN
8774 SIMP_TAC[REAL_SUB_0] THEN
8775 ASM_MESON_TAC[IN_BALL; dist; REAL_LT_REFL; DIST_SYM];
8777 ASM_REWRITE_TAC[] THEN
8778 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
8779 X_GEN_TAC `a:A` THEN REWRITE_TAC[] THEN
8780 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `x:complex` THEN
8781 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
8782 REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
8783 REWRITE_TAC[IN_ELIM_THM] THEN
8784 DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
8785 ASM_REWRITE_TAC[IN_CBALL] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
8786 ASM_REWRITE_TAC[dist; REAL_LE_REFL] THEN
8787 SUBGOAL_THEN `~(x:complex = w)` ASSUME_TAC THENL
8788 [DISCH_THEN SUBST_ALL_TAC THEN
8789 ASM_MESON_TAC[IN_BALL; dist; NORM_SUB; REAL_LT_REFL];
8791 ASM_SIMP_TAC[COMPLEX_FIELD
8792 `~(x = w) ==> a / (x - w) pow 2 - b / (x - w) pow 2 =
8793 (a - b:complex) / (x - w) pow 2`] THEN
8794 ASM_SIMP_TAC[COMPLEX_NORM_DIV; REAL_LT_LDIV_EQ; COMPLEX_NORM_NZ;
8795 COMPLEX_POW_EQ_0; COMPLEX_SUB_0] THEN
8796 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x < a ==> x < b`) THEN
8797 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_LT_IMP_LE; COMPLEX_NORM_POW] THEN
8798 MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN
8799 MATCH_MP_TAC(REAL_ARITH `w < r /\ r <= x + w ==> abs(r - w) <= x`) THEN
8800 CONJ_TAC THENL [ASM_MESON_TAC[IN_BALL; dist; NORM_SUB]; ALL_TAC] THEN
8801 FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
8802 REWRITE_TAC[GSYM dist] THEN MESON_TAC[DIST_TRIANGLE]);;
8804 (* ------------------------------------------------------------------------- *)
8805 (* Some more simple/convenient versions for applications. *)
8806 (* ------------------------------------------------------------------------- *)
8808 let HOLOMORPHIC_UNIFORM_SEQUENCE = prove
8811 (!n. (f n) holomorphic_on s) /\
8813 ==> ?d. &0 < d /\ cball(x,d) SUBSET s /\
8815 ==> eventually (\n. !y. y IN cball(x,d)
8816 ==> norm(f n y - g y) < e)
8818 ==> g holomorphic_on s`,
8819 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN] THEN
8820 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8821 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
8822 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
8823 MP_TAC(ISPECL [`sequentially`; `f:num->complex->complex`;
8824 `g:complex->complex`; `z:complex`; `r:real`]
8825 HOLOMORPHIC_UNIFORM_LIMIT) THEN
8826 ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN ANTS_TAC THENL
8827 [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
8828 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
8830 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
8831 ASM_MESON_TAC[CENTRE_IN_BALL]]);;
8833 let HAS_COMPLEX_DERIVATIVE_UNIFORM_SEQUENCE = prove
8836 (!n x. x IN s ==> ((f n) has_complex_derivative f' n x) (at x)) /\
8838 ==> ?d. &0 < d /\ cball(x,d) SUBSET s /\
8840 ==> eventually (\n. !y. y IN cball(x,d)
8841 ==> norm(f n y - g y) < e)
8843 ==> ?g'. !x. x IN s ==> (g has_complex_derivative g'(x)) (at x) /\
8844 ((\n. f' n x) --> g'(x)) sequentially`,
8845 REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_EXISTS_IMP_THM] THEN
8846 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8847 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
8848 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
8849 MP_TAC(ISPECL [`sequentially`; `f:num->complex->complex`;
8850 `f':num->complex->complex`;
8851 `g:complex->complex`; `z:complex`; `r:real`]
8852 HAS_COMPLEX_DERIVATIVE_UNIFORM_LIMIT) THEN
8853 ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN ANTS_TAC THENL
8854 [ALL_TAC; ASM_MESON_TAC[CENTRE_IN_BALL]] THEN
8855 MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN
8856 REWRITE_TAC[] THEN CONJ_TAC THENL
8857 [MATCH_MP_TAC CONTINUOUS_AT_IMP_CONTINUOUS_ON THEN
8858 ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_IMP_CONTINUOUS_AT; SUBSET];
8859 ASM_MESON_TAC[BALL_SUBSET_CBALL; SUBSET]]);;
8861 (* ------------------------------------------------------------------------- *)
8862 (* A one-stop shop for an analytic function defined by a series. *)
8863 (* ------------------------------------------------------------------------- *)
8865 let SERIES_AND_DERIVATIVE_COMPARISON = prove
8868 (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
8869 (?l. (lift o h sums l) k) /\
8870 (?N. !n x. N <= n /\ n IN k /\ x IN s ==> norm(f n x) <= h n)
8871 ==> ?g g'. !x. x IN s
8872 ==> ((\n. f n x) sums g x) k /\
8873 ((\n. f' n x) sums g' x) k /\
8874 (g has_complex_derivative g' x) (at x)`,
8876 REPLICATE_TAC 2 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
8877 DISCH_THEN(MP_TAC o MATCH_MP SERIES_COMPARISON_UNIFORM) THEN
8878 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
8879 REWRITE_TAC[] THEN DISCH_TAC THEN
8880 REWRITE_TAC[TAUT `a ==> b /\ c /\ d <=> (a ==> b) /\ (a ==> d /\ c)`] THEN
8881 REWRITE_TAC[FORALL_AND_THM; RIGHT_EXISTS_AND_THM] THEN CONJ_TAC THENL
8882 [REWRITE_TAC[sums; LIM_SEQUENTIALLY] THEN ASM_MESON_TAC[]; ALL_TAC] THEN
8883 REWRITE_TAC[sums] THEN
8884 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_UNIFORM_SEQUENCE THEN
8885 EXISTS_TAC `\n x. vsum
8886 (k INTER (0..n)) (\n. (f:num->complex->complex) n x)` THEN
8887 ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_VSUM; FINITE_INTER_NUMSEG; IN_INTER] THEN
8888 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8889 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
8890 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[GSYM dist] THEN
8891 MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[EVENTUALLY_SEQUENTIALLY] THEN
8892 ASM_MESON_TAC[SUBSET]);;
8894 (* ------------------------------------------------------------------------- *)
8895 (* A version where we only have local uniform/comparative convergence. *)
8896 (* ------------------------------------------------------------------------- *)
8898 let SERIES_AND_DERIVATIVE_COMPARISON_LOCAL = prove
8901 (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
8903 ==> ?d h N. &0 < d /\ (?l. (lift o h sums l) k) /\
8904 !n y. N <= n /\ n IN k /\ y IN ball(x,d)
8905 ==> norm(f n y) <= h n)
8906 ==> ?g g'. !x. x IN s
8907 ==> ((\n. f n x) sums g x) k /\
8908 ((\n. f' n x) sums g' x) k /\
8909 (g has_complex_derivative g' x) (at x)`,
8910 REPEAT STRIP_TAC THEN
8911 EXISTS_TAC `\x. infsum k (\n. (f:num->complex->complex) n x)` THEN
8912 REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_EXISTS_IMP_THM] THEN
8913 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
8914 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
8915 ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
8916 MAP_EVERY X_GEN_TAC [`d:real`; `h:num->real`; `N:num`] THEN
8917 DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
8918 MP_TAC(ISPECL [`f:num->complex->complex`; `f':num->complex->complex`;
8919 `ball(z:complex,d) INTER s`; `k:num->bool`; `h:num->real`]
8920 SERIES_AND_DERIVATIVE_COMPARISON) THEN
8921 ASM_SIMP_TAC[OPEN_INTER; OPEN_BALL; IN_INTER] THEN
8922 ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
8923 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` MP_TAC) THEN
8924 ONCE_REWRITE_TAC[TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
8925 REWRITE_TAC[FORALL_AND_THM; RIGHT_EXISTS_AND_THM] THEN
8926 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
8927 REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_AND_EXISTS_THM] THEN
8928 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
8929 MATCH_MP_TAC MONO_EXISTS THEN ASM_SIMP_TAC[CENTRE_IN_BALL] THEN
8930 X_GEN_TAC `g':complex` THEN REPEAT STRIP_TAC THENL
8931 [ASM_MESON_TAC[SUMS_INFSUM; CENTRE_IN_BALL; summable]; ALL_TAC] THEN
8932 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_AT THEN
8933 EXISTS_TAC `g:complex->complex` THEN
8934 MP_TAC(ISPEC `ball(z:complex,d) INTER s` OPEN_CONTAINS_BALL) THEN
8935 ASM_SIMP_TAC[OPEN_INTER; OPEN_BALL] THEN
8936 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
8937 ASM_REWRITE_TAC[IN_INTER; CENTRE_IN_BALL] THEN MATCH_MP_TAC MONO_EXISTS THEN
8938 REWRITE_TAC[SUBSET; IN_BALL; IN_INTER] THEN
8939 ASM_MESON_TAC[INFSUM_UNIQUE; SUBSET; IN_BALL; DIST_SYM]);;
8941 (* ------------------------------------------------------------------------- *)
8942 (* Sometimes convenient to compare with a complex series of +ve reals. *)
8943 (* ------------------------------------------------------------------------- *)
8945 let SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX = prove
8948 (!n x. n IN k /\ x IN s ==> (f n has_complex_derivative f' n x) (at x)) /\
8950 ==> ?d h N. &0 < d /\ summable k h /\
8951 (!n. n IN k ==> real(h n) /\ &0 <= Re(h n)) /\
8952 (!n y. N <= n /\ n IN k /\ y IN ball(x,d)
8953 ==> norm(f n y) <= norm(h n)))
8954 ==> ?g g'. !x. x IN s
8955 ==> ((\n. f n x) sums g x) k /\
8956 ((\n. f' n x) sums g' x) k /\
8957 (g has_complex_derivative g' x) (at x)`,
8958 REPEAT STRIP_TAC THEN
8959 MATCH_MP_TAC SERIES_AND_DERIVATIVE_COMPARISON_LOCAL THEN
8960 ASM_REWRITE_TAC[] THEN X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
8961 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
8962 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
8963 X_GEN_TAC `d:real` THEN ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
8964 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
8965 DISCH_THEN(X_CHOOSE_THEN `h:num->complex` STRIP_ASSUME_TAC) THEN
8966 EXISTS_TAC `\n. norm((h:num->complex) n)` THEN ASM_REWRITE_TAC[] THEN
8967 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [summable]) THEN
8968 DISCH_THEN(X_CHOOSE_THEN `l:complex` STRIP_ASSUME_TAC) THEN
8969 EXISTS_TAC `lift(Re l)` THEN MATCH_MP_TAC SUMS_EQ THEN
8970 EXISTS_TAC `\i:num. lift(Re(h i))` THEN
8971 ASM_SIMP_TAC[REAL_NORM_POS; o_DEF] THEN
8972 REWRITE_TAC[RE_DEF] THEN MATCH_MP_TAC SERIES_COMPONENT THEN
8973 ASM_REWRITE_TAC[DIMINDEX_2; ARITH]);;
8975 let SERIES_DIFFERENTIABLE_COMPARISON_COMPLEX = prove
8978 (!n x. n IN k /\ x IN s ==> (f n) complex_differentiable (at x)) /\
8980 ==> ?d h N. &0 < d /\ summable k h /\
8981 (!n. n IN k ==> real(h n) /\ &0 <= Re(h n)) /\
8982 (!n y. N <= n /\ n IN k /\ y IN ball(x,d)
8983 ==> norm(f n y) <= norm(h n)))
8985 ==> ((\n. f n x) sums g x) k /\
8986 g complex_differentiable (at x)`,
8988 REWRITE_TAC[complex_differentiable; RIGHT_AND_EXISTS_THM] THEN
8989 GEN_REWRITE_TAC (PAT_CONV `\x. a /\ x /\ b ==> x` o ONCE_DEPTH_CONV)
8990 [RIGHT_IMP_EXISTS_THM] THEN
8991 REWRITE_TAC[SKOLEM_THM] THEN
8992 REWRITE_TAC[RIGHT_AND_EXISTS_THM; LEFT_AND_EXISTS_THM] THEN
8993 DISCH_THEN(CHOOSE_THEN (MP_TAC o MATCH_MP
8994 SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX)) THEN
8997 (* ------------------------------------------------------------------------- *)
8998 (* In particular, a power series is analytic inside circle of convergence. *)
8999 (* ------------------------------------------------------------------------- *)
9001 let POWER_SERIES_AND_DERIVATIVE_0 = prove
9002 (`!k a r. summable k (\n. a(n) * Cx(r) pow n)
9005 ==> ((\n. a(n) * z pow n) sums g(z)) k /\
9006 ((\n. Cx(&n) * a(n) * z pow (n - 1)) sums g'(z)) k /\
9007 (g has_complex_derivative g' z) (at z)`,
9008 REPEAT STRIP_TAC THEN
9009 ASM_CASES_TAC `&0 < r` THEN
9010 ASM_SIMP_TAC[NORM_ARITH `~(&0 < r) ==> ~(norm z < r)`] THEN
9011 SUBGOAL_THEN `!z. norm(z) < r <=> z IN ball(Cx(&0),r)`
9012 (fun th -> REWRITE_TAC[th])
9014 [REWRITE_TAC[IN_BALL; dist; COMPLEX_SUB_LZERO; NORM_NEG]; ALL_TAC] THEN
9015 MATCH_MP_TAC SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX THEN
9016 REWRITE_TAC[OPEN_BALL; IN_BALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
9018 [REPEAT STRIP_TAC THEN COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING;
9020 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9021 MAP_EVERY EXISTS_TAC
9022 [`(r - norm(z:complex)) / &2`;
9023 `\n. Cx(norm(a(n):complex) * ((r + norm(z:complex)) / &2) pow n)`;
9025 ASM_REWRITE_TAC[REAL_SUB_LT; REAL_HALF; REAL_CX; RE_CX] THEN
9026 REPEAT CONJ_TAC THENL
9027 [REWRITE_TAC[CX_MUL; CX_POW] THEN
9028 MATCH_MP_TAC POWER_SERIES_CONV_IMP_ABSCONV_WEAK THEN
9029 EXISTS_TAC `Cx r` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[COMPLEX_NORM_CX];
9030 REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN
9031 REWRITE_TAC[NORM_POS_LE] THEN MATCH_MP_TAC REAL_POW_LE;
9032 REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_NORM_CX; COMPLEX_NORM_MUL] THEN
9033 REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NORM] THEN
9034 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
9035 REWRITE_TAC[COMPLEX_NORM_POW; REAL_ABS_POW] THEN
9036 MATCH_MP_TAC REAL_POW_LE2] THEN
9037 ASM_NORM_ARITH_TAC);;
9039 let POWER_SERIES_AND_DERIVATIVE = prove
9041 summable k (\n. a(n) * Cx(r) pow n)
9044 ==> ((\n. a(n) * (z - w) pow n) sums g(z)) k /\
9045 ((\n. Cx(&n) * a(n) * (z - w) pow (n - 1)) sums g'(z)) k /\
9046 (g has_complex_derivative g' z) (at z)`,
9047 REPEAT STRIP_TAC THEN
9048 FIRST_ASSUM(MP_TAC o MATCH_MP POWER_SERIES_AND_DERIVATIVE_0) THEN
9049 REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
9050 MAP_EVERY X_GEN_TAC [`g:complex->complex`; `g':complex->complex`] THEN
9052 EXISTS_TAC `(\z. g(z - w)):complex->complex` THEN
9053 EXISTS_TAC `(\z. g'(z - w)):complex->complex` THEN
9054 REWRITE_TAC[IN_BALL; dist] THEN X_GEN_TAC `z:complex` THEN
9055 DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `z - w:complex`) THEN
9056 ANTS_TAC THENL [ASM_MESON_TAC[NORM_SUB]; ALL_TAC] THEN
9057 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
9058 GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
9059 GEN_REWRITE_TAC (RATOR_CONV o RAND_CONV) [GSYM COMPLEX_MUL_RID] THEN
9060 MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN ASM_REWRITE_TAC[] THEN
9061 COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_SUB_RZERO]);;
9063 let POWER_SERIES_HOLOMORPHIC = prove
9064 (`!a k f z r. (!w. w IN ball(z,r) ==> ((\n. a(n) * (w - z) pow n) sums f w) k)
9065 ==> f holomorphic_on ball(z,r)`,
9066 REPEAT STRIP_TAC THEN SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
9067 X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_BALL; dist] THEN DISCH_TAC THEN
9068 MP_TAC(ISPECL [`k:num->bool`; `a:num->complex`;
9069 `(norm(z - w:complex) + r) / &2`; `z:complex`]
9070 POWER_SERIES_AND_DERIVATIVE) THEN
9072 [FIRST_X_ASSUM(MP_TAC o SPEC `z + Cx((norm(z - w) + r) / &2)`) THEN
9073 REWRITE_TAC[IN_BALL; dist; COMPLEX_RING `(z + w) - z:complex = w`;
9074 NORM_ARITH `norm(z - (z + w)) = norm w`; summable] THEN
9075 ANTS_TAC THENL [REWRITE_TAC[COMPLEX_NORM_CX]; MESON_TAC[]] THEN
9076 POP_ASSUM MP_TAC THEN NORM_ARITH_TAC;
9078 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` MP_TAC) THEN
9079 DISCH_THEN(X_CHOOSE_THEN `g':complex->complex` (LABEL_TAC "*")) THEN
9080 EXISTS_TAC `(g':complex->complex) w` THEN
9081 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_AT THEN
9082 MAP_EVERY EXISTS_TAC
9083 [`g:complex->complex`; `(r - norm(z - w:complex)) / &2`] THEN
9084 REPEAT CONJ_TAC THENL
9085 [UNDISCH_TAC `norm(z - w:complex) < r` THEN NORM_ARITH_TAC;
9087 REMOVE_THEN "*" (MP_TAC o SPEC `w:complex`) THEN ANTS_TAC THENL
9088 [ALL_TAC; SIMP_TAC[]] THEN REWRITE_TAC[IN_BALL] THEN
9089 UNDISCH_TAC `norm(z - w:complex) < r` THEN NORM_ARITH_TAC] THEN
9090 X_GEN_TAC `u:complex` THEN REWRITE_TAC[dist] THEN DISCH_TAC THEN
9091 MATCH_MP_TAC SERIES_UNIQUE THEN
9092 EXISTS_TAC `(\n. a(n) * (u - z) pow n):num->complex` THEN
9093 EXISTS_TAC `k:num->bool` THEN CONJ_TAC THENL
9094 [REMOVE_THEN "*" (MP_TAC o SPEC `u:complex`) THEN
9095 ANTS_TAC THENL [ALL_TAC; SIMP_TAC[]];
9096 FIRST_X_ASSUM MATCH_MP_TAC] THEN
9097 REWRITE_TAC[IN_BALL] THEN ASM_NORM_ARITH_TAC);;
9099 let HOLOMORPHIC_IFF_POWER_SERIES = prove
9100 (`!f z r. f holomorphic_on ball(z,r) <=>
9102 ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
9106 REPEAT GEN_TAC THEN EQ_TAC THEN REPEAT STRIP_TAC THENL
9107 [ASM_MESON_TAC[HOLOMORPHIC_POWER_SERIES]; ALL_TAC] THEN
9108 MATCH_MP_TAC POWER_SERIES_HOLOMORPHIC THEN
9109 MAP_EVERY EXISTS_TAC
9110 [`\n. higher_complex_derivative n f z / Cx(&(FACT n))`;
9112 ASM_REWRITE_TAC[]);;
9114 let POWER_SERIES_ANALYTIC = prove
9115 (`!a k f z r. (!w. w IN ball(z,r) ==> ((\n. a(n) * (w - z) pow n) sums f w) k)
9116 ==> f analytic_on ball(z,r)`,
9117 SIMP_TAC[ANALYTIC_ON_OPEN; OPEN_BALL] THEN
9118 REWRITE_TAC[POWER_SERIES_HOLOMORPHIC]);;
9120 let ANALYTIC_IFF_POWER_SERIES = prove
9121 (`!f z r. f analytic_on ball(z,r) <=>
9123 ==> ((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
9127 SIMP_TAC[ANALYTIC_ON_OPEN; OPEN_BALL] THEN
9128 REWRITE_TAC[HOLOMORPHIC_IFF_POWER_SERIES]);;
9130 let HIGHER_COMPLEX_DERIVATIVE_POWER_SERIES = prove
9133 (!w. dist(w,z) < r ==> ((\i. c i * (w - z) pow i) sums f(w)) k)
9134 ==> higher_complex_derivative n f z / Cx(&(FACT n)) = c n`,
9135 REPEAT STRIP_TAC THEN
9136 SUBGOAL_THEN `f holomorphic_on ball(z,r)` ASSUME_TAC THENL
9137 [MATCH_MP_TAC POWER_SERIES_HOLOMORPHIC THEN
9138 REWRITE_TAC[IN_BALL] THEN ASM_MESON_TAC[DIST_SYM];
9142 ==> higher_complex_derivative i f z / Cx(&(FACT i)) -
9143 (if i IN k then c i else vec 0) = Cx(&0)`
9144 MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[IN_UNIV; COMPLEX_SUB_0]] THEN
9145 MATCH_MP_TAC POWER_SERIES_LIMIT_POINT_OF_ZEROS THEN MAP_EVERY EXISTS_TAC
9146 [`\w:complex. Cx(&0)`; `r:real`; `ball(z:complex,r)`] THEN
9147 ASM_SIMP_TAC[LIMPT_BALL; CENTRE_IN_CBALL; REAL_LT_IMP_LE] THEN
9148 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
9149 REWRITE_TAC[COMPLEX_SUB_RDISTRIB] THEN
9150 SUBST1_TAC(COMPLEX_RING `Cx(&0) = (f:complex->complex) w - f w`) THEN
9151 MATCH_MP_TAC SERIES_SUB THEN CONJ_TAC THENL
9152 [REWRITE_TAC[GSYM FROM_0] THEN MATCH_MP_TAC HOLOMORPHIC_POWER_SERIES THEN
9153 ASM_MESON_TAC[IN_BALL; DIST_SYM];
9154 REWRITE_TAC[COND_RAND; COND_RATOR; COMPLEX_VEC_0] THEN
9155 REWRITE_TAC[COMPLEX_MUL_LZERO] THEN
9156 ASM_SIMP_TAC[GSYM COMPLEX_VEC_0; SERIES_RESTRICT]]);;
9158 (* ------------------------------------------------------------------------- *)
9159 (* Taylor series for arctan. So we can do term-by-term integration of *)
9160 (* geometric series, this ends up quite late in the development. *)
9161 (* ------------------------------------------------------------------------- *)
9163 let CATAN_CONVERGS = prove
9165 ==> ((\n. --(Cx(&1)) pow n / Cx(&(2 * n + 1)) * z pow (2 * n + 1))
9166 sums catn(z)) (from 0)`,
9168 [`\n z. --(Cx(&1)) pow n / Cx(&(2 * n + 1)) * z pow (2 * n + 1)`;
9169 `\n z. --(Cx(&1)) pow n * z pow (2 * n)`;
9170 `ball(Cx(&0),&1)`; `from 0`
9171 ] SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX) THEN
9172 REWRITE_TAC[OPEN_BALL; COMPLEX_IN_BALL_0] THEN ANTS_TAC THENL
9174 [REPEAT STRIP_TAC THEN
9175 COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_MUL_RID; ADD_SUB] THEN
9176 REWRITE_TAC[COMPLEX_MUL_ASSOC] THEN AP_THM_TAC THEN AP_TERM_TAC THEN
9177 REWRITE_TAC[GSYM CX_POW; GSYM CX_NEG; GSYM CX_MUL; GSYM CX_DIV; CX_INJ;
9178 GSYM REAL_OF_NUM_ADD; GSYM REAL_OF_NUM_MUL] THEN
9179 CONV_TAC REAL_FIELD;
9180 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9181 EXISTS_TAC `(&1 - norm(z:complex)) / &2` THEN
9182 EXISTS_TAC `\n. Cx((&1 + norm(z:complex)) / &2) pow (2 * n + 1)` THEN
9183 EXISTS_TAC `1` THEN REWRITE_TAC[o_DEF] THEN REPEAT CONJ_TAC THENL
9184 [ASM_REAL_ARITH_TAC;
9185 REWRITE_TAC[COMPLEX_POW_ADD; GSYM COMPLEX_POW_POW] THEN
9186 MATCH_MP_TAC SUMMABLE_COMPLEX_RMUL THEN MATCH_MP_TAC SUMMABLE_GP THEN
9187 REWRITE_TAC[COMPLEX_NORM_CX; COMPLEX_NORM_POW; ABS_SQUARE_LT_1] THEN
9188 POP_ASSUM MP_TAC THEN NORM_ARITH_TAC;
9189 SIMP_TAC[RE_CX; REAL_POW; REAL_CX; GSYM CX_POW] THEN
9190 SIMP_TAC[REAL_POW_LE; NORM_ARITH `&0 <= (&1 + norm(z:complex)) / &2`];
9191 REWRITE_TAC[IN_BALL] THEN REPEAT STRIP_TAC THEN
9192 SIMP_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_MUL] THEN
9193 REWRITE_TAC[COMPLEX_NORM_POW; NORM_NEG; COMPLEX_NORM_CX] THEN
9194 REWRITE_TAC[REAL_ABS_NUM; REAL_POW_ONE; real_div; REAL_MUL_LID] THEN
9195 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
9196 MATCH_MP_TAC REAL_LE_MUL2 THEN
9197 SIMP_TAC[REAL_LE_INV_EQ; REAL_POS; NORM_POS_LE; REAL_POW_LE] THEN
9199 [MATCH_MP_TAC REAL_INV_LE_1 THEN REWRITE_TAC[REAL_OF_NUM_LE] THEN
9201 MATCH_MP_TAC REAL_POW_LE2 THEN
9202 UNDISCH_TAC `dist(z:complex,y) < (&1 - norm z) / &2` THEN
9203 CONV_TAC NORM_ARITH]]];
9204 REWRITE_TAC[LEFT_IMP_EXISTS_THM; GSYM COMPLEX_POW_POW] THEN
9205 MAP_EVERY X_GEN_TAC [`a:complex->complex`; `i:complex->complex`] THEN
9206 REWRITE_TAC[GSYM COMPLEX_POW_MUL; COMPLEX_MUL_LNEG; COMPLEX_MUL_LID] THEN
9207 REPEAT STRIP_TAC THEN
9208 MP_TAC(SPECL [`\z. a z - catn(z)`; `ball(Cx(&0),&1)`]
9209 HAS_COMPLEX_DERIVATIVE_ZERO_CONSTANT) THEN
9210 REWRITE_TAC[CONVEX_BALL; COMPLEX_IN_BALL_0] THEN ANTS_TAC THENL
9211 [X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
9212 SUBST1_TAC(COMPLEX_RING `Cx(&0) = i(w:complex) - i w`) THEN
9213 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
9214 ASM_SIMP_TAC[COMPLEX_SUB_REFL; HAS_COMPLEX_DERIVATIVE_AT_WITHIN] THEN
9215 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
9216 MP_TAC(ISPEC `w:complex` HAS_COMPLEX_DERIVATIVE_CATN) THEN ANTS_TAC THENL
9217 [ASM_MESON_TAC[COMPLEX_NORM_GE_RE_IM; REAL_LET_TRANS]; ALL_TAC] THEN
9218 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
9219 MATCH_MP_TAC SERIES_UNIQUE THEN
9220 MAP_EVERY EXISTS_TAC [`\n. --(w pow 2) pow n`; `from 0`] THEN
9222 MP_TAC(SPECL [`0`; `--((w:complex) pow 2)`] SUMS_GP) THEN
9223 ASM_SIMP_TAC[complex_pow; COMPLEX_NORM_POW; NORM_NEG; ABS_SQUARE_LT_1;
9224 REAL_ABS_NORM; complex_div; COMPLEX_MUL_LID; COMPLEX_SUB_RNEG];
9225 DISCH_THEN(X_CHOOSE_THEN `c:complex` (fun th ->
9226 MP_TAC th THEN MP_TAC(SPEC `Cx(&0)` th))) THEN
9227 ASM_SIMP_TAC[CATN_0; COMPLEX_NORM_0; REAL_LT_01; COMPLEX_SUB_RZERO] THEN
9228 FIRST_ASSUM(MP_TAC o SPEC `Cx(&0)`) THEN
9229 SIMP_TAC[COMPLEX_NORM_0; REAL_LT_01] THEN
9230 DISCH_THEN(MP_TAC o CONJUNCT1) THEN
9231 REWRITE_TAC[COMPLEX_POW_ADD; COMPLEX_POW_1; COMPLEX_MUL_RZERO] THEN
9232 MP_TAC(SPECL [`\n:num. Cx(&0)`; `from 0`] SUMS_COMPLEX_0) THEN
9233 REWRITE_TAC[] THEN ONCE_REWRITE_TAC[IMP_IMP] THEN
9234 DISCH_THEN(SUBST1_TAC o SYM o MATCH_MP SERIES_UNIQUE) THEN
9235 DISCH_THEN(SUBST1_TAC o SYM) THEN
9236 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
9237 ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
9238 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
9239 ASM_SIMP_TAC[COMPLEX_POW_ADD; COMPLEX_POW_1]]]);;
9241 let TAYLOR_CATN = prove
9242 (`!n z. norm(z) < &1
9244 vsum(0..n) (\k. --(Cx(&1)) pow k / Cx(&(2 * k + 1)) *
9246 <= norm(z) pow (2 * n + 3) /
9247 ((&2 * &n + &3) * (&1 - norm z pow 2))`,
9248 REPEAT STRIP_TAC THEN
9249 FIRST_ASSUM(MP_TAC o MATCH_MP CATAN_CONVERGS) THEN
9250 DISCH_THEN(MP_TAC o SPEC `n + 1` o MATCH_MP
9251 (ONCE_REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
9252 ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
9253 REWRITE_TAC[ARITH_RULE `0 < n + 1`; ADD_SUB] THEN
9254 MATCH_MP_TAC(MESON[]
9255 `(!l. (f sums l) k ==> norm l <= e) ==> (f sums a) k ==> norm a <= e`) THEN
9256 GEN_TAC THEN MATCH_MP_TAC(ONCE_REWRITE_RULE[IMP_CONJ_ALT] SERIES_BOUND) THEN
9258 `\i. norm(z:complex) / (&2 * &n + &3) * (norm(z) pow 2) pow i` THEN
9260 [REWRITE_TAC[GSYM SERIES_CX_LIFT; o_DEF] THEN
9261 MP_TAC(ISPECL [`n + 1`; `Cx(norm(z:complex) pow 2)`] SUMS_GP) THEN
9262 ASM_REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_POW; REAL_ABS_NORM;
9263 ABS_SQUARE_LT_1; REAL_ABS_ABS] THEN
9264 DISCH_THEN(MP_TAC o SPEC `Cx(norm(z:complex) / (&2 * &n + &3))` o
9265 MATCH_MP SERIES_COMPLEX_LMUL) THEN
9266 REWRITE_TAC[GSYM CX_POW; GSYM CX_SUB; GSYM CX_DIV; GSYM CX_MUL] THEN
9267 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
9268 REWRITE_TAC[GSYM REAL_POW_POW; REAL_POW_ADD; REAL_POW_1; real_div;
9271 X_GEN_TAC `k:num` THEN REWRITE_TAC[IN_FROM] THEN STRIP_TAC THEN
9272 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_POW] THEN
9273 REWRITE_TAC[NORM_NEG; COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_POW_ONE] THEN
9274 GEN_REWRITE_TAC RAND_CONV
9275 [REAL_ARITH `a / b * c:real = inv b * (a * c)`] THEN
9276 REWRITE_TAC[GSYM(CONJUNCT2 real_pow); REAL_POW_POW; ADD1] THEN
9277 MATCH_MP_TAC REAL_LE_RMUL THEN SIMP_TAC[REAL_POW_LE; NORM_POS_LE] THEN
9278 REWRITE_TAC[REAL_MUL_LID; real_div] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
9279 REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_LE;
9280 REAL_OF_NUM_LT; REAL_OF_NUM_MUL] THEN
9283 (* ------------------------------------------------------------------------- *)
9284 (* Taylor series for log. It's this late because we can more easily get *)
9285 (* a good error bound given the convergence of the series. *)
9286 (* ------------------------------------------------------------------------- *)
9288 let CLOG_CONVERGES = prove
9290 ==> ((\n. --Cx(&1) pow (n + 1) * z pow n / Cx(&n)) sums clog(Cx(&1) + z))
9292 REPEAT STRIP_TAC THEN
9293 MP_TAC(ISPECL [`clog o (\z. Cx(&1) + z)`; `Cx(&0)`; `&1`]
9294 HOLOMORPHIC_IFF_POWER_SERIES) THEN
9295 REWRITE_TAC[COMPLEX_IN_BALL_0; o_THM] THEN
9296 MATCH_MP_TAC(TAUT `p /\ (q ==> r) ==> (p <=> q) ==> r`) THEN CONJ_TAC THENL
9297 [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
9298 [REWRITE_TAC[HOLOMORPHIC_ON_DIFFERENTIABLE] THEN
9299 REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC;
9300 MATCH_MP_TAC HOLOMORPHIC_ON_CLOG THEN
9301 REWRITE_TAC[IMP_CONJ; FORALL_IN_IMAGE; RE_ADD; RE_CX] THEN
9302 REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
9304 MATCH_MP_TAC(REAL_ARITH
9305 `abs(Re x) <= norm x /\ norm x < &1 ==> &0 < &1 + Re x`) THEN
9306 ASM_REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN ASM_REAL_ARITH_TAC];
9308 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
9309 DISCH_THEN(MP_TAC o SPEC `1` o
9310 MATCH_MP (REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
9311 CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[VSUM_SING_NUMSEG] THEN
9312 REWRITE_TAC[o_DEF; higher_complex_derivative; CLOG_1; COMPLEX_ADD_RID] THEN
9313 REWRITE_TAC[complex_div; COMPLEX_MUL_LZERO; COMPLEX_SUB_RZERO] THEN
9314 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] SUMS_EQ) THEN
9315 REWRITE_TAC[COMPLEX_RING
9316 `(h * f) * z = p * z * g <=> z = Cx(&0) \/ h * f = p * g`] THEN
9318 `!n w. 1 <= n /\ norm w < &1
9319 ==> higher_complex_derivative n (\z. clog(Cx(&1) + z)) w =
9320 --Cx(&1) pow (n + 1) * Cx(&(FACT(n - 1))) / (Cx(&1) + w) pow n`
9321 (fun th -> SIMP_TAC[IN_FROM; COMPLEX_NORM_0; REAL_LT_01; th])
9323 [INDUCT_TAC THEN REWRITE_TAC[ARITH; higher_complex_derivative] THEN
9324 REPEAT STRIP_TAC THEN ASM_CASES_TAC `n = 0` THENL
9325 [ASM_REWRITE_TAC[higher_complex_derivative] THEN
9326 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
9327 CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[COMPLEX_POW_1] THEN
9328 COMPLEX_DIFF_TAC THEN
9329 REWRITE_TAC[complex_div; COMPLEX_POW_NEG; COMPLEX_ADD_LID] THEN
9330 REWRITE_TAC[COMPLEX_POW_ONE; ARITH; COMPLEX_MUL_LID] THEN
9331 DISCH_TAC THEN REWRITE_TAC[RE_ADD; RE_CX] THEN
9332 MATCH_MP_TAC(REAL_ARITH
9333 `abs(Re x) <= norm x /\ norm x < &1 ==> &0 < &1 + Re x`) THEN
9334 ASM_REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN ASM_REAL_ARITH_TAC;
9336 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
9337 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
9338 MAP_EVERY EXISTS_TAC
9339 [`\w. --Cx(&1) pow (n + 1) * Cx(&(FACT(n - 1))) / (Cx(&1) + w) pow n`;
9340 `ball(Cx(&0),&1)`] THEN
9341 ASM_SIMP_TAC[OPEN_BALL; LE_1; COMPLEX_IN_BALL_0] THEN
9342 COMPLEX_DIFF_TAC THEN
9343 ASM_SIMP_TAC[FACT; ARITH_RULE `~(n = 0) ==> SUC n - 1 = SUC(n - 1)`] THEN
9344 REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_ADD_LID; COMPLEX_MUL_RID] THEN
9345 REWRITE_TAC[COMPLEX_POW_ADD; complex_pow; COMPLEX_POW_1] THEN
9346 REWRITE_TAC[COMPLEX_MUL_LNEG; COMPLEX_MUL_RNEG; complex_div;
9347 COMPLEX_SUB_LZERO] THEN
9348 REWRITE_TAC[GSYM complex_div; COMPLEX_NEG_NEG; COMPLEX_MUL_RID] THEN
9349 REWRITE_TAC[COMPLEX_MUL_LID] THEN
9350 REWRITE_TAC[GSYM(CONJUNCT2 complex_pow); complex_div] THEN
9351 REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC] THEN
9352 ASM_REWRITE_TAC[GSYM complex_div; COMPLEX_POW_EQ_0] THEN
9353 ONCE_REWRITE_TAC[TAUT `p /\ q <=> p /\ (p ==> q)`] THEN
9354 SIMP_TAC[COMPLEX_DIV_POW2; COMPLEX_POW_POW] THEN
9355 ASM_REWRITE_TAC[ARITH_RULE `n * 2 <= n - 1 <=> n = 0`] THEN
9356 ASM_SIMP_TAC[ARITH_RULE `~(n = 0) ==> n * 2 - (n - 1) = SUC n`] THEN
9357 ASM_SIMP_TAC[ARITH_RULE `~(n = 0) ==> SUC(n - 1) = n`] THEN
9358 REWRITE_TAC[complex_div; CX_MUL; GSYM REAL_OF_NUM_MUL] THEN
9359 REWRITE_TAC[COMPLEX_MUL_AC] THEN
9360 MP_TAC(SPEC `&1` COMPLEX_NORM_CX) THEN
9361 UNDISCH_TAC `norm(w:complex) < &1` THEN
9362 REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN CONV_TAC NORM_ARITH];
9363 MATCH_MP_TAC num_INDUCTION THEN REWRITE_TAC[ARITH] THEN
9364 X_GEN_TAC `n:num` THEN REPEAT(DISCH_THEN(K ALL_TAC)) THEN DISJ2_TAC THEN
9365 REWRITE_TAC[FACT; ARITH_RULE `SUC n - 1 = n`; COMPLEX_ADD_RID] THEN
9366 REWRITE_TAC[COMPLEX_POW_ONE; COMPLEX_DIV_1; GSYM REAL_OF_NUM_MUL] THEN
9367 REWRITE_TAC[CX_MUL; COMPLEX_INV_MUL; COMPLEX_RING
9368 `(a * f) * i * n = a * i <=> f * n = Cx(&1) \/ a * i = Cx(&0)`] THEN
9369 SIMP_TAC[COMPLEX_MUL_RINV; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ]]);;
9371 let TAYLOR_CLOG = prove
9372 (`!n z. norm(z) < &1
9373 ==> norm(clog(Cx(&1) + z) -
9374 vsum(1..n) (\k. --Cx(&1) pow (k + 1) * z pow k / Cx(&k)))
9375 <= norm z pow (n + 1) / (&1 - norm z)`,
9376 REPEAT STRIP_TAC THEN MP_TAC(SPEC `z:complex` CLOG_CONVERGES) THEN
9377 ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o
9378 SPEC `n + 1` o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
9379 ANTS_TAC THENL [ASM_ARITH_TAC; REWRITE_TAC[ADD_SUB]] THEN
9380 DISCH_THEN(MATCH_MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
9382 EXISTS_TAC `\k. norm(z:complex) pow k` THEN
9383 REWRITE_TAC[GSYM SERIES_CX_LIFT; o_DEF; CX_POW; CX_DIV; CX_SUB] THEN
9384 ASM_SIMP_TAC[COMPLEX_NORM_CX; REAL_ABS_NORM; SUMS_GP] THEN
9385 X_GEN_TAC `m:num` THEN REWRITE_TAC[IN_FROM] THEN DISCH_TAC THEN
9386 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_POW; NORM_NEG] THEN
9387 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
9388 REWRITE_TAC[REAL_POW_ONE; REAL_MUL_LID; GSYM COMPLEX_NORM_POW] THEN
9389 SUBGOAL_THEN `0 < m` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
9390 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
9391 MATCH_MP_TAC(REAL_ARITH `&0 <= x * (m - &1) ==> x <= x * m`) THEN
9392 MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[NORM_POS_LE; REAL_SUB_LE] THEN
9393 ASM_SIMP_TAC[REAL_OF_NUM_LE; LE_1]);;
9395 let TAYLOR_CLOG_NEG = prove
9396 (`!n z. norm(z) < &1
9397 ==> norm(clog(Cx(&1) - z) + vsum(1..n) (\k. z pow k / Cx(&k)))
9398 <= norm z pow (n + 1) / (&1 - norm z)`,
9399 REPEAT STRIP_TAC THEN
9400 MP_TAC(ISPECL [`n:num`; `--z:complex`] TAYLOR_CLOG) THEN
9401 ASM_REWRITE_TAC[NORM_NEG] THEN
9402 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LE_TRANS) THEN
9403 MATCH_MP_TAC REAL_EQ_IMP_LE THEN AP_TERM_TAC THEN
9404 REWRITE_TAC[VECTOR_SUB; GSYM VSUM_NEG] THEN AP_TERM_TAC THEN
9405 REWRITE_TAC[COMPLEX_POW_ADD; COMPLEX_POW_ONE; complex_div] THEN
9406 REWRITE_TAC[COMPLEX_MUL_LNEG; COMPLEX_MUL_RNEG; COMPLEX_POW_1] THEN
9407 REWRITE_TAC[COMPLEX_MUL_RID; COMPLEX_NEG_NEG] THEN
9408 REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM COMPLEX_POW_MUL] THEN
9409 REWRITE_TAC[COMPLEX_MUL_LNEG; COMPLEX_MUL_LID; COMPLEX_NEG_NEG]);;
9411 (* ------------------------------------------------------------------------- *)
9412 (* The classical limit for e and other useful limits. *)
9413 (* ------------------------------------------------------------------------- *)
9415 let CEXP_LIMIT = prove
9416 (`!z. ((\n. (Cx(&1) + z / Cx(&n)) pow n) --> cexp(z)) sequentially`,
9417 GEN_TAC THEN MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
9418 EXISTS_TAC `\n. cexp(Cx(&n) * clog(Cx(&1) + z / Cx(&n)))` THEN
9420 [REWRITE_TAC[CEXP_N; EVENTUALLY_SEQUENTIALLY] THEN
9421 MP_TAC(SPEC `norm(z:complex) + &1` REAL_ARCH_SIMPLE) THEN
9422 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
9423 DISCH_TAC THEN X_GEN_TAC `n:num` THEN ASM_CASES_TAC `n = 0` THENL
9424 [ASM_REWRITE_TAC[LE] THEN DISCH_THEN SUBST_ALL_TAC THEN
9425 ASM_MESON_TAC[NORM_ARITH `~(norm(z:complex) + &1 <= &0)`];
9427 AP_THM_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC CEXP_CLOG THEN
9428 ASM_SIMP_TAC[CX_INJ; REAL_OF_NUM_EQ; COMPLEX_FIELD
9429 `~(n = Cx(&0)) ==> (Cx(&1) + z / n = Cx(&0) <=> z = --n)`] THEN
9430 DISCH_THEN(MP_TAC o AP_TERM `norm:complex->real`) THEN
9431 REWRITE_TAC[NORM_NEG; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
9432 REPEAT(POP_ASSUM MP_TAC) THEN REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN
9433 CONV_TAC NORM_ARITH;
9434 MATCH_MP_TAC(ISPEC `cexp` LIM_CONTINUOUS_FUNCTION) THEN
9435 REWRITE_TAC[CONTINUOUS_AT_CEXP] THEN
9436 ONCE_REWRITE_TAC[LIM_NULL_COMPLEX] THEN
9437 MATCH_MP_TAC LIM_NULL_COMPARISON_COMPLEX THEN
9438 EXISTS_TAC `\n. Cx(&2 * norm(z:complex) pow 2) * inv(Cx(&n))` THEN
9439 SIMP_TAC[LIM_INV_N; LIM_NULL_COMPLEX_LMUL] THEN
9440 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
9441 MP_TAC(SPEC `&2 * norm(z:complex) + &1` REAL_ARCH_SIMPLE) THEN
9442 DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN
9443 EXISTS_TAC `MAX N (MAX 1 2)` THEN X_GEN_TAC `n:num` THEN
9444 REWRITE_TAC[ARITH_RULE `MAX a b <= c <=> a <= c /\ b <= c`] THEN
9446 ASM_SIMP_TAC[CX_INJ; REAL_OF_NUM_EQ; LE_1;
9447 COMPLEX_FIELD `~(n = Cx(&0)) ==> n * l - z = (l - z / n) * n`] THEN
9448 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; REAL_ABS_NUM;
9449 COMPLEX_NORM_INV] THEN
9450 ASM_SIMP_TAC[GSYM REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
9451 REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC; GSYM REAL_INV_MUL] THEN
9452 REWRITE_TAC[GSYM REAL_POW_2] THEN
9453 MP_TAC(ISPECL [`1`; `z / Cx(&n)`] TAYLOR_CLOG) THEN
9454 REWRITE_TAC[GSYM CX_ADD; VSUM_SING_NUMSEG; COMPLEX_NORM_CX] THEN
9455 REWRITE_TAC[VSUM_CLAUSES_NUMSEG] THEN CONV_TAC NUM_REDUCE_CONV THEN
9456 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
9457 REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM; COMPLEX_DIV_1] THEN
9458 ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN ANTS_TAC THENL
9459 [RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
9462 REWRITE_TAC[COMPLEX_POW_1; COMPLEX_POW_NEG; COMPLEX_POW_ONE; ARITH] THEN
9463 REWRITE_TAC[COMPLEX_MUL_LID; REAL_POW_DIV] THEN
9464 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
9465 REWRITE_TAC[REAL_ARITH `a / b / c:real = (a / c) * inv b`] THEN
9466 MATCH_MP_TAC REAL_LE_RMUL THEN
9467 SIMP_TAC[REAL_LE_INV_EQ; REAL_POW_LE; REAL_POS] THEN
9468 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
9469 REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NUM; REAL_ABS_NORM;
9470 REAL_ABS_POW; real_div] THEN
9471 MATCH_MP_TAC REAL_LE_LMUL THEN SIMP_TAC[REAL_POW_LE; NORM_POS_LE] THEN
9472 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_INV_INV] THEN
9473 MATCH_MP_TAC REAL_LE_INV2 THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
9474 REWRITE_TAC[REAL_ARITH
9475 `&1 / &2 <= &1 - x * &1 / n <=> x / n <= &1 / &2`] THEN
9476 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
9477 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
9478 ASM_REAL_ARITH_TAC]);;
9480 let EXP_LIMIT = prove
9481 (`!x. ((\n. (&1 + x / &n) pow n) ---> exp(x)) sequentially`,
9482 REWRITE_TAC[REALLIM_COMPLEX; o_DEF; CX_POW; CX_ADD; CX_DIV; CX_EXP] THEN
9483 REWRITE_TAC[CEXP_LIMIT]);;
9485 let LIM_LOGPLUS1_OVER_X = prove
9486 (`((\x. clog(Cx(&1) + x) / x) --> Cx(&1)) (at(Cx(&0)))`,
9487 ONCE_REWRITE_TAC[LIM_NULL_COMPLEX] THEN
9488 MATCH_MP_TAC LIM_NULL_COMPARISON_COMPLEX THEN
9489 EXISTS_TAC `\x. Cx(&2) * x` THEN CONJ_TAC THENL
9490 [ALL_TAC; LIM_TAC THEN REWRITE_TAC[COMPLEX_MUL_RZERO]] THEN
9491 REWRITE_TAC[EVENTUALLY_AT] THEN EXISTS_TAC `&1 / &2` THEN
9492 CONV_TAC REAL_RAT_REDUCE_CONV THEN
9493 REWRITE_TAC[dist; COMPLEX_SUB_RZERO; COMPLEX_NORM_NZ] THEN
9494 X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
9495 MATCH_MP_TAC REAL_LE_LCANCEL_IMP THEN EXISTS_TAC `norm(z:complex)` THEN
9496 ASM_REWRITE_TAC[GSYM COMPLEX_NORM_MUL; COMPLEX_NORM_NZ] THEN
9497 ASM_SIMP_TAC[COMPLEX_FIELD
9498 `~(z = Cx(&0)) ==> z * (l / z - Cx(&1)) = l - z`] THEN
9499 MP_TAC(ISPECL [`1`; `z:complex`] TAYLOR_CLOG) THEN
9500 ANTS_TAC THENL [ASM_REAL_ARITH_TAC; REWRITE_TAC[VSUM_SING_NUMSEG]] THEN
9501 CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[COMPLEX_POW_1; COMPLEX_DIV_1] THEN
9502 REWRITE_TAC[COMPLEX_POW_NEG; ARITH_EVEN; COMPLEX_POW_ONE] THEN
9503 REWRITE_TAC[COMPLEX_MUL_LID] THEN
9504 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
9505 REWRITE_TAC[COMPLEX_RING `z * Cx(&2) * z = z pow 2 * Cx(&2)`] THEN
9506 REWRITE_TAC[COMPLEX_NORM_MUL; real_div; COMPLEX_NORM_CX] THEN
9507 REWRITE_TAC[GSYM COMPLEX_NORM_POW] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
9508 REWRITE_TAC[NORM_POS_LE] THEN
9509 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_INV_INV] THEN
9510 MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REAL_ARITH_TAC);;
9512 let LIM_N_MUL_SUB_CLOG = prove
9513 (`!w z. ((\n. Cx(&n) * (clog(Cx(&n) + w) - clog(Cx(&n) + z))) --> w - z)
9515 REPEAT GEN_TAC THEN ASM_CASES_TAC `w:complex = z` THEN
9516 ASM_REWRITE_TAC[COMPLEX_SUB_REFL; LIM_CONST; COMPLEX_MUL_RZERO] THEN
9517 MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
9518 EXISTS_TAC `\n. (Cx(&n) + z) / (Cx(&1) + z / Cx(&n)) *
9519 clog(Cx(&1) + (w - z) / (Cx(&n) + z))` THEN
9520 REWRITE_TAC[] THEN CONJ_TAC THENL
9521 [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
9522 MP_TAC(SPEC `max (norm(w:complex)) (norm(z:complex)) + &1`
9523 REAL_ARCH_SIMPLE) THEN
9524 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN
9525 X_GEN_TAC `n:num` THEN DISCH_TAC THEN
9526 SUBGOAL_THEN `&0 < Re(Cx(&n) + w) /\ &0 < Re(Cx(&n) + z)` MP_TAC THENL
9527 [REWRITE_TAC[RE_ADD; RE_CX] THEN
9528 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN CONJ_TAC THEN
9529 MATCH_MP_TAC(REAL_ARITH
9530 `norm z < n /\ abs(Re z) <= norm z ==> &0 < n + Re z`) THEN
9531 REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN ASM_REAL_ARITH_TAC;
9532 MAP_EVERY ASM_CASES_TAC
9533 [`Cx(&n) + w = Cx(&0)`; `Cx(&n) + z = Cx(&0)`] THEN
9534 ASM_REWRITE_TAC[RE_CX; REAL_LT_REFL] THEN STRIP_TAC] THEN
9535 SUBGOAL_THEN `~(Cx(&n) = Cx(&0))` ASSUME_TAC THENL
9536 [REWRITE_TAC[CX_INJ; REAL_OF_NUM_EQ] THEN DISCH_THEN SUBST_ALL_TAC THEN
9537 UNDISCH_TAC `max (norm(w:complex)) (norm (z:complex)) + &1 <= &N` THEN
9538 RULE_ASSUM_TAC(REWRITE_RULE[CONJUNCT1 LE]) THEN
9539 ASM_REWRITE_TAC[] THEN CONV_TAC NORM_ARITH;
9540 ASM_SIMP_TAC[COMPLEX_FIELD
9541 `~(n + z = Cx(&0)) /\ ~(n = Cx(&0))
9542 ==> (n + z) / (Cx(&1) + z / n) = n`] THEN
9543 AP_TERM_TAC THEN ASM_SIMP_TAC[COMPLEX_FIELD
9545 ==> Cx(&1) + (w - z) / (n + z) = (n + w) / (n + z)`] THEN
9546 REWRITE_TAC[complex_div] THEN IMP_REWRITE_TAC[CLOG_MUL_SIMPLE] THEN
9547 ASM_REWRITE_TAC[COMPLEX_INV_EQ_0] THEN ASM_SIMP_TAC[CLOG_INV] THEN
9548 CONJ_TAC THENL [CONV_TAC COMPLEX_RING; REWRITE_TAC[IM_NEG]] THEN
9549 MATCH_MP_TAC(REAL_ARITH
9550 `abs(x) < pi / &2 /\ abs(y) < pi / &2
9551 ==> --pi < x + --y /\ x + --y <= pi`) THEN
9552 ASM_SIMP_TAC[RE_CLOG_POS_LT]];
9553 REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a / b * c:complex = inv b * a * c`] THEN
9554 GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_MUL_LID] THEN
9555 MATCH_MP_TAC LIM_COMPLEX_MUL THEN CONJ_TAC THENL
9556 [GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_INV_1] THEN
9557 MATCH_MP_TAC LIM_COMPLEX_INV THEN
9558 CONJ_TAC THENL [ALL_TAC; CONV_TAC COMPLEX_RING] THEN
9559 GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_ADD_RID] THEN
9560 MATCH_MP_TAC LIM_ADD THEN REWRITE_TAC[LIM_CONST; complex_div] THEN
9561 SIMP_TAC[LIM_NULL_COMPLEX_LMUL; LIM_INV_N];
9564 `(\n. (Cx(&n) + z) * clog (Cx(&1) + (w - z) / (Cx(&n) + z))) =
9565 (\x. (w - z) * clog(Cx(&1) + x) / x) o (\n. (w - z) / (Cx(&n) + z))`
9567 [REWRITE_TAC[FUN_EQ_THM; o_THM; complex_div] THEN
9568 REWRITE_TAC[COMPLEX_INV_MUL; COMPLEX_INV_INV] THEN
9569 POP_ASSUM MP_TAC THEN CONV_TAC COMPLEX_FIELD;
9571 MATCH_MP_TAC LIM_COMPOSE_AT THEN EXISTS_TAC `Cx(&0)` THEN
9572 REPEAT CONJ_TAC THENL
9573 [REWRITE_TAC[complex_div] THEN
9574 SIMP_TAC[LIM_INV_N_OFFSET; LIM_NULL_COMPLEX_LMUL];
9575 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
9576 MP_TAC(SPEC `norm(z:complex) + &1` REAL_ARCH_SIMPLE) THEN
9577 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN
9578 REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN X_GEN_TAC `n:num` THEN
9579 STRIP_TAC THEN MATCH_MP_TAC(TAUT `~p ==> p ==> q`) THEN
9580 ASM_REWRITE_TAC[COMPLEX_DIV_EQ_0; COMPLEX_SUB_0] THEN
9581 REWRITE_TAC[COMPLEX_RING `n + z = Cx(&0) <=> z = --n`] THEN
9582 DISCH_TAC THEN UNDISCH_TAC `norm(z:complex) + &1 <= &N` THEN
9583 ASM_REWRITE_TAC[NORM_NEG; COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
9584 GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_MUL_RID] THEN
9585 SIMP_TAC[LIM_COMPLEX_LMUL; LIM_LOGPLUS1_OVER_X]]]);;
9587 let LIM_SUB_CLOG = prove
9588 (`!w z. ((\n. clog(Cx(&n) + w) - clog(Cx(&n) + z)) --> Cx(&0)) sequentially`,
9589 REPEAT GEN_TAC THEN MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
9590 SUBST1_TAC(COMPLEX_RING `Cx(&0) = Cx(&0) * (w - z)`) THEN EXISTS_TAC
9591 `\n. inv(Cx(&n)) * Cx(&n) * (clog(Cx(&n) + w) - clog(Cx(&n) + z))` THEN
9593 [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
9594 REWRITE_TAC[ARITH_RULE `1 <= n <=> ~(n = 0)`; GSYM REAL_OF_NUM_EQ] THEN
9595 REWRITE_TAC[GSYM CX_INJ] THEN CONV_TAC COMPLEX_FIELD;
9596 MATCH_MP_TAC LIM_COMPLEX_MUL THEN
9597 REWRITE_TAC[LIM_INV_N; LIM_N_MUL_SUB_CLOG]]);;
9599 (* ------------------------------------------------------------------------- *)
9600 (* Equality between holomorphic functions, on open ball then connected set. *)
9601 (* ------------------------------------------------------------------------- *)
9603 let HOLOMORPHIC_FUN_EQ_ON_BALL = prove
9605 f holomorphic_on ball(z,r) /\ g holomorphic_on ball(z,r) /\
9607 (!n. higher_complex_derivative n f z = higher_complex_derivative n g z)
9609 REPEAT STRIP_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
9610 EXISTS_TAC `(\n. higher_complex_derivative n f z /
9611 Cx(&(FACT n)) * (w - z) pow n)` THEN
9612 EXISTS_TAC `(from 0)` THEN CONJ_TAC THENL [ALL_TAC; ASM_REWRITE_TAC []] THEN
9613 ASM_MESON_TAC [HOLOMORPHIC_POWER_SERIES]);;
9615 let HOLOMORPHIC_FUN_EQ_0_ON_BALL = prove
9617 w IN ball(z,r) /\ f holomorphic_on ball(z,r) /\
9618 (!n. higher_complex_derivative n f z = Cx(&0))
9620 REPEAT STRIP_TAC THEN
9621 SUBST1_TAC (GSYM (BETA_CONV `(\z:complex. Cx(&0)) w`)) THEN
9622 MATCH_MP_TAC HOLOMORPHIC_FUN_EQ_ON_BALL THEN
9623 REWRITE_TAC [HOLOMORPHIC_ON_CONST; HIGHER_COMPLEX_DERIVATIVE_CONST] THEN
9626 let HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED = prove
9628 open s /\ connected s /\ f holomorphic_on s /\
9629 z IN s /\ (!n. higher_complex_derivative n f z = Cx(&0))
9630 ==> !w. w IN s ==> f w = Cx(&0)`,
9631 REPEAT GEN_TAC THEN REWRITE_TAC[CONNECTED_CLOPEN] THEN STRIP_TAC THEN
9632 FIRST_X_ASSUM(MP_TAC o SPEC
9633 `{w | w IN s /\ !n. higher_complex_derivative n f w = Cx(&0)}`) THEN
9634 ANTS_TAC THENL [ALL_TAC; ASM SET_TAC[higher_complex_derivative]] THEN
9636 [MATCH_MP_TAC OPEN_SUBSET THEN CONJ_TAC THENL [SET_TAC[]; ALL_TAC] THEN
9637 UNDISCH_TAC `open(s:complex->bool)` THEN
9638 REWRITE_TAC[OPEN_CONTAINS_BALL; IN_ELIM_THM] THEN
9639 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `w:complex` THEN
9640 DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
9641 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
9642 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN STRIP_TAC THEN ASM_SIMP_TAC[] THEN
9643 X_GEN_TAC `u:complex` THEN REPEAT STRIP_TAC THEN
9644 MATCH_MP_TAC HOLOMORPHIC_FUN_EQ_0_ON_BALL THEN
9645 MAP_EVERY EXISTS_TAC [`w:complex`; `e:real`] THEN
9646 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
9647 [MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
9648 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; OPEN_BALL; SUBSET];
9649 ASM_REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_HIGHER_COMPLEX_DERIVATIVE]];
9651 `closed_in (subtopology euclidean s)
9653 (\n. {w | w IN s /\ higher_complex_derivative n f w = Cx(&0)})
9656 [MATCH_MP_TAC CLOSED_IN_INTERS THEN
9657 REWRITE_TAC[IMAGE_EQ_EMPTY; UNIV_NOT_EMPTY] THEN
9658 REWRITE_TAC[FORALL_IN_IMAGE; IN_UNIV] THEN X_GEN_TAC `n:num` THEN
9659 MATCH_MP_TAC CONTINUOUS_CLOSED_IN_PREIMAGE_CONSTANT THEN
9660 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN SIMP_TAC[ETA_AX] THEN
9661 MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
9663 MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
9664 SIMP_TAC[INTERS; IN_IMAGE; IN_UNIV; LEFT_IMP_EXISTS_THM; IN_ELIM_THM] THEN
9665 ONCE_REWRITE_TAC[SWAP_FORALL_THM] THEN
9666 REWRITE_TAC[LEFT_FORALL_IMP_THM; EXISTS_REFL] THEN SET_TAC[]]]);;
9668 let HOLOMORPHIC_FUN_EQ_ON_CONNECTED = prove
9670 open s /\ connected s /\ f holomorphic_on s /\ g holomorphic_on s /\
9672 (!n. higher_complex_derivative n f z = higher_complex_derivative n g z)
9674 REPEAT STRIP_TAC THEN
9675 MP_TAC(ISPECL [`\z. (f:complex->complex) z - g z`; `s:complex->bool`;
9676 `z:complex`] HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED) THEN
9677 ASM_REWRITE_TAC[RIGHT_IMP_FORALL_THM; HOLOMORPHIC_ON_SUB] THEN
9678 DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
9679 ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN DISCH_THEN MATCH_MP_TAC THEN
9680 ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB] THEN
9681 MP_TAC(ISPECL [`f:complex->complex`; `g:complex->complex`; `s:complex->bool`]
9682 HIGHER_COMPLEX_DERIVATIVE_SUB) THEN
9683 ASM_SIMP_TAC[COMPLEX_SUB_0]);;
9685 let HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED = prove
9689 f holomorphic_on s /\
9691 (!n. 0 < n ==> higher_complex_derivative n f z = Cx(&0))
9692 ==> !w. w IN s ==> f w = f z`,
9693 REPEAT STRIP_TAC THEN MP_TAC(ISPECL
9694 [`\w. (f:complex->complex) w - f z`; `s:complex->bool`; `z:complex`]
9695 HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED) THEN
9696 ASM_REWRITE_TAC[COMPLEX_SUB_0; RIGHT_IMP_FORALL_THM; IMP_IMP] THEN
9697 DISCH_THEN MATCH_MP_TAC THEN
9698 ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST] THEN
9699 X_GEN_TAC `n:num` THEN ASM_CASES_TAC `n = 0` THEN
9700 ASM_REWRITE_TAC[higher_complex_derivative; COMPLEX_SUB_REFL] THEN
9702 [`f:complex->complex`; `(\w. f(z:complex)):complex->complex`;
9703 `s:complex->bool`; `n:num`; `z:complex`]
9704 HIGHER_COMPLEX_DERIVATIVE_SUB) THEN
9705 ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN DISCH_THEN SUBST1_TAC THEN
9706 ASM_SIMP_TAC[LE_1; HIGHER_COMPLEX_DERIVATIVE_CONST; COMPLEX_SUB_REFL]);;
9708 (* ------------------------------------------------------------------------- *)
9709 (* Some basic lemmas about poles/singularities. *)
9710 (* ------------------------------------------------------------------------- *)
9712 let POLE_LEMMA = prove
9714 f holomorphic_on s /\ a IN interior(s)
9715 ==> (\z. if z = a then complex_derivative f a
9716 else (f(z) - f(a)) / (z - a)) holomorphic_on s`,
9717 REPEAT STRIP_TAC THEN SUBGOAL_THEN `(a:complex) IN s` ASSUME_TAC THENL
9718 [ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET]; ALL_TAC] THEN
9720 `!z. z IN s /\ ~(z = a)
9721 ==> (\z. if z = a then complex_derivative f a
9722 else (f(z) - f(a)) / (z - a))
9723 complex_differentiable (at z within s)`
9725 [REPEAT STRIP_TAC THEN
9726 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_WITHIN THEN
9727 EXISTS_TAC `\z:complex. (f(z) - f(a)) / (z - a)` THEN
9728 EXISTS_TAC `dist(a:complex,z)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
9730 [X_GEN_TAC `w:complex` THEN COND_CASES_TAC THEN
9731 ASM_REWRITE_TAC[REAL_LT_REFL] THEN STRIP_TAC THEN
9732 FIRST_X_ASSUM(MP_TAC o SPEC `w:complex`) THEN ASM_REWRITE_TAC[] THEN
9733 REPEAT(POP_ASSUM MP_TAC) THEN CONV_TAC COMPLEX_FIELD;
9734 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_WITHIN THEN
9735 ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
9736 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
9737 REWRITE_TAC[COMPLEX_DIFFERENTIABLE_CONST; COMPLEX_DIFFERENTIABLE_ID] THEN
9738 ASM_MESON_TAC[holomorphic_on; complex_differentiable]];
9740 REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
9741 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9742 ASM_CASES_TAC `z:complex = a` THENL [ALL_TAC; ASM_SIMP_TAC[]] THEN
9743 FIRST_X_ASSUM SUBST_ALL_TAC THEN
9744 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_INTERIOR]) THEN
9745 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
9746 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_AT_WITHIN THEN
9748 `(\z. if z = a then complex_derivative f a else (f z - f a) / (z - a))
9749 holomorphic_on ball(a,e)`
9752 ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; GSYM complex_differentiable;
9753 CENTRE_IN_BALL; COMPLEX_DIFFERENTIABLE_AT_WITHIN]] THEN
9754 MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN
9755 EXISTS_TAC `{a:complex}` THEN SIMP_TAC[OPEN_BALL; FINITE_RULES] THEN
9756 MATCH_MP_TAC(TAUT `b /\ (b ==> a) ==> a /\ b`) THEN CONJ_TAC THENL
9757 [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
9758 EXISTS_TAC `s DELETE (a:complex)` THEN
9759 ASM_SIMP_TAC[SET_RULE `b SUBSET s ==> b DIFF {a} SUBSET s DELETE a`] THEN
9760 ASM_SIMP_TAC[holomorphic_on; GSYM complex_differentiable; IN_DELETE] THEN
9761 REPEAT STRIP_TAC THEN
9762 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_WITHIN_SUBSET THEN
9763 EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[] THEN SET_TAC[];
9765 SIMP_TAC[HOLOMORPHIC_ON_OPEN; CONTINUOUS_ON_EQ_CONTINUOUS_AT;
9766 OPEN_DIFF; FINITE_IMP_CLOSED; OPEN_BALL; FINITE_INSERT;
9767 FINITE_RULES; GSYM complex_differentiable] THEN
9768 REWRITE_TAC[IN_DIFF; IN_BALL; IN_SING] THEN
9769 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `w:complex` THEN
9770 ASM_CASES_TAC `w:complex = a` THENL
9771 [ALL_TAC; ASM_SIMP_TAC[COMPLEX_DIFFERENTIABLE_IMP_CONTINUOUS_AT]] THEN
9772 FIRST_X_ASSUM SUBST_ALL_TAC THEN REWRITE_TAC[] THEN
9773 SUBGOAL_THEN `f holomorphic_on ball(a,e)` MP_TAC THENL
9774 [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
9775 ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
9776 REWRITE_TAC[GSYM complex_differentiable; IN_BALL] THEN
9777 DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN
9778 ASM_REWRITE_TAC[GSYM HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
9779 MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
9780 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT; CONTINUOUS_AT] THEN
9781 MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
9782 LIM_TRANSFORM_AT) THEN
9783 EXISTS_TAC `&1` THEN REWRITE_TAC[GSYM DIST_NZ; REAL_LT_01] THEN
9784 X_GEN_TAC `u:complex` THEN STRIP_TAC THEN ASM_REWRITE_TAC[]);;
9786 let POLE_LEMMA_OPEN = prove
9788 open s /\ f holomorphic_on s
9790 then complex_derivative f a
9791 else (f z - f a) / (z - a)) holomorphic_on s`,
9792 REPEAT STRIP_TAC THEN ASM_CASES_TAC `(a:complex) IN s` THENL
9793 [MATCH_MP_TAC POLE_LEMMA THEN ASM_SIMP_TAC[INTERIOR_OPEN];
9795 REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
9796 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9797 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_WITHIN THEN
9798 MAP_EVERY EXISTS_TAC [`\z:complex. (f(z) - f(a)) / (z - a)`; `&1`] THEN
9799 ASM_REWRITE_TAC[REAL_LT_01] THEN
9800 CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
9801 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_WITHIN THEN
9802 ASM_REWRITE_TAC[COMPLEX_SUB_0; CONJ_ASSOC] THEN
9803 CONJ_TAC THENL [CONJ_TAC; ASM_MESON_TAC[]] THEN
9804 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
9805 REWRITE_TAC[COMPLEX_DIFFERENTIABLE_CONST; COMPLEX_DIFFERENTIABLE_ID] THEN
9806 ASM_MESON_TAC[holomorphic_on; complex_differentiable]);;
9808 let POLE_THEOREM = prove
9810 g holomorphic_on s /\ a IN interior(s) /\
9811 (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z))
9812 ==> (\z. if z = a then complex_derivative g a
9813 else f(z) - g(a) / (z - a)) holomorphic_on s`,
9814 REPEAT GEN_TAC THEN REWRITE_TAC[CONJ_ASSOC] THEN
9815 DISCH_THEN(CONJUNCTS_THEN ASSUME_TAC) THEN
9816 FIRST_ASSUM(MP_TAC o MATCH_MP POLE_LEMMA) THEN
9817 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9818 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9819 COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
9820 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex` o last o CONJUNCTS) THEN
9821 ASM_REWRITE_TAC[] THEN REPEAT(POP_ASSUM MP_TAC) THEN
9822 CONV_TAC COMPLEX_FIELD);;
9824 let POLE_THEOREM_OPEN = prove
9826 open s /\ g holomorphic_on s /\
9827 (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z))
9828 ==> (\z. if z = a then complex_derivative g a
9829 else f(z) - g(a) / (z - a)) holomorphic_on s`,
9830 REPEAT GEN_TAC THEN REWRITE_TAC[CONJ_ASSOC] THEN
9831 DISCH_THEN(CONJUNCTS_THEN ASSUME_TAC) THEN
9832 FIRST_ASSUM(MP_TAC o SPEC `a:complex` o MATCH_MP POLE_LEMMA_OPEN) THEN
9833 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9834 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9835 COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
9836 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex` o last o CONJUNCTS) THEN
9837 ASM_REWRITE_TAC[] THEN REPEAT(POP_ASSUM MP_TAC) THEN
9838 CONV_TAC COMPLEX_FIELD);;
9840 let POLE_THEOREM_0 = prove
9842 g holomorphic_on s /\ a IN interior(s) /\
9843 (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z)) /\
9844 f a = complex_derivative g a /\ g(a) = Cx(&0)
9845 ==> f holomorphic_on s`,
9846 REPEAT STRIP_TAC THEN
9848 `(\z. if z = a then complex_derivative g a
9849 else f(z) - g(a) / (z - a)) holomorphic_on s`
9850 MP_TAC THENL [ASM_SIMP_TAC[POLE_THEOREM]; ALL_TAC] THEN
9851 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9852 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9853 COND_CASES_TAC THEN ASM_REWRITE_TAC[complex_div] THEN
9854 CONV_TAC COMPLEX_RING);;
9856 let POLE_THEOREM_OPEN_0 = prove
9858 open s /\ g holomorphic_on s /\
9859 (!z. z IN s /\ ~(z = a) ==> g(z) = (z - a) * f(z)) /\
9860 f a = complex_derivative g a /\ g(a) = Cx(&0)
9861 ==> f holomorphic_on s`,
9862 REPEAT STRIP_TAC THEN
9864 `(\z. if z = a then complex_derivative g a
9865 else f(z) - g(a) / (z - a)) holomorphic_on s`
9866 MP_TAC THENL [ASM_SIMP_TAC[POLE_THEOREM_OPEN]; ALL_TAC] THEN
9867 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_TRANSFORM) THEN
9868 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
9869 COND_CASES_TAC THEN ASM_REWRITE_TAC[complex_div] THEN
9870 CONV_TAC COMPLEX_RING);;
9872 let POLE_THEOREM_ANALYTIC = prove
9877 !w. w IN ball(z,d) /\ ~(w = a) ==> g(w) = (w - a) * f(w))
9878 ==> (\z. if z = a then complex_derivative g a
9879 else f(z) - g(a) / (z - a)) analytic_on s`,
9880 REPEAT GEN_TAC THEN REWRITE_TAC[analytic_on] THEN
9881 DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "A") (LABEL_TAC "B")) THEN
9882 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9883 REMOVE_THEN "A" (MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
9884 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
9885 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
9886 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
9887 EXISTS_TAC `min (d:real) e` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
9888 MATCH_MP_TAC POLE_THEOREM_OPEN THEN
9889 ASM_SIMP_TAC[BALL_MIN_INTER; OPEN_BALL; IN_INTER] THEN
9890 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; INTER_SUBSET]);;
9892 let POLE_THEOREM_ANALYTIC_0 = prove
9897 !w. w IN ball(z,d) /\ ~(w = a)
9898 ==> g(w) = (w - a) * f(w)) /\
9899 f a = complex_derivative g a /\ g(a) = Cx(&0)
9900 ==> f analytic_on s`,
9901 REPEAT STRIP_TAC THEN
9903 `(\z. if z = a then complex_derivative g a
9904 else f(z) - g(a) / (z - a)) analytic_on s`
9905 MP_TAC THENL [ASM_SIMP_TAC[POLE_THEOREM_ANALYTIC]; ALL_TAC] THEN
9906 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
9907 REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN COND_CASES_TAC THEN
9908 ASM_REWRITE_TAC[complex_div] THEN CONV_TAC COMPLEX_RING);;
9910 let POLE_THEOREM_ANALYTIC_OPEN_SUPERSET = prove
9912 s SUBSET t /\ open t /\ g analytic_on s /\
9913 (!z. z IN t /\ ~(z = a) ==> g(z) = (z - a) * f(z))
9914 ==> (\z. if z = a then complex_derivative g a
9915 else f(z) - g(a) / (z - a)) analytic_on s`,
9916 REPEAT STRIP_TAC THEN MATCH_MP_TAC POLE_THEOREM_ANALYTIC THEN
9917 ASM_MESON_TAC[OPEN_CONTAINS_BALL; SUBSET]);;
9919 let POLE_THEOREM_ANALYTIC_OPEN_SUPERSET_0 = prove
9921 s SUBSET t /\ open t /\ g analytic_on s /\
9922 (!z. z IN t /\ ~(z = a) ==> g(z) = (z - a) * f(z)) /\
9923 f a = complex_derivative g a /\ g(a) = Cx(&0)
9924 ==> f analytic_on s`,
9925 REPEAT STRIP_TAC THEN
9927 `(\z. if z = a then complex_derivative g a
9928 else f(z) - g(a) / (z - a)) analytic_on s`
9930 [MATCH_MP_TAC POLE_THEOREM_ANALYTIC_OPEN_SUPERSET THEN ASM_MESON_TAC[];
9932 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
9933 REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN COND_CASES_TAC THEN
9934 ASM_REWRITE_TAC[complex_div] THEN CONV_TAC COMPLEX_RING);;
9936 let HOLOMORPHIC_ON_EXTEND_LIM,HOLOMORPHIC_ON_EXTEND_BOUNDED =
9939 f holomorphic_on (s DELETE a) /\ a IN interior s
9940 ==> ((?g. g holomorphic_on s /\ (!z. z IN s DELETE a ==> g z = f z)) <=>
9941 ((\z. (z - a) * f(z)) --> Cx(&0)) (at a))) /\
9943 f holomorphic_on (s DELETE a) /\ a IN interior s
9944 ==> ((?g. g holomorphic_on s /\ (!z. z IN s DELETE a ==> g z = f z)) <=>
9945 (?B. eventually (\z. norm(f z) <= B) (at a))))`,
9946 REWRITE_TAC[AND_FORALL_THM] THEN
9947 REWRITE_TAC[TAUT `(p ==> q) /\ (p ==> r) <=> (p ==> q /\ r)`] THEN
9948 REPEAT GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC(TAUT
9949 `(p ==> r) /\ (r ==> q) /\ (q ==> p) ==> (p <=> q) /\ (p <=> r)`) THEN
9950 REPEAT CONJ_TAC THENL
9951 [REWRITE_TAC[IN_DELETE] THEN DISCH_THEN(X_CHOOSE_THEN `g:complex->complex`
9953 (MP_TAC o MATCH_MP HOLOMORPHIC_ON_IMP_CONTINUOUS_ON) ASSUME_TAC)) THEN
9954 DISCH_THEN(MP_TAC o SPEC `interior s:complex->bool` o
9955 MATCH_MP(REWRITE_RULE[IMP_CONJ] CONTINUOUS_ON_SUBSET)) THEN
9956 REWRITE_TAC[INTERIOR_SUBSET; CONTINUOUS_ON] THEN
9957 DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN
9958 ASM_SIMP_TAC[LIM_WITHIN_OPEN; OPEN_INTERIOR; tendsto] THEN
9959 DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN
9960 DISCH_THEN(fun th -> EXISTS_TAC `norm((g:complex->complex) a) + &1` THEN
9962 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MP) THEN
9963 FIRST_ASSUM(fun th ->
9964 REWRITE_TAC[GSYM(MATCH_MP EVENTUALLY_WITHIN_INTERIOR th)]) THEN
9965 ASM_SIMP_TAC[EVENTUALLY_WITHIN; GSYM DIST_NZ] THEN
9966 EXISTS_TAC `&1` THEN CONV_TAC NORM_ARITH;
9967 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
9968 MATCH_MP_TAC LIM_NULL_COMPLEX_RMUL_BOUNDED THEN EXISTS_TAC `B:real` THEN
9969 SUBST1_TAC(COMPLEX_RING `Cx(&0) = a - a`) THEN
9970 SIMP_TAC[LIM_AT_ID; LIM_CONST; LIM_SUB] THEN
9971 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ_ALT]
9972 EVENTUALLY_MONO)) THEN
9974 DISCH_TAC THEN ABBREV_TAC `h = \z. (z - a) pow 2 * f z` THEN
9975 SUBGOAL_THEN `(h has_complex_derivative Cx(&0)) (at a)` ASSUME_TAC THENL
9976 [EXPAND_TAC "h" THEN REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT] THEN
9977 MATCH_MP_TAC LIM_TRANSFORM_AT THEN
9978 MAP_EVERY EXISTS_TAC [`\z:complex. (z - a) * f z`; `&1`] THEN
9979 ASM_SIMP_TAC[REAL_LT_01; GSYM DIST_NZ] THEN CONV_TAC COMPLEX_FIELD;
9981 SUBGOAL_THEN `h holomorphic_on s` ASSUME_TAC THENL
9982 [REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
9983 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
9984 ASM_CASES_TAC `z:complex = a` THENL
9985 [ASM_MESON_TAC[complex_differentiable; COMPLEX_DIFFERENTIABLE_AT_WITHIN];
9987 EXPAND_TAC "h" THEN MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_MUL_WITHIN THEN
9988 CONJ_TAC THENL [COMPLEX_DIFFERENTIABLE_TAC; ALL_TAC] THEN
9989 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
9990 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
9991 ASM_REWRITE_TAC[IN_DELETE; complex_differentiable] THEN
9992 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `b:complex` THEN
9993 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN] THEN
9994 MATCH_MP_TAC EQ_IMP THEN MATCH_MP_TAC LIM_TRANSFORM_WITHIN_SET THEN
9995 REWRITE_TAC[EVENTUALLY_AT] THEN EXISTS_TAC `dist(a:complex,z)` THEN
9996 ASM_REWRITE_TAC[IN_DELETE; NORM_ARITH `&0 < dist(a,b) <=> ~(a = b)`] THEN
9997 MESON_TAC[REAL_LT_REFL];
9998 MP_TAC(SPECL [`h:complex->complex`; `s:complex->bool`; `a:complex`]
9999 POLE_LEMMA) THEN ASM_REWRITE_TAC[] THEN
10001 `g = \z. if z = a then complex_derivative h a
10002 else (h z - h a) / (z - a)` THEN
10005 `\z. if z = a then complex_derivative g a
10006 else (g z - g a) / (z - a)` THEN
10007 ASM_SIMP_TAC[POLE_LEMMA; IN_DELETE] THEN EXPAND_TAC "g" THEN
10008 FIRST_ASSUM(fun th ->
10009 REWRITE_TAC[MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE th]) THEN
10010 SIMP_TAC[COMPLEX_SUB_RZERO] THEN
10011 EXPAND_TAC "h" THEN SIMP_TAC[] THEN CONV_TAC COMPLEX_FIELD]]);;
10013 (* ------------------------------------------------------------------------- *)
10014 (* General, homology form of Cauchy's theorem. Proof is based on Dixon's, *)
10015 (* as presented in Lang's "Complex Analysis" book. *)
10016 (* ------------------------------------------------------------------------- *)
10018 let CAUCHY_INTEGRAL_FORMULA_GLOBAL = prove
10020 open s /\ f holomorphic_on s /\ z IN s /\
10021 valid_path g /\ pathfinish g = pathstart g /\
10022 path_image g SUBSET s DELETE z /\
10023 (!w. ~(w IN s) ==> winding_number(g,w) = Cx(&0))
10024 ==> ((\w. f(w) / (w - z)) has_path_integral
10025 (Cx(&2) * Cx(pi) * ii * winding_number(g,z) * f(z))) g`,
10026 MATCH_MP_TAC(MESON[]
10027 `((!f s g. vector_polynomial_function g ==> P f s g) ==> !f s g. P f s g) /\
10028 (!f s g. vector_polynomial_function g ==> P f s g)
10029 ==> !f s g. P f s g`) THEN
10031 [REPEAT STRIP_TAC THEN
10032 MP_TAC(ISPECL [`s DELETE (z:complex)`; `g:real^1->complex`]
10033 PATH_INTEGRAL_NEARBY_ENDS) THEN
10034 ASM_SIMP_TAC[VALID_PATH_IMP_PATH; OPEN_DELETE] THEN
10035 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
10036 MP_TAC(ISPECL [`g:real^1->complex`; `d:real`]
10037 PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
10038 ASM_SIMP_TAC[VALID_PATH_IMP_PATH] THEN
10039 DISCH_THEN(X_CHOOSE_THEN `p:real^1->complex` STRIP_ASSUME_TAC) THEN
10040 FIRST_X_ASSUM(MP_TAC o SPECL
10041 [`g:real^1->complex`; `p:real^1->complex`]) THEN
10042 ASM_SIMP_TAC[VECTOR_SUB_REFL; NORM_0;
10043 VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
10044 STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
10045 [`f:complex->complex`; `s:complex->bool`; `p:real^1->complex`]) THEN
10046 ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
10048 `winding_number(p,z) = winding_number(g,z) /\
10049 !w. ~(w IN s) ==> winding_number(p,w) = winding_number(g,w)`
10050 (fun th -> SIMP_TAC[th])
10052 [FIRST_X_ASSUM(K ALL_TAC o SPEC `z:complex`) THEN
10053 REPEAT(FIRST_X_ASSUM(STRIP_ASSUME_TAC o MATCH_MP (SET_RULE
10054 `g SUBSET s DELETE z
10055 ==> ~(z IN g) /\ (!y. ~(y IN s) ==> ~(y IN g))`))) THEN
10056 ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH;
10057 VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
10058 REPEAT STRIP_TAC THEN AP_TERM_TAC THEN
10059 FIRST_X_ASSUM MATCH_MP_TAC THEN
10060 REWRITE_TAC[complex_div; COMPLEX_MUL_LID] THEN
10061 MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN
10062 SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
10063 IN_DELETE; COMPLEX_SUB_0] THEN ASM SET_TAC[];
10065 ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
10066 MATCH_MP_TAC(MESON[HAS_PATH_INTEGRAL_INTEGRAL; path_integrable_on;
10067 PATH_INTEGRAL_UNIQUE]
10068 `f path_integrable_on g /\ path_integral p f = path_integral g f
10069 ==> (f has_path_integral y) p ==> (f has_path_integral y) g`) THEN
10071 [MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
10072 EXISTS_TAC `s DELETE (z:complex)` THEN ASM_SIMP_TAC[OPEN_DELETE];
10073 FIRST_X_ASSUM MATCH_MP_TAC] THEN
10074 MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
10075 SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST;
10076 IN_DELETE; COMPLEX_SUB_0] THEN
10077 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; DELETE_SUBSET];
10079 MAP_EVERY X_GEN_TAC
10080 [`f:complex->complex`; `u:complex->bool`; `g:real^1->complex`] THEN
10081 DISCH_TAC THEN X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
10082 FIRST_ASSUM(X_CHOOSE_THEN `g':real^1->complex` STRIP_ASSUME_TAC o
10083 MATCH_MP HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION) THEN
10085 `bounded(IMAGE (g':real^1->complex) (interval[vec 0,vec 1]))`
10087 [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
10088 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
10089 REWRITE_TAC[COMPACT_INTERVAL] THEN
10090 ASM_MESON_TAC[CONTINUOUS_VECTOR_POLYNOMIAL_FUNCTION;
10091 CONTINUOUS_AT_IMP_CONTINUOUS_ON];
10092 REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
10093 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC)] THEN
10094 FIRST_ASSUM(ASSUME_TAC o MATCH_MP VALID_PATH_IMP_PATH) THEN
10095 MAP_EVERY ABBREV_TAC
10096 [`d = \z w. if w = z then complex_derivative f z
10097 else (f(w) - f(z)) / (w - z)`;
10098 `v = {w | ~(w IN path_image g) /\ winding_number(g,w) = Cx(&0)}`] THEN
10099 SUBGOAL_THEN `open(v:complex->bool)` ASSUME_TAC THENL
10100 [EXPAND_TAC "v" THEN MATCH_MP_TAC OPEN_WINDING_NUMBER_LEVELSETS THEN
10103 SUBGOAL_THEN `u UNION v = (:complex)` ASSUME_TAC THENL
10104 [ASM SET_TAC[]; ALL_TAC] THEN
10105 SUBGOAL_THEN `!y:complex. y IN u ==> (d y) holomorphic_on u` ASSUME_TAC THENL
10106 [X_GEN_TAC `y:complex` THEN STRIP_TAC THEN EXPAND_TAC "d" THEN
10107 MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN EXISTS_TAC `{y:complex}` THEN
10108 ASM_REWRITE_TAC[FINITE_SING] THEN CONJ_TAC THENL
10109 [ASM_SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT] THEN
10110 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
10111 ASM_CASES_TAC `w:complex = y` THENL
10112 [UNDISCH_THEN `w:complex = y` SUBST_ALL_TAC THEN
10113 REWRITE_TAC[CONTINUOUS_AT] THEN
10114 MATCH_MP_TAC LIM_TRANSFORM_AWAY_AT THEN
10115 EXISTS_TAC `\w:complex. (f w - f y) / (w - y)` THEN SIMP_TAC[] THEN
10116 EXISTS_TAC `y + Cx(&1)` THEN
10117 CONJ_TAC THENL [CONV_TAC COMPLEX_RING; ALL_TAC] THEN
10118 REWRITE_TAC[GSYM HAS_COMPLEX_DERIVATIVE_AT] THEN
10119 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
10120 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT];
10121 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_IMP_CONTINUOUS_AT];
10122 ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DELETE; IN_DELETE;
10123 SET_RULE `s DIFF {x} = s DELETE x`; GSYM complex_differentiable] THEN
10124 X_GEN_TAC `w:complex` THEN STRIP_TAC] THEN
10125 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_AT THEN
10126 EXISTS_TAC `\w:complex. (f w - f y) / (w - y)` THEN
10127 EXISTS_TAC `dist(w:complex,y)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
10128 (CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC]) THEN
10129 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
10130 ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
10131 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
10132 ASM_SIMP_TAC[ETA_AX; COMPLEX_DIFFERENTIABLE_CONST;
10133 COMPLEX_DIFFERENTIABLE_ID] THEN
10134 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT];
10137 `!y. ~(y IN path_image g)
10138 ==> (\x. (f x - f y) / (x - y)) path_integrable_on g`
10140 [X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
10141 MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
10142 EXISTS_TAC `u DELETE (y:complex)` THEN ASM_SIMP_TAC[OPEN_DELETE] THEN
10143 CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
10144 MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
10145 SIMP_TAC[IN_DELETE; COMPLEX_SUB_0] THEN
10146 CONJ_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
10147 ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID] THEN
10148 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
10149 EXISTS_TAC `u:complex->bool` THEN ASM_REWRITE_TAC[DELETE_SUBSET];
10152 `!y:complex. d y path_integrable_on g`
10154 [X_GEN_TAC `y:complex` THEN
10155 ASM_CASES_TAC `(y:complex) IN path_image g` THENL
10156 [MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
10157 EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[] THEN ASM SET_TAC[];
10158 MATCH_MP_TAC PATH_INTEGRABLE_EQ THEN
10159 EXISTS_TAC `\x:complex. (f x - f y) / (x - y)` THEN
10160 ASM_SIMP_TAC[] THEN EXPAND_TAC "d" THEN ASM_MESON_TAC[]];
10163 `?h. (!z. z IN u ==> ((d z) has_path_integral h(z)) g) /\
10164 (!z. z IN v ==> ((\w. f(w) / (w - z)) has_path_integral h(z)) g)`
10165 (CHOOSE_THEN (CONJUNCTS_THEN2 (LABEL_TAC "u") (LABEL_TAC "v")))
10167 [EXISTS_TAC `\z. if z IN u then path_integral g (d z)
10168 else path_integral g (\w. f(w) / (w - z))` THEN
10169 SIMP_TAC[] THEN CONJ_TAC THEN X_GEN_TAC `w:complex` THEN DISCH_TAC THENL
10170 [ASM_MESON_TAC[HAS_PATH_INTEGRAL_INTEGRAL]; ALL_TAC] THEN
10171 ASM_CASES_TAC `(w:complex) IN u` THEN ASM_REWRITE_TAC[] THENL
10173 MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
10174 MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
10175 EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL
10176 [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
10177 ASM_SIMP_TAC[COMPLEX_SUB_0; HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST;
10178 HOLOMORPHIC_ON_ID] THEN
10180 ASM SET_TAC[]]] THEN
10181 MATCH_MP_TAC HAS_PATH_INTEGRAL_EQ THEN
10182 EXISTS_TAC `\x:complex. (f x - f w) / (x - w) + f(w) / (x - w)` THEN
10184 [X_GEN_TAC `x:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
10185 SIMPLE_COMPLEX_ARITH_TAC;
10187 GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_ADD_RID] THEN
10188 MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN
10189 UNDISCH_TAC `(w:complex) IN v` THEN EXPAND_TAC "v" THEN
10190 REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THENL
10191 [MATCH_MP_TAC(MESON[PATH_INTEGRAL_UNIQUE; HAS_PATH_INTEGRAL_INTEGRAL;
10192 path_integrable_on; PATH_INTEGRAL_EQ; PATH_INTEGRABLE_EQ]
10193 `g path_integrable_on p /\
10194 (!x. x IN path_image p ==> f x = g x)
10195 ==> (f has_path_integral path_integral p g) p`) THEN
10196 ASM_REWRITE_TAC[] THEN EXPAND_TAC "d" THEN ASM_MESON_TAC[];
10198 `Cx(&0) = (f w) * Cx(&2) * Cx pi * ii * winding_number(g,w)`
10199 SUBST1_TAC THENL [ASM_REWRITE_TAC[COMPLEX_MUL_RZERO]; ALL_TAC] THEN
10200 ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `x / y = x * Cx(&1) / y`] THEN
10201 MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_LMUL THEN
10202 MATCH_MP_TAC HAS_PATH_INTEGRAL_WINDING_NUMBER THEN
10203 ASM_REWRITE_TAC[]];
10205 SUBGOAL_THEN `!z. (h:complex->complex) z = Cx(&0)` ASSUME_TAC THENL
10207 REMOVE_THEN "u" (MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
10208 EXPAND_TAC "d" THEN REWRITE_TAC[] THEN
10209 DISCH_THEN(MP_TAC o SPEC `\w. (f w - f z) / (w - z)` o
10210 MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT] HAS_PATH_INTEGRAL_EQ)) THEN
10211 REWRITE_TAC[] THEN ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
10212 MP_TAC(SPECL [`g:real^1->complex`; `z:complex`]
10213 HAS_PATH_INTEGRAL_WINDING_NUMBER) THEN ASM_REWRITE_TAC[] THEN
10214 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
10215 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_COMPLEX_RMUL) THEN
10216 DISCH_THEN(MP_TAC o SPEC `(f:complex->complex) z`) THEN
10217 REWRITE_TAC[IMP_IMP] THEN
10218 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_ADD) THEN
10219 REWRITE_TAC[complex_div; COMPLEX_ADD_RID; COMPLEX_RING
10220 `(Cx(&1) * i) * fz + (fx - fz) * i = fx * i`] THEN
10221 REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC]] THEN
10222 UNDISCH_THEN `(z:complex) IN u` (K ALL_TAC) THEN
10223 FIRST_X_ASSUM(ASSUME_TAC o MATCH_MP (SET_RULE
10224 `p SUBSET u DELETE z ==> p SUBSET u`)) THEN
10225 POP_ASSUM_LIST(MP_TAC o end_itlist CONJ o rev) THEN STRIP_TAC THEN
10226 MATCH_MP_TAC LIOUVILLE_WEAK THEN
10227 MATCH_MP_TAC(TAUT `b /\ (b ==> a) ==> a /\ b`) THEN CONJ_TAC THENL
10230 compact t /\ path_image g SUBSET interior t /\ t SUBSET u`
10231 STRIP_ASSUME_TAC THENL
10234 {y + k | y IN path_image g /\ k IN ball(vec 0,dd)} SUBSET u`
10235 STRIP_ASSUME_TAC THENL
10236 [ASM_CASES_TAC `u = (:complex)` THENL
10237 [EXISTS_TAC `&1` THEN ASM_REWRITE_TAC[REAL_LT_01; SUBSET_UNIV];
10239 MP_TAC(ISPECL [`path_image g:complex->bool`; `(:complex) DIFF u`]
10240 SEPARATE_COMPACT_CLOSED) THEN
10241 ASM_SIMP_TAC[COMPACT_PATH_IMAGE; GSYM OPEN_CLOSED] THEN
10242 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
10243 DISCH_THEN(X_CHOOSE_THEN `dd:real` STRIP_ASSUME_TAC) THEN
10244 EXISTS_TAC `dd / &2` THEN ASM_REWRITE_TAC[REAL_HALF] THEN
10245 REWRITE_TAC[SUBSET; FORALL_IN_GSPEC] THEN
10246 MAP_EVERY X_GEN_TAC [`y:complex`; `k:complex`] THEN
10247 MATCH_MP_TAC(TAUT `(a /\ ~c ==> ~b) ==> a /\ b ==> c`) THEN
10249 FIRST_X_ASSUM(MP_TAC o SPECL [`y:complex`; `y + k:complex`]) THEN
10250 ASM_REWRITE_TAC[IN_DIFF; IN_UNIV; IN_BALL] THEN CONV_TAC NORM_ARITH;
10252 EXISTS_TAC `{y + k:complex |
10253 y IN path_image g /\ k IN cball(vec 0,dd / &2)}` THEN
10254 ASM_SIMP_TAC[COMPACT_SUMS; COMPACT_PATH_IMAGE; COMPACT_CBALL] THEN
10256 [REWRITE_TAC[SUBSET; IN_INTERIOR; IN_ELIM_THM] THEN
10257 X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
10258 EXISTS_TAC `dd / &2` THEN ASM_REWRITE_TAC[REAL_HALF] THEN
10259 X_GEN_TAC `x:complex` THEN REWRITE_TAC[IN_BALL] THEN DISCH_TAC THEN
10260 MAP_EVERY EXISTS_TAC [`y:complex`; `x - y:complex`] THEN
10261 ASM_REWRITE_TAC[IN_CBALL] THEN
10262 UNDISCH_TAC `dist(y:complex,x) < dd / &2` THEN CONV_TAC NORM_ARITH;
10263 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
10264 `{x + y:real^N | x IN s /\ y IN t} SUBSET u
10265 ==> t' SUBSET t ==> {x + y | x IN s /\ y IN t'} SUBSET u`)) THEN
10266 REWRITE_TAC[SUBSET; IN_BALL; IN_CBALL] THEN
10267 UNDISCH_TAC `&0 < dd` THEN CONV_TAC NORM_ARITH];
10269 MP_TAC(ISPECL [`interior t:complex->bool`; `g:real^1->complex`]
10270 PATH_INTEGRAL_BOUND_EXISTS) THEN
10271 ASM_REWRITE_TAC[OPEN_INTERIOR] THEN
10272 DISCH_THEN(X_CHOOSE_THEN `L:real` STRIP_ASSUME_TAC) THEN
10273 SUBGOAL_THEN `bounded(IMAGE (f:complex->complex) t)` MP_TAC THENL
10274 [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
10275 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
10276 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; CONTINUOUS_ON_SUBSET];
10277 REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE] THEN
10278 DISCH_THEN(X_CHOOSE_THEN `D:real` STRIP_ASSUME_TAC)] THEN
10279 FIRST_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_BOUNDED) THEN
10280 REWRITE_TAC[BOUNDED_POS] THEN
10281 DISCH_THEN(X_CHOOSE_THEN `C:real` STRIP_ASSUME_TAC) THEN
10282 REWRITE_TAC[LIM_AT_INFINITY] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
10283 EXISTS_TAC `(D * L) / (e / &2) + C:real` THEN REWRITE_TAC[real_ge] THEN
10284 X_GEN_TAC `y:complex` THEN DISCH_TAC THEN
10285 REWRITE_TAC[dist; COMPLEX_SUB_RZERO] THEN
10286 SUBGOAL_THEN `h y = path_integral g (\w. f w / (w - y))` SUBST1_TAC THENL
10287 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10288 FIRST_X_ASSUM MATCH_MP_TAC THEN EXPAND_TAC "v" THEN
10289 REWRITE_TAC[IN_ELIM_THM] THEN CONJ_TAC THENL
10291 UNDISCH_TAC `(D * L) / (e / &2) + C <= norm(y:complex)` THEN
10292 MATCH_MP_TAC(REAL_ARITH `&0 < d /\ x <= c ==> d + c <= x ==> F`) THEN
10293 ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF] THEN
10294 ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET];
10295 MATCH_MP_TAC WINDING_NUMBER_ZERO_OUTSIDE THEN
10296 EXISTS_TAC `cball(Cx(&0),C)` THEN
10297 ASM_REWRITE_TAC[CONVEX_CBALL; SUBSET; IN_CBALL; dist;
10298 COMPLEX_SUB_LZERO; NORM_NEG] THEN
10299 CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[INTERIOR_SUBSET; SUBSET]] THEN
10300 UNDISCH_TAC `(D * L) / (e / &2) + C <= norm(y:complex)` THEN
10301 MATCH_MP_TAC(REAL_ARITH `&0 < d ==> d + c <= x ==> ~(x <= c)`) THEN
10302 ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF]];
10304 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `L * (e / &2 / L)` THEN
10307 ASM_SIMP_TAC[REAL_DIV_LMUL; REAL_LT_IMP_NZ; REAL_HALF] THEN
10308 ASM_REAL_ARITH_TAC] THEN
10309 FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[] THEN CONJ_TAC THENL
10310 [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN CONJ_TAC THENL
10311 [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_TRANS; INTERIOR_SUBSET];
10312 SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID;
10313 HOLOMORPHIC_ON_CONST; COMPLEX_SUB_0]] THEN
10314 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
10315 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
10316 `d + c <= norm y ==> &0 < d /\ norm w <= c ==> ~(w = y)`)) THEN
10317 ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF] THEN
10318 ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
10320 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN SIMP_TAC[COMPLEX_NORM_DIV] THEN
10321 SUBGOAL_THEN `&0 < norm(w - y)` ASSUME_TAC THENL
10322 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
10323 `d + c <= norm y ==> &0 < d /\ norm w <= c ==> &0 < norm(w - y)`)) THEN
10324 ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_HALF] THEN
10325 ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
10326 ASM_SIMP_TAC[REAL_LE_LDIV_EQ]] THEN
10327 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `D:real` THEN CONJ_TAC THENL
10328 [ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET]; ALL_TAC] THEN
10329 REWRITE_TAC[REAL_ARITH `e / &2 / L * x = (x * (e / &2)) / L`] THEN
10330 ASM_SIMP_TAC[REAL_LE_RDIV_EQ; GSYM REAL_LE_LDIV_EQ; REAL_HALF] THEN
10331 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
10332 `d + c <= norm y ==> norm w <= c ==> d <= norm(w - y)`)) THEN
10333 ASM_MESON_TAC[SUBSET; INTERIOR_SUBSET];
10336 `(\y. (d:complex->complex->complex) (fstcart y) (sndcart y)) continuous_on
10337 {pastecart x z | x IN u /\ z IN u}`
10339 [REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN EXPAND_TAC "d" THEN
10340 REWRITE_TAC[FORALL_IN_GSPEC; continuous_within; IMP_CONJ] THEN
10341 MAP_EVERY X_GEN_TAC [`x:complex`; `z:complex`] THEN REPEAT DISCH_TAC THEN
10342 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
10343 REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART; FORALL_PASTECART] THEN
10344 REWRITE_TAC[dist; IMP_IMP; GSYM CONJ_ASSOC; PASTECART_SUB] THEN
10345 ASM_CASES_TAC `z:complex = x` THEN ASM_REWRITE_TAC[] THENL
10346 [UNDISCH_THEN `z:complex = x` (SUBST_ALL_TAC o SYM);
10348 `(\y. (f(sndcart y) - f(fstcart y)) / (sndcart y - fstcart y))
10349 continuous at (pastecart x z)`
10351 [MATCH_MP_TAC CONTINUOUS_COMPLEX_DIV_AT THEN
10352 ASM_SIMP_TAC[FSTCART_PASTECART; SNDCART_PASTECART; COMPLEX_SUB_0] THEN
10353 CONJ_TAC THEN MATCH_MP_TAC CONTINUOUS_SUB THEN
10354 SIMP_TAC[LINEAR_CONTINUOUS_AT; LINEAR_FSTCART; LINEAR_SNDCART] THEN
10355 CONJ_TAC THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
10356 MATCH_MP_TAC CONTINUOUS_AT_COMPOSE THEN
10357 SIMP_TAC[LINEAR_CONTINUOUS_AT; LINEAR_FSTCART; LINEAR_SNDCART] THEN
10358 REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART] THEN
10359 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
10360 CONTINUOUS_ON_EQ_CONTINUOUS_AT];
10362 REWRITE_TAC[continuous_at; dist; FORALL_PASTECART] THEN
10363 REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART; PASTECART_SUB] THEN
10364 DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
10365 DISCH_THEN(X_CHOOSE_THEN `k1:real` STRIP_ASSUME_TAC) THEN
10367 `open({pastecart x z | x IN u /\ z IN u} DIFF
10368 {y | y IN UNIV /\ fstcart y - sndcart y = Cx(&0)})`
10370 [MATCH_MP_TAC OPEN_DIFF THEN
10371 ASM_SIMP_TAC[REWRITE_RULE[PCROSS] OPEN_PCROSS] THEN
10372 MATCH_MP_TAC CONTINUOUS_CLOSED_PREIMAGE_CONSTANT THEN
10373 REWRITE_TAC[CLOSED_UNIV] THEN MATCH_MP_TAC CONTINUOUS_ON_SUB THEN
10374 SIMP_TAC[LINEAR_CONTINUOUS_ON; LINEAR_FSTCART; LINEAR_SNDCART];
10375 SIMP_TAC[OPEN_CONTAINS_BALL; IN_DIFF; IMP_CONJ; FORALL_IN_GSPEC] THEN
10376 DISCH_THEN(MP_TAC o SPECL [`x:complex`; `z:complex`]) THEN
10377 ASM_REWRITE_TAC[IN_ELIM_THM; IN_UNIV; COMPLEX_SUB_0] THEN
10378 ASM_REWRITE_TAC[SUBSET; IN_BALL; FORALL_PASTECART; IN_DIFF;
10379 IN_ELIM_PASTECART_THM; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10380 REWRITE_TAC[IN_ELIM_THM; IMP_IMP; GSYM CONJ_ASSOC] THEN
10381 REWRITE_TAC[ONCE_REWRITE_RULE[NORM_SUB] dist; PASTECART_SUB;
10382 FSTCART_PASTECART; SNDCART_PASTECART] THEN
10383 DISCH_THEN(X_CHOOSE_THEN `k2:real` STRIP_ASSUME_TAC)] THEN
10384 EXISTS_TAC `min k1 k2:real` THEN
10385 ASM_SIMP_TAC[REAL_LT_MIN; COMPLEX_NORM_NZ; COMPLEX_SUB_0]] THEN
10386 SUBGOAL_THEN `(complex_derivative f) continuous at z` MP_TAC THENL
10387 [MATCH_MP_TAC CONTINUOUS_ON_INTERIOR THEN
10388 EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[INTERIOR_OPEN] THEN
10389 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
10390 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10392 REWRITE_TAC[continuous_at] THEN DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN
10393 ASM_REWRITE_TAC[dist; REAL_HALF]] THEN
10394 DISCH_THEN(X_CHOOSE_THEN `k1:real` STRIP_ASSUME_TAC) THEN
10395 MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_BALL) THEN
10396 ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
10397 ASM_REWRITE_TAC[] THEN
10398 DISCH_THEN(X_CHOOSE_THEN `k2:real` STRIP_ASSUME_TAC) THEN
10399 EXISTS_TAC `min k1 k2:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
10400 MAP_EVERY X_GEN_TAC [`x':complex`; `z':complex`] THEN STRIP_TAC THEN
10401 MATCH_MP_TAC(REAL_ARITH `&0 < e /\ x <= e / &2 ==> x < e`) THEN
10402 COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL
10403 [ASM_MESON_TAC[NORM_LE_PASTECART; REAL_LET_TRANS; REAL_LT_IMP_LE];
10405 SUBGOAL_THEN `e / &2 = e / &2 / norm(z' - x') * norm(z' - x':complex)`
10407 [ASM_SIMP_TAC[REAL_DIV_RMUL; NORM_EQ_0; VECTOR_SUB_EQ]; ALL_TAC] THEN
10408 MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
10409 EXISTS_TAC `\u. (complex_derivative f u - complex_derivative f z) /
10411 ASM_SIMP_TAC[REAL_LE_DIV; NORM_POS_LE; REAL_LT_IMP_LE; REAL_HALF] THEN
10413 [ASM_SIMP_TAC[COMPLEX_FIELD
10415 ==> a / (z - x) - b = (a - b * (z - x)) / (z - x)`] THEN
10416 MATCH_MP_TAC HAS_PATH_INTEGRAL_COMPLEX_DIV THEN
10417 MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN
10418 REWRITE_TAC[HAS_PATH_INTEGRAL_CONST_LINEPATH] THEN
10419 MP_TAC(ISPECL [`f:complex->complex`; `complex_derivative f`;
10420 `linepath(x':complex,z')`; `u:complex->bool`]
10421 PATH_INTEGRAL_PRIMITIVE) THEN
10422 REWRITE_TAC[ETA_AX; PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
10423 DISCH_THEN MATCH_MP_TAC THEN
10424 REWRITE_TAC[VALID_PATH_LINEPATH] THEN CONJ_TAC THENL
10425 [ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE;
10426 GSYM HOLOMORPHIC_ON_DIFFERENTIABLE;
10427 HAS_COMPLEX_DERIVATIVE_AT_WITHIN; HOLOMORPHIC_ON_OPEN;
10428 complex_differentiable];
10429 MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,k2)`];
10430 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
10431 REWRITE_TAC[COMPLEX_NORM_DIV; real_div] THEN
10432 MATCH_MP_TAC REAL_LE_RMUL THEN
10433 REWRITE_TAC[REAL_LE_INV_EQ; NORM_POS_LE] THEN
10434 MATCH_MP_TAC(REAL_ARITH `x < e / &2 ==> x <= e * inv(&2)`) THEN
10435 FIRST_X_ASSUM MATCH_MP_TAC THEN
10436 REWRITE_TAC[REWRITE_RULE[ONCE_REWRITE_RULE[NORM_SUB] dist]
10437 (GSYM IN_BALL)] THEN
10438 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
10439 `w IN s ==> s SUBSET t ==> w IN t`))] THEN
10440 ASM_REWRITE_TAC[PATH_IMAGE_LINEPATH; SEGMENT_CONVEX_HULL] THEN
10441 MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
10442 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_BALL; dist] THEN
10443 ONCE_REWRITE_TAC[NORM_SUB] THEN
10444 ASM_MESON_TAC[NORM_LE_PASTECART; REAL_LET_TRANS];
10446 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_UNIV; IN_UNIV;
10447 GSYM complex_differentiable] THEN
10448 X_GEN_TAC `z0:complex` THEN ASM_CASES_TAC `(z0:complex) IN v` THENL
10450 [`f:complex->complex`; `h:complex->complex`; `g:real^1->complex`;
10451 `v:complex->bool`; `1`; `B:real`]
10452 CAUCHY_NEXT_DERIVATIVE) THEN
10453 ASM_SIMP_TAC[IN_DIFF; ARITH_EQ; COMPLEX_POW_1] THEN ANTS_TAC THENL
10455 [ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_UNIQUE_AT]; ALL_TAC] THEN
10456 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
10457 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
10458 EXISTS_TAC `u:complex->bool` THEN ASM SET_TAC[];
10459 DISCH_THEN(MP_TAC o SPEC `z0:complex`) THEN
10460 UNDISCH_TAC `(z0:complex) IN v` THEN EXPAND_TAC "v" THEN
10461 SIMP_TAC[IN_ELIM_THM; complex_differentiable] THEN MESON_TAC[]];
10463 SUBGOAL_THEN `(z0:complex) IN u` ASSUME_TAC THENL
10464 [ASM SET_TAC[]; ALL_TAC] THEN
10465 MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_BALL) THEN
10466 ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `z0:complex`) THEN
10467 ASM_SIMP_TAC[] THEN DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
10468 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
10469 EXISTS_TAC `ball(z0:complex,e)` THEN
10470 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
10471 MATCH_MP_TAC ANALYTIC_IMP_HOLOMORPHIC THEN MATCH_MP_TAC MORERA_TRIANGLE THEN
10472 REWRITE_TAC[OPEN_BALL] THEN
10473 SUBGOAL_THEN `(h:complex->complex) continuous_on u` ASSUME_TAC THENL
10474 [REWRITE_TAC[CONTINUOUS_ON_SEQUENTIALLY] THEN
10475 MAP_EVERY X_GEN_TAC [`a:num->complex`; `x:complex`] THEN STRIP_TAC THEN
10477 [`sequentially`; `\n:num x. (d:complex->complex->complex) (a n) x`;
10478 `B:real`; `g:real^1->complex`; `(d:complex->complex->complex) x`]
10479 PATH_INTEGRAL_UNIFORM_LIMIT) THEN
10480 ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; ETA_AX; EVENTUALLY_TRUE] THEN
10483 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN BINOP_TAC THEN
10484 REWRITE_TAC[FUN_EQ_THM; o_THM] THEN REPEAT GEN_TAC THEN
10485 MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10486 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]] THEN
10488 [ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_UNIQUE_AT]; ALL_TAC] THEN
10489 X_GEN_TAC `ee:real` THEN DISCH_TAC THEN
10490 MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_CBALL) THEN
10491 ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
10492 ASM_SIMP_TAC[] THEN
10493 DISCH_THEN(X_CHOOSE_THEN `dd:real` STRIP_ASSUME_TAC) THEN
10495 `(\y. (d:complex->complex->complex) (fstcart y) (sndcart y))
10496 uniformly_continuous_on
10497 {pastecart w z | w IN cball(x,dd) /\ z IN path_image g}`
10499 [MATCH_MP_TAC COMPACT_UNIFORMLY_CONTINUOUS THEN
10500 ASM_SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS; COMPACT_CBALL;
10501 COMPACT_VALID_PATH_IMAGE] THEN
10502 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10503 CONTINUOUS_ON_SUBSET)) THEN
10504 REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_ELIM_PASTECART_THM] THEN
10507 REWRITE_TAC[uniformly_continuous_on] THEN
10508 DISCH_THEN(MP_TAC o SPEC `ee:real`) THEN ASM_REWRITE_TAC[] THEN
10509 DISCH_THEN(X_CHOOSE_THEN `kk:real`
10510 (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
10511 DISCH_THEN(MP_TAC o GENL [`w:complex`; `z:complex`] o
10512 SPECL [`pastecart (x:complex) (z:complex)`;
10513 `pastecart (w:complex) (z:complex)`]) THEN
10514 SIMP_TAC[IN_ELIM_PASTECART_THM; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10515 ASM_SIMP_TAC[CENTRE_IN_CBALL; REAL_LT_IMP_LE; dist; PASTECART_SUB] THEN
10516 REWRITE_TAC[VECTOR_SUB_REFL; NORM_0; NORM_PASTECART] THEN
10517 CONV_TAC REAL_RAT_REDUCE_CONV THEN
10518 REWRITE_TAC[TAUT `b /\ (a /\ b) /\ c ==> d <=> a /\ b /\ c ==> d`] THEN
10519 SIMP_TAC[REAL_ADD_RID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
10520 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [LIM_SEQUENTIALLY]) THEN
10521 DISCH_THEN(MP_TAC o SPEC `min dd kk:real`) THEN
10522 ASM_REWRITE_TAC[EVENTUALLY_SEQUENTIALLY; REAL_LT_MIN] THEN
10523 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
10524 REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
10525 ASM_SIMP_TAC[ONCE_REWRITE_RULE[DIST_SYM] IN_CBALL; GSYM dist;
10528 CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
10531 `!w. w IN u ==> (\z. d z w) holomorphic_on u`
10533 [EXPAND_TAC "d" THEN X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
10534 MATCH_MP_TAC NO_ISOLATED_SINGULARITY THEN EXISTS_TAC `{y:complex}` THEN
10535 ASM_REWRITE_TAC[FINITE_SING] THEN CONJ_TAC THENL
10537 `((\y. (d:complex->complex->complex) (fstcart y) (sndcart y)) o
10538 (\z. pastecart y z))
10541 [MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
10542 SIMP_TAC[CONTINUOUS_ON_PASTECART; CONTINUOUS_ON_ID;
10543 CONTINUOUS_ON_CONST] THEN
10544 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10545 CONTINUOUS_ON_SUBSET)) THEN
10546 ASM_SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_PASTECART_THM];
10547 EXPAND_TAC "d" THEN
10548 REWRITE_TAC[o_DEF; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10549 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] CONTINUOUS_ON_EQ) THEN
10550 GEN_TAC THEN REWRITE_TAC[] THEN COND_CASES_TAC THEN
10551 ASM_REWRITE_TAC[] THEN
10552 DISCH_TAC THEN REWRITE_TAC[complex_div] THEN MATCH_MP_TAC(COMPLEX_RING
10553 `x':complex = --x /\ y' = --y ==> x * y = x' * y'`) THEN
10554 REWRITE_TAC[GSYM COMPLEX_INV_NEG; COMPLEX_NEG_SUB]];
10555 ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DELETE; IN_DELETE;
10556 SET_RULE `s DIFF {x} = s DELETE x`; GSYM complex_differentiable] THEN
10557 X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
10558 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_AT THEN
10559 EXISTS_TAC `\w:complex. (f y - f w) / (y - w)` THEN
10560 EXISTS_TAC `dist(w:complex,y)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
10561 (CONJ_TAC THENL [MESON_TAC[DIST_SYM; REAL_LT_REFL]; ALL_TAC]) THEN
10562 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_DIV_AT THEN
10563 ASM_REWRITE_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
10564 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
10565 ASM_SIMP_TAC[ETA_AX; COMPLEX_DIFFERENTIABLE_CONST;
10566 COMPLEX_DIFFERENTIABLE_ID] THEN
10567 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]];
10570 `!w a b:complex. w IN u /\ segment[a,b] SUBSET u
10571 ==> (\z. d z w) path_integrable_on (linepath(a,b))`
10573 [REPEAT STRIP_TAC THEN
10574 MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
10575 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
10579 segment[a,b] SUBSET u
10580 ==> (\w. path_integral (linepath(a,b)) (\z. d z w))
10583 [REPEAT STRIP_TAC THEN ASM_CASES_TAC `a:complex = b` THENL
10584 [ASM_SIMP_TAC[PATH_INTEGRAL_TRIVIAL; CONTINUOUS_ON_CONST]; ALL_TAC] THEN
10585 REWRITE_TAC[continuous_on] THEN X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
10586 X_GEN_TAC `ee:real` THEN DISCH_TAC THEN
10587 ASM_SIMP_TAC[dist; GSYM PATH_INTEGRAL_SUB] THEN
10588 MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_CBALL) THEN
10589 ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
10590 ASM_SIMP_TAC[] THEN
10591 DISCH_THEN(X_CHOOSE_THEN `dd:real` STRIP_ASSUME_TAC) THEN
10593 `(\y. (d:complex->complex->complex) (fstcart y) (sndcart y))
10594 uniformly_continuous_on
10595 {pastecart z t | z IN segment[a,b] /\ t IN cball(w,dd)}`
10597 [MATCH_MP_TAC COMPACT_UNIFORMLY_CONTINUOUS THEN
10598 ASM_SIMP_TAC[REWRITE_RULE[PCROSS] COMPACT_PCROSS;
10599 COMPACT_CBALL; COMPACT_SEGMENT] THEN
10600 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10601 CONTINUOUS_ON_SUBSET)) THEN
10602 REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_ELIM_PASTECART_THM] THEN
10605 REWRITE_TAC[uniformly_continuous_on] THEN
10606 DISCH_THEN(MP_TAC o SPEC `ee / &2 / norm(b - a:complex)`) THEN
10607 ASM_SIMP_TAC[REAL_HALF; REAL_LT_DIV; COMPLEX_NORM_NZ; COMPLEX_SUB_0] THEN
10608 DISCH_THEN(X_CHOOSE_THEN `kk:real`
10609 (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
10610 DISCH_THEN(MP_TAC o GENL [`z:complex`; `r:complex`] o
10611 SPECL [`pastecart (r:complex) (z:complex)`;
10612 `pastecart (r:complex) (w:complex)`]) THEN
10613 SIMP_TAC[IN_ELIM_PASTECART_THM; FSTCART_PASTECART; SNDCART_PASTECART] THEN
10614 ASM_SIMP_TAC[CENTRE_IN_CBALL; REAL_LT_IMP_LE; dist; PASTECART_SUB] THEN
10615 REWRITE_TAC[VECTOR_SUB_REFL; NORM_0; NORM_PASTECART] THEN
10616 CONV_TAC REAL_RAT_REDUCE_CONV THEN
10617 REWRITE_TAC[TAUT `(a /\ b) /\ a /\ c ==> d <=> a /\ b /\ c ==> d`] THEN
10618 SIMP_TAC[REAL_ADD_LID; POW_2_SQRT; NORM_POS_LE] THEN DISCH_TAC THEN
10619 EXISTS_TAC `min dd kk:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
10620 X_GEN_TAC `x:complex` THEN REPEAT STRIP_TAC THEN
10621 MATCH_MP_TAC(REAL_ARITH `&0 < e /\ x <= e / &2 ==> x < e`) THEN
10622 ASM_REWRITE_TAC[] THEN
10623 SUBGOAL_THEN `ee / &2 = ee / &2 / norm(b - a) * norm(b - a:complex)`
10625 [ASM_SIMP_TAC[REAL_DIV_RMUL; NORM_EQ_0; VECTOR_SUB_EQ]; ALL_TAC] THEN
10626 MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
10627 EXISTS_TAC `\r. (d:complex->complex->complex) r x - d r w` THEN
10628 ASM_SIMP_TAC[REAL_LE_DIV; NORM_POS_LE; REAL_LT_IMP_LE; REAL_HALF] THEN
10630 [MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
10631 MATCH_MP_TAC PATH_INTEGRABLE_SUB THEN ASM_SIMP_TAC[];
10632 REPEAT STRIP_TAC THEN GEN_REWRITE_TAC LAND_CONV [NORM_SUB] THEN
10633 MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
10634 ASM_REWRITE_TAC[IN_CBALL; dist] THEN
10635 ASM_MESON_TAC[NORM_SUB; REAL_LT_IMP_LE]];
10638 `!a b. segment[a,b] SUBSET u
10639 ==> (\w. path_integral (linepath (a,b)) (\z. d z w))
10640 path_integrable_on g`
10642 [REPEAT STRIP_TAC THEN REWRITE_TAC[PATH_INTEGRABLE_ON] THEN
10643 MATCH_MP_TAC INTEGRABLE_CONTINUOUS THEN
10644 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC THENL
10646 `((\w. path_integral (linepath(a,b)) (\z. d z w)) o (g:real^1->complex))
10647 continuous_on interval[vec 0,vec 1]`
10649 [MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
10650 ASM_SIMP_TAC[GSYM path; VALID_PATH_IMP_PATH] THEN
10651 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
10652 EXISTS_TAC `u:complex->bool` THEN ASM_SIMP_TAC[GSYM path_image];
10653 REWRITE_TAC[o_DEF]];
10654 FIRST_ASSUM(fun th -> REWRITE_TAC
10655 [MATCH_MP HAS_VECTOR_DERIVATIVE_UNIQUE_AT (SPEC_ALL th)]) THEN
10656 ASM_SIMP_TAC[ETA_AX; GSYM path; VALID_PATH_IMP_PATH;
10657 VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION]];
10660 `!a b. segment[a,b] SUBSET u
10661 ==> path_integral (linepath(a,b)) h =
10662 path_integral g (\w. path_integral (linepath (a,b)) (\z. d z w))`
10665 MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`; `c:complex`] THEN
10668 `segment[a:complex,b] SUBSET u /\
10669 segment[b,c] SUBSET u /\ segment[c,a] SUBSET u`
10670 STRIP_ASSUME_TAC THENL
10671 [ASM_MESON_TAC[SEGMENTS_SUBSET_CONVEX_HULL; SUBSET_TRANS]; ALL_TAC] THEN
10672 ASM_SIMP_TAC[] THEN
10673 ASM_SIMP_TAC[GSYM PATH_INTEGRAL_ADD; PATH_INTEGRABLE_ADD] THEN
10674 MATCH_MP_TAC PATH_INTEGRAL_EQ_0 THEN
10675 X_GEN_TAC `w:complex` THEN REWRITE_TAC[] THEN DISCH_TAC THEN
10676 SUBGOAL_THEN `(w:complex) IN u` ASSUME_TAC THENL
10677 [ASM SET_TAC[]; ALL_TAC] THEN
10678 ASM_SIMP_TAC[GSYM PATH_INTEGRAL_JOIN; VALID_PATH_LINEPATH;
10679 VALID_PATH_JOIN; PATHSTART_JOIN;
10680 PATH_INTEGRABLE_JOIN; PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
10681 MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10682 MATCH_MP_TAC CAUCHY_THEOREM_TRIANGLE THEN
10683 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `u:complex->bool` THEN
10684 ASM_SIMP_TAC[] THEN ASM SET_TAC[]] THEN
10685 MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`] THEN DISCH_TAC THEN
10686 MATCH_MP_TAC EQ_TRANS THEN
10687 EXISTS_TAC `path_integral (linepath(a,b)) (\z. path_integral g (d z))` THEN
10689 [MATCH_MP_TAC PATH_INTEGRAL_EQ THEN
10690 REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
10691 REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
10692 MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
10693 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[SUBSET];
10694 MATCH_MP_TAC(REWRITE_RULE[PCROSS] PATH_INTEGRAL_SWAP) THEN
10695 REWRITE_TAC[VALID_PATH_LINEPATH; VECTOR_DERIVATIVE_LINEPATH_AT;
10696 CONTINUOUS_ON_CONST] THEN
10697 FIRST_ASSUM(fun th -> REWRITE_TAC
10698 [MATCH_MP HAS_VECTOR_DERIVATIVE_UNIQUE_AT (SPEC_ALL th)]) THEN
10699 ASM_SIMP_TAC[ETA_AX; CONTINUOUS_VECTOR_POLYNOMIAL_FUNCTION;
10700 CONTINUOUS_AT_IMP_CONTINUOUS_ON] THEN
10701 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
10702 CONTINUOUS_ON_SUBSET)) THEN
10703 REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_ELIM_PASTECART_THM] THEN
10704 REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN ASM SET_TAC[]]);;
10706 let CAUCHY_THEOREM_GLOBAL = prove
10708 open s /\ f holomorphic_on s /\
10709 valid_path g /\ pathfinish g = pathstart g /\ path_image g SUBSET s /\
10710 (!z. ~(z IN s) ==> winding_number(g,z) = Cx(&0))
10711 ==> (f has_path_integral Cx(&0)) g`,
10712 REPEAT STRIP_TAC THEN
10713 SUBGOAL_THEN `?z:complex. z IN s /\ ~(z IN path_image g)`
10714 STRIP_ASSUME_TAC THENL
10715 [MATCH_MP_TAC(SET_RULE
10716 `t SUBSET s /\ ~(t = s) ==> ?z. z IN s /\ ~(z IN t)`) THEN
10717 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(MESON
10718 [CLOPEN; COMPACT_EQ_BOUNDED_CLOSED; NOT_BOUNDED_UNIV]
10719 `open s /\ compact t /\ ~(t = {}) ==> ~(t = s)`) THEN
10720 ASM_SIMP_TAC[COMPACT_PATH_IMAGE; PATH_IMAGE_NONEMPTY; VALID_PATH_IMP_PATH];
10721 MP_TAC(ISPECL [`\w:complex. (w - z) * f(w)`; `s:complex->bool`;
10722 `g:real^1->complex`; `z:complex`]
10723 CAUCHY_INTEGRAL_FORMULA_GLOBAL) THEN
10724 ASM_SIMP_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_LZERO; COMPLEX_MUL_RZERO;
10725 HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_SUB;
10726 HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST] THEN
10727 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
10728 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_EQ) THEN
10729 X_GEN_TAC `w:complex` THEN ASM_CASES_TAC `w:complex = z` THEN
10730 ASM_SIMP_TAC[COMPLEX_FIELD
10731 `~(w:complex = z) ==> ((w - z) * f) / (w - z) = f`]]);;
10733 let CAUCHY_THEOREM_GLOBAL_OUTSIDE = prove
10735 open s /\ f holomorphic_on s /\
10736 valid_path g /\ pathfinish g = pathstart g /\
10737 (!z. ~(z IN s) ==> z IN outside(path_image g))
10738 ==> (f has_path_integral Cx(&0)) g`,
10739 REPEAT STRIP_TAC THEN MATCH_MP_TAC CAUCHY_THEOREM_GLOBAL THEN
10740 EXISTS_TAC `s:complex->bool` THEN
10741 ASM_SIMP_TAC[WINDING_NUMBER_ZERO_IN_OUTSIDE; VALID_PATH_IMP_PATH] THEN
10742 MP_TAC(ISPEC `path_image(g:real^1->complex)` OUTSIDE_NO_OVERLAP) THEN
10745 (* ------------------------------------------------------------------------- *)
10746 (* First Cartan Theorem. *)
10747 (* ------------------------------------------------------------------------- *)
10749 let HIGHER_COMPLEX_DERIVATIVE_COMP_LEMMA = prove
10751 open s /\ f holomorphic_on s /\ z IN s /\
10752 open t /\ g holomorphic_on t /\ (!w. w IN s ==> f w IN t) /\
10753 complex_derivative f z = Cx(&1) /\
10754 (!i. 1 < i /\ i <= n ==> higher_complex_derivative i f z = Cx(&0)) /\
10756 ==> higher_complex_derivative i (g o f) z =
10757 higher_complex_derivative i g (f z)`,
10758 REPEAT GEN_TAC THEN
10760 `open s /\ f holomorphic_on s /\ z IN s /\ open t /\
10761 (!w. w IN s ==> f w IN t) /\
10762 complex_derivative f z = Cx(&1) /\
10763 (!i. 1 < i /\ i <= n ==> higher_complex_derivative i f z = Cx(&0))
10764 ==> !i g. g holomorphic_on t /\ i <= n
10765 ==> higher_complex_derivative i (g o f) z =
10766 higher_complex_derivative i g (f z)`
10767 (fun th -> MESON_TAC [th]) THEN
10770 REWRITE_TAC [LE_SUC_LT; higher_complex_derivative_alt; o_THM] THEN
10771 REPEAT STRIP_TAC THEN
10772 EQ_TRANS_TAC `higher_complex_derivative i
10773 (\w. complex_derivative g (f w) * complex_derivative f w) z` THENL
10774 [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
10775 EXISTS_TAC `s:complex->bool` THEN
10776 ASM_REWRITE_TAC [] THEN
10777 REPEAT CONJ_TAC THENL
10778 [MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10779 ASM_REWRITE_TAC [] THEN
10780 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
10781 EXISTS_TAC `t:complex->bool` THEN
10783 MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
10785 [REWRITE_TAC [GSYM o_DEF] THEN
10786 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
10787 EXISTS_TAC `t:complex->bool` THEN
10788 ASM_REWRITE_TAC [] THEN
10789 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10790 ASM_REWRITE_TAC [];
10791 ASM_REWRITE_TAC [ETA_AX] THEN
10792 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10793 ASM_REWRITE_TAC []];
10794 REPEAT STRIP_TAC THEN
10795 MATCH_MP_TAC COMPLEX_DERIVATIVE_CHAIN THEN
10796 ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]];
10799 (\j. Cx(&(binom (i,j))) *
10800 higher_complex_derivative j (\w. complex_derivative g (f w)) z *
10801 higher_complex_derivative (i - j) (complex_derivative f) z)` THENL
10802 [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_MUL THEN
10803 EXISTS_TAC `s:complex->bool` THEN
10804 ASM_REWRITE_TAC [] THEN
10805 ASM_SIMP_TAC [HOLOMORPHIC_COMPLEX_DERIVATIVE] THEN
10806 REWRITE_TAC [GSYM o_DEF] THEN
10807 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
10808 EXISTS_TAC `t:complex->bool` THEN
10809 ASM_REWRITE_TAC [] THEN
10810 ASM_SIMP_TAC [HOLOMORPHIC_COMPLEX_DERIVATIVE];
10811 REWRITE_TAC [GSYM higher_complex_derivative_alt] THEN
10814 (\j. Cx(&(binom (i,j))) *
10815 higher_complex_derivative j
10816 (\w. complex_derivative g (f w)) z *
10817 higher_complex_derivative (SUC (i - j)) f z)` THENL
10818 [MATCH_MP_TAC VSUM_SUPERSET THEN
10819 REWRITE_TAC[SUBSET_NUMSEG; LT_REFL; LE_0;
10820 LE_REFL; IN_NUMSEG_0; NUMSEG_SING; IN_SING] THEN
10821 X_GEN_TAC `j:num` THEN
10822 REWRITE_TAC [ARITH_RULE `j:num <= i /\ ~(j = i) <=> j < i`] THEN
10824 ASSERT_TAC `1 < SUC (i - j) /\ SUC (i - j) <= n` THENL
10825 [ASM_SIMP_TAC [ARITH_RULE
10826 `i < n /\ j < i ==> 1 < SUC (i - j) /\ SUC (i - j) <= n`] THEN
10827 MATCH_MP_TAC (ARITH_RULE `i < n /\ j < i ==> 1 < SUC (i - j)`) THEN
10828 ASM_REWRITE_TAC [];
10829 ASM_SIMP_TAC [COMPLEX_MUL_RZERO; COMPLEX_VEC_0]];
10830 REWRITE_TAC [NUMSEG_SING; VSUM_SING; BINOM_REFL; SUB_REFL] THEN
10831 ASM_REWRITE_TAC [COMPLEX_MUL_LID; COMPLEX_MUL_RID;
10832 higher_complex_derivative] THEN
10833 ASM_REWRITE_TAC [GSYM o_DEF] THEN
10834 REWRITE_TAC [GSYM higher_complex_derivative;
10835 higher_complex_derivative_alt] THEN
10836 FIRST_X_ASSUM MATCH_MP_TAC THEN
10837 ASM_SIMP_TAC [ARITH_RULE `i:num < n ==> i <= n`] THEN
10838 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10839 ASM_REWRITE_TAC []]]]);;
10841 let HIGHER_COMPLEX_DERIVATIVE_COMP_ITER_LEMMA = prove
10843 open s /\ f holomorphic_on s /\ (!w. w IN s ==> f w IN s) /\
10844 z IN s /\ f z = z /\ complex_derivative f z = Cx(&1) /\
10845 (!i. 1 < i /\ i <= n ==> higher_complex_derivative i f z = Cx(&0)) /\
10847 ==> higher_complex_derivative i (ITER m f) z =
10848 higher_complex_derivative i f z`,
10849 GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN
10850 REWRITE_TAC [RIGHT_FORALL_IMP_THM; IMP_CONJ] THEN
10851 REWRITE_TAC [IMP_IMP] THEN
10853 ASSERT_TAC `!m. ITER m f z = z:complex` THENL
10854 [INDUCT_TAC THEN ASM_REWRITE_TAC [ITER]; ALL_TAC] THEN
10855 ASSERT_TAC `!m (w:complex). w IN s ==> ITER m f w IN s` THENL
10856 [INDUCT_TAC THEN ASM_SIMP_TAC [ITER]; ALL_TAC] THEN
10857 ASSERT_TAC `!m. ITER m f holomorphic_on s` THENL
10858 [INDUCT_TAC THEN REWRITE_TAC [ITER_POINTLESS] THENL
10859 [ASM_SIMP_TAC [I_DEF; HOLOMORPHIC_ON_ID];
10860 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
10861 EXISTS_TAC `s:complex ->bool` THEN
10862 ASM_REWRITE_TAC []];
10865 [REWRITE_TAC [ITER_POINTLESS; I_DEF; HIGHER_COMPLEX_DERIVATIVE_ID] THEN
10866 REPEAT STRIP_TAC THEN COND_CASES_TAC THENL
10867 [ASM_REWRITE_TAC [higher_complex_derivative]; ALL_TAC] THEN
10868 REPEAT STRIP_TAC THEN COND_CASES_TAC THENL
10869 [ASM_REWRITE_TAC [higher_complex_derivative; ONE]; ALL_TAC] THEN
10870 MATCH_MP_TAC EQ_SYM THEN
10871 FIRST_X_ASSUM MATCH_MP_TAC THEN
10872 ASM_SIMP_TAC [ARITH_RULE `~(i = 0) /\ ~(i = 1) ==> 1 < i`];
10873 GEN_TAC THEN DISCH_TAC THEN
10874 REWRITE_TAC [ITER_ALT_POINTLESS] THEN
10875 EQ_TRANS_TAC `higher_complex_derivative i (ITER m f) (f z)` THENL
10876 [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_LEMMA THEN
10877 EXISTS_TAC `s:complex ->bool` THEN
10878 EXISTS_TAC `s:complex ->bool` THEN
10879 EXISTS_TAC `n:num` THEN
10880 ASM_REWRITE_TAC [];
10881 ASM_REWRITE_TAC [] THEN
10882 FIRST_X_ASSUM MATCH_MP_TAC THEN
10883 ASM_REWRITE_TAC []]]);;
10885 let HIGHER_COMPLEX_DERIVATIVE_ITER_TOP_LEMMA = prove
10887 open s /\ f holomorphic_on s /\ (!w. w IN s ==> f w IN s) /\
10888 z IN s /\ f z = z /\ complex_derivative f z = Cx(&1) /\
10889 (!i. 1 < i /\ i < n ==> higher_complex_derivative i f z = Cx(&0)) /\
10891 ==> higher_complex_derivative n (ITER m f) z =
10892 Cx(&m) * higher_complex_derivative n f z`,
10893 GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN
10894 INDUCT_TAC THEN REWRITE_TAC [LT_SUC_LE] THEN REWRITE_TAC [LT] THEN
10895 REWRITE_TAC [RIGHT_FORALL_IMP_THM] THEN
10897 ASSERT_TAC `!m. ITER m f z = z:complex` THENL
10898 [INDUCT_TAC THEN ASM_REWRITE_TAC [ITER]; ALL_TAC] THEN
10899 ASSERT_TAC `!m (w:complex). w IN s ==> ITER m f w IN s` THENL
10900 [INDUCT_TAC THEN ASM_SIMP_TAC [ITER]; ALL_TAC] THEN
10901 ASSERT_TAC `!m. ITER m f holomorphic_on s` THENL
10902 [INDUCT_TAC THEN REWRITE_TAC [ITER_POINTLESS] THEN
10903 ASM_SIMP_TAC [I_DEF; HOLOMORPHIC_ON_ID] THEN
10904 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
10905 EXISTS_TAC `s:complex ->bool` THEN
10906 ASM_REWRITE_TAC [];
10908 ASSERT_TAC `!w. w IN s ==> f complex_differentiable at w` THENL
10909 [ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]; ALL_TAC] THEN
10910 ASSERT_TAC `!m w. w IN s ==> ITER m f complex_differentiable at w` THENL
10911 [ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]; ALL_TAC] THEN
10912 ASSERT_TAC `!m. complex_derivative (ITER m f) z = Cx(&1)` THENL
10913 [INDUCT_TAC THEN ASM_REWRITE_TAC [ITER_POINTLESS] THENL
10914 [REWRITE_TAC [I_DEF; COMPLEX_DERIVATIVE_ID]; ALL_TAC] THEN
10915 ASM_SIMP_TAC [COMPLEX_DERIVATIVE_CHAIN;
10916 HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT] THEN
10917 REWRITE_TAC [COMPLEX_MUL_LID];
10920 REWRITE_TAC [higher_complex_derivative_alt; ITER_POINTLESS] THENL
10921 [ASM_REWRITE_TAC [COMPLEX_MUL_LZERO; I_DEF; COMPLEX_DERIVATIVE_ID;
10922 HIGHER_COMPLEX_DERIVATIVE_CONST;
10923 ARITH_RULE `n = 0 <=> ~(1 <= n)`];
10925 EQ_TRANS_TAC `higher_complex_derivative n
10926 (\w. complex_derivative f (ITER m f w) *
10927 complex_derivative (ITER m f) w) z` THENL
10928 [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
10929 EXISTS_TAC `s:complex->bool` THEN
10930 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
10931 [REWRITE_TAC [o_DEF] THEN
10932 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10933 ASM_REWRITE_TAC [] THEN
10934 ONCE_REWRITE_TAC [GSYM o_DEF] THEN
10935 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
10936 EXISTS_TAC `s:complex->bool` THEN
10937 ASM_REWRITE_TAC [ETA_AX];
10940 [MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN CONJ_TAC THENL
10941 [ONCE_REWRITE_TAC [GSYM o_DEF] THEN
10942 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
10943 EXISTS_TAC `s:complex->bool` THEN
10944 ASM_REWRITE_TAC[ETA_AX] THEN
10945 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10947 ONCE_REWRITE_TAC [GSYM o_DEF] THEN
10948 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
10949 EXISTS_TAC `s:complex->bool` THEN
10950 ASM_REWRITE_TAC[HOLOMORPHIC_ON_ID] THEN
10951 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10952 ASM_REWRITE_TAC[]];
10953 GEN_TAC THEN DISCH_TAC THEN
10954 MATCH_MP_TAC COMPLEX_DERIVATIVE_CHAIN THEN
10956 [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
10958 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
10959 ASM_MESON_TAC []]];
10963 (\i. Cx(&(binom (n,i))) *
10964 higher_complex_derivative i
10965 (\w. complex_derivative f (ITER m f w)) z *
10966 higher_complex_derivative (n - i)
10967 (complex_derivative (ITER m f)) z)` THENL
10968 [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_MUL THEN
10969 EXISTS_TAC `s:complex->bool` THEN
10970 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
10971 [ONCE_REWRITE_TAC [GSYM o_DEF] THEN
10972 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
10973 EXISTS_TAC `s:complex->bool` THEN
10974 ASM_REWRITE_TAC[ETA_AX] THEN
10975 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10977 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
10978 ASM_REWRITE_TAC[]];
10982 (\i. Cx(&(binom (n,i))) *
10983 higher_complex_derivative i
10984 (\w. complex_derivative f (ITER m f w)) z *
10985 higher_complex_derivative (n - i)
10986 (complex_derivative (ITER m f)) z)` THENL
10987 [MATCH_MP_TAC VSUM_SUPERSET THEN
10988 REWRITE_TAC [INSERT_SUBSET; EMPTY_SUBSET; IN_NUMSEG_0; LE_0; LE_REFL;
10989 IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM] THEN
10990 X_GEN_TAC `i:num` THEN
10992 REWRITE_TAC [GSYM higher_complex_derivative_alt] THEN
10993 ASSERT_TAC `1 < SUC (n-i) /\ SUC (n-i) <= n` THENL
10994 [ASM_SIMP_TAC [ARITH_RULE `i <= n /\ ~(i=0) /\ ~(i=n)
10995 ==> 1 < SUC (n-i) /\ SUC (n-i) <= n`];
10997 ASM_SIMP_TAC [] THEN
10999 `higher_complex_derivative (SUC (n - i)) (ITER m f) z = Cx(&0)`
11001 [EQ_TRANS_TAC `higher_complex_derivative (SUC (n - i)) f z` THENL
11002 [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_ITER_LEMMA THEN
11003 EXISTS_TAC `s:complex->bool` THEN
11004 ASM_REWRITE_TAC [] THEN
11005 EXISTS_TAC `n:num` THEN
11006 ASM_REWRITE_TAC [];
11007 FIRST_X_ASSUM MATCH_MP_TAC THEN
11008 ASM_REWRITE_TAC []];
11009 ASM_REWRITE_TAC [COMPLEX_MUL_RZERO; COMPLEX_VEC_0]];
11011 SIMP_TAC [VSUM_CLAUSES; FINITE_RULES; IN_INSERT; NOT_IN_EMPTY] THEN
11012 REWRITE_TAC [binom; BINOM_REFL; COMPLEX_MUL_LID;
11013 SUB_REFL; SUB; higher_complex_derivative] THEN
11014 ASM_CASES_TAC `n = 0` THEN ASM_REWRITE_TAC [] THENL
11015 [REWRITE_TAC [higher_complex_derivative] THEN
11016 POP_ASSUM SUBST_ALL_TAC THEN
11017 RULE_ASSUM_TAC (REWRITE_RULE [higher_complex_derivative]) THEN
11018 ASM_REWRITE_TAC [COMPLEX_MUL_RID; COMPLEX_MUL_LID;
11019 COMPLEX_VEC_0; COMPLEX_ADD_RID] THEN
11020 ASM_MESON_TAC [ARITH_RULE `~(1 <= 0)`];
11022 ASM_REWRITE_TAC [COMPLEX_MUL_LID; COMPLEX_VEC_0; COMPLEX_ADD_RID] THEN
11023 ASM_REWRITE_TAC [COMPLEX_MUL_RID] THEN
11024 ASM_REWRITE_TAC [GSYM higher_complex_derivative_alt] THEN
11026 `(\w. complex_derivative f (ITER m f w)) = complex_derivative f o ITER m f`
11028 THENL [REWRITE_TAC [FUN_EQ_THM; o_THM]; ALL_TAC] THEN
11030 `higher_complex_derivative n (complex_derivative f o ITER m f) z =
11031 higher_complex_derivative n (complex_derivative f) (ITER m f z)`
11033 [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_LEMMA THEN
11034 EXISTS_TAC `s:complex->bool` THEN
11035 EXISTS_TAC `s:complex->bool` THEN
11036 EXISTS_TAC `n:num` THEN
11037 ASM_REWRITE_TAC[] THEN
11038 ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; LE_REFL] THEN
11039 REPEAT STRIP_TAC THEN
11040 EQ_TRANS_TAC `higher_complex_derivative i f z` THENL
11041 [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMP_ITER_LEMMA THEN
11042 EXISTS_TAC `s:complex->bool` THEN
11043 EXISTS_TAC `n:num` THEN
11047 ASSERT_TAC `Cx(&(SUC m)) = Cx(&m) + Cx(&1)` THENL
11048 [REWRITE_TAC [GSYM CX_ADD; REAL_OF_NUM_ADD; ONE; ADD_SUC; ADD_0];
11049 ASM_REWRITE_TAC[COMPLEX_POLY_CLAUSES;
11050 GSYM higher_complex_derivative_alt]]);;
11052 let CAUCHY_HIGHER_COMPLEX_DERIVATIVE_BOUND = prove
11055 f holomorphic_on ball(z,r) /\
11056 f continuous_on cball(z,r) /\
11057 (!w. w IN ball(z,r) ==> f w IN ball(y,B0))
11058 ==> norm (higher_complex_derivative n f z) <= &(FACT n) * B0 / r pow n`,
11059 REPEAT STRIP_TAC THEN
11060 SUBGOAL_THEN `higher_complex_derivative n f z =
11061 higher_complex_derivative n (\w. f w - y) z`
11063 [EQ_TRANS_TAC `higher_complex_derivative n (\w. f w) z -
11064 higher_complex_derivative n (\w. y) z` THENL
11066 [HIGHER_COMPLEX_DERIVATIVE_CONST; ARITH_RULE `0<n ==> ~(n=0)`] THEN
11067 REWRITE_TAC [COMPLEX_SUB_RZERO; ETA_AX];
11068 MATCH_MP_TAC EQ_SYM THEN
11069 REWRITE_TAC [ETA_AX] THEN
11070 MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_SUB THEN
11071 EXISTS_TAC `ball(z:complex,r)` THEN
11072 ASM_SIMP_TAC [OPEN_BALL; HOLOMORPHIC_ON_CONST; CENTRE_IN_BALL]];
11075 `norm ((Cx(&2) * Cx pi * ii) / Cx(&(FACT n))
11076 * higher_complex_derivative n (\w. f w - y) z)
11077 <= (B0 / r pow (n + 1)) * &2 * pi * r`
11079 [MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH THEN
11080 EXISTS_TAC `(\u. (f u - y) / (u - z) pow (n + 1))` THEN
11081 EXISTS_TAC `z:complex` THEN STRIP_TAC THENL
11082 [MATCH_MP_TAC CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH THEN
11083 ASM_SIMP_TAC[CENTRE_IN_BALL] THEN CONJ_TAC THENL
11084 [MATCH_MP_TAC CONTINUOUS_ON_SUB THEN
11085 ASM_REWRITE_TAC [CONTINUOUS_ON_CONST];
11086 MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
11087 ASM_REWRITE_TAC [HOLOMORPHIC_ON_CONST]];
11089 ASM_SIMP_TAC[] THEN STRIP_TAC THENL
11090 [MATCH_MP_TAC REAL_LE_DIV THEN STRIP_TAC THENL
11091 [MATCH_MP_TAC REAL_LT_IMP_LE THEN
11093 (prove(`(?x. &0 <= x /\ x < B0) ==> &0 < B0`, REAL_ARITH_TAC)) THEN
11094 EXISTS_TAC `norm ((\u. (f:complex->complex) u - y) z)` THEN
11095 SIMP_TAC[NORM_POS_LE] THEN
11097 `!w:complex. f w IN ball(y,B0) ==> norm (f w - y) < B0`
11099 [ASM_MESON_TAC [dist; DIST_SYM; IN_BALL; CENTRE_IN_BALL];
11101 FIRST_ASSUM MATCH_MP_TAC THEN
11102 ASM_SIMP_TAC[CENTRE_IN_BALL];
11103 MATCH_MP_TAC(SPECL [`r:real`;`n + 1`] REAL_POW_LE) THEN
11104 ASM_SIMP_TAC[REAL_LT_IMP_LE]];
11105 REPEAT STRIP_TAC THEN
11106 ASM_REWRITE_TAC[COMPLEX_NORM_DIV;COMPLEX_NORM_POW] THEN
11107 ASM_SIMP_TAC [REAL_LE_DIV2_EQ; REAL_POW_LT] THEN
11108 ONCE_REWRITE_TAC[MESON[] `!(f:complex->complex).
11109 (f x - y) = (\w. f w - y) x`] THEN
11110 MATCH_MP_TAC CONTINUOUS_ON_CLOSURE_NORM_LE THEN
11111 EXISTS_TAC `ball(z:complex,r)` THEN
11112 ASM_SIMP_TAC[CLOSURE_BALL] THEN
11113 REPEAT STRIP_TAC THENL
11114 [MATCH_MP_TAC CONTINUOUS_ON_SUB THEN
11115 ASM_SIMP_TAC[CONTINUOUS_ON_CONST];
11117 `!w:complex. f w IN ball(y,B0) ==> norm (f w - y) <= B0`
11119 [REWRITE_TAC[GSYM dist;IN_BALL;DIST_SYM;REAL_LT_IMP_LE];
11120 ASM_MESON_TAC [dist; DIST_SYM; IN_BALL; CENTRE_IN_BALL]];
11121 ASM_REWRITE_TAC[cball;IN_ELIM_THM;dist;DIST_SYM] THEN
11122 ASM_SIMP_TAC[REAL_EQ_IMP_LE]]];
11124 REWRITE_TAC [COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_II;
11125 COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_ABS_PI;
11128 ABBREV_TAC `a = (&2 * pi) / &(FACT n)` THEN
11129 SUBGOAL_THEN `&0 < a` ASSUME_TAC THENL
11130 [EXPAND_TAC "a" THEN
11131 SIMP_TAC[REAL_LT_DIV; REAL_LT_MUL; REAL_OF_NUM_LT; FACT_LT; ARITH; PI_POS];
11134 `B0 / r pow (n + 1) * &2 * pi * r = a * (&(FACT n) * B0 / r pow n)`
11135 SUBST_ALL_TAC THENL
11136 [EXPAND_TAC "a" THEN
11137 REWRITE_TAC [GSYM ADD1; real_pow] THEN
11138 SUBGOAL_THEN `~(&(FACT n) = &0) /\ &0 < r` MP_TAC THENL
11139 [ASM_REWRITE_TAC[FACT_NZ; REAL_OF_NUM_EQ];
11140 CONV_TAC REAL_FIELD];
11141 ASM_MESON_TAC [REAL_LE_LCANCEL_IMP]]);;
11143 let FIRST_CARTAN_THM_DIM_1 = prove
11145 open s /\ connected s /\ bounded s /\
11146 (!w. w IN s ==> f w IN s) /\ f holomorphic_on s /\
11147 z IN s /\ f z = z /\
11148 complex_derivative f z = Cx(&1) /\ w IN s
11150 REWRITE_TAC [RIGHT_FORALL_IMP_THM; IMP_CONJ] THEN REPEAT GEN_TAC THEN
11151 REPEAT DISCH_TAC THEN REPEAT STRIP_TAC THEN EQ_TRANS_TAC `I w:complex` THENL
11152 [MATCH_MP_TAC HOLOMORPHIC_FUN_EQ_ON_CONNECTED;
11153 REWRITE_TAC [I_THM]] THEN
11154 EXISTS_TAC `z:complex` THEN EXISTS_TAC `s:complex->bool` THEN
11155 ASM_REWRITE_TAC [I_DEF; HOLOMORPHIC_ON_ID] THEN
11156 GEN_TAC THEN STRIP_ASSUME_TAC (ARITH_RULE `n = 0 \/ n = 1 \/ 1 < n`) THENL
11157 [ASM_REWRITE_TAC [higher_complex_derivative];
11158 ASM_REWRITE_TAC [ONE; higher_complex_derivative; COMPLEX_DERIVATIVE_ID];
11159 ASM_REWRITE_TAC [HIGHER_COMPLEX_DERIVATIVE_ID]] THEN
11160 ASM_SIMP_TAC [ARITH_RULE `1 < n ==> ~(n=0) /\ ~(n=1)`] THEN
11161 POP_ASSUM MP_TAC THEN SPEC_TAC (`n:num`,`n:num`) THEN
11162 MATCH_MP_TAC num_WF THEN REPEAT STRIP_TAC THEN
11163 REWRITE_TAC [GSYM COMPLEX_NORM_ZERO] THEN
11164 MATCH_MP_TAC REAL_ARCH_RDIV_EQ_0 THEN REWRITE_TAC [NORM_POS_LE] THEN
11165 ASSERT_TAC `?c. s SUBSET ball(z:complex,c)` THENL
11166 [ASSERT_TAC `?c. !w:complex. w IN s ==> norm w <= c` THENL
11167 [ASM_REWRITE_TAC[GSYM bounded];
11168 EXISTS_TAC `&2 * c + &1` THEN REWRITE_TAC [SUBSET] THEN GEN_TAC THEN
11170 SUBGOAL_THEN `norm (x:complex) <= c /\ norm (z:complex) <= c` MP_TAC THENL
11171 [ASM_MESON_TAC[]; REWRITE_TAC [IN_BALL] THEN NORM_ARITH_TAC]];
11173 ASSERT_TAC `?r. &0 < r /\ cball(z:complex,r) SUBSET s` THENL
11174 [ASM_MESON_TAC [OPEN_CONTAINS_CBALL];
11175 EXISTS_TAC `&(FACT n) * c / r pow n`] THEN
11176 ASSERT_TAC `&0 < c` THENL
11177 [SUBGOAL_THEN `~(ball(z:complex,c) = {})` MP_TAC THENL
11178 [ASM SET_TAC[]; ASM_REWRITE_TAC [BALL_EQ_EMPTY; REAL_NOT_LE]];
11180 ASSERT_TAC `ball(z:complex,r) SUBSET s` THENL
11181 [ASM_MESON_TAC [SUBSET_TRANS; BALL_SUBSET_CBALL]; ALL_TAC] THEN
11183 [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL
11184 [MATCH_MP_TAC REAL_LT_IMP_LE THEN MATCH_MP_TAC REAL_LTE_TRANS THEN
11185 EXISTS_TAC `&1` THEN REWRITE_TAC [REAL_LT_01; FACT_LE; REAL_OF_NUM_LE];
11186 MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC [REAL_LT_IMP_LE; REAL_POW_LE]];
11188 REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC [GSYM COMPLEX_NORM_NUM] THEN
11189 REWRITE_TAC [GSYM COMPLEX_NORM_MUL] THEN SUBGOAL_THEN
11190 `Cx(&m) * higher_complex_derivative n f z =
11191 higher_complex_derivative n (ITER m f) z`
11193 [MATCH_MP_TAC (GSYM HIGHER_COMPLEX_DERIVATIVE_ITER_TOP_LEMMA) THEN
11194 EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC [];
11196 REWRITE_TAC [COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_POS] THEN
11197 MATCH_MP_TAC CAUCHY_HIGHER_COMPLEX_DERIVATIVE_BOUND THEN
11198 EXISTS_TAC `z:complex` THEN ASM_SIMP_TAC [ARITH_RULE `1<n ==> 0 < n`] THEN
11199 ASSERT_TAC `!m w. w:complex IN s ==> ITER m f w IN s` THENL
11200 [INDUCT_TAC THEN ASM_SIMP_TAC [ITER];
11201 ASSERT_TAC `!m. ITER m f holomorphic_on s` THENL
11202 [INDUCT_TAC THEN REWRITE_TAC [ITER_POINTLESS] THENL
11203 [ASM_SIMP_TAC [I_DEF; HOLOMORPHIC_ON_ID];
11204 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
11205 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC []];
11206 ASSERT_TAC `ITER m f holomorphic_on ball(z,r)` THENL
11207 [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN ASM SET_TAC [];
11208 ASM_REWRITE_TAC[]] THEN
11210 [ASM_MESON_TAC [CONTINUOUS_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
11211 ASM SET_TAC []]]]);;
11213 (* ------------------------------------------------------------------------- *)
11214 (* Second Cartan Theorem. *)
11215 (* ------------------------------------------------------------------------- *)
11217 let SECOND_CARTAN_THM_DIM_1 = prove
11220 g holomorphic_on ball(Cx(&0),r) /\
11221 (!z. z IN ball(Cx(&0),r) ==> g z IN ball(Cx(&0),r)) /\
11222 g(Cx(&0)) = Cx(&0) /\
11223 f holomorphic_on ball(Cx(&0),r) /\
11224 (!z. z IN ball(Cx(&0),r) ==> f z IN ball(Cx(&0),r)) /\
11225 f (Cx(&0)) = Cx(&0) /\
11226 (!z. z IN ball(Cx(&0),r) ==> g (f z) = z) /\
11227 (!z. z IN ball(Cx(&0),r) ==> f (g z) = z)
11228 ==> ?t. !z. z IN ball(Cx(&0),r) ==> g z = cexp(ii * Cx t) * z`,
11229 let COMPLEX_DERIVATIVE_LEFT_INVERSE = prove
11231 open s /\ open t /\
11232 (!z. z IN s ==> f z IN t) /\ f holomorphic_on s /\
11233 (!z. z IN t ==> g z IN s) /\ g holomorphic_on t /\
11234 (!z. z IN s ==> g (f z) = z) /\ w IN s
11235 ==> complex_derivative f w * complex_derivative g (f w) = Cx(&1)`,
11236 REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC [COMPLEX_MUL_SYM] THEN
11237 SUBGOAL_THEN `complex_derivative g (f w) * complex_derivative f w =
11238 complex_derivative (g o f) w ` SUBST1_TAC THENL
11239 [ASM_MESON_TAC [HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT;
11240 COMPLEX_DERIVATIVE_CHAIN];
11241 EQ_TRANS_TAC `complex_derivative (\u. u) w` THENL
11242 [MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
11243 EXISTS_TAC `s:complex->bool` THEN
11244 ASM_SIMP_TAC[HOLOMORPHIC_ON_ID;o_THM] THEN
11245 ASM_MESON_TAC [HOLOMORPHIC_ON_COMPOSE_GEN];
11246 ASM_SIMP_TAC[COMPLEX_DERIVATIVE_ID]]]) in
11247 let LEMMA_1 = prove
11249 open s /\ connected s /\ f holomorphic_on s /\ Cx(&0) IN s /\
11250 (!u z. norm u = &1 /\ z IN s ==> u * z IN s) /\
11251 (!u z. norm u = &1 /\ z IN s ==> f (u * z) = u * f z)
11252 ==> ?c. !z. z IN s ==> f z = c * z`,
11253 REPEAT STRIP_TAC THEN ABBREV_TAC `c = complex_derivative f (Cx(&0))` THEN
11254 EXISTS_TAC `c : complex` THEN
11255 SUBGOAL_THEN `f(Cx(&0)) = Cx(&0)` ASSUME_TAC THENL
11256 [FIRST_X_ASSUM (MP_TAC o SPECL [`--Cx(&1)`;`Cx(&0)`]) THEN
11257 ASM_REWRITE_TAC [NORM_NEG; COMPLEX_NORM_NUM; COMPLEX_MUL_RZERO] THEN
11258 CONV_TAC COMPLEX_RING; ALL_TAC] THEN
11261 norm u = &1 /\ z IN s ==>
11262 u pow n * higher_complex_derivative n f (u * z) =
11263 u * higher_complex_derivative n f z`
11265 [REPEAT STRIP_TAC THEN
11266 EQ_TRANS_TAC `higher_complex_derivative n (\w. f (u * w)) z` THENL
11267 [MATCH_MP_TAC EQ_SYM THEN
11268 MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_COMPOSE_LINEAR THEN
11269 EXISTS_TAC `s:complex->bool` THEN EXISTS_TAC `s:complex->bool` THEN
11270 ASM_SIMP_TAC[]; ALL_TAC] THEN
11271 EQ_TRANS_TAC `higher_complex_derivative n (\w. u * f w) z` THENL
11272 [MATCH_MP_TAC HIGHER_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
11273 EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL
11275 (REWRITE_RULE [o_DEF]
11276 (SPECL [`\w:complex. u*w`; `f:complex->complex`]
11277 HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
11278 EXISTS_TAC `s:complex->bool` THEN
11279 ASM_SIMP_TAC [HOLOMORPHIC_ON_LINEAR];
11281 (REWRITE_RULE [o_DEF]
11282 (SPECL [`f:complex->complex`; `\w:complex. u*w`]
11283 HOLOMORPHIC_ON_COMPOSE_GEN)) THEN
11284 EXISTS_TAC `(:complex)` THEN
11285 ASM_REWRITE_TAC [HOLOMORPHIC_ON_LINEAR; IN_UNIV]];
11286 POP_ASSUM MP_TAC THEN SPEC_TAC (`z:complex`,`z:complex`) THEN
11287 SPEC_TAC (`n:num`,`n:num`) THEN INDUCT_TAC THEN
11288 REWRITE_TAC [higher_complex_derivative] THEN GEN_TAC THEN
11289 DISCH_TAC THEN EQ_TRANS_TAC
11290 `complex_derivative (\w. u * higher_complex_derivative n f w) z`
11292 [MATCH_MP_TAC COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
11293 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
11294 [MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
11295 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
11296 ASM_REWRITE_TAC [HOLOMORPHIC_ON_CONST];
11297 MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
11298 ASM_REWRITE_TAC [HOLOMORPHIC_ON_CONST; ETA_AX] THEN
11299 MATCH_MP_TAC HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE THEN
11300 ASM_REWRITE_TAC[]];
11301 MATCH_MP_TAC COMPLEX_DERIVATIVE_LMUL THEN
11302 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
11303 ASM_MESON_TAC [HOLOMORPHIC_HIGHER_COMPLEX_DERIVATIVE]]];
11305 `!n. 2 <= n ==> higher_complex_derivative n f (Cx(&0)) = Cx(&0)`
11307 [GEN_TAC THEN DISCH_TAC THEN SUBGOAL_THEN
11309 (!u. norm u = &1 ==> u pow n * z = u * z) ==> z = Cx(&0)`
11311 [REPEAT STRIP_TAC THEN MATCH_MP_TAC
11313 `!u. ~(u pow n' = u) /\ u pow n' * z = u * z ==> z = Cx(&0)`) THEN
11314 SUBGOAL_THEN `2 <= n' ==> ?u. norm u = &1 /\ ~(u pow n' = u)`
11315 (fun th -> ASM_MESON_TAC [th]) THEN
11316 STRUCT_CASES_TAC (SPEC `n':num` num_CASES) THEN
11318 [ARITH_LE; ARITH_RULE `2 <= SUC n'' <=> 1 <= n''`; complex_pow] THEN
11319 DISCH_TAC THEN MP_TAC (SPEC `n'':num` COMPLEX_NOT_ROOT_UNITY) THEN
11320 ASM_REWRITE_TAC [] THEN STRIP_TAC THEN EXISTS_TAC `u:complex` THEN
11321 ASM_REWRITE_TAC [] THEN POP_ASSUM MP_TAC THEN
11322 REWRITE_TAC [CONTRAPOS_THM] THEN
11323 SUBGOAL_THEN `~(u = Cx(&0))` MP_TAC THENL
11324 [ASM_REWRITE_TAC [GSYM COMPLEX_NORM_ZERO; REAL_OF_NUM_EQ; ARITH_EQ];
11325 CONV_TAC COMPLEX_FIELD];
11326 EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
11327 FIRST_X_ASSUM (MP_TAC o SPECL [`n:num`;`u:complex`;`Cx(&0)`]) THEN
11328 ASM_REWRITE_TAC[COMPLEX_MUL_RZERO]];
11329 REPEAT STRIP_TAC THEN MATCH_MP_TAC
11331 (SPECL [`f:complex->complex`; `\z. c*z`; `Cx(&0)`;
11333 HOLOMORPHIC_FUN_EQ_ON_CONNECTED)) THEN
11334 ASM_REWRITE_TAC [COMPLEX_MUL_RZERO; HOLOMORPHIC_ON_LINEAR;
11335 HIGHER_COMPLEX_DERIVATIVE_LINEAR] THEN
11336 GEN_TAC THEN FIRST_X_ASSUM (MP_TAC o SPEC `n:num`) THEN
11337 STRUCT_CASES_TAC (ARITH_RULE `n = 0 \/ n = 1 \/ 2 <= n`) THEN
11338 ASM_SIMP_TAC [higher_complex_derivative; ARITH_EQ; ARITH_LE; ONE] THEN
11339 ASM_SIMP_TAC [ARITH_RULE `2 <= n ==> ~(n=0)`] THEN
11340 ASM_SIMP_TAC [ARITH_RULE `2 <= n ==> ~(n=SUC 0)`]]]) in
11341 let LEMMA_2 = prove
11342 (`!r c. &0 < r /\ &0 <= c /\
11343 (!x. &0 <= x /\ x < r ==> c * x < r)
11345 REPEAT STRIP_TAC THEN REWRITE_TAC [GSYM REAL_NOT_LT] THEN STRIP_TAC THEN
11346 FIRST_X_ASSUM (MP_TAC o SPEC `r * (c + &1) / (&2 * c)`) THEN
11347 REWRITE_TAC [MESON [] `((a ==> b) ==> F) <=> (a /\ ~b)`] THEN
11350 [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL
11351 [ASM_REAL_ARITH_TAC; MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC];
11353 MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `r * &1` THEN
11354 CONJ_TAC THENL [ALL_TAC; REWRITE_TAC [REAL_MUL_RID; REAL_LE_REFL]] THEN
11355 MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[] THEN
11356 SUBGOAL_THEN `&0 < &2 * c` ASSUME_TAC THENL
11357 [ASM_REAL_ARITH_TAC;
11358 ASM_SIMP_TAC [REAL_LT_LDIV_EQ] THEN ASM_REAL_ARITH_TAC];
11359 REWRITE_TAC [REAL_NOT_LT] THEN
11360 ONCE_REWRITE_TAC [REAL_RING `!a b c:real. a * b * c = b * a * c`] THEN
11361 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `r * &1` THEN CONJ_TAC THENL
11362 [REWRITE_TAC [REAL_MUL_RID; REAL_LE_REFL]; ALL_TAC] THEN
11363 MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL
11364 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
11365 SUBGOAL_THEN `&0 < &2 * c` ASSUME_TAC THENL
11366 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
11367 ASM_SIMP_TAC [REAL_ARITH `&0 < c ==> a * b / c = (a * b) / c`] THEN
11368 SUBGOAL_THEN `(c * (c + &1)) / (&2 * c) = (c + &1) / &2`
11370 [ASM_SIMP_TAC [RAT_LEMMA5; REAL_ARITH `&0 < &2`] THEN
11371 ASM_REAL_ARITH_TAC;
11372 ASM_REAL_ARITH_TAC]]) in
11373 REPEAT STRIP_TAC THEN SUBGOAL_THEN
11374 `!u z. norm u = &1 /\ z IN ball(Cx(&0),r) ==> u * g z = g (u * z)`
11376 [REPEAT STRIP_TAC THEN SUBGOAL_THEN `~(u = Cx(&0))` ASSUME_TAC THENL
11377 [ASM_REWRITE_TAC[GSYM COMPLEX_NORM_NZ] THEN REAL_ARITH_TAC; ALL_TAC] THEN
11378 SUBGOAL_THEN `!w. w IN ball(Cx(&0),r) ==> f (u * g w) / u = w`
11380 [REPEAT STRIP_TAC THEN MATCH_MP_TAC FIRST_CARTAN_THM_DIM_1 THEN
11381 EXISTS_TAC `ball(Cx(&0),r)` THEN EXISTS_TAC `Cx(&0)` THEN
11382 ASM_REWRITE_TAC [OPEN_BALL;CONNECTED_BALL;BOUNDED_BALL;
11383 COMPLEX_MUL_RZERO; CENTRE_IN_BALL] THEN
11384 ASSERT_TAC `!z. norm (u * z) = norm z` THENL
11385 [ASM_REWRITE_TAC [COMPLEX_NORM_MUL; REAL_MUL_LID]; ALL_TAC] THEN
11386 ASSERT_TAC `!z. z IN ball(Cx(&0),r) ==> u * z IN ball(Cx(&0),r)` THENL
11387 [ASM_REWRITE_TAC [COMPLEX_IN_BALL_0]; ALL_TAC] THEN
11388 ASSERT_TAC `!z. z IN ball(Cx(&0),r) ==> z / u IN ball(Cx(&0),r)` THENL
11389 [ASM_REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_DIV; REAL_DIV_1];
11391 CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN CONJ_TAC THENL
11392 [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN CONJ_TAC THENL
11393 [ALL_TAC; ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST]] THEN
11394 SUBGOAL_THEN `(\w:complex. f (u * g w) : complex) = f o (\w. u * g w)`
11396 [REWRITE_TAC [o_DEF]; MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN] THEN
11397 EXISTS_TAC `ball(Cx(&0),r)` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
11398 [MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
11399 ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST];
11403 [REWRITE_TAC [complex_div; COMPLEX_MUL_LZERO]; ALL_TAC] THEN
11404 SUBGOAL_THEN `Cx(&1) = u / u` SUBST1_TAC THENL
11405 [ASM_SIMP_TAC [COMPLEX_DIV_REFL]; ALL_TAC] THEN
11406 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
11407 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_CDIV_AT THEN
11408 SUBGOAL_THEN `(\w:complex. f (u * g w) : complex) = f o (\w. u * g w)`
11409 SUBST1_TAC THENL [REWRITE_TAC [o_DEF]; ALL_TAC] THEN
11411 `((\w. f (u * g w)) has_complex_derivative
11412 complex_derivative f (u * g(Cx(&0))) *
11413 (u * complex_derivative g (Cx(&0))))
11414 (at (Cx(&0)))` MP_TAC THENL
11415 [MATCH_MP_TAC (REWRITE_RULE [o_DEF]
11416 (SPECL [`\w:complex. u * g(w):complex`; `f:complex->complex`]
11417 COMPLEX_DIFF_CHAIN_AT)) THEN CONJ_TAC THENL
11418 [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_LMUL_AT THEN
11419 REWRITE_TAC [HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
11420 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
11421 EXISTS_TAC `ball(Cx(&0),r)` THEN
11422 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL];
11423 REWRITE_TAC [HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
11424 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
11425 EXISTS_TAC `ball(Cx(&0),r)` THEN
11426 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; COMPLEX_MUL_RZERO]];
11428 `complex_derivative f (u * g (Cx(&0))) *
11429 (u * complex_derivative g (Cx(&0))) = u`
11431 [ALL_TAC; REWRITE_TAC[o_DEF]] THEN
11432 ABBREV_TAC `g' = complex_derivative g (Cx(&0))` THEN
11433 ABBREV_TAC `f' = complex_derivative f (Cx(&0))` THEN
11434 SUBGOAL_THEN `f' * g' = Cx(&1)` ASSUME_TAC THENL
11435 [EXPAND_TAC "g'" THEN EXPAND_TAC "f'" THEN
11436 SUBGOAL_THEN `complex_derivative g (Cx(&0)) =
11437 complex_derivative g (f (Cx(&0)))` SUBST1_TAC THENL
11438 [ASM_REWRITE_TAC [];
11439 MATCH_MP_TAC COMPLEX_DERIVATIVE_LEFT_INVERSE THEN
11440 EXISTS_TAC `ball(Cx(&0),r)` THEN EXISTS_TAC `ball(Cx(&0),r)` THEN
11441 ASM_REWRITE_TAC [OPEN_BALL; CENTRE_IN_BALL]];
11442 ASM_REWRITE_TAC [COMPLEX_MUL_RZERO] THEN
11443 POP_ASSUM MP_TAC THEN CONV_TAC COMPLEX_RING]];
11444 SUBGOAL_THEN `f(u*g(z)) = f (g (u * z)) : complex` MP_TAC THENL
11445 [MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC `u * z:complex` THEN CONJ_TAC THENL
11446 [SUBGOAL_THEN `!x y:complex. x / u = y ==> x = u * y` MATCH_MP_TAC THENL
11447 [REWRITE_TAC [complex_div] THEN GEN_TAC THEN GEN_TAC THEN
11448 DISCH_THEN (SUBST1_TAC o GSYM) THEN
11449 SUBGOAL_THEN `x = (inv u * u) * x` MP_TAC THENL
11450 [ASM_SIMP_TAC [COMPLEX_MUL_LINV; COMPLEX_MUL_LID];
11451 REWRITE_TAC [COMPLEX_MUL_AC]];
11452 POP_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC []];
11453 MATCH_MP_TAC EQ_SYM THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
11454 ASM_REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_MUL; REAL_MUL_LID] THEN
11455 ASM_REWRITE_TAC [GSYM COMPLEX_IN_BALL_0]];
11456 DISCH_TAC THEN SUBGOAL_THEN
11457 `g (f (u * g z)) = g (f (g (u * z : complex))) : complex` MP_TAC THENL
11458 [POP_ASSUM SUBST1_TAC THEN REWRITE_TAC [];
11459 SUBGOAL_THEN `u * g z IN ball (Cx(&0),r) /\ u * z IN ball(Cx(&0),r)`
11461 [ASM_REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_MUL; REAL_MUL_LID] THEN
11462 REWRITE_TAC [GSYM COMPLEX_IN_BALL_0] THEN ASM_SIMP_TAC[];
11463 ASM_SIMP_TAC[]]]]];
11464 SUBGOAL_THEN `?c. !z. z IN ball(Cx(&0),r) ==> g z = c * z`
11465 STRIP_ASSUME_TAC THENL
11466 [MATCH_MP_TAC LEMMA_1 THEN
11467 ASM_SIMP_TAC [OPEN_BALL; CONNECTED_BALL; CENTRE_IN_BALL] THEN
11468 SIMP_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_MUL; REAL_MUL_LID];
11470 SUBGOAL_THEN `norm (c:complex) = &1` ASSUME_TAC THENL
11471 [ALL_TAC; ASM_MESON_TAC [COMPLEX_NORM_EQ_1_CEXP]] THEN
11472 SUBGOAL_THEN `~(norm (c:complex) = &0)` ASSUME_TAC THENL
11473 [REWRITE_TAC [COMPLEX_NORM_ZERO] THEN STRIP_TAC THEN
11474 SUBGOAL_THEN `Cx(&0) = Cx(r / &2)` MP_TAC THENL
11475 [ALL_TAC; REWRITE_TAC [CX_INJ] THEN ASM_REAL_ARITH_TAC] THEN
11476 SUBGOAL_THEN `Cx(r / &2) IN ball(Cx(&0),r)` ASSUME_TAC THENL
11477 [REWRITE_TAC [COMPLEX_IN_BALL_0; CX_DIV; COMPLEX_NORM_DIV;
11478 COMPLEX_NORM_NUM] THEN
11479 REWRITE_TAC [COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
11480 EQ_TRANS_TAC `g (f (Cx(r / &2)):complex):complex` THENL
11481 [EQ_TRANS_TAC `c * (f (Cx(r / &2)):complex)` THENL
11482 [ASM_REWRITE_TAC [COMPLEX_MUL_LZERO]; ASM_MESON_TAC[]];
11484 ALL_TAC] THEN SUBGOAL_THEN `&0 < norm (c:complex)` ASSUME_TAC THENL
11485 [POP_ASSUM MP_TAC THEN CONV_TAC NORM_ARITH; ALL_TAC] THEN
11486 REWRITE_TAC [GSYM REAL_LE_ANTISYM] THEN CONJ_TAC THENL
11487 [MATCH_MP_TAC LEMMA_2 THEN EXISTS_TAC `r : real` THEN
11488 ASM_REWRITE_TAC [NORM_POS_LE] THEN GEN_TAC THEN STRIP_TAC THEN
11489 ABBREV_TAC `p = Cx x` THEN
11490 SUBGOAL_THEN `x = norm (p:complex)` SUBST_ALL_TAC THENL
11491 [EXPAND_TAC "p" THEN REWRITE_TAC [COMPLEX_NORM_CX] THEN
11492 ASM_REAL_ARITH_TAC;
11493 REWRITE_TAC [GSYM COMPLEX_NORM_MUL] THEN
11494 SUBGOAL_THEN `c * p = g p` SUBST1_TAC THENL
11495 [ALL_TAC; ASM_MESON_TAC [COMPLEX_IN_BALL_0]] THEN
11496 FIRST_X_ASSUM (MATCH_MP_TAC o GSYM) THEN
11497 ASM_MESON_TAC [COMPLEX_IN_BALL_0]];
11499 SUBST1_TAC (GSYM (SPEC `norm (c:complex)` REAL_INV_INV)) THEN
11500 MATCH_MP_TAC REAL_INV_1_LE THEN CONJ_TAC THENL
11501 [ASM_MESON_TAC [REAL_LT_INV]; ALL_TAC] THEN
11502 MATCH_MP_TAC LEMMA_2 THEN EXISTS_TAC `r:real` THEN ASM_REWRITE_TAC [] THEN
11504 [MATCH_MP_TAC REAL_LE_INV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
11505 GEN_TAC THEN STRIP_TAC THEN
11506 SUBGOAL_THEN `x = norm (g (f (Cx x):complex):complex)` SUBST1_TAC THENL
11507 [SUBGOAL_THEN `g (f (Cx x):complex) = Cx x` SUBST1_TAC THENL
11508 [FIRST_X_ASSUM MATCH_MP_TAC THEN
11509 REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_CX] THEN
11510 ASM_REAL_ARITH_TAC;
11511 REWRITE_TAC [COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC];
11512 SUBGOAL_THEN `g (f (Cx x):complex) = c * f (Cx x) : complex`
11514 [FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
11515 REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_CX] THEN
11516 ASM_REAL_ARITH_TAC;
11517 REWRITE_TAC [COMPLEX_NORM_MUL; REAL_MUL_ASSOC] THEN
11518 ASM_SIMP_TAC [REAL_MUL_LINV; REAL_MUL_LID; GSYM COMPLEX_IN_BALL_0] THEN
11519 FIRST_X_ASSUM MATCH_MP_TAC THEN
11520 REWRITE_TAC [COMPLEX_IN_BALL_0; COMPLEX_NORM_CX] THEN
11521 ASM_REAL_ARITH_TAC]]]);;
11523 (* ------------------------------------------------------------------------- *)
11524 (* Cauchy's inequality and more versions of Liouville. *)
11525 (* ------------------------------------------------------------------------- *)
11527 let CAUCHY_INEQUALITY = prove
11528 (`!f z r (B:real) n.
11529 f continuous_on cball(z,r) /\
11530 f holomorphic_on ball(z,r) /\ &0 < r /\
11531 (!x:complex. norm(z-x) = r ==> norm(f x) <= B)
11532 ==> norm (higher_complex_derivative n f z) <= &(FACT n) * B / r pow n`,
11533 REPEAT STRIP_TAC THEN SUBGOAL_THEN `&0 <= B` ASSUME_TAC THENL
11534 [SUBGOAL_THEN `?x:complex. norm (z-x) = r` STRIP_ASSUME_TAC THENL [
11535 EXISTS_TAC `z + Cx r` THEN ASM_SIMP_TAC[COMPLEX_ADD_SUB2;NORM_NEG;
11536 COMPLEX_NORM_CX;REAL_ABS_REFL;REAL_LT_IMP_LE];ALL_TAC] THEN
11537 ASM_MESON_TAC [NORM_POS_LE;REAL_LE_TRANS];
11538 SUBGOAL_THEN `norm ((Cx(&2) * Cx pi * ii) / Cx(&(FACT n))
11539 * higher_complex_derivative n f z)
11540 <= (B / r pow (n + 1)) * &2 * pi * r` MP_TAC THENL[
11541 MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH THEN
11542 EXISTS_TAC `\u. (f:complex->complex) u / (u - z) pow (n + 1)` THEN
11543 EXISTS_TAC `z:complex` THEN CONJ_TAC THENL [MATCH_MP_TAC
11544 CAUCHY_HAS_PATH_INTEGRAL_HIGHER_DERIVATIVE_CIRCLEPATH THEN
11545 ASM_SIMP_TAC [CENTRE_IN_BALL]; ALL_TAC] THEN CONJ_TAC THENL
11546 [MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC
11547 [REAL_POW_LE;REAL_LT_IMP_LE];ALL_TAC]THEN ASM_REWRITE_TAC []
11548 THEN GEN_TAC THEN DISCH_TAC THEN
11549 ASM_REWRITE_TAC [COMPLEX_NORM_DIV;COMPLEX_NORM_POW] THEN MATCH_MP_TAC
11550 REAL_LE_TRANS THEN EXISTS_TAC `B:real / r pow (n+1)` THEN
11551 ASM_SIMP_TAC[ REAL_LE_DIV2_EQ; REAL_POW_LT;NORM_SUB;REAL_LE_REFL];
11552 REWRITE_TAC[COMPLEX_NORM_DIV;COMPLEX_NORM_MUL; COMPLEX_NORM_II;
11553 COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_ABS_PI; REAL_MUL_RID;REAL_ABS_NUM]
11554 THEN SUBGOAL_THEN `B / r pow (n + 1) * &2 * pi * r =
11555 (&2 * pi) / &(FACT n) * (((&(FACT n) * B) * r/ r pow (n+1)))`
11556 SUBST1_TAC THENL [SUBGOAL_THEN `~(&(FACT n) = &0)` MP_TAC THENL
11557 [REWRITE_TAC [FACT_NZ;REAL_OF_NUM_EQ];ALL_TAC]
11558 THEN CONV_TAC REAL_FIELD;SUBGOAL_THEN `&0 < (&2 * pi) / &(FACT n)` ASSUME_TAC
11559 THENL[MATCH_MP_TAC REAL_LT_DIV THEN SIMP_TAC[FACT_LT;REAL_OF_NUM_LT] THEN
11560 MP_TAC PI_POS THEN REAL_ARITH_TAC;SUBGOAL_THEN `(&(FACT n) * B) * r / r pow
11561 (n + 1) = &(FACT n) * B / r pow n` SUBST1_TAC THENL
11562 [REWRITE_TAC[GSYM ADD1; real_pow] THEN MP_TAC (ASSUME `&0 < r`) THEN
11563 CONV_TAC REAL_FIELD; ASM_MESON_TAC [REAL_LE_LCANCEL_IMP]]]]]]);;
11565 let LIOUVILLE_POLYNOMIAL = prove
11567 f holomorphic_on (:complex) /\
11568 (!z. A <= norm(z) ==> norm(f z) <= B * norm(z) pow n)
11569 ==> !z. f(z) = vsum (0..n)
11570 (\k. higher_complex_derivative k f (Cx(&0)) /
11571 Cx(&(FACT k)) * z pow k)`,
11572 REPEAT STRIP_TAC THEN DISJ_CASES_TAC(REAL_ARITH `B <= &0 \/ &0 < B`) THENL
11573 [MP_TAC(ISPECL [`f:complex->complex`; `Cx(&0)`] LIOUVILLE_WEAK) THEN
11575 [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC LIM_EVENTUALLY THEN
11576 REWRITE_TAC[EVENTUALLY_AT_INFINITY; real_ge] THEN
11577 EXISTS_TAC `A:real` THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
11578 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
11579 REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC(NORM_ARITH
11580 `r <= &0 ==> norm z <= r ==> z = vec 0`) THEN
11581 MATCH_MP_TAC(REAL_ARITH `&0 <= --b * x ==> b * x <= &0`) THEN
11582 MATCH_MP_TAC REAL_LE_MUL THEN
11583 SIMP_TAC[NORM_POS_LE; REAL_POW_LE] THEN ASM_REAL_ARITH_TAC;
11584 GEN_REWRITE_TAC LAND_CONV [GSYM FUN_EQ_THM] THEN
11585 DISCH_THEN SUBST1_TAC THEN
11586 ASM_REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_CONST] THEN
11587 REWRITE_TAC[COND_ID; complex_div; COMPLEX_MUL_LZERO] THEN
11588 REWRITE_TAC[GSYM COMPLEX_VEC_0; VSUM_0]];
11590 ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0] THEN
11592 `((\n. higher_complex_derivative n f (Cx(&0)) / Cx(&(FACT n)) *
11593 (z - Cx(&0)) pow n) sums f(z)) (from 0)`
11595 [MATCH_MP_TAC HOLOMORPHIC_POWER_SERIES THEN
11596 EXISTS_TAC `norm(z:complex) + &1` THEN
11597 REWRITE_TAC[COMPLEX_IN_BALL_0; REAL_ARITH `x < x + &1`] THEN
11598 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV];
11599 REWRITE_TAC[COMPLEX_SUB_RZERO] THEN DISCH_TAC] THEN
11600 FIRST_ASSUM(MP_TAC o SPEC `n + 1` o
11601 MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
11602 ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
11603 REWRITE_TAC[ADD_SUB; ARITH_RULE `0 < n + 1`] THEN
11604 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] SERIES_UNIQUE) THEN
11605 REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC SUMS_0 THEN
11606 X_GEN_TAC `k:num` THEN
11607 REWRITE_TAC[IN_FROM; ARITH_RULE `n + 1 <= k <=> n < k`] THEN
11608 DISCH_TAC THEN REWRITE_TAC[COMPLEX_VEC_0; COMPLEX_ENTIRE] THEN
11609 REWRITE_TAC[COMPLEX_DIV_EQ_0] THEN REPEAT DISJ1_TAC THEN
11610 MATCH_MP_TAC(MESON[COMPLEX_NORM_NZ] `~(&0 < norm w) ==> w = Cx(&0)`) THEN
11611 DISCH_TAC THEN ABBREV_TAC
11612 `w = Cx(&(FACT k) *
11613 B / norm(higher_complex_derivative k f (Cx(&0))) +
11615 SUBGOAL_THEN `~(w = Cx(&0))` ASSUME_TAC THENL
11616 [EXPAND_TAC "w" THEN REWRITE_TAC[CX_INJ] THEN
11617 MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> ~(x + abs a + &1 = &0)`) THEN
11618 MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_POS] THEN
11619 MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE];
11622 [`f:complex->complex`; `Cx(&0)`; `norm(w:complex)`;
11623 `B * norm(w:complex) pow n`; `k:num`]
11624 CAUCHY_INEQUALITY) THEN
11625 REWRITE_TAC[NOT_IMP] THEN REPEAT CONJ_TAC THENL
11626 [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; HOLOMORPHIC_ON_SUBSET;
11628 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV];
11629 ASM_REWRITE_TAC[COMPLEX_NORM_NZ];
11630 REWRITE_TAC[COMPLEX_SUB_LZERO; NORM_NEG] THEN
11631 X_GEN_TAC `x:complex` THEN DISCH_THEN(fun th ->
11632 SUBST1_TAC(SYM th) THEN ASSUME_TAC th) THEN
11633 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
11634 EXPAND_TAC "w" THEN REWRITE_TAC[COMPLEX_NORM_CX] THEN
11635 MATCH_MP_TAC(REAL_ARITH `&0 <= k ==> a <= abs(k + abs a + &1)`) THEN
11636 MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_POS] THEN
11637 MATCH_MP_TAC REAL_LE_DIV THEN
11638 ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE];
11639 REWRITE_TAC[REAL_ARITH
11640 `~(d:real <= f * (b * n) / k) <=> f * b * (n / k) < d`] THEN
11641 ASM_SIMP_TAC[REAL_DIV_POW2; COMPLEX_NORM_ZERO] THEN
11642 ASM_REWRITE_TAC[REAL_MUL_ASSOC; GSYM NOT_LT] THEN
11643 ASM_SIMP_TAC[GSYM real_div; REAL_LT_LDIV_EQ; COMPLEX_NORM_NZ;
11645 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
11646 ASM_SIMP_TAC[GSYM REAL_LT_LDIV_EQ; COMPLEX_NORM_NZ] THEN
11647 TRANS_TAC REAL_LTE_TRANS `norm(w:complex) pow 1` THEN CONJ_TAC THENL
11648 [EXPAND_TAC "w" THEN REWRITE_TAC[REAL_POW_1; COMPLEX_NORM_CX] THEN
11649 MATCH_MP_TAC(REAL_ARITH
11650 `&0 <= k * B / d ==> (B * k) / d < abs(k * B / d + abs a + &1)`);
11651 MATCH_MP_TAC REAL_POW_MONO THEN
11652 CONJ_TAC THENL [ALL_TAC; ASM_ARITH_TAC] THEN
11653 EXPAND_TAC "w" THEN REWRITE_TAC[REAL_POW_1; COMPLEX_NORM_CX] THEN
11654 MATCH_MP_TAC(REAL_ARITH
11655 `&0 <= k * B / d ==> &1 <= abs(k * B / d + abs a + &1)`)] THEN
11656 MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_POS] THEN
11657 MATCH_MP_TAC REAL_LE_DIV THEN
11658 ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE]]);;
11660 let LIOUVILLE_THEOREM = prove
11661 (`!f. f holomorphic_on (:complex) /\ bounded (IMAGE f (:complex))
11662 ==> ?c. !z. f(z) = c`,
11663 REPEAT STRIP_TAC THEN
11664 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [bounded]) THEN
11665 REWRITE_TAC[FORALL_IN_IMAGE; IN_UNIV; LEFT_IMP_EXISTS_THM] THEN
11666 X_GEN_TAC `B:real` THEN STRIP_TAC THEN
11667 MP_TAC(ISPECL [`f:complex->complex`; `&0`; `B:real`; `0`]
11668 LIOUVILLE_POLYNOMIAL) THEN
11669 ASM_SIMP_TAC[VSUM_CLAUSES_NUMSEG; real_pow; REAL_MUL_RID; complex_pow] THEN
11672 (* ------------------------------------------------------------------------- *)
11673 (* A holomorphic function f has only isolated zeros unless f is 0. *)
11674 (* ------------------------------------------------------------------------- *)
11676 let ISOLATED_ZEROS = prove
11678 open a /\ connected a /\ f holomorphic_on a /\ z IN a /\ f z = Cx(&0) /\
11679 w IN a /\ ~(f w = Cx(&0))
11680 ==> (?r. &0 < r /\ ball(z,r) SUBSET a /\
11681 (!w. w IN ball(z,r) /\ ~(w=z) ==> ~(f w = Cx(&0))))`,
11682 REPEAT STRIP_TAC THEN ASSERT_TAC `?k.
11683 ~(higher_complex_derivative k f z = Cx(&0)) /\
11684 (!n. n < k ==> higher_complex_derivative n f z = Cx(&0))` THENL
11685 [EXISTS_TAC `minimal n. (~(higher_complex_derivative n f z = Cx(&0)))`
11686 THEN SUBGOAL_THEN `?k'. ~(higher_complex_derivative k' f z = Cx(&0))`
11687 (fun th-> ASM_MESON_TAC[th;MINIMAL]) THEN REWRITE_TAC[GSYM NOT_FORALL_THM]
11688 THEN STRIP_TAC THEN ASM_MESON_TAC[HOLOMORPHIC_FUN_EQ_0_ON_CONNECTED];
11689 ALL_TAC] THEN SUBGOAL_THEN `~(k = 0)`ASSUME_TAC THENL
11690 [STRIP_TAC THEN MP_TAC(ASSUME `~(higher_complex_derivative k f z = Cx(&0))`)
11691 THEN ASM_MESON_TAC[higher_complex_derivative];
11692 STRIP_ASSUME_TAC (MESON [OPEN_CONTAINS_BALL;ASSUME `open (a:complex->bool)`;
11693 ASSUME `z:complex IN a`] `?s. &0 < s /\ ball (z:complex,s) SUBSET a`)
11694 THEN ASSUME_TAC (MESON [HOLOMORPHIC_POWER_SERIES;
11695 ASSUME `f holomorphic_on a`;ASSUME `ball (z:complex,s)
11696 SUBSET a`;HOLOMORPHIC_ON_SUBSET] `!w:complex. w IN ball(z,s) ==>
11697 ((\n. higher_complex_derivative n f z / Cx(&(FACT n))*(w -z) pow n) sums f w)
11698 (from 0)`) THEN ASSERT_TAC `?g:complex->complex. !x:complex.
11700 (((\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11701 (x - z) pow (n-k))) sums g x) (from k)` THENL
11702 [EXISTS_TAC `\x:complex. lim sequentially
11703 (\m. vsum (k..m) (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11704 (x - z) pow (n-k)))` THEN GEN_TAC THEN DISCH_TAC THEN
11705 SUBGOAL_THEN `!m. k..m = (0..m) INTER from k` ASSUME_TAC THENL
11706 [REWRITE_TAC[EXTENSION; IN_FROM; IN_INTER; IN_ELIM_THM; IN_NUMSEG] THEN
11707 ARITH_TAC;ASM_REWRITE_TAC[] THEN REWRITE_TAC
11708 [SET_RULE `!m. (0..m) INTER from k = from k INTER (0..m)`;SUMS_LIM]] THEN
11709 ASM_CASES_TAC `x:complex = z` THENL
11710 [ASM_REWRITE_TAC[COMPLEX_SUB_REFL;summable] THEN
11711 EXISTS_TAC `higher_complex_derivative k f z / Cx(&(FACT k))` THEN
11712 MATCH_MP_TAC SUMS_EQ THEN EXISTS_TAC `\n. if n = k then
11713 higher_complex_derivative k f z / Cx(&(FACT k)) else Cx(&0)`
11714 THEN CONJ_TAC THENL [REWRITE_TAC [IN_FROM] THEN GEN_TAC THEN DISCH_TAC
11715 THEN COND_CASES_TAC THENL
11716 [ASM_REWRITE_TAC[COMPLEX_POW_ZERO;SUB_REFL;COMPLEX_MUL_RID];
11717 ASM_SIMP_TAC[COMPLEX_POW_ZERO; ARITH_RULE `k <= x' /\ ~(x' = k) ==>
11718 ~(x' - k = 0)`;COMPLEX_MUL_RZERO]]; MATCH_MP_TAC SERIES_VSUM THEN
11719 EXISTS_TAC `{k:num}` THEN SIMP_TAC [FINITE_SING;from;IN_SING;
11720 COMPLEX_VEC_0;VSUM_SING] THEN SET_TAC[LE_REFL]];
11721 MATCH_MP_TAC SUMMABLE_EQ THEN EXISTS_TAC
11722 `\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11723 (x - z) pow n / (x-z) pow k` THEN CONJ_TAC THENL [REWRITE_TAC [IN_FROM]
11724 THEN GEN_TAC THEN DISCH_TAC THEN SUBGOAL_THEN `(x:complex - z) pow (x' - k)
11725 = (x - z) pow x' / (x - z) pow k` (fun th->
11726 REWRITE_TAC[th;COMPLEX_EQ_MUL_LCANCEL]) THEN MATCH_MP_TAC
11727 COMPLEX_DIV_POW THEN ASM_SIMP_TAC [COMPLEX_SUB_0];
11728 SUBGOAL_THEN `(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11729 (x - z) pow n / (x - z) pow k) = (\n. (higher_complex_derivative n f z /
11730 Cx(&(FACT n)) *(x - z) pow n) / (x - z) pow k) ` SUBST1_TAC
11731 THENL [REWRITE_TAC [FUN_EQ_THM] THEN GEN_TAC THEN CONV_TAC COMPLEX_FIELD;
11732 MATCH_MP_TAC SUMMABLE_COMPLEX_DIV THEN MATCH_MP_TAC SUMMABLE_FROM_ELSEWHERE
11733 THEN EXISTS_TAC `0` THEN ASM_MESON_TAC[summable]]]];ALL_TAC] THEN
11734 ASSERT_TAC `~(g (z:complex) = Cx(&0)) /\
11735 (!x. x IN ball(z,s) ==> f x = (x - z) pow k * g(x))` THENL
11736 [CONJ_TAC THENL [MATCH_MP_TAC
11737 (COMPLEX_FIELD `!x y:complex. x = y /\ ~(y= Cx(&0)) ==> ~(x=Cx(&0))`) THEN
11738 EXISTS_TAC `higher_complex_derivative k f z / Cx(&(FACT k))` THEN
11739 CONJ_TAC THENL [ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0] THEN
11740 MATCH_MP_TAC SERIES_UNIQUE THEN EXISTS_TAC
11741 `(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11742 Cx(&0) pow (n-k))` THEN EXISTS_TAC `from (k +1)` THEN
11743 CONJ_TAC THENL [SUBST1_TAC (MESON [VSUM_SING_NUMSEG]
11744 `higher_complex_derivative k f z / Cx(&(FACT k)) =
11745 vsum (k..k) (\n. higher_complex_derivative n f z / Cx(&(FACT n))) `)
11746 THEN SUBGOAL_THEN `vsum (k..k) (\n. higher_complex_derivative n f z
11747 / Cx(&(FACT n))) = vsum (k..((k+1)-1)) (\n. higher_complex_derivative n f z
11748 / Cx(&(FACT n)) * Cx(&0) pow (n - k))` SUBST1_TAC THENL [
11749 REWRITE_TAC[VSUM_SING_NUMSEG; COMPLEX_POW_ZERO;SUB_REFL;COMPLEX_MUL_RID;
11750 ARITH_RULE `((k:num) + 1) -1 = k`];
11751 MATCH_MP_TAC SUMS_OFFSET THEN
11752 ASM_REWRITE_TAC[ARITH_RULE `k:num <= k+1 /\ 0 < k+1`]
11753 THEN POP_ASSUM (MP_TAC o SPEC `z:complex`) THEN
11754 ASM_REWRITE_TAC[CENTRE_IN_BALL;COMPLEX_SUB_REFL]];MATCH_MP_TAC
11755 SUMS_COMPLEX_0 THEN GEN_TAC THEN SIMP_TAC [IN_FROM;COMPLEX_POW_ZERO;
11756 ARITH_RULE `k + 1 <= n <=> ~(n-k= 0)`;COMPLEX_MUL_RZERO]];
11757 MATCH_MP_TAC (COMPLEX_FIELD `!x y. ~(x = Cx(&0)) /\ ~(y = Cx(&0))
11758 ==> ~(x / y = Cx(&0))`) THEN ASM_REWRITE_TAC[GSYM COMPLEX_NORM_ZERO] THEN
11759 SUBST1_TAC (MESON [COMPLEX_NORM_CX]
11760 `norm (Cx(&(FACT k))) = abs ((&(FACT k)))`) THEN
11761 SIMP_TAC [REAL_ABS_ZERO;FACT_LT;REAL_OF_NUM_LT;REAL_LT_IMP_NZ]]; ALL_TAC]
11762 THEN GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
11763 EXISTS_TAC `(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11764 (x - z) pow n)`THEN EXISTS_TAC `(from 0)` THEN
11765 CONJ_TAC THENL [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[];
11766 ASM_CASES_TAC `x:complex = z` THENL [
11767 ASM_REWRITE_TAC[COMPLEX_SUB_REFL] THEN MATCH_MP_TAC SUMS_EQ THEN
11768 EXISTS_TAC `\n:num. Cx(&0)` THEN CONJ_TAC THENL
11769 [REWRITE_TAC[IN_FROM;COMPLEX_POW_ZERO] THEN X_GEN_TAC `n:num` THEN
11770 DISCH_TAC THEN COND_CASES_TAC THENL [
11771 ASM_REWRITE_TAC[higher_complex_derivative] THEN CONV_TAC COMPLEX_FIELD;
11772 REWRITE_TAC[COMPLEX_MUL_RZERO]];
11773 ASM_REWRITE_TAC[COMPLEX_POW_ZERO;COMPLEX_MUL_LZERO] THEN
11774 ASM_REWRITE_TAC[SERIES_0;GSYM COMPLEX_VEC_0]];ALL_TAC] THEN
11775 MATCH_MP_TAC SUMS_EQ THEN EXISTS_TAC `\n.(x-z) pow k *
11776 higher_complex_derivative n f z / Cx(&(FACT n)) *(x - z) pow (n - k)`
11777 THEN CONJ_TAC THENL [REWRITE_TAC[IN_FROM] THEN X_GEN_TAC `n:num`
11778 THEN DISCH_TAC THEN ASM_CASES_TAC `n:num < k` THENL [ASM_SIMP_TAC[]
11779 THEN CONV_TAC COMPLEX_FIELD;
11780 SUBGOAL_THEN `(x:complex-z) pow (n-k) = (x-z) pow n / (x-z) pow k`
11781 SUBST1_TAC THENL [MATCH_MP_TAC COMPLEX_DIV_POW THEN
11782 ASM_SIMP_TAC[COMPLEX_SUB_0; ARITH_RULE `~(n:num < k) ==> k <= n`];
11783 SUBST1_TAC (COMPLEX_FIELD `(x - z) pow k *
11784 higher_complex_derivative n f z / Cx(&(FACT n)) *
11785 (x - z) pow n / (x - z) pow k =
11786 higher_complex_derivative n f z / Cx(&(FACT n)) * (x-z) pow k *
11787 (x - z) pow n / (x - z) pow k`) THEN MESON_TAC [ASSUME `~(x:complex = z)`;
11788 COMPLEX_DIV_LMUL;COMPLEX_SUB_0;COMPLEX_POW_EQ_0]]];
11789 MATCH_MP_TAC SERIES_COMPLEX_LMUL THEN SUBST1_TAC
11790 (MESON [COMPLEX_ADD_RID] `(g:complex->complex) x = g x + Cx(&0)`) THEN
11791 SUBGOAL_THEN `Cx(&0) = vsum (0.. (k-1))
11792 (\n. higher_complex_derivative n f z / Cx(&(FACT n)) * (x - z) pow (n - k))`
11793 SUBST1_TAC THENL [ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
11794 REWRITE_TAC [GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC VSUM_EQ_0 THEN
11795 REWRITE_TAC [IN_NUMSEG] THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
11796 ASM_SIMP_TAC[ARITH_RULE ` ~(k = 0) /\ n <= k - 1 ==> n < k`] THEN
11797 REWRITE_TAC[COMPLEX_VEC_0] THEN CONV_TAC COMPLEX_FIELD;
11798 MATCH_MP_TAC SUMS_OFFSET_REV THEN
11799 ASM_SIMP_TAC[ARITH_RULE `0 <= k /\ ~(k = 0) ==> 0 < k`;LE_0]]]];ALL_TAC] THEN
11800 ASSERT_TAC `?r. &0 < r /\ (!x:complex. dist (z,x) < r ==>
11801 ~((g:complex->complex) x = Cx(&0)))` THENL [
11802 MATCH_MP_TAC CONTINUOUS_ON_OPEN_AVOID THEN
11803 EXISTS_TAC `ball(z:complex, s)` THEN
11804 ASM_REWRITE_TAC[OPEN_BALL;CENTRE_IN_BALL]
11805 THEN MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
11806 MATCH_MP_TAC ANALYTIC_IMP_HOLOMORPHIC THEN MATCH_MP_TAC POWER_SERIES_ANALYTIC
11807 THEN EXISTS_TAC `\n. higher_complex_derivative (n+k) f z / Cx(&(FACT (n+k)))`
11808 THEN EXISTS_TAC `from 0` THEN REWRITE_TAC[] THEN GEN_TAC THEN DISCH_TAC
11809 THEN REWRITE_TAC[SERIES_FROM] THEN MATCH_MP_TAC LIM_TRANSFORM THEN
11810 EXISTS_TAC `(\n.vsum (k..(k+n))
11811 (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *(w' - z) pow (n-k)))`
11812 THEN CONJ_TAC THENL [SIMP_TAC [VSUM_OFFSET_0;ARITH_RULE
11813 `!k n :num.(k + n) - k = n`; ARITH_RULE `!k n:num. k <= k + n`;ADD_ASSOC;
11814 ARITH_RULE `!k n :num.(n + k) - k = n`] THEN
11815 SUBGOAL_THEN `(\x. vsum (0..x) (\i. higher_complex_derivative (i + k)
11816 f z / Cx(&(FACT (i + k))) * (w' - z) pow i)
11817 - vsum (0..x) (\n. higher_complex_derivative (n + k) f z
11818 / Cx(&(FACT (n + k))) * (w' - z) pow n)) = (\x. Cx(&0))`
11819 (fun th-> SIMP_TAC[th;COMPLEX_VEC_0;LIM_CONST]) THEN
11820 REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REWRITE_TAC[COMPLEX_SUB_0];
11821 SUBGOAL_THEN `(\n. vsum (k..k + n)
11822 (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *(w' - z) pow (n - k)))
11823 = (\n. vsum (k..n+k)(\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11824 (w' - z) pow (n - k)))` SUBST1_TAC THENL [
11825 REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REWRITE_TAC[ADD_SYM];
11826 MP_TAC (ISPECL [`(\n. vsum (k..n)
11827 (\n. higher_complex_derivative n f z / Cx(&(FACT n)) *
11828 (w' - z) pow (n - k)))`;`(g:complex->complex) w'`;`k:num`]
11829 SEQ_OFFSET) THEN ONCE_REWRITE_TAC[GSYM SERIES_FROM] THEN ASM_SIMP_TAC[]]];
11830 ALL_TAC] THEN EXISTS_TAC `min r s` THEN CONJ_TAC THENL
11831 [MP_TAC (CONJ (ASSUME `&0 < r`) (ASSUME `&0 < s`)) THEN REAL_ARITH_TAC;
11832 CONJ_TAC THENL [REWRITE_TAC[real_min] THEN COND_CASES_TAC
11833 THENL [MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,s)`
11834 THEN ASM_REWRITE_TAC[ball] THEN SET_TAC[ASSUME `r:real <= s`;REAL_LTE_TRANS];
11835 ASM_REWRITE_TAC[]];GEN_TAC THEN STRIP_TAC THEN
11836 SUBGOAL_THEN `(f:complex->complex) w' =
11837 (w' - z) pow k * (g:complex->complex) w'` SUBST1_TAC
11838 THENL [FIRST_ASSUM MATCH_MP_TAC THEN
11839 MP_TAC (ASSUME `w':complex IN ball (z,min r s)`) THEN REWRITE_TAC [real_min]
11840 THEN COND_CASES_TAC THENL [ASM_MESON_TAC[IN_BALL;REAL_LTE_TRANS];
11841 REWRITE_TAC[]];SIMP_TAC [COMPLEX_ENTIRE;DE_MORGAN_THM] THEN
11842 CONJ_TAC THENL [REWRITE_TAC[COMPLEX_POW_EQ_0;DE_MORGAN_THM]
11843 THEN DISJ1_TAC THEN ASM_REWRITE_TAC [COMPLEX_SUB_0];
11844 FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC (ASSUME `w':complex IN
11845 ball (z,min r s)`) THEN REWRITE_TAC [real_min] THEN COND_CASES_TAC
11846 THENL [REWRITE_TAC[IN_BALL];
11847 ASM_MESON_TAC[REAL_NOT_LE;IN_BALL;REAL_LT_TRANS]]]]]]]);;
11849 (* ------------------------------------------------------------------------- *)
11850 (* Analytic continuation. *)
11851 (* ------------------------------------------------------------------------- *)
11853 let ANALYTIC_CONTINUATION = prove
11855 open a /\ connected a /\ f holomorphic_on a /\ u SUBSET a /\ z IN a /\
11856 z limit_point_of u /\ (!w. w IN u ==> f w = Cx(&0))
11857 ==> (!w. w IN a ==> f w = Cx(&0))`,
11858 REPEAT GEN_TAC THEN STRIP_TAC THEN
11859 REWRITE_TAC[TAUT ` (p ==> q) <=> ~( p /\ (~ q))`;GSYM NOT_EXISTS_THM]
11860 THEN STRIP_TAC THEN SUBGOAL_THEN `(f:complex->complex) z = Cx(&0)`
11861 ASSUME_TAC THENL [STRIP_ASSUME_TAC(MESON [OPEN_CONTAINS_CBALL;
11862 ASSUME `open (a:complex->bool)`; ASSUME `z:complex IN a`]
11863 `?e. &0 < e /\ cball (z:complex,e) SUBSET a`) THEN ABBREV_TAC
11864 `s = cball(z:complex,e) INTER (u:complex->bool)` THEN
11865 ASSERT_TAC `f:complex->complex continuous_on closure s /\
11866 (!x:complex. x IN s ==> f x = Cx(&0)) /\
11867 z:complex IN closure s`
11868 THENL [CONJ_TAC THENL [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
11869 EXISTS_TAC `a:complex->bool` THEN
11870 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN MATCH_MP_TAC
11871 SUBSET_TRANS THEN EXISTS_TAC `cball(z:complex,e)` THEN
11872 ASM_MESON_TAC[CLOSED_CBALL;INTER_SUBSET;CLOSURE_MINIMAL];
11873 CONJ_TAC THENL [ASM_MESON_TAC[INTER_SUBSET;SUBSET];
11874 ASM_SIMP_TAC[closure;IN_UNION] THEN DISJ2_TAC THEN SUBGOAL_THEN
11875 `z:complex limit_point_of s` (fun thm-> SET_TAC[thm]) THEN
11876 REWRITE_TAC [LIMPT_APPROACHABLE] THEN GEN_TAC THEN DISCH_TAC THEN
11877 ASSERT_TAC `?x:complex. x IN u /\ ~(x = z) /\ dist (x , z) < min e' e`
11878 THENL [MP_TAC (ISPECL [`z:complex`;`u:complex->bool`] LIMPT_APPROACHABLE)
11879 THEN ASM_SIMP_TAC[REAL_LT_MIN];EXISTS_TAC `x:complex` THEN ASM_REWRITE_TAC[]
11880 THEN CONJ_TAC THENL
11881 [REWRITE_TAC [GSYM (ASSUME `cball (z:complex,e) INTER u = s`);IN_INTER;
11882 ASSUME `x:complex IN u`;IN_CBALL] THEN ASM_MESON_TAC[REAL_LT_IMP_LE;
11883 REAL_LT_MIN;DIST_SYM]; ASM_MESON_TAC [REAL_LT_MIN]]]]];
11884 ASM_MESON_TAC [CONTINUOUS_CONSTANT_ON_CLOSURE]];
11885 MP_TAC(SPECL [`f:complex->complex`;`a:complex->bool`;`z:complex`;`w:complex`]
11886 ISOLATED_ZEROS) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
11887 SUBGOAL_THEN `?x:complex. x IN ball(z,r) /\ x IN u /\ ~(x=z) /\
11888 (f:complex->complex) x = Cx(&0)`(fun thm->ASM_MESON_TAC[thm]) THEN
11889 MP_TAC (ISPECL [`z:complex`;`u:complex->bool`] LIMPT_APPROACHABLE) THEN
11890 ASM_REWRITE_TAC [] THEN DISCH_TAC THEN POP_ASSUM (MP_TAC o SPEC `r:real`)
11891 THEN ASM_REWRITE_TAC [] THEN STRIP_TAC THEN EXISTS_TAC `x':complex`
11892 THEN ASM_MESON_TAC[IN_BALL;DIST_SYM]]);;
11894 (* ------------------------------------------------------------------------- *)
11895 (* Open mapping theorem. *)
11896 (* ------------------------------------------------------------------------- *)
11898 let OPEN_MAPPING_THM = prove
11900 open a /\ connected a /\ f holomorphic_on a /\
11901 ~(?c:complex. !z:complex. z IN a ==> f z = c)
11902 ==> (!u. open u /\ u SUBSET a ==> open(IMAGE f u))`,
11903 let LEMMA_ZERO = prove
11904 (`!f z r. f continuous_on cball(z,r) /\ f holomorphic_on ball(z,r) /\
11905 &0 < r /\ (!w. norm(z-w) =r ==> norm(f z) < norm(f w))
11906 ==> (?w. w IN ball(z,r) /\ f w = Cx(&0))`,
11907 REPEAT STRIP_TAC THEN SUBGOAL_THEN ` ((!x:complex. x IN ball(z,r) ==>
11908 ~((f:complex->complex) x = Cx(&0))) ==> F ) ==> ( ?w:complex. w IN ball(z,r)
11909 /\ f w = Cx(&0))` MATCH_MP_TAC THENL [MESON_TAC[];
11910 STRIP_TAC THEN SUBGOAL_THEN `&0 < norm ((f:complex->complex) z)` ASSUME_TAC
11911 THENL [ASM_SIMP_TAC[COMPLEX_NORM_NZ; CENTRE_IN_BALL; SPEC `z:complex`
11912 (ASSUME`!x:complex. x IN ball(z,r) ==> ~((f:complex->complex) x = Cx(&0))`)];
11913 ALL_TAC] THEN SUBGOAL_THEN
11914 `(!x:complex. x IN cball(z,r) ==> ~((f:complex->complex) x = Cx(&0)))`
11915 ASSUME_TAC THENL [GEN_TAC THEN REWRITE_TAC [IN_CBALL;dist]
11916 THEN REWRITE_TAC[REAL_ARITH `a <= b <=> a < b \/ a = b`] THEN
11917 REWRITE_TAC [TAUT `((p \/ q) ==> r ) <=> ((p ==> r ) /\ (q ==> r))`] THEN
11918 CONJ_TAC THENL [ASM_MESON_TAC[IN_BALL;dist];
11919 DISCH_TAC THEN REWRITE_TAC[GSYM COMPLEX_NORM_ZERO] THEN MATCH_MP_TAC
11920 REAL_LT_IMP_NZ THEN MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC
11921 `norm ((f:complex->complex) z)` THEN
11922 ASM_SIMP_TAC [SPEC `z':complex` (ASSUME `!w:complex. norm (w - z) = r
11923 ==> norm ((f:complex->complex) z) < norm (f w)`)]];
11924 ALL_TAC] THEN SUBGOAL_THEN `~(frontier(cball(z:complex,r))={})` ASSUME_TAC
11925 THENL [REWRITE_TAC[FRONTIER_CBALL;sphere;dist] THEN SUBGOAL_THEN `?x:complex.
11926 norm(z-x) = r` (fun th-> SET_TAC [MEMBER_NOT_EMPTY;th]) THEN EXISTS_TAC
11927 `z + Cx r` THEN ASM_SIMP_TAC[COMPLEX_ADD_SUB2;NORM_NEG;COMPLEX_NORM_CX;
11928 REAL_ABS_REFL;REAL_LT_IMP_LE];ALL_TAC] THEN
11929 ABBREV_TAC `g = \z. inv ((f:complex->complex) z)` THEN ASSERT_TAC
11930 `(g:complex->complex) continuous_on cball(z,r) /\ g holomorphic_on ball(z,r)`
11931 THENL [CONJ_TAC THENL [EXPAND_TAC "g" THEN
11932 REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN GEN_TAC THEN DISCH_TAC
11933 THEN MATCH_MP_TAC CONTINUOUS_COMPLEX_INV_WITHIN THEN ASM_MESON_TAC
11934 [CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN];EXPAND_TAC "g" THEN MATCH_MP_TAC
11935 HOLOMORPHIC_ON_INV THEN ASM_REWRITE_TAC[]];ALL_TAC] THEN
11936 SUBGOAL_THEN `?w:complex. w IN frontier(cball(z,r)) /\
11937 (!x:complex. x IN frontier(cball(z,r)) ==>
11938 norm ((f:complex->complex) w) <= norm (f x))`
11939 STRIP_ASSUME_TAC THENL [MATCH_MP_TAC CONTINUOUS_ATTAINS_INF
11940 THEN ASM_SIMP_TAC[COMPACT_FRONTIER;COMPACT_CBALL;CBALL_EQ_EMPTY;
11941 REAL_ARITH `!r:real. &0 < r ==> ~(r < &0)` ] THEN
11942 SUBGOAL_THEN `lift o (\x. norm ((f:complex->complex) x)) =
11943 (lift o norm) o (\x. f x) ` SUBST1_TAC THENL
11944 [REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE
11945 THEN CONJ_TAC THENL [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC
11946 `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX] THEN
11947 ASM_SIMP_TAC[SUBSET_TRANS;CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];
11948 ASM_MESON_TAC [CONTINUOUS_ON_LIFT_NORM; HOLOMORPHIC_ON_SUBSET;
11949 HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;SUBSET_TRANS;CLOSED_CBALL;
11950 FRONTIER_SUBSET_CLOSED]]];ALL_TAC] THEN
11951 SUBGOAL_THEN `?w:complex. norm (z-w) = r /\
11952 norm ((f:complex->complex) w) <= norm (f z)`
11953 (fun thm -> ASM_MESON_TAC[thm;REAL_NOT_LE])
11954 THEN EXISTS_TAC `w:complex` THEN CONJ_TAC
11955 THENL [MP_TAC (ASSUME `w:complex IN frontier (cball (z,r))`) THEN
11956 REWRITE_TAC[FRONTIER_CBALL;sphere;dist] THEN SET_TAC[];ALL_TAC] THEN
11957 SUBGOAL_THEN `&0 < norm ((f:complex->complex) w)` ASSUME_TAC THENL
11958 [REWRITE_TAC[NORM_POS_LT;COMPLEX_VEC_0] THEN MATCH_MP_TAC (ASSUME `!x.
11959 x:complex IN cball (z,r) ==> ~(f x = Cx(&0))`) THEN MATCH_MP_TAC
11960 (SET_RULE `!x:complex u s. x IN u /\ u SUBSET s ==> x IN s `) THEN
11961 EXISTS_TAC `frontier(cball(z:complex,r))` THEN
11962 ASM_SIMP_TAC[CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];ALL_TAC] THEN
11963 SUBGOAL_THEN `inv (norm ((f:complex-> complex) w)) = &1/ (norm (f w))`
11964 ASSUME_TAC THENL [MATCH_MP_TAC REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC
11965 REAL_DIV_LMUL THEN ASM_REWRITE_TAC[COMPLEX_NORM_ZERO;GSYM COMPLEX_NORM_NZ];
11966 ASSERT_TAC `?x:complex. x IN frontier(cball(z,r)) /\ (!y. y IN
11967 frontier(cball(z,r)) ==> norm ((g:complex->complex) y) <= norm (g x))`
11968 THENL [MATCH_MP_TAC CONTINUOUS_ATTAINS_SUP THEN
11969 ASM_SIMP_TAC[COMPACT_FRONTIER;
11970 COMPACT_CBALL;CBALL_EQ_EMPTY; REAL_ARITH `!r:real. &0 < r ==> ~(r < &0)`]
11971 THEN SUBGOAL_THEN `lift o (\x. norm ((g:complex->complex) x)) =
11972 (lift o norm) o (\x. g x) ` SUBST1_TAC
11973 THENL [REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
11974 CONJ_TAC THENL [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
11975 EXISTS_TAC `cball(z:complex,r)` THEN ASM_REWRITE_TAC[ETA_AX]
11976 THEN ASM_SIMP_TAC[SUBSET_TRANS;CLOSED_CBALL;
11977 FRONTIER_SUBSET_CLOSED]; ASM_MESON_TAC [CONTINUOUS_ON_LIFT_NORM;
11978 HOLOMORPHIC_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;SUBSET_TRANS;
11979 CLOSED_CBALL; FRONTIER_SUBSET_CLOSED]]];ALL_TAC] THEN SUBGOAL_THEN
11980 `&0 < norm ((f:complex->complex) x)` ASSUME_TAC THENL
11981 [REWRITE_TAC[NORM_POS_LT;COMPLEX_VEC_0] THEN MATCH_MP_TAC
11982 (ASSUME `!x. x:complex IN cball (z,r) ==> ~(f x = Cx(&0))`)
11983 THEN MATCH_MP_TAC (SET_RULE `!x:complex u s. x IN u /\ u SUBSET s
11984 ==> x IN s `) THEN EXISTS_TAC `frontier(cball(z:complex,r))`
11985 THEN ASM_SIMP_TAC[CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];
11986 ABBREV_TAC `B = norm ((g:complex->complex) x)`
11987 THEN SUBGOAL_THEN `norm (higher_complex_derivative 0 g z) <=
11988 (&(FACT 0)) * B / (r pow 0) `
11989 MP_TAC THENL[MATCH_MP_TAC CAUCHY_INEQUALITY THEN
11990 ASM_REWRITE_TAC[] THEN MP_TAC
11991 (ASSUME `!y:complex. y IN frontier (cball (z,r)) ==>
11992 norm ((g:complex ->complex) y) <= B`)
11993 THEN SIMP_TAC [FRONTIER_CBALL;sphere;dist] THEN SET_TAC[];
11994 REWRITE_TAC [higher_complex_derivative;FACT;real_pow;
11995 REAL_MUL_LID;REAL_DIV_1] THEN DISCH_TAC THEN SUBGOAL_THEN
11996 `inv (norm ((f:complex->complex) z)) <=
11997 inv (norm (f w)) ==> norm (f w) <= norm (f z)` MATCH_MP_TAC
11998 THENL [SUBGOAL_THEN `inv (norm ((f:complex-> complex) z)) =
11999 &1/ (norm (f z))` SUBST1_TAC
12000 THENL [MATCH_MP_TAC REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC REAL_DIV_LMUL THEN
12001 ASM_SIMP_TAC[REAL_ARITH `&0 < norm ((f:complex->complex) z) ==>
12002 ~(norm (f z) = &0) `]; ASM_REWRITE_TAC[] THEN DISCH_TAC THEN SUBST1_TAC
12003 (REAL_ARITH `norm ((f:complex->complex) w)= &1 * norm (f w)`) THEN
12004 SUBST1_TAC(REAL_ARITH `norm ((f:complex->complex) z)=
12005 &1 * norm (f z)`) THEN POP_ASSUM
12006 MP_TAC THEN MATCH_MP_TAC (TAUT `(p <=> q ) ==> ( p ==> q)`)
12007 THEN MATCH_MP_TAC RAT_LEMMA4 THEN ASM_REWRITE_TAC[]];
12008 REWRITE_TAC[GSYM COMPLEX_NORM_INV] THEN
12009 SUBGOAL_THEN `inv ((f:complex->complex) z) = g z /\ inv (f w) = g w`
12010 (fun thm -> REWRITE_TAC[thm])
12011 THENL [ASM_MESON_TAC[];MATCH_MP_TAC (REAL_ARITH
12012 `!x y z:real. x <= y /\ y = z ==> x <= z`) THEN EXISTS_TAC `B:real` THEN
12013 ASM_REWRITE_TAC[GSYM REAL_LE_ANTISYM] THEN CONJ_TAC THENL [EXPAND_TAC "B"
12014 THEN REWRITE_TAC[SYM (ASSUME`(\z. inv ((f:complex->complex) z)) =
12015 g`);COMPLEX_NORM_INV] THEN SUBGOAL_THEN `inv (norm ((f:complex->complex) x))
12016 = &1 / norm (f x)` (fun thm -> REWRITE_TAC[thm]) THENL [MATCH_MP_TAC
12017 REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC REAL_DIV_LMUL THEN
12018 ASM_SIMP_TAC[REAL_LT_IMP_NZ]; ASM_REWRITE_TAC[] THEN
12019 MP_TAC (SPEC `x:complex`(ASSUME`!x:complex. x IN frontier (cball (z,r))
12020 ==> norm ((f:complex->complex) w) <= norm (f x)`))
12021 THEN REWRITE_TAC [ASSUME`x:complex IN frontier
12022 (cball (z,r))`] THEN SUBST1_TAC
12023 (REAL_ARITH `norm ((f:complex->complex) w)= &1* norm (f w)`) THEN
12024 SUBST1_TAC (REAL_ARITH `norm ((f:complex->complex) x)= &1 * norm (f x)`)
12025 THEN DISCH_TAC THEN REWRITE_TAC[REAL_MUL_LID] THEN POP_ASSUM
12026 MP_TAC THEN MATCH_MP_TAC (TAUT `(q <=> p ) ==> ( p ==> q)`) THEN MATCH_MP_TAC
12027 (RAT_LEMMA4) THEN ASM_REWRITE_TAC[]];ASM_MESON_TAC[]]]]]]]]) in
12028 REPEAT STRIP_TAC THEN ASSUME_TAC (MESON [HOLOMORPHIC_ON_SUBSET;
12029 ASSUME `(u:complex->bool) SUBSET a`;ASSUME `f holomorphic_on a`]
12030 `f holomorphic_on u`) THEN ASM_CASES_TAC `(u:complex->bool)={}` THENL [
12031 ASM_MESON_TAC[SUBSET_EMPTY;IMAGE_EQ_EMPTY;OPEN_EMPTY];ALL_TAC] THEN
12032 SUBGOAL_THEN `!f u. ~(u={}) /\ open u /\ connected u /\
12033 f holomorphic_on u /\
12034 ~(?c:complex. !z:complex. z IN u ==> f z=c) ==>
12035 open (IMAGE f u)` ASSUME_TAC
12036 THENL [REPEAT STRIP_TAC THEN REWRITE_TAC[OPEN_CONTAINS_BALL;IN_IMAGE]
12037 THEN GEN_TAC THEN STRIP_TAC THEN
12038 ASSERT_TAC `(\z:complex.(f':complex->complex)z - f' x') holomorphic_on
12039 (u':complex->bool) /\ (\z:complex. f' z - f' x')x' = Cx(&0)` THENL [
12040 ASM_SIMP_TAC[HOLOMORPHIC_ON_CONST;HOLOMORPHIC_ON_SUB;
12041 BETA_THM;COMPLEX_SUB_REFL];ALL_TAC] THEN
12042 ASSERT_TAC `?s:real. &0 < s /\ ball(x',s) SUBSET u' /\
12043 (!z:complex. z IN ball(x',s) /\ ~(z = x') ==>
12044 ~((\z:complex.(f':complex->complex)z - f' x') z = Cx(&0)))` THENL [
12045 MATCH_MP_TAC ISOLATED_ZEROS THEN ASM_REWRITE_TAC[] THEN
12046 ASM_MESON_TAC[COMPLEX_SUB_0];
12047 ASSERT_TAC `?r. &0 < r /\ cball(x':complex,r) SUBSET ball(x',s)` THENL[
12048 EXISTS_TAC `s:real / &2` THEN ASM_SIMP_TAC [REAL_ARITH `&0 < s
12049 ==> &0 < s/ &2`;SUBSET;IN_CBALL;IN_BALL] THEN MP_TAC (ASSUME `&0 < s`)
12050 THEN REAL_ARITH_TAC;ALL_TAC] THEN
12051 ASSERT_TAC `cball(x',r) SUBSET u' /\
12052 (!z:complex. z IN cball(x',r) /\
12053 ~(z=x')==> ~((\z:complex.(f':complex->complex)z - f' x') z = Cx(&0)))`
12054 THENL [CONJ_TAC THENL [ASM_MESON_TAC[SUBSET_TRANS];
12055 MESON_TAC[ASSUME `!z:complex. z IN ball (x',s) /\ ~(z = x')
12056 ==> ~((\z. (f':complex->complex) z - f' x') z = Cx(&0))`;
12057 ASSUME `cball (x':complex,r) SUBSET ball (x',s)`;SUBSET]];ALL_TAC]
12058 THEN SUBGOAL_THEN `frontier (cball (x':complex,r)) SUBSET u'` ASSUME_TAC
12059 THENL [MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `cball(x':complex,r)`
12060 THEN ASM_MESON_TAC[CLOSED_CBALL;FRONTIER_SUBSET_CLOSED];ALL_TAC] THEN
12061 ASSERT_TAC `?w. w IN frontier(cball(x':complex,r)) /\
12062 (!z. z IN frontier(cball(x',r)) ==>
12063 norm ((f':complex->complex)w - f' x') <= norm(f' z - f' x'))`
12064 THENL [MATCH_MP_TAC CONTINUOUS_ATTAINS_INF THEN
12065 ASM_SIMP_TAC[COMPACT_FRONTIER;COMPACT_CBALL;CBALL_EQ_EMPTY;
12066 REAL_ARITH `!r:real. &0 < r ==> ~(r < &0)` ] THEN
12067 CONJ_TAC THENL [REWRITE_TAC[REWRITE_RULE[sphere] FRONTIER_CBALL;dist] THEN
12068 SUBGOAL_THEN `?x:complex. norm(x'-x) = r` (fun th-> SET_TAC
12069 [MEMBER_NOT_EMPTY;th]) THEN EXISTS_TAC `x' + Cx r` THEN
12070 ASM_SIMP_TAC[COMPLEX_ADD_SUB2;NORM_NEG;COMPLEX_NORM_CX;
12071 REAL_ABS_REFL;REAL_LT_IMP_LE];
12072 SUBGOAL_THEN `lift o (\z. norm ((f':complex->complex) z - f' x')) =
12073 (lift o norm) o (\z. f' z - f' x') ` SUBST1_TAC THENL [
12074 REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
12075 ASM_MESON_TAC [CONTINUOUS_ON_LIFT_NORM; HOLOMORPHIC_ON_SUBSET;
12076 HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]]];ALL_TAC] THEN
12077 ABBREV_TAC `e = (norm ((f':complex->complex) w - f' x'))*(&1/ &3)`
12078 THEN SUBGOAL_THEN `&0<e` ASSUME_TAC THENL [
12079 EXPAND_TAC "e" THEN MATCH_MP_TAC REAL_LT_MUL THEN
12080 REWRITE_TAC [REAL_ARITH `&0 < &1 / &3`; COMPLEX_NORM_NZ] THEN
12081 SUBST1_TAC (MESON [BETA_THM] `(f':complex->complex) w - f' x' =
12082 (\w. f' w - f' x')w `) THEN FIRST_ASSUM MATCH_MP_TAC THEN
12083 CONJ_TAC THENL[MESON_TAC[ASSUME `w:complex IN frontier (cball (x',r))`;
12084 FRONTIER_SUBSET_CLOSED; CLOSED_CBALL;SET_RULE `!x:complex s t. x IN s /\
12085 s SUBSET t ==> x IN t` ];ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0] THEN
12086 REWRITE_TAC[GSYM COMPLEX_NORM_ZERO] THEN MATCH_MP_TAC REAL_LT_IMP_NZ
12087 THEN MATCH_MP_TAC (REAL_ARITH `&0 < r /\ r = norm (w:complex - x') ==>
12088 &0 < norm (w - x')`) THEN ASM_REWRITE_TAC[] THEN
12089 MP_TAC (ASSUME `w:complex IN frontier (cball (x',r))`) THEN
12090 SIMP_TAC[FRONTIER_CBALL; sphere; dist; IN_ELIM_THM; NORM_SUB]];
12092 THEN EXISTS_TAC `e:real` THEN REWRITE_TAC[ASSUME `&0<e`] THEN
12093 REWRITE_TAC[SUBSET;IN_IMAGE] THEN GEN_TAC THEN DISCH_TAC THEN
12094 ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0] THEN
12095 SUBGOAL_THEN `(?x:complex. x IN ball(x',r) /\
12096 x'' - (f':complex->complex) x = Cx(&0)) ==>
12097 ?x. x'' - f' x = Cx(&0) /\ x IN u'` MATCH_MP_TAC THENL [
12098 STRIP_TAC THEN EXISTS_TAC `x''':complex` THEN
12099 ASM_REWRITE_TAC[] THEN
12100 MATCH_MP_TAC (SET_RULE `!x:complex u s. x IN u /\ u SUBSET s ==> x IN s`)
12101 THEN EXISTS_TAC `ball(x':complex,r)` THEN ASM_REWRITE_TAC[]
12102 THEN ASM_MESON_TAC[BALL_SUBSET_CBALL;SUBSET_TRANS];
12103 MATCH_MP_TAC LEMMA_ZERO THEN CONJ_TAC THENL
12104 [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
12105 MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN ASM_MESON_TAC
12106 [HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_SUBSET];
12107 CONJ_TAC THENL [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN ASM_MESON_TAC[
12108 HOLOMORPHIC_ON_CONST;HOLOMORPHIC_ON_SUBSET;BALL_SUBSET_CBALL];
12109 ASM_REWRITE_TAC[] THEN X_GEN_TAC `w':complex` THEN DISCH_TAC THEN
12110 MATCH_MP_TAC REAL_LTE_TRANS THEN
12111 EXISTS_TAC `e:real` THEN CONJ_TAC THENL
12112 [MESON_TAC [NORM_SUB;dist;IN_BALL; ASSUME`x'':complex IN ball (x,e)`;
12113 ASSUME `x:complex = (f':complex->complex) x'`];
12114 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2*e` THEN
12115 ASM_SIMP_TAC[REAL_ARITH `&0<e ==> e <= &2 * e`;NORM_SUB] THEN
12116 SUBST1_TAC (COMPLEX_RING `(f':complex->complex) w' - x'' =
12117 f' w' -x + x - x''`) THEN
12118 MATCH_MP_TAC REAL_LE_TRANS THEN
12119 EXISTS_TAC `norm ((f':complex->complex) w' - x) - norm (x-x'')` THEN
12120 CONJ_TAC THENL [SUBST1_TAC (REAL_ARITH `&2 * e = &3 *e - e`) THEN
12121 MATCH_MP_TAC (REAL_ARITH `!x y z w:real. x<=y /\ z<w ==> x-w <= y-z`)
12122 THEN CONJ_TAC THENL [EXPAND_TAC "e" THEN
12123 ASM_REWRITE_TAC[REAL_ARITH `&3 * norm ((f':complex->complex) w - f' x') *
12124 &1 / &3 = norm (f' w - f' x')`] THEN FIRST_ASSUM MATCH_MP_TAC THEN
12125 POP_ASSUM MP_TAC THEN
12126 REWRITE_TAC[FRONTIER_CBALL; sphere; NORM_SUB; IN_ELIM_THM; dist];
12127 UNDISCH_TAC `x'':complex IN ball (x,e)` THEN
12128 REWRITE_TAC [IN_BALL;dist;ASSUME`x:complex = (f':complex->complex) x'`]];
12129 MATCH_MP_TAC (REAL_ARITH `!x y z:real. x<=y+z ==> x-z<=y`) THEN
12130 REWRITE_TAC[COMPLEX_NORM_TRIANGLE_SUB]]]]]]];ALL_TAC] THEN
12131 ASM_CASES_TAC `connected (u:complex->bool)` THENL [
12132 SUBGOAL_THEN `~(?c:complex. !z:complex. z IN u ==> f z=c)`
12133 (fun th-> ASM_MESON_TAC [th]) THEN
12134 ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0]
12135 THEN STRIP_TAC THEN ABBREV_TAC `w:complex= CHOICE u` THEN
12136 ASSUME_TAC (MESON [CHOICE_DEF;GSYM (ASSUME `CHOICE u = w:complex`);
12137 ASSUME `~(u:complex->bool = {})`] `w:complex IN u`) THEN
12138 ASSERT_TAC `w:complex limit_point_of u` THENL
12139 [MATCH_MP_TAC INTERIOR_LIMIT_POINT THEN ASM_SIMP_TAC [INTERIOR_OPEN];
12140 SUBGOAL_THEN `(\z. (f:complex->complex) z - c) holomorphic_on a` ASSUME_TAC
12141 THENL [ASM_SIMP_TAC [HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST];
12142 ASSUME_TAC (MESON [ASSUME `w:complex IN u`;ASSUME `u:complex->bool SUBSET a`;
12143 SET_RULE `w:complex IN u /\ u SUBSET a ==> w IN a`] `w:complex IN a`) THEN
12144 MP_TAC(SPECL [`\z:complex.(f:complex->complex)z - c`;
12145 `a:complex->bool`; `u:complex->bool`; `w:complex`]
12146 ANALYTIC_CONTINUATION) THEN
12147 ASM_REWRITE_TAC [] THEN MP_TAC (ASSUME `~(?c:complex. !z. z IN a ==>
12148 (f:complex->complex) z = c)`) THEN ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0;
12149 GSYM COMPLEX_SUB_RZERO] THEN ONCE_REWRITE_TAC [COMPLEX_SUB_RZERO] THEN
12150 MESON_TAC[]]];ALL_TAC] THEN SUBST1_TAC (MESON [UNIONS_COMPONENTS]
12151 `u:complex->bool = UNIONS ( components u)`) THEN
12152 REWRITE_TAC [IMAGE_UNIONS] THEN MATCH_MP_TAC OPEN_UNIONS THEN
12153 REWRITE_TAC[IN_IMAGE] THEN GEN_TAC THEN STRIP_TAC THEN
12154 FIRST_X_ASSUM SUBST1_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
12155 STRIP_ASSUME_TAC(MESON [IN_COMPONENTS;
12156 ASSUME `(x:complex->bool) IN components u`]
12157 `?w:complex. w IN u /\ x = connected_component u w`) THEN
12158 ASM_SIMP_TAC[CONNECTED_COMPONENT_EQ_EMPTY;OPEN_CONNECTED_COMPONENT;
12159 CONNECTED_CONNECTED_COMPONENT] THEN CONJ_TAC THENL
12160 [ASM_MESON_TAC [CONNECTED_COMPONENT_SUBSET;
12161 HOLOMORPHIC_ON_SUBSET]; ONCE_REWRITE_TAC[GSYM COMPLEX_SUB_0] THEN
12162 STRIP_TAC THEN ABBREV_TAC `y = CHOICE (x:complex->bool)` THEN
12163 SUBGOAL_THEN `y:complex IN x` ASSUME_TAC THENL
12164 [EXPAND_TAC "y" THEN MATCH_MP_TAC CHOICE_DEF THEN
12165 ASM_MESON_TAC [CONNECTED_COMPONENT_EQ_EMPTY];
12166 ASSUME_TAC (MESON [OPEN_COMPONENTS;ASSUME `open (u:complex->bool)`;
12167 ASSUME` x:complex->bool IN components u`] `open (x:complex->bool)`) THEN
12168 ASSERT_TAC `y:complex limit_point_of x` THENL [
12169 MATCH_MP_TAC INTERIOR_LIMIT_POINT THEN ASSUME_TAC
12170 (MESON [OPEN_COMPONENTS;ASSUME `open (u:complex->bool)`;
12171 ASSUME` x:complex->bool IN components u`] `open (x:complex->bool)`) THEN
12172 SIMP_TAC [INTERIOR_OPEN;ASSUME `open (x:complex->bool)`;
12173 ASSUME `y:complex IN x`]; SUBGOAL_THEN `(\z. (f:complex->complex) z - c)
12174 holomorphic_on a` ASSUME_TAC THENL [
12175 ASM_SIMP_TAC [HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST];
12176 SUBGOAL_THEN `x:complex->bool SUBSET a` ASSUME_TAC THENL [
12177 MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `u:complex->bool` THEN
12178 ASM_REWRITE_TAC[CONNECTED_COMPONENT_SUBSET];
12179 SUBGOAL_THEN `y:complex IN a` ASSUME_TAC THENL [
12180 MATCH_MP_TAC (SET_RULE `y:complex IN x /\ x SUBSET a ==> y IN a`)
12181 THEN ASM_REWRITE_TAC[]; MP_TAC(SPECL [`\z:complex.(f:complex->complex)z - c`;
12182 `a:complex->bool`; `x:complex->bool`; `y:complex`] ANALYTIC_CONTINUATION)
12183 THEN ASM_REWRITE_TAC [] THEN MP_TAC (ASSUME `~(?c:complex. !z. z IN a ==>
12184 (f:complex->complex) z = c)`) THEN
12185 ONCE_REWRITE_TAC [GSYM COMPLEX_SUB_0;GSYM COMPLEX_SUB_RZERO] THEN
12186 ONCE_REWRITE_TAC [COMPLEX_SUB_RZERO] THEN MESON_TAC[]]]]]]]);;
12188 (* ------------------------------------------------------------------------- *)
12189 (* Maximum modulus principle. *)
12190 (* ------------------------------------------------------------------------- *)
12192 let MAXIMUM_MODULUS_PRINCIPLE = prove
12194 open a /\ connected a /\ f holomorphic_on a /\
12195 open u /\ u SUBSET a /\ w IN u /\
12196 (!z. z IN u ==> norm(f z) <= norm(f w))
12197 ==> (?c. !z. z IN a ==> f z = c)`,
12198 REPEAT STRIP_TAC THEN SUBGOAL_THEN
12199 `~(open (IMAGE (f:complex->complex) u))`
12200 (fun th -> ASM_MESON_TAC[th; OPEN_MAPPING_THM]) THEN
12201 REWRITE_TAC[OPEN_CONTAINS_BALL;NOT_FORALL_THM] THEN
12202 EXISTS_TAC `(f:complex->complex) w` THEN
12203 MATCH_MP_TAC (TAUT `!p q. (p /\ ~ q) ==> ~(p ==> q)`) THEN CONJ_TAC THENL
12204 [ASM_MESON_TAC[IN_IMAGE]; ALL_TAC] THEN
12205 REWRITE_TAC[NOT_EXISTS_THM;DE_MORGAN_THM;SUBSET] THEN
12206 GEN_TAC THEN ASM_CASES_TAC `~(&0 < e)` THENL
12207 [ASM_REWRITE_TAC[]; ALL_TAC] THEN POP_ASSUM MP_TAC THEN REWRITE_TAC[] THEN
12208 DISCH_TAC THEN DISJ2_TAC THEN REWRITE_TAC[NOT_FORALL_THM] THEN
12209 EXISTS_TAC `if &0 < Re((f:complex->complex) w)
12210 then f w + Cx(e / &2)
12211 else f w - Cx(e/ &2) ` THEN
12212 ABBREV_TAC `x = if &0<Re((f:complex->complex) w)
12213 then f w + Cx(e / &2)
12214 else f w - Cx(e / &2)` THEN
12215 MATCH_MP_TAC (TAUT `!p q. (p /\ ~ q) ==> ~(p ==> q)`) THEN CONJ_TAC THENL
12216 [REWRITE_TAC[IN_BALL;dist] THEN
12217 MATCH_MP_TAC (REAL_ARITH `!x y z:real. x = y /\ y < z ==> x < z `) THEN
12218 EXISTS_TAC `e / &2` THEN EXPAND_TAC "x" THEN COND_CASES_TAC THENL
12219 [ASM_SIMP_TAC [NORM_NEG;COMPLEX_ADD_SUB2;REAL_ARITH `&0 < e ==> e / &2 <e`;
12220 COMPLEX_NORM_CX;REAL_ABS_REFL;
12221 REAL_ARITH `&0 < e ==> &0 <= e / &2`];
12222 ASM_SIMP_TAC [COMPLEX_SUB_SUB2; REAL_ARITH `&0 < e ==> e / &2 <e`;
12223 COMPLEX_NORM_CX; REAL_ABS_REFL;
12224 REAL_ARITH `&0 < e ==> &0 <= e / &2`]]; ALL_TAC] THEN
12225 REWRITE_TAC[IN_IMAGE; NOT_EXISTS_THM; DE_MORGAN_THM] THEN
12226 GEN_TAC THEN ASM_CASES_TAC `~(x':complex IN u)` THENL
12227 [ASM_REWRITE_TAC[]; ALL_TAC] THEN DISJ1_TAC THEN POP_ASSUM MP_TAC THEN
12228 REWRITE_TAC[] THEN DISCH_TAC THEN
12229 MATCH_MP_TAC (NORM_ARITH `!x y:complex. ~(norm x=norm y) ==> ~(x=y)`) THEN
12230 REWRITE_TAC[REAL_NOT_EQ] THEN DISJ2_TAC THEN
12231 MATCH_MP_TAC REAL_LET_TRANS THEN
12232 EXISTS_TAC `norm ((f:complex->complex) w)` THEN ASM_SIMP_TAC[] THEN
12233 EXPAND_TAC "x" THEN COND_CASES_TAC THEN
12234 REWRITE_TAC [complex_norm;RE_ADD;IM_ADD; IM_CX;RE_CX;REAL_ADD_RID] THENL
12235 [MATCH_MP_TAC SQRT_MONO_LT THEN
12236 MATCH_MP_TAC (REAL_ARITH `!x:real y z. x < y ==> x + z < y + z`) THEN
12237 REWRITE_TAC[GSYM REAL_LT_SQUARE_ABS] THEN
12238 ASM_SIMP_TAC [REAL_ARITH `!x y. &0 < x /\ &0 < y
12239 ==> abs (x+y) = abs x + abs y`;
12240 REAL_ARITH `!x:real. &0 < x ==> &0 < x / &2`] THEN
12241 ASM_REAL_ARITH_TAC; ALL_TAC] THEN
12242 REWRITE_TAC [complex_norm;RE_SUB;IM_SUB; IM_CX;RE_CX;REAL_SUB_RZERO] THEN
12243 MATCH_MP_TAC SQRT_MONO_LT THEN
12244 MATCH_MP_TAC (REAL_ARITH `!x:real y z. x < y ==> x + z < y + z`) THEN
12245 REWRITE_TAC[GSYM REAL_LT_SQUARE_ABS] THEN POP_ASSUM MP_TAC THEN
12246 REWRITE_TAC[REAL_NOT_LT] THEN DISCH_TAC THEN
12247 ASM_SIMP_TAC [REAL_ARITH `!x y. x <= &0 /\ &0 < y
12248 ==> abs (x - y) = abs x + abs y`;
12249 REAL_ARITH `!x. &0 < x ==> &0 < x/ &2`] THEN
12250 ASM_REAL_ARITH_TAC);;
12252 let MAXIMUM_MODULUS_FRONTIER = prove
12255 f holomorphic_on (interior s) /\
12256 f continuous_on (closure s) /\
12257 (!z. z IN frontier s ==> norm(f z) <= B)
12258 ==> !z. z IN s ==> norm(f z) <= B`,
12259 REPEAT GEN_TAC THEN STRIP_TAC THEN
12260 MP_TAC(ISPECL [`norm o (f:complex->complex)`; `closure s:complex->bool`]
12261 CONTINUOUS_ATTAINS_SUP) THEN
12262 ASM_REWRITE_TAC[COMPACT_CLOSURE; CLOSURE_EQ_EMPTY] THEN
12263 ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN
12264 ASM_SIMP_TAC[o_DEF; CONTINUOUS_ON_LIFT_NORM_COMPOSE] THEN
12265 DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC) THEN
12266 SUBGOAL_THEN `norm((f:complex->complex) z) <= B` ASSUME_TAC THENL
12267 [ALL_TAC; ASM_MESON_TAC[CLOSURE_SUBSET; SUBSET; REAL_LE_TRANS]] THEN
12268 ASM_CASES_TAC `(z:complex) IN frontier s` THEN ASM_SIMP_TAC[] THEN
12269 SUBGOAL_THEN `(z:complex) IN interior s` ASSUME_TAC THENL
12270 [ASM_MESON_TAC[frontier; IN_DIFF]; ALL_TAC] THEN
12271 MP_TAC(ISPECL [`f:complex->complex`;
12272 `connected_component (interior s) (z:complex)`;
12273 `connected_component (interior s) (z:complex)`;
12275 MAXIMUM_MODULUS_PRINCIPLE) THEN
12276 ASSUME_TAC(ISPECL [`interior s:complex->bool`; `z:complex`]
12277 CONNECTED_COMPONENT_SUBSET) THEN
12278 ASSUME_TAC(ISPEC `s:complex->bool` INTERIOR_SUBSET) THEN
12279 ASSUME_TAC(ISPEC `s:complex->bool` CLOSURE_SUBSET) THEN
12280 SUBGOAL_THEN `(z:complex) IN connected_component (interior s) z`
12281 ASSUME_TAC THENL [ASM_MESON_TAC[IN; CONNECTED_COMPONENT_REFL]; ALL_TAC] THEN
12282 SIMP_TAC[OPEN_CONNECTED_COMPONENT; OPEN_INTERIOR; SUBSET_REFL] THEN
12283 ASM_REWRITE_TAC[CONNECTED_CONNECTED_COMPONENT] THEN
12285 [CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
12286 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_TRANS];
12287 DISCH_THEN(X_CHOOSE_TAC `c:complex`)] THEN
12289 `!w. w IN closure(connected_component (interior s) z)
12290 ==> (f:complex->complex) w IN {c}`
12292 [MATCH_MP_TAC FORALL_IN_CLOSURE THEN
12293 ASM_REWRITE_TAC[IN_SING; CLOSED_SING] THEN
12294 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
12295 CONTINUOUS_ON_SUBSET)) THEN
12296 MATCH_MP_TAC SUBSET_CLOSURE THEN
12297 ASM_MESON_TAC[CONNECTED_COMPONENT_SUBSET; SUBSET_TRANS];
12298 REWRITE_TAC[IN_SING]] THEN
12300 `~(frontier(connected_component (interior s) (z:complex)) = {})`
12302 [REWRITE_TAC[FRONTIER_EQ_EMPTY; DE_MORGAN_THM] THEN
12303 CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
12304 ASM_MESON_TAC[BOUNDED_SUBSET; NOT_BOUNDED_UNIV];
12305 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; LEFT_IMP_EXISTS_THM]] THEN
12306 X_GEN_TAC `a:complex` THEN DISCH_TAC THEN
12307 DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN
12308 ASM_SIMP_TAC[CLOSURE_UNION_FRONTIER; IN_UNION] THEN
12309 DISCH_THEN(SUBST1_TAC o SYM) THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
12310 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
12311 `a IN s ==> s SUBSET t ==> a IN t`)) THEN
12312 TRANS_TAC SUBSET_TRANS `frontier(interior s:complex->bool)` THEN
12313 SIMP_TAC[FRONTIER_INTERIOR_SUBSET; FRONTIER_OF_CONNECTED_COMPONENT_SUBSET]);;
12315 let MAXIMUM_REAL_FRONTIER = prove
12318 f holomorphic_on (interior s) /\
12319 f continuous_on (closure s) /\
12320 (!z. z IN frontier s ==> Re(f z) <= B)
12321 ==> !z. z IN s ==> Re(f z) <= B`,
12322 REPEAT GEN_TAC THEN STRIP_TAC THEN
12323 MP_TAC(ISPECL [`cexp o (f:complex->complex)`; `s:complex->bool`; `exp B`]
12324 MAXIMUM_MODULUS_FRONTIER) THEN
12325 ASM_SIMP_TAC[NORM_CEXP; o_THM; HOLOMORPHIC_ON_COMPOSE; HOLOMORPHIC_ON_CEXP;
12326 CONTINUOUS_ON_COMPOSE; CONTINUOUS_ON_CEXP] THEN
12327 ASM_REWRITE_TAC[REAL_EXP_MONO_LE]);;
12329 (* ------------------------------------------------------------------------- *)
12330 (* Factoring out a zero according to its order. *)
12331 (* ------------------------------------------------------------------------- *)
12333 let HOLOMORPHIC_FACTOR_ORDER_OF_ZERO = prove
12335 open s /\ z IN s /\ f holomorphic_on s /\
12336 0 < n /\ ~(higher_complex_derivative n f z = Cx(&0)) /\
12337 (!m. 0 < m /\ m < n ==> higher_complex_derivative m f z = Cx(&0))
12338 ==> ?g r. &0 < r /\
12339 g holomorphic_on ball(z,r) /\
12340 (!w. w IN ball(z,r) ==> f(w) - f(z) = (w - z) pow n * g(w)) /\
12341 (!w. w IN ball(z,r) ==> ~(g w = Cx(&0)))`,
12342 REPEAT STRIP_TAC THEN
12343 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12344 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12345 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12347 `!w. w IN ball(z,r)
12348 ==> ((\m. higher_complex_derivative m f z / Cx(&(FACT m)) *
12349 (w - z) pow m) sums f(w) - f(z)) (from n)`
12351 [GEN_TAC THEN DISCH_TAC THEN
12352 MP_TAC(ISPECL [`f:complex->complex`; `z:complex`; `w:complex`; `r:real`]
12353 HOLOMORPHIC_POWER_SERIES) THEN ASM_REWRITE_TAC[] THEN
12354 ANTS_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
12355 DISCH_THEN(MP_TAC o SPEC `1` o
12356 MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
12357 CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[VSUM_SING_NUMSEG] THEN
12358 REWRITE_TAC[FACT; higher_complex_derivative; COMPLEX_DIV_1] THEN
12359 REWRITE_TAC[complex_pow; COMPLEX_MUL_RID] THEN
12360 ASM_CASES_TAC `n = 1` THEN ASM_REWRITE_TAC[] THEN
12361 DISCH_THEN(MP_TAC o SPEC `n:num` o
12362 MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
12363 ANTS_TAC THENL [ASM_ARITH_TAC; MATCH_MP_TAC EQ_IMP] THEN
12364 AP_THM_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC(COMPLEX_RING
12365 `p = Cx(&0) ==> w - z - p = w - z`) THEN
12366 REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC VSUM_EQ_0 THEN
12367 REWRITE_TAC[IN_NUMSEG; COMPLEX_VEC_0] THEN REPEAT STRIP_TAC THEN
12368 REWRITE_TAC[COMPLEX_ENTIRE; complex_div] THEN REPEAT DISJ1_TAC THEN
12369 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC;
12372 `g = \w. infsum (from 0)
12373 (\m. higher_complex_derivative (m + n) f z /
12374 Cx(&(FACT(m + n))) * (w - z) pow m)` THEN
12376 `!w. w IN ball(z,r)
12377 ==> ((\m. higher_complex_derivative (m + n) f z /
12378 Cx(&(FACT(m + n))) * (w - z) pow m)
12379 sums g(w)) (from 0)`
12380 (LABEL_TAC "*") THENL
12381 [REPEAT STRIP_TAC THEN EXPAND_TAC "g" THEN REWRITE_TAC[SUMS_INFSUM] THEN
12382 ASM_CASES_TAC `w:complex = z` THENL
12383 [MATCH_MP_TAC SUMMABLE_FROM_ELSEWHERE THEN EXISTS_TAC `1` THEN
12384 MATCH_MP_TAC SUMMABLE_EQ THEN EXISTS_TAC `\n:num. Cx(&0)` THEN
12385 REWRITE_TAC[SUMMABLE_0; GSYM COMPLEX_VEC_0] THEN
12386 ASM_SIMP_TAC[IN_FROM; COMPLEX_VEC_0; COMPLEX_SUB_REFL;
12387 COMPLEX_POW_ZERO; LE_1; COMPLEX_MUL_RZERO];
12389 `!x:complex m. x * (w - z) pow m =
12390 (x * (w - z) pow (m + n)) / (w - z) pow n`
12391 (fun th -> ONCE_REWRITE_TAC[th])
12393 [REPEAT GEN_TAC THEN
12394 SIMP_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC; COMPLEX_POW_ADD] THEN
12395 ASM_SIMP_TAC[COMPLEX_MUL_RINV; COMPLEX_POW_EQ_0; COMPLEX_SUB_0] THEN
12396 REWRITE_TAC[COMPLEX_MUL_RID];
12397 MATCH_MP_TAC SUMMABLE_COMPLEX_DIV THEN
12398 MP_TAC(GEN `a:num->complex`
12399 (ISPECL [`n:num`; `a:num->complex`] SUMMABLE_REINDEX)) THEN
12400 DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN
12401 REWRITE_TAC[summable; ADD_CLAUSES] THEN ASM_MESON_TAC[]]];
12403 SUBGOAL_THEN `g holomorphic_on ball(z,r)` ASSUME_TAC THENL
12404 [MATCH_MP_TAC POWER_SERIES_HOLOMORPHIC THEN
12405 EXISTS_TAC `\m. higher_complex_derivative (m + n) f z /
12406 Cx(&(FACT (m + n)))` THEN
12407 EXISTS_TAC `from 0` THEN ASM_SIMP_TAC[];
12410 `!w. w IN ball(z,r) ==> f w - f z = (w - z) pow n * g(w)`
12412 [REPEAT STRIP_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
12413 EXISTS_TAC `\m. higher_complex_derivative m f z / Cx(&(FACT m)) *
12414 (w - z) pow m` THEN
12415 EXISTS_TAC `from n` THEN ASM_SIMP_TAC[] THEN
12416 GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [ARITH_RULE `n = 0 + n`] THEN
12417 REWRITE_TAC[GSYM SUMS_REINDEX] THEN REWRITE_TAC[COMPLEX_POW_ADD] THEN
12418 ONCE_REWRITE_TAC[COMPLEX_RING `a * b * c:complex = c * a * b`] THEN
12419 MATCH_MP_TAC SERIES_COMPLEX_LMUL THEN ASM_SIMP_TAC[];
12421 EXISTS_TAC `g:complex->complex` THEN
12422 SUBGOAL_THEN `(g:complex->complex) continuous_on ball(z,r)` MP_TAC THENL
12423 [ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]; ALL_TAC] THEN
12424 REWRITE_TAC[continuous_on] THEN
12425 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
12426 ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN DISCH_THEN(MP_TAC o SPEC
12427 `norm((g:complex->complex) z)`) THEN
12429 [REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
12430 ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN
12431 DISCH_THEN(MP_TAC o SPEC `1` o
12432 MATCH_MP (REWRITE_RULE[IMP_CONJ] SUMS_OFFSET)) THEN
12433 ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
12434 CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[VSUM_SING_NUMSEG] THEN
12435 DISCH_THEN(MP_TAC o SPEC `Cx(&0)` o
12436 MATCH_MP(REWRITE_RULE[IMP_CONJ] SERIES_UNIQUE)) THEN
12437 REWRITE_TAC[complex_pow; ADD_CLAUSES; COMPLEX_MUL_RID] THEN ANTS_TAC THENL
12438 [REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN MATCH_MP_TAC SUMS_0 THEN
12439 SIMP_TAC[IN_FROM; LE_1; COMPLEX_SUB_REFL; COMPLEX_POW_ZERO] THEN
12440 REWRITE_TAC[COMPLEX_VEC_0; COMPLEX_MUL_RZERO];
12441 SIMP_TAC[COMPLEX_SUB_0; NORM_POS_LT] THEN DISCH_THEN(K ALL_TAC) THEN
12442 ASM_REWRITE_TAC[COMPLEX_VEC_0; complex_div; COMPLEX_ENTIRE] THEN
12443 REWRITE_TAC[COMPLEX_INV_EQ_0; CX_INJ; REAL_OF_NUM_EQ; FACT_NZ]];
12445 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
12446 EXISTS_TAC `min d r:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
12447 SUBGOAL_THEN `ball(z,min d r) SUBSET ball(z:complex,r)` ASSUME_TAC THENL
12448 [SIMP_TAC[SUBSET_BALL; REAL_ARITH `min d r <= r`]; ALL_TAC] THEN
12449 CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
12450 CONJ_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
12451 REWRITE_TAC[IN_BALL; REAL_LT_MIN; GSYM COMPLEX_VEC_0] THEN
12452 RULE_ASSUM_TAC(REWRITE_RULE[IN_BALL]) THEN
12453 ASM_MESON_TAC[DIST_SYM; NORM_ARITH `dist(x,y) < norm y ==> ~(x = vec 0)`]);;
12455 let HOLOMORPHIC_FACTOR_ORDER_OF_ZERO_STRONG = prove
12457 open s /\ z IN s /\ f holomorphic_on s /\
12458 0 < n /\ ~(higher_complex_derivative n f z = Cx(&0)) /\
12459 (!m. 0 < m /\ m < n ==> higher_complex_derivative m f z = Cx(&0))
12460 ==> ?g r. &0 < r /\
12461 g holomorphic_on ball(z,r) /\
12462 (!w. w IN ball(z,r)
12463 ==> f(w) - f(z) = ((w - z) * g w) pow n) /\
12464 (!w. w IN ball(z,r) ==> ~(g w = Cx(&0)))`,
12465 REPEAT STRIP_TAC THEN
12466 MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`]
12467 HOLOMORPHIC_FACTOR_ORDER_OF_ZERO) THEN
12468 ASM_REWRITE_TAC[] THEN
12469 ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN MATCH_MP_TAC MONO_EXISTS THEN
12470 X_GEN_TAC `r:real` THEN
12471 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
12473 [`\z. complex_derivative g z / g z`; `ball(z:complex,r)`;
12474 `{}:complex->bool`] HOLOMORPHIC_CONVEX_PRIMITIVE) THEN
12475 REWRITE_TAC[CONVEX_BALL; FINITE_RULES; DIFF_EMPTY] THEN ANTS_TAC THENL
12476 [SIMP_TAC[GSYM HOLOMORPHIC_ON_OPEN; OPEN_BALL;
12477 INTERIOR_OPEN; complex_differentiable] THEN
12478 MATCH_MP_TAC(TAUT `q /\ (q ==> p) ==> p /\ q`) THEN
12479 REWRITE_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
12480 ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_BALL;
12481 HOLOMORPHIC_ON_DIV; ETA_AX];
12482 SIMP_TAC[OPEN_BALL; HAS_COMPLEX_DERIVATIVE_WITHIN_OPEN] THEN
12483 DISCH_THEN(X_CHOOSE_THEN `h:complex->complex` STRIP_ASSUME_TAC)] THEN
12484 MP_TAC(ISPECL [`\z:complex. cexp(h z) / g z`; `ball(z:complex,r)`]
12485 HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
12486 REWRITE_TAC[OPEN_BALL; CONNECTED_BALL] THEN ANTS_TAC THENL
12487 [X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
12489 `Cx(&0) = ((complex_derivative g w / g w * cexp(h w)) * g w -
12490 cexp(h w) * complex_derivative g w) / g w pow 2`
12492 [ASM_SIMP_TAC[COMPLEX_FIELD
12493 `~(z = Cx(&0)) ==> (d / z * e) * z = e * d`] THEN
12494 SIMPLE_COMPLEX_ARITH_TAC;
12495 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DIV_AT THEN
12496 ASM_SIMP_TAC[] THEN CONJ_TAC THENL
12497 [GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
12498 ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
12499 MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
12500 ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_CEXP];
12501 ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; complex_differentiable;
12502 OPEN_BALL; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE]]];
12503 DISCH_THEN(X_CHOOSE_THEN `c:complex` MP_TAC) THEN
12504 ASM_CASES_TAC `c = Cx(&0)` THENL
12505 [ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
12506 `~(x = Cx(&0)) /\ ~(y = Cx(&0)) ==> ~(x / y = Cx(&0))`] THEN
12508 ASM_SIMP_TAC[COMPLEX_FIELD
12509 `~(y = Cx(&0)) /\ ~(z = Cx(&0))
12510 ==> (x / y = z <=> y = inv(z) * x)`] THEN
12511 DISCH_TAC THEN EXISTS_TAC
12512 `\z:complex. cexp((clog(inv c) + h z) / Cx(&n))` THEN
12513 REWRITE_TAC[CEXP_NZ; GSYM CEXP_N; COMPLEX_POW_MUL] THEN
12514 ASM_SIMP_TAC[COMPLEX_DIV_LMUL; CX_INJ; REAL_OF_NUM_EQ; LE_1] THEN
12515 ASM_SIMP_TAC[CEXP_ADD; CEXP_CLOG; COMPLEX_INV_EQ_0] THEN
12516 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
12517 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
12518 REWRITE_TAC[HOLOMORPHIC_ON_CEXP] THEN
12519 MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
12520 ASM_SIMP_TAC[HOLOMORPHIC_ON_CONST; CX_INJ; REAL_OF_NUM_EQ; LE_1] THEN
12521 MATCH_MP_TAC HOLOMORPHIC_ON_ADD THEN
12522 REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
12523 ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL]]]);;
12525 let HOLOMORPHIC_FACTOR_ZERO_NONCONSTANT = prove
12527 open s /\ connected s /\ z IN s /\
12528 f holomorphic_on s /\ f(z) = Cx(&0) /\ ~(?c. !w. w IN s ==> f w = c)
12530 0 < n /\ &0 < r /\ ball(z,r) SUBSET s /\
12531 g holomorphic_on ball(z,r) /\
12532 (!w. w IN ball(z,r) ==> f w = (w - z) pow n * g w) /\
12533 (!w. w IN ball(z,r) ==> ~(g w = Cx(&0)))`,
12534 REPEAT STRIP_TAC THEN
12535 ASM_CASES_TAC `!n. 0 < n ==> higher_complex_derivative n f z = Cx(&0)` THENL
12537 [`f:complex->complex`; `s:complex->bool`; `z:complex`]
12538 HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED) THEN
12539 ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[];
12540 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12541 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12542 DISCH_THEN(X_CHOOSE_THEN `r0:real` STRIP_ASSUME_TAC) THEN
12543 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN
12544 GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
12545 REWRITE_TAC[NOT_IMP; GSYM IMP_CONJ_ALT] THEN
12546 DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN
12547 MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`]
12548 HOLOMORPHIC_FACTOR_ORDER_OF_ZERO) THEN
12549 ASM_REWRITE_TAC[COMPLEX_SUB_RZERO] THEN MATCH_MP_TAC MONO_EXISTS THEN
12550 X_GEN_TAC `g:complex->complex` THEN
12551 DISCH_THEN(X_CHOOSE_THEN `r1:real` STRIP_ASSUME_TAC) THEN
12552 EXISTS_TAC `min r0 r1:real` THEN EXISTS_TAC `n:num` THEN
12553 ASM_SIMP_TAC[BALL_MIN_INTER; IN_INTER; REAL_LT_MIN] THEN CONJ_TAC THENL
12555 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
12556 HOLOMORPHIC_ON_SUBSET)) THEN
12559 let HOLOMORPHIC_LOWER_BOUND_DIFFERENCE = prove
12561 open s /\ connected s /\ z IN s /\ f holomorphic_on s /\
12562 ~(!w. w IN s ==> f w = f z)
12563 ==> ?k n r. &0 < k /\ &0 < r /\ ball(z,r) SUBSET s /\
12565 ==> k * norm(w - z) pow n <= norm(f w - f z)`,
12566 REPEAT STRIP_TAC THEN
12567 MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `z:complex`]
12568 HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED) THEN
12569 ASM_REWRITE_TAC[NOT_FORALL_THM] THEN GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
12570 REWRITE_TAC[NOT_IMP; IMP_IMP] THEN ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
12571 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:num` THEN STRIP_TAC THEN
12572 MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`]
12573 HOLOMORPHIC_FACTOR_ORDER_OF_ZERO) THEN
12574 ASM_SIMP_TAC[LEFT_IMP_EXISTS_THM] THEN
12575 MAP_EVERY X_GEN_TAC [`g:complex->complex`; `r:real`] THEN STRIP_TAC THEN
12576 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12577 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12578 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
12579 ABBREV_TAC `d = min e r / &2` THEN
12580 SUBGOAL_THEN `ball(z,d) SUBSET cball(z,d) /\
12581 cball(z:complex,d) SUBSET ball(z,r) /\
12582 cball(z,d) SUBSET ball(z,e)` ASSUME_TAC THENL
12583 [REWRITE_TAC[SUBSET_BALLS; DIST_REFL] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
12584 MP_TAC(ISPECL [`IMAGE (g:complex->complex) (cball(z,d))`; `Cx(&0)`]
12585 DISTANCE_ATTAINS_INF) THEN
12586 REWRITE_TAC[EXISTS_IN_IMAGE; FORALL_IN_IMAGE; IMAGE_EQ_EMPTY] THEN
12587 REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_SUB; CBALL_EQ_EMPTY] THEN
12589 [CONJ_TAC THENL [MATCH_MP_TAC COMPACT_IMP_CLOSED; ASM_REAL_ARITH_TAC] THEN
12590 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN REWRITE_TAC[COMPACT_CBALL] THEN
12591 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
12593 REWRITE_TAC[COMPLEX_SUB_RZERO] THEN
12594 DISCH_THEN(X_CHOOSE_THEN `p:complex` STRIP_ASSUME_TAC)] THEN
12595 MAP_EVERY EXISTS_TAC [`norm((g:complex->complex) p)`; `d:real`] THEN
12596 ASM_REWRITE_TAC[COMPLEX_NORM_NZ] THEN REPEAT CONJ_TAC THENL
12597 [ASM SET_TAC[]; ASM_REAL_ARITH_TAC; ASM SET_TAC[]; ALL_TAC] THEN
12598 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
12599 RULE_ASSUM_TAC(REWRITE_RULE[SUBSET]) THEN ASM_SIMP_TAC[] THEN
12600 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
12601 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_POW] THEN
12602 MATCH_MP_TAC REAL_LE_LMUL THEN SIMP_TAC[REAL_POW_LE; NORM_POS_LE] THEN
12603 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM SET_TAC[]);;
12605 let POLE_AT_INFINITY = prove
12606 (`!f l. f holomorphic_on (:complex) /\ ((inv o f) --> l) at_infinity
12607 ==> ?a n. !z. f(z) = vsum(0..n) (\i. a i * z pow i)`,
12608 REPEAT GEN_TAC THEN ASM_CASES_TAC `l = Cx(&0)` THENL
12609 [FIRST_X_ASSUM SUBST1_TAC THEN STRIP_TAC;
12610 REPEAT STRIP_TAC THEN FIRST_ASSUM(MP_TAC o MATCH_MP
12611 (REWRITE_RULE[IMP_CONJ] LIM_COMPLEX_INV)) THEN
12612 ASM_REWRITE_TAC[o_THM; COMPLEX_INV_INV; ETA_AX] THEN DISCH_TAC THEN
12613 MP_TAC(ISPECL [`f:complex->complex`; `inv(l:complex)`]
12614 LIOUVILLE_WEAK) THEN
12615 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
12616 EXISTS_TAC `(\n. inv l):num->complex` THEN EXISTS_TAC `0` THEN
12617 REWRITE_TAC[VSUM_CLAUSES_NUMSEG; complex_pow; COMPLEX_MUL_RID]] THEN
12620 !z. z IN ball(Cx(&0),r) DELETE Cx(&0) ==> ~(f(inv z) = Cx(&0))`
12622 [FIRST_X_ASSUM(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12623 MP_TAC(ISPECL [`inv o (f:complex->complex) o inv`; `Cx(&0)`;
12624 `ball(Cx(&0),r)`] HOLOMORPHIC_ON_EXTEND_BOUNDED) THEN
12625 ASM_SIMP_TAC[INTERIOR_OPEN; OPEN_BALL; CENTRE_IN_BALL] THEN ANTS_TAC THENL
12626 [REWRITE_TAC[o_DEF] THEN MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN
12627 ASM_REWRITE_TAC[] THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
12628 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
12629 [ALL_TAC; ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV]] THEN
12630 GEN_REWRITE_TAC LAND_CONV [GSYM ETA_AX] THEN
12631 MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN
12632 REWRITE_TAC[HOLOMORPHIC_ON_ID] THEN SET_TAC[];
12634 MATCH_MP_TAC(TAUT `q /\ (p ==> r) ==> (p <=> q) ==> r`) THEN CONJ_TAC THENL
12635 [EXISTS_TAC `&1` THEN FIRST_X_ASSUM(MP_TAC o
12636 GEN_REWRITE_RULE I [LIM_AT_INFINITY_COMPLEX_0]) THEN
12637 REWRITE_TAC[tendsto] THEN DISCH_THEN(MP_TAC o SPEC `&1`) THEN
12638 REWRITE_TAC[REAL_LT_01] THEN
12639 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
12640 REWRITE_TAC[o_THM; dist; COMPLEX_SUB_RZERO] THEN CONV_TAC NORM_ARITH;
12641 REWRITE_TAC[o_THM] THEN
12642 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC)] THEN
12643 SUBGOAL_THEN `(g:complex->complex)(Cx(&0)) = Cx(&0)` ASSUME_TAC THENL
12644 [MATCH_MP_TAC(ISPEC `at(Cx(&0))` LIM_UNIQUE) THEN
12645 EXISTS_TAC `g:complex->complex` THEN REWRITE_TAC[TRIVIAL_LIMIT_AT] THEN
12647 [REWRITE_TAC[GSYM CONTINUOUS_AT] THEN
12648 ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; OPEN_BALL;
12649 CENTRE_IN_BALL; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
12650 MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
12651 EXISTS_TAC `inv o (f:complex->complex) o inv` THEN
12652 EXISTS_TAC `ball(Cx(&0),r)` THEN
12653 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; o_ASSOC; o_THM;
12654 GSYM LIM_AT_INFINITY_COMPLEX_0] THEN
12657 EXISTS_TAC`\k. higher_complex_derivative k f (Cx(&0)) / Cx(&(FACT k))` THEN
12658 MP_TAC(ISPECL [`g:complex->complex`; `ball(Cx(&0),r)`; `Cx(&0)`]
12659 HOLOMORPHIC_LOWER_BOUND_DIFFERENCE) THEN
12660 ASM_REWRITE_TAC[OPEN_BALL; CONNECTED_BALL; CENTRE_IN_BALL] THEN
12662 [SUBGOAL_THEN `~(ball(Cx(&0),r) DELETE Cx(&0) = {})` MP_TAC THENL
12663 [ALL_TAC; ASM SET_TAC[COMPLEX_INV_EQ_0]] THEN
12664 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; COMPLEX_IN_BALL_0; IN_DELETE] THEN
12665 EXISTS_TAC `Cx(r / &2)` THEN REWRITE_TAC[COMPLEX_NORM_CX; CX_INJ] THEN
12666 ASM_REAL_ARITH_TAC;
12667 REWRITE_TAC[COMPLEX_SUB_RZERO]] THEN
12668 ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN MATCH_MP_TAC MONO_EXISTS THEN
12669 X_GEN_TAC `n:num` THEN DISCH_TAC THEN
12670 MATCH_MP_TAC LIOUVILLE_POLYNOMIAL THEN
12671 FIRST_X_ASSUM(X_CHOOSE_THEN `B:real` (X_CHOOSE_THEN `e:real`
12672 STRIP_ASSUME_TAC)) THEN
12673 MAP_EVERY EXISTS_TAC [`&2 / e`; `inv(B:real)`] THEN
12674 ASM_REWRITE_TAC[] THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
12675 SUBGOAL_THEN `inv(z) IN ball(Cx(&0),e) DELETE Cx(&0)` ASSUME_TAC THENL
12676 [REWRITE_TAC[IN_DELETE; COMPLEX_INV_EQ_0; COMPLEX_IN_BALL_0] THEN
12677 REWRITE_TAC[COMPLEX_NORM_INV] THEN CONJ_TAC THENL
12678 [MATCH_MP_TAC REAL_LT_LINV THEN ASM_REWRITE_TAC[] THEN
12679 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
12680 `&2 / e <= z ==> &0 < inv e ==> inv e < z`)) THEN
12681 ASM_REWRITE_TAC[REAL_LT_INV_EQ];
12682 UNDISCH_TAC `&2 / e <= norm(z:complex)` THEN
12683 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
12684 SIMP_TAC[COMPLEX_NORM_0; REAL_NOT_LE] THEN
12685 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]];
12687 SUBGOAL_THEN `inv(z) IN ball(Cx(&0),r) DELETE Cx(&0)` ASSUME_TAC THENL
12688 [ASM SET_TAC[]; ALL_TAC] THEN
12689 SUBGOAL_THEN `(f:complex->complex) z = inv(g(inv z))` SUBST1_TAC THENL
12690 [ASM_SIMP_TAC[COMPLEX_INV_INV]; ALL_TAC] THEN
12691 GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o RAND_CONV)
12692 [GSYM COMPLEX_INV_INV] THEN
12693 ONCE_REWRITE_TAC[COMPLEX_NORM_INV] THEN
12694 REWRITE_TAC[REAL_POW_INV; GSYM REAL_INV_MUL] THEN
12695 MATCH_MP_TAC REAL_LE_INV2 THEN
12696 CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
12697 MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[] THEN
12698 MATCH_MP_TAC REAL_POW_LT THEN REWRITE_TAC[COMPLEX_NORM_NZ] THEN
12700 FIRST_X_ASSUM(MP_TAC o
12701 GEN_REWRITE_RULE I [LIM_AT_INFINITY_COMPLEX_0]) THEN
12702 REWRITE_TAC[LIM_AT; o_THM; dist; COMPLEX_SUB_RZERO] THEN
12703 DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN
12704 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12705 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN
12706 DISCH_THEN(MP_TAC o SPEC `r:real`) THEN ASM_REWRITE_TAC[] THEN
12707 REWRITE_TAC[NOT_FORALL_THM; NOT_IMP; IN_DELETE; COMPLEX_IN_BALL_0] THEN
12708 DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC) THEN
12709 MP_TAC(ISPECL [`f:complex->complex`; `Cx(&0)`] LIOUVILLE_WEAK) THEN
12711 [ASM_REWRITE_TAC[];
12712 DISCH_TAC THEN MAP_EVERY EXISTS_TAC [`\n:num. Cx(&0)`; `0`] THEN
12713 ASM_REWRITE_TAC[VSUM_CLAUSES_NUMSEG; COMPLEX_MUL_LZERO]] THEN
12714 REWRITE_TAC[LIM_AT_INFINITY_COMPLEX_0] THEN
12715 MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
12716 EXISTS_TAC `r:real` THEN ASM_REWRITE_TAC[dist; COMPLEX_SUB_RZERO] THEN
12717 X_GEN_TAC `w:complex` THEN REWRITE_TAC[o_THM; COMPLEX_NORM_NZ] THEN
12720 `IMAGE ((f:complex->complex) o inv) (ball(Cx(&0),r) DELETE Cx(&0))`
12721 CONNECTED_CLOSED) THEN
12722 MATCH_MP_TAC(TAUT `p /\ (q ==> r) ==> (p <=> q) ==> r`) THEN
12724 [MATCH_MP_TAC CONNECTED_CONTINUOUS_IMAGE THEN
12725 SIMP_TAC[CONNECTED_OPEN_DELETE; OPEN_BALL; CONNECTED_BALL;
12726 DIMINDEX_2; LE_REFL] THEN
12727 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL
12728 [GEN_REWRITE_TAC LAND_CONV [GSYM ETA_AX] THEN
12729 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_INV THEN
12730 REWRITE_TAC[CONTINUOUS_ON_ID] THEN SET_TAC[];
12731 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
12732 HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV]];
12734 REWRITE_TAC[NOT_EXISTS_THM] THEN DISCH_THEN(MP_TAC o SPECL
12735 [`{Cx(&0)}`; `(:complex) DIFF ball(Cx(&0),&1)`]) THEN
12736 SIMP_TAC[CLOSED_SING; CLOSED_DIFF; CLOSED_UNIV; OPEN_BALL] THEN
12737 SIMP_TAC[CENTRE_IN_BALL; REAL_LT_01; SET_RULE
12738 `a IN s ==> {a} INTER (UNIV DIFF s) INTER t = {}`] THEN
12739 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; SET_RULE
12740 `s INTER IMAGE f t = {} <=> !x. x IN t ==> ~(f x IN s)`] THEN
12741 REWRITE_TAC[IN_SING; IN_DIFF; IN_UNIV; IN_UNION] THEN
12742 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN DISCH_TAC THEN
12743 REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL
12744 [REWRITE_TAC[IN_DELETE; COMPLEX_IN_BALL_0; GSYM COMPLEX_NORM_NZ] THEN
12745 X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
12746 FIRST_X_ASSUM(MP_TAC o SPEC `x:complex`) THEN
12747 MATCH_MP_TAC(TAUT `(~q /\ ~r ==> ~p) ==> p ==> q \/ r`) THEN
12748 ASM_REWRITE_TAC[COMPLEX_NORM_INV; REAL_NOT_LT] THEN
12749 STRIP_TAC THEN MATCH_MP_TAC REAL_INV_1_LE THEN
12750 ASM_SIMP_TAC[REAL_LT_IMP_LE; COMPLEX_NORM_NZ];
12751 REWRITE_TAC[COMPLEX_IN_BALL_0; IN_DELETE] THEN ASM SET_TAC[];
12752 DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN
12753 ASM_REWRITE_TAC[COMPLEX_IN_BALL_0; IN_DELETE] THEN DISCH_TAC THEN
12754 FIRST_X_ASSUM(MP_TAC o SPEC `w:complex`) THEN
12755 ASM_REWRITE_TAC[COMPLEX_NORM_NZ; REAL_NOT_LT; COMPLEX_NORM_INV] THEN
12756 MATCH_MP_TAC REAL_INV_1_LE THEN
12757 ASM_SIMP_TAC[REAL_LT_IMP_LE; COMPLEX_NORM_NZ]]]);;
12759 (* ------------------------------------------------------------------------- *)
12760 (* Entire proper functions C->C are precisely the non-trivial polynomials. *)
12761 (* ------------------------------------------------------------------------- *)
12763 let PROPER_MAP_COMPLEX_POLYFUN = prove
12764 (`!s k c n. closed s /\ compact k /\ (?i. i IN 1..n /\ ~(c i = Cx(&0)))
12765 ==> compact {z | z IN s /\ vsum(0..n) (\i. c i * z pow i) IN k}`,
12766 REPEAT STRIP_TAC THEN
12767 MP_TAC(ISPECL [`c:num->complex`; `n:num`] COMPLEX_POLYFUN_EXTREMAL) THEN
12768 DISCH_THEN DISJ_CASES_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
12769 REWRITE_TAC[SET_RULE `{x | x IN s /\ P x} = s INTER {x | P x}`] THEN
12770 MATCH_MP_TAC CLOSED_INTER_COMPACT THEN ASM_REWRITE_TAC[] THEN
12771 REWRITE_TAC[COMPACT_EQ_BOUNDED_CLOSED] THEN CONJ_TAC THENL
12772 [FIRST_X_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_BOUNDED) THEN
12773 REWRITE_TAC[BOUNDED_POS] THEN DISCH_THEN(X_CHOOSE_TAC `B:real`) THEN
12774 FIRST_X_ASSUM(MP_TAC o SPEC `B + &1`) THEN
12775 REWRITE_TAC[EVENTUALLY_AT_INFINITY_POS; real_ge; IN_ELIM_THM] THEN
12776 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `c:real` THEN
12777 MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
12778 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `z:complex` THEN
12779 DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
12780 FIRST_X_ASSUM(MP_TAC o SPEC
12781 `vsum(0..n) (\i. c i * z pow i)` o CONJUNCT2) THEN
12782 ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC;
12783 MATCH_MP_TAC CONTINUOUS_CLOSED_PREIMAGE_UNIV THEN
12784 ASM_SIMP_TAC[COMPACT_IMP_CLOSED] THEN
12785 GEN_TAC THEN MATCH_MP_TAC CONTINUOUS_VSUM THEN
12786 REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN REPEAT STRIP_TAC THEN
12787 MATCH_MP_TAC CONTINUOUS_COMPLEX_LMUL THEN
12788 MATCH_MP_TAC CONTINUOUS_COMPLEX_POW THEN
12789 REWRITE_TAC[CONTINUOUS_AT_ID]]);;
12791 let PROPER_MAP_COMPLEX_POLYFUN_UNIV = prove
12792 (`!k c n. compact k /\ (?i. i IN 1..n /\ ~(c i = Cx(&0)))
12793 ==> compact {z | vsum(0..n) (\i. c i * z pow i) IN k}`,
12794 MP_TAC(SPEC `(:complex)` PROPER_MAP_COMPLEX_POLYFUN) THEN
12795 REWRITE_TAC[IN_UNIV; CLOSED_UNIV]);;
12797 let PROPER_MAP_COMPLEX_POLYFUN_EQ = prove
12798 (`!f. f holomorphic_on (:complex)
12799 ==> ((!k. compact k ==> compact {z | f z IN k}) <=>
12800 ?c n. 0 < n /\ ~(c n = Cx(&0)) /\
12801 f = \z. vsum(0..n) (\i. c i * z pow i))`,
12802 REPEAT STRIP_TAC THEN EQ_TAC THEN STRIP_TAC THENL
12804 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
12805 MATCH_MP_TAC PROPER_MAP_COMPLEX_POLYFUN_UNIV THEN
12806 ASM_REWRITE_TAC[IN_NUMSEG] THEN ASM_MESON_TAC[LE_REFL; LE_1]] THEN
12807 MP_TAC(ISPECL [`f:complex->complex`; `Cx(&0)`] POLE_AT_INFINITY) THEN
12808 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
12809 [REWRITE_TAC[LIM_AT_INFINITY; real_ge] THEN X_GEN_TAC `e:real` THEN
12810 DISCH_TAC THEN REWRITE_TAC[GSYM COMPLEX_VEC_0; DIST_0; o_THM] THEN
12811 FIRST_X_ASSUM(MP_TAC o SPEC `cball(vec 0:complex,inv e)`) THEN
12812 REWRITE_TAC[COMPACT_CBALL] THEN
12813 DISCH_THEN(MP_TAC o MATCH_MP COMPACT_IMP_BOUNDED) THEN
12814 REWRITE_TAC[BOUNDED_POS; IN_ELIM_THM; IN_CBALL_0] THEN
12815 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
12816 EXISTS_TAC `B + &1` THEN ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_01] THEN
12817 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
12818 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
12819 ASM_SIMP_TAC[REAL_ARITH `B + &1 <= x ==> ~(x <= B)`; REAL_NOT_LE] THEN
12820 ASM_SIMP_TAC[COMPLEX_NORM_INV; REAL_LT_LINV];
12821 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `a:num->complex` THEN
12822 DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN
12823 ASM_CASES_TAC `!i. i IN 1..n ==> a i = Cx(&0)` THENL
12824 [FIRST_X_ASSUM(MP_TAC o SPEC `{a 0:complex}`) THEN
12825 ASM_SIMP_TAC[VSUM_CLAUSES_LEFT; LE_0; ADD_CLAUSES; COMPACT_SING] THEN
12826 SIMP_TAC[IN_SING; COMPLEX_MUL_LZERO; complex_pow; COMPLEX_MUL_RID] THEN
12827 REWRITE_TAC[GSYM COMPLEX_VEC_0; VSUM_0; VECTOR_ADD_RID; UNIV_GSPEC] THEN
12828 MESON_TAC[COMPACT_IMP_BOUNDED; NOT_BOUNDED_UNIV];
12829 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN
12830 DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
12831 (fst(EQ_IMP_RULE(SPEC_ALL num_MAX))))) THEN
12832 REWRITE_TAC[NOT_IMP; IN_NUMSEG] THEN
12833 ANTS_TAC THENL [MESON_TAC[]; MATCH_MP_TAC MONO_EXISTS] THEN
12834 X_GEN_TAC `m:num` THEN STRIP_TAC THEN ASM_SIMP_TAC[LE_1; FUN_EQ_THM] THEN
12835 GEN_TAC THEN MATCH_MP_TAC VSUM_EQ_SUPERSET THEN
12836 ASM_REWRITE_TAC[SUBSET_NUMSEG; FINITE_NUMSEG; IN_NUMSEG; LE_0] THEN
12837 X_GEN_TAC `j:num` THEN REWRITE_TAC[COMPLEX_VEC_0; NOT_LE] THEN
12838 STRIP_TAC THEN REWRITE_TAC[COMPLEX_ENTIRE] THEN DISJ1_TAC THEN
12839 MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN
12840 FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN ASM_REWRITE_TAC[] THEN
12843 (* ------------------------------------------------------------------------- *)
12844 (* Relating invertibility and nonvanishing of derivative. *)
12845 (* ------------------------------------------------------------------------- *)
12847 let HAS_COMPLEX_DERIVATIVE_LOCALLY_INJECTIVE = prove
12849 f holomorphic_on s /\ open s /\ z IN s /\
12850 ~(complex_derivative f z = Cx(&0))
12853 (!x x'. x IN t /\ x' IN t /\ f x' = f x ==> x' = x)`,
12854 REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_DERIVATIVE_LOCALLY_INJECTIVE THEN
12855 EXISTS_TAC `\z h. complex_derivative f z * h` THEN
12856 ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN EXISTS_TAC `s:complex->bool` THEN
12857 ASM_REWRITE_TAC[GSYM has_complex_derivative] THEN
12858 REWRITE_TAC[CONJ_ASSOC; LEFT_EXISTS_AND_THM] THEN
12859 ASM_REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
12860 REPEAT CONJ_TAC THENL
12861 [MATCH_MP_TAC LINEAR_INJECTIVE_LEFT_INVERSE THEN
12862 ASM_SIMP_TAC[LINEAR_COMPLEX_MUL; COMPLEX_EQ_MUL_LCANCEL];
12863 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT];
12864 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
12865 SUBGOAL_THEN `(complex_derivative f) continuous_on s` MP_TAC THENL
12866 [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
12867 ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE];
12869 ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[continuous_on] THEN
12870 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12871 DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN
12872 ASM_REWRITE_TAC[dist; REAL_HALF] THEN
12873 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
12874 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12875 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
12876 ASM_REWRITE_TAC[SUBSET; IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
12877 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12878 EXISTS_TAC `min d r:real` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
12879 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
12880 MATCH_MP_TAC(REAL_ARITH `&0 < e /\ x <= e / &2 ==> x < e`) THEN
12881 ASM_REWRITE_TAC[GSYM COMPLEX_SUB_RDISTRIB] THEN MATCH_MP_TAC
12882 (CONJUNCT2(MATCH_MP ONORM (SPEC_ALL LINEAR_COMPLEX_MUL))) THEN
12883 GEN_TAC THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
12884 MATCH_MP_TAC REAL_LE_RMUL THEN
12885 ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE]]);;
12887 let HAS_COMPLEX_DERIVATIVE_LOCALLY_INVERTIBLE = prove
12889 f holomorphic_on s /\ open s /\ z IN s /\
12890 ~(complex_derivative f z = Cx(&0))
12891 ==> ?t g. z IN t /\ open t /\ open(IMAGE f t) /\ t SUBSET s /\
12892 (!w. w IN t ==> g(f w) = w) /\
12893 (!y. y IN (IMAGE f t) ==> f(g y) = y)`,
12894 REPEAT GEN_TAC THEN DISCH_TAC THEN
12895 FIRST_ASSUM(MP_TAC o MATCH_MP HAS_COMPLEX_DERIVATIVE_LOCALLY_INJECTIVE) THEN
12896 DISCH_THEN(X_CHOOSE_THEN `t:complex->bool` MP_TAC) THEN
12897 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
12898 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] THEN
12899 REWRITE_TAC[INJECTIVE_ON_LEFT_INVERSE] THEN
12900 DISCH_THEN(X_CHOOSE_TAC `g:complex->complex`) THEN
12901 EXISTS_TAC `s INTER t:complex->bool` THEN
12902 EXISTS_TAC `g:complex->complex` THEN
12903 ASM_SIMP_TAC[OPEN_INTER; IN_INTER; INTER_SUBSET; FORALL_IN_IMAGE] THEN
12904 MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
12905 ASM_SIMP_TAC[OPEN_INTER; IN_INTER] THEN
12906 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
12907 HOLOMORPHIC_ON_SUBSET; INTER_SUBSET]);;
12909 let HOLOMORPHIC_INJECTIVE_IMP_REGULAR = prove
12911 f holomorphic_on s /\ open s /\
12912 (!w z. w IN s /\ z IN s /\ f w = f z ==> w = z)
12913 ==> !z. z IN s ==> ~(complex_derivative f z = Cx(&0))`,
12914 REPEAT STRIP_TAC THEN
12915 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
12916 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
12917 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
12918 ASM_CASES_TAC `!n. 0 < n ==> higher_complex_derivative n f z = Cx(&0)` THENL
12920 [`f:complex->complex`; `ball(z:complex,r)`; `z:complex`]
12921 HOLOMORPHIC_FUN_EQ_CONST_ON_CONNECTED) THEN
12922 ASM_SIMP_TAC[OPEN_BALL; CONNECTED_BALL; CENTRE_IN_BALL; NOT_IMP] THEN
12923 CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
12924 DISCH_THEN(MP_TAC o SPEC `z + Cx(r / &2)`) THEN
12925 REWRITE_TAC[IN_BALL; NORM_ARITH `dist(z,z + r) = norm r`] THEN
12926 REWRITE_TAC[COMPLEX_NORM_CX; NOT_IMP] THEN
12927 CONJ_TAC THENL [ASM_REAL_ARITH_TAC; DISCH_TAC] THEN
12928 FIRST_X_ASSUM(MP_TAC o SPECL [`z:complex`; `z + Cx(r / &2)`]) THEN
12929 ASM_REWRITE_TAC[COMPLEX_RING `z = z + a <=> a = Cx(&0)`] THEN
12930 REWRITE_TAC[NOT_IMP; CX_INJ] THEN
12931 CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
12932 FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
12933 REWRITE_TAC[IN_BALL; NORM_ARITH `dist(z,z + r) = norm r`] THEN
12934 REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
12935 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM])] THEN
12936 GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
12937 REWRITE_TAC[NOT_IMP; GSYM IMP_CONJ_ALT] THEN
12938 DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN
12939 MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`; `n:num`; `z:complex`]
12940 HOLOMORPHIC_FACTOR_ORDER_OF_ZERO_STRONG) THEN
12941 ASM_REWRITE_TAC[NOT_EXISTS_THM] THEN
12942 MAP_EVERY X_GEN_TAC [`g:complex->complex`; `k:real`] THEN STRIP_TAC THEN
12943 ASM_CASES_TAC `n = 1` THENL
12944 [ASM_MESON_TAC[HIGHER_COMPLEX_DERIVATIVE_1]; ALL_TAC] THEN
12945 MP_TAC(ISPECL[`\w:complex. (w - z) * g(w)`; `ball(z:complex,min r k)`;
12946 `z:complex`] HAS_COMPLEX_DERIVATIVE_LOCALLY_INVERTIBLE) THEN
12947 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; NOT_IMP; REAL_LT_MIN] THEN
12950 `!w. w IN ball(z,min r k)
12951 ==> ((\w. (w - z) * g w) has_complex_derivative
12952 ((w - z) * complex_derivative g w + (Cx(&1) - Cx(&0)) * g w))
12956 [REPEAT STRIP_TAC THEN
12957 SUBGOAL_THEN `w IN ball(z:complex,k)` ASSUME_TAC THENL
12958 [ASM_MESON_TAC[SUBSET; SUBSET_BALL; REAL_ARITH `min r k <= k`];
12960 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_MUL_AT THEN
12961 SIMP_TAC[HAS_COMPLEX_DERIVATIVE_ID; HAS_COMPLEX_DERIVATIVE_SUB;
12962 HAS_COMPLEX_DERIVATIVE_CONST; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
12963 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_BALL];
12964 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
12965 CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
12966 REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
12967 ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_LT_MIN] THEN
12968 DISCH_THEN(SUBST1_TAC o MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
12969 REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_LZERO; COMPLEX_ADD_LID;
12970 COMPLEX_SUB_RZERO; COMPLEX_MUL_LID] THEN
12971 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[CENTRE_IN_BALL]];
12972 REWRITE_TAC[NOT_EXISTS_THM] THEN
12973 MAP_EVERY X_GEN_TAC [`t:complex->bool`; `h:complex->complex`] THEN
12974 ABBREV_TAC `u = IMAGE (\w:complex. (w - z) * g w) t` THEN STRIP_TAC THEN
12975 MP_TAC(ISPEC `u:complex->bool` OPEN_CONTAINS_CBALL) THEN
12976 ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `Cx(&0)`) THEN
12978 [EXPAND_TAC "u" THEN REWRITE_TAC[IN_IMAGE] THEN
12979 EXISTS_TAC `z:complex` THEN ASM_REWRITE_TAC[] THEN
12980 CONV_TAC COMPLEX_RING;
12982 REWRITE_TAC[NOT_EXISTS_THM; SUBSET; IN_CBALL; dist;
12983 COMPLEX_SUB_LZERO; NORM_NEG] THEN
12984 X_GEN_TAC `e:real` THEN
12985 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
12986 DISCH_THEN(fun th ->
12987 MP_TAC(ISPEC `Cx(e) * cexp(Cx(&2) * Cx pi * ii * Cx(&0 / &n))` th) THEN
12988 MP_TAC(ISPEC `Cx(e) * cexp(Cx(&2) * Cx pi * ii * Cx(&1 / &n))` th)) THEN
12989 REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP; RE_MUL_CX; RE_MUL_II] THEN
12990 REWRITE_TAC[IM_CX; REAL_NEG_0; REAL_MUL_RZERO; REAL_EXP_0] THEN
12991 REWRITE_TAC[COMPLEX_NORM_CX; REAL_MUL_RID] THEN
12992 SIMP_TAC[REAL_ARITH `&0 < e ==> abs e <= e`; ASSUME `&0 < e`] THEN
12993 EXPAND_TAC "u" THEN REWRITE_TAC[IN_IMAGE] THEN
12994 DISCH_THEN(X_CHOOSE_THEN `y1:complex` (STRIP_ASSUME_TAC o GSYM)) THEN
12995 DISCH_THEN(X_CHOOSE_THEN `y0:complex` (STRIP_ASSUME_TAC o GSYM)) THEN
12996 UNDISCH_THEN `!w. w IN ball (z,k) ==> f w - f z = ((w - z) * g w) pow n`
12997 (fun th -> MP_TAC(SPEC `y1:complex` th) THEN
12998 MP_TAC(SPEC `y0:complex` th)) THEN
12999 MATCH_MP_TAC(TAUT `(p1 /\ p2) /\ ~(q1 /\ q2)
13000 ==> (p1 ==> q1) ==> (p2 ==> q2) ==> F`) THEN
13002 [ASM_MESON_TAC[SUBSET; SUBSET_BALL; REAL_ARITH `min r k <= k`];
13003 MATCH_MP_TAC(MESON[] `x' = y' /\ ~(x = y) ==> ~(x = x' /\ y = y')`)] THEN
13005 [RULE_ASSUM_TAC(REWRITE_RULE[INJECTIVE_ON_LEFT_INVERSE]) THEN
13006 ASM_SIMP_TAC[] THEN REWRITE_TAC[COMPLEX_POW_MUL] THEN
13007 ASM_SIMP_TAC[COMPLEX_ROOT_UNITY; LE_1];
13008 REWRITE_TAC[COMPLEX_RING `x - a:complex = y - a <=> x = y`] THEN
13009 DISCH_TAC THEN UNDISCH_THEN
13010 `!w z. w IN s /\ z IN s /\ (f:complex->complex) w = f z ==> w = z`
13011 (MP_TAC o SPECL [`y0:complex`; `y1:complex`]) THEN
13012 ASM_REWRITE_TAC[NOT_IMP] THEN CONJ_TAC THENL
13013 [ASM_MESON_TAC[SUBSET; SUBSET_BALL; REAL_ARITH `min r k <= r`];
13014 DISCH_THEN SUBST_ALL_TAC] THEN
13015 MP_TAC(ISPECL [`n:num`; `0`; `1`] COMPLEX_ROOT_UNITY_EQ) THEN
13016 ASM_SIMP_TAC[LE_1] THEN MATCH_MP_TAC(TAUT `a /\ ~b ==> ~(a <=> b)`) THEN
13018 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (COMPLEX_RING
13019 `z = e * y ==> z = e * x /\ ~(e = Cx(&0)) ==> x = y`)) THEN
13020 ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ];
13021 REWRITE_TAC[num_congruent; int_congruent] THEN
13022 DISCH_THEN(X_CHOOSE_THEN `d:int`
13023 (MP_TAC o AP_TERM `abs:int->int` o SYM)) THEN
13024 REWRITE_TAC[INT_ABS_NUM; INT_SUB_LZERO; INT_ABS_NEG] THEN
13025 ASM_REWRITE_TAC[INT_ABS_MUL_1; INT_OF_NUM_EQ; INT_ABS_NUM]]]]);;
13027 (* ------------------------------------------------------------------------- *)
13028 (* Hence a nice clean inverse function theorem. *)
13029 (* ------------------------------------------------------------------------- *)
13031 let HOLOMORPHIC_ON_INVERSE = prove
13032 (`!f s. f holomorphic_on s /\ open s /\
13033 (!w z. w IN s /\ z IN s /\ f w = f z ==> w = z)
13034 ==> open(IMAGE f s) /\
13035 ?g. g holomorphic_on (IMAGE f s) /\
13037 ==> complex_derivative f z * complex_derivative g (f z) =
13039 (!z. z IN s ==> g(f z) = z) /\
13040 (!y. y IN (IMAGE f s) ==> f(g y) = y)`,
13041 REPEAT GEN_TAC THEN STRIP_TAC THEN
13042 MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
13043 [MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
13044 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
13046 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [INJECTIVE_ON_LEFT_INVERSE]) THEN
13047 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
13048 STRIP_TAC THEN ASM_SIMP_TAC[FORALL_IN_IMAGE] THEN
13049 ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN; FORALL_IN_IMAGE] THEN
13050 REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `z:complex` THEN
13051 ASM_CASES_TAC `(z:complex) IN s` THEN ASM_REWRITE_TAC[] THEN
13053 [`f:complex->complex`; `g:complex->complex`;
13054 `complex_derivative f z`; `s:complex->bool`;
13055 `z:complex`] HAS_COMPLEX_DERIVATIVE_INVERSE_STRONG) THEN
13056 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; IMP_CONJ] THEN
13058 [ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE; HOLOMORPHIC_ON_OPEN;
13059 complex_differentiable];
13061 MP_TAC(ISPECL [`f:complex->complex`; `s:complex->bool`]
13062 HOLOMORPHIC_INJECTIVE_IMP_REGULAR) THEN
13063 ANTS_TAC THENL [ASM_MESON_TAC[]; DISCH_THEN(MP_TAC o SPEC `z:complex`)] THEN
13064 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
13065 ASM_SIMP_TAC[COMPLEX_FIELD
13066 `~(z = Cx(&0)) ==> (z * w = Cx(&1) <=> w = inv z)`] THEN
13067 MESON_TAC[HAS_COMPLEX_DERIVATIVE_DERIVATIVE]);;
13069 (* ------------------------------------------------------------------------- *)
13070 (* Holomorphism of covering maps and lifts. *)
13071 (* ------------------------------------------------------------------------- *)
13073 let COVERING_SPACE_LIFT_IS_HOLOMORPHIC = prove
13075 covering_space (c,p) s /\ open c /\ p holomorphic_on c /\
13076 f holomorphic_on u /\ IMAGE f u SUBSET s /\ IMAGE g u SUBSET c /\
13077 g continuous_on u /\ (!x. x IN u ==> p(g x) = f x)
13078 ==> g holomorphic_on u`,
13079 REPEAT STRIP_TAC THEN
13080 REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
13081 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
13082 FIRST_ASSUM(MP_TAC o SPEC `(f:complex->complex) z` o last o CONJUNCTS o
13083 GEN_REWRITE_RULE I [covering_space]) THEN
13084 ANTS_TAC THENL [ASM SET_TAC[]; ASM_SIMP_TAC[OPEN_IN_OPEN_EQ]] THEN
13085 DISCH_THEN(X_CHOOSE_THEN `t:complex->bool` MP_TAC) THEN
13086 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
13087 DISCH_THEN(X_CHOOSE_THEN `vv:(complex->bool)->bool` STRIP_ASSUME_TAC) THEN
13088 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [EXTENSION]) THEN
13089 DISCH_THEN(MP_TAC o snd o EQ_IMP_RULE o SPEC `(g:complex->complex) z`) THEN
13090 ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[IN_UNIONS]] THEN
13091 DISCH_THEN(X_CHOOSE_THEN `v:complex->bool` STRIP_ASSUME_TAC) THEN
13092 MP_TAC(ISPECL [`p:complex->complex`; `v:complex->bool`]
13093 HOLOMORPHIC_ON_INVERSE) THEN
13095 [CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
13096 RULE_ASSUM_TAC(REWRITE_RULE[homeomorphism]) THEN ASM SET_TAC[];
13097 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
13098 DISCH_THEN(X_CHOOSE_THEN `p':complex->complex` STRIP_ASSUME_TAC)] THEN
13099 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_TRANSFORM_WITHIN THEN
13100 EXISTS_TAC `(p':complex->complex) o (f:complex->complex)` THEN
13102 [`g:complex->complex`; `u:complex->bool`; `c:complex->bool`;
13103 `v:complex->bool`] CONTINUOUS_OPEN_IN_PREIMAGE_GEN) THEN
13104 ASM_SIMP_TAC[OPEN_IN_OPEN_EQ] THEN REWRITE_TAC[open_in] THEN
13105 DISCH_THEN(MP_TAC o SPEC `z:complex` o CONJUNCT2) THEN
13106 ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[o_THM; IN_ELIM_THM]] THEN
13107 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
13108 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
13109 CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
13110 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_COMPOSE_WITHIN THEN CONJ_TAC THENL
13111 [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_WITHIN THEN
13112 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET];
13113 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_AT_WITHIN THEN
13114 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
13115 EXISTS_TAC `IMAGE (p:complex->complex) v` THEN
13116 ASM_REWRITE_TAC[] THEN ASM SET_TAC[]]);;
13118 let COVERING_SPACE_LIFT_HOLOMORPHIC = prove
13120 covering_space (c,p) s /\ p holomorphic_on c /\ open c /\
13121 simply_connected u /\ locally path_connected u /\
13122 f holomorphic_on u /\ IMAGE f u SUBSET s
13123 ==> ?g. g holomorphic_on u /\ IMAGE g u SUBSET c /\
13124 !y. y IN u ==> p(g y) = f y`,
13125 REPEAT STRIP_TAC THEN MP_TAC(ISPECL
13126 [`p:complex->complex`; `c:complex->bool`; `s:complex->bool`;
13127 `f:complex->complex`; `u:complex->bool`] COVERING_SPACE_LIFT) THEN
13128 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
13129 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
13130 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
13131 FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
13132 COVERING_SPACE_LIFT_IS_HOLOMORPHIC)) THEN
13133 EXISTS_TAC `f:complex->complex` THEN ASM_REWRITE_TAC[]);;
13135 (* ------------------------------------------------------------------------- *)
13136 (* The Schwarz lemma. *)
13137 (* ------------------------------------------------------------------------- *)
13139 let SCHWARZ_LEMMA = prove
13140 (`!f. f holomorphic_on ball(Cx(&0),&1) /\
13141 (!z:complex. norm z < &1 ==> norm (f z) < &1) /\
13143 ==> (!z. norm z < &1 ==> norm(f z) <= norm z) /\
13144 norm(complex_derivative f(Cx(&0))) <= &1 /\
13145 ((?z. norm z < &1 /\ ~(z= Cx(&0)) /\ norm(f z) = norm z) \/
13146 norm(complex_derivative f (Cx(&0))) = &1
13147 ==> ?c. (!z. norm z < &1 ==> f z = c*z) /\ norm c = &1)`,
13149 (`!f a. open a /\ connected a /\ bounded a /\ ~(a = {}) /\
13150 f holomorphic_on a /\ f continuous_on (closure a)
13151 ==> (?w. w IN (frontier a) /\
13152 (!z. z IN (closure a) ==> norm (f z) <= norm (f w)))`,
13153 REPEAT STRIP_TAC THEN ASSERT_TAC
13154 `?x. x IN closure a /\
13155 (!z. z IN closure a ==>
13156 norm((f:complex->complex) z) <= norm(f x))` THENL
13157 [MATCH_MP_TAC CONTINUOUS_ATTAINS_SUP THEN
13158 ASM_SIMP_TAC [COMPACT_CLOSURE;CLOSURE_EQ_EMPTY] THEN
13159 SUBGOAL_THEN `lift o (\x. norm((f:complex->complex) x)) =
13160 (lift o norm) o (\x. f x) ` SUBST1_TAC THENL
13161 [REWRITE_TAC[o_DEF]; MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
13162 ASM_REWRITE_TAC [CONTINUOUS_ON_LIFT_NORM;ETA_AX]]; ALL_TAC] THEN
13163 ASM_CASES_TAC `x:complex IN frontier a` THENL
13164 [EXISTS_TAC `x:complex` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN
13165 SUBGOAL_THEN `x:complex IN interior a` MP_TAC THENL
13166 [POP_ASSUM MP_TAC THEN REWRITE_TAC[frontier;DIFF] THEN
13167 SET_TAC[ASSUME `x:complex IN closure a`]; ALL_TAC] THEN
13168 ASM_SIMP_TAC[INTERIOR_OPEN] THEN DISCH_TAC THEN
13169 SUBGOAL_THEN `?c. !z. z IN a ==> (f:complex->complex) z = c`
13170 STRIP_ASSUME_TAC THENL
13171 [MATCH_MP_TAC MAXIMUM_MODULUS_PRINCIPLE THEN
13172 EXISTS_TAC `a:complex->bool` THEN
13173 EXISTS_TAC `x:complex` THEN ASM_REWRITE_TAC[SUBSET_REFL] THEN GEN_TAC THEN
13174 DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[closure;UNION] THEN
13175 SET_TAC[ASSUME `z:complex IN a`]; ALL_TAC] THEN
13176 SUBGOAL_THEN `CHOICE(frontier(a:complex->bool)) IN frontier a`
13178 [MATCH_MP_TAC CHOICE_DEF THEN MATCH_MP_TAC FRONTIER_NOT_EMPTY THEN
13179 CONJ_TAC THENL [ASM SET_TAC[]; ASM_MESON_TAC[NOT_BOUNDED_UNIV]];
13181 EXISTS_TAC `CHOICE(frontier(a:complex->bool))` THEN ASM_REWRITE_TAC[] THEN
13182 REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_EQ_IMP_LE THEN
13183 SUBGOAL_THEN `!z. z IN closure a ==> (f:complex->complex) z = c`
13185 [MP_TAC (ISPECL [`f:complex->complex`; `closure (a:complex->bool)`;
13186 `{c:complex}`] CONTINUOUS_CLOSED_PREIMAGE) THEN
13187 ASM_REWRITE_TAC [CLOSED_CLOSURE; CLOSED_SING] THEN
13188 ABBREV_TAC `s = {x | x IN closure(a:complex->bool) /\
13189 (f:complex->complex) x IN {c}}` THEN DISCH_TAC THEN
13190 SUBGOAL_THEN `closure a SUBSET (s:complex->bool)` ASSUME_TAC THENL
13191 [MATCH_MP_TAC CLOSURE_MINIMAL THEN CONJ_TAC THENL
13192 [REWRITE_TAC[SUBSET] THEN EXPAND_TAC "s" THEN
13193 ASSUME_TAC (MESON [CLOSURE_SUBSET;GSYM SUBSET]
13194 `!x:complex. x IN a ==> x IN closure a`) THEN
13195 SET_TAC [ASSUME `!x:complex. x IN a ==> x IN closure a`;
13196 ASSUME `!z:complex. z IN a ==> f z = c:complex`];
13197 ASM_REWRITE_TAC[]];
13198 POP_ASSUM MP_TAC THEN EXPAND_TAC "s" THEN SET_TAC[]];
13199 EQ_TRANS_TAC `norm(c:complex)` THENL
13200 [ASM_SIMP_TAC[]; ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN
13201 MATCH_MP_TAC (NORM_ARITH `!x y:complex. x = y ==> norm x = norm y`) THEN
13202 FIRST_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[frontier;IN_DIFF]]])
13205 (`!(f:complex->complex) r w s.
13206 &0 < r /\ f holomorphic_on ball(Cx(&0),r) /\
13207 &0 < s /\ ball(w,s) SUBSET ball(Cx(&0),r) /\
13208 (!z. norm (w-z) < s ==> norm(f z) <= norm(f w))
13209 ==> (?c. !z. norm z < r ==> f z = c)`,
13210 REPEAT STRIP_TAC THEN
13211 MP_TAC (SPECL[`f:complex->complex`;`ball (Cx(&0),r)`; `ball (w:complex,s)`;
13212 `w:complex`] MAXIMUM_MODULUS_PRINCIPLE) THEN
13213 ASM_REWRITE_TAC[OPEN_BALL; CONNECTED_BALL; IN_BALL;DIST_REFL] THEN
13214 ASM_REWRITE_TAC[dist;COMPLEX_SUB_LZERO;NORM_NEG])
13217 (`!r:real f. f holomorphic_on (ball(Cx(&0),r)) /\ f (Cx(&0))=Cx(&0)
13218 ==> (?h. h holomorphic_on (ball(Cx(&0),r)) /\
13219 ((!z. norm z < r ==> f z=z*(h z)) /\
13220 (complex_derivative f (Cx(&0)))= h (Cx(&0))))`,
13221 REPEAT STRIP_TAC THEN ABBREV_TAC `h = \z. if z = Cx(&0) then
13222 complex_derivative f (Cx(&0)) else f z/z` THEN EXISTS_TAC
13223 `h:complex->complex` THEN ASSERT_TAC `(!z:complex. norm z < r ==>
13224 (f:complex->complex) z = z * h z) /\ complex_derivative f (Cx(&0))
13225 = h (Cx(&0))` THENL [CONJ_TAC THENL
13226 [GEN_TAC THEN DISCH_TAC THEN EXPAND_TAC "h" THEN
13227 COND_CASES_TAC THENL [ASM_REWRITE_TAC[COMPLEX_MUL_LZERO];
13228 POP_ASSUM MP_TAC THEN CONV_TAC COMPLEX_FIELD];
13229 EXPAND_TAC "h" THEN ASM_REWRITE_TAC[]];ALL_TAC] THEN ASM_REWRITE_TAC[]
13230 THEN MATCH_MP_TAC POLE_THEOREM_OPEN_0 THEN EXISTS_TAC `(f:complex->complex)`
13231 THEN EXISTS_TAC `Cx(&0)` THEN
13232 ASM_SIMP_TAC[OPEN_BALL;IN_BALL;COMPLEX_SUB_RZERO;
13233 dist;COMPLEX_SUB_LZERO;NORM_NEG])
13235 GEN_TAC THEN STRIP_TAC THEN
13236 MP_TAC (SPECL [`&1`;`f:complex->complex`] LEMMA3) THEN ASM_REWRITE_TAC[] THEN
13237 STRIP_TAC THEN SUBGOAL_THEN
13238 `!z. norm z < &1 ==> norm ((h:complex->complex) z) <= &1`
13240 [GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC
13242 (`!x y:real. (!a. y<a ==> x<a) ==> x <= y`,
13243 REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LT] THEN
13244 ONCE_REWRITE_TAC[REAL_LT_BETWEEN] THEN REWRITE_TAC[NOT_EXISTS_THM;
13245 DE_MORGAN_THM] THEN X_GEN_TAC `z:real` THEN
13246 POP_ASSUM (MP_TAC o SPEC `z:real`) THEN REAL_ARITH_TAC)) THEN
13247 X_GEN_TAC `a:real` THEN
13248 DISCH_TAC THEN SUBGOAL_THEN
13249 `?r. norm (z:complex) < r /\ inv r < a /\ r < &1` MP_TAC THENL
13250 [SUBGOAL_THEN `max (inv a) (norm(z:complex)) < &1` MP_TAC THENL
13251 [ASM_SIMP_TAC[REAL_MAX_LT; REAL_INV_LT_1];
13252 GEN_REWRITE_TAC LAND_CONV [REAL_LT_BETWEEN] THEN
13253 DISCH_THEN (X_CHOOSE_TAC `r:real`) THEN EXISTS_TAC `r:real` THEN
13254 POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[REAL_MAX_LT] THEN STRIP_TAC THEN
13255 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_LINV THEN
13256 ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; ALL_TAC] THEN
13258 SUBGOAL_THEN `&0 < r` ASSUME_TAC THENL
13259 [ASM_MESON_TAC[REAL_LET_TRANS; NORM_POS_LE]; ALL_TAC] THEN
13260 SUBGOAL_THEN `inv (r:real) = &1/r` ASSUME_TAC THENL
13261 [MATCH_MP_TAC REAL_MUL_RINV_UNIQ THEN MATCH_MP_TAC REAL_DIV_LMUL THEN
13262 ASM_SIMP_TAC[REAL_LT_IMP_NZ]; ALL_TAC] THEN
13263 SUBGOAL_THEN `?w. norm w = r /\ (!z. norm z < r
13264 ==> norm((h:complex->complex) z) <= norm(h w))`
13265 STRIP_ASSUME_TAC THENL
13266 [MATCH_MP_TAC(prove (`!f r. &0 < r /\ f holomorphic_on ball(Cx(&0),r) /\
13267 f continuous_on cball(Cx(&0),r)
13268 ==> (?w. norm w = r /\ (!z. norm z < r ==> norm(f z) <= norm(f w)))`,
13269 REPEAT GEN_TAC THEN STRIP_TAC THEN
13270 MP_TAC(SPECL[`f:complex->complex`; `ball(Cx(&0),r)`] LEMMA1) THEN
13271 ASM_REWRITE_TAC[OPEN_BALL; CONNECTED_BALL; BOUNDED_BALL; BALL_EQ_EMPTY;
13272 REAL_ARITH `!r:real. ~(r <= &0) <=> &0 < r`] THEN
13273 ASM_SIMP_TAC[CLOSURE_BALL] THEN STRIP_TAC THEN EXISTS_TAC `w:complex` THEN
13275 [UNDISCH_TAC `w:complex IN frontier(ball(Cx(&0),r))` THEN
13276 ASM_SIMP_TAC[FRONTIER_BALL;sphere;dist;COMPLEX_SUB_LZERO;NORM_NEG] THEN
13278 POP_ASSUM MP_TAC THEN
13279 REWRITE_TAC[IN_CBALL;dist;COMPLEX_SUB_LZERO;NORM_NEG] THEN
13280 MESON_TAC [REAL_LT_IMP_LE]])) THEN ASM_REWRITE_TAC[] THEN
13281 CONJ_TAC THENL [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET
13282 THEN EXISTS_TAC `ball(Cx(&0),&1)` THEN
13283 ASM_SIMP_TAC [SUBSET_BALL;REAL_LT_IMP_LE];
13284 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
13285 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN EXISTS_TAC `ball(Cx(&0),&1)` THEN
13286 ASM_REWRITE_TAC[SUBSET; IN_CBALL; IN_BALL] THEN
13287 ASM_MESON_TAC[REAL_LET_TRANS]]; ALL_TAC] THEN
13288 MATCH_MP_TAC REAL_LET_TRANS THEN
13289 EXISTS_TAC `norm(h(w:complex):complex)` THEN CONJ_TAC THENL
13290 [ASM_SIMP_TAC[]; ALL_TAC] THEN
13291 SUBGOAL_THEN `h w:complex = f w / w` SUBST1_TAC THENL
13292 [ASM_SIMP_TAC[] THEN
13293 MP_TAC (MESON [GSYM COMPLEX_NORM_ZERO;REAL_NOT_EQ;
13294 ASSUME `norm(w:complex) =r`;
13295 ASSUME `&0 < r`] `~(w=Cx(&0))`) THEN
13296 CONV_TAC(COMPLEX_FIELD);
13297 ASM_REWRITE_TAC[COMPLEX_NORM_DIV] THEN MATCH_MP_TAC REAL_LT_TRANS THEN
13298 EXISTS_TAC `&1/(r:real)` THEN ASM_SIMP_TAC [REAL_LT_DIV2_EQ] THEN
13299 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `inv (r:real)` THEN
13300 ASM_REWRITE_TAC[REAL_LE_REFL]]; ALL_TAC] THEN
13302 [GEN_TAC THEN DISCH_TAC THEN ASM_CASES_TAC `z = Cx(&0)` THENL
13303 [ASM_SIMP_TAC[COMPLEX_MUL_LZERO;REAL_LE_REFL];
13304 SUBST1_TAC (REAL_ARITH `norm (z:complex) = norm z * &1`) THEN
13305 ASM_SIMP_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
13306 ASM_SIMP_TAC[NORM_POS_LE]]; ALL_TAC] THEN CONJ_TAC THENL
13307 [ASM_MESON_TAC [COMPLEX_NORM_ZERO;REAL_LT_01]; ALL_TAC] THEN
13308 REWRITE_TAC[TAUT `((p \/ q) ==> r) <=> ((p ==> r) /\ (q ==> r))`] THEN
13309 CONJ_TAC THENL [STRIP_TAC THEN SUBGOAL_THEN
13310 `norm ((h:complex->complex) z) = &1` ASSUME_TAC THENL
13311 [SUBGOAL_THEN `(h:complex->complex) z = f z/z` SUBST1_TAC THENL
13312 [UNDISCH_THEN `!z:complex. norm z < &1 ==> f z = z * h z`
13313 (MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
13314 UNDISCH_TAC `~(z = Cx(&0))` THEN CONV_TAC(COMPLEX_FIELD);
13315 ASM_SIMP_TAC[COMPLEX_NORM_ZERO;REAL_DIV_REFL;COMPLEX_NORM_DIV]];
13316 SUBGOAL_THEN `?c. (!z. norm z < &1 ==> (h:complex->complex) z = c)`
13317 STRIP_ASSUME_TAC THENL [MATCH_MP_TAC LEMMA2
13318 THEN EXISTS_TAC `z:complex` THEN EXISTS_TAC `&1 - norm(z:complex)`
13319 THEN ASM_REWRITE_TAC[REAL_LT_01] THEN CONJ_TAC THENL
13320 [ASM_MESON_TAC[REAL_SUB_LT]; CONJ_TAC THENL
13321 [REWRITE_TAC[SUBSET;IN_BALL] THEN GEN_TAC THEN DISCH_TAC THEN
13322 MATCH_MP_TAC REAL_LET_TRANS THEN
13323 EXISTS_TAC `dist(Cx(&0), z) + dist(z,x)` THEN
13324 REWRITE_TAC[DIST_TRIANGLE] THEN POP_ASSUM MP_TAC THEN
13325 REWRITE_TAC[dist;COMPLEX_SUB_LZERO;NORM_NEG] THEN REAL_ARITH_TAC;
13326 GEN_TAC THEN DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN
13327 MATCH_MP_TAC REAL_LET_TRANS THEN
13328 EXISTS_TAC `norm(z:complex) + norm(z' - z)` THEN
13329 REWRITE_TAC[NORM_TRIANGLE_SUB] THEN REWRITE_TAC[NORM_SUB] THEN
13330 POP_ASSUM MP_TAC THEN REWRITE_TAC[NORM_SUB] THEN REAL_ARITH_TAC]];
13331 EXISTS_TAC `c:complex` THEN CONJ_TAC THENL
13332 [ASM_SIMP_TAC[COMPLEX_MUL_SYM];
13333 POP_ASSUM (MP_TAC o SPEC `z:complex`) THEN ASM_MESON_TAC[]]]];
13334 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
13335 SUBGOAL_THEN `?c. (!z. norm z < &1 ==> (h:complex->complex) z = c)`
13336 STRIP_ASSUME_TAC THENL[MATCH_MP_TAC LEMMA2 THEN EXISTS_TAC `Cx(&0)`
13337 THEN EXISTS_TAC `&1` THEN ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`;
13338 SUBSET_REFL; COMPLEX_SUB_LZERO; NORM_NEG];
13339 EXISTS_TAC `c:complex` THEN CONJ_TAC THENL
13340 [ASM_SIMP_TAC[COMPLEX_MUL_SYM];POP_ASSUM (MP_TAC o SPEC `Cx(&0)`) THEN
13341 ASM_MESON_TAC[COMPLEX_NORM_0; REAL_LT_01]]]]);;
13343 (* ------------------------------------------------------------------------- *)
13344 (* The Schwarz reflection principle. *)
13345 (* ------------------------------------------------------------------------- *)
13347 let HOLOMORPHIC_ON_PASTE_ACROSS_LINE = prove
13349 open s /\ ~(a = vec 0) /\
13350 f holomorphic_on {z | z IN s /\ k < a dot z} /\
13351 f holomorphic_on {z | z IN s /\ a dot z < k} /\
13353 ==> f holomorphic_on s`,
13356 d dot a <= k /\ k <= d dot b
13357 ==> ?c. c IN segment[a,b] /\ d dot c = k /\
13358 (!z. z IN segment[a,c] ==> d dot z <= k) /\
13359 (!z. z IN segment[c,b] ==> k <= d dot z)`,
13360 REPEAT STRIP_TAC THEN
13361 MP_TAC(ISPECL [`segment[a:real^N,b]`; `a:real^N`; `b:real^N`;
13362 `d:real^N`; `k:real`] CONNECTED_IVT_HYPERPLANE) THEN
13363 ASM_REWRITE_TAC[CONNECTED_SEGMENT; ENDS_IN_SEGMENT] THEN
13364 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `c:real^N` THEN STRIP_TAC THEN
13365 ASM_REWRITE_TAC[SET_RULE
13366 `(!z. z IN s ==> P z) <=> s SUBSET {x | P x}`] THEN
13367 REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN CONJ_TAC THEN
13368 MATCH_MP_TAC HULL_MINIMAL THEN
13369 REWRITE_TAC[CONVEX_HALFSPACE_LE; REWRITE_RULE[real_ge] CONVEX_HALFSPACE_GE;
13370 SUBSET; FORALL_IN_INSERT; NOT_IN_EMPTY] THEN
13371 ASM_REWRITE_TAC[IN_ELIM_THM; REAL_LE_REFL]) in
13374 convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
13375 d dot a <= k /\ d dot b <= k /\ d dot c <= k /\
13376 f holomorphic_on {z | z IN s /\ d dot z < k} /\
13377 f holomorphic_on {z | z IN s /\ k < d dot z} /\
13379 ==> path_integral (linepath (a,b)) f +
13380 path_integral (linepath (b,c)) f +
13381 path_integral (linepath (c,a)) f = Cx(&0)`,
13382 REPEAT STRIP_TAC THEN
13383 MP_TAC(SPECL [`f:complex->complex`; `a:complex`; `b:complex`; `c:complex`]
13384 CAUCHY_THEOREM_TRIANGLE_INTERIOR) THEN
13387 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
13388 EXISTS_TAC `s:complex->bool` THEN
13389 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HULL_MINIMAL THEN ASM SET_TAC[];
13390 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13391 EXISTS_TAC `{z:complex | z IN s /\ d dot z < k}` THEN
13392 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SUBSET_TRANS THEN
13393 EXISTS_TAC `interior(s INTER {x:complex | d dot x <= k})` THEN
13395 [MATCH_MP_TAC SUBSET_INTERIOR THEN MATCH_MP_TAC HULL_MINIMAL THEN
13396 ASM_SIMP_TAC[CONVEX_INTER; CONVEX_HALFSPACE_LE] THEN ASM SET_TAC[];
13397 ASM_SIMP_TAC[INTERIOR_INTER; INTERIOR_HALFSPACE_LE;
13398 INTERIOR_OPEN] THEN
13400 REWRITE_TAC[HAS_CHAIN_INTEGRAL_CHAIN_INTEGRAL]]) in
13403 convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
13404 d dot a <= k /\ d dot b <= k /\
13405 f holomorphic_on {z | z IN s /\ d dot z < k} /\
13406 f holomorphic_on {z | z IN s /\ k < d dot z} /\
13408 ==> path_integral (linepath (a,b)) f +
13409 path_integral (linepath (b,c)) f +
13410 path_integral (linepath (c,a)) f = Cx(&0)`,
13411 REPEAT STRIP_TAC THEN ASM_CASES_TAC `(d:complex) dot c <= k` THENL
13412 [MATCH_MP_TAC lemma1 THEN ASM_MESON_TAC[]; ALL_TAC] THEN
13413 RULE_ASSUM_TAC(REWRITE_RULE[REAL_NOT_LE]) THEN
13414 MP_TAC(ISPECL [`d:complex`; `b:complex`; `c:complex`; `k:real`]
13416 MP_TAC(ISPECL [`d:complex`; `a:complex`; `c:complex`; `k:real`]
13418 ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN
13419 DISCH_THEN(X_CHOOSE_THEN `a':complex` STRIP_ASSUME_TAC) THEN
13420 DISCH_THEN(X_CHOOSE_THEN `b':complex` STRIP_ASSUME_TAC) THEN
13421 SUBGOAL_THEN `(a':complex) IN s /\ b' IN s` STRIP_ASSUME_TAC THENL
13422 [ASM_MESON_TAC[CONVEX_CONTAINS_SEGMENT; SEGMENT_SYM; SUBSET];
13425 [`f:complex->complex`; `c:complex`; `a:complex`; `a':complex`]
13426 PATH_INTEGRAL_SPLIT_LINEPATH) THEN
13428 [`f:complex->complex`; `b:complex`; `c:complex`; `b':complex`]
13429 PATH_INTEGRAL_SPLIT_LINEPATH) THEN
13430 ASM_REWRITE_TAC[] THEN REPEAT(ANTS_TAC THENL
13431 [ASM_MESON_TAC[CONVEX_CONTAINS_SEGMENT; SEGMENT_SYM;
13432 CONTINUOUS_ON_SUBSET];
13433 ONCE_REWRITE_TAC[TAUT `p ==> q ==> r <=> q ==> p ==> r`]]) THEN
13434 MP_TAC(ISPECL [`f:complex->complex`; `linepath(a':complex,b')`]
13435 PATH_INTEGRAL_REVERSEPATH) THEN
13436 REWRITE_TAC[REVERSEPATH_LINEPATH; VALID_PATH_LINEPATH] THEN ANTS_TAC THENL
13437 [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
13438 ASM_MESON_TAC[CONVEX_CONTAINS_SEGMENT; CONTINUOUS_ON_SUBSET];
13440 MP_TAC(ISPECL [`f:complex->complex`; `s INTER {x:complex | d dot x <= k}`;
13441 `{}:complex->bool`;
13442 `linepath(a:complex,b) ++ linepath(b,b') ++
13443 linepath(b',a') ++ linepath(a',a)`]
13444 CAUCHY_THEOREM_CONVEX) THEN
13445 MP_TAC(ISPECL [`f:complex->complex`; `s INTER {x:complex | k <= d dot x}`;
13446 `{}:complex->bool`;
13447 `linepath(b':complex,c) ++ linepath(c,a') ++
13449 CAUCHY_THEOREM_CONVEX) THEN
13451 `(q /\ q' ==> r) /\ (p /\ p') ==> (p ==> q) ==> (p' ==> q') ==> r`) THEN
13453 [DISCH_THEN(CONJUNCTS_THEN
13454 (fun th -> MP_TAC(MATCH_MP PATH_INTEGRAL_UNIQUE th) THEN
13455 MP_TAC(MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE th)));
13456 ASM_SIMP_TAC[DIFF_EMPTY; INTERIOR_INTER; INTERIOR_HALFSPACE_LE;
13457 REWRITE_RULE[real_ge] INTERIOR_HALFSPACE_GE] THEN
13458 ASM_SIMP_TAC[CONVEX_INTER; CONVEX_HALFSPACE_LE; FINITE_EMPTY;
13459 REWRITE_RULE[real_ge] CONVEX_HALFSPACE_GE]] THEN
13460 SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN_EQ;
13461 PATHSTART_JOIN; PATHFINISH_JOIN; PATH_IMAGE_JOIN;
13462 VALID_PATH_LINEPATH; PATHSTART_LINEPATH; PATHFINISH_LINEPATH;
13463 PATH_INTEGRAL_JOIN]
13464 THENL [CONV_TAC COMPLEX_RING; ALL_TAC] THEN
13465 REWRITE_TAC[PATH_IMAGE_LINEPATH; UNION_SUBSET; SUBSET_INTER] THEN
13466 ASM_SIMP_TAC[fst(EQ_IMP_RULE(SPEC_ALL CONVEX_CONTAINS_SEGMENT_EQ));
13467 CONVEX_HALFSPACE_LE; REWRITE_RULE[real_ge] CONVEX_HALFSPACE_GE;
13468 IN_ELIM_THM; REAL_LT_IMP_LE; REAL_LE_REFL] THEN
13469 ASM_SIMP_TAC[complex_differentiable; GSYM HOLOMORPHIC_ON_OPEN;
13470 OPEN_INTER; INTERIOR_OPEN; OPEN_HALFSPACE_LT;
13471 OPEN_HALFSPACE_GT] THEN
13472 RULE_ASSUM_TAC(REWRITE_RULE[SET_RULE
13473 `{x | x IN s /\ P x} = s INTER {x | P x}`]) THEN
13474 ASM_REWRITE_TAC[real_gt] THEN
13475 ASM_MESON_TAC[INTER_SUBSET; CONTINUOUS_ON_SUBSET]) in
13478 convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
13480 f holomorphic_on {z | z IN s /\ d dot z < k} /\
13481 f holomorphic_on {z | z IN s /\ k < d dot z} /\
13483 ==> path_integral (linepath (a,b)) f +
13484 path_integral (linepath (b,c)) f +
13485 path_integral (linepath (c,a)) f = Cx(&0)`,
13486 REPEAT STRIP_TAC THEN ASM_CASES_TAC `(d:complex) dot b <= k` THENL
13487 [MATCH_MP_TAC lemma2 THEN ASM_MESON_TAC[]; ALL_TAC] THEN
13488 ASM_CASES_TAC `(d:complex) dot c <= k` THENL
13489 [ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = c + a + b`] THEN
13490 MATCH_MP_TAC(GEN_ALL lemma2) THEN ASM_MESON_TAC[];
13492 ONCE_REWRITE_TAC[COMPLEX_RING `a + b + c:complex = b + c + a`] THEN
13493 MATCH_MP_TAC(GEN_ALL lemma2) THEN
13494 MAP_EVERY EXISTS_TAC
13495 [`s:complex->bool`; `--d:real^2`; `--k:real`] THEN
13496 ASM_REWRITE_TAC[DOT_LNEG; REAL_LE_NEG2; REAL_LT_NEG2; VECTOR_NEG_EQ_0] THEN
13497 ASM_REAL_ARITH_TAC) in
13500 convex s /\ open s /\ a IN s /\ b IN s /\ c IN s /\ ~(d = vec 0) /\
13501 f holomorphic_on {z | z IN s /\ d dot z < k} /\
13502 f holomorphic_on {z | z IN s /\ k < d dot z} /\
13504 ==> path_integral (linepath (a,b)) f +
13505 path_integral (linepath (b,c)) f +
13506 path_integral (linepath (c,a)) f = Cx(&0)`,
13507 REPEAT STRIP_TAC THEN ASM_CASES_TAC `(d:complex) dot a <= k` THENL
13508 [MATCH_MP_TAC lemma3 THEN ASM_MESON_TAC[]; ALL_TAC] THEN
13509 MATCH_MP_TAC lemma3 THEN
13510 MAP_EVERY EXISTS_TAC
13511 [`s:complex->bool`; `--d:real^2`; `--k:real`] THEN
13512 ASM_REWRITE_TAC[DOT_LNEG; REAL_LE_NEG2; REAL_LT_NEG2; VECTOR_NEG_EQ_0] THEN
13513 ASM_REAL_ARITH_TAC) in
13514 REPEAT STRIP_TAC THEN MATCH_MP_TAC ANALYTIC_IMP_HOLOMORPHIC THEN
13515 MATCH_MP_TAC MORERA_LOCAL_TRIANGLE THEN
13516 X_GEN_TAC `p:complex` THEN DISCH_TAC THEN
13517 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
13518 DISCH_THEN(MP_TAC o SPEC `p:complex`) THEN ASM_REWRITE_TAC[] THEN
13519 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
13520 EXISTS_TAC `ball(p:complex,e)` THEN
13521 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
13522 CONJ_TAC THENL [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]; ALL_TAC] THEN
13523 MAP_EVERY X_GEN_TAC [`u:complex`; `v:complex`; `w:complex`] THEN
13524 SIMP_TAC[SUBSET_HULL; CONVEX_BALL; INSERT_SUBSET; EMPTY_SUBSET] THEN
13525 STRIP_TAC THEN MATCH_MP_TAC lemma4 THEN
13526 MAP_EVERY EXISTS_TAC [`ball(p:complex,e)`; `a:complex`; `k:real`] THEN
13527 ASM_REWRITE_TAC[CONVEX_BALL; OPEN_BALL] THEN REPEAT CONJ_TAC THENL
13528 [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13529 EXISTS_TAC `{z:complex | z IN s /\ a dot z < k}`;
13530 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13531 EXISTS_TAC `{z:complex | z IN s /\ k < a dot z}`;
13532 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
13533 EXISTS_TAC `s:complex->bool`] THEN
13534 ASM_REWRITE_TAC[] THEN ASM SET_TAC[]);;
13536 let SCHWARZ_REFLECTION = prove
13537 (`!f s. open s /\ (!z. z IN s ==> cnj z IN s) /\
13538 f holomorphic_on {z | z IN s /\ &0 < Im z} /\
13539 f continuous_on {z | z IN s /\ &0 <= Im z} /\
13540 (!z. z IN s /\ real z ==> real(f z))
13541 ==> (\z. if &0 <= Im z then f(z) else cnj(f(cnj z)))
13543 REPEAT STRIP_TAC THEN
13544 MATCH_MP_TAC HOLOMORPHIC_ON_PASTE_ACROSS_LINE THEN
13545 MAP_EVERY EXISTS_TAC [`basis 2:complex`; `&0`] THEN
13546 ASM_SIMP_TAC[BASIS_NONZERO; DOT_BASIS; DIMINDEX_2; ARITH] THEN
13547 REWRITE_TAC[GSYM IM_DEF] THEN REPEAT CONJ_TAC THENL
13548 [UNDISCH_TAC `f holomorphic_on {z | z IN s /\ &0 < Im z}` THEN
13549 MATCH_MP_TAC EQ_IMP THEN MATCH_MP_TAC HOLOMORPHIC_EQ THEN
13550 SIMP_TAC[IN_ELIM_THM; REAL_LT_IMP_LE];
13552 `(cnj o f o cnj) holomorphic_on {z | z IN s /\ Im z < &0}`
13555 MATCH_MP_TAC EQ_IMP THEN MATCH_MP_TAC HOLOMORPHIC_EQ THEN
13556 SIMP_TAC[IN_ELIM_THM; GSYM REAL_NOT_LE; o_THM]] THEN
13557 UNDISCH_TAC `f holomorphic_on {z | z IN s /\ &0 < Im z}` THEN
13558 REWRITE_TAC[holomorphic_on; IN_ELIM_THM] THEN DISCH_TAC THEN
13559 X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
13560 FIRST_X_ASSUM(MP_TAC o SPEC `cnj z`) THEN
13561 ASM_SIMP_TAC[IM_CNJ; REAL_ARITH `&0 < --x <=> x < &0`] THEN
13562 DISCH_THEN(X_CHOOSE_THEN `w:complex`
13563 (fun th -> EXISTS_TAC `cnj w` THEN MP_TAC th)) THEN
13564 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN; LIM_WITHIN] THEN
13565 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [GSYM FORALL_CNJ] THEN
13566 REWRITE_TAC[IN_ELIM_THM; dist; GSYM CNJ_SUB; o_THM] THEN
13567 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [GSYM COMPLEX_NORM_CNJ] THEN
13568 REWRITE_TAC[CNJ_SUB; CNJ_DIV; CNJ_CNJ] THEN
13569 MATCH_MP_TAC MONO_FORALL THEN GEN_TAC THEN
13570 MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
13571 MATCH_MP_TAC MONO_EXISTS THEN REPEAT STRIP_TAC THEN
13572 ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
13573 ASM_SIMP_TAC[IM_CNJ] THEN ASM_REAL_ARITH_TAC;
13575 `s = {z | z IN s /\ &0 <= Im z} UNION
13576 {z | z IN s /\ Im z <= &0}`
13577 (fun th -> SUBST1_TAC th THEN ASSUME_TAC(SYM th))
13578 THENL [SET_TAC[REAL_LE_TOTAL]; ALL_TAC] THEN
13579 MATCH_MP_TAC CONTINUOUS_ON_CASES_LOCAL THEN
13580 ASM_REWRITE_TAC[IN_ELIM_THM] THEN
13581 REWRITE_TAC[SET_RULE `{z | z IN s /\ P z} = s INTER {z | P z}`] THEN
13582 SIMP_TAC[CLOSED_IN_CLOSED_INTER; CLOSED_HALFSPACE_IM_LE;
13583 REWRITE_RULE[real_ge] CLOSED_HALFSPACE_IM_GE] THEN
13586 (MATCH_MP_TAC(REWRITE_RULE[o_DEF] CONTINUOUS_ON_COMPOSE) THEN
13587 REWRITE_TAC[CONTINUOUS_ON_CNJ]) THEN
13588 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13589 CONTINUOUS_ON_SUBSET)) THEN
13590 ASM_SIMP_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM; IN_INTER; IM_CNJ] THEN
13592 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
13593 SUBGOAL_THEN `real z` ASSUME_TAC THENL
13594 [REWRITE_TAC[real] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13595 RULE_ASSUM_TAC(REWRITE_RULE[REAL_CNJ]) THEN ASM_MESON_TAC[]]]);;
13597 (* ------------------------------------------------------------------------- *)
13598 (* Bloch's theorem. *)
13599 (* ------------------------------------------------------------------------- *)
13601 let BLOCH_LEMMA = prove
13603 &0 < r /\ f holomorphic_on cball(a,r) /\
13604 (!z. z IN ball(a,r)
13605 ==> norm(complex_derivative f z) <= &2 * norm(complex_derivative f a))
13606 ==> ball(f(a),(&3 - &2 * sqrt(&2)) * r * norm(complex_derivative f a))
13607 SUBSET IMAGE f (ball(a,r))`,
13610 &0 < r /\ f holomorphic_on cball(Cx(&0),r) /\ f(Cx(&0)) = Cx(&0) /\
13611 (!z. z IN ball(Cx(&0),r)
13612 ==> norm(complex_derivative f z)
13613 <= &2 * norm(complex_derivative f (Cx(&0))))
13615 (&3 - &2 * sqrt(&2)) *
13616 r * norm(complex_derivative f (Cx(&0))))
13617 SUBSET IMAGE f (ball(Cx(&0),r))`
13620 REPEAT STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
13621 [`\z. (f:complex->complex)(a + z) - f(a)`; `r:real`]) THEN
13622 ASM_REWRITE_TAC[COMPLEX_ADD_RID; COMPLEX_SUB_REFL] THEN
13624 `!z. z IN ball(Cx(&0),r)
13625 ==> complex_derivative (\w. f (a + w) - f a) z =
13626 complex_derivative f (a + z)`
13627 (fun th -> ASM_SIMP_TAC[CENTRE_IN_BALL; COMPLEX_ADD_RID; th])
13629 [REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
13630 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
13631 ONCE_REWRITE_TAC [COMPLEX_RING
13632 `complex_derivative f z =
13633 complex_derivative f z * (Cx(&0) + Cx(&1)) - Cx(&0)`] THEN
13634 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
13635 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_CONST] THEN
13636 GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
13637 MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
13638 SIMP_TAC[HAS_COMPLEX_DERIVATIVE_ADD; HAS_COMPLEX_DERIVATIVE_CONST;
13639 HAS_COMPLEX_DERIVATIVE_ID; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
13640 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
13641 DISCH_THEN(MP_TAC o SPEC `a + z:complex`) THEN
13642 ASM_SIMP_TAC[IN_CBALL; NORM_ARITH `norm z < r ==> dist(a,a+z) <= r`] THEN
13643 REWRITE_TAC[GSYM complex_differentiable] THEN
13644 DISCH_THEN(MP_TAC o SPEC `ball(a:complex,r)` o
13645 MATCH_MP (REWRITE_RULE[IMP_CONJ]
13646 COMPLEX_DIFFERENTIABLE_WITHIN_SUBSET)) THEN
13647 ASM_REWRITE_TAC[BALL_SUBSET_CBALL] THEN MATCH_MP_TAC EQ_IMP THEN
13648 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_WITHIN_OPEN THEN
13649 ASM_REWRITE_TAC[IN_BALL; OPEN_BALL; NORM_ARITH `dist(a,a + z) = norm z`];
13652 [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
13653 REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
13654 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
13655 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE_GEN THEN
13656 EXISTS_TAC `cball(a:complex,r)` THEN
13657 ASM_SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_ID;
13658 HOLOMORPHIC_ON_CONST; COMPLEX_IN_CBALL_0] THEN
13659 REWRITE_TAC[IN_CBALL] THEN NORM_ARITH_TAC;
13660 X_GEN_TAC `z:complex` THEN REWRITE_TAC[COMPLEX_IN_BALL_0] THEN
13661 STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
13662 ASM_REWRITE_TAC[IN_BALL; NORM_ARITH `dist(a,a + z) = norm z`]];
13663 REWRITE_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_IMAGE] THEN
13664 REWRITE_TAC[IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
13665 DISCH_THEN(fun th ->
13666 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
13667 MP_TAC(SPEC `z - (f:complex->complex) a` th)) THEN
13668 ASM_REWRITE_TAC[COMPLEX_RING `z - a:complex = w - a <=> z = w`] THEN
13669 DISCH_THEN(X_CHOOSE_TAC `x:complex`) THEN
13670 EXISTS_TAC `a + x:complex` THEN
13671 ASM_REWRITE_TAC[COMPLEX_ADD_SUB]]]] THEN
13672 REPEAT GEN_TAC THEN
13673 SUBGOAL_THEN `&0 < &3 - &2 * sqrt(&2)` ASSUME_TAC THENL
13674 [REWRITE_TAC[REAL_ARITH `&0 < a - &2 * b <=> b < a / &2`] THEN
13675 MATCH_MP_TAC REAL_LT_LSQRT THEN REAL_ARITH_TAC;
13677 ASM_CASES_TAC `&0 < r` THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
13678 ASM_CASES_TAC `complex_derivative f (Cx(&0)) = Cx(&0)` THEN
13679 ASM_SIMP_TAC[COMPLEX_NORM_0; REAL_MUL_RZERO; BALL_TRIVIAL; EMPTY_SUBSET] THEN
13680 ABBREV_TAC `C = &2 * norm(complex_derivative f (Cx(&0)))` THEN
13681 SUBGOAL_THEN `&0 < C` ASSUME_TAC THENL
13682 [ASM_MESON_TAC[COMPLEX_NORM_NZ; REAL_ARITH `&0 < &2 * x <=> &0 < x`];
13685 `!z. z IN ball(Cx(&0),r)
13686 ==> norm(complex_derivative f z - complex_derivative f (Cx(&0)))
13687 <= norm(z) / (r - norm(z)) * C`
13688 (LABEL_TAC "+") THENL
13689 [REPEAT STRIP_TAC THEN
13691 `!R. norm z < R /\ R < r
13692 ==> norm(complex_derivative f z - complex_derivative f (Cx(&0)))
13693 <= norm(z) / (R - norm(z)) * C`
13695 [REPEAT STRIP_TAC THEN
13697 [`complex_derivative f`;
13699 `circlepath(Cx(&0),R)`]
13700 CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE) THEN
13701 REWRITE_TAC[CONVEX_CBALL; VALID_PATH_CIRCLEPATH; INTERIOR_CBALL;
13702 PATHSTART_CIRCLEPATH; PATHFINISH_CIRCLEPATH] THEN
13703 SUBGOAL_THEN `&0 < R` ASSUME_TAC THENL
13704 [ASM_MESON_TAC[REAL_LET_TRANS; NORM_POS_LE]; ALL_TAC] THEN
13705 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_LT_IMP_LE] THEN
13706 REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
13707 REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_CBALL; IN_BALL; IN_DELETE] THEN
13708 SIMP_TAC[WINDING_NUMBER_CIRCLEPATH; COMPLEX_SUB_RZERO; COMPLEX_SUB_LZERO;
13709 dist; NORM_NEG; REAL_LE_REFL; MESON[REAL_LT_REFL]
13710 `norm z < R /\ (!w. norm w = R ==> ~(w = z)) <=> norm z < R`] THEN
13711 REWRITE_TAC[RIGHT_FORALL_IMP_THM; IMP_CONJ] THEN ANTS_TAC THENL
13712 [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13713 EXISTS_TAC `ball(Cx(&0),r)` THEN CONJ_TAC THENL
13714 [MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
13715 REWRITE_TAC[OPEN_BALL] THEN
13716 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
13717 EXISTS_TAC `cball(Cx(&0),r)` THEN ASM_REWRITE_TAC[BALL_SUBSET_CBALL];
13718 ASM_REWRITE_TAC[SUBSET_BALLS; DIST_REFL; REAL_ADD_LID]];
13719 REWRITE_TAC[COMPLEX_MUL_LID]] THEN
13720 DISCH_THEN(fun th ->
13721 MP_TAC (CONJ (SPEC `z:complex` th) (SPEC `Cx(&0)` th))) THEN
13722 ASM_REWRITE_TAC[COMPLEX_NORM_0; COMPLEX_SUB_RZERO] THEN
13723 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
13724 DISCH_THEN(MP_TAC o SPEC `C * norm(z) / (R * (R - norm(z:complex)))` o
13725 MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
13726 HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH)) THEN
13727 ASM_REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB] THEN
13728 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
13729 REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_LID; REAL_ABS_PI] THEN
13730 ASM_SIMP_TAC[REAL_FIELD
13732 ==> (C * z / (R * (R - z))) * &2 * pi * R =
13733 &2 * pi * z / (R - z) * C`] THEN
13734 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH `&0 < &2`; PI_POS] THEN
13735 DISCH_THEN MATCH_MP_TAC THEN
13736 ASM_SIMP_TAC[REAL_LE_MUL_EQ; REAL_LE_DIV; REAL_LE_MUL; REAL_SUB_LE;
13737 REAL_LT_IMP_LE; NORM_POS_LE; COMPLEX_SUB_RZERO] THEN
13738 X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
13739 SUBGOAL_THEN `~(x = Cx(&0)) /\ ~(x = z)` STRIP_ASSUME_TAC THENL
13740 [ASM_MESON_TAC[REAL_LT_REFL; COMPLEX_NORM_0]; ALL_TAC] THEN
13741 ASM_SIMP_TAC[COMPLEX_FIELD
13742 `~(x = Cx(&0)) /\ ~(x = z)
13743 ==> d / (x - z) - d / x = d * z / (x * (x - z))`] THEN
13744 REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
13745 ASM_SIMP_TAC[NORM_POS_LE; REAL_LT_IMP_LE; IN_BALL; dist; NORM_NEG;
13746 COMPLEX_SUB_LZERO] THEN
13747 REWRITE_TAC[COMPLEX_NORM_DIV; real_div] THEN
13748 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
13749 MATCH_MP_TAC REAL_LE_INV2 THEN
13750 ASM_SIMP_TAC[REAL_LT_MUL; REAL_SUB_LT; COMPLEX_NORM_MUL] THEN
13751 ASM_SIMP_TAC[REAL_LE_LMUL_EQ] THEN
13752 UNDISCH_TAC `norm(x:complex) = R` THEN CONV_TAC NORM_ARITH;
13753 DISCH_TAC THEN MP_TAC(ISPECL
13754 [`\x. lift(norm(z:complex) / (drop x - norm z) * C)`;
13755 `interval(lift((norm(z:complex) + r) / &2),lift r)`; `lift r`;
13756 `norm(complex_derivative f z - complex_derivative f (Cx(&0)))`;
13757 `1`] CONTINUOUS_ON_CLOSURE_COMPONENT_GE) THEN
13758 REWRITE_TAC[GSYM drop; LIFT_DROP; CLOSURE_INTERVAL] THEN
13759 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[INTERVAL_EQ_EMPTY_1] THEN
13760 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
13761 REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN DISCH_TAC THEN
13762 ASM_SIMP_TAC[ENDS_IN_INTERVAL; INTERVAL_EQ_EMPTY_1; LIFT_DROP; REAL_ARITH
13763 `z < r ==> ~(r <= (z + r) / &2) /\ ~(r < (z + r) / &2)`] THEN
13764 REWRITE_TAC[FORALL_LIFT; LIFT_DROP; IN_INTERVAL_1] THEN
13767 ASM_MESON_TAC[REAL_ARITH `(z + r) / &2 < R /\ R < r ==> z < R`]] THEN
13768 REWRITE_TAC[LIFT_CMUL; real_div] THEN
13769 MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
13770 REWRITE_TAC[CONTINUOUS_ON_CONST; o_DEF; LIFT_CMUL] THEN
13771 MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
13772 REWRITE_TAC[CONTINUOUS_ON_CONST; o_DEF; LIFT_CMUL] THEN
13773 MATCH_MP_TAC(REWRITE_RULE[o_DEF] CONTINUOUS_ON_INV) THEN
13774 SIMP_TAC[LIFT_SUB; CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; LIFT_DROP;
13775 CONTINUOUS_ON_LIFT_NORM_COMPOSE; CONTINUOUS_ON_ID] THEN
13776 REWRITE_TAC[IN_INTERVAL_1; DROP_CMUL; LIFT_DROP] THEN
13777 ASM_REAL_ARITH_TAC];
13780 `!z. z IN ball(Cx(&0),r)
13781 ==> (norm(z) - norm(z) pow 2 / (r - norm(z))) *
13782 norm(complex_derivative f (Cx(&0)))
13784 (LABEL_TAC "*") THENL
13785 [REPEAT STRIP_TAC THEN
13786 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
13787 REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN DISCH_TAC THEN
13788 MP_TAC(ISPECL[`\z. f(z) - complex_derivative f (Cx(&0)) * z`;
13789 `\z. complex_derivative f z - complex_derivative f (Cx(&0))`;
13790 `linepath(Cx(&0),z)`; `ball(Cx(&0),r)`]
13791 PATH_INTEGRAL_PRIMITIVE) THEN
13792 REWRITE_TAC[PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN ANTS_TAC THENL
13793 [REWRITE_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH] THEN
13794 ONCE_REWRITE_TAC[COMPLEX_RING
13795 `a - complex_derivative f b = a - complex_derivative f b * Cx(&1)`] THEN
13797 [X_GEN_TAC `x:complex` THEN STRIP_TAC THEN
13798 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN
13799 SIMP_TAC[HAS_COMPLEX_DERIVATIVE_LMUL_WITHIN;
13800 HAS_COMPLEX_DERIVATIVE_ID] THEN
13801 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
13802 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
13803 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
13804 DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
13805 ASM_SIMP_TAC[REWRITE_RULE[SUBSET] BALL_SUBSET_CBALL] THEN
13806 REWRITE_TAC[GSYM complex_differentiable] THEN
13807 DISCH_THEN(MP_TAC o SPEC `ball(Cx(&0),r)` o
13808 MATCH_MP (REWRITE_RULE[IMP_CONJ]
13809 COMPLEX_DIFFERENTIABLE_WITHIN_SUBSET)) THEN
13810 ASM_SIMP_TAC[COMPLEX_DIFFERENTIABLE_WITHIN_OPEN; OPEN_BALL] THEN
13811 REWRITE_TAC[BALL_SUBSET_CBALL];
13812 MATCH_MP_TAC(REWRITE_RULE[CONVEX_CONTAINS_SEGMENT] CONVEX_BALL) THEN
13813 ASM_REWRITE_TAC[CENTRE_IN_BALL]];
13815 SIMP_TAC[HAS_INTEGRAL_INTEGRABLE_INTEGRAL; HAS_PATH_INTEGRAL_LINEPATH] THEN
13816 REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_MUL_RZERO] THEN
13817 REWRITE_TAC[linepath; COMPLEX_CMUL; COMPLEX_MUL_RZERO; LIFT_DROP] THEN
13818 REWRITE_TAC[COMPLEX_ADD_LID; FORALL_LIFT; IN_INTERVAL_1; LIFT_DROP] THEN
13819 STRIP_TAC THEN FIRST_ASSUM(MP_TAC o
13820 SPEC `\t. lift(norm(z:complex) pow 2 * drop t / (r - norm(z)) * C)` o
13821 MATCH_MP (REWRITE_RULE[IMP_CONJ] INTEGRAL_NORM_BOUND_INTEGRAL)) THEN
13822 REWRITE_TAC[linepath; COMPLEX_CMUL; COMPLEX_MUL_RZERO; LIFT_DROP] THEN
13823 REWRITE_TAC[COMPLEX_ADD_LID; FORALL_LIFT; IN_INTERVAL_1; LIFT_DROP] THEN
13824 REWRITE_TAC[REAL_ARITH `a * b / c * d:real = (a / c * d) * b`] THEN
13825 REWRITE_TAC[LIFT_CMUL; LIFT_DROP; DROP_VEC] THEN
13827 [`\x. inv(&2) * x pow 2`; `\x:real. x`; `&0`; `&1`]
13828 REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN
13829 REWRITE_TAC[REAL_POS] THEN ANTS_TAC THENL
13830 [REPEAT STRIP_TAC THEN REAL_DIFF_TAC THEN CONV_TAC NUM_REDUCE_CONV THEN
13832 REWRITE_TAC[has_real_integral; o_DEF; IMAGE_LIFT_REAL_INTERVAL] THEN
13833 CONV_TAC REAL_RAT_REDUCE_CONV THEN REWRITE_TAC[LIFT_DROP; LIFT_NUM] THEN
13834 DISCH_THEN(MP_TAC o SPEC `norm(z:complex) pow 2 / (r - norm z) * C` o
13835 MATCH_MP HAS_INTEGRAL_CMUL) THEN
13836 REWRITE_TAC[HAS_INTEGRAL_INTEGRABLE_INTEGRAL] THEN
13837 STRIP_TAC THEN ASM_REWRITE_TAC[]] THEN
13839 [X_GEN_TAC `t:real` THEN STRIP_TAC THEN
13840 REWRITE_TAC[REAL_ARITH
13841 `(z pow 2 / y * c) * t:real = (z / y * t * c) * z`] THEN
13842 REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
13843 REWRITE_TAC[NORM_POS_LE] THEN
13844 REMOVE_THEN "+" (MP_TAC o SPEC `Cx(t) * z`) THEN
13845 REWRITE_TAC[IN_BALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
13846 SUBGOAL_THEN `norm(Cx t * z) <= norm z` ASSUME_TAC THENL
13847 [GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
13848 REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
13849 REWRITE_TAC[NORM_POS_LE; COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
13851 ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13852 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
13853 ASM_SIMP_TAC[REAL_LE_RMUL_EQ; REAL_MUL_ASSOC; real_div] THEN
13854 ASM_REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; real_abs] THEN
13855 GEN_REWRITE_TAC LAND_CONV
13856 [REAL_ARITH `(t * z) * w:real = (z * w) * t`] THEN
13857 MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN
13858 MATCH_MP_TAC REAL_LE_MUL2 THEN
13859 REWRITE_TAC[NORM_POS_LE; REAL_LE_INV_EQ; REAL_SUB_LE] THEN
13860 REWRITE_TAC[REAL_LE_REFL] THEN CONJ_TAC THENL
13861 [ALL_TAC; MATCH_MP_TAC REAL_LE_INV2] THEN
13862 ASM_REWRITE_TAC[REAL_SUB_LT] THEN FIRST_X_ASSUM(MP_TAC o
13863 GEN_REWRITE_RULE LAND_CONV [COMPLEX_NORM_MUL]) THEN
13864 REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
13865 REWRITE_TAC[COMPLEX_SUB_RZERO]] THEN
13866 MATCH_MP_TAC(NORM_ARITH
13867 `abc <= norm d - e ==> norm(f - d) <= e ==> abc <= norm f`) THEN
13868 REWRITE_TAC[REAL_SUB_RDISTRIB;
13869 ONCE_REWRITE_RULE[COMPLEX_MUL_SYM] COMPLEX_NORM_MUL] THEN
13870 MATCH_MP_TAC(REAL_ARITH `y <= x ==> a - x <= a - y`) THEN
13871 REWRITE_TAC[DROP_CMUL; GSYM REAL_MUL_ASSOC; LIFT_DROP] THEN
13872 MATCH_MP_TAC REAL_LE_LMUL THEN
13873 ASM_SIMP_TAC[REAL_LE_DIV; REAL_SUB_LE; REAL_LT_IMP_LE; REAL_LE_POW_2] THEN
13874 EXPAND_TAC "C" THEN REAL_ARITH_TAC;
13876 MATCH_MP_TAC SUBSET_TRANS THEN
13877 EXISTS_TAC `IMAGE (f:complex->complex)
13878 (ball(Cx(&0),(&1 - sqrt(&2) / &2) * r))` THEN
13879 SUBGOAL_THEN `&0 < &1 - sqrt(&2) / &2 /\ &1 - sqrt(&2) / &2 < &1`
13880 STRIP_ASSUME_TAC THENL
13881 [REWRITE_TAC[REAL_ARITH
13882 `&0 < &1 - s / &2 /\ &1 - s / &2 < &1 <=> &0 < s /\ s < &2`] THEN
13884 [MATCH_MP_TAC REAL_LT_RSQRT; MATCH_MP_TAC REAL_LT_LSQRT] THEN
13889 MATCH_MP_TAC IMAGE_SUBSET THEN MATCH_MP_TAC SUBSET_BALL THEN
13890 REWRITE_TAC[REAL_ARITH `x * r <= r <=> &0 <= r * (&1 - x)`] THEN
13891 MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC] THEN
13892 FIRST_ASSUM(fun th ->
13893 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o LAND_CONV) [SYM th]) THEN
13894 MATCH_MP_TAC BALL_SUBSET_OPEN_MAP_IMAGE THEN
13895 ASM_SIMP_TAC[REAL_LT_MUL; BOUNDED_BALL; CLOSURE_BALL; CENTRE_IN_BALL] THEN
13896 REPEAT CONJ_TAC THENL
13897 [MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
13898 EXISTS_TAC `cball(Cx(&0),r)` THEN
13899 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
13900 MATCH_MP_TAC SUBSET_CBALL THEN
13901 REWRITE_TAC[REAL_ARITH `x * r <= r <=> &0 <= r * (&1 - x)`] THEN
13902 MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC;
13903 MATCH_MP_TAC(REWRITE_RULE[RIGHT_IMP_FORALL_THM; IMP_IMP]
13904 OPEN_MAPPING_THM) THEN
13905 EXISTS_TAC `ball(Cx(&0),r)` THEN
13906 ASM_SIMP_TAC[OPEN_BALL; CONNECTED_BALL; INTERIOR_OPEN; SUBSET_REFL] THEN
13907 REPEAT CONJ_TAC THENL
13908 [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; BALL_SUBSET_CBALL];
13910 MATCH_MP_TAC SUBSET_BALL THEN
13911 REWRITE_TAC[REAL_ARITH `x * r <= r <=> &0 <= r * (&1 - x)`] THEN
13912 MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC] THEN
13913 DISCH_THEN(X_CHOOSE_TAC `y:complex`) THEN
13915 [`f:complex->complex`; `(\x. y):complex->complex`;
13916 `ball(Cx(&0),r)`; `Cx(&0)`]
13917 COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN) THEN
13918 ASM_REWRITE_TAC[OPEN_BALL; HOLOMORPHIC_ON_CONST; COMPLEX_DERIVATIVE_CONST;
13919 CENTRE_IN_BALL] THEN
13920 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; BALL_SUBSET_CBALL];
13921 REPEAT(MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC) THEN
13922 ASM_REWRITE_TAC[REAL_ARITH `&0 < &3 - &2 * s <=> s < &3 / &2`] THEN
13923 ASM_REAL_ARITH_TAC;
13925 ASM_SIMP_TAC[FRONTIER_BALL; sphere; REAL_LT_MUL; dist; IN_ELIM_THM] THEN
13926 X_GEN_TAC `z:complex` THEN REWRITE_TAC[COMPLEX_SUB_LZERO; NORM_NEG] THEN
13927 DISCH_TAC THEN REMOVE_THEN "*" (MP_TAC o SPEC `z:complex`) THEN
13928 ASM_REWRITE_TAC[IN_BALL; dist; COMPLEX_SUB_LZERO; COMPLEX_SUB_RZERO] THEN
13929 ASM_REWRITE_TAC[NORM_NEG] THEN ANTS_TAC THENL
13930 [REWRITE_TAC[REAL_ARITH `x * r < r <=> &0 < r * (&1 - x)`] THEN
13931 MATCH_MP_TAC REAL_LT_MUL THEN ASM_REAL_ARITH_TAC;
13932 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LE_TRANS)] THEN
13933 REWRITE_TAC[REAL_MUL_ASSOC] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
13934 REWRITE_TAC[NORM_POS_LE; REAL_ARITH `r - (&1 - s) * r = s * r`] THEN
13935 REWRITE_TAC[real_div; REAL_INV_MUL; REAL_INV_INV] THEN
13936 ASM_SIMP_TAC[REAL_LE_RMUL_EQ; REAL_FIELD
13938 ==> a * r - (b * r) pow 2 * x * inv r = (a - b pow 2 * x) * r`] THEN
13939 MATCH_MP_TAC REAL_EQ_IMP_LE THEN
13940 MP_TAC(SPEC `&2` SQRT_WORKS) THEN CONV_TAC REAL_FIELD);;
13942 let BLOCH_UNIT = prove
13943 (`!f a. f holomorphic_on ball(a,&1) /\
13944 complex_derivative f a = Cx(&1)
13945 ==> ?b r. &1 / &12 < r /\ ball(b,r) SUBSET IMAGE f (ball(a,&1))`,
13946 REPEAT STRIP_TAC THEN ABBREV_TAC `r = &249 / &256` THEN
13947 SUBGOAL_THEN `&0 < r` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13948 ABBREV_TAC `g = \z. complex_derivative f z * Cx(r - norm(z - a))` THEN
13949 MP_TAC(ISPECL [`IMAGE (g:complex->complex) (cball(a,r))`; `Cx(&0)`]
13950 DISTANCE_ATTAINS_SUP) THEN
13952 [ASM_REWRITE_TAC[IMAGE_EQ_EMPTY; CBALL_EQ_EMPTY] THEN
13953 CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
13954 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN REWRITE_TAC[COMPACT_CBALL] THEN
13955 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN EXISTS_TAC `ball(a:complex,&1)` THEN
13956 REWRITE_TAC[SUBSET_BALLS; DIST_REFL] THEN
13957 CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN EXPAND_TAC "g" THEN
13958 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN CONJ_TAC THENL
13959 [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
13960 ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; ETA_AX; OPEN_BALL];
13961 REWRITE_TAC[CONTINUOUS_ON_CX_LIFT; LIFT_SUB] THEN
13962 MATCH_MP_TAC CONTINUOUS_ON_SUB THEN REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
13963 MATCH_MP_TAC CONTINUOUS_ON_LIFT_NORM_COMPOSE THEN
13964 SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_ID; CONTINUOUS_ON_CONST]];
13965 REWRITE_TAC[EXISTS_IN_IMAGE; FORALL_IN_IMAGE; IN_CBALL] THEN
13966 REWRITE_TAC[NORM_ARITH `dist(a,b) = norm(b - a)`] THEN
13967 REWRITE_TAC[COMPLEX_SUB_RZERO] THEN
13968 DISCH_THEN(X_CHOOSE_THEN `p:complex` STRIP_ASSUME_TAC)] THEN
13969 SUBGOAL_THEN `norm(p - a:complex) < r` ASSUME_TAC THENL
13970 [ASM_REWRITE_TAC[REAL_LT_LE] THEN DISCH_TAC THEN
13971 FIRST_X_ASSUM(MP_TAC o SPEC `a:complex`) THEN
13972 ASM_SIMP_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; REAL_LT_IMP_LE] THEN
13973 EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
13974 ASM_REWRITE_TAC[REAL_SUB_REFL; COMPLEX_SUB_RZERO; COMPLEX_NORM_CX] THEN
13975 REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0] THEN ASM_REAL_ARITH_TAC;
13977 ABBREV_TAC `t = (r - norm(p - a:complex)) / &2` THEN
13978 SUBGOAL_THEN `&0 < t` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
13979 EXISTS_TAC `(f:complex->complex) p` THEN
13980 EXISTS_TAC `(&3 - &2 * sqrt (&2)) * t * norm (complex_derivative f p)` THEN
13981 MP_TAC(ISPECL [`f:complex->complex`; `p:complex`; `t:real`]
13983 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
13985 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13986 HOLOMORPHIC_ON_SUBSET)) THEN
13987 REWRITE_TAC[SUBSET_BALLS; dist; COMPLEX_SUB_RZERO] THEN
13988 ASM_REAL_ARITH_TAC;
13989 X_GEN_TAC `z:complex` THEN REWRITE_TAC[IN_BALL] THEN DISCH_TAC THEN
13990 SUBGOAL_THEN `norm(z - a:complex) < r` ASSUME_TAC THENL
13991 [REPEAT(POP_ASSUM MP_TAC) THEN NORM_ARITH_TAC; ALL_TAC] THEN
13992 FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`) THEN
13993 ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN EXPAND_TAC "g" THEN
13994 REWRITE_TAC[COMPLEX_NORM_MUL] THEN
13995 ASM_SIMP_TAC[COMPLEX_NORM_CX; GSYM REAL_LE_RDIV_EQ;
13996 REAL_ARITH `z < r ==> &0 < abs(r - z)`] THEN
13997 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
13998 GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
13999 REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
14000 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
14001 ASM_SIMP_TAC[GSYM real_div; REAL_LE_LDIV_EQ; REAL_ARITH
14002 `z < r ==> &0 < abs(r - z)`] THEN
14003 REPEAT(POP_ASSUM MP_TAC) THEN NORM_ARITH_TAC];
14004 DISCH_TAC THEN CONJ_TAC THENL
14005 [FIRST_X_ASSUM(MP_TAC o SPEC `a:complex`) THEN
14006 ASM_SIMP_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; REAL_LT_IMP_LE] THEN
14007 EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
14008 ASM_REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_MUL_LID] THEN
14009 ASM_SIMP_TAC[REAL_SUB_RZERO; real_abs; REAL_SUB_LE; REAL_LT_IMP_LE;
14010 COMPLEX_SUB_REFL; COMPLEX_NORM_0] THEN
14011 EXPAND_TAC "t" THEN
14012 REWRITE_TAC[REAL_ARITH
14013 `a < b * c / &2 * d <=> a < (d * c) * (b / &2)`] THEN
14014 SUBGOAL_THEN `sqrt (&2) < &2113 / &1494` ASSUME_TAC THENL
14015 [MATCH_MP_TAC REAL_LT_LSQRT THEN CONV_TAC REAL_RAT_REDUCE_CONV;
14017 SUBGOAL_THEN `&0 < &3 - &2 * sqrt(&2)` ASSUME_TAC THENL
14018 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
14019 ASM_SIMP_TAC[GSYM REAL_LT_LDIV_EQ; REAL_HALF] THEN
14020 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LTE_TRANS) THEN
14021 ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_HALF] THEN
14022 EXPAND_TAC "r" THEN ASM_REAL_ARITH_TAC;
14023 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14024 SUBSET_TRANS)) THEN
14025 MATCH_MP_TAC IMAGE_SUBSET THEN
14026 REWRITE_TAC[SUBSET_BALLS; dist; COMPLEX_SUB_RZERO] THEN
14027 REPEAT(POP_ASSUM MP_TAC) THEN NORM_ARITH_TAC]]);;
14031 &0 < r /\ f holomorphic_on ball(a,r) /\
14032 r' <= r * norm(complex_derivative f a) / &12
14033 ==> ?b. ball(b,r') SUBSET IMAGE f (ball(a,r))`,
14034 REPEAT GEN_TAC THEN
14035 ASM_CASES_TAC `complex_derivative f a = Cx(&0)` THENL
14036 [ASM_SIMP_TAC[COMPLEX_NORM_0; real_div; REAL_MUL_RZERO; REAL_MUL_LZERO;
14037 BALL_EMPTY; EMPTY_SUBSET];
14039 ABBREV_TAC `C = complex_derivative f a` THEN
14040 SUBGOAL_THEN `&0 < norm(C:complex)` ASSUME_TAC THENL
14041 [ASM_MESON_TAC[COMPLEX_NORM_NZ]; STRIP_TAC] THEN
14043 [`\z. (f:complex->complex)(a + Cx r * z) / (C * Cx r)`; `Cx(&0)`]
14046 `!z. z IN ball(Cx(&0),&1)
14047 ==> ((\z. f (a + Cx r * z) / (C * Cx r)) has_complex_derivative
14048 (complex_derivative f (a + Cx r * z) / C)) (at z)`
14050 [REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
14052 `complex_derivative f (a + Cx r * z) / C =
14053 (complex_derivative f (a + Cx r * z) * Cx r) / (C * Cx r)`
14055 [ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ; COMPLEX_FIELD
14056 `~(r = Cx(&0)) /\ ~(c = Cx(&0)) ==> (d * r) / (c * r) = d / c`];
14058 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_CDIV_AT THEN
14059 GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
14060 MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN CONJ_TAC THENL
14061 [COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING; ALL_TAC] THEN
14062 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14063 FIRST_ASSUM(MATCH_MP_TAC o
14064 MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
14065 HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT)) THEN
14066 REWRITE_TAC[OPEN_BALL; IN_BALL; NORM_ARITH `dist(a,a + b) = norm b`] THEN
14067 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
14068 ASM_SIMP_TAC[REAL_ARITH `&0 < r ==> (abs r * z < r <=> &0 < r * (&1 - z))`;
14069 REAL_LT_MUL; REAL_SUB_LT];
14072 [SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL] THEN
14073 CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
14074 FIRST_X_ASSUM(MP_TAC o SPEC `Cx(&0)`) THEN
14075 ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_LT_01] THEN
14076 DISCH_THEN(SUBST1_TAC o MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
14077 ASM_SIMP_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_RID; COMPLEX_DIV_REFL];
14079 REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
14080 MAP_EVERY X_GEN_TAC [`b:complex`; `t:real`] THEN STRIP_TAC THEN
14081 EXISTS_TAC `(C * Cx r) * b` THEN
14082 FIRST_ASSUM(MP_TAC o ISPEC `\z. (C * Cx r) * z` o MATCH_MP IMAGE_SUBSET) THEN
14083 REWRITE_TAC[GSYM IMAGE_o; o_DEF] THEN
14084 ASM_SIMP_TAC[COMPLEX_DIV_LMUL; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
14085 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o LAND_CONV) [GSYM o_DEF] THEN
14086 REWRITE_TAC[IMAGE_o] THEN MATCH_MP_TAC(SET_RULE
14087 `v SUBSET s /\ t SUBSET w
14088 ==> s SUBSET IMAGE f t ==> v SUBSET IMAGE f w`) THEN
14090 [REWRITE_TAC[SUBSET; IN_IMAGE; IN_BALL; dist] THEN
14091 X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
14092 EXISTS_TAC `x / (C * Cx r)` THEN
14093 ASM_SIMP_TAC[COMPLEX_DIV_LMUL; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
14094 MATCH_MP_TAC REAL_LT_LCANCEL_IMP THEN EXISTS_TAC `norm(C * Cx r)` THEN
14095 ASM_SIMP_TAC[COMPLEX_NORM_NZ; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
14096 REWRITE_TAC[GSYM COMPLEX_NORM_MUL; COMPLEX_SUB_LDISTRIB] THEN
14097 ASM_SIMP_TAC[COMPLEX_DIV_LMUL; COMPLEX_ENTIRE; CX_INJ; REAL_LT_IMP_NZ] THEN
14098 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14099 REAL_LTE_TRANS)) THEN
14100 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14101 REAL_LE_TRANS)) THEN
14102 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
14103 ASM_SIMP_TAC[REAL_ARITH `&0 < r ==> a * abs r = r * a`] THEN
14104 ASM_REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
14105 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; COMPLEX_NORM_NZ] THEN ASM_REAL_ARITH_TAC;
14106 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0] THEN
14107 REWRITE_TAC[OPEN_BALL; IN_BALL; NORM_ARITH `dist(a,a + b) = norm b`] THEN
14108 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
14109 ASM_SIMP_TAC[REAL_ARITH `&0 < r ==> (abs r * z < r <=> &0 < r * (&1 - z))`;
14110 REAL_LT_MUL; REAL_SUB_LT]]);;
14112 let BLOCH_COROLLARY = prove
14114 f holomorphic_on s /\ a IN s /\
14115 (!z. z IN frontier s ==> t <= dist(a,z)) /\
14116 r <= t * norm(complex_derivative f a) / &12
14117 ==> ?b. ball(b,r) SUBSET IMAGE f s`,
14118 REPEAT STRIP_TAC THEN FIRST_ASSUM(DISJ_CASES_THEN MP_TAC o
14119 MATCH_MP (REAL_ARITH `r <= t ==> r <= &0 \/ &0 < t`)) THEN
14120 SIMP_TAC[BALL_EMPTY; EMPTY_SUBSET] THEN
14121 ASM_CASES_TAC `complex_derivative f a = Cx(&0)` THEN
14122 ASM_REWRITE_TAC[COMPLEX_NORM_0] THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
14123 ASM_SIMP_TAC[REAL_LT_MUL_EQ; REAL_ARITH `&0 < x / &12 <=> &0 < x`;
14124 COMPLEX_NORM_NZ] THEN
14126 SUBGOAL_THEN `ball(a:complex,t) SUBSET s` ASSUME_TAC THENL
14127 [MP_TAC(ISPECL [`ball(a:complex,t)`; `s:complex->bool`]
14128 CONNECTED_INTER_FRONTIER) THEN
14129 REWRITE_TAC[CONNECTED_BALL; SET_RULE `s DIFF t = {} <=> s SUBSET t`] THEN
14130 MATCH_MP_TAC(TAUT `~p /\ r ==> (~p /\ ~q ==> ~r) ==> q`) THEN
14132 [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `a:complex` THEN
14134 ASM_REWRITE_TAC[IN_INTER; CENTRE_IN_BALL];
14135 REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_BALL] THEN
14136 ASM_MESON_TAC[REAL_NOT_LE]];
14139 [`f:complex->complex`; `a:complex`; `t:real`; `r:real`] BLOCH) THEN
14140 ASM_REWRITE_TAC[] THEN
14141 ANTS_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ALL_TAC] THEN
14142 MATCH_MP_TAC MONO_EXISTS THEN ASM SET_TAC[]);;
14144 (* ------------------------------------------------------------------------- *)
14145 (* Schottky's theorem. *)
14146 (* ------------------------------------------------------------------------- *)
14148 let SCHOTTKY = prove
14149 (`!f r. f holomorphic_on cball(Cx(&0),&1) /\ norm(f(Cx(&0))) <= r /\
14150 (!z. z IN cball(Cx(&0),&1) ==> ~(f z = Cx(&0) \/ f z = Cx(&1)))
14151 ==> !t z. &0 < t /\ t < &1 /\ norm(z) <= t
14153 <= exp(pi * exp(pi *
14154 (&2 + &2 * r + &12 * t / (&1 - t))))`,
14157 f holomorphic_on s /\
14160 (!z. z IN s ==> ~(f z = Cx(&1)) /\ ~(f z = --Cx(&1)))
14161 ==> (?g. g holomorphic_on s /\
14162 norm(g a) <= &1 + norm(f a) / &3 /\
14163 (!z. z IN s ==> f z = ccos(Cx pi * g z)))`,
14164 REPEAT GEN_TAC THEN
14165 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC o MATCH_MP
14166 CONTRACTIBLE_IMP_HOLOMORPHIC_ACS_BOUNDED) THEN
14167 EXISTS_TAC `\z:complex. g z / Cx pi` THEN
14168 ASM_SIMP_TAC[COMPLEX_DIV_LMUL; CX_INJ; PI_NZ; COMPLEX_NORM_DIV;
14169 HOLOMORPHIC_ON_DIV; HOLOMORPHIC_ON_CONST; REAL_LE_LDIV_EQ;
14170 COMPLEX_NORM_CX; REAL_ABS_PI; PI_POS] THEN
14171 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
14172 `x <= pi + a ==> a * &3 <= n * pi ==> x <= (&1 + n / &3) * pi`)) THEN
14173 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
14174 MP_TAC PI_APPROX_32 THEN REAL_ARITH_TAC) in
14176 (`!n. 0 < n ==> &0 < &n + sqrt(&n pow 2 - &1)`,
14177 MESON_TAC[REAL_LTE_ADD; REAL_OF_NUM_LT; SQRT_POS_LE; REAL_POW_LE_1;
14178 REAL_SUB_LE; REAL_OF_NUM_LE; LE_1]) in
14182 abs(x - log(&n + sqrt(&n pow 2 - &1)) / pi) < &1 / &2`,
14183 REPEAT STRIP_TAC THEN MP_TAC(SPEC
14184 `\n. 0 < n /\ log(&n + sqrt(&n pow 2 - &1)) / pi <= x` num_MAX) THEN
14186 MATCH_MP_TAC(TAUT `p /\ (q ==> r) ==> (p <=> q) ==> r`) THEN
14187 REPEAT CONJ_TAC THENL
14188 [EXISTS_TAC `1` THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
14189 ASM_REWRITE_TAC[ARITH; SQRT_0; REAL_ADD_RID; LOG_1] THEN
14190 REWRITE_TAC[real_div; REAL_MUL_LZERO] THEN ASM_REAL_ARITH_TAC;
14191 MP_TAC(ISPEC `exp(x * pi)` REAL_ARCH_SIMPLE) THEN
14192 MATCH_MP_TAC MONO_EXISTS THEN
14193 X_GEN_TAC `n:num` THEN DISCH_TAC THEN X_GEN_TAC `m:num` THEN
14194 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
14195 SIMP_TAC[REAL_LE_LDIV_EQ; PI_POS] THEN
14196 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_EXP_MONO_LE] THEN
14197 ASM_SIMP_TAC[lemma1; EXP_LOG] THEN
14198 REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN MATCH_MP_TAC(REAL_ARITH
14199 `e <= n /\ &0 <= x ==> m + x <= e ==> m <= n`) THEN
14200 ASM_SIMP_TAC[SQRT_POS_LE; REAL_POW_LE_1; REAL_SUB_LE;
14201 REAL_OF_NUM_LE; LE_1];
14202 DISCH_THEN(X_CHOOSE_THEN `n:num`
14203 (CONJUNCTS_THEN2 (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)
14204 (MP_TAC o SPEC `n + 1`))) THEN
14205 REWRITE_TAC[ARITH_RULE `~(n + 1 <= n) /\ 0 < n + 1`] THEN
14206 REWRITE_TAC[REAL_NOT_LE; IMP_IMP] THEN
14207 DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
14208 `x < b /\ a <= x ==> b - a < &1
14209 ==> abs(x - a) < &1 / &2 \/ abs(x - b) < &1 / &2`)) THEN
14210 ANTS_TAC THENL [ALL_TAC; ASM_MESON_TAC[ARITH_RULE `0 < n + 1`]] THEN
14211 REWRITE_TAC[REAL_ARITH `x / pi - y / pi = (x - y) / pi`] THEN
14212 SIMP_TAC[PI_POS; REAL_LT_LDIV_EQ; REAL_MUL_LID] THEN
14213 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&3` THEN
14214 CONJ_TAC THENL [ALL_TAC; MP_TAC PI_APPROX_32 THEN REAL_ARITH_TAC] THEN
14215 ASM_SIMP_TAC[lemma1; GSYM LOG_DIV; ARITH_RULE `0 < n + 1`] THEN
14216 FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP (ARITH_RULE
14217 `0 < n ==> n = 1 \/ 2 <= n`))
14219 [ASM_REWRITE_TAC[] THEN CONV_TAC NUM_REDUCE_CONV THEN
14220 CONV_TAC REAL_RAT_REDUCE_CONV THEN
14221 REWRITE_TAC[SQRT_0; REAL_ADD_RID; REAL_DIV_1] THEN
14222 ONCE_REWRITE_TAC[GSYM REAL_EXP_MONO_LE] THEN
14223 SIMP_TAC[EXP_LOG; REAL_LTE_ADD; SQRT_POS_LE; REAL_POS; REAL_OF_NUM_LT;
14225 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&1 + &3` THEN
14226 SIMP_TAC[REAL_EXP_LE_X; REAL_POS] THEN
14227 REWRITE_TAC[REAL_ARITH `&2 + s <= a <=> s <= a - &2`] THEN
14228 MATCH_MP_TAC REAL_LE_LSQRT THEN CONV_TAC REAL_RAT_REDUCE_CONV;
14229 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `log(&2)` THEN
14231 [MATCH_MP_TAC LOG_MONO_LE_IMP THEN
14232 ASM_SIMP_TAC[lemma1; ARITH_RULE `0 < n + 1`; REAL_LT_DIV;
14233 REAL_LE_LDIV_EQ] THEN
14234 REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN MATCH_MP_TAC(REAL_ARITH
14235 `&1 <= n /\ s <= &2 * t ==> (n + &1) + s <= &2 * (n + t)`) THEN
14236 ASM_SIMP_TAC[REAL_OF_NUM_LE; LE_1] THEN
14237 MATCH_MP_TAC REAL_LE_LSQRT THEN
14238 ASM_SIMP_TAC[REAL_SUB_LE; REAL_POW_LE_1; REAL_ARITH `&1 <= &n + &1`;
14239 REAL_ARITH `&0 <= &2 * x <=> &0 <= x`; REAL_POW_MUL; SQRT_POW_2;
14240 REAL_LE_MUL; REAL_POS; SQRT_POS_LE; REAL_OF_NUM_LE; LE_1] THEN
14241 MATCH_MP_TAC(REAL_ARITH
14242 `&2 <= n /\ &2 * n <= n * n
14243 ==> (n + &1) pow 2 - &1 <= &2 pow 2 * (n pow 2 - &1)`) THEN
14244 ASM_SIMP_TAC[REAL_LE_RMUL; REAL_OF_NUM_LE; LE_0];
14245 ONCE_REWRITE_TAC[GSYM REAL_EXP_MONO_LE] THEN
14246 SIMP_TAC[EXP_LOG; REAL_OF_NUM_LT; ARITH] THEN
14247 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&1 + &3` THEN
14248 SIMP_TAC[REAL_EXP_LE_X; REAL_POS] THEN REAL_ARITH_TAC]]]) in
14252 ({complex(m,log(&n + sqrt(&n pow 2 - &1)) / pi) | integer m /\ 0 < n}
14254 {complex(m,--log(&n + sqrt(&n pow 2 - &1)) / pi) | integer m /\ 0 < n})
14255 ==> ccos(Cx(pi) * ccos(Cx pi * z)) = Cx(&1) \/
14256 ccos(Cx(pi) * ccos(Cx pi * z)) = --Cx(&1)`,
14257 REWRITE_TAC[COMPLEX_RING
14258 `x = Cx(&1) \/ x = --Cx(&1) <=> Cx(&1) - x pow 2 = Cx(&0)`] THEN
14259 REWRITE_TAC[COMPLEX_POW_EQ_0; ARITH_EQ; CSIN_EQ_0;
14260 REWRITE_RULE[COMPLEX_RING
14261 `s pow 2 + c pow 2 = Cx(&1) <=>
14262 Cx(&1) - c pow 2 = s pow 2`] CSIN_CIRCLE] THEN
14263 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[CX_MUL] THEN
14264 REWRITE_TAC[COMPLEX_EQ_MUL_LCANCEL; CX_INJ; PI_NZ] THEN
14265 REWRITE_TAC[IN_UNION; TAUT `p \/ q ==> r <=> (p ==> r) /\ (q ==> r)`] THEN
14266 REWRITE_TAC[FORALL_AND_THM; FORALL_IN_GSPEC] THEN
14267 REWRITE_TAC[complex_mul; RE; IM; RE_CX; IM_CX; REAL_MUL_LZERO] THEN
14268 ASM_SIMP_TAC[REAL_DIV_LMUL; PI_NZ; REAL_ADD_RID; REAL_SUB_RZERO] THEN
14269 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
14270 REWRITE_TAC[ccos; COMPLEX_MUL_LNEG; CEXP_NEG] THEN CONJ_TAC THENL
14271 [ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
14273 ==> ((e + inv e) / Cx(&2) = n <=>
14274 inv e pow 2 - Cx(&2) * n * inv e + Cx(&1) = Cx(&0))`];
14275 ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
14277 ==> ((e + inv e) / Cx(&2) = n <=>
14278 e pow 2 - Cx(&2) * n * e + Cx(&1) = Cx(&0))`]] THEN
14279 SIMP_TAC[COMPLEX_TRAD; COMPLEX_RING
14280 `ii * (a + ii * b) = --b + ii * a`] THEN
14281 REWRITE_TAC[GSYM COMPLEX_TRAD; GSYM CX_NEG; CEXP_COMPLEX] THEN
14282 SIMP_TAC[REAL_EXP_NEG; EXP_LOG; lemma1] THEN
14283 SIMP_TAC[SIN_INTEGER_PI; REAL_INV_INV] THEN
14284 REWRITE_TAC[COMPLEX_TRAD; COMPLEX_MUL_RZERO; COMPLEX_ADD_RID] THEN
14285 REWRITE_TAC[GSYM CX_POW; GSYM CX_MUL; GSYM CX_ADD; GSYM CX_ADD;
14286 GSYM CX_SUB; GSYM CX_INV; CX_INJ] THEN
14287 REWRITE_TAC[REAL_INV_MUL; REAL_INV_INV; REAL_POW_MUL] THEN
14288 ONCE_REWRITE_TAC[GSYM COS_ABS] THEN REWRITE_TAC[REAL_ABS_MUL] THEN
14289 MAP_EVERY X_GEN_TAC [`i:real`; `n:num`] THEN REWRITE_TAC[integer] THEN
14290 DISCH_THEN(CONJUNCTS_THEN2
14291 (X_CHOOSE_THEN `m:num` SUBST_ALL_TAC) ASSUME_TAC) THEN
14292 REWRITE_TAC[GSYM integer] THEN REWRITE_TAC[real_abs; PI_POS_LE] THEN
14293 REWRITE_TAC[COS_NPI; REAL_POW_INV; REAL_POW_POW] THEN
14294 REWRITE_TAC[REAL_POW_NEG; EVEN_MULT; ARITH; REAL_POW_ONE] THEN
14295 (ASM_CASES_TAC `EVEN m` THEN
14296 ASM_REWRITE_TAC[REAL_INV_NEG; REAL_INV_1; REAL_MUL_RID] THEN
14297 REWRITE_TAC[REAL_ARITH `a - &2 * n * x * --(&1) = a - &2 * --n * x`] THENL
14298 [EXISTS_TAC `&n:real`; EXISTS_TAC `--(&n):real`] THEN
14299 REWRITE_TAC[REAL_NEG_NEG; REAL_RING
14300 `(n + s) pow 2 - &2 * n * (n + s) + &1 = &0 <=>
14301 s pow 2 = n pow 2 - &1`] THEN
14302 SIMP_TAC[INTEGER_CLOSED] THEN MATCH_MP_TAC SQRT_POW_2 THEN
14303 ASM_SIMP_TAC[REAL_SUB_LE; REAL_POW_LE_1; REAL_OF_NUM_LE; LE_1])) in
14304 REPEAT GEN_TAC THEN STRIP_TAC THEN
14306 [`\z:complex. Cx(&2) * f z - Cx(&1)`; `cball(Cx(&0),&1)`; `Cx(&0)`]
14308 ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_MUL;
14309 HOLOMORPHIC_ON_CONST; CENTRE_IN_CBALL; REAL_POS;
14310 COMPLEX_RING `Cx(&2) * z - Cx(&1) = Cx(&1) <=> z = Cx(&1)`;
14311 COMPLEX_RING `Cx(&2) * z - Cx(&1) = --Cx(&1) <=> z = Cx(&0)`;
14312 CONVEX_IMP_CONTRACTIBLE; CONVEX_CBALL] THEN
14313 ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
14314 DISCH_THEN(X_CHOOSE_THEN `h:complex->complex` STRIP_ASSUME_TAC) THEN
14316 [`h:complex->complex`; `cball(Cx(&0),&1)`; `Cx(&0)`]
14318 ASM_SIMP_TAC[CENTRE_IN_CBALL; REAL_POS; CONVEX_IMP_CONTRACTIBLE;
14321 [X_GEN_TAC `z:complex` THEN REPEAT STRIP_TAC THEN
14322 REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `z:complex`)) THEN
14323 ASM_REWRITE_TAC[COMPLEX_MUL_RID; COMPLEX_MUL_RNEG; CCOS_NEG;
14324 GSYM CX_COS; COS_PI; CX_NEG] THEN
14325 CONV_TAC COMPLEX_RING;
14326 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC)] THEN
14327 MAP_EVERY UNDISCH_TAC
14328 [`!z. z IN cball (Cx(&0),&1)
14329 ==> Cx(&2) * f z - Cx(&1) = ccos(Cx pi * h z)`;
14330 `!z. z IN cball(Cx(&0),&1) ==> h z = ccos(Cx pi * g z)`] THEN
14331 SIMP_TAC[] THEN DISCH_THEN(K ALL_TAC) THEN DISCH_TAC THEN
14333 `norm(g(Cx(&0)):complex) <= &2 + norm(f(Cx(&0)):complex)`
14335 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14336 REAL_LE_TRANS)) THEN
14337 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
14338 `h <= p ==> p / &3 <= &1 + f ==> &1 + h / &3 <= &2 + f`)) THEN
14339 MP_TAC(ISPEC `&1` COMPLEX_NORM_CX) THEN
14340 REWRITE_TAC[GSYM COMPLEX_CMUL] THEN CONV_TAC NORM_ARITH;
14341 MAP_EVERY (C UNDISCH_THEN (K ALL_TAC))
14342 [`h holomorphic_on cball(Cx(&0),&1)`;
14343 `norm(g(Cx(&0)):complex) <= &1 + norm(h(Cx(&0)):complex) / &3`;
14344 `norm(h(Cx(&0)):complex) <=
14345 &1 + norm(Cx(&2) * f(Cx(&0)) - Cx(&1)) / &3`]] THEN
14346 MAP_EVERY X_GEN_TAC [`t:real`; `z:complex`] THEN STRIP_TAC THEN
14347 SUBGOAL_THEN `z IN ball(Cx(&0),&1)` ASSUME_TAC THENL
14348 [REWRITE_TAC[COMPLEX_IN_BALL_0] THEN ASM_REAL_ARITH_TAC;
14349 FIRST_ASSUM(ASSUME_TAC o MATCH_MP
14350 (REWRITE_RULE[SUBSET] BALL_SUBSET_CBALL))] THEN
14352 `norm(g(z) - g(Cx(&0))) <= &12 * t / (&1 - t)`
14354 [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [holomorphic_on]) THEN
14355 REWRITE_TAC[RIGHT_IMP_EXISTS_THM; SKOLEM_THM] THEN
14356 DISCH_THEN(X_CHOOSE_TAC `g':complex->complex`) THEN
14357 MP_TAC(ISPECL [`g:complex->complex`; `g':complex->complex`;
14358 `linepath(Cx(&0),z)`; `cball(Cx(&0),&1)`]
14359 PATH_INTEGRAL_PRIMITIVE) THEN
14360 ASM_REWRITE_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH;
14361 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
14362 ASM_SIMP_TAC[CONVEX_CONTAINS_SEGMENT_IMP; CONVEX_CBALL] THEN
14363 REWRITE_TAC[CENTRE_IN_CBALL; REAL_POS] THEN
14364 DISCH_THEN(MP_TAC o SPEC `&12 / (&1 - t)` o MATCH_MP
14365 (ONCE_REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_BOUND_LINEPATH)) THEN
14367 [ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_SUB_LT; REAL_LT_IMP_LE] THEN
14368 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
14369 MP_TAC(ISPECL [`Cx(&0)`; `z:complex`; `w:complex`] SEGMENT_BOUND) THEN
14370 ASM_REWRITE_TAC[COMPLEX_SUB_RZERO] THEN STRIP_TAC THEN
14372 [`g:complex->complex`; `cball(Cx(&0),&1)`; `w:complex`;
14373 `&1 - t`; `&1`] BLOCH_COROLLARY) THEN
14374 ASM_REWRITE_TAC[FRONTIER_CBALL; COMPLEX_IN_CBALL_0;
14375 COMPLEX_IN_SPHERE_0] THEN
14377 `p /\ q /\ ~s /\ (~r ==> t) ==> (p /\ q /\ r ==> s) ==> t`) THEN
14378 REWRITE_TAC[REAL_NOT_LE] THEN REPEAT CONJ_TAC THENL
14379 [ASM_REAL_ARITH_TAC;
14380 MAP_EVERY UNDISCH_TAC
14381 [`norm(w:complex) <= norm(z:complex)`; `norm(z:complex) <= t`] THEN
14382 CONV_TAC NORM_ARITH;
14383 MATCH_MP_TAC(SET_RULE
14384 `!t u. (!b. (?w. w IN t /\ w IN ball(b,&1)) \/
14385 (?w. w IN u /\ w IN ball(b,&1))) /\
14386 (!x. x IN d ==> ~(g x IN t UNION u))
14387 ==> ~(?b. ball(b,&1) SUBSET IMAGE g d)`) THEN
14388 MAP_EVERY EXISTS_TAC
14389 [`{ complex(m,log(&n + sqrt(&n pow 2 - &1)) / pi) |
14390 integer m /\ 0 < n}`;
14391 `{ complex(m,--log(&n + sqrt(&n pow 2 - &1)) / pi) |
14392 integer m /\ 0 < n}`] THEN
14393 REWRITE_TAC[EXISTS_IN_GSPEC] THEN CONJ_TAC THENL
14394 [X_GEN_TAC `b:complex` THEN REWRITE_TAC[OR_EXISTS_THM] THEN
14395 MP_TAC(ISPEC `Re b` INTEGER_ROUND) THEN
14396 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `m:real` THEN
14397 STRIP_TAC THEN ASM_REWRITE_TAC[IN_BALL] THEN
14398 DISJ_CASES_TAC(REAL_ARITH `&0 <= Im b \/ &0 <= --(Im b)`) THENL
14399 [MP_TAC(SPEC `Im b` lemma2); MP_TAC(SPEC `--(Im b)` lemma2)] THEN
14400 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
14401 X_GEN_TAC `n:num` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THENL
14402 [DISJ1_TAC; DISJ2_TAC] THEN
14403 REWRITE_TAC[dist] THEN
14404 W(MP_TAC o PART_MATCH lhand COMPLEX_NORM_LE_RE_IM o lhand o snd) THEN
14405 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LET_TRANS) THEN
14406 MATCH_MP_TAC(REAL_ARITH
14407 `x <= &1 / &2 /\ y < &1 / &2 ==> x + y < &1`) THEN
14408 ASM_REWRITE_TAC[RE_SUB; IM_SUB; RE; IM] THEN ASM_REAL_ARITH_TAC;
14409 X_GEN_TAC `v:complex` THEN DISCH_TAC THEN
14410 DISCH_THEN(DISJ_CASES_TAC o MATCH_MP lemma3) THEN
14411 REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `v:complex`)) THEN
14412 ASM_REWRITE_TAC[] THEN CONV_TAC COMPLEX_RING];
14413 REWRITE_TAC[REAL_ARITH `a * c / &12 < &1 <=> c * a < &12`] THEN
14414 ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_SUB_LT] THEN MATCH_MP_TAC
14415 (NORM_ARITH `x = y ==> norm(x) < d ==> norm(y) <= d`) THEN
14416 MATCH_MP_TAC COMPLEX_DERIVATIVE_UNIQUE_AT THEN
14417 MAP_EVERY EXISTS_TAC [`g:complex->complex`; `w:complex`] THEN
14418 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14419 MATCH_MP_TAC(TAUT `(q ==> p) /\ q ==> p /\ q`) THEN
14420 CONJ_TAC THENL [MESON_TAC[complex_differentiable]; ALL_TAC] THEN
14421 MATCH_MP_TAC(MESON[]
14422 `!s. (g has_complex_derivative g') (at x within s) /\
14423 ((g has_complex_derivative g') (at x within s) <=>
14424 (g has_complex_derivative g') (at x))
14425 ==> (g has_complex_derivative g') (at x)`) THEN
14426 EXISTS_TAC `cball(Cx(&0),&1)` THEN CONJ_TAC THENL
14427 [FIRST_X_ASSUM MATCH_MP_TAC THEN
14428 REWRITE_TAC[COMPLEX_IN_CBALL_0] THEN ASM_REAL_ARITH_TAC;
14429 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN;
14430 HAS_COMPLEX_DERIVATIVE_AT] THEN
14431 MATCH_MP_TAC LIM_WITHIN_INTERIOR THEN
14432 REWRITE_TAC[INTERIOR_CBALL; COMPLEX_IN_BALL_0] THEN
14433 ASM_REAL_ARITH_TAC]];
14434 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
14435 ONCE_REWRITE_TAC[REAL_ARITH `&12 * t / s = &12 / s * t`] THEN
14436 MATCH_MP_TAC REAL_LE_LMUL THEN
14437 ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_SUB_LT; REAL_LT_IMP_LE] THEN
14438 ASM_REWRITE_TAC[COMPLEX_SUB_RZERO]];
14439 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV)
14440 [COMPLEX_RING `y = (Cx(&1) + (Cx(&2) * y - Cx(&1))) / Cx(&2)`] THEN
14441 ASM_SIMP_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
14442 ONCE_REWRITE_TAC[REAL_ARITH `x / &2 <= y <=> x <= &2 * y`] THEN
14443 W(MP_TAC o PART_MATCH lhand NORM_CCOS_PLUS1_LE o lhand o snd) THEN
14444 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
14445 MATCH_MP_TAC REAL_LE_LMUL THEN
14446 REWRITE_TAC[REAL_POS; REAL_EXP_MONO_LE; COMPLEX_NORM_MUL] THEN
14447 REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_PI] THEN
14448 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[PI_POS_LE] THEN
14449 W(MP_TAC o PART_MATCH lhand NORM_CCOS_LE o lhand o snd) THEN
14450 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
14451 REWRITE_TAC[REAL_EXP_MONO_LE; COMPLEX_NORM_MUL] THEN
14452 REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_PI] THEN
14453 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[PI_POS_LE] THEN
14454 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (NORM_ARITH
14455 `norm(z - w) <= c ==> norm w <= a + b ==> norm z <= a + b + c`)) THEN
14456 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14457 REAL_LE_TRANS)) THEN
14458 UNDISCH_TAC `norm(f(Cx(&0)):complex) <= r` THEN
14459 CONV_TAC NORM_ARITH]);;
14461 (* ------------------------------------------------------------------------- *)
14462 (* The Little Picard Theorem. *)
14463 (* ------------------------------------------------------------------------- *)
14465 let LANDAU_PICARD = prove
14466 (`?R. (!z. &0 < R z) /\
14467 !f. f holomorphic_on cball(Cx(&0),R(f(Cx(&0)))) /\
14468 (!z. z IN cball(Cx(&0),R(f(Cx(&0))))
14469 ==> ~(f(z) = Cx(&0)) /\ ~(f(z) = Cx(&1)))
14470 ==> norm(complex_derivative f (Cx(&0))) < &1`,
14472 `R = \z:complex. &3 * exp(pi * exp(pi * (&2 + &2 * norm(z) + &12)))` THEN
14473 EXISTS_TAC `R:complex->real` THEN
14474 MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
14475 [EXPAND_TAC "R" THEN
14476 REWRITE_TAC[REAL_EXP_POS_LT; REAL_ARITH `&0 < &3 * x <=> &0 < x`];
14478 REPEAT STRIP_TAC THEN
14479 ABBREV_TAC `r = (R:complex->real)(f(Cx(&0)))` THEN
14480 SUBGOAL_THEN `&0 < r` ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
14481 ABBREV_TAC `g = \z. (f:complex->complex)(Cx r * z)` THEN
14483 `!z. z IN cball(Cx(&0),&1) ==> (Cx r * z) IN cball(Cx(&0),r)`
14485 [REWRITE_TAC[COMPLEX_IN_CBALL_0; COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
14486 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH
14487 `&0 < r ==> (abs r * z <= r <=> r * z <= r * &1)`];
14489 SUBGOAL_THEN `g holomorphic_on cball(Cx(&0),&1)` ASSUME_TAC THENL
14490 [EXPAND_TAC "g" THEN GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
14491 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
14492 SIMP_TAC[HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST] THEN
14493 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14494 HOLOMORPHIC_ON_SUBSET)) THEN
14495 ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE];
14497 MP_TAC(ISPECL [`g:complex->complex`; `norm(f(Cx(&0)):complex)`]
14499 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
14500 [EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_MUL_RZERO; REAL_LE_REFL] THEN
14501 GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[DE_MORGAN_THM] THEN
14502 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC[];
14504 DISCH_THEN(MP_TAC o SPEC `&1 / &2`) THEN
14505 CONV_TAC REAL_RAT_REDUCE_CONV THEN
14506 MP_TAC(ASSUME `(R:complex->real)(f(Cx(&0))) = r`) THEN
14507 EXPAND_TAC "R" THEN
14508 SIMP_TAC[REAL_ARITH `&3 * x = r <=> x = r / &3`] THEN
14509 DISCH_THEN SUBST1_TAC THEN DISCH_THEN(LABEL_TAC "*") THEN
14511 [`g:complex->complex`; `Cx(&0)`; `&1 / &2`; `r / &3`; `1`]
14512 CAUCHY_INEQUALITY) THEN
14513 CONV_TAC NUM_REDUCE_CONV THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
14514 REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_1] THEN
14515 ASM_SIMP_TAC[COMPLEX_SUB_LZERO; NORM_NEG; REAL_EQ_IMP_LE] THEN
14518 [MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; ALL_TAC] THEN
14519 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14520 HOLOMORPHIC_ON_SUBSET)) THEN
14521 REWRITE_TAC[SUBSET_BALLS; DIST_REFL] THEN CONV_TAC REAL_RAT_REDUCE_CONV;
14524 `complex_derivative g (Cx(&0)) = Cx r * complex_derivative f (Cx(&0))`
14526 [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN EXPAND_TAC "g" THEN
14527 REWRITE_TAC[] THEN ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
14528 ONCE_REWRITE_TAC[GSYM o_DEF] THEN MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
14530 [COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_MUL_LID]; ALL_TAC] THEN
14531 REWRITE_TAC[COMPLEX_MUL_LZERO; HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14532 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
14533 EXISTS_TAC `ball(Cx(&0),r)` THEN
14534 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
14535 ASM_MESON_TAC[BALL_SUBSET_CBALL; HOLOMORPHIC_ON_SUBSET];
14536 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
14537 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH
14538 `&0 < r ==> (abs r * z <= &1 * r / &3 / (&1 / &2) <=>
14539 r * z <= r * &2 / &3)`] THEN
14542 let LITTLE_PICARD = prove
14544 f holomorphic_on (:complex) /\
14545 ~(a = b) /\ IMAGE f (:complex) INTER {a,b} = {}
14546 ==> ?c. f = \x. c`,
14548 (`!f. f holomorphic_on (:complex) /\
14549 (!z. ~(f z = Cx(&0)) /\ ~(f z = Cx(&1)))
14550 ==> ?c. f = \x. c`,
14551 X_CHOOSE_THEN `R:complex->real` MP_TAC LANDAU_PICARD THEN
14552 REPEAT STRIP_TAC THEN
14553 MP_TAC(ISPECL [`f:complex->complex`; `(:complex)`]
14554 HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
14555 REWRITE_TAC[IN_UNIV; FUN_EQ_THM; CONNECTED_UNIV; OPEN_UNIV] THEN
14556 DISCH_THEN MATCH_MP_TAC THEN X_GEN_TAC `w:complex` THEN
14557 ASM_CASES_TAC `complex_derivative f w = Cx(&0)` THENL
14558 [FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
14559 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14560 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_UNIV; IN_UNIV];
14561 MATCH_MP_TAC(TAUT `F ==> p`)] THEN
14562 FIRST_X_ASSUM(MP_TAC o SPEC
14563 `\z. (f:complex->complex)(w + z / complex_derivative f w)`) THEN
14564 ASM_REWRITE_TAC[NOT_IMP] THEN CONJ_TAC THENL
14565 [GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
14566 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
14567 [ALL_TAC; ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV]] THEN
14568 REWRITE_TAC[HOLOMORPHIC_ON_DIFFERENTIABLE] THEN
14569 REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC;
14571 `complex_derivative (\z. f (w + z / complex_derivative f w)) (Cx(&0)) =
14572 complex_derivative f w * inv(complex_derivative f w)`
14575 ASM_SIMP_TAC[COMPLEX_MUL_RINV; COMPLEX_NORM_CX; REAL_ABS_NUM;
14576 REAL_LT_REFL]] THEN
14577 ONCE_REWRITE_TAC[GSYM o_DEF] THEN
14578 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
14579 MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN CONJ_TAC THENL
14580 [COMPLEX_DIFF_TAC THEN
14581 REWRITE_TAC[COMPLEX_ADD_LID; COMPLEX_MUL_LID; complex_div];
14582 REWRITE_TAC[complex_div; COMPLEX_MUL_LZERO; COMPLEX_ADD_RID] THEN
14583 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14584 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_UNIV;
14586 REPEAT STRIP_TAC THEN
14587 MP_TAC(SPEC `\x:complex. Cx(&1) / (b - a) * (f x - b) + Cx(&1)` lemma) THEN
14588 ASM_SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_SUB;
14589 HOLOMORPHIC_ON_CONST] THEN
14590 ASM_SIMP_TAC[FUN_EQ_THM; COMPLEX_FIELD
14592 ==> (Cx(&1) / (b - a) * (f - b) + Cx(&1) = c <=>
14593 f = b + (b - a) / Cx(&1) * (c - Cx(&1)))`] THEN
14594 ANTS_TAC THENL [ALL_TAC; MESON_TAC[]] THEN
14595 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I
14596 [SET_RULE `IMAGE f UNIV INTER t = {} <=> !x. ~(f x IN t)`]) THEN
14597 MATCH_MP_TAC MONO_FORALL THEN
14598 REWRITE_TAC[CONTRAPOS_THM; IN_INSERT; NOT_IN_EMPTY] THEN
14599 CONV_TAC COMPLEX_RING);;
14601 (* ------------------------------------------------------------------------- *)
14602 (* A couple of little applications of Little Picard. *)
14603 (* ------------------------------------------------------------------------- *)
14605 let HOLOMORPHIC_PERIODIC_FIXPOINT = prove
14606 (`!f p. f holomorphic_on (:complex) /\ ~(p = Cx(&0)) /\ (!z. f(z + p) = f(z))
14608 REWRITE_TAC[MESON[] `(?x. P x) <=> ~(!x. ~P x)`] THEN REPEAT STRIP_TAC THEN
14610 [`\z:complex. f(z) - z`; `Cx(&0)`; `p:complex`] LITTLE_PICARD) THEN
14611 ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID; NOT_IMP] THEN
14612 REWRITE_TAC[SET_RULE `IMAGE f UNIV INTER {a,b} = {} <=>
14613 !x. ~(f x = a) /\ ~(f x = b)`] THEN
14615 [REWRITE_TAC[COMPLEX_RING `a - b:complex = c <=> a = b + c`;
14616 COMPLEX_ADD_RID] THEN
14618 REWRITE_TAC[NOT_EXISTS_THM; FUN_EQ_THM] THEN GEN_TAC THEN
14619 DISCH_THEN(fun th ->
14620 MP_TAC(SPEC `p + p:complex` th) THEN
14621 MP_TAC(SPEC `p:complex` th)) THEN
14622 ASM_REWRITE_TAC[] THEN
14623 UNDISCH_TAC `~(p = Cx(&0))` THEN CONV_TAC COMPLEX_RING]);;
14625 let HOLOMORPHIC_INVOLUTION_POINT = prove
14626 (`!f. f holomorphic_on (:complex) /\ ~(?a. f = \x. a + x) ==> ?x. f(f x) = x`,
14627 REWRITE_TAC[MESON[] `(?x. P x) <=> ~(!x. ~P x)`] THEN REPEAT STRIP_TAC THEN
14628 SUBGOAL_THEN `!z:complex. ~(f z = z)` ASSUME_TAC THENL
14629 [ASM_MESON_TAC[]; ALL_TAC] THEN
14630 MP_TAC(ISPECL [`\x. (f(f x) - x) / (f x - x)`; `Cx(&0)`; `Cx(&1)`]
14631 LITTLE_PICARD) THEN
14632 REWRITE_TAC[NOT_IMP; CX_INJ; REAL_OF_NUM_EQ; ARITH_EQ] THEN
14633 REWRITE_TAC[SET_RULE `IMAGE f UNIV INTER {a,b} = {} <=>
14634 !x. ~(f x = a) /\ ~(f x = b)`] THEN
14635 ASM_SIMP_TAC[FUN_EQ_THM; COMPLEX_FIELD
14636 `~(a:complex = b) ==> (x / (a - b) = c <=> x = c * (a - b))`] THEN
14637 REPEAT CONJ_TAC THENL
14638 [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
14639 ASM_SIMP_TAC[COMPLEX_SUB_0] THEN CONJ_TAC THEN
14640 MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
14641 ASM_REWRITE_TAC[HOLOMORPHIC_ON_ID] THEN
14642 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
14643 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
14644 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV];
14645 ASM_REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_MUL_LID; COMPLEX_SUB_0] THEN
14646 REWRITE_TAC[COMPLEX_RING `x - a:complex = y - a <=> x = y`] THEN
14648 DISCH_THEN(X_CHOOSE_THEN `c:complex` MP_TAC)] THEN
14649 ASM_CASES_TAC `c = Cx(&0)` THEN
14650 ASM_REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_SUB_0] THEN
14651 ASM_CASES_TAC `c = Cx(&1)` THEN
14652 ASM_REWRITE_TAC[COMPLEX_RING `ffx - x = Cx(&1) * (fx - x) <=> ffx = fx`] THEN
14653 REWRITE_TAC[COMPLEX_RING
14654 `ffx - x = c * (fx - x) <=> (ffx - c * fx) = x * (Cx(&1) - c)`] THEN
14657 [`complex_derivative f o f`; `Cx(&0)`; `c:complex`] LITTLE_PICARD) THEN
14658 REWRITE_TAC[SET_RULE `IMAGE f UNIV INTER {a,b} = {} <=>
14659 !x. ~(f x = a) /\ ~(f x = b)`] THEN
14660 ASM_REWRITE_TAC[o_THM; NOT_IMP] THEN REPEAT CONJ_TAC THENL
14661 [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
14662 ASM_MESON_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_UNIV; SUBSET_UNIV;
14663 HOLOMORPHIC_ON_SUBSET];
14664 MP_TAC(MATCH_MP MONO_FORALL (GEN `z:complex` (SPECL
14665 [`\x:complex. f(f x) - c * f x`; `z:complex`;
14666 `complex_derivative f z * (complex_derivative f (f z) - c)`;
14667 `Cx(&1) * (Cx(&1) - c)`] COMPLEX_DERIVATIVE_UNIQUE_AT))) THEN
14669 [REPEAT STRIP_TAC THENL
14670 [REWRITE_TAC[COMPLEX_RING `a * (b - c):complex = b * a - c * a`] THEN
14671 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN CONJ_TAC THENL
14672 [ONCE_REWRITE_TAC[GSYM o_DEF] THEN MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT;
14673 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_LMUL_AT] THEN
14674 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
14675 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; IN_UNIV; OPEN_UNIV];
14676 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_RMUL_AT THEN
14677 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_ID]];
14678 DISCH_THEN(fun th -> X_GEN_TAC `z:complex` THEN REPEAT STRIP_TAC THEN
14680 THENL [DISCH_THEN(MP_TAC o SPEC `(f:complex->complex) z`);
14681 DISCH_THEN(MP_TAC o SPEC `z:complex`)] THEN
14682 ASM_REWRITE_TAC[] THEN
14683 UNDISCH_TAC `~(c = Cx(&1))` THEN CONV_TAC COMPLEX_RING];
14684 REWRITE_TAC[FUN_EQ_THM; o_THM] THEN
14685 DISCH_THEN(X_CHOOSE_TAC `k:complex`) THEN
14686 SUBGOAL_THEN `open(IMAGE (f:complex->complex) (:complex))`
14688 [MATCH_MP_TAC(REWRITE_RULE[RIGHT_IMP_FORALL_THM; IMP_IMP]
14689 OPEN_MAPPING_THM) THEN
14690 EXISTS_TAC `(:complex)` THEN
14691 ASM_REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; SUBSET_UNIV; IN_UNIV] THEN
14695 [`\z. complex_derivative f z - k`; `(:complex)`;
14696 `IMAGE (f:complex->complex) (:complex)`; `(f:complex->complex) z`]
14697 ANALYTIC_CONTINUATION) THEN
14698 REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; SUBSET_UNIV; IN_UNIV] THEN
14699 ASM_REWRITE_TAC[FORALL_IN_IMAGE; COMPLEX_SUB_0; NOT_IMP] THEN
14700 REPEAT CONJ_TAC THENL
14701 [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN REWRITE_TAC[ETA_AX] THEN
14702 ASM_MESON_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE; OPEN_UNIV; SUBSET_UNIV;
14703 HOLOMORPHIC_ON_SUBSET; HOLOMORPHIC_ON_CONST];
14704 MATCH_MP_TAC LIMPT_OF_OPEN THEN ASM_REWRITE_TAC[] THEN SET_TAC[];
14707 [`\x:complex. f x - k * x`; `(:complex)`]
14708 HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
14709 REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; IN_UNIV; NOT_IMP] THEN
14711 [X_GEN_TAC `z:complex` THEN
14712 SUBST1_TAC(COMPLEX_RING `Cx(&0) = k - k * Cx(&1)`) THEN
14713 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_SUB THEN CONJ_TAC THENL
14714 [ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE;
14715 HOLOMORPHIC_ON_OPEN; OPEN_UNIV; IN_UNIV;
14716 complex_differentiable];
14717 COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING];
14718 DISCH_THEN(X_CHOOSE_THEN `l:complex` MP_TAC) THEN
14719 REWRITE_TAC[COMPLEX_RING `a - b:complex = c <=> a = b + c`] THEN
14720 DISCH_THEN(fun th -> RULE_ASSUM_TAC(REWRITE_RULE[th; FUN_EQ_THM])) THEN
14721 ASM_CASES_TAC `k = Cx(&1)` THENL
14722 [UNDISCH_TAC `!a:complex. ~(!x. k * x + l = a + x)` THEN
14723 ASM_REWRITE_TAC[COMPLEX_MUL_LID] THEN MESON_TAC[COMPLEX_ADD_SYM];
14724 UNDISCH_TAC `!z:complex. ~(k * z + l = z)` THEN
14725 ASM_SIMP_TAC[COMPLEX_FIELD
14726 `~(k = Cx(&1)) ==> (k * z + l = z <=> z = l / (Cx(&1) - k))`] THEN
14729 (* ------------------------------------------------------------------------- *)
14730 (* Montel's theorem: a sequence of holomorphic functions uniformly bounded *)
14731 (* on compact subsets of an open set S has a subsequence that converges to a *)
14732 (* holomorphic function, and converges *uniformly* on compact subsets of S. *)
14733 (* ------------------------------------------------------------------------- *)
14736 (`!(f:num->complex->complex) p s.
14737 open s /\ (!h. h IN p ==> h holomorphic_on s) /\
14738 (!k. compact k /\ k SUBSET s
14739 ==> ?b. !h z. h IN p /\ z IN k ==> norm(h z) <= b) /\
14741 ==> ?g r. g holomorphic_on s /\
14742 (!m n:num. m < n ==> r m < r n) /\
14743 (!x. x IN s ==> ((\n. f (r n) x) --> g(x)) sequentially) /\
14744 (!k e. compact k /\ k SUBSET s /\ &0 < e
14745 ==> ?N. !n x. n >= N /\ x IN k
14746 ==> norm(f (r n) x - g x) < e)`,
14747 REPEAT GEN_TAC THEN
14748 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
14749 SPEC_TAC(`f:num->complex->complex`,`f:num->complex->complex`) THEN
14750 REWRITE_TAC[LIM_SEQUENTIALLY] THEN
14751 REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP; GSYM GE; dist] THEN
14752 FIRST_ASSUM(MP_TAC o MATCH_MP OPEN_UNION_COMPACT_SUBSETS) THEN
14753 DISCH_THEN(X_CHOOSE_THEN `k:num->complex->bool`
14754 (fun th -> FIRST_X_ASSUM(MP_TAC o GEN `i:num `o
14755 SPEC `(k:num->complex->bool) i`) THEN
14756 STRIP_ASSUME_TAC th)) THEN
14757 ASM_REWRITE_TAC[SKOLEM_THM; LEFT_IMP_EXISTS_THM] THEN
14758 X_GEN_TAC `B:num->real` THEN DISCH_TAC THEN
14760 `!(f:num->complex->complex) (i:num).
14762 ==> ?r g. (!m n:num. m < n ==> r m < r n) /\
14763 (!e. &0 < e ==> ?N. !n x. n >= N /\ x IN k i
14764 ==> norm((f o r) n x - g x) < e)`
14766 [REPEAT STRIP_TAC THEN REWRITE_TAC[o_THM] THEN
14767 MP_TAC(ISPECL [`f:num->complex->complex`; `(k:num->complex->bool) i`;
14768 `(B:num->real) i`] ARZELA_ASCOLI) THEN
14769 ANTS_TAC THENL [ASM_SIMP_TAC[]; MESON_TAC[]] THEN
14770 MAP_EVERY X_GEN_TAC [`z:complex`; `e:real`] THEN STRIP_TAC THEN
14771 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
14772 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
14773 ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[SUBSET; IN_CBALL]] THEN
14774 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
14777 !n w. dist(z,w) <= &2 / &3 * r
14778 ==> norm((f:num->complex->complex) n w) <= M`
14779 STRIP_ASSUME_TAC THENL
14780 [FIRST_X_ASSUM(MP_TAC o SPEC `cball(z:complex,&2 / &3 * r)`) THEN
14781 ASM_SIMP_TAC[SUBSET; IN_CBALL; COMPACT_CBALL;
14782 NORM_ARITH `dist(a,b) <= &2 / &3 * r ==> dist(a,b) <= r`] THEN
14783 DISCH_THEN(X_CHOOSE_THEN `N:num` (MP_TAC o SPEC `N:num`)) THEN
14784 REWRITE_TAC[GE; LE_REFL] THEN DISCH_TAC THEN
14785 EXISTS_TAC `abs(B(N:num)) + &1` THEN
14786 REWRITE_TAC[REAL_ARITH `&0 < abs x + &1`] THEN
14787 ASM_MESON_TAC[SUBSET; REAL_ARITH `x <= b ==> x <= abs b + &1`];
14789 EXISTS_TAC `min (r / &3) ((e * r) / (&6 * M))` THEN
14790 ASM_SIMP_TAC[REAL_LT_MIN; REAL_LT_DIV;
14791 REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
14792 MAP_EVERY X_GEN_TAC [`n:num`; `y:complex`] THEN STRIP_TAC THEN
14794 (ISPECL [`(f:num->complex->complex) n`; `cball(z:complex,&2 / &3 * r)`;
14795 `circlepath(z:complex,&2 / &3 * r)`]
14796 CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE) THEN
14797 REWRITE_TAC[CONVEX_CBALL; VALID_PATH_CIRCLEPATH] THEN
14798 REWRITE_TAC[PATHSTART_CIRCLEPATH; PATHFINISH_CIRCLEPATH] THEN
14799 SIMP_TAC[INTERIOR_CBALL; IN_BALL; WINDING_NUMBER_CIRCLEPATH;
14800 NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
14801 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH;
14802 REAL_ARITH `&0 < r ==> &0 <= &2 / &3 * r`] THEN
14803 REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
14804 SIMP_TAC[SUBSET; IN_CBALL; IN_DELETE; IN_ELIM_THM; REAL_LE_REFL;
14805 NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
14806 ONCE_REWRITE_TAC[TAUT `p ==> ~q <=> q ==> ~p`] THEN
14807 SIMP_TAC[FORALL_UNWIND_THM2; IMP_CONJ; REAL_LT_IMP_NE] THEN
14808 REWRITE_TAC[RIGHT_FORALL_IMP_THM; COMPLEX_MUL_LID] THEN ANTS_TAC THENL
14809 [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
14810 EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[SUBSET; IN_CBALL] THEN
14811 ASM_SIMP_TAC[NORM_ARITH `dist(a,b) <= &2 / &3 * r ==> dist(a,b) <= r`];
14813 DISCH_THEN(fun th ->
14814 MP_TAC(SPEC `y:complex` th) THEN MP_TAC(SPEC `z:complex` th)) THEN
14815 ASM_SIMP_TAC[VECTOR_SUB_REFL; NORM_0; REAL_LT_MUL; REAL_LT_DIV;
14816 REAL_OF_NUM_LT; ARITH; NORM_ARITH
14817 `norm(z - y) < r / &3 ==> norm(y - z) < &2 / &3 * r`] THEN
14818 REWRITE_TAC[IMP_IMP] THEN
14819 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
14820 DISCH_THEN(MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
14821 HAS_PATH_INTEGRAL_BOUND_CIRCLEPATH)) THEN
14822 REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB; COMPLEX_NORM_MUL] THEN
14823 REWRITE_TAC[COMPLEX_NORM_II; COMPLEX_NORM_CX; REAL_ABS_PI;
14824 REAL_ABS_NUM; REAL_MUL_LID] THEN
14825 DISCH_THEN(MP_TAC o SPEC `e / r:real`) THEN
14826 ASM_SIMP_TAC[REAL_FIELD
14827 `&0 < r ==> e / r * &2 * pi * c * r = &2 * pi * e * c`] THEN
14828 SIMP_TAC[REAL_LE_LMUL_EQ; REAL_OF_NUM_LT; ARITH; PI_POS] THEN
14829 ANTS_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
14830 ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH;
14832 X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
14833 SUBGOAL_THEN `~(w:complex = z) /\ ~(w = y)` STRIP_ASSUME_TAC THENL
14834 [CONJ_TAC THEN DISCH_THEN SUBST_ALL_TAC THEN
14835 RULE_ASSUM_TAC(REWRITE_RULE[NORM_0; VECTOR_SUB_REFL]) THEN
14836 RULE_ASSUM_TAC(REWRITE_RULE[NORM_SUB]) THEN ASM_REAL_ARITH_TAC;
14838 ASM_SIMP_TAC[COMPLEX_FIELD
14839 `~(w:complex = z) /\ ~(w = y)
14840 ==> (a / (w - z) - a / (w - y) =
14841 (a * (z - y)) / ((w - z) * (w - y)))`] THEN
14842 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV] THEN
14843 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LT_MUL; NORM_POS_LT; VECTOR_SUB_EQ;
14844 REAL_FIELD `&0 < r ==> e / r * (&2 / &3 * r) * x = &2 / &3 * e * x`] THEN
14845 MATCH_MP_TAC REAL_LE_TRANS THEN
14846 EXISTS_TAC `M * (e * r) / (&6 * M)` THEN CONJ_TAC THENL
14847 [MATCH_MP_TAC REAL_LE_MUL2 THEN
14848 ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE] THEN
14849 FIRST_X_ASSUM MATCH_MP_TAC THEN
14850 ASM_REWRITE_TAC[NORM_ARITH `dist(x,y) = norm(y - x)`; REAL_LE_REFL];
14851 ASM_SIMP_TAC[REAL_FIELD `&0 < M ==> M * e / (&6 * M) = e / &6`] THEN
14852 MATCH_MP_TAC(REAL_ARITH
14853 `&0 < x /\ x <= y * &3 ==> x / &6 <= &2 / &3 * y`) THEN
14854 ASM_SIMP_TAC[REAL_LT_MUL; GSYM REAL_MUL_ASSOC; REAL_LE_LMUL_EQ] THEN
14855 MAP_EVERY UNDISCH_TAC
14856 [`norm(w - z:complex) = &2 / &3 * r`;
14857 `norm(z - y:complex) < r / &3`] THEN
14858 CONV_TAC NORM_ARITH];
14860 REWRITE_TAC[RIGHT_EXISTS_AND_THM] THEN
14861 DISCH_THEN(fun th -> X_GEN_TAC `f:num->complex->complex` THEN
14862 DISCH_TAC THEN MP_TAC th) THEN
14863 DISCH_THEN(MP_TAC o GENL [`i:num`; `r:num->num`] o
14864 SPECL [`(f:num->complex->complex) o (r:num->num)`; `i:num`]) THEN
14866 (LAND_CONV o funpow 2 BINDER_CONV o LAND_CONV o ONCE_DEPTH_CONV)
14867 [o_THM] THEN ASM_REWRITE_TAC[GSYM o_ASSOC] THEN
14868 DISCH_THEN(MP_TAC o MATCH_MP (ONCE_REWRITE_RULE[IMP_CONJ]
14869 SUBSEQUENCE_DIAGONALIZATION_LEMMA)) THEN
14871 [SIMP_TAC[o_THM; GE] THEN REPEAT GEN_TAC THEN
14872 DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
14873 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
14874 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `e:real` THEN
14875 MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
14876 DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN
14877 EXISTS_TAC `MAX M N` THEN
14878 REWRITE_TAC[ARITH_RULE `MAX m n <= x <=> m <= x /\ n <= x`] THEN
14879 ASM_MESON_TAC[LE_TRANS];
14881 DISCH_THEN(MP_TAC o SPEC `I:num->num`) THEN
14882 REWRITE_TAC[I_O_ID; RIGHT_AND_EXISTS_THM] THEN
14883 ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
14884 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `r:num->num` THEN
14885 REWRITE_TAC[o_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
14889 ==> ?N:num. !n. n >= N
14890 ==> norm((f:num->complex->complex) (r n) x - l)
14893 [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
14894 FIRST_X_ASSUM(MP_TAC o SPEC `{z:complex}`) THEN
14895 ASM_REWRITE_TAC[COMPACT_SING; SING_SUBSET] THEN
14896 DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
14897 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SKOLEM_THM]) THEN
14898 DISCH_THEN(X_CHOOSE_THEN `G:num->complex->complex` MP_TAC) THEN
14899 DISCH_THEN(LABEL_TAC "*" o SPEC `N:num`) THEN
14900 EXISTS_TAC `(G:num->complex->complex) N z` THEN
14901 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
14902 REMOVE_THEN "*" (MP_TAC o SPEC `e:real`) THEN
14903 ASM_REWRITE_TAC[] THEN
14904 DISCH_THEN(X_CHOOSE_THEN `M:num` STRIP_ASSUME_TAC) THEN
14905 EXISTS_TAC `MAX M N` THEN
14906 REWRITE_TAC[ARITH_RULE `a >= MAX m n <=> a >= m /\ a >= n`] THEN
14907 ASM_MESON_TAC[GE_REFL];
14909 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [RIGHT_IMP_EXISTS_THM] THEN
14910 REWRITE_TAC[SKOLEM_THM; RIGHT_IMP_FORALL_THM; IMP_IMP] THEN
14911 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
14912 DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
14913 MATCH_MP_TAC(TAUT `b /\ (b ==> a) ==> a /\ b`) THEN CONJ_TAC THENL
14914 [MAP_EVERY X_GEN_TAC [`t:complex->bool`; `e:real`] THEN STRIP_TAC THEN
14915 FIRST_X_ASSUM(MP_TAC o SPEC `t:complex->bool`) THEN ASM_REWRITE_TAC[] THEN
14916 DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN
14917 FIRST_X_ASSUM(X_CHOOSE_THEN `h:complex->complex` (LABEL_TAC "*") o
14920 `!w. w IN t ==> g w = (h:complex->complex) w`
14921 (fun th -> ASM_MESON_TAC[GE_REFL; SUBSET; th]) THEN
14922 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
14923 MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN
14924 EXISTS_TAC `\n:num. (f:num->complex->complex)(r n) w` THEN
14925 ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; LIM_SEQUENTIALLY] THEN
14926 REWRITE_TAC[GSYM GE; dist; o_THM] THEN
14927 ASM_MESON_TAC[SUBSET; GE_REFL];
14928 DISCH_THEN(LABEL_TAC "*")] THEN
14929 MATCH_MP_TAC HOLOMORPHIC_UNIFORM_SEQUENCE THEN
14930 EXISTS_TAC `(f:num->complex->complex) o (r:num->num)` THEN
14931 ASM_SIMP_TAC[o_THM] THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
14932 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
14933 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
14934 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
14935 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
14936 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN ASM_MESON_TAC[COMPACT_CBALL; GE]);;
14938 (* ------------------------------------------------------------------------- *)
14939 (* Moebius functions are biholomorphisms of the unit disc. *)
14940 (* ------------------------------------------------------------------------- *)
14942 let moebius_function = new_definition
14943 `!t w z. moebius_function t w z =
14944 cexp(ii * Cx t) * (z - w) / (Cx(&1) - cnj w * z)`;;
14946 let MOEBIUS_FUNCTION_SIMPLE = prove
14947 (`!w z. moebius_function (&0) w z = (z - w) / (Cx(&1) - cnj w * z)`,
14948 REWRITE_TAC[moebius_function; COMPLEX_MUL_RZERO; CEXP_0; COMPLEX_MUL_LID]);;
14950 let MOEBIUS_FUNCTION_EQ_ZERO = prove
14951 (`!t w. moebius_function t w w = Cx(&0)`,
14952 REWRITE_TAC [moebius_function] THEN CONV_TAC COMPLEX_FIELD);;
14954 let MOEBIUS_FUNCTION_OF_ZERO = prove
14955 (`!t w. moebius_function t w (Cx(&0)) = -- cexp(ii * Cx t) * w`,
14956 REWRITE_TAC [moebius_function] THEN CONV_TAC COMPLEX_FIELD);;
14958 let MOEBIUS_FUNCTION_NORM_LT_1 = prove
14959 (`!t w z. norm w < &1 /\ norm z < &1
14960 ==> norm (moebius_function t w z) < &1`,
14961 REPEAT STRIP_TAC THEN SUBGOAL_THEN
14962 `!a. &0 <= a /\ &0 < &1 - a pow 2 ==> a < &1` MATCH_MP_TAC THENL
14963 [GEN_TAC THEN ASM_CASES_TAC `&0 <= a` THEN
14964 ASM_REWRITE_TAC [REAL_FIELD `&1 - a pow 2 = (&1 - a) * (&1 + a)`;
14965 REAL_MUL_POS_LT] THEN
14968 REWRITE_TAC [NORM_POS_LE] THEN
14969 SUBGOAL_THEN `~(Cx(&1) - cnj w * z = Cx(&0))` ASSUME_TAC THENL
14970 [REWRITE_TAC [COMPLEX_SUB_0] THEN
14971 SUBGOAL_THEN `~(norm (Cx(&1)) = norm (cnj w * z))`
14972 (fun th -> MESON_TAC [th]) THEN
14973 REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL; COMPLEX_NORM_CNJ] THEN
14974 MATCH_MP_TAC (REAL_ARITH `a * b < &1 ==> ~(&1 = a * b)`) THEN
14975 STRIP_ASSUME_TAC (NORM_ARITH `norm (z:complex) = &0 \/ &0 < norm z`) THENL
14976 [ASM_REWRITE_TAC [REAL_MUL_RZERO; REAL_LT_01];
14977 MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (z:complex)` THEN
14978 ASM_SIMP_TAC[REAL_LT_RMUL; REAL_MUL_LID]];
14981 `&1 - norm (moebius_function t w z) pow 2 =
14982 ((&1 - norm w pow 2) / (norm (Cx(&1) - cnj w * z) pow 2)) *
14983 (&1 - norm z pow 2)`
14985 [REWRITE_TAC [moebius_function;
14986 GSYM CX_INJ; CX_SUB; CX_MUL; CX_DIV; CX_POW; CNJ_SUB; CNJ_CX;
14987 CNJ_MUL; CNJ_DIV; CNJ_CNJ; COMPLEX_NORM_POW_2] THEN
14989 `cnj (cexp(ii * Cx t)) * (cexp(ii * Cx t)) = Cx(&1) /\
14990 ~(Cx(&1) - cnj w * z = Cx(&0)) /\ ~(Cx(&1) - w * cnj z = Cx(&0))`
14991 MP_TAC THENL [ALL_TAC; CONV_TAC COMPLEX_FIELD] THEN
14992 REWRITE_TAC [CNJ_CEXP; CNJ_MUL; CNJ_II; CNJ_CX;
14993 COMPLEX_MUL_LNEG; CEXP_NEG_LMUL] THEN ASM_REWRITE_TAC [] THEN
14994 SUBGOAL_THEN `~(cnj (Cx(&1) - cnj w * z) = Cx(&0))` MP_TAC THENL
14995 [ASM_REWRITE_TAC [CNJ_EQ_0];
14996 REWRITE_TAC [CNJ_SUB; CNJ_CX; CNJ_MUL; CNJ_CNJ]];
14997 SUBGOAL_THEN `!u:complex. norm u < &1 ==> &0 < &1 - norm u pow 2`
14999 [REWRITE_TAC [REAL_FIELD `!a. &1 - a pow 2 = (&1 - a) * (&1 + a)`] THEN
15000 ASM_SIMP_TAC [REAL_LT_MUL; REAL_SUB_LT; REAL_LTE_ADD; REAL_LT_01;
15002 SUBGOAL_THEN `&0 < norm (Cx(&1) - cnj w * z) pow 2`
15003 (fun th -> ASM_MESON_TAC [th; REAL_LT_MUL; REAL_LT_DIV]) THEN
15004 ASM_REWRITE_TAC [REAL_RING `!a:real. a pow 2 = a * a`;
15005 REAL_LT_SQUARE; COMPLEX_NORM_ZERO]]]);;
15007 let MOEBIUS_FUNCTION_HOLOMORPHIC = prove
15008 (`!t w. norm w < &1 ==> moebius_function t w holomorphic_on ball(Cx(&0),&1)`,
15009 let LEMMA_1 = prove
15010 (`!a b:complex. norm a < &1 /\ norm b < &1 ==> ~(Cx(&1) - a * b = Cx(&0))`,
15011 GEN_TAC THEN GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC [COMPLEX_SUB_0] THEN
15012 SUBGOAL_THEN `~(norm (Cx(&1)) = norm (a * b))`
15013 (fun th -> MESON_TAC[th]) THEN
15014 REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL] THEN
15015 MATCH_MP_TAC (REAL_ARITH `!x y. y < x ==> ~(x = y)`) THEN
15016 ASM_CASES_TAC `b = Cx(&0)` THEN
15017 ASM_REWRITE_TAC [COMPLEX_NORM_NUM; REAL_MUL_RZERO; REAL_LT_01] THEN
15018 MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (b:complex)` THEN
15020 [MATCH_MP_TAC REAL_LT_RMUL THEN ASM_REWRITE_TAC [COMPLEX_NORM_NZ];
15021 ASM_REWRITE_TAC [REAL_MUL_LID]]) in
15022 REPEAT STRIP_TAC THEN
15023 SUBST1_TAC (GSYM (ISPEC `moebius_function t w` ETA_AX)) THEN
15024 REWRITE_TAC [moebius_function] THEN
15025 MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN CONJ_TAC THENL
15026 [MATCH_MP_TAC (REWRITE_RULE [o_DEF] HOLOMORPHIC_ON_COMPOSE_GEN) THEN
15027 EXISTS_TAC `(:complex)` THEN REWRITE_TAC [HOLOMORPHIC_ON_CEXP; IN_UNIV] THEN
15028 SIMP_TAC [HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_CONST];
15029 MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
15030 SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST;
15031 HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_MUL] THEN
15032 ASM_SIMP_TAC[COMPLEX_IN_BALL_0; LEMMA_1; COMPLEX_NORM_CNJ]]);;
15034 let MOEBIUS_FUNCTION_COMPOSE = prove
15036 -- w1 = w2 /\ norm w1 < &1 /\ norm z < &1
15037 ==> moebius_function (&0) w1 (moebius_function (&0) w2 z) = z`,
15038 let LEMMA_1 = prove
15039 (`!a b:complex. norm a < &1 /\ norm b < &1
15040 ==> ~(Cx(&1) - a * b = Cx(&0))`,
15041 GEN_TAC THEN GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC [COMPLEX_SUB_0] THEN
15042 SUBGOAL_THEN `~(norm (Cx(&1)) = norm (a * b))`
15043 (fun th -> MESON_TAC[th]) THEN
15044 REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL] THEN
15045 MATCH_MP_TAC (REAL_ARITH `!x y. y < x ==> ~(x = y)`) THEN
15046 ASM_CASES_TAC `b = Cx(&0)` THEN
15047 ASM_REWRITE_TAC [COMPLEX_NORM_NUM; REAL_MUL_RZERO; REAL_LT_01] THEN
15048 MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (b:complex)` THEN
15050 [MATCH_MP_TAC REAL_LT_RMUL THEN ASM_REWRITE_TAC [COMPLEX_NORM_NZ];
15051 ASM_REWRITE_TAC [REAL_MUL_LID]]) in
15052 let LEMMA_1_ALT = prove
15053 (`!a b:complex. norm a < &1 /\ norm b < &1
15054 ==> ~(Cx(&1) + a * b = Cx(&0))`,
15055 REPEAT GEN_TAC THEN STRIP_TAC THEN
15056 SUBST1_TAC (COMPLEX_RING `a : complex = -- (-- a)`) THEN
15057 ABBREV_TAC `u : complex= -- a` THEN
15058 REWRITE_TAC [COMPLEX_MUL_LNEG; GSYM complex_sub] THEN
15059 MATCH_MP_TAC LEMMA_1 THEN EXPAND_TAC "u" THEN
15060 ASM_REWRITE_TAC[NORM_NEG]) in
15061 REPEAT STRIP_TAC THEN
15062 SUBGOAL_THEN `norm (w2:complex) < &1` ASSUME_TAC THENL
15063 [EXPAND_TAC "w2" THEN ASM_REWRITE_TAC [NORM_NEG]; ALL_TAC] THEN
15064 REWRITE_TAC [moebius_function; COMPLEX_MUL_RZERO;
15065 CEXP_0; COMPLEX_MUL_LID] THEN
15066 MATCH_MP_TAC (COMPLEX_FIELD
15067 `!a b c. ~(b = Cx(&0)) /\ a = b * c ==> a / b = c`) THEN
15069 [ALL_TAC; MP_TAC (SPECL [`cnj w2`;`z:complex`] LEMMA_1) THEN
15070 ASM_REWRITE_TAC [COMPLEX_NORM_CNJ] THEN EXPAND_TAC "w2" THEN
15071 REWRITE_TAC [CNJ_NEG] THEN CONV_TAC COMPLEX_FIELD] THEN
15072 MATCH_MP_TAC (COMPLEX_FIELD
15073 `!a b c d. ~(d = Cx(&0)) /\ ~(d * a - b * c = Cx(&0))
15074 ==> ~(a - b * c / d = Cx(&0))`) THEN
15075 ASM_SIMP_TAC [LEMMA_1; COMPLEX_NORM_CNJ] THEN
15076 ASM_REWRITE_TAC [COMPLEX_MUL_RID] THEN
15078 `Cx(&1) - cnj w2 * z - cnj w1 * (z - w2) =
15079 Cx(&1) + cnj w1 * w2` SUBST1_TAC THENL
15080 [EXPAND_TAC "w2" THEN REWRITE_TAC [CNJ_NEG] THEN CONV_TAC COMPLEX_RING;
15081 ASM_SIMP_TAC [LEMMA_1_ALT; COMPLEX_NORM_CNJ]]);;
15083 let BALL_BIHOLOMORPHISM_EXISTS = prove
15084 (`!a. a IN ball(Cx(&0),&1)
15085 ==> ?f g. f(a) = Cx(&0) /\
15086 f holomorphic_on ball (Cx(&0),&1) /\
15087 (!z. z IN ball (Cx(&0),&1) ==> f z IN ball (Cx(&0),&1)) /\
15088 g holomorphic_on ball (Cx(&0),&1) /\
15089 (!z. z IN ball (Cx(&0),&1) ==> g z IN ball (Cx(&0),&1)) /\
15090 (!z. z IN ball (Cx(&0),&1) ==> f (g z) = z) /\
15091 (!z. z IN ball (Cx(&0),&1) ==> g (f z) = z)`,
15092 REWRITE_TAC[COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
15093 EXISTS_TAC `moebius_function (&0) a` THEN
15094 EXISTS_TAC `moebius_function (&0) (--a)` THEN
15095 ASM_SIMP_TAC[COMPLEX_IN_BALL_0; MOEBIUS_FUNCTION_COMPOSE; COMPLEX_NEG_NEG;
15097 ASM_SIMP_TAC[MOEBIUS_FUNCTION_NORM_LT_1; NORM_NEG;
15098 MOEBIUS_FUNCTION_HOLOMORPHIC; MOEBIUS_FUNCTION_EQ_ZERO]);;
15100 let BALL_BIHOLOMORPHISM_MOEBIUS_FUNCTION = prove
15102 f holomorphic_on ball (Cx(&0),&1) /\
15103 (!z. z IN ball (Cx(&0),&1) ==> f z IN ball (Cx(&0),&1)) /\
15104 g holomorphic_on ball (Cx(&0),&1) /\
15105 (!z. z IN ball (Cx(&0),&1) ==> g z IN ball (Cx(&0),&1)) /\
15106 (!z. z IN ball (Cx(&0),&1) ==> f (g z) = z) /\
15107 (!z. z IN ball (Cx(&0),&1) ==> g (f z) = z)
15108 ==> ?t w. w IN ball (Cx(&0),&1) /\
15109 (!z. z IN ball (Cx(&0),&1) ==> f z = moebius_function t w z)`,
15110 let LEMMA_1 = prove
15111 (`!a b:complex. norm a < &1 /\ norm b < &1
15112 ==> ~(Cx(&1) - a * b = Cx(&0))`,
15113 GEN_TAC THEN GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC [COMPLEX_SUB_0] THEN
15114 SUBGOAL_THEN `~(norm (Cx(&1)) = norm (a * b))`
15115 (fun th -> MESON_TAC[th]) THEN
15116 REWRITE_TAC [COMPLEX_NORM_NUM; COMPLEX_NORM_MUL] THEN
15117 MATCH_MP_TAC (REAL_ARITH `!x y. y < x ==> ~(x = y)`) THEN
15118 ASM_CASES_TAC `b = Cx(&0)` THEN
15119 ASM_REWRITE_TAC [COMPLEX_NORM_NUM; REAL_MUL_RZERO; REAL_LT_01] THEN
15120 MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&1 * norm (b:complex)` THEN
15122 [MATCH_MP_TAC REAL_LT_RMUL THEN ASM_REWRITE_TAC [COMPLEX_NORM_NZ];
15123 ASM_REWRITE_TAC [REAL_MUL_LID]]) in
15124 let LEMMA_2 = prove
15125 (`!t w s z. norm w < &1 /\ norm z < &1
15126 ==> moebius_function t w (cexp(ii * Cx s) * z) =
15127 moebius_function (t + s) (cexp(-- (ii * Cx s)) * w) z`,
15128 REPEAT STRIP_TAC THEN
15129 REWRITE_TAC[moebius_function; CX_ADD; COMPLEX_ADD_LDISTRIB; CEXP_ADD;
15130 GSYM COMPLEX_MUL_ASSOC; COMPLEX_EQ_MUL_LCANCEL; CEXP_NZ;
15132 MATCH_MP_TAC (COMPLEX_FIELD
15133 `!a b c d e. ~(b = Cx(&0)) /\ ~(e = Cx(&0)) /\ e * a = b * c * d
15134 ==> a / b = c * d / e`) THEN CONJ_TAC THENL
15135 [MATCH_MP_TAC LEMMA_1 THEN
15136 ASM_REWRITE_TAC [COMPLEX_NORM_CNJ; COMPLEX_NORM_MUL; NORM_CEXP_II;
15140 [REWRITE_TAC [COMPLEX_MUL_ASSOC] THEN MATCH_MP_TAC LEMMA_1 THEN
15141 ASM_REWRITE_TAC [COMPLEX_NORM_MUL; COMPLEX_NORM_CNJ; COMPLEX_NEG_RMUL;
15142 GSYM CX_NEG; NORM_CEXP_II; REAL_MUL_LID];
15143 REWRITE_TAC [CNJ_CEXP; CNJ_NEG; CNJ_MUL; CNJ_II; CNJ_CX;
15144 COMPLEX_MUL_LNEG; COMPLEX_NEG_NEG; CEXP_NEG] THEN
15145 ABBREV_TAC `a = cexp(ii * Cx s)` THEN
15146 SUBGOAL_THEN `inv a * a = Cx(&1)` MP_TAC THENL
15147 [ALL_TAC; CONV_TAC COMPLEX_RING] THEN
15148 MATCH_MP_TAC COMPLEX_MUL_LINV THEN EXPAND_TAC "a" THEN
15149 REWRITE_TAC [CEXP_NZ]]) in
15150 REWRITE_TAC [COMPLEX_IN_BALL_0] THEN REPEAT STRIP_TAC THEN
15151 ABBREV_TAC `w:complex = f (Cx(&0))` THEN
15152 SUBGOAL_THEN `norm(w:complex) < &1` ASSUME_TAC THENL
15153 [ASM_MESON_TAC [COMPLEX_NORM_NUM; REAL_LT_01]; ALL_TAC] THEN
15155 `?t. !z. z IN ball (Cx(&0),&1)
15156 ==> moebius_function (&0) w (f z) = cexp(ii * Cx t) * z`
15157 STRIP_ASSUME_TAC THENL
15159 EXISTS_TAC `t:real` THEN EXISTS_TAC `-- (cexp(-- (ii * Cx t)) * w)` THEN
15160 ASM_REWRITE_TAC [NORM_NEG; COMPLEX_NORM_MUL; COMPLEX_NEG_RMUL;
15161 GSYM CX_NEG; NORM_CEXP_II; REAL_MUL_LID] THEN
15162 GEN_TAC THEN DISCH_TAC THEN EQ_TRANS_TAC
15163 `moebius_function (&0) (--w)
15164 (moebius_function (&0) w (f (z:complex)))` THENL
15165 [MATCH_MP_TAC EQ_SYM THEN MATCH_MP_TAC MOEBIUS_FUNCTION_COMPOSE THEN
15166 ASM_SIMP_TAC [COMPLEX_NEG_NEG; NORM_NEG];
15167 ASM_SIMP_TAC[COMPLEX_IN_BALL_0] THEN ASM_SIMP_TAC[LEMMA_2; NORM_NEG] THEN
15168 REWRITE_TAC [REAL_ADD_LID; CX_NEG; COMPLEX_MUL_RNEG]]] THEN
15169 MATCH_MP_TAC SECOND_CARTAN_THM_DIM_1 THEN EXISTS_TAC
15170 `\z. g (moebius_function (&0) (--w) z) : complex` THEN
15171 REWRITE_TAC [COMPLEX_IN_BALL_0] THEN REWRITE_TAC [REAL_LT_01] THEN
15173 [MATCH_MP_TAC (REWRITE_RULE [o_DEF] HOLOMORPHIC_ON_COMPOSE_GEN) THEN
15174 EXISTS_TAC `ball(Cx(&0),&1)` THEN
15175 ASM_SIMP_TAC [ETA_AX; MOEBIUS_FUNCTION_HOLOMORPHIC; COMPLEX_IN_BALL_0];
15176 ALL_TAC] THEN CONJ_TAC THENL [ASM_SIMP_TAC [MOEBIUS_FUNCTION_NORM_LT_1];
15178 CONJ_TAC THENL [ASM_REWRITE_TAC [MOEBIUS_FUNCTION_EQ_ZERO]; ALL_TAC] THEN
15180 [MATCH_MP_TAC (REWRITE_RULE [o_DEF] HOLOMORPHIC_ON_COMPOSE_GEN) THEN
15181 EXISTS_TAC `ball(Cx(&0),&1)` THEN
15182 ASM_SIMP_TAC [COMPLEX_IN_BALL_0; MOEBIUS_FUNCTION_NORM_LT_1;
15184 ASM_SIMP_TAC [ETA_AX; MOEBIUS_FUNCTION_HOLOMORPHIC; NORM_NEG];
15185 ALL_TAC] THEN CONJ_TAC THENL
15186 [ASM_SIMP_TAC [MOEBIUS_FUNCTION_NORM_LT_1; NORM_NEG]; ALL_TAC] THEN
15188 [ASM_REWRITE_TAC [MOEBIUS_FUNCTION_OF_ZERO; COMPLEX_MUL_RZERO; CEXP_0;
15189 GSYM COMPLEX_NEG_LMUL; COMPLEX_MUL_LID;
15190 COMPLEX_NEG_NEG] THEN
15191 ASM_MESON_TAC [COMPLEX_NORM_0; REAL_LT_01];
15192 ALL_TAC] THEN CONJ_TAC THENL
15194 ASM_SIMP_TAC [REWRITE_RULE [COMPLEX_NEG_NEG; NORM_NEG]
15195 (SPECL [`--w:complex`;`w:complex`] MOEBIUS_FUNCTION_COMPOSE)]] THEN
15196 REPEAT STRIP_TAC THEN SUBGOAL_THEN
15197 `f (g (moebius_function (&0) (--w) z) : complex) =
15198 (moebius_function (&0) (--w) z)`
15200 [FIRST_X_ASSUM MATCH_MP_TAC THEN
15201 ASM_SIMP_TAC [MOEBIUS_FUNCTION_NORM_LT_1; NORM_NEG];
15202 MATCH_MP_TAC MOEBIUS_FUNCTION_COMPOSE THEN ASM_REWRITE_TAC []]);;
15204 (* ------------------------------------------------------------------------- *)
15205 (* Some simple but useful cases of Hurwitz's theorem. *)
15206 (* ------------------------------------------------------------------------- *)
15208 let HURWITZ_NO_ZEROS = prove
15209 (`!f:num->complex->complex g s.
15210 open s /\ connected s /\
15211 (!n. (f n) holomorphic_on s) /\ g holomorphic_on s /\
15212 (!k e. compact k /\ k SUBSET s /\ &0 < e
15213 ==> ?N. !n x. n >= N /\ x IN k ==> norm(f n x - g x) < e) /\
15214 ~(?c. !z. z IN s ==> g z = c) /\
15215 (!n z. z IN s ==> ~(f n z = Cx(&0)))
15216 ==> (!z. z IN s ==> ~(g z = Cx(&0)))`,
15217 REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `z0:complex` THEN
15218 REPEAT DISCH_TAC THEN
15219 MP_TAC(ISPECL [`g:complex->complex`; `s:complex->bool`; `z0:complex`]
15220 HOLOMORPHIC_FACTOR_ZERO_NONCONSTANT) THEN ASM_REWRITE_TAC[] THEN
15221 REWRITE_TAC[NOT_EXISTS_THM] THEN
15222 MAP_EVERY X_GEN_TAC [`h:complex->complex`; `r:real`; `m:num`] THEN
15225 [`sequentially`; `\n:num z. complex_derivative (f n) z / f n z`;
15226 `\z. complex_derivative g z / g z`; `z0:complex`; `r / &2`]
15227 PATH_INTEGRAL_UNIFORM_LIMIT_CIRCLEPATH) THEN
15228 ASM_REWRITE_TAC[REAL_HALF; TRIVIAL_LIMIT_SEQUENTIALLY; NOT_IMP] THEN
15230 `!n:num. ((\z. complex_derivative (f n) z / f n z)
15231 has_path_integral (Cx(&0))) (circlepath(z0,r / &2))`
15233 [X_GEN_TAC `n:num` THEN MATCH_MP_TAC CAUCHY_THEOREM_DISC_SIMPLE THEN
15234 MAP_EVERY EXISTS_TAC [`z0:complex`; `r:real`] THEN
15235 ASM_SIMP_TAC[VALID_PATH_CIRCLEPATH; PATHSTART_CIRCLEPATH;
15236 PATHFINISH_CIRCLEPATH; PATH_IMAGE_CIRCLEPATH;
15237 REAL_HALF; REAL_LT_IMP_LE] THEN
15238 REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
15239 REWRITE_TAC[SUBSET; IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
15240 ASM_SIMP_TAC[IN_ELIM_THM; REAL_ARITH `&0 < r ==> r / &2 < r`] THEN
15241 MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN REPEAT CONJ_TAC THENL
15242 [REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
15243 REWRITE_TAC[OPEN_BALL];
15244 REWRITE_TAC[ETA_AX];
15245 ASM_MESON_TAC[SUBSET]] THEN
15246 ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET];
15248 REPEAT CONJ_TAC THENL
15249 [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
15250 REWRITE_TAC[path_integrable_on] THEN ASM_MESON_TAC[];
15251 MATCH_MP_TAC UNIFORM_LIM_COMPLEX_DIV THEN
15252 REWRITE_TAC[LEFT_EXISTS_AND_THM; CONJ_ASSOC] THEN
15253 REWRITE_TAC[RIGHT_EXISTS_AND_THM; GSYM CONJ_ASSOC] THEN
15254 REWRITE_TAC[LEFT_EXISTS_AND_THM] THEN
15255 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; REAL_HALF; REAL_LT_IMP_LE] THEN
15256 REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
15257 REWRITE_TAC[IN_ELIM_THM] THEN REPEAT CONJ_TAC THENL
15258 [MP_TAC(ISPEC `IMAGE (complex_derivative g) {w | norm(w - z0) = r / &2}`
15259 COMPACT_IMP_BOUNDED) THEN
15261 [MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
15263 REWRITE_RULE[sphere; NORM_ARITH `dist(w:real^N,z) = norm(z - w)`]
15264 COMPACT_SPHERE] THEN
15265 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
15266 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
15267 EXISTS_TAC `s:complex->bool` THEN
15268 ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE] THEN
15269 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15270 SUBSET_TRANS)) THEN
15271 REWRITE_TAC[SUBSET; IN_BALL; IN_ELIM_THM] THEN
15272 UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH;
15273 REWRITE_TAC[bounded; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
15274 MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN DISCH_TAC THEN
15275 MATCH_MP_TAC ALWAYS_EVENTUALLY THEN ASM_SIMP_TAC[]];
15276 MP_TAC(ISPEC `IMAGE (norm o (g:complex->complex))
15277 {w | norm(w - z0) = r / &2}`
15278 COMPACT_ATTAINS_INF) THEN
15279 REWRITE_TAC[EXISTS_IN_IMAGE; FORALL_IN_IMAGE; IMAGE_EQ_EMPTY] THEN
15280 REWRITE_TAC[GSYM IMAGE_o; FORALL_IN_GSPEC; EXISTS_IN_GSPEC; o_THM] THEN
15283 [MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
15285 REWRITE_RULE[sphere; NORM_ARITH `dist(w:real^N,z) = norm(z - w)`]
15286 COMPACT_SPHERE] THEN
15287 MATCH_MP_TAC CONTINUOUS_ON_LIFT_NORM_COMPOSE THEN
15288 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON THEN
15289 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
15290 HOLOMORPHIC_ON_SUBSET)) THEN
15291 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15292 SUBSET_TRANS)) THEN
15293 REWRITE_TAC[SUBSET; IN_BALL; IN_ELIM_THM] THEN
15294 UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH;
15295 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN
15296 EXISTS_TAC `z0 + Cx(r / &2)` THEN
15297 REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^N = b`] THEN
15298 REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC];
15299 DISCH_THEN(X_CHOOSE_THEN `ww:complex` MP_TAC) THEN
15300 STRIP_TAC THEN EXISTS_TAC `norm((g:complex->complex) ww)` THEN
15301 ASM_SIMP_TAC[ALWAYS_EVENTUALLY; COMPLEX_NORM_NZ] THEN
15302 DISCH_THEN(ASSUME_TAC o REWRITE_RULE[COMPLEX_NORM_ZERO]) THEN
15303 UNDISCH_TAC `!w. w IN ball(z0,r) ==> g w = (w - z0) pow m * h w` THEN
15304 DISCH_THEN(MP_TAC o SPEC `ww:complex`) THEN
15305 CONV_TAC(ONCE_DEPTH_CONV SYM_CONV) THEN
15306 ASM_SIMP_TAC[COMPLEX_ENTIRE; COMPLEX_POW_EQ_0] THEN
15307 REWRITE_TAC[IN_BALL; GSYM COMPLEX_NORM_ZERO] THEN
15308 ASM_REWRITE_TAC[ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
15309 ASM_REAL_ARITH_TAC];
15310 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
15311 FIRST_ASSUM(MP_TAC o SPECL
15312 [`cball(z0:complex,&3 * r / &4)`; `r / &4 * e / &2`]) THEN
15313 REWRITE_TAC[COMPACT_CBALL] THEN ANTS_TAC THENL
15314 [ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
15315 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15316 SUBSET_TRANS)) THEN
15317 REWRITE_TAC[SUBSET; IN_BALL; IN_CBALL; IN_ELIM_THM] THEN
15318 UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH;
15319 REWRITE_TAC[GE; EVENTUALLY_SEQUENTIALLY; IN_CBALL; dist] THEN
15320 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
15321 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `n:num` THEN
15322 DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN
15323 ASM_REWRITE_TAC[] THEN DISCH_TAC] THEN
15324 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
15326 [`\z. (f:num->complex->complex) n z - g z`;
15327 `w:complex`; `Cx(&0)`; `r / &4`; `r / &4 * e / &2`; `1`]
15328 CAUCHY_HIGHER_COMPLEX_DERIVATIVE_BOUND) THEN
15329 REWRITE_TAC[HIGHER_COMPLEX_DERIVATIVE_1; COMPLEX_IN_BALL_0] THEN
15331 [CONJ_TAC THENL [ASM_REAL_ARITH_TAC; CONV_TAC NUM_REDUCE_CONV] THEN
15332 REPEAT CONJ_TAC THENL
15334 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
15335 X_GEN_TAC `y:complex` THEN REWRITE_TAC[IN_BALL] THEN
15336 DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15337 MAP_EVERY UNDISCH_TAC
15338 [`norm(w - z0:complex) = r / &2`; `dist(w:complex,y) < r / &4`] THEN
15339 CONV_TAC NORM_ARITH] THEN
15340 (MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
15341 CONJ_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
15342 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[ETA_AX] THEN
15343 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15344 SUBSET_TRANS)) THEN
15345 REWRITE_TAC[SUBSET; IN_BALL; IN_CBALL; IN_ELIM_THM] THEN
15346 UNDISCH_TAC `norm(w - z0:complex) = r / &2` THEN
15347 UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH);
15348 CONV_TAC NUM_REDUCE_CONV THEN
15349 ASM_SIMP_TAC[REAL_FIELD
15351 ==> &1 * (r / &4 * e / &2) / (r / &4) pow 1 = e / &2`] THEN
15352 MATCH_MP_TAC(NORM_ARITH
15353 `x = y /\ &0 < e ==> norm(x) <= e / &2 ==> norm(y) < e`) THEN
15354 ASM_REWRITE_TAC[] THEN
15355 MATCH_MP_TAC COMPLEX_DERIVATIVE_SUB THEN CONJ_TAC THEN
15356 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
15357 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
15358 FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
15359 ASM_REWRITE_TAC[IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
15360 ASM_REAL_ARITH_TAC];
15361 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
15362 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
15363 FIRST_X_ASSUM(MP_TAC o SPECL
15364 [`{w:complex | norm(w - z0) = r / &2}`; `e:real`]) THEN
15365 ASM_REWRITE_TAC[GE; IN_ELIM_THM;
15366 REWRITE_RULE[sphere; NORM_ARITH `dist(w:real^N,z) = norm(z - w)`]
15367 COMPACT_SPHERE] THEN
15368 ANTS_TAC THENL [ALL_TAC; MESON_TAC[]] THEN
15369 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15370 SUBSET_TRANS)) THEN
15371 REWRITE_TAC[SUBSET; IN_BALL; IN_ELIM_THM] THEN
15372 UNDISCH_TAC `&0 < r` THEN CONV_TAC NORM_ARITH];
15373 FIRST_ASSUM(ASSUME_TAC o GEN `n:num` o MATCH_MP PATH_INTEGRAL_UNIQUE o
15375 DISCH_THEN(MP_TAC o CONJUNCT2) THEN
15376 ASM_REWRITE_TAC[LIM_CONST_EQ; TRIVIAL_LIMIT_SEQUENTIALLY] THEN
15377 MATCH_MP_TAC(COMPLEX_RING
15378 `!q r. p = q /\ q = r /\ ~(r = Cx(&0)) ==> ~(Cx(&0) = p)`) THEN
15379 MAP_EVERY EXISTS_TAC
15380 [`path_integral (circlepath(z0,r / &2))
15381 (\z. Cx(&m) / (z - z0) +
15382 complex_derivative h z / h z)`;
15383 `Cx(&2) * Cx pi * ii * Cx(&m)`] THEN
15384 REPEAT CONJ_TAC THENL
15385 [MATCH_MP_TAC PATH_INTEGRAL_EQ THEN X_GEN_TAC `w:complex` THEN
15386 ASM_SIMP_TAC[PATH_IMAGE_CIRCLEPATH; IN_ELIM_THM; REAL_HALF;
15387 REAL_LT_IMP_LE; sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
15388 ASM_CASES_TAC `w:complex = z0` THEN
15389 ASM_REWRITE_TAC[VECTOR_SUB_REFL; NORM_0] THENL
15390 [ASM_REAL_ARITH_TAC; DISCH_TAC] THEN
15391 SUBGOAL_THEN `w IN ball(z0:complex,r)` ASSUME_TAC THENL
15392 [REWRITE_TAC[IN_BALL] THEN
15393 MAP_EVERY UNDISCH_TAC [`norm (w - z0) = r / &2`; `&0 < r`] THEN
15394 CONV_TAC NORM_ARITH;
15396 ASM_SIMP_TAC[] THEN
15397 ASM_SIMP_TAC[COMPLEX_ENTIRE; COMPLEX_POW_EQ_0; COMPLEX_SUB_0;
15398 COMPLEX_FIELD `~(y = Cx(&0)) ==> (x / y = w <=> x = y * w)`] THEN
15399 ASM_SIMP_TAC[COMPLEX_FIELD
15400 `~(h = Cx(&0)) ==> (m * h) * (x + y / h) = m * y + m * h * x`] THEN
15401 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
15402 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
15403 EXISTS_TAC `\w:complex. (w - z0) pow m * h w` THEN
15404 EXISTS_TAC `ball(z0:complex,r)` THEN ASM_SIMP_TAC[OPEN_BALL] THEN
15406 `(w - z0) pow m * h w * Cx(&m) / (w - z0) =
15407 (Cx(&m) * (w - z0) pow (m - 1)) * h w`
15409 [MATCH_MP_TAC(COMPLEX_FIELD
15410 `w * mm = z /\ ~(w = Cx(&0))
15411 ==> z * h * m / w = (m * mm) * h`) THEN
15412 ASM_REWRITE_TAC[COMPLEX_SUB_0; GSYM(CONJUNCT2 complex_pow)] THEN
15413 AP_TERM_TAC THEN ASM_ARITH_TAC;
15414 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_MUL_AT THEN CONJ_TAC THENL
15415 [COMPLEX_DIFF_TAC THEN CONV_TAC COMPLEX_RING;
15416 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
15417 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT; OPEN_BALL]]];
15418 GEN_REWRITE_TAC RAND_CONV [GSYM COMPLEX_ADD_RID] THEN
15419 MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
15420 MATCH_MP_TAC HAS_PATH_INTEGRAL_ADD THEN CONJ_TAC THENL
15421 [MATCH_MP_TAC CAUCHY_INTEGRAL_CIRCLEPATH_SIMPLE THEN
15422 ASM_REWRITE_TAC[CENTRE_IN_BALL; REAL_HALF; HOLOMORPHIC_ON_CONST];
15423 MATCH_MP_TAC CAUCHY_THEOREM_DISC_SIMPLE THEN
15424 MAP_EVERY EXISTS_TAC [`z0:complex`; `r:real`] THEN
15425 ASM_SIMP_TAC[VALID_PATH_CIRCLEPATH; PATHSTART_CIRCLEPATH;
15426 PATHFINISH_CIRCLEPATH; PATH_IMAGE_CIRCLEPATH;
15427 REAL_HALF; REAL_LT_IMP_LE] THEN
15428 REWRITE_TAC[sphere; NORM_ARITH `dist(z,w) = norm(w - z)`] THEN
15429 REWRITE_TAC[SUBSET; IN_BALL; ONCE_REWRITE_RULE[DIST_SYM] dist] THEN
15430 ASM_SIMP_TAC[IN_ELIM_THM; REAL_ARITH `&0 < r ==> r / &2 < r`] THEN
15431 MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN ASM_REWRITE_TAC[ETA_AX] THEN
15432 MATCH_MP_TAC HOLOMORPHIC_COMPLEX_DERIVATIVE THEN
15433 ASM_REWRITE_TAC[OPEN_BALL]];
15434 REWRITE_TAC[COMPLEX_ENTIRE; CX_INJ; PI_NZ; II_NZ; REAL_OF_NUM_EQ] THEN
15435 ASM_SIMP_TAC[LE_1; ARITH_EQ] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15436 ASM_REWRITE_TAC[CENTRE_IN_BALL]]]);;
15438 let HURWITZ_INJECTIVE = prove
15439 (`!f:num->complex->complex g s.
15440 open s /\ connected s /\
15441 (!n. (f n) holomorphic_on s) /\ g holomorphic_on s /\
15442 (!k e. compact k /\ k SUBSET s /\ &0 < e
15443 ==> ?N. !n x. n >= N /\ x IN k ==> norm(f n x - g x) < e) /\
15444 ~(?c. !z. z IN s ==> g z = c) /\
15445 (!n w z. w IN s /\ z IN s /\ f n w = f n z ==> w = z)
15446 ==> (!w z. w IN s /\ z IN s /\ g w = g z ==> w = z)`,
15447 REPEAT GEN_TAC THEN STRIP_TAC THEN
15448 MAP_EVERY X_GEN_TAC [`z1:complex`; `z2:complex`] THEN
15449 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
15450 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN REPEAT DISCH_TAC THEN
15451 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN
15452 DISCH_THEN(MP_TAC o SPEC `(g:complex->complex) z2`) THEN
15453 REWRITE_TAC[] THEN X_GEN_TAC `z0:complex` THEN
15454 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN REPEAT DISCH_TAC THEN
15455 RULE_ASSUM_TAC(REWRITE_RULE[MESON[]
15456 `(!x y. x IN s /\ y IN s /\ g x = g y ==> x = y) <=>
15457 (!x y. x IN s /\ y IN s ==> (g x = g y <=> x = y))`]) THEN
15459 [`\z. (g:complex->complex) z - g z1`; `s:complex->bool`;
15460 `z2:complex`; `z0:complex`]
15461 ISOLATED_ZEROS) THEN
15462 ASM_SIMP_TAC[COMPLEX_SUB_0; HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_ID;
15463 HOLOMORPHIC_ON_CONST] THEN
15464 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
15466 [`\n z. (f:num->complex->complex) n z - f n z1`;
15467 `\z. (g:complex->complex) z - g z1`; `s DELETE (z1:complex)`]
15468 HURWITZ_NO_ZEROS) THEN
15469 REWRITE_TAC[NOT_IMP; COMPLEX_SUB_0] THEN REPEAT CONJ_TAC THENL
15470 [ASM_SIMP_TAC[OPEN_DELETE];
15471 ASM_SIMP_TAC[CONNECTED_OPEN_DELETE; DIMINDEX_2; LE_REFL];
15472 GEN_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
15473 EXISTS_TAC `s:complex->bool` THEN
15474 ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; ETA_AX; HOLOMORPHIC_ON_CONST] THEN
15476 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
15477 EXISTS_TAC `s:complex->bool` THEN
15478 ASM_SIMP_TAC[HOLOMORPHIC_ON_SUB; ETA_AX; HOLOMORPHIC_ON_CONST] THEN
15480 MAP_EVERY X_GEN_TAC [`k:complex->bool`; `e:real`] THEN STRIP_TAC THEN
15481 FIRST_ASSUM(ASSUME_TAC o MATCH_MP (SET_RULE
15482 `k SUBSET s DELETE z ==> k SUBSET s`)) THEN
15483 FIRST_X_ASSUM(fun th ->
15484 MP_TAC(SPECL [`k:complex->bool`; `e / &2`] th) THEN
15485 MP_TAC(SPECL [`{z1:complex}`; `e / &2`] th)) THEN
15486 ASM_REWRITE_TAC[COMPACT_SING; SING_SUBSET; REAL_HALF] THEN
15487 SIMP_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; IN_SING; FORALL_UNWIND_THM2] THEN
15488 REWRITE_TAC[IMP_IMP; RIGHT_IMP_FORALL_THM] THEN DISCH_THEN(CONJUNCTS_THEN2
15489 (X_CHOOSE_TAC `N1:num`) (X_CHOOSE_TAC `N2:num`)) THEN
15490 EXISTS_TAC `MAX N1 N2` THEN REPEAT STRIP_TAC THEN
15491 UNDISCH_THEN `(g:complex->complex) z1 = g z2` (SUBST1_TAC o SYM) THEN
15492 MATCH_MP_TAC(NORM_ARITH
15493 `norm(x1 - x2) < e / &2 /\ norm(y1 - y2) < e / &2
15494 ==> norm(x1 - y1 - (x2 - y2)) < e`) THEN
15495 ASM_MESON_TAC[ARITH_RULE `x >= MAX m n <=> x >= m /\ x >= n`];
15496 REWRITE_TAC[IN_DELETE; COMPLEX_EQ_SUB_RADD] THEN DISCH_THEN(CHOOSE_THEN
15497 (fun th -> MAP_EVERY (MP_TAC o C SPEC th)
15498 [`z0:complex`; `z1:complex`; `z2:complex`])) THEN
15500 REWRITE_TAC[IN_DELETE] THEN ASM_MESON_TAC[];
15501 REWRITE_TAC[IN_DELETE] THEN ASM_MESON_TAC[]]);;
15503 (* ------------------------------------------------------------------------- *)
15504 (* The Great Picard theorem. *)
15505 (* ------------------------------------------------------------------------- *)
15507 let GREAT_PICARD = prove
15509 open n /\ z IN n /\ ~(a = b) /\ f holomorphic_on (n DELETE z) /\
15510 (!w. w IN n DELETE z ==> ~(f w = a) /\ ~(f w = b))
15511 ==> ?l. (f --> l) (at z) \/ ((inv o f) --> l) (at z)`,
15514 open s /\ connected s /\ w IN s /\ &0 < r /\
15516 ==> h holomorphic_on s /\
15517 !z. z IN s ==> ~(h z = Cx(&0)) /\ ~(h z = Cx(&1))) /\
15518 (!h. h IN q ==> h IN p /\ norm(h w) <= r)
15519 ==> ?B n. &0 < B /\ open n /\ w IN n /\ n SUBSET s /\
15520 !h z. h IN q /\ z IN n ==> norm(h z) <= B`,
15521 REPEAT STRIP_TAC THEN
15522 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
15523 DISCH_THEN(MP_TAC o SPEC `w:complex`) THEN ASM_REWRITE_TAC[] THEN
15524 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
15525 MAP_EVERY EXISTS_TAC
15526 [`exp(pi * exp(pi * (&2 + &2 * r + &12)))`;
15527 `ball(w:complex,e / &2)`] THEN
15528 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; REAL_HALF] THEN
15529 REWRITE_TAC[REAL_EXP_POS_LT] THEN CONJ_TAC THENL
15530 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15531 SUBSET_TRANS)) THEN
15532 REWRITE_TAC[SUBSET_BALLS; DIST_REFL] THEN ASM_REAL_ARITH_TAC;
15534 MAP_EVERY X_GEN_TAC [`f:complex->complex`; `z:complex`] THEN
15536 REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`)) THEN
15537 ASM_CASES_TAC `(f:complex->complex) IN p` THEN ASM_REWRITE_TAC[] THEN
15538 REPEAT STRIP_TAC THEN
15540 [`\z. (f:complex->complex) (w + Cx e * z)`; `r:real`]
15542 ASM_REWRITE_TAC[DE_MORGAN_THM; COMPLEX_MUL_RZERO; COMPLEX_ADD_RID] THEN
15545 [GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
15546 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
15547 SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_MUL;
15548 HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID] THEN
15549 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
15550 HOLOMORPHIC_ON_SUBSET)) THEN
15551 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
15552 X_GEN_TAC `u:complex` THEN DISCH_TAC;
15553 X_GEN_TAC `u:complex` THEN DISCH_TAC THEN
15554 FIRST_X_ASSUM MATCH_MP_TAC] THEN
15555 FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
15556 REWRITE_TAC[IN_CBALL; NORM_ARITH `dist(w,w + z) = norm z`] THEN
15557 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
15558 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_ARITH
15559 `&0 < e ==> (abs e * u <= e <=> e * u <= e * &1)`] THEN
15560 ASM_MESON_TAC[COMPLEX_IN_CBALL_0];
15561 DISCH_THEN(MP_TAC o SPECL [`&1 / &2`; `Cx(inv e) * (z - w)`]) THEN
15562 REWRITE_TAC[COMPLEX_MUL_ASSOC; GSYM CX_MUL] THEN
15563 ASM_SIMP_TAC[REAL_MUL_RINV; COMPLEX_NORM_MUL; REAL_LT_IMP_NZ] THEN
15564 REWRITE_TAC[COMPLEX_RING `w + Cx(&1) * (z - w) = z`] THEN
15565 CONV_TAC REAL_RAT_REDUCE_CONV THEN DISCH_THEN MATCH_MP_TAC THEN
15566 REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_INV] THEN
15567 ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE] THEN
15568 ONCE_REWRITE_TAC[REAL_ARITH `inv e * x:real = x / e`] THEN
15569 ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
15570 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
15571 CONV_TAC NORM_ARITH]) in
15573 (`!s t:real^N->bool.
15574 connected t /\ ~(s = {}) /\ s SUBSET t /\ open s /\
15575 (!x. x limit_point_of s /\ x IN t ==> x IN s)
15577 REPEAT STRIP_TAC THEN
15578 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [CONNECTED_CLOPEN]) THEN
15579 DISCH_THEN(MP_TAC o SPEC `s:real^N->bool`) THEN
15580 ASM_REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN
15581 ASM_REWRITE_TAC[CLOSED_IN_LIMPT] THEN ASM_SIMP_TAC[OPEN_SUBSET]) in
15584 open s /\ connected s /\ w IN s /\
15586 ==> h holomorphic_on s /\
15587 !z. z IN s ==> ~(h z = Cx(&0)) /\ ~(h z = Cx(&1))) /\
15588 (!h. h IN q ==> h IN p /\ norm(h w) <= &1)
15589 ==> !k. compact k /\ k SUBSET s
15590 ==> ?b. !h z. h IN q /\ z IN k ==> norm(h z) <= b`,
15591 REPEAT GEN_TAC THEN STRIP_TAC THEN
15593 `u = {z | z IN s /\
15594 ?B n. &0 < B /\ open n /\ z IN n /\ n SUBSET s /\
15595 !h:complex->complex z'.
15596 h IN q /\ z' IN n ==> norm(h z') <= B}` THEN
15597 SUBGOAL_THEN `(u:complex->bool) SUBSET s` ASSUME_TAC THENL
15598 [EXPAND_TAC "u" THEN REWRITE_TAC[SUBSET_RESTRICT]; ALL_TAC] THEN
15599 SUBGOAL_THEN `u:complex->bool = s` ASSUME_TAC THENL
15600 [MATCH_MP_TAC lemma2 THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
15601 [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `w:complex` THEN
15602 EXPAND_TAC "u" THEN REWRITE_TAC[IN_ELIM_THM] THEN
15603 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC lemma1 THEN
15604 MAP_EVERY EXISTS_TAC [`p:(complex->complex)->bool`; `&1`] THEN
15605 ASM_REWRITE_TAC[REAL_LT_01];
15608 [ONCE_REWRITE_TAC[OPEN_SUBOPEN] THEN X_GEN_TAC `z:complex` THEN
15609 EXPAND_TAC "u" THEN REWRITE_TAC[IN_ELIM_THM] THEN
15610 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
15611 DISCH_THEN(X_CHOOSE_THEN `B:real` MP_TAC) THEN
15612 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:complex->bool` THEN
15613 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN EXPAND_TAC "u" THEN
15614 ONCE_REWRITE_TAC[SUBSET] THEN REWRITE_TAC[IN_ELIM_THM] THEN
15615 X_GEN_TAC `v:complex` THEN DISCH_TAC THEN
15616 CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
15617 MAP_EVERY EXISTS_TAC [`B:real`; `n:complex->bool`] THEN
15620 REWRITE_TAC[SUBSET] THEN X_GEN_TAC `v:complex` THEN STRIP_TAC THEN
15621 EXPAND_TAC "u" THEN REWRITE_TAC[IN_ELIM_THM] THEN
15622 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC lemma1 THEN
15623 EXISTS_TAC `p:(complex->complex)->bool` THEN
15624 ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[MESON[]
15625 `(?r. P r /\ Q r) <=> ~(!r. P r ==> ~Q r)`] THEN
15626 DISCH_THEN(MP_TAC o GEN `n:num` o SPEC `&n + &1:real`) THEN
15627 REWRITE_TAC[REAL_ARITH `&0 < &n + &1`] THEN
15628 GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [NOT_FORALL_THM] THEN
15629 ASM_SIMP_TAC[SKOLEM_THM] THEN
15630 REWRITE_TAC[NOT_IMP; GSYM CONJ_ASSOC; REAL_NOT_LE] THEN
15631 REWRITE_TAC[FORALL_AND_THM] THEN
15632 DISCH_THEN(X_CHOOSE_THEN `f:num->complex->complex` STRIP_ASSUME_TAC) THEN
15633 ABBREV_TAC `g:num->complex->complex = \n z. inv(f n z)` THEN
15634 SUBGOAL_THEN `!n:num. (g n) holomorphic_on s` ASSUME_TAC THENL
15635 [GEN_TAC THEN EXPAND_TAC "g" THEN MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN
15636 REWRITE_TAC[ETA_AX] THEN ASM SET_TAC[];
15639 `!n:num z:complex. z IN s ==> ~(g n z = Cx(&0)) /\ ~(g n z = Cx(&1))`
15640 STRIP_ASSUME_TAC THENL
15641 [X_GEN_TAC `n:num` THEN EXPAND_TAC "g" THEN
15642 REWRITE_TAC[COMPLEX_INV_EQ_0; COMPLEX_INV_EQ_1] THEN
15650 !h z. h IN {(g:num->complex->complex) n | n IN (:num)} /\ z IN n
15651 ==> norm(h z) <= B`
15653 [MATCH_MP_TAC lemma1 THEN
15654 EXISTS_TAC `{h | h holomorphic_on s /\
15655 !z. z IN s ==> ~(h z = Cx(&0)) /\ ~(h z = Cx(&1))}` THEN
15656 ASM_REWRITE_TAC[FORALL_IN_GSPEC] THEN EXISTS_TAC `&1` THEN
15657 ASM_REWRITE_TAC[IN_ELIM_THM; IN_UNIV; REAL_LT_01] THEN
15658 X_GEN_TAC `n:num` THEN EXPAND_TAC "g" THEN
15659 REWRITE_TAC[COMPLEX_NORM_INV] THEN MATCH_MP_TAC REAL_INV_LE_1 THEN
15660 ASM_MESON_TAC[REAL_ARITH `&n + &1 < f ==> &1 <= f`];
15661 REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_IN_GSPEC] THEN
15662 REWRITE_TAC[IN_UNIV] THEN STRIP_TAC] THEN
15663 UNDISCH_TAC `open(n:complex->bool)` THEN
15664 REWRITE_TAC[OPEN_CONTAINS_BALL] THEN
15665 DISCH_THEN(MP_TAC o SPEC `v:complex`) THEN ASM_REWRITE_TAC[] THEN
15666 DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
15667 MP_TAC(ISPECL [`g:num->complex->complex`;
15668 `{(g:num->complex->complex) n | n IN (:num)}`;
15669 `ball(v:complex,e)`] MONTEL) THEN
15670 ASM_REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_IN_GSPEC] THEN
15671 REWRITE_TAC[IN_UNIV; IMP_IMP; OPEN_BALL; GSYM CONJ_ASSOC] THEN
15672 REWRITE_TAC[NOT_IMP] THEN CONJ_TAC THENL
15673 [CONJ_TAC THENL [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET]; ASM SET_TAC[]];
15675 REWRITE_TAC[NOT_EXISTS_THM] THEN
15676 MAP_EVERY X_GEN_TAC [`h:complex->complex`; `j:num->num`] THEN
15678 SUBGOAL_THEN `h(v:complex) = Cx(&0)` ASSUME_TAC THENL
15679 [MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN
15680 EXISTS_TAC `\n:num. (g:num->complex->complex) (j n) v` THEN
15681 ASM_SIMP_TAC[CENTRE_IN_BALL; TRIVIAL_LIMIT_SEQUENTIALLY] THEN
15682 REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN
15683 MATCH_MP_TAC LIM_NULL_COMPARISON THEN EXISTS_TAC `\n. inv(&n)` THEN
15684 REWRITE_TAC[SEQ_HARMONIC] THEN
15685 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
15686 X_GEN_TAC `i:num` THEN DISCH_TAC THEN EXPAND_TAC "g" THEN
15687 REWRITE_TAC[COMPLEX_NORM_INV] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
15688 ASM_SIMP_TAC[REAL_OF_NUM_LT; LE_1] THEN
15689 TRANS_TAC REAL_LE_TRANS `&i + &1` THEN
15690 CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN
15691 TRANS_TAC REAL_LE_TRANS `&((j:num->num) i) + &1` THEN
15692 ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LE_RADD; REAL_OF_NUM_LE] THEN
15693 ASM_MESON_TAC[MONOTONE_BIGGER];
15696 [`(g:num->complex->complex) o (j:num->num)`;
15697 `h:complex->complex`; `ball(v:complex,e)`]
15698 HURWITZ_NO_ZEROS) THEN
15699 ASM_REWRITE_TAC[OPEN_BALL; CONNECTED_BALL] THEN
15700 ASM_REWRITE_TAC[NOT_IMP; o_THM] THEN REPEAT CONJ_TAC THENL
15701 [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_TRANS];
15705 DISCH_THEN(MP_TAC o SPEC `v:complex`) THEN
15706 ASM_REWRITE_TAC[CENTRE_IN_BALL]] THEN
15707 DISCH_THEN(X_CHOOSE_THEN `c:complex` (fun th ->
15708 MP_TAC th THEN MP_TAC(SPEC `v:complex` th))) THEN
15709 ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
15711 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [LIMPT_APPROACHABLE]) THEN
15712 DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
15713 DISCH_THEN(X_CHOOSE_THEN `y:complex` STRIP_ASSUME_TAC) THEN
15714 SUBGOAL_THEN `y IN ball(v:complex,e)` ASSUME_TAC THENL
15715 [REWRITE_TAC[IN_BALL] THEN ASM_MESON_TAC[DIST_SYM]; ALL_TAC] THEN
15716 UNDISCH_TAC `(y:complex) IN u` THEN EXPAND_TAC "u" THEN
15717 REWRITE_TAC[IN_ELIM_THM] THEN
15718 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC
15719 (X_CHOOSE_THEN `C:real` MP_TAC)) THEN
15720 DISCH_THEN(X_CHOOSE_THEN `nn:complex->bool` MP_TAC) THEN
15721 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
15722 DISCH_THEN(MP_TAC o GEN `n:num` o
15723 SPECL [`(f:num->complex->complex) n`; `y:complex`]) THEN
15724 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
15725 FIRST_X_ASSUM(MP_TAC o SPEC `{y:complex}`) THEN
15726 ASM_REWRITE_TAC[COMPACT_SING; SING_SUBSET] THEN
15727 DISCH_THEN(MP_TAC o SPEC `inv(C:real)`) THEN
15728 ASM_REWRITE_TAC[REAL_LT_INV_EQ; FORALL_IN_INSERT; NOT_IN_EMPTY] THEN
15729 DISCH_THEN(X_CHOOSE_THEN `n:num` (MP_TAC o SPEC `n:num`)) THEN
15730 ASM_SIMP_TAC[GE; LE_REFL; COMPLEX_SUB_RZERO; REAL_NOT_LT] THEN
15731 EXPAND_TAC "g" THEN REWRITE_TAC[COMPLEX_NORM_INV] THEN
15732 MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REWRITE_TAC[COMPLEX_NORM_NZ] THEN
15734 X_GEN_TAC `k:complex->bool` THEN STRIP_TAC THEN
15736 `!x:complex. x IN k ==> x IN u` MP_TAC
15737 THENL [ASM SET_TAC[]; ALL_TAC] THEN
15738 EXPAND_TAC "u" THEN REWRITE_TAC[IN_ELIM_THM] THEN
15739 DISCH_THEN(MP_TAC o MATCH_MP (MESON[]
15740 `(!x. P x ==> Q x /\ ?y z. R x y z) ==> !x. ?y z. P x ==> R x y z`)) THEN
15741 REWRITE_TAC[SKOLEM_THM; LEFT_IMP_EXISTS_THM] THEN
15742 MAP_EVERY X_GEN_TAC [`b:complex->real`; `n:complex->complex->bool`] THEN
15743 DISCH_TAC THEN FIRST_ASSUM(MP_TAC o
15744 MATCH_MP COMPACT_IMP_HEINE_BOREL) THEN
15745 DISCH_THEN(MP_TAC o SPEC `IMAGE (n:complex->complex->bool) k`) THEN
15746 ASM_SIMP_TAC[FORALL_IN_IMAGE; UNIONS_IMAGE] THEN
15747 ANTS_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
15748 ONCE_REWRITE_TAC[TAUT `p /\ q /\ r <=> q /\ p /\ r`] THEN
15749 REWRITE_TAC[EXISTS_FINITE_SUBSET_IMAGE] THEN
15750 DISCH_THEN(X_CHOOSE_THEN `j:complex->bool` MP_TAC) THEN
15751 ASM_CASES_TAC `j:complex->bool = {}` THEN
15752 ASM_REWRITE_TAC[IMAGE_CLAUSES; UNIONS_0] THENL
15753 [SET_TAC[]; STRIP_TAC] THEN
15754 EXISTS_TAC `sup(IMAGE (b:complex->real) j)` THEN
15755 ASM_SIMP_TAC[REAL_LE_SUP_FINITE; IMAGE_EQ_EMPTY; FINITE_IMAGE] THEN
15756 REWRITE_TAC[EXISTS_IN_IMAGE] THEN ASM SET_TAC[]]) in
15759 &0 < k /\ f holomorphic_on ball(Cx(&0),k) DELETE Cx(&0) /\
15760 (!e. &0 < e /\ e < k
15761 ==> ?d. &0 < d /\ d < e /\
15762 !z. z IN sphere(Cx(&0),d) ==> norm(f z) <= B)
15763 ==> ?e. &0 < e /\ e < k /\
15764 !z. z IN ball(Cx(&0),e) DELETE Cx(&0) ==> norm(f z) <= B`,
15765 REPEAT STRIP_TAC THEN
15766 FIRST_ASSUM(MP_TAC o SPEC `k / &2`) THEN
15767 ANTS_TAC THENL [ASM_REAL_ARITH_TAC; MATCH_MP_TAC MONO_EXISTS] THEN
15768 X_GEN_TAC `e:real` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
15769 CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
15770 REWRITE_TAC[IN_DELETE; COMPLEX_IN_BALL_0] THEN
15771 X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
15772 FIRST_ASSUM(MP_TAC o SPEC `norm(z:complex)`) THEN
15773 REWRITE_TAC[COMPLEX_NORM_NZ] THEN ASM_REWRITE_TAC[] THEN
15774 ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
15775 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
15777 `!w. w IN cball(Cx(&0),e) DIFF ball(Cx(&0),d) ==> norm(f w:complex) <= B`
15779 [MATCH_MP_TAC MAXIMUM_MODULUS_FRONTIER;
15780 ASM_REWRITE_TAC[IN_DIFF; COMPLEX_IN_BALL_0; COMPLEX_IN_CBALL_0] THEN
15781 ASM_REAL_ARITH_TAC] THEN
15782 SIMP_TAC[BOUNDED_CBALL; BOUNDED_DIFF; CONJ_ASSOC] THEN CONJ_TAC THENL
15783 [SIMP_TAC[CLOSURE_CLOSED; CLOSED_DIFF; CLOSED_CBALL; OPEN_BALL] THEN
15784 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
15785 (MESON[INTERIOR_SUBSET; HOLOMORPHIC_ON_SUBSET; SUBSET_TRANS;
15786 HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]
15787 `f holomorphic_on t ==> s SUBSET t
15788 ==> f holomorphic_on interior s /\ f continuous_on s`)) THEN
15789 MATCH_MP_TAC(SET_RULE
15790 `s SUBSET t /\ a IN u ==> s DIFF u SUBSET t DELETE a`) THEN
15791 ASM_REWRITE_TAC[CENTRE_IN_BALL; SUBSET_BALLS; DIST_REFL] THEN
15792 ASM_REAL_ARITH_TAC;
15793 X_GEN_TAC `w:complex` THEN
15794 ONCE_REWRITE_TAC[GSYM FRONTIER_COMPLEMENT] THEN
15795 REWRITE_TAC[SET_RULE `UNIV DIFF (s DIFF t) = (UNIV DIFF s) UNION t`] THEN
15796 DISCH_THEN(MP_TAC o MATCH_MP
15797 (REWRITE_RULE[SUBSET] FRONTIER_UNION_SUBSET)) THEN
15798 ASM_SIMP_TAC[FRONTIER_COMPLEMENT; FRONTIER_BALL; FRONTIER_CBALL] THEN
15801 (`!f. f holomorphic_on (ball(Cx(&0),&1) DELETE (Cx(&0))) /\
15802 (!z. z IN ball(Cx(&0),&1) DELETE Cx(&0)
15803 ==> ~(f z = Cx(&0)) /\ ~(f z = Cx(&1)))
15804 ==> ?e b. &0 < e /\ e < &1 /\ &0 < b /\
15805 ((!z. z IN ball(Cx(&0),e) DELETE Cx(&0)
15806 ==> norm(f z) <= b) \/
15807 (!z. z IN ball(Cx(&0),e) DELETE Cx(&0)
15808 ==> norm(f z) >= b))`,
15809 REPEAT STRIP_TAC THEN
15810 ABBREV_TAC `h = \n z. (f:complex->complex) (z / Cx(&n + &1))` THEN
15812 `(!n:num. (h n) holomorphic_on ball(Cx(&0),&1) DELETE Cx(&0)) /\
15813 (!n z. z IN ball(Cx(&0),&1) DELETE Cx(&0)
15814 ==> ~(h n z = Cx(&0)) /\ ~(h n z = Cx(&1)))`
15815 STRIP_ASSUME_TAC THENL
15816 [CONJ_TAC THEN X_GEN_TAC `n:num` THEN EXPAND_TAC "h" THEN SIMP_TAC[] THENL
15817 [ONCE_REWRITE_TAC[GSYM o_DEF] THEN
15818 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
15819 [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
15820 REWRITE_TAC[HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST; CX_INJ] THEN
15822 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
15823 HOLOMORPHIC_ON_SUBSET))];
15825 `!z. z IN ball (Cx(&0),&1) DELETE Cx(&0)
15826 ==> z / Cx(&n + &1) IN ball (Cx(&0),&1) DELETE Cx(&0)`
15827 (fun th -> ASM_MESON_TAC[th])] THEN
15828 REWRITE_TAC[IN_DELETE; FORALL_IN_IMAGE; SUBSET; COMPLEX_IN_BALL_0] THEN
15829 SIMP_TAC[COMPLEX_DIV_EQ_0; CX_INJ; REAL_ARITH `~(&n + &1 = &0)`] THEN
15830 SIMP_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ARITH `&0 < &n + &1`;
15831 REAL_ARITH `abs(&n + &1) = &n + &1`; REAL_LT_LDIV_EQ] THEN
15834 SUBGOAL_THEN `?w. w IN ball(Cx(&0),&1) DELETE Cx(&0)`
15835 STRIP_ASSUME_TAC THENL
15836 [EXISTS_TAC `Cx(&1 / &2)` THEN
15837 REWRITE_TAC[IN_DELETE; COMPLEX_IN_BALL_0; COMPLEX_NORM_CX; CX_INJ] THEN
15838 CONV_TAC REAL_RAT_REDUCE_CONV;
15841 [`{g | g holomorphic_on ball(Cx(&0),&1) DELETE Cx(&0) /\
15842 !z. z IN ball(Cx(&0),&1) DELETE Cx(&0)
15843 ==> ~(g z = Cx(&0)) /\ ~(g z = Cx(&1))}`;
15844 `ball(Cx(&0),&1) DELETE Cx(&0)`; `w:complex`] lemma3) THEN
15845 ASM_REWRITE_TAC[FORALL_IN_GSPEC] THEN
15846 SIMP_TAC[OPEN_BALL; OPEN_DELETE; CONNECTED_BALL; DIMINDEX_2; LE_REFL;
15847 CONNECTED_OPEN_DELETE; IN_ELIM_THM] THEN
15849 `INFINITE {n | norm((h:num->complex->complex) n w) <= &1} \/
15850 INFINITE {n | &1 <= norm((h:num->complex->complex) n w)}`
15852 [MP_TAC num_INFINITE THEN
15853 REWRITE_TAC[INFINITE; GSYM DE_MORGAN_THM; GSYM FINITE_UNION] THEN
15854 REWRITE_TAC[CONTRAPOS_THM] THEN MATCH_MP_TAC EQ_IMP THEN
15855 AP_TERM_TAC THEN SIMP_TAC[EXTENSION; IN_UNIV; IN_UNION; IN_ELIM_THM] THEN
15858 STRIP_TAC THEN FIRST_ASSUM(MP_TAC o MATCH_MP INFINITE_ENUMERATE_WEAK) THEN
15859 REWRITE_TAC[LEFT_IMP_EXISTS_THM; IN_ELIM_THM] THEN
15860 X_GEN_TAC `r:num->num` THEN STRIP_TAC THENL
15861 [DISCH_THEN(MP_TAC o SPEC
15862 `{(h:num->complex->complex) (r n) | n IN (:num)}`);
15863 DISCH_THEN(MP_TAC o SPEC
15864 `{inv o (h:num->complex->complex) (r n) | n IN (:num)}`)] THEN
15865 ASM_REWRITE_TAC[FORALL_IN_GSPEC; IN_UNIV] THEN
15866 ASM_SIMP_TAC[o_DEF; COMPLEX_INV_EQ_0; COMPLEX_INV_EQ_1] THEN
15867 ASM_SIMP_TAC[COMPLEX_NORM_INV; REAL_INV_LE_1] THEN
15868 ASM_SIMP_TAC[HOLOMORPHIC_ON_INV; ETA_AX] THEN
15869 DISCH_THEN(MP_TAC o SPEC `sphere(Cx(&0),&1 / &2)`) THEN
15871 [REWRITE_TAC[SUBSET; COMPLEX_IN_SPHERE_0; IN_DELETE; COMPLEX_IN_BALL_0;
15872 COMPACT_SPHERE; GSYM COMPLEX_NORM_NZ] THEN
15873 SIMP_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV;
15875 REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_IN_GSPEC] THEN
15876 EXPAND_TAC "h" THEN REWRITE_TAC[] THEN
15877 DISCH_THEN(X_CHOOSE_TAC `b:real`) THEN
15878 ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THENL
15879 [EXISTS_TAC `abs b + &1`; EXISTS_TAC `inv(abs b + &1)`] THEN
15880 REWRITE_TAC[REAL_LT_INV_EQ; REAL_ARITH `&0 < abs b + &1`] THEN
15881 REWRITE_TAC[LEFT_OR_DISTRIB; EXISTS_OR_THM] THENL
15882 [DISJ1_TAC THEN MATCH_MP_TAC lemma4 THEN
15883 ASM_REWRITE_TAC[REAL_LT_01];
15885 MP_TAC(ISPECL [`inv o (f:complex->complex)`; `&1`; `abs b + &1`]
15887 ASM_SIMP_TAC[HOLOMORPHIC_ON_INV; ETA_AX; o_DEF; REAL_LT_01] THEN
15890 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `e:real` THEN
15891 REWRITE_TAC[COMPLEX_NORM_INV; real_ge;
15892 IN_DELETE; COMPLEX_IN_BALL_0] THEN
15893 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
15894 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_INV_INV] THEN
15895 MATCH_MP_TAC REAL_LE_INV2 THEN ASM_SIMP_TAC[REAL_LT_INV_EQ] THEN
15896 REWRITE_TAC[COMPLEX_NORM_NZ] THEN
15897 MATCH_MP_TAC(TAUT `!q. ~p /\ ~q ==> ~p`) THEN
15898 EXISTS_TAC `f(z:complex) = Cx(&1)` THEN
15899 FIRST_X_ASSUM MATCH_MP_TAC THEN
15900 ASM_REWRITE_TAC[IN_DELETE; COMPLEX_IN_BALL_0] THEN
15901 ASM_REAL_ARITH_TAC]] THEN
15902 (X_GEN_TAC `e:real` THEN STRIP_TAC THEN
15903 MP_TAC(ISPEC `e:real` REAL_ARCH_INV) THEN
15904 ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
15905 X_GEN_TAC `n:num` THEN STRIP_TAC THEN
15906 EXISTS_TAC `inv(&2 * (&(r(n:num)) + &1))` THEN
15907 REWRITE_TAC[REAL_LT_INV_EQ] THEN
15908 CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN CONJ_TAC THENL
15909 [TRANS_TAC REAL_LET_TRANS `inv(&n)` THEN ASM_REWRITE_TAC[] THEN
15910 MATCH_MP_TAC REAL_LE_INV2 THEN
15911 ASM_SIMP_TAC[REAL_OF_NUM_LT; LE_1; REAL_OF_NUM_ADD] THEN
15912 REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN
15913 MATCH_MP_TAC(ARITH_RULE `m <= n ==> m <= 2 * (n + 1)`) THEN
15914 ASM_MESON_TAC[MONOTONE_BIGGER];
15916 X_GEN_TAC `z:complex` THEN REWRITE_TAC[COMPLEX_IN_SPHERE_0] THEN
15917 DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
15918 [`n:num`; `Cx(&(r(n:num)) + &1) * z`]) THEN
15919 ASM_REWRITE_TAC[COMPLEX_IN_SPHERE_0; COMPLEX_NORM_MUL; COMPLEX_NORM_CX;
15920 REAL_ARITH `abs(&n + &1) = &n + &1`] THEN
15921 ANTS_TAC THENL [CONV_TAC REAL_FIELD; ALL_TAC] THEN
15922 MATCH_MP_TAC(NORM_ARITH
15923 `x = y ==> norm x <= b ==> norm y <= abs b + &1`) THEN
15924 REPEAT AP_TERM_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
15925 `~(z = Cx(&0)) ==> (z * w) / z = w`) THEN
15926 REWRITE_TAC[CX_INJ] THEN REAL_ARITH_TAC)) in
15929 open n /\ z IN n /\ ~(a = Cx(&0)) /\ f holomorphic_on (n DELETE z) /\
15930 (!w. w IN n DELETE z ==> ~(f w = Cx(&0)) /\ ~(f w = a))
15931 ==> ?r. &0 < r /\ ball(z,r) SUBSET n /\
15932 (bounded(IMAGE f (ball (z,r) DELETE z)) \/
15933 bounded(IMAGE (inv o f) (ball (z,r) DELETE z)))`,
15934 REPEAT STRIP_TAC THEN
15935 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
15936 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
15937 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
15939 `\w. (f:complex->complex) (z + Cx r * w) / a` lemma5) THEN
15940 REWRITE_TAC[] THEN ANTS_TAC THENL
15942 [MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
15943 ASM_REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
15944 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
15945 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
15946 SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_MUL;
15947 HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST] THEN
15948 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
15949 HOLOMORPHIC_ON_SUBSET)) THEN
15950 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0; IN_DELETE] THEN
15951 GEN_TAC THEN STRIP_TAC;
15952 ASM_SIMP_TAC[COMPLEX_FIELD
15953 `~(a = Cx(&0)) ==> (x / a = z <=> x = a * z)`] THEN
15954 ASM_REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_MUL_RID] THEN
15955 REWRITE_TAC[COMPLEX_IN_BALL_0; IN_DELETE] THEN GEN_TAC THEN
15956 STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15957 REWRITE_TAC[IN_DELETE]] THEN
15958 ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ; COMPLEX_RING
15959 `z + a * b = z <=> a = Cx(&0) \/ b = Cx(&0)`] THEN
15960 FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
15961 REWRITE_TAC[IN_BALL; NORM_ARITH `dist(a,a + b) = norm b`] THEN
15962 ASM_SIMP_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; real_abs; REAL_LT_IMP_LE;
15963 REAL_ARITH `r * x < r <=> &0 < r * (&1 - x)`] THEN
15964 MATCH_MP_TAC REAL_LT_MUL THEN ASM_REAL_ARITH_TAC;
15965 REWRITE_TAC[LEFT_IMP_EXISTS_THM; bounded; FORALL_IN_IMAGE; o_THM]] THEN
15966 MAP_EVERY X_GEN_TAC [`e:real`; `b:real`] THEN
15967 DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
15968 EXISTS_TAC `e * r:real` THEN ASM_SIMP_TAC[REAL_LT_MUL] THEN
15969 MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
15970 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
15971 SUBSET_TRANS)) THEN
15972 ASM_SIMP_TAC[SUBSET_BALLS; REAL_ADD_LID; DIST_REFL; REAL_LT_MUL;
15973 REAL_SUB_LT; REAL_ARITH `&0 < r * (&1 - e) ==> e * r <= r`];
15975 FIRST_X_ASSUM(DISJ_CASES_THEN (LABEL_TAC "*")) THENL
15976 [DISJ1_TAC THEN EXISTS_TAC `norm(a:complex) * b`;
15977 DISJ2_TAC THEN EXISTS_TAC `inv(norm(a:complex) * b)`] THEN
15978 X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_BALL; IN_DELETE] THEN
15980 REMOVE_THEN "*" (MP_TAC o SPEC `(w - z) / Cx r`) THEN
15981 ASM_SIMP_TAC[IN_DELETE; COMPLEX_IN_BALL_0; COMPLEX_DIV_EQ_0;
15982 COMPLEX_SUB_0; CX_INJ; REAL_LT_IMP_NZ; COMPLEX_NORM_DIV;
15983 COMPLEX_NORM_CX; real_abs; REAL_LT_IMP_LE; REAL_LT_LDIV_EQ;
15984 NORM_ARITH `norm(w - z) = dist(z,w)`; COMPLEX_DIV_LMUL] THEN
15985 REWRITE_TAC[real_ge; COMPLEX_RING `z + w - z:complex = w`] THEN
15986 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
15987 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; COMPLEX_NORM_NZ] THEN
15988 DISCH_TAC THEN REWRITE_TAC[COMPLEX_NORM_INV] THEN
15989 MATCH_MP_TAC REAL_LE_INV2 THEN
15990 ASM_SIMP_TAC[REAL_LT_MUL; COMPLEX_NORM_NZ]) in
15991 REPEAT STRIP_TAC THEN
15992 MP_TAC(ISPECL [`\z. (f:complex->complex) z - a`; `n:complex->bool`;
15993 `b - a:complex`; `z:complex`]
15995 ASM_SIMP_TAC[COMPLEX_SUB_0; HOLOMORPHIC_ON_SUB; ETA_AX; HOLOMORPHIC_ON_CONST;
15996 COMPLEX_RING `x - a:complex = y - a <=> x = y`] THEN
15997 DISCH_THEN(X_CHOOSE_THEN `r:real` MP_TAC) THEN
15998 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
15999 REWRITE_TAC[EXISTS_OR_THM] THEN MATCH_MP_TAC(TAUT
16000 `(p ==> r) /\ (~r /\ q ==> s) ==> p \/ q ==> r \/ s`) THEN
16001 REPEAT STRIP_TAC THENL
16002 [MP_TAC(ISPECL [`f:complex->complex`; `z:complex`; `ball(z:complex,r)`]
16003 HOLOMORPHIC_ON_EXTEND_BOUNDED) THEN
16004 ASM_SIMP_TAC[INTERIOR_OPEN; OPEN_BALL; CENTRE_IN_BALL] THEN ANTS_TAC THENL
16005 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
16006 HOLOMORPHIC_ON_SUBSET)) THEN
16008 MATCH_MP_TAC(TAUT `q /\ (p ==> r) ==> (p <=> q) ==> r`)] THEN
16010 [REWRITE_TAC[EVENTUALLY_AT; FORALL_IN_IMAGE; IN_BALL; IN_DELETE] THEN
16011 ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN EXISTS_TAC `r:real` THEN
16012 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [bounded]) THEN
16013 REWRITE_TAC[FORALL_IN_IMAGE; IN_BALL; DIST_NZ; IN_DELETE] THEN
16014 ASM_MESON_TAC[NORM_ARITH `norm(x - y) <= B ==> norm(x) <= norm(y) + B`;
16016 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16017 EXISTS_TAC `(g:complex->complex) z` THEN
16018 MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
16019 MAP_EVERY EXISTS_TAC [`g:complex->complex`; `ball(z:complex,r)`] THEN
16020 ASM_SIMP_TAC[OPEN_BALL; CENTRE_IN_BALL; IN_DELETE] THEN
16021 ASM_SIMP_TAC[GSYM CONTINUOUS_AT] THEN
16022 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; OPEN_BALL;
16023 CONTINUOUS_ON_EQ_CONTINUOUS_AT; CENTRE_IN_BALL]];
16024 MP_TAC(ISPECL [`\z. inv((f:complex->complex) z - a)`;
16025 `z:complex`; `ball(z:complex,r)`]
16026 HOLOMORPHIC_ON_EXTEND_BOUNDED) THEN
16027 ASM_SIMP_TAC[INTERIOR_OPEN; OPEN_BALL; CENTRE_IN_BALL] THEN ANTS_TAC THENL
16028 [MATCH_MP_TAC HOLOMORPHIC_ON_INV THEN REWRITE_TAC[COMPLEX_SUB_0] THEN
16029 CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
16030 MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
16031 REWRITE_TAC[HOLOMORPHIC_ON_CONST; ETA_AX] THEN
16032 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
16033 HOLOMORPHIC_ON_SUBSET)) THEN
16035 MATCH_MP_TAC(TAUT `q /\ (p ==> r) ==> (p <=> q) ==> r`)] THEN
16037 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [bounded]) THEN
16038 SIMP_TAC[EVENTUALLY_AT; o_DEF; FORALL_IN_IMAGE; IN_BALL; IN_DELETE] THEN
16039 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `B:real` THEN STRIP_TAC THEN
16040 EXISTS_TAC `r:real` THEN ASM_MESON_TAC[DIST_NZ; DIST_SYM];
16041 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC)] THEN
16042 SUBGOAL_THEN `((g:complex->complex) --> g z) (at z)` ASSUME_TAC THENL
16043 [ASM_SIMP_TAC[GSYM CONTINUOUS_AT] THEN
16044 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON; OPEN_BALL;
16045 CONTINUOUS_ON_EQ_CONTINUOUS_AT; CENTRE_IN_BALL];
16047 ASM_CASES_TAC `(g:complex->complex) z = Cx(&0)` THENL
16048 [EXISTS_TAC `Cx(&0)` THEN
16049 MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
16050 EXISTS_TAC `\w:complex. g(w) / (Cx(&1) + a * g w)` THEN
16051 EXISTS_TAC `ball(z:complex,r)` THEN
16052 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; o_DEF] THEN CONJ_TAC THENL
16053 [X_GEN_TAC `w:complex` THEN
16054 DISCH_TAC THEN ONCE_REWRITE_TAC[GSYM COMPLEX_INV_DIV] THEN
16055 AP_TERM_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
16056 `~(g = Cx(&0)) /\ inv(g) = f - a
16057 ==> (Cx(&1) + a * g) / g = f`) THEN
16058 ASM_SIMP_TAC[IN_DELETE; COMPLEX_INV_INV; COMPLEX_INV_EQ_0] THEN
16059 REWRITE_TAC[COMPLEX_SUB_0] THEN ASM SET_TAC[];
16060 SUBST1_TAC(COMPLEX_FIELD
16061 `Cx(&0) = Cx(&0) / (Cx(&1) + a * Cx(&0))`) THEN
16062 MATCH_MP_TAC LIM_COMPLEX_DIV THEN REPEAT CONJ_TAC THENL
16063 [ASM_MESON_TAC[]; ALL_TAC; CONV_TAC COMPLEX_RING] THEN
16064 MATCH_MP_TAC LIM_ADD THEN REWRITE_TAC[LIM_CONST] THEN
16065 MATCH_MP_TAC LIM_COMPLEX_MUL THEN REWRITE_TAC[LIM_CONST] THEN
16067 EXISTS_TAC `g(z:complex) / (Cx(&1) + a * g z)` THEN
16068 MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
16069 EXISTS_TAC `\w:complex. g(w) / (Cx(&1) + a * g w)` THEN
16070 EXISTS_TAC `ball(z:complex,r)` THEN
16071 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; o_DEF] THEN CONJ_TAC THENL
16072 [X_GEN_TAC `w:complex` THEN
16073 DISCH_TAC THEN ONCE_REWRITE_TAC[GSYM COMPLEX_INV_DIV] THEN
16074 AP_TERM_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
16075 `~(g = Cx(&0)) /\ inv(g) = f - a
16076 ==> (Cx(&1) + a * g) / g = f`) THEN
16077 ASM_SIMP_TAC[IN_DELETE; COMPLEX_INV_INV; COMPLEX_INV_EQ_0] THEN
16078 REWRITE_TAC[COMPLEX_SUB_0] THEN ASM SET_TAC[];
16080 MATCH_MP_TAC LIM_COMPLEX_DIV THEN
16081 ASM_SIMP_TAC[LIM_ADD; LIM_COMPLEX_MUL; LIM_CONST] THEN DISCH_TAC THEN
16082 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN
16083 DISCH_THEN(MP_TAC o SPEC `Cx(&0) / g(z:complex)`) THEN REWRITE_TAC[] THEN
16084 MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
16085 EXISTS_TAC `\w:complex. (Cx(&1) + a * g w) / g w` THEN
16086 EXISTS_TAC `ball(z:complex,r)` THEN
16087 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; o_DEF] THEN CONJ_TAC THENL
16088 [X_GEN_TAC `w:complex` THEN
16089 DISCH_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
16090 `~(g = Cx(&0)) /\ inv(g) = f - a
16091 ==> (Cx(&1) + a * g) / g = f`) THEN
16092 ASM_SIMP_TAC[IN_DELETE; COMPLEX_INV_INV; COMPLEX_INV_EQ_0] THEN
16093 REWRITE_TAC[COMPLEX_SUB_0] THEN ASM SET_TAC[];
16095 MATCH_MP_TAC LIM_COMPLEX_DIV THEN ASM_REWRITE_TAC[] THEN
16096 FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
16097 ASM_SIMP_TAC[LIM_ADD; LIM_CONST; LIM_COMPLEX_MUL]]]);;
16099 let GREAT_PICARD_ALT = prove
16101 open n /\ z IN n /\ f holomorphic_on (n DELETE z) /\
16102 ~(?l. (f --> l) (at z) \/ ((inv o f) --> l) (at z))
16103 ==> ?a. (:complex) DELETE a SUBSET IMAGE f (n DELETE z)`,
16104 REPEAT STRIP_TAC THEN
16105 MP_TAC(GENL [`a:complex`; `b:complex`]
16106 (ISPECL [`f:complex->complex`; `n:complex->bool`; `a:complex`; `b:complex`;
16107 `z:complex`] GREAT_PICARD)) THEN
16108 ASM_REWRITE_TAC[IN_DELETE; SUBSET; IN_UNIV; IN_IMAGE] THEN MESON_TAC[]);;
16110 let GREAT_PICARD_INFINITE = prove
16112 open n /\ z IN n /\ f holomorphic_on (n DELETE z) /\
16113 ~(?l. (f --> l) (at z) \/ ((inv o f) --> l) (at z))
16114 ==> ?a. !w. ~(w = a) ==> INFINITE {x | x IN n DELETE z /\ f x = w}`,
16115 REPEAT STRIP_TAC THEN MATCH_MP_TAC(MESON[]
16116 `(!a b. ~(a = b) /\ ~(P a) /\ ~(P b) ==> F)
16117 ==> ?a. !w. ~(w = a) ==> P w`) THEN
16118 MAP_EVERY X_GEN_TAC [`a:complex`; `b:complex`] THEN
16119 REWRITE_TAC[INFINITE; GSYM FINITE_UNION; SET_RULE
16120 `{x | x IN s /\ f x = a} UNION {x | x IN s /\ f x = b} =
16121 {x | x IN s /\ f x IN {a,b}}`] THEN
16124 `?r. &0 < r /\ ball(z:complex,r) SUBSET n /\
16125 !x. x IN n DELETE z /\ f x IN {a:complex, b} ==> ~(x IN ball(z,r))`
16126 STRIP_ASSUME_TAC THENL
16127 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
16128 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
16129 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
16131 `{x | x IN n DELETE z /\ (f:complex->complex) x IN {a, b}} = {}`
16132 THENL [EXISTS_TAC `r:real` THEN ASM SET_TAC[]; ALL_TAC] THEN
16133 EXISTS_TAC `min r (inf (IMAGE (\x. dist(z,x))
16134 {x | x IN n DELETE z /\
16135 (f:complex->complex) x IN {a, b}}))` THEN
16136 REWRITE_TAC[IN_BALL; REAL_LT_MIN] THEN
16137 ASM_SIMP_TAC[REAL_LT_INF_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY] THEN
16138 ASM_REWRITE_TAC[FORALL_IN_IMAGE; FORALL_IN_GSPEC] THEN
16139 SIMP_TAC[IN_DELETE; DIST_NZ; DIST_SYM] THEN
16140 CONJ_TAC THENL [ALL_TAC; MESON_TAC[REAL_LT_REFL]] THEN
16141 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
16142 SUBSET_TRANS)) THEN
16143 REWRITE_TAC[SUBSET_BALLS; REAL_MIN_LE; DIST_REFL; REAL_ADD_LID;
16145 MP_TAC(ISPECL [`f:complex->complex`; `ball(z:complex,r)`;
16146 `a:complex`; `b:complex`; `z:complex`] GREAT_PICARD) THEN
16147 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL] THEN
16148 CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
16149 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
16150 HOLOMORPHIC_ON_SUBSET)) THEN
16153 let CASORATI_WEIERSTRASS = prove
16155 open n /\ z IN n /\ f holomorphic_on (n DELETE z) /\
16156 ~(?l. (f --> l) (at z) \/ ((inv o f) --> l) (at z))
16157 ==> closure(IMAGE f (n DELETE z)) = (:complex)`,
16158 REPEAT GEN_TAC THEN
16159 DISCH_THEN(X_CHOOSE_TAC `a:complex` o MATCH_MP GREAT_PICARD_ALT) THEN
16160 MATCH_MP_TAC(SET_RULE
16161 `!t. t SUBSET s /\ t = UNIV ==> s = UNIV`) THEN
16162 EXISTS_TAC `closure((:complex) DELETE a)` THEN
16163 ASM_SIMP_TAC[SUBSET_CLOSURE] THEN
16164 REWRITE_TAC[SET_RULE `s DELETE a = s DIFF {a}`] THEN
16165 REWRITE_TAC[CLOSURE_COMPLEMENT; INTERIOR_SING; DIFF_EMPTY]);;
16167 (* ------------------------------------------------------------------------- *)
16168 (* A big chain of equivalents of simple connectedness for an open set. *)
16169 (* ------------------------------------------------------------------------- *)
16171 let [SIMPLY_CONNECTED_EQ_WINDING_NUMBER_ZERO;
16172 SIMPLY_CONNECTED_EQ_PATH_INTEGRAL_ZERO;
16173 SIMPLY_CONNECTED_EQ_GLOBAL_PRIMITIVE;
16174 SIMPLY_CONNECTED_EQ_HOLOMORPHIC_LOG;
16175 SIMPLY_CONNECTED_EQ_HOLOMORPHIC_SQRT;
16176 SIMPLY_CONNECTED_EQ_INJECTIVE_HOLOMORPHIC_SQRT;
16177 SIMPLY_CONNECTED_EQ_BIHOLOMORPHIC_TO_DISC;
16178 SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] =
16179 (CONJUNCTS o prove)
16181 ==> (simply_connected s <=>
16183 !g z. path g /\ path_image g SUBSET s /\
16184 pathfinish g = pathstart g /\ ~(z IN s)
16185 ==> winding_number(g,z) = Cx(&0))) /\
16187 ==> (simply_connected s <=>
16189 !g f. valid_path g /\ path_image g SUBSET s /\
16190 pathfinish g = pathstart g /\ f holomorphic_on s
16191 ==> (f has_path_integral Cx(&0)) g)) /\
16193 ==> (simply_connected s <=>
16195 !f. f holomorphic_on s
16197 ==> (h has_complex_derivative f(z)) (at z))) /\
16199 ==> (simply_connected s <=>
16201 !f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0)))
16202 ==> ?g. g holomorphic_on s /\
16203 !z. z IN s ==> f z = cexp(g z))) /\
16205 ==> (simply_connected s <=>
16207 !f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0)))
16208 ==> ?g. g holomorphic_on s /\
16209 !z. z IN s ==> f z = g z pow 2)) /\
16211 ==> (simply_connected s <=>
16213 !f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0))) /\
16214 (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
16215 ==> ?g. g holomorphic_on s /\
16216 !z. z IN s ==> f z = g z pow 2)) /\
16218 ==> (simply_connected s <=>
16219 s = {} \/ s = (:complex) \/
16220 ?f g. f holomorphic_on s /\ g holomorphic_on ball(Cx(&0),&1) /\
16221 (!z. z IN s ==> f(z) IN ball(Cx(&0),&1) /\ g(f z) = z) /\
16222 (!z. z IN ball(Cx(&0),&1) ==> g(z) IN s /\ f(g z) = z))) /\
16224 ==> (simply_connected(s:complex->bool) <=>
16225 s = {} \/ s homeomorphic ball(Cx(&0),&1)))`,
16226 REWRITE_TAC[AND_FORALL_THM; TAUT
16227 `(p ==> q) /\ (p ==> r) <=> p ==> q /\ r`] THEN
16228 X_GEN_TAC `s:complex->bool` THEN DISCH_TAC THEN MATCH_MP_TAC(TAUT
16229 `(p0 ==> p1) /\ (p1 ==> p2) /\ (p2 ==> p3) /\ (p3 ==> p4) /\
16230 (p4 ==> p5) /\ (p5 ==> p6) /\ (p6 ==> p7) /\ (p7 ==> p8) /\ (p8 ==> p0)
16231 ==> (p0 <=> p1) /\ (p0 <=> p2) /\
16232 (p0 <=> p3) /\ (p0 <=> p4) /\
16233 (p0 <=> p5) /\ (p0 <=> p6) /\ (p0 <=> p7) /\ (p0 <=> p8)`) THEN
16234 REPEAT CONJ_TAC THENL
16235 [SIMP_TAC[SIMPLY_CONNECTED_IMP_CONNECTED] THEN
16236 MESON_TAC[SIMPLY_CONNECTED_IMP_WINDING_NUMBER_ZERO];
16238 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
16239 MATCH_MP_TAC CAUCHY_THEOREM_GLOBAL THEN
16240 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
16241 REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16242 ASM_SIMP_TAC[VALID_PATH_IMP_PATH];
16244 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `f:complex->complex` THEN
16245 ASM_CASES_TAC `s:complex->bool = {}` THENL
16246 [ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN ASM_MESON_TAC[]; DISCH_TAC] THEN
16247 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
16248 DISCH_THEN(X_CHOOSE_TAC `a:complex`) THEN EXISTS_TAC
16250 (@g. vector_polynomial_function g /\ path_image g SUBSET s /\
16251 pathstart g = a /\ pathfinish g = z)
16253 X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
16254 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
16255 DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN ASM_REWRITE_TAC[] THEN
16256 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
16257 REWRITE_TAC[has_complex_derivative] THEN
16258 REWRITE_TAC[has_derivative_at; LINEAR_COMPLEX_MUL] THEN
16259 MATCH_MP_TAC LIM_TRANSFORM THEN
16260 EXISTS_TAC `\y. inv(norm(y - x)) % (path_integral(linepath(x,y)) f -
16261 f x * (y - x))` THEN
16262 REWRITE_TAC[VECTOR_ARITH
16263 `i % (x - a) - i % (y - (z + a)) = i % (x + z - y)`] THEN
16265 [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
16266 EXISTS_TAC `d:real` THEN ASM_REWRITE_TAC[] THEN
16267 X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
16268 REWRITE_TAC[VECTOR_MUL_EQ_0] THEN DISJ2_TAC THEN MP_TAC(ISPEC
16269 `s:complex->bool` CONNECTED_OPEN_VECTOR_POLYNOMIAL_CONNECTED) THEN
16270 ASM_REWRITE_TAC[] THEN
16271 DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[] THEN
16272 SUBGOAL_THEN `(y:complex) IN s` ASSUME_TAC THENL
16273 [ASM_MESON_TAC[SUBSET; IN_CBALL; REAL_LT_IMP_LE; DIST_SYM];
16275 DISCH_THEN(fun th ->
16276 MP_TAC(SPEC `y:complex` th) THEN MP_TAC(SPEC `x:complex` th)) THEN
16277 ASM_REWRITE_TAC[] THEN MAP_EVERY ABBREV_TAC
16278 [`g1 = @g. vector_polynomial_function g /\ path_image g SUBSET s /\
16279 pathstart g = (a:complex) /\ pathfinish g = x`;
16280 `g2 = @g. vector_polynomial_function g /\ path_image g SUBSET s /\
16281 pathstart g = (a:complex) /\ pathfinish g = y`] THEN
16282 DISCH_THEN(MP_TAC o SELECT_RULE) THEN ASM_REWRITE_TAC[] THEN
16283 STRIP_TAC THEN DISCH_THEN(MP_TAC o SELECT_RULE) THEN
16284 ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
16285 FIRST_X_ASSUM(MP_TAC o SPECL
16286 [`g1 ++ linepath (x:complex,y) ++ reversepath g2`;
16287 `f:complex->complex`]) THEN
16288 ASM_REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN; PATHFINISH_REVERSEPATH;
16289 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
16290 SUBGOAL_THEN `segment[x:complex,y] SUBSET s` ASSUME_TAC THENL
16291 [MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `cball(x:complex,d)` THEN
16292 ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
16293 MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_CBALL] THEN
16294 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET] THEN
16295 ASM_SIMP_TAC[IN_CBALL; DIST_REFL] THEN
16296 ASM_MESON_TAC[REAL_LT_IMP_LE; DIST_SYM];
16299 `f path_integrable_on g1 /\ f path_integrable_on g2 /\
16300 f path_integrable_on linepath(x,y)`
16301 STRIP_ASSUME_TAC THENL
16302 [REPEAT CONJ_TAC THEN
16303 MATCH_MP_TAC PATH_INTEGRABLE_HOLOMORPHIC_SIMPLE THEN
16304 EXISTS_TAC `s:complex->bool` THEN
16305 ASM_SIMP_TAC[VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
16306 ASM_REWRITE_TAC[VALID_PATH_LINEPATH; PATH_IMAGE_LINEPATH];
16309 [ALL_TAC; DISCH_THEN(MP_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE)] THEN
16310 ASM_SIMP_TAC[VALID_PATH_JOIN_EQ; PATHSTART_JOIN; PATHFINISH_JOIN;
16311 PATHFINISH_REVERSEPATH; PATHSTART_LINEPATH;
16312 PATHFINISH_LINEPATH; VALID_PATH_VECTOR_POLYNOMIAL_FUNCTION;
16313 PATH_IMAGE_JOIN; PATH_IMAGE_LINEPATH;
16314 PATH_IMAGE_REVERSEPATH; PATHSTART_REVERSEPATH;
16315 VALID_PATH_LINEPATH; VALID_PATH_REVERSEPATH; UNION_SUBSET;
16316 PATH_INTEGRAL_JOIN; PATH_INTEGRABLE_JOIN;
16317 PATH_INTEGRABLE_REVERSEPATH; PATH_INTEGRAL_REVERSEPATH] THEN
16318 REWRITE_TAC[COMPLEX_VEC_0] THEN CONV_TAC COMPLEX_RING;
16319 REWRITE_TAC[LIM_AT] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
16320 SUBGOAL_THEN `(f:complex->complex) continuous at x` MP_TAC THENL
16321 [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
16322 CONTINUOUS_ON_EQ_CONTINUOUS_AT];
16324 REWRITE_TAC[continuous_at; dist; VECTOR_SUB_RZERO] THEN
16325 DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
16326 DISCH_THEN(X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC) THEN
16327 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
16328 DISCH_THEN(MP_TAC o SPEC `x:complex`) THEN
16329 ASM_REWRITE_TAC[SUBSET; IN_BALL; dist] THEN
16330 DISCH_THEN(X_CHOOSE_THEN `d2:real` STRIP_ASSUME_TAC) THEN
16331 EXISTS_TAC `min d1 d2` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
16332 X_GEN_TAC `y:complex` THEN STRIP_TAC THEN
16333 SUBGOAL_THEN `f path_integrable_on linepath(x,y)` MP_TAC THENL
16334 [MATCH_MP_TAC PATH_INTEGRABLE_CONTINUOUS_LINEPATH THEN
16335 MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
16336 EXISTS_TAC `s:complex->bool` THEN CONJ_TAC THENL
16337 [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
16338 CONTINUOUS_ON_EQ_CONTINUOUS_AT];
16339 MATCH_MP_TAC SUBSET_TRANS THEN
16340 EXISTS_TAC `ball(x:complex,d2)` THEN CONJ_TAC THENL
16341 [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
16342 MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
16343 REWRITE_TAC[SUBSET; IN_BALL; IN_INSERT; NOT_IN_EMPTY; dist] THEN
16344 REPEAT STRIP_TAC THEN
16345 ASM_REWRITE_TAC[dist; NORM_0; VECTOR_SUB_REFL] THEN
16346 ASM_MESON_TAC[NORM_SUB];
16347 ASM_REWRITE_TAC[SUBSET; dist; IN_BALL]]];
16349 REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
16350 X_GEN_TAC `z:complex` THEN
16351 MP_TAC(SPECL [`x:complex`; `y:complex`; `(f:complex->complex) x`]
16352 HAS_PATH_INTEGRAL_CONST_LINEPATH) THEN
16353 REWRITE_TAC[IMP_IMP] THEN
16354 DISCH_THEN(fun th -> ASSUME_TAC(CONJUNCT2 th) THEN MP_TAC th) THEN
16355 FIRST_ASSUM(SUBST1_TAC o MATCH_MP PATH_INTEGRAL_UNIQUE) THEN
16356 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_SUB) THEN
16357 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_NEG) THEN
16358 REWRITE_TAC[COMPLEX_NEG_SUB] THEN STRIP_TAC THEN
16359 MATCH_MP_TAC(REAL_ARITH `x <= e / &2 /\ &0 < e ==> x < e`) THEN
16360 ASM_REWRITE_TAC[NORM_MUL; REAL_ABS_INV; REAL_ABS_NORM] THEN
16361 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
16362 ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
16363 MATCH_MP_TAC HAS_PATH_INTEGRAL_BOUND_LINEPATH THEN
16364 EXISTS_TAC `\w. (f:complex->complex) w - f x` THEN
16365 ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> &0 <= e / &2`] THEN
16366 X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
16367 MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16368 ASM_MESON_TAC[REAL_LET_TRANS; SEGMENT_BOUND]];
16370 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `f:complex->complex` THEN
16371 ASM_CASES_TAC `s:complex->bool = {}` THENL
16372 [ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN ASM_MESON_TAC[]; STRIP_TAC] THEN
16373 FIRST_X_ASSUM(MP_TAC o SPEC `\z. complex_derivative f z / f z`) THEN
16374 ASM_SIMP_TAC[HOLOMORPHIC_COMPLEX_DERIVATIVE;
16375 HOLOMORPHIC_ON_DIV; ETA_AX] THEN
16376 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16377 MP_TAC(ISPECL [`\z:complex. cexp(g z) / f z`; `s:complex->bool`]
16378 HAS_COMPLEX_DERIVATIVE_ZERO_CONNECTED_CONSTANT) THEN
16379 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
16380 [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16382 `Cx(&0) = ((complex_derivative f z / f z * cexp(g z)) * f z -
16383 cexp(g z) * complex_derivative f z) / f z pow 2`
16385 [ASM_SIMP_TAC[COMPLEX_FIELD
16386 `~(z = Cx(&0)) ==> (d / z * e) * z = e * d`] THEN
16387 SIMPLE_COMPLEX_ARITH_TAC;
16388 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DIV_AT THEN
16389 ASM_SIMP_TAC[] THEN CONJ_TAC THENL
16390 [GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
16391 ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
16392 MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
16393 ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_CEXP];
16394 ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; complex_differentiable;
16395 HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE]]];
16396 DISCH_THEN(X_CHOOSE_THEN `c:complex` MP_TAC) THEN
16397 ASM_CASES_TAC `c = Cx(&0)` THENL
16398 [ASM_SIMP_TAC[CEXP_NZ; COMPLEX_FIELD
16399 `~(x = Cx(&0)) /\ ~(y = Cx(&0)) ==> ~(x / y = Cx(&0))`] THEN
16401 ASM_SIMP_TAC[COMPLEX_FIELD
16402 `~(y = Cx(&0)) /\ ~(z = Cx(&0))
16403 ==> (x / y = z <=> y = inv(z) * x)`] THEN
16404 DISCH_TAC THEN EXISTS_TAC `\z:complex. clog(inv c) + g z` THEN
16405 ASM_SIMP_TAC[CEXP_CLOG; CEXP_ADD; COMPLEX_INV_EQ_0] THEN
16406 MATCH_MP_TAC HOLOMORPHIC_ON_ADD THEN
16407 REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
16408 ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN]]];
16410 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
16411 X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
16412 FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`) THEN
16413 ASM_REWRITE_TAC[] THEN
16414 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16415 EXISTS_TAC `\z:complex. cexp(g z / Cx(&2))` THEN
16416 ASM_SIMP_TAC[GSYM CEXP_N; COMPLEX_RING `Cx(&2) * z / Cx(&2) = z`] THEN
16417 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
16418 MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
16419 REWRITE_TAC[HOLOMORPHIC_ON_CEXP] THEN
16420 MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
16421 ASM_SIMP_TAC[HOLOMORPHIC_ON_CONST] THEN
16422 CONV_TAC COMPLEX_RING;
16424 MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
16425 MATCH_MP_TAC MONO_FORALL THEN MESON_TAC[];
16427 POP_ASSUM MP_TAC THEN SPEC_TAC(`s:complex->bool`,`s:complex->bool`) THEN
16428 REWRITE_TAC[IMP_IMP; GSYM CONJ_ASSOC; FORALL_AND_THM] THEN
16431 open s /\ connected s /\ Cx(&0) IN s /\ s SUBSET ball(Cx(&0),&1) /\
16432 (!f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0))) /\
16433 (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
16434 ==> ?g. g holomorphic_on s /\ (!z. z IN s ==> f z = g z pow 2))
16435 ==> ?f g. f holomorphic_on s /\
16436 g holomorphic_on ball(Cx(&0),&1) /\
16437 (!z. z IN s ==> f z IN ball(Cx(&0),&1) /\ g(f z) = z) /\
16438 (!z. z IN ball(Cx(&0),&1) ==> g z IN s /\ f(g z) = z)`
16441 REPEAT STRIP_TAC THEN
16442 ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[] THEN
16443 ASM_CASES_TAC `s = (:complex)` THEN ASM_REWRITE_TAC[] THEN
16444 SUBGOAL_THEN `?a b:complex. a IN s /\ ~(b IN s)` STRIP_ASSUME_TAC THENL
16445 [ASM SET_TAC[]; ALL_TAC] THEN
16447 `?f. f holomorphic_on s /\
16449 IMAGE f s SUBSET ball(Cx(&0),&1) /\
16450 (!w z. w IN s /\ z IN s /\ f w = f z ==> w = z)`
16452 [FIRST_X_ASSUM(K ALL_TAC o SPEC `(:complex)`) THEN
16453 FIRST_X_ASSUM(MP_TAC o SPEC `\z:complex. z - b`) THEN ANTS_TAC THENL
16454 [SIMP_TAC[HOLOMORPHIC_ON_SUB; HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID;
16455 COMPLEX_RING `x - b:complex = y - b <=> x = y`] THEN
16456 ASM_MESON_TAC[COMPLEX_SUB_0];
16458 REWRITE_TAC[COMPLEX_EQ_SUB_RADD] THEN
16459 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16460 MP_TAC(ISPECL [`s:complex->bool`; `g:complex->complex`]
16461 OPEN_MAPPING_THM) THEN ASM_REWRITE_TAC[] THEN
16462 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
16463 DISCH_THEN(MP_TAC o SPEC `a:complex`) THEN ASM_REWRITE_TAC[SUBSET] THEN
16464 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN ANTS_TAC THENL
16465 [SUBGOAL_THEN `a IN ball(a,d) /\ (a + Cx(d / &2)) IN ball(a,d) /\
16466 ~(a + Cx(d / &2) = a)`
16467 MP_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
16468 ASM_REWRITE_TAC[CENTRE_IN_BALL;
16469 COMPLEX_EQ_ADD_LCANCEL_0; CX_INJ] THEN
16470 REWRITE_TAC[IN_BALL; NORM_ARITH `dist(a,a + d) = norm d`] THEN
16471 REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REAL_ARITH_TAC;
16473 DISCH_THEN(MP_TAC o SPEC `ball(a:complex,d)`) THEN
16474 ASM_REWRITE_TAC[OPEN_BALL] THEN REWRITE_TAC[OPEN_CONTAINS_BALL] THEN
16475 DISCH_THEN(MP_TAC o SPEC `(g:complex->complex) a`) THEN
16476 ASM_SIMP_TAC[FUN_IN_IMAGE; CENTRE_IN_BALL] THEN
16477 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
16478 SUBGOAL_THEN `!z:complex. z IN s ==> ~(g(z) IN ball(--(g a),r))`
16480 [REWRITE_TAC[IN_BALL] THEN X_GEN_TAC `z:complex` THEN
16481 REPEAT DISCH_TAC THEN
16482 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
16483 DISCH_THEN(MP_TAC o SPEC `--((g:complex->complex) z)`) THEN
16484 ASM_REWRITE_TAC[IN_BALL; NORM_ARITH `dist(w,--z) = dist(--w,z)`] THEN
16485 REWRITE_TAC[IN_IMAGE; NOT_EXISTS_THM] THEN X_GEN_TAC `w:complex` THEN
16486 ASM_CASES_TAC `w:complex = z` THENL
16487 [ASM_REWRITE_TAC[COMPLEX_RING `--z = z <=> z = Cx(&0)`] THEN
16488 ASM_MESON_TAC[COMPLEX_RING `Cx(&0) pow 2 + b = b`];
16489 ASM_MESON_TAC[COMPLEX_RING `(--z:complex) pow 2 = z pow 2`]];
16490 REWRITE_TAC[IN_BALL; NORM_ARITH `dist(--a,b) = norm(b + a)`] THEN
16491 ASM_CASES_TAC `!z:complex. z IN s ==> ~(g z + g a = Cx(&0))` THENL
16492 [REWRITE_TAC[REAL_NOT_LT] THEN DISCH_TAC;
16493 ASM_MESON_TAC[COMPLEX_NORM_0]] THEN
16494 EXISTS_TAC `\z:complex.
16495 Cx(r / &3) / (g z + g a) - Cx(r / &3) / (g a + g a)` THEN
16496 REWRITE_TAC[COMPLEX_SUB_REFL] THEN CONJ_TAC THENL
16497 [MATCH_MP_TAC HOLOMORPHIC_ON_SUB THEN
16498 REWRITE_TAC[HOLOMORPHIC_ON_CONST] THEN
16499 MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
16500 ASM_SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_CONST; ETA_AX];
16501 ASM_SIMP_TAC[IMP_CONJ; CX_INJ; REAL_LT_IMP_NZ;
16502 REAL_ARITH `&0 < r ==> ~(r / &3 = &0)`;
16504 `~(a = Cx(&0)) /\ ~(x + k = Cx(&0)) /\ ~(y + k = Cx(&0))
16505 ==> (a / (x + k) - c = a / (y + k) - c <=> x = y)`] THEN
16506 CONJ_TAC THENL [REWRITE_TAC[dist]; ASM_MESON_TAC[]] THEN
16507 REWRITE_TAC[FORALL_IN_IMAGE; COMPLEX_SUB_LZERO; NORM_NEG] THEN
16508 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16509 MATCH_MP_TAC(NORM_ARITH
16510 `norm(x) <= &1 / &3 /\ norm(y) <= &1 / &3
16511 ==> norm(x - y) < &1`) THEN
16512 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_DIV] THEN
16513 ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE; REAL_POS] THEN
16514 REWRITE_TAC[REAL_ARITH
16515 `r / &3 / x <= &1 / &3 <=> r / x <= &1`] THEN
16516 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; NORM_POS_LT; COMPLEX_NORM_NZ] THEN
16517 ASM_SIMP_TAC[REAL_MUL_LID]]];
16518 REWRITE_TAC[MESON[]
16519 `(!x y. P x /\ P y /\ f x = f y ==> x = y) <=>
16520 (!x y. P x /\ P y ==> (f x = f y <=> x = y))`] THEN
16521 DISCH_THEN(X_CHOOSE_THEN `h:complex->complex` STRIP_ASSUME_TAC) THEN
16522 MP_TAC(ISPECL [`h:complex->complex`; `s:complex->bool`]
16523 HOLOMORPHIC_ON_INVERSE) THEN
16524 ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
16525 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC
16526 (X_CHOOSE_THEN `k:complex->complex` STRIP_ASSUME_TAC)) THEN
16527 FIRST_X_ASSUM(MP_TAC o SPEC `IMAGE (h:complex->complex) s`) THEN
16529 [ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL
16530 [MATCH_MP_TAC CONNECTED_CONTINUOUS_IMAGE THEN
16531 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON];
16533 REWRITE_TAC[FORALL_IN_IMAGE]] THEN
16534 X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
16535 FIRST_X_ASSUM(MP_TAC o SPEC
16536 `(f:complex->complex) o (h:complex->complex)`) THEN
16539 [ASM_MESON_TAC[HOLOMORPHIC_ON_COMPOSE]; ALL_TAC] THEN
16540 ASM_REWRITE_TAC[o_THM] THEN ASM SET_TAC[];
16542 REWRITE_TAC[o_THM] THEN
16543 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
16544 EXISTS_TAC `(g:complex->complex) o (k:complex->complex)` THEN
16545 ASM_SIMP_TAC[o_THM] THEN MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
16546 ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16547 (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN ASM SET_TAC[];
16549 REWRITE_TAC[FORALL_IN_IMAGE] THEN
16550 DISCH_THEN(X_CHOOSE_THEN `f:complex->complex`
16551 (X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC)) THEN
16552 EXISTS_TAC `(f:complex->complex) o (h:complex->complex)` THEN
16553 EXISTS_TAC `(k:complex->complex) o (g:complex->complex)` THEN
16554 ASM_SIMP_TAC[o_THM; HOLOMORPHIC_ON_COMPOSE] THEN CONJ_TAC THENL
16555 [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE; ASM SET_TAC[]] THEN
16556 ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16557 (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
16558 ASM SET_TAC[]]] THEN
16559 X_GEN_TAC `s:complex->bool` THEN STRIP_TAC THEN
16561 `ff = { h | h holomorphic_on s /\
16562 IMAGE h s SUBSET ball(Cx(&0),&1) /\
16563 h(Cx(&0)) = Cx(&0) /\
16564 (!x y. x IN s /\ y IN s ==> (h x = h y <=> x = y))}` THEN
16565 SUBGOAL_THEN `(\z:complex. z) IN ff` MP_TAC THENL
16566 [EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM; IMAGE_ID] THEN
16567 ASM_REWRITE_TAC[HOLOMORPHIC_ON_ID];
16568 ASM_CASES_TAC `ff:(complex->complex)->bool = {}` THEN
16569 ASM_REWRITE_TAC[NOT_IN_EMPTY] THEN DISCH_TAC] THEN
16570 SUBGOAL_THEN `!h. h IN ff ==> h holomorphic_on s` ASSUME_TAC THENL
16571 [EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM]; ALL_TAC] THEN
16573 `?f:complex->complex.
16576 ==> norm(complex_derivative h (Cx(&0)))
16577 <= norm(complex_derivative f (Cx(&0))))`
16580 `{ norm(complex_derivative h (Cx(&0))) | h IN ff}` SUP) THEN
16582 [ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
16583 ASM_REWRITE_TAC[IMAGE_EQ_EMPTY; FORALL_IN_IMAGE] THEN
16584 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
16585 DISCH_THEN(MP_TAC o SPEC `Cx(&0)`) THEN
16586 ASM_REWRITE_TAC[SUBSET; IN_BALL; COMPLEX_SUB_LZERO;
16587 dist; NORM_NEG] THEN
16588 DISCH_THEN(X_CHOOSE_THEN `r:real` STRIP_ASSUME_TAC) THEN
16589 EXISTS_TAC `inv(r):real` THEN X_GEN_TAC `f:complex->complex` THEN
16590 EXPAND_TAC "ff" THEN
16591 REWRITE_TAC[IN_ELIM_THM; FORALL_IN_IMAGE; SUBSET] THEN
16592 ASM_REWRITE_TAC[SUBSET; IN_BALL; COMPLEX_SUB_LZERO;
16593 dist; NORM_NEG] THEN
16595 MP_TAC(ISPEC `\z. (f:complex->complex) (Cx(r) * z)`
16596 SCHWARZ_LEMMA) THEN
16597 ASM_REWRITE_TAC[COMPLEX_MUL_RZERO] THEN
16599 `!z. z IN ball(Cx(&0),&1)
16600 ==> ((\z. f (Cx r * z)) has_complex_derivative
16601 complex_derivative f (Cx(r) * z) * Cx(r)) (at z)`
16604 [REPEAT STRIP_TAC THEN MATCH_MP_TAC
16605 (REWRITE_RULE[o_DEF] COMPLEX_DIFF_CHAIN_AT) THEN
16607 [COMPLEX_DIFF_TAC THEN REWRITE_TAC[COMPLEX_MUL_RID];
16608 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE]] THEN
16609 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
16610 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN
16611 FIRST_X_ASSUM MATCH_MP_TAC THEN
16612 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
16613 ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE] THEN
16614 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
16615 ASM_SIMP_TAC[GSYM COMPLEX_IN_BALL_0; REAL_LT_LMUL_EQ];
16619 [REWRITE_TAC[holomorphic_on] THEN
16620 ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_AT_WITHIN];
16621 REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16622 FIRST_X_ASSUM MATCH_MP_TAC THEN
16623 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
16624 ASM_SIMP_TAC[real_abs; REAL_LT_IMP_LE] THEN
16625 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
16626 ASM_SIMP_TAC[GSYM COMPLEX_IN_BALL_0; REAL_LT_LMUL_EQ]];
16627 REMOVE_THEN "*" (MP_TAC o SPEC `Cx(&0)`) THEN
16628 REWRITE_TAC[CENTRE_IN_BALL; REAL_LT_01] THEN
16629 DISCH_THEN(SUBST1_TAC o
16630 MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
16631 DISCH_THEN(MP_TAC o CONJUNCT1 o CONJUNCT2) THEN
16632 REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_NORM_MUL] THEN
16633 ASM_SIMP_TAC[COMPLEX_NORM_CX; real_abs; REAL_LT_IMP_LE] THEN
16634 ASM_SIMP_TAC[GSYM REAL_LE_RDIV_EQ; real_div; REAL_MUL_LID]];
16637 `l = sup { norm(complex_derivative h (Cx(&0))) | h IN ff}` THEN
16638 REWRITE_TAC[FORALL_IN_GSPEC] THEN DISCH_TAC THEN
16640 `?f. (!n. (f n) IN ff) /\
16641 ((\n. Cx(norm(complex_derivative (f n) (Cx(&0))))) --> Cx(l))
16643 STRIP_ASSUME_TAC THENL
16645 `!n. ?f. f IN ff /\
16646 abs(norm(complex_derivative f (Cx(&0))) - l) < inv(&n + &1)`
16648 [X_GEN_TAC `n:num` THEN
16649 FIRST_ASSUM(MP_TAC o SPEC `l - inv(&n + &1)` o CONJUNCT2) THEN
16650 REWRITE_TAC[REAL_ARITH `l <= l - i <=> ~(&0 < i)`; REAL_LT_INV_EQ;
16651 REAL_ARITH `&0 < &n + &1`; NOT_FORALL_THM; NOT_IMP] THEN
16652 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `f:complex->complex` THEN
16653 ASM_CASES_TAC `(f:complex->complex) IN ff` THEN
16654 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(REAL_ARITH
16655 `n <= l ==> ~(n <= l - e) ==> abs(n - l) < e`) THEN
16657 REWRITE_TAC[SKOLEM_THM; FORALL_AND_THM] THEN
16658 MATCH_MP_TAC MONO_EXISTS THEN
16659 X_GEN_TAC `f:num->complex->complex` THEN
16660 STRIP_TAC THEN ASM_REWRITE_TAC[LIM_SEQUENTIALLY] THEN
16661 X_GEN_TAC `e:real` THEN
16662 DISCH_THEN(MP_TAC o GEN_REWRITE_RULE I [REAL_ARCH_INV]) THEN
16663 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN STRIP_TAC THEN
16664 X_GEN_TAC `m:num` THEN DISCH_TAC THEN REWRITE_TAC[dist] THEN
16665 MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `inv(&m + &1)` THEN
16666 ASM_REWRITE_TAC[COMPLEX_NORM_CX; GSYM CX_SUB] THEN
16667 MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `inv(&N)` THEN
16668 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_INV2 THEN
16669 ASM_REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_ADD] THEN ASM_ARITH_TAC];
16671 MP_TAC(ISPECL [`f:num->complex->complex`; `ff:(complex->complex)->bool`;
16672 `s:complex->bool`] MONTEL) THEN
16673 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
16674 [EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM] THEN
16675 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_BALL; COMPLEX_SUB_LZERO;
16676 dist; NORM_NEG] THEN
16677 MESON_TAC[REAL_LT_IMP_LE];
16679 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
16680 DISCH_THEN(X_CHOOSE_THEN `r:num->num` STRIP_ASSUME_TAC) THEN
16682 `g complex_differentiable (at(Cx(&0))) /\
16683 norm(complex_derivative g (Cx(&0))) = l`
16684 STRIP_ASSUME_TAC THENL
16685 [MP_TAC(ISPECL [`(f:num->complex->complex) o (r:num->num)`;
16686 `(\n:num z. complex_derivative (f n) z) o (r:num->num)`;
16687 `g:complex->complex`; `s:complex->bool`]
16688 HAS_COMPLEX_DERIVATIVE_UNIFORM_SEQUENCE) THEN
16689 ASM_REWRITE_TAC[o_THM] THEN ANTS_TAC THENL
16691 [REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
16692 REPEAT STRIP_TAC THEN
16693 MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THEN
16694 EXISTS_TAC `s:complex->bool` THEN ASM_SIMP_TAC[];
16696 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16697 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_CBALL]) THEN
16698 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_REWRITE_TAC[] THEN
16699 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN
16700 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `e:real` THEN
16701 DISCH_TAC THEN REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
16702 FIRST_X_ASSUM(MP_TAC o SPECL [`cball(z:complex,d)`; `e:real`]) THEN
16703 ASM_REWRITE_TAC[COMPACT_CBALL; GE] THEN
16704 MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[];
16705 DISCH_THEN(X_CHOOSE_THEN `g':complex->complex` MP_TAC) THEN
16706 DISCH_THEN(MP_TAC o SPEC `Cx(&0)`) THEN
16707 ASM_REWRITE_TAC[IMP_CONJ_ALT] THEN
16708 DISCH_THEN(MP_TAC o ISPEC `\z:complex. Cx(norm z)` o MATCH_MP
16709 (REWRITE_RULE[IMP_CONJ_ALT] LIM_CONTINUOUS_FUNCTION)) THEN
16710 REWRITE_TAC[CONTINUOUS_AT_CX_NORM] THEN DISCH_TAC THEN DISCH_TAC THEN
16711 CONJ_TAC THENL [ASM_MESON_TAC[complex_differentiable]; ALL_TAC] THEN
16712 GEN_REWRITE_TAC I [GSYM CX_INJ] THEN
16713 FIRST_ASSUM(SUBST1_TAC o
16714 MATCH_MP HAS_COMPLEX_DERIVATIVE_DERIVATIVE) THEN
16715 MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN EXISTS_TAC
16716 `\n. Cx(norm(complex_derivative(f((r:num->num) n)) (Cx(&0))))` THEN
16717 ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN MP_TAC(ISPECL
16718 [`\n:num. Cx(norm(complex_derivative (f n) (Cx(&0))))`;
16719 `r:num->num`; `Cx l`] LIM_SUBSEQUENCE) THEN
16720 ASM_REWRITE_TAC[o_DEF]];
16722 ASM_SIMP_TAC[] THEN
16723 SUBGOAL_THEN `~(?c. !z. z IN s ==> (g:complex->complex) z = c)`
16725 [DISCH_THEN(X_CHOOSE_TAC `c:complex`) THEN
16726 SUBGOAL_THEN `complex_derivative g (Cx(&0)) = Cx(&0)` MP_TAC THENL
16727 [MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
16728 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
16729 MAP_EVERY EXISTS_TAC
16730 [`(\z. c):complex->complex`; `s:complex->bool`] THEN
16731 ASM_REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_CONST] THEN ASM_MESON_TAC[];
16732 DISCH_THEN(MP_TAC o AP_TERM `norm:complex->real`) THEN
16733 ASM_REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
16734 DISCH_THEN SUBST_ALL_TAC THEN
16735 FIRST_ASSUM(MP_TAC o SPEC `\z:complex. z` o CONJUNCT1) THEN
16736 ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
16737 REWRITE_TAC[COMPLEX_DERIVATIVE_ID; COMPLEX_NORM_CX] THEN
16740 EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN
16741 REPEAT CONJ_TAC THENL
16742 [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0] THEN
16743 SUBGOAL_THEN `!z. z IN s ==> norm((g:complex->complex) z) <= &1`
16745 [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16746 MATCH_MP_TAC(ISPEC `sequentially` LIM_NORM_UBOUND) THEN
16747 EXISTS_TAC `\n:num. (f:num->complex->complex) (r n) z` THEN
16748 ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN
16749 MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN
16751 `(f:num->complex->complex) (r(n:num)) IN ff`
16752 MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
16753 EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM] THEN
16754 ASM_SIMP_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0;
16756 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16757 ASM_SIMP_TAC[REAL_LT_LE] THEN DISCH_TAC THEN MP_TAC(ISPECL
16758 [`g:complex->complex`; `s:complex->bool`; `s:complex->bool`;
16759 `z:complex`] MAXIMUM_MODULUS_PRINCIPLE) THEN
16760 ASM_REWRITE_TAC[SUBSET_REFL]];
16761 MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN
16762 EXISTS_TAC `\n:num. (f:num->complex->complex) (r n) (Cx(&0))` THEN
16763 ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN
16764 MATCH_MP_TAC LIM_EVENTUALLY THEN MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
16765 X_GEN_TAC `n:num` THEN
16766 SUBGOAL_THEN `(f:num->complex->complex) (r(n:num)) IN ff`
16767 MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
16768 EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM];
16769 MATCH_MP_TAC(REWRITE_RULE
16770 [MESON[] `(!x y. P x /\ P y /\ f x = f y ==> x = y) <=>
16771 (!x y. P x /\ P y ==> (f x = f y <=> x = y))`]
16772 HURWITZ_INJECTIVE) THEN
16773 EXISTS_TAC `(f:num->complex->complex) o (r:num->num)` THEN
16774 ASM_SIMP_TAC[o_THM] THEN X_GEN_TAC `n:num` THEN
16775 SUBGOAL_THEN `(f:num->complex->complex) (r(n:num)) IN ff`
16776 MP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN
16777 EXPAND_TAC "ff" THEN SIMP_TAC[IN_ELIM_THM]];
16779 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `f:complex->complex` THEN
16781 MP_TAC(SPECL [`f:complex->complex`; `s:complex->bool`]
16782 HOLOMORPHIC_ON_INVERSE) THEN
16784 [UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16785 REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[];
16786 DISCH_THEN(MP_TAC o CONJUNCT2)] THEN
16787 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
16788 ASM_CASES_TAC `IMAGE (f:complex->complex) s = ball(Cx(&0),&1)` THENL
16789 [ASM_SIMP_TAC[] THEN ASM SET_TAC[]; ALL_TAC] THEN
16791 UNDISCH_TAC `~(IMAGE (f:complex->complex) s = ball(Cx(&0),&1))` THEN
16792 MATCH_MP_TAC(TAUT `p ==> ~p ==> q`) THEN
16793 MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
16794 [UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16795 REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[];
16797 REWRITE_TAC[SUBSET; COMPLEX_IN_BALL_0] THEN
16798 X_GEN_TAC `a:complex` THEN DISCH_TAC THEN
16799 REWRITE_TAC[IN_IMAGE; MESON[]
16800 `(?x. a = f x /\ x IN s) <=> ~(!x. x IN s ==> ~(f x = a))`] THEN
16802 MP_TAC(ISPEC `a:complex` BALL_BIHOLOMORPHISM_EXISTS) THEN
16803 ASM_REWRITE_TAC[COMPLEX_IN_BALL_0; NOT_EXISTS_THM] THEN
16804 MAP_EVERY X_GEN_TAC [`t:complex->complex`; `t':complex->complex`] THEN
16807 `!z. z IN s ==> norm((f:complex->complex) z) < &1`
16809 [UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16810 SIMP_TAC[IN_ELIM_THM; SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0];
16813 `?sq. sq holomorphic_on (IMAGE (t o f) s) /\
16815 ==> sq((t:complex->complex) ((f:complex->complex) z)) pow 2 =
16817 STRIP_ASSUME_TAC THENL
16819 `!f. f holomorphic_on s /\ (!z. z IN s ==> ~(f z = Cx(&0))) /\
16820 (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
16821 ==> ?g. g holomorphic_on s /\
16822 (!z. z IN s ==> f z = g z pow 2)` THEN
16823 DISCH_THEN(MP_TAC o SPEC
16824 `(t:complex->complex) o (f:complex->complex)`) THEN
16825 ASM_REWRITE_TAC[FORALL_IN_IMAGE; o_THM] THEN ANTS_TAC THENL
16826 [REPEAT CONJ_TAC THENL
16827 [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN ASM_SIMP_TAC[] THEN
16828 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16829 (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
16830 UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16831 REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[];
16832 UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16833 REWRITE_TAC[IN_ELIM_THM; SUBSET; FORALL_IN_IMAGE] THEN
16834 RULE_ASSUM_TAC(REWRITE_RULE[SUBSET; COMPLEX_IN_BALL_0]) THEN
16835 REWRITE_TAC[COMPLEX_IN_BALL_0] THEN STRIP_TAC THEN
16836 GEN_TAC THEN DISCH_TAC THEN
16837 DISCH_THEN(MP_TAC o AP_TERM `t':complex->complex`) THEN
16838 ASM_SIMP_TAC[] THEN ASM_MESON_TAC[];
16839 UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16840 REWRITE_TAC[IN_ELIM_THM] THEN
16841 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0] THEN
16842 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
16843 REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN ASM_MESON_TAC[]];
16844 DISCH_THEN(X_CHOOSE_THEN `q:complex->complex` STRIP_ASSUME_TAC) THEN
16845 EXISTS_TAC `(q:complex->complex) o (g:complex->complex) o
16846 (t':complex->complex)` THEN
16847 ASM_REWRITE_TAC[o_THM] THEN CONJ_TAC THENL
16848 [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC THENL
16849 [MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC;
16851 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16852 (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
16853 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; COMPLEX_IN_BALL_0; o_THM] THENL
16854 [ASM_MESON_TAC[]; ASM SET_TAC[]; ASM_MESON_TAC[]];
16855 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
16856 MATCH_MP_TAC EQ_TRANS THEN
16857 EXISTS_TAC `(q:complex->complex) z pow 2` THEN
16858 CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
16859 AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
16860 UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16861 REWRITE_TAC[IN_ELIM_THM; SUBSET; FORALL_IN_IMAGE] THEN
16862 REWRITE_TAC[COMPLEX_IN_BALL_0] THEN ASM_MESON_TAC[]]];
16866 ==> norm((sq:complex->complex)
16867 ((t:complex->complex)((f:complex->complex) z))) < &1`
16869 [REPEAT STRIP_TAC THEN
16870 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_ABS_NORM] THEN
16871 REWRITE_TAC[GSYM ABS_SQUARE_LT_1; GSYM COMPLEX_NORM_POW] THEN
16875 `(sq:complex->complex)
16876 ((t:complex->complex)((f:complex->complex) (Cx(&0))))`
16877 BALL_BIHOLOMORPHISM_EXISTS) THEN
16878 ASM_SIMP_TAC[COMPLEX_IN_BALL_0; NOT_IMP; NOT_EXISTS_THM] THEN
16879 MAP_EVERY X_GEN_TAC [`r:complex->complex`; `r':complex->complex`] THEN
16880 STRIP_TAC THEN UNDISCH_TAC
16882 ==> norm(complex_derivative h (Cx(&0))) <=
16883 norm(complex_derivative f (Cx(&0)))` THEN
16884 DISCH_THEN(fun th -> MP_TAC(SPEC
16885 `(r:complex->complex) o (sq:complex->complex) o
16886 (t:complex->complex) o (f:complex->complex)` th) THEN
16887 MP_TAC(SPEC `\z:complex. z` th)) THEN
16888 ASM_REWRITE_TAC[COMPLEX_DERIVATIVE_ID; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
16889 DISCH_TAC THEN REWRITE_TAC[NOT_IMP; REAL_NOT_LE] THEN
16890 EXPAND_TAC "ff" THEN REWRITE_TAC[IN_ELIM_THM] THEN
16891 MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN REPEAT CONJ_TAC THENL
16892 [REPEAT(MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC) THEN
16893 ASM_SIMP_TAC[] THEN
16894 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16895 (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
16896 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
16898 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
16900 ASM_SIMP_TAC[o_THM];
16901 MAP_EVERY X_GEN_TAC [`w:complex`; `z:complex`] THEN STRIP_TAC THEN
16902 EQ_TAC THEN SIMP_TAC[] THEN
16903 DISCH_THEN(MP_TAC o AP_TERM `r':complex->complex`) THEN
16904 ASM_SIMP_TAC[o_THM] THEN
16905 DISCH_THEN(MP_TAC o AP_TERM `\z:complex. z pow 2`) THEN
16906 ASM_SIMP_TAC[] THEN
16907 DISCH_THEN(MP_TAC o AP_TERM `t':complex->complex`) THEN
16908 ASM_SIMP_TAC[] THEN ASM_MESON_TAC[];
16911 `(t':complex->complex) o (\z. z pow 2) o (r':complex->complex)`
16912 SCHWARZ_LEMMA) THEN
16913 REWRITE_TAC[] THEN ANTS_TAC THENL
16914 [REPEAT CONJ_TAC THENL
16915 [REPEAT(MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC) THEN
16916 SIMP_TAC[HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_ID] THEN
16917 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16918 (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
16919 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
16920 ASM_SIMP_TAC[COMPLEX_NORM_POW; ABS_SQUARE_LT_1; REAL_ABS_NORM];
16921 ASM_SIMP_TAC[COMPLEX_NORM_POW; ABS_SQUARE_LT_1; REAL_ABS_NORM; o_THM];
16922 UNDISCH_THEN `(r:complex->complex) ((sq:complex->complex)
16923 ((t:complex->complex) (f(Cx(&0))))) = Cx(&0)`
16924 (fun th -> GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [SYM th]) THEN
16925 ASM_SIMP_TAC[o_THM] THEN
16926 UNDISCH_TAC `(f:complex->complex) IN ff` THEN EXPAND_TAC "ff" THEN
16927 SIMP_TAC[IN_ELIM_THM]];
16928 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN MATCH_MP_TAC
16929 (TAUT `~r /\ (p /\ ~q ==> s) ==> p /\ (q' \/ q ==> r) ==> s`) THEN
16931 [REWRITE_TAC[NOT_EXISTS_THM] THEN X_GEN_TAC `c:complex` THEN
16932 ASM_CASES_TAC `c = Cx(&0)` THEN
16933 ASM_SIMP_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_OF_NUM_EQ; ARITH] THEN
16934 DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
16935 DISCH_THEN(fun th ->
16936 MP_TAC(ISPEC `(r:complex->complex) (--(Cx(&1) / Cx(&2)))` th) THEN
16937 MP_TAC(ISPEC `(r:complex->complex) (Cx(&1) / Cx(&2))` th)) THEN
16938 MATCH_MP_TAC(TAUT `(p1 /\ p2) /\ (q1 /\ q2 ==> r)
16939 ==> (p1 ==> q1) ==> (p2 ==> q2) ==> r`) THEN
16941 [CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16942 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
16945 MATCH_MP_TAC(MESON[]
16946 `~(b1 = b2) /\ a1 = a2 ==> (a1 = b1 /\ a2 = b2 ==> F)`) THEN
16948 [ASM_REWRITE_TAC[COMPLEX_EQ_MUL_LCANCEL] THEN
16949 DISCH_THEN(MP_TAC o AP_TERM `r':complex->complex`) THEN
16950 FIRST_ASSUM(fun th ->
16951 W(MP_TAC o PART_MATCH (lhand o rand) th o
16952 lhand o lhand o snd)) THEN
16953 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
16954 CONV_TAC REAL_RAT_REDUCE_CONV THEN DISCH_THEN SUBST1_TAC THEN
16955 MATCH_MP_TAC(COMPLEX_RING
16956 `x = --(Cx(&1) / Cx(&2)) ==> ~(Cx(&1) / Cx(&2) = x)`) THEN
16957 FIRST_X_ASSUM MATCH_MP_TAC THEN
16958 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
16959 CONV_TAC REAL_RAT_REDUCE_CONV;
16960 REWRITE_TAC[o_DEF] THEN AP_TERM_TAC THEN
16961 MATCH_MP_TAC(COMPLEX_RING
16962 `x = Cx(&1) / Cx(&2) /\ y = --(Cx(&1) / Cx(&2))
16963 ==> x pow 2 = y pow 2`) THEN
16964 CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
16965 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; NORM_NEG] THEN
16966 CONV_TAC REAL_RAT_REDUCE_CONV];
16967 REWRITE_TAC[GSYM REAL_LT_LE] THEN DISCH_TAC THEN
16968 UNDISCH_TAC `&1 <= norm (complex_derivative f (Cx(&0)))` THEN
16970 `complex_derivative f (Cx(&0)) =
16971 complex_derivative (t' o (\z:complex. z pow 2) o r') (Cx(&0)) *
16973 (r o (sq:complex->complex) o (t:complex->complex) o f) (Cx(&0))`
16974 (fun th -> REWRITE_TAC[th; COMPLEX_NORM_MUL])
16977 REWRITE_TAC[REAL_ARITH `a * b < b <=> &0 < (&1 - a) * b`] THEN
16978 DISCH_THEN(MP_TAC o MATCH_MP
16979 (REAL_ARITH `&1 <= x ==> ~(x = &0)`)) THEN
16980 SIMP_TAC[REAL_ENTIRE; NORM_EQ_0; GSYM NORM_POS_LT; DE_MORGAN_THM] THEN
16981 ASM_SIMP_TAC[REAL_LT_MUL_EQ] THEN ASM_REAL_ARITH_TAC] THEN
16982 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
16983 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_WITHIN_OPEN THEN
16984 EXISTS_TAC `((t':complex->complex) o
16985 (\z:complex. z pow 2) o (r':complex->complex)) o
16986 ((r:complex->complex) o (sq:complex->complex) o
16987 (t:complex->complex) o (f:complex->complex))` THEN
16988 EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
16989 [ASM_SIMP_TAC[o_THM]; ALL_TAC] THEN
16990 MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
16991 ASM_REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
16992 CONJ_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT THENL
16993 [EXISTS_TAC `s:complex->bool` THEN ASM_REWRITE_TAC[];
16994 EXISTS_TAC `ball(Cx(&0),&1)` THEN
16995 ASM_REWRITE_TAC[OPEN_BALL; CENTRE_IN_BALL; REAL_LT_01] THEN
16996 REPEAT(MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN CONJ_TAC) THEN
16997 SIMP_TAC[HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_ID] THEN
16998 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
16999 (REWRITE_RULE[IMP_CONJ] HOLOMORPHIC_ON_SUBSET)) THEN
17000 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; o_THM; COMPLEX_IN_BALL_0] THEN
17001 ASM_SIMP_TAC[COMPLEX_NORM_POW; ABS_SQUARE_LT_1; REAL_ABS_NORM]]]];
17002 ASM_CASES_TAC `s:complex->bool = {}` THEN ASM_REWRITE_TAC[] THEN
17003 ASM_CASES_TAC `s = (:complex)` THEN ASM_REWRITE_TAC[] THENL
17004 [ONCE_REWRITE_TAC[HOMEOMORPHIC_SYM] THEN
17005 MATCH_MP_TAC HOMEOMORPHIC_BALL_UNIV THEN REWRITE_TAC[REAL_LT_01];
17006 REWRITE_TAC[HOMEOMORPHIC_MINIMAL] THEN
17007 REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN
17008 MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON]];
17009 STRIP_TAC THEN ASM_REWRITE_TAC[SIMPLY_CONNECTED_EMPTY] THEN
17010 FIRST_ASSUM(MP_TAC o MATCH_MP HOMEOMORPHIC_SIMPLY_CONNECTED_EQ) THEN
17011 SIMP_TAC[CONVEX_IMP_SIMPLY_CONNECTED; CONVEX_BALL]]);;
17013 let CONTRACTIBLE_EQ_SIMPLY_CONNECTED_2D = prove
17014 (`!s:real^2->bool. open s ==> (contractible s <=> simply_connected s)`,
17015 REPEAT STRIP_TAC THEN EQ_TAC THEN
17016 REWRITE_TAC[CONTRACTIBLE_IMP_SIMPLY_CONNECTED] THEN
17017 ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] THEN
17018 STRIP_TAC THEN ASM_REWRITE_TAC[CONTRACTIBLE_EMPTY] THEN
17019 ASM_MESON_TAC[HOMEOMORPHIC_CONTRACTIBLE_EQ; CONVEX_IMP_CONTRACTIBLE;
17022 (* ------------------------------------------------------------------------- *)
17023 (* A further chain of equivalents about components of the complement of a *)
17024 (* simply connected set (following 1.35 in Burckel's book). *)
17025 (* ------------------------------------------------------------------------- *)
17027 let [SIMPLY_CONNECTED_EQ_FRONTIER_PROPERTIES;
17028 SIMPLY_CONNECTED_EQ_UNBOUNDED_COMPLEMENT_COMPONENTS;
17029 SIMPLY_CONNECTED_EQ_EMPTY_INSIDE] = (CONJUNCTS o prove)
17030 (`(!s:complex->bool.
17032 ==> (simply_connected s <=>
17034 if bounded s then connected(frontier s)
17035 else !c. c IN components(frontier s) ==> ~bounded c)) /\
17037 ==> (simply_connected s <=>
17039 !c. c IN components ((:complex) DIFF s) ==> ~bounded c)) /\
17041 open s ==> (simply_connected s <=> connected s /\ inside s = {}))`,
17042 REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `s:complex->bool` THEN
17043 ASM_CASES_TAC `open(s:complex->bool)` THEN ASM_REWRITE_TAC[] THEN
17045 `(q3 ==> p) /\ (q2 ==> q3) /\ (q1 ==> q2) /\ (p ==> q1)
17046 ==> (p <=> q1) /\ (p <=> q2) /\ (p <=> q3)`) THEN
17047 REPEAT CONJ_TAC THENL
17048 [REWRITE_TAC[INSIDE_OUTSIDE] THEN
17049 REWRITE_TAC[SET_RULE `UNIV DIFF (s UNION t) = {} <=>
17050 !x. ~(x IN s) ==> x IN t`] THEN
17051 STRIP_TAC THEN ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_WINDING_NUMBER_ZERO] THEN
17052 GEN_TAC THEN X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
17053 MATCH_MP_TAC WINDING_NUMBER_ZERO_IN_OUTSIDE THEN ASM_REWRITE_TAC[] THEN
17054 FIRST_ASSUM(MP_TAC o MATCH_MP OUTSIDE_MONO) THEN ASM SET_TAC[];
17055 REWRITE_TAC[components; FORALL_IN_GSPEC; inside] THEN SET_TAC[];
17056 ASM_CASES_TAC `connected(s:complex->bool)` THEN ASM_REWRITE_TAC[] THEN
17057 COND_CASES_TAC THENL
17059 REWRITE_TAC[components; FORALL_IN_GSPEC; IN_DIFF; IN_UNIV] THEN
17060 ASM_CASES_TAC `s:complex->bool = {}` THEN
17061 ASM_SIMP_TAC[DIFF_EMPTY; CONNECTED_COMPONENT_EQ_SELF;
17062 CONNECTED_UNIV; IN_UNIV; NOT_BOUNDED_UNIV] THEN
17063 ASM_CASES_TAC `s = (:complex)` THENL
17064 [ASM_MESON_TAC[NOT_BOUNDED_UNIV]; ALL_TAC] THEN
17065 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
17066 FIRST_ASSUM(MP_TAC o MATCH_MP OUTSIDE_BOUNDED_NONEMPTY) THEN
17067 REWRITE_TAC[outside; GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN
17068 DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC) THEN
17070 `connected_component ((:complex) DIFF s) w =
17071 connected_component ((:complex) DIFF s) z`
17072 (fun th -> ASM_REWRITE_TAC[th]) THEN
17073 MATCH_MP_TAC JOINABLE_CONNECTED_COMPONENT_EQ THEN
17074 EXISTS_TAC `frontier s :complex->bool` THEN ASM_REWRITE_TAC[] THEN
17076 [REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
17077 `i = s ==> s' DIFF i SUBSET UNIV DIFF s`) THEN
17078 ASM_REWRITE_TAC[INTERIOR_EQ];
17080 ONCE_REWRITE_TAC[GSYM FRONTIER_COMPLEMENT] THEN CONJ_TAC THEN
17081 MATCH_MP_TAC(SET_RULE
17082 `frontier c SUBSET c /\ frontier c SUBSET f /\ ~(frontier c = {})
17083 ==> ~(c INTER f = {})`) THEN
17084 REWRITE_TAC[FRONTIER_OF_CONNECTED_COMPONENT_SUBSET] THEN
17085 ASM_REWRITE_TAC[FRONTIER_EQ_EMPTY; CONNECTED_COMPONENT_EQ_EMPTY;
17086 IN_DIFF; IN_UNIV; CONNECTED_COMPONENT_EQ_UNIV;
17087 SET_RULE `UNIV DIFF s = UNIV <=> s = {}`] THEN
17088 REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
17089 `c = s ==> c DIFF i SUBSET s`) THEN
17090 ASM_REWRITE_TAC[CLOSURE_EQ] THEN
17091 MATCH_MP_TAC CLOSED_CONNECTED_COMPONENT THEN
17092 ASM_REWRITE_TAC[GSYM OPEN_CLOSED];
17093 DISCH_TAC THEN REWRITE_TAC[components; FORALL_IN_GSPEC] THEN
17094 X_GEN_TAC `w:complex` THEN REWRITE_TAC[IN_DIFF; IN_UNIV] THEN
17097 `?z:complex. z IN frontier s /\
17098 z IN connected_component ((:real^2) DIFF s) w`
17099 STRIP_ASSUME_TAC THENL
17100 [ONCE_REWRITE_TAC[GSYM FRONTIER_COMPLEMENT] THEN
17101 MATCH_MP_TAC(SET_RULE
17102 `frontier c SUBSET c /\ frontier c SUBSET f /\ ~(frontier c = {})
17103 ==> ?z. z IN f /\ z IN c`) THEN
17104 ASM_REWRITE_TAC[FRONTIER_OF_CONNECTED_COMPONENT_SUBSET] THEN
17106 [REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
17107 `c = s ==> c DIFF i SUBSET s`) THEN
17108 ASM_REWRITE_TAC[CLOSURE_EQ] THEN
17109 MATCH_MP_TAC CLOSED_CONNECTED_COMPONENT THEN
17110 ASM_REWRITE_TAC[GSYM OPEN_CLOSED];
17111 ASM_REWRITE_TAC[FRONTIER_EQ_EMPTY; CONNECTED_COMPONENT_EQ_EMPTY;
17112 CONNECTED_COMPONENT_EQ_UNIV; IN_DIFF; IN_UNIV] THEN
17113 REWRITE_TAC[SET_RULE `UNIV DIFF s = UNIV <=> s = {}`] THEN
17114 ASM_MESON_TAC[BOUNDED_EMPTY]];
17115 FIRST_X_ASSUM(MP_TAC o SPEC
17116 `connected_component (frontier s) (z:complex)`) THEN
17117 REWRITE_TAC[components; IN_ELIM_THM] THEN
17118 ANTS_TAC THENL [ASM SET_TAC[]; REWRITE_TAC[CONTRAPOS_THM]] THEN
17119 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] BOUNDED_SUBSET) THEN
17121 `connected_component ((:complex) DIFF s) w =
17122 connected_component ((:complex) DIFF s) z`
17124 [ASM_MESON_TAC[CONNECTED_COMPONENT_EQ];
17125 MATCH_MP_TAC CONNECTED_COMPONENT_MAXIMAL THEN
17126 ASM_REWRITE_TAC[IN; CONNECTED_COMPONENT_REFL_EQ] THEN
17127 REWRITE_TAC[CONNECTED_CONNECTED_COMPONENT] THEN
17128 MATCH_MP_TAC SUBSET_TRANS THEN
17129 EXISTS_TAC `frontier s :complex->bool` THEN
17130 REWRITE_TAC[CONNECTED_COMPONENT_SUBSET] THEN
17131 REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
17132 `i = s ==> s' DIFF i SUBSET UNIV DIFF s`) THEN
17133 ASM_REWRITE_TAC[INTERIOR_EQ]]]];
17135 DISCH_THEN(fun th ->
17136 ASSUME_TAC(MATCH_MP SIMPLY_CONNECTED_IMP_CONNECTED th) THEN MP_TAC th) THEN
17137 ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] THEN STRIP_TAC THEN
17138 ASM_REWRITE_TAC[BOUNDED_EMPTY; FRONTIER_EMPTY; CONNECTED_EMPTY] THEN
17139 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homeomorphic]) THEN
17140 REWRITE_TAC[LEFT_IMP_EXISTS_THM; homeomorphism] THEN
17141 MAP_EVERY X_GEN_TAC [`g:real^2->real^2`; `f:real^2->real^2`] THEN
17142 STRIP_TAC THEN MAP_EVERY ABBREV_TAC
17143 [`D = \n. ball(vec 0:real^2,&1 - inv(&n + &2))`;
17144 `A = \n. {z:real^2 | &1 - inv(&n + &2) < norm z /\ norm z < &1}`;
17145 `X = \n:num. closure(IMAGE (f:real^2->real^2) (A n))`] THEN
17147 `frontier s = INTERS {X n:real^2->bool | n IN (:num)}`
17149 [ASM_SIMP_TAC[frontier; INTERIOR_OPEN; INTERS_GSPEC; IN_UNIV] THEN
17150 MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
17151 [REWRITE_TAC[SUBSET; IN_DIFF] THEN X_GEN_TAC `x:real^2` THEN
17152 STRIP_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN X_GEN_TAC `n:num` THEN
17153 UNDISCH_TAC `(x:real^2) IN closure s` THEN
17155 `s = IMAGE (f:real^2->real^2) (closure (D(n:num))) UNION IMAGE f (A n)`
17157 [EXPAND_TAC "s" THEN MATCH_MP_TAC(SET_RULE
17158 `t UNION u = s /\ (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y)
17159 ==> IMAGE f s = IMAGE f t UNION IMAGE f u`) THEN
17160 CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[]] THEN
17161 MAP_EVERY EXPAND_TAC ["A"; "D"] THEN
17162 SIMP_TAC[CLOSURE_BALL; REAL_SUB_LT; REAL_INV_LT_1;
17163 REAL_ARITH `&1 < &n + &2`] THEN
17164 REWRITE_TAC[EXTENSION; IN_UNION; COMPLEX_IN_BALL_0; IN_CBALL_0;
17165 IN_ELIM_THM] THEN GEN_TAC THEN
17166 MATCH_MP_TAC(REAL_ARITH
17168 ==> (x <= &1 - e \/ &1 - e < x /\ x < &1 <=> x < &1)`) THEN
17169 SIMP_TAC[REAL_LT_INV_EQ; REAL_INV_LE_1; REAL_ARITH `&1 <= &n + &2`;
17170 REAL_ARITH `&0 < &n + &2`];
17171 EXPAND_TAC "X" THEN REWRITE_TAC[CLOSURE_UNION] THEN
17172 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
17173 `~(x IN s) ==> t SUBSET s ==> x IN t UNION u ==> x IN u`)) THEN
17174 EXPAND_TAC "D" THEN
17175 SIMP_TAC[CLOSURE_BALL; REAL_SUB_LT; REAL_INV_LT_1;
17176 REAL_ARITH `&1 < &n + &2`; COMPACT_CBALL] THEN
17177 MATCH_MP_TAC(SET_RULE
17178 `closure s = s /\ s SUBSET t ==> closure s SUBSET t`) THEN
17180 [MATCH_MP_TAC CLOSURE_CLOSED THEN MATCH_MP_TAC COMPACT_IMP_CLOSED THEN
17181 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
17182 REWRITE_TAC[COMPACT_CBALL] THEN
17183 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
17184 CONTINUOUS_ON_SUBSET));
17185 EXPAND_TAC "s" THEN MATCH_MP_TAC IMAGE_SUBSET] THEN
17186 REWRITE_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_CBALL_0] THEN GEN_TAC THEN
17187 MATCH_MP_TAC(REAL_ARITH `&0 < x ==> a <= &1 - x ==> a < &1`) THEN
17188 REWRITE_TAC[REAL_LT_INV_EQ] THEN REAL_ARITH_TAC];
17189 MATCH_MP_TAC(SET_RULE
17190 `s SUBSET t /\ s INTER u = {} ==> s SUBSET t DIFF u`) THEN
17192 [EXPAND_TAC "X" THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN
17193 X_GEN_TAC `x:real^2` THEN DISCH_THEN(MP_TAC o SPEC `0`) THEN
17194 SPEC_TAC(`x:real^2`,`x:real^2`) THEN REWRITE_TAC[GSYM SUBSET] THEN
17195 MATCH_MP_TAC SUBSET_CLOSURE THEN EXPAND_TAC "s" THEN
17196 MATCH_MP_TAC IMAGE_SUBSET THEN EXPAND_TAC "A" THEN
17197 REWRITE_TAC[SUBSET; IN_ELIM_THM; COMPLEX_IN_BALL_0] THEN
17199 REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM; NOT_IN_EMPTY] THEN
17200 MAP_EVERY EXPAND_TAC ["s"; "X"] THEN
17201 REWRITE_TAC[TAUT `~(a /\ b) <=> b ==> ~a`; FORALL_IN_IMAGE] THEN
17202 X_GEN_TAC `x:real^2` THEN REWRITE_TAC[COMPLEX_IN_BALL_0] THEN
17203 DISCH_TAC THEN MP_TAC(SPEC `&1 - norm(x:real^2)` REAL_ARCH_INV) THEN
17204 ASM_REWRITE_TAC[REAL_SUB_LT; NOT_FORALL_THM] THEN
17205 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:num` THEN STRIP_TAC THEN
17206 MATCH_MP_TAC(SET_RULE
17207 `!s. y IN s /\ (s INTER t = {}) ==> ~(y IN t)`) THEN
17208 EXISTS_TAC `IMAGE (f:real^2->real^2) (D(n:num))` THEN CONJ_TAC THENL
17209 [MATCH_MP_TAC FUN_IN_IMAGE THEN EXPAND_TAC "D" THEN
17210 REWRITE_TAC[IN_BALL_0] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
17211 (REAL_ARITH `n < &1 - x ==> m < n ==> x < &1 - m`)) THEN
17212 MATCH_MP_TAC REAL_LT_INV2 THEN
17213 ASM_SIMP_TAC[REAL_OF_NUM_LT; LE_1] THEN REAL_ARITH_TAC;
17214 SUBGOAL_THEN `open(IMAGE (f:real^2->real^2) (D(n:num)))` MP_TAC THENL
17215 [MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
17216 SUBGOAL_THEN `(D:num->real^2->bool) n SUBSET ball(Cx(&0),&1)`
17218 [EXPAND_TAC "D" THEN REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN
17219 MATCH_MP_TAC SUBSET_BALL THEN
17220 REWRITE_TAC[REAL_ARITH `&1 - x <= &1 <=> &0 <= x`] THEN
17221 REWRITE_TAC[REAL_LE_INV_EQ] THEN REAL_ARITH_TAC;
17222 REPEAT CONJ_TAC THENL
17223 [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17224 EXPAND_TAC "D" THEN REWRITE_TAC[OPEN_BALL];
17226 SIMP_TAC[OPEN_INTER_CLOSURE_EQ_EMPTY] THEN DISCH_TAC THEN
17227 MATCH_MP_TAC(SET_RULE
17228 `!u. (!x y. x IN u /\ y IN u /\ f x = f y ==> x = y) /\
17229 s UNION t SUBSET u /\ s INTER t = {}
17230 ==> IMAGE f s INTER IMAGE f t = {}`) THEN
17231 EXISTS_TAC `ball(Cx(&0),&1)` THEN
17232 CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
17233 MAP_EVERY EXPAND_TAC ["D"; "A"] THEN
17234 REWRITE_TAC[COMPLEX_IN_BALL_0; IN_BALL_0; SUBSET; NOT_IN_EMPTY;
17235 IN_UNION; IN_ELIM_THM; IN_INTER; EXTENSION] THEN
17236 CONJ_TAC THENL [GEN_TAC; REAL_ARITH_TAC] THEN
17237 MATCH_MP_TAC(REAL_ARITH
17238 `&0 < e ==> x < &1 - e \/ &1 - e < x /\ x < &1 ==> x < &1`) THEN
17239 REWRITE_TAC[REAL_LT_INV_EQ] THEN REAL_ARITH_TAC]]]];
17241 SUBGOAL_THEN `!n. closed((X:num->complex->bool) n)` ASSUME_TAC THENL
17242 [EXPAND_TAC "X" THEN REWRITE_TAC[CLOSED_CLOSURE]; ALL_TAC] THEN
17243 SUBGOAL_THEN `!n. connected((X:num->complex->bool) n)` ASSUME_TAC THENL
17244 [X_GEN_TAC `n:num` THEN EXPAND_TAC "X" THEN
17245 MATCH_MP_TAC CONNECTED_CLOSURE THEN
17246 MATCH_MP_TAC CONNECTED_CONTINUOUS_IMAGE THEN
17247 EXPAND_TAC "A" THEN CONJ_TAC THENL
17248 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
17249 CONTINUOUS_ON_SUBSET)) THEN
17250 SIMP_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_ELIM_THM];
17251 ONCE_REWRITE_TAC[NORM_ARITH `norm z = norm(z - vec 0)`] THEN
17252 SIMP_TAC[CONNECTED_ANNULUS; DIMINDEX_2; LE_REFL]];
17255 `!n. ((X:num->complex->bool) n) SUBSET closure s`
17257 [GEN_TAC THEN EXPAND_TAC "X" THEN REWRITE_TAC[] THEN
17258 MATCH_MP_TAC SUBSET_CLOSURE THEN EXPAND_TAC "s" THEN
17259 MATCH_MP_TAC IMAGE_SUBSET THEN EXPAND_TAC "A" THEN
17260 SIMP_TAC[SUBSET; COMPLEX_IN_BALL_0; IN_ELIM_THM];
17262 SUBGOAL_THEN `!m n. m <= n ==> (X:num->complex->bool) n SUBSET X m`
17264 [MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN STRIP_TAC THEN
17265 EXPAND_TAC "X" THEN MATCH_MP_TAC SUBSET_CLOSURE THEN
17266 MATCH_MP_TAC IMAGE_SUBSET THEN EXPAND_TAC "A" THEN
17267 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN GEN_TAC THEN
17268 MATCH_MP_TAC(REAL_ARITH
17269 `n <= m ==> &1 - n < x /\ x < &1 ==> &1 - m < x /\ x < &1`) THEN
17270 MATCH_MP_TAC REAL_LE_INV2 THEN
17271 ASM_REWRITE_TAC[REAL_LE_RADD; REAL_OF_NUM_LE] THEN REAL_ARITH_TAC;
17273 COND_CASES_TAC THENL
17274 [MATCH_MP_TAC CONNECTED_NEST THEN
17275 ASM_REWRITE_TAC[COMPACT_EQ_BOUNDED_CLOSED] THEN
17276 ASM_MESON_TAC[BOUNDED_SUBSET; BOUNDED_CLOSURE];
17278 SUBGOAL_THEN `!n. ~(bounded((X:num->complex->bool) n))` ASSUME_TAC THENL
17279 [X_GEN_TAC `n:num` THEN DISCH_TAC THEN
17280 UNDISCH_TAC `~bounded(s:complex->bool)` THEN EXPAND_TAC "s" THEN
17281 REWRITE_TAC[] THEN MATCH_MP_TAC BOUNDED_SUBSET THEN EXISTS_TAC
17282 `IMAGE (f:complex->complex)
17283 (cball(Cx(&0),&1 - inv(&n + &2)) UNION A n)` THEN
17285 [REWRITE_TAC[IMAGE_UNION; BOUNDED_UNION] THEN CONJ_TAC THENL
17286 [MATCH_MP_TAC COMPACT_IMP_BOUNDED THEN
17287 MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN SIMP_TAC[COMPACT_CBALL] THEN
17288 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
17289 CONTINUOUS_ON_SUBSET)) THEN
17290 SIMP_TAC[SUBSET; COMPLEX_IN_CBALL_0; COMPLEX_IN_BALL_0] THEN
17291 GEN_TAC THEN MATCH_MP_TAC(REAL_ARITH
17292 `&0 < e ==> x <= &1 - e ==> x < &1`) THEN
17293 ASM_REWRITE_TAC[REAL_LT_INV_EQ] THEN REAL_ARITH_TAC;
17294 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
17295 BOUNDED_SUBSET)) THEN EXPAND_TAC "X" THEN
17296 REWRITE_TAC[CLOSURE_SUBSET]];
17297 MATCH_MP_TAC IMAGE_SUBSET THEN EXPAND_TAC "A" THEN
17298 REWRITE_TAC[SUBSET; IN_UNION; COMPLEX_IN_BALL_0; COMPLEX_IN_CBALL_0;
17299 IN_ELIM_THM] THEN REAL_ARITH_TAC];
17301 X_GEN_TAC `c:complex->bool` THEN REPEAT DISCH_TAC THEN
17302 SUBGOAL_THEN `closed(INTERS {X n:complex->bool | n IN (:num)})`
17304 [ASM_SIMP_TAC[CLOSED_INTERS; FORALL_IN_GSPEC]; ALL_TAC] THEN
17305 SUBGOAL_THEN `closed(c:complex->bool)` ASSUME_TAC THENL
17306 [ASM_MESON_TAC[CLOSED_COMPONENTS]; ALL_TAC] THEN
17307 SUBGOAL_THEN `compact(c:complex->bool)` ASSUME_TAC THENL
17308 [ASM_REWRITE_TAC[COMPACT_EQ_BOUNDED_CLOSED]; ALL_TAC] THEN
17311 c SUBSET k /\ compact k /\
17312 k SUBSET INTERS {X n | n IN (:num)} /\
17313 closed(INTERS {X n | n IN (:num)} DIFF k)`
17314 STRIP_ASSUME_TAC THENL
17315 [MP_TAC(ISPECL[`INTERS {X n:complex->bool | n IN (:num)}`;`c:complex->bool`]
17317 ASM_SIMP_TAC[OPEN_IN_CLOSED_IN_EQ; TOPSPACE_EUCLIDEAN_SUBTOPOLOGY;
17318 CLOSED_IMP_LOCALLY_COMPACT] THEN
17319 MATCH_MP_TAC(MESON[]
17320 `~(c = i {}) /\ (~(f = {}) ==> P)
17321 ==> c = i f ==> P`) THEN
17323 [REWRITE_TAC[INTERS_0] THEN ASM_MESON_TAC[NOT_BOUNDED_UNIV];
17324 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN MATCH_MP_TAC MONO_EXISTS THEN
17325 X_GEN_TAC `k:complex->bool` THEN REWRITE_TAC[IN_ELIM_THM] THEN
17326 ASM_MESON_TAC[CLOSED_IN_CLOSED_TRANS]];
17328 MP_TAC(ISPECL [`k:complex->bool`;
17329 `INTERS {X n:complex->bool | n IN (:num)} DIFF k`]
17330 SEPARATION_NORMAL_COMPACT) THEN
17331 ASM_SIMP_TAC[NOT_EXISTS_THM; SET_RULE `k INTER (s DIFF k) = {}`] THEN
17332 MAP_EVERY X_GEN_TAC [`v:complex->bool`; `v':complex->bool`] THEN
17334 SUBGOAL_THEN `v INTER (INTERS {X n:complex->bool | n IN (:num)} DIFF k) = {}`
17335 ASSUME_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
17337 [`closure(v) DIFF v:complex->bool`;
17338 `{X n INTER closure(v:complex->bool) | n IN (:num)}`]
17339 COMPACT_IMP_FIP) THEN
17340 ASM_SIMP_TAC[COMPACT_DIFF; FORALL_IN_GSPEC; CLOSED_INTER; CLOSED_CLOSURE;
17345 `INTERS {X n INTER closure v :complex->bool | n IN (:num)} =
17346 INTERS {X n | n IN (:num)} INTER closure v`
17348 [REWRITE_TAC[INTERS_GSPEC; EXTENSION; IN_ELIM_THM; IN_INTER; IN_UNIV] THEN
17350 MP_TAC(ISPECL [`v':complex->bool`; `v:complex->bool`]
17351 OPEN_INTER_CLOSURE_EQ_EMPTY) THEN
17352 ASM_REWRITE_TAC[] THEN ASM SET_TAC[]]] THEN
17353 ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
17354 REWRITE_TAC[FINITE_SUBSET_IMAGE; SUBSET_UNIV; LEFT_IMP_EXISTS_THM] THEN
17355 ONCE_REWRITE_TAC[SWAP_FORALL_THM] THEN
17356 REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_UNWIND_THM2] THEN
17357 X_GEN_TAC `i:num->bool` THEN STRIP_TAC THEN
17358 FIRST_ASSUM(MP_TAC o SPEC `\n:num. n` o MATCH_MP UPPER_BOUND_FINITE_SET) THEN
17359 REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
17360 ASM_CASES_TAC `i:num->bool = {}` THENL
17361 [ASM_REWRITE_TAC[IMAGE_CLAUSES; INTERS_0; INTER_UNIV] THEN
17362 MP_TAC(ISPEC `v:complex->bool` FRONTIER_EQ_EMPTY) THEN
17363 ASM_SIMP_TAC[frontier; INTERIOR_OPEN] THEN DISCH_THEN SUBST1_TAC THEN
17364 DISCH_THEN(DISJ_CASES_THEN SUBST_ALL_TAC) THENL
17365 [FIRST_ASSUM(MP_TAC o MATCH_MP IN_COMPONENTS_NONEMPTY) THEN
17367 ASM_MESON_TAC[CLOSURE_UNIV; COMPACT_IMP_BOUNDED; NOT_BOUNDED_UNIV]];
17369 SUBGOAL_THEN `?n:num. n IN i /\ !m. m IN i ==> m <= n`
17370 (X_CHOOSE_TAC `p:num`) THENL
17371 [MAP_EVERY UNDISCH_TAC [`~(i:num->bool = {})`; `FINITE(i:num->bool)`] THEN
17372 POP_ASSUM_LIST(K ALL_TAC) THEN SPEC_TAC(`i:num->bool`,`i:num->bool`) THEN
17373 MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
17374 REWRITE_TAC[EXISTS_IN_INSERT; FORALL_IN_INSERT; NOT_INSERT_EMPTY] THEN
17375 MAP_EVERY X_GEN_TAC [`n:num`; `i:num->bool`] THEN
17376 ASM_CASES_TAC `i:num->bool = {}` THEN
17377 ASM_REWRITE_TAC[LE_REFL; NOT_IN_EMPTY] THEN
17378 DISCH_THEN(X_CHOOSE_THEN `p:num` STRIP_ASSUME_TAC o CONJUNCT1) THEN
17379 DISJ_CASES_TAC(ARITH_RULE `n:num <= p \/ p <= n`) THEN
17380 ASM_MESON_TAC[LE_TRANS];
17383 `INTERS (IMAGE (\n:num. X n INTER closure v) i):complex->bool =
17384 X p INTER closure v`
17386 [REWRITE_TAC[EXTENSION; INTERS_IMAGE; IN_ELIM_THM; IN_INTER] THEN
17389 DISCH_THEN(ASSUME_TAC o MATCH_MP (SET_RULE
17390 `(c DIFF v) INTER (x INTER c) = {} ==> x INTER c SUBSET v`)) THEN
17391 SUBGOAL_THEN `connected((X:num->complex->bool) p)` MP_TAC THENL
17392 [ASM_MESON_TAC[]; ALL_TAC] THEN
17393 REWRITE_TAC[CONNECTED_CLOPEN] THEN
17394 DISCH_THEN(MP_TAC o SPEC `(X:num->complex->bool) p INTER closure v`) THEN
17395 REWRITE_TAC[NOT_IMP; DE_MORGAN_THM] THEN REPEAT CONJ_TAC THENL
17396 [SUBGOAL_THEN `(X:num->complex->bool) p INTER closure v = X p INTER v`
17398 [MP_TAC(ISPEC `v:complex->bool` CLOSURE_SUBSET) THEN ASM SET_TAC[];
17399 MATCH_MP_TAC OPEN_IN_OPEN_INTER THEN ASM_REWRITE_TAC[]];
17400 MATCH_MP_TAC CLOSED_IN_CLOSED_INTER THEN REWRITE_TAC[CLOSED_CLOSURE];
17401 MATCH_MP_TAC(SET_RULE `!k. k SUBSET s /\ ~(k = {}) ==> ~(s = {})`) THEN
17402 EXISTS_TAC `k:complex->bool` THEN CONJ_TAC THENL
17403 [MP_TAC(ISPEC `v:complex->bool` CLOSURE_SUBSET) THEN ASM SET_TAC[];
17404 FIRST_ASSUM(MP_TAC o MATCH_MP IN_COMPONENTS_NONEMPTY) THEN
17406 DISCH_THEN(MP_TAC o AP_TERM `bounded:(complex->bool)->bool`) THEN
17407 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC BOUNDED_SUBSET THEN
17408 EXISTS_TAC `closure v:complex->bool` THEN
17409 ASM_SIMP_TAC[COMPACT_IMP_BOUNDED] THEN SET_TAC[]]);;
17411 let SIMPLY_CONNECTED_IFF_SIMPLE = prove
17413 open s /\ bounded s
17414 ==> (simply_connected s <=>
17415 connected s /\ connected((:real^2) DIFF s))`,
17416 REPEAT STRIP_TAC THEN
17417 ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_UNBOUNDED_COMPLEMENT_COMPONENTS] THEN
17418 ASM_CASES_TAC `connected(s:real^2->bool)` THEN ASM_REWRITE_TAC[] THEN
17420 [REWRITE_TAC[CONNECTED_EQ_CONNECTED_COMPONENTS_EQ] THEN
17421 REPEAT STRIP_TAC THEN
17422 MATCH_MP_TAC COBOUNDED_UNIQUE_UNBOUNDED_COMPONENTS THEN
17423 EXISTS_TAC `(:real^2) DIFF s` THEN
17424 ASM_SIMP_TAC[SET_RULE `UNIV DIFF (UNIV DIFF s) = s`] THEN
17425 REWRITE_TAC[LE_REFL; DIMINDEX_2];
17427 ASM_CASES_TAC `(:real^2) DIFF s = {}` THEN
17428 ASM_REWRITE_TAC[COMPONENTS_EMPTY; NOT_IN_EMPTY] THEN
17429 SUBGOAL_THEN `components((:real^2) DIFF s) = {(:real^2) DIFF s}`
17430 SUBST1_TAC THENL [ASM_REWRITE_TAC[COMPONENTS_EQ_SING]; ALL_TAC] THEN
17431 GEN_TAC THEN SIMP_TAC[IN_SING] THEN DISCH_TAC THEN
17432 MATCH_MP_TAC COBOUNDED_IMP_UNBOUNDED THEN
17433 ASM_REWRITE_TAC[SET_RULE `UNIV DIFF (UNIV DIFF s) = s`]]);;
17435 let CONNECTED_COMPLEMENT_IFF_SIMPLY_CONNECTED_COMPONENTS = prove
17437 open s /\ bounded s
17438 ==> (connected((:real^2) DIFF s) <=>
17439 !c. c IN components s ==> simply_connected c)`,
17440 REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
17441 EXISTS_TAC `!c. c IN components s ==> connected((:real^2) DIFF c)` THEN
17442 CONJ_TAC THENL [ASM_SIMP_TAC[NONSEPARATION_BY_COMPONENT_EQ]; ALL_TAC] THEN
17443 ASM_MESON_TAC[SIMPLY_CONNECTED_IFF_SIMPLE; OPEN_COMPONENTS;
17444 IN_COMPONENTS_SUBSET; BOUNDED_SUBSET; IN_COMPONENTS_CONNECTED]);;
17446 (* ------------------------------------------------------------------------- *)
17447 (* Yet another set of equivalences based on *continuous* logs and sqrts. *)
17448 (* ------------------------------------------------------------------------- *)
17450 let SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG,SIMPLY_CONNECTED_EQ_CONTINUOUS_SQRT =
17451 (CONJ_PAIR o prove)
17453 ==> (simply_connected s <=>
17455 !f. f continuous_on s /\ (!z:complex. z IN s ==> ~(f z = Cx(&0)))
17456 ==> ?g. g continuous_on s /\
17457 !z. z IN s ==> f z = cexp(g z))) /\
17459 ==> (simply_connected s <=>
17461 !f. f continuous_on s /\ (!z:complex. z IN s ==> ~(f z = Cx(&0)))
17462 ==> ?g. g continuous_on s /\
17463 !z. z IN s ==> f z = g z pow 2))`,
17464 REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `s:complex->bool` THEN
17465 ASM_CASES_TAC `open(s:complex->bool)` THEN ASM_REWRITE_TAC[] THEN
17466 ASM_CASES_TAC `connected(s:complex->bool)` THEN ASM_REWRITE_TAC[] THENL
17467 [ALL_TAC; ASM_MESON_TAC[SIMPLY_CONNECTED_IMP_CONNECTED]] THEN
17469 `(p ==> q) /\ (q ==> r) /\ (r ==> p) ==> (p <=> q) /\ (p <=> r)`) THEN
17470 REPEAT CONJ_TAC THENL
17471 [ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOMEOMORPHIC_TO_DISC] THEN
17472 STRIP_TAC THEN ASM_REWRITE_TAC[CONTINUOUS_ON_EMPTY; NOT_IN_EMPTY] THEN
17473 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [homeomorphic]) THEN
17474 REWRITE_TAC[homeomorphism; LEFT_IMP_EXISTS_THM] THEN
17475 MAP_EVERY X_GEN_TAC [`k:complex->complex`; `h:complex->complex`] THEN
17476 STRIP_TAC THEN X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
17478 [`(f:complex->complex) o (h:complex->complex)`; `Cx(&0)`; `&1`]
17479 CONTINUOUS_LOGARITHM_ON_BALL) THEN
17480 ASM_REWRITE_TAC[o_THM] THEN ANTS_TAC THENL
17481 [CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
17482 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
17483 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17484 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
17485 EXISTS_TAC `(g:complex->complex) o (k:complex->complex)` THEN
17486 REWRITE_TAC[o_THM] THEN CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
17487 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
17488 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]];
17489 DISCH_TAC THEN X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
17490 FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`) THEN ASM_SIMP_TAC[] THEN
17491 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
17492 EXISTS_TAC `\z:complex. cexp(g z / Cx(&2))` THEN
17493 ASM_SIMP_TAC[GSYM CEXP_N; COMPLEX_RING `Cx(&2) * z / Cx(&2) = z`] THEN
17494 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
17495 MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN
17496 REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
17497 MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_DIV THEN
17498 ASM_SIMP_TAC[CONTINUOUS_ON_CONST] THEN
17499 CONV_TAC COMPLEX_RING;
17500 DISCH_TAC THEN ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_HOLOMORPHIC_SQRT] THEN
17501 X_GEN_TAC `f:complex->complex` THEN STRIP_TAC THEN
17502 FIRST_X_ASSUM(MP_TAC o SPEC `f:complex->complex`) THEN
17503 ASM_SIMP_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN
17504 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:complex->complex` THEN
17505 STRIP_TAC THEN ASM_SIMP_TAC[HOLOMORPHIC_ON_OPEN] THEN
17506 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
17507 SUBGOAL_THEN `~((g:complex->complex) z = Cx(&0))` ASSUME_TAC THENL
17508 [ASM_MESON_TAC[COMPLEX_RING `Cx(&0) pow 2 = Cx(&0)`]; ALL_TAC] THEN
17509 EXISTS_TAC `complex_derivative f z / (Cx(&2) * g z)` THEN
17510 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_AT] THEN
17511 MATCH_MP_TAC LIM_TRANSFORM_WITHIN_OPEN THEN
17512 EXISTS_TAC `\x:complex. (f(x) - f(z)) / (x - z) / (g(x) + g(z))` THEN
17515 !w:complex. w IN s /\ w IN ball(z,d) ==> ~(g w + g z = Cx(&0))`
17516 STRIP_ASSUME_TAC THENL
17517 [FIRST_ASSUM(MP_TAC o SPEC `z:complex` o
17518 GEN_REWRITE_RULE I [continuous_on]) THEN ASM_REWRITE_TAC[] THEN
17519 DISCH_THEN(MP_TAC o SPEC `norm((g:complex->complex) z)`) THEN
17520 ASM_REWRITE_TAC[COMPLEX_NORM_NZ] THEN MATCH_MP_TAC MONO_EXISTS THEN
17521 ONCE_REWRITE_TAC[DIST_SYM] THEN
17522 REWRITE_TAC[IN_BALL; GSYM COMPLEX_VEC_0] THEN
17523 MESON_TAC[NORM_ARITH `dist(z,x) < norm z ==> ~(x + z = vec 0)`];
17525 EXISTS_TAC `ball(z:complex,d) INTER s` THEN
17526 ASM_REWRITE_TAC[IN_INTER; CENTRE_IN_BALL] THEN REPEAT CONJ_TAC THENL
17527 [ASM_SIMP_TAC[OPEN_INTER; OPEN_BALL];
17528 ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC THEN MATCH_MP_TAC(COMPLEX_FIELD
17529 `~(x = z) /\ ~(gx + gz = Cx(&0))
17530 ==> (gx pow 2 - gz pow 2) / (x - z) / (gx + gz) =
17531 (gx - gz) / (x - z)`) THEN
17533 MATCH_MP_TAC LIM_COMPLEX_DIV THEN
17534 ASM_REWRITE_TAC[COMPLEX_ENTIRE; GSYM HAS_COMPLEX_DERIVATIVE_AT] THEN
17535 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE; CX_INJ] THEN
17536 REWRITE_TAC[COMPLEX_MUL_2; REAL_OF_NUM_EQ; ARITH_EQ] THEN CONJ_TAC THENL
17537 [ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_DIFFERENTIABLE_AT]; ALL_TAC] THEN
17538 MATCH_MP_TAC LIM_ADD THEN REWRITE_TAC[LIM_CONST; GSYM CONTINUOUS_AT] THEN
17539 ASM_MESON_TAC[HOLOMORPHIC_ON_IMP_CONTINUOUS_ON;
17540 CONTINUOUS_ON_INTERIOR; INTERIOR_OPEN]]]);;
17542 (* ------------------------------------------------------------------------- *)
17543 (* Relations to the borsukian property. *)
17544 (* ------------------------------------------------------------------------- *)
17546 let SIMPLY_CONNECTED_EQ_BORSUKIAN = prove
17548 open s ==> (simply_connected s <=> connected s /\ borsukian s)`,
17549 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG] THEN
17550 AP_TERM_TAC THEN REWRITE_TAC[BORSUKIAN_CONTINUOUS_LOGARITHM] THEN
17551 AP_TERM_TAC THEN ABS_TAC THEN SET_TAC[]);;
17553 let BORSUKIAN_EQ_SIMPLY_CONNECTED = prove
17556 ==> (borsukian s <=> !c. c IN components s ==> simply_connected c)`,
17557 ASM_SIMP_TAC[BORSUKIAN_COMPONENTWISE_EQ; OPEN_IMP_LOCALLY_CONNECTED] THEN
17558 REPEAT STRIP_TAC THEN FIRST_ASSUM
17559 (ASSUME_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] OPEN_COMPONENTS)) THEN
17560 ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_BORSUKIAN] THEN
17561 ASM_MESON_TAC[IN_COMPONENTS_CONNECTED]);;
17563 let BORSUKIAN_SEPARATION_OPEN_CLOSED = prove
17565 (open s \/ closed s) /\ bounded s
17566 ==> (borsukian s <=> connected((:real^2) DIFF s))`,
17567 REPEAT STRIP_TAC THEN
17568 ASM_SIMP_TAC[BORSUKIAN_SEPARATION_COMPACT; COMPACT_EQ_BOUNDED_CLOSED] THEN
17569 ASM_SIMP_TAC[BORSUKIAN_EQ_SIMPLY_CONNECTED;
17570 CONNECTED_COMPLEMENT_IFF_SIMPLY_CONNECTED_COMPONENTS]);;
17572 (* ------------------------------------------------------------------------- *)
17573 (* A per-function version for continuous logs, a kind of monodromy. *)
17574 (* ------------------------------------------------------------------------- *)
17576 let WINDING_NUMBER_COMPOSE_CEXP = prove
17578 ==> winding_number(cexp o p,Cx(&0)) =
17579 Cx(&1) / (Cx(&2) * Cx pi * ii) * (pathfinish p - pathstart p)`,
17580 REPEAT STRIP_TAC THEN
17583 !t:real^1. t IN interval[vec 0,vec 1] ==> e <= norm(cexp(p t))`
17584 STRIP_ASSUME_TAC THENL
17585 [EXISTS_TAC `setdist({Cx(&0)},path_image (cexp o p))` THEN
17586 REWRITE_TAC[SETDIST_POS_LE; REAL_ARITH
17587 `&0 < x <=> &0 <= x /\ ~(x = &0)`] THEN
17588 ASM_SIMP_TAC[PATH_CONTINUOUS_IMAGE; CONTINUOUS_ON_CEXP; CLOSED_SING;
17589 SETDIST_EQ_0_CLOSED_COMPACT; COMPACT_PATH_IMAGE; PATH_IMAGE_NONEMPTY] THEN
17590 REWRITE_TAC[NOT_INSERT_EMPTY; path_image; IMAGE_o] THEN CONJ_TAC THENL
17591 [MP_TAC CEXP_NZ THEN SET_TAC[]; REPEAT STRIP_TAC] THEN
17592 ONCE_REWRITE_TAC[GSYM NORM_NEG] THEN
17593 REWRITE_TAC[COMPLEX_RING `--x = Cx(&0) - x`] THEN
17594 REWRITE_TAC[GSYM dist] THEN MATCH_MP_TAC SETDIST_LE_DIST THEN
17597 MP_TAC(ISPECL [`path_image(p:real^1->complex)`; `Cx(&0)`]
17598 BOUNDED_SUBSET_CBALL) THEN
17599 ASM_SIMP_TAC[BOUNDED_PATH_IMAGE; LEFT_IMP_EXISTS_THM] THEN
17600 X_GEN_TAC `B:real` THEN REWRITE_TAC[SUBSET; COMPLEX_IN_CBALL_0] THEN
17602 MP_TAC(ISPECL [`cexp`; `cball(Cx(&0),B + &1)`]
17603 COMPACT_UNIFORMLY_CONTINUOUS) THEN
17604 REWRITE_TAC[CONTINUOUS_ON_CEXP; COMPACT_CBALL] THEN
17605 REWRITE_TAC[uniformly_continuous_on] THEN
17606 DISCH_THEN(MP_TAC o SPEC `e:real`) THEN
17607 ASM_REWRITE_TAC[COMPLEX_IN_CBALL_0] THEN
17608 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
17609 MP_TAC(ISPECL [`p:real^1->complex`; `min (&1) d`]
17610 PATH_APPROX_VECTOR_POLYNOMIAL_FUNCTION) THEN
17611 ASM_REWRITE_TAC[REAL_LT_MIN; REAL_LT_01; LEFT_IMP_EXISTS_THM] THEN
17612 X_GEN_TAC `g:real^1->complex` THEN STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
17613 EXISTS_TAC `winding_number(cexp o g,Cx(&0))` THEN CONJ_TAC THENL
17614 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC WINDING_NUMBER_NEARBY_PATHS_EQ THEN
17615 ASM_SIMP_TAC[PATH_CONTINUOUS_IMAGE; CONTINUOUS_ON_CEXP;
17616 PATH_VECTOR_POLYNOMIAL_FUNCTION] THEN
17617 ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
17618 REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_SUB_RZERO; o_THM] THEN
17619 REWRITE_TAC[GSYM dist] THEN MATCH_MP_TAC REAL_LTE_TRANS THEN
17620 EXISTS_TAC `e:real` THEN ASM_SIMP_TAC[] THEN
17621 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC[dist] THEN
17622 MATCH_MP_TAC(NORM_ARITH
17623 `norm(g - p) < &1 /\ norm(p) <= B
17624 ==> norm(p) <= B + &1 /\ norm(g) <= B + &1`) THEN
17625 ASM_SIMP_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
17626 REWRITE_TAC[path_image] THEN ASM SET_TAC[];
17628 PART_MATCH (lhs o rand) WINDING_NUMBER_VALID_PATH o lhs o snd) THEN
17629 REWRITE_TAC[PATH_INTEGRAL_INTEGRAL; COMPLEX_SUB_RZERO] THEN ANTS_TAC THENL
17630 [REWRITE_TAC[path_image; IN_IMAGE; o_THM; CEXP_NZ] THEN
17631 REWRITE_TAC[valid_path] THEN
17632 MATCH_MP_TAC DIFFERENTIABLE_ON_IMP_PIECEWISE_DIFFERENTIABLE THEN
17633 MATCH_MP_TAC DIFFERENTIABLE_ON_COMPOSE THEN
17634 REWRITE_TAC[differentiable_on] THEN REPEAT STRIP_TAC THENL
17635 [MATCH_MP_TAC DIFFERENTIABLE_AT_WITHIN THEN
17636 REWRITE_TAC[differentiable] THEN
17637 ASM_MESON_TAC[has_vector_derivative;
17638 HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION];
17639 GEN_REWRITE_TAC LAND_CONV [GSYM ETA_AX] THEN
17640 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_IMP_DIFFERENTIABLE THEN
17641 COMPLEX_DIFFERENTIABLE_TAC];
17642 DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
17643 EXISTS_TAC `integral (interval [vec 0,vec 1])
17644 (\x. vector_derivative (g:real^1->complex) (at x))` THEN
17646 [MATCH_MP_TAC INTEGRAL_EQ THEN X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
17647 REWRITE_TAC[o_THM] THEN MATCH_MP_TAC(COMPLEX_FIELD
17648 `~(e = Cx(&0)) /\ v' = e * v ==> Cx(&1) / e * v' = v`) THEN
17649 REWRITE_TAC[CEXP_NZ] THEN
17650 MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_UNIQUE_AT THEN
17651 MP_TAC(ISPECL [`g:real^1->complex`; `cexp`;
17652 `\h. drop h % vector_derivative (g:real^1->complex) (at t)`;
17653 `\w. cexp(g(t:real^1)) * w`; `t:real^1`]
17654 DIFF_CHAIN_AT) THEN
17655 REWRITE_TAC[GSYM has_vector_derivative; GSYM has_complex_derivative;
17656 GSYM VECTOR_DERIVATIVE_WORKS;
17657 HAS_COMPLEX_DERIVATIVE_CEXP; differentiable] THEN
17659 [ASM_MESON_TAC[HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION;
17660 has_vector_derivative];
17661 REWRITE_TAC[has_vector_derivative; o_DEF] THEN
17662 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
17663 REWRITE_TAC[FUN_EQ_THM; COMPLEX_CMUL] THEN
17664 CONV_TAC COMPLEX_RING];
17665 MP_TAC(ISPECL [`g:real^1->complex`;
17666 `\x. vector_derivative (g:real^1->complex) (at x)`;
17667 `vec 0:real^1`; `vec 1:real^1`]
17668 FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN
17669 ASM_REWRITE_TAC[DROP_VEC; REAL_POS] THEN ANTS_TAC THENL
17670 [REPEAT STRIP_TAC THEN
17671 MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_AT_WITHIN THEN
17672 REWRITE_TAC[GSYM VECTOR_DERIVATIVE_WORKS] THEN
17673 REWRITE_TAC[differentiable] THEN
17674 ASM_MESON_TAC[has_vector_derivative;
17675 HAS_VECTOR_DERIVATIVE_VECTOR_POLYNOMIAL_FUNCTION];
17676 DISCH_THEN(SUBST1_TAC o MATCH_MP INTEGRAL_UNIQUE) THEN
17677 RULE_ASSUM_TAC(REWRITE_RULE[pathstart; pathfinish]) THEN
17678 ASM_REWRITE_TAC[pathstart; pathfinish]]]]]);;
17680 let MONODROMY_CONTINUOUS_LOG = prove
17681 (`!f:complex->complex s.
17682 open s /\ f continuous_on s /\
17683 (!z. z IN s ==> ~(f z = Cx(&0)))
17684 ==> ((!p. path p /\ path_image p SUBSET s /\
17685 pathfinish p = pathstart p
17686 ==> winding_number(f o p,Cx(&0)) = Cx(&0)) <=>
17687 (?g. g continuous_on s /\ !z. z IN s ==> f(z) = cexp(g z)))`,
17690 f continuous_on s /\ g continuous_on s /\
17691 (!z:complex. z IN s ==> f(z) = cexp(g z)) /\
17692 path p /\ path_image p SUBSET s
17693 ==> winding_number(f o p,Cx(&0)) =
17694 Cx(&1) / (Cx(&2) * Cx pi * ii) *
17695 (pathfinish(g o p) - pathstart(g o p))`,
17696 REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
17697 EXISTS_TAC `winding_number(cexp o g o (p:real^1->complex),Cx(&0))` THEN
17699 [MATCH_MP_TAC WINDING_NUMBER_NEARBY_PATHS_EQ THEN
17700 REPEAT CONJ_TAC THENL
17701 [MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
17702 REWRITE_TAC[CONTINUOUS_ON_CEXP] THEN
17703 MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
17704 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17705 MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
17706 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17707 REWRITE_TAC[PATHSTART_COMPOSE] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
17708 ASM_MESON_TAC[SUBSET; PATHSTART_IN_PATH_IMAGE];
17709 REWRITE_TAC[PATHFINISH_COMPOSE] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
17710 ASM_MESON_TAC[SUBSET; PATHFINISH_IN_PATH_IMAGE];
17711 GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[o_THM; COMPLEX_SUB_RZERO] THEN
17712 MATCH_MP_TAC(NORM_ARITH
17713 `x = y /\ ~(z = vec 0) ==> norm(x - y) < norm z`) THEN
17714 REWRITE_TAC[COMPLEX_VEC_0; CEXP_NZ] THEN
17715 FIRST_X_ASSUM MATCH_MP_TAC THEN
17716 ASM_MESON_TAC[SUBSET; path_image; IN_IMAGE]];
17717 MATCH_MP_TAC WINDING_NUMBER_COMPOSE_CEXP THEN
17718 ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
17719 MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
17720 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET]]) in
17721 REPEAT STRIP_TAC THEN EQ_TAC THENL
17723 DISCH_THEN(X_CHOOSE_THEN `g:complex->complex` STRIP_ASSUME_TAC) THEN
17724 X_GEN_TAC `p:real^1->complex` THEN STRIP_TAC THEN
17725 MP_TAC(ISPECL [`f:complex->complex`; `g:complex->complex`;
17726 `s:complex->bool`; `p:real^1->complex`]
17728 ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
17729 REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_RZERO]] THEN
17731 EXISTS_TAC `\z. let c = connected_component s (z:complex) in
17733 let p = @p. path p /\ path_image p SUBSET c /\
17734 pathstart p = z0 /\ pathfinish p = z in
17735 Cx(&2) * Cx(pi) * ii * winding_number(f o p,Cx(&0)) +
17740 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
17741 REPEAT LET_TAC THEN
17742 SUBGOAL_THEN `(z:complex) IN c` ASSUME_TAC THENL
17743 [ASM_MESON_TAC[CONNECTED_COMPONENT_REFL; IN]; ALL_TAC] THEN
17744 SUBGOAL_THEN `(z0:complex) IN c` ASSUME_TAC THENL
17745 [EXPAND_TAC "z0" THEN REWRITE_TAC[IN] THEN MATCH_MP_TAC SELECT_AX THEN
17748 SUBGOAL_THEN `(c:complex->bool) SUBSET s` ASSUME_TAC THENL
17749 [ASM_MESON_TAC[CONNECTED_COMPONENT_SUBSET]; ALL_TAC] THEN
17750 SUBGOAL_THEN `connected(c:complex->bool)` ASSUME_TAC THENL
17751 [ASM_MESON_TAC[CONNECTED_CONNECTED_COMPONENT]; ALL_TAC] THEN
17752 SUBGOAL_THEN `open(c:complex->bool)` ASSUME_TAC THENL
17753 [ASM_MESON_TAC[OPEN_CONNECTED_COMPONENT]; ALL_TAC] THEN
17754 SUBGOAL_THEN `path_connected(c:complex->bool)` ASSUME_TAC THENL
17755 [ASM_MESON_TAC[CONNECTED_OPEN_PATH_CONNECTED]; ALL_TAC] THEN
17757 `path p /\ path_image p SUBSET c /\
17758 pathstart p = z0 /\ pathfinish p = (z:complex)`
17759 STRIP_ASSUME_TAC THENL
17760 [EXPAND_TAC "p" THEN CONV_TAC SELECT_CONV THEN
17761 FIRST_X_ASSUM(MATCH_MP_TAC o REWRITE_RULE[path_connected]) THEN
17764 MP_TAC(ISPECL [`(f:complex->complex) o (p:real^1->complex)`; `Cx(&0)`]
17765 WINDING_NUMBER_AHLFORS_FULL) THEN
17766 REWRITE_TAC[CEXP_ADD] THEN ANTS_TAC THENL
17768 [MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN
17769 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17770 REWRITE_TAC[path_image; IMAGE_o] THEN
17771 REWRITE_TAC[GSYM path_image] THEN ASM SET_TAC[]];
17772 ASM_REWRITE_TAC[PATHSTART_COMPOSE; PATHFINISH_COMPOSE] THEN
17773 REWRITE_TAC[COMPLEX_SUB_RZERO] THEN DISCH_THEN SUBST1_TAC THEN
17774 AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN MATCH_MP_TAC CEXP_CLOG THEN
17775 ASM SET_TAC[]]] THEN
17776 MATCH_MP_TAC CONTINUOUS_ON_COMPONENTS_OPEN THEN
17777 ASM_REWRITE_TAC[] THEN X_GEN_TAC `c:complex->bool` THEN DISCH_TAC THEN
17778 ABBREV_TAC `z0:complex = (@) c` THEN
17779 MATCH_MP_TAC CONTINUOUS_ON_EQ THEN
17781 `g = \z. let p = @p. path p /\ path_image p SUBSET c /\
17782 pathstart p = z0 /\ pathfinish p = z in
17783 Cx(&2) * Cx(pi) * ii * winding_number(f o p,Cx(&0)) +
17784 clog(f(z0:complex))` THEN
17785 EXISTS_TAC `g:complex->complex` THEN REWRITE_TAC[] THEN CONJ_TAC THENL
17786 [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN EXPAND_TAC "g" THEN
17787 CONV_TAC(TOP_DEPTH_CONV let_CONV) THEN EXPAND_TAC "z0" THEN
17788 SUBGOAL_THEN `connected_component s (z:complex) = c`
17789 (fun th -> REWRITE_TAC[th]) THEN
17790 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_COMPONENTS]) THEN
17791 ASM_MESON_TAC[CONNECTED_COMPONENT_EQ];
17793 SUBGOAL_THEN `(z0:complex) IN c` ASSUME_TAC THENL
17794 [EXPAND_TAC "z0" THEN REWRITE_TAC[IN] THEN MATCH_MP_TAC SELECT_AX THEN
17795 FIRST_ASSUM(MP_TAC o MATCH_MP IN_COMPONENTS_NONEMPTY) THEN SET_TAC[];
17797 SUBGOAL_THEN `(c:complex->bool) SUBSET s` ASSUME_TAC THENL
17798 [ASM_MESON_TAC[IN_COMPONENTS_SUBSET]; ALL_TAC] THEN
17799 SUBGOAL_THEN `connected(c:complex->bool)` ASSUME_TAC THENL
17800 [ASM_MESON_TAC[IN_COMPONENTS_CONNECTED]; ALL_TAC] THEN
17801 SUBGOAL_THEN `open(c:complex->bool)` ASSUME_TAC THENL
17802 [ASM_MESON_TAC[OPEN_COMPONENTS]; ALL_TAC] THEN
17803 SUBGOAL_THEN `path_connected(c:complex->bool)` ASSUME_TAC THENL
17804 [ASM_MESON_TAC[CONNECTED_OPEN_PATH_CONNECTED]; ALL_TAC] THEN
17807 ==> ?p. path (p:real^1->complex) /\ path_image p SUBSET c /\
17808 pathstart p = z0 /\ pathfinish p = x /\
17809 g(x) = Cx(&2) * Cx pi * ii * winding_number(f o p,Cx(&0)) +
17813 [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN EXPAND_TAC "g" THEN
17814 ABBREV_TAC `p = @p. path p /\ path_image p SUBSET c /\
17815 pathstart p = z0 /\ pathfinish p = (z:complex)` THEN
17816 EXISTS_TAC `p:real^1->complex` THEN
17817 CONV_TAC(TOP_DEPTH_CONV let_CONV) THEN REWRITE_TAC[] THEN
17818 EXPAND_TAC "p" THEN CONV_TAC SELECT_CONV THEN
17819 FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [path_connected]) THEN
17822 ASM_SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT] THEN
17823 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
17824 FIRST_ASSUM(MP_TAC o SPEC `z:complex` o GEN_REWRITE_RULE I
17825 [OPEN_CONTAINS_BALL]) THEN
17826 ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `e:real` THEN
17828 MP_TAC(SPEC `ball(z:complex,e)` SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG) THEN
17829 SIMP_TAC[OPEN_BALL; CONVEX_BALL; CONVEX_IMP_SIMPLY_CONNECTED] THEN
17830 DISCH_THEN(MP_TAC o SPEC `f:complex->complex` o CONJUNCT2) THEN
17832 [ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; SUBSET];
17833 DISCH_THEN(X_CHOOSE_THEN `l:complex->complex` STRIP_ASSUME_TAC)] THEN
17834 REWRITE_TAC[CONTINUOUS_AT] THEN ONCE_REWRITE_TAC[LIM_NULL] THEN
17835 MATCH_MP_TAC LIM_TRANSFORM_AT THEN
17836 ONCE_REWRITE_TAC[DIST_SYM] THEN EXISTS_TAC
17837 `\w. Cx(&2) * Cx pi * ii *
17838 winding_number((f:complex->complex) o linepath(z,w),Cx(&0))` THEN
17839 EXISTS_TAC `e:real` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
17840 [X_GEN_TAC `w:complex` THEN STRIP_TAC THEN REMOVE_THEN "*"
17841 (fun th -> MP_TAC(SPEC `w:complex` th) THEN
17842 MP_TAC(SPEC `z:complex` th)) THEN
17843 ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
17844 X_GEN_TAC `p:real^1->complex` THEN STRIP_TAC THEN
17845 ANTS_TAC THENL [ASM_MESON_TAC[SUBSET; IN_BALL; DIST_SYM]; ALL_TAC] THEN
17846 DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
17847 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(COMPLEX_RING
17848 `(z + x) - y = Cx(&0)
17849 ==> a * b * c * x = (a * b * c * y + l) - (a * b * c * z + l)`) THEN
17850 FIRST_X_ASSUM(MP_TAC o SPEC
17851 `p ++ linepath(z:complex,w) ++ reversepath q`) THEN
17852 ASM_SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
17853 PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
17854 PATH_JOIN_EQ; PATH_LINEPATH; PATH_REVERSEPATH;
17855 PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_IMAGE_JOIN] THEN
17856 ASM_REWRITE_TAC[UNION_SUBSET; PATH_IMAGE_REVERSEPATH] THEN ANTS_TAC THENL
17857 [REPEAT STRIP_TAC THEN
17858 MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `c:complex->bool` THEN
17859 ASM_REWRITE_TAC[PATH_IMAGE_LINEPATH] THEN
17860 MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,e)` THEN
17861 ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
17862 ASM_REWRITE_TAC[INSERT_SUBSET; CENTRE_IN_BALL; EMPTY_SUBSET] THEN
17863 ASM_REWRITE_TAC[IN_BALL; CONVEX_BALL];
17864 DISCH_THEN(fun th -> GEN_REWRITE_TAC RAND_CONV [GSYM th]) THEN
17865 REWRITE_TAC[PATH_COMPOSE_JOIN; PATH_COMPOSE_REVERSEPATH] THEN
17866 W(MP_TAC o PART_MATCH (lhand o rand) WINDING_NUMBER_JOIN o
17870 DISCH_THEN SUBST1_TAC THEN
17871 REWRITE_TAC[VECTOR_SUB; GSYM VECTOR_ADD_ASSOC] THEN
17873 W(MP_TAC o PART_MATCH (lhand o rand) WINDING_NUMBER_JOIN o
17877 DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN
17878 MATCH_MP_TAC(GSYM WINDING_NUMBER_REVERSEPATH)]] THEN
17879 ASM_SIMP_TAC[PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
17880 PATHSTART_COMPOSE; PATHFINISH_COMPOSE; PATH_IMAGE_REVERSEPATH;
17881 PATHSTART_JOIN; PATHFINISH_JOIN; PATH_REVERSEPATH;
17882 PATHSTART_LINEPATH; PATHFINISH_LINEPATH; PATH_JOIN;
17883 PATH_IMAGE_JOIN; IN_UNION; DE_MORGAN_THM] THEN
17884 REWRITE_TAC[PATH_IMAGE_COMPOSE; SET_RULE
17885 `~(z IN IMAGE f s) <=> !x. x IN s ==> ~(f x = z)`] THEN
17886 REPEAT CONJ_TAC THEN
17887 ((MATCH_MP_TAC PATH_CONTINUOUS_IMAGE)
17889 (X_GEN_TAC `x:complex` THEN DISCH_TAC THEN
17890 FIRST_X_ASSUM MATCH_MP_TAC)) THEN
17891 ASM_REWRITE_TAC[PATH_LINEPATH] THEN
17892 TRY(FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
17893 CONTINUOUS_ON_SUBSET)) THEN
17894 REWRITE_TAC[SUBSET] THEN X_GEN_TAC `x:complex` THEN STRIP_TAC) THEN
17895 FIRST_X_ASSUM(MATCH_MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
17896 TRY(FIRST_X_ASSUM(fun th ->
17897 MATCH_MP_TAC(GEN_REWRITE_RULE I [SUBSET] th) THEN
17898 FIRST_X_ASSUM ACCEPT_TAC)) THEN
17899 UNDISCH_TAC `(x:complex) IN path_image(linepath(z,w))` THEN
17900 SPEC_TAC(`x:complex`,`x:complex`) THEN
17901 REWRITE_TAC[GSYM SUBSET; PATH_IMAGE_LINEPATH; SEGMENT_CONVEX_HULL] THEN
17902 MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(z:complex,e)` THEN
17903 ASM_REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
17904 ASM_REWRITE_TAC[INSERT_SUBSET; CENTRE_IN_BALL; EMPTY_SUBSET] THEN
17905 ASM_REWRITE_TAC[IN_BALL; CONVEX_BALL]];
17906 MATCH_MP_TAC LIM_TRANSFORM THEN
17907 EXISTS_TAC `\w. Cx(&2) * Cx pi * ii *
17908 Cx(&1) / (Cx(&2) * Cx pi * ii) *
17909 (pathfinish(l o linepath(z:complex,w)) -
17910 pathstart (l o linepath(z,w)))` THEN
17911 REWRITE_TAC[] THEN CONJ_TAC THENL
17912 [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_AT] THEN
17913 EXISTS_TAC `e:real` THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
17914 ASM_REWRITE_TAC[] THEN X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
17915 REWRITE_TAC[VECTOR_ARITH `x - y = vec 0 <=> y = x`] THEN
17916 REPLICATE_TAC 3 AP_TERM_TAC THEN MATCH_MP_TAC lemma THEN
17917 EXISTS_TAC `ball(z:complex,e)` THEN ASM_REWRITE_TAC[PATH_LINEPATH] THEN
17918 CONJ_TAC THENL[ASM_MESON_TAC[CONTINUOUS_ON_SUBSET; SUBSET]; ALL_TAC] THEN
17919 REWRITE_TAC[PATH_IMAGE_LINEPATH; SEGMENT_CONVEX_HULL] THEN
17920 MATCH_MP_TAC HULL_MINIMAL THEN REWRITE_TAC[CONVEX_BALL] THEN
17921 ASM_REWRITE_TAC[INSERT_SUBSET; CENTRE_IN_BALL; EMPTY_SUBSET] THEN
17922 ASM_REWRITE_TAC[IN_BALL];
17923 REWRITE_TAC[COMPLEX_VEC_0] THEN
17924 REPEAT(MATCH_MP_TAC LIM_NULL_COMPLEX_LMUL) THEN
17925 REWRITE_TAC[PATHSTART_COMPOSE; PATHSTART_LINEPATH;
17926 PATHFINISH_COMPOSE; PATHFINISH_LINEPATH] THEN
17927 REWRITE_TAC[GSYM COMPLEX_VEC_0; GSYM LIM_NULL; GSYM CONTINUOUS_AT] THEN
17928 ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; OPEN_BALL;
17929 CENTRE_IN_BALL]]]);;
17931 (* ------------------------------------------------------------------------- *)
17932 (* The winding number defines a continuous logarithm for the path itself. *)
17933 (* ------------------------------------------------------------------------- *)
17935 let WINDING_NUMBER_AS_CONTINUOUS_LOGARITHM = prove
17937 path p /\ ~(z IN path_image p)
17939 pathfinish q - pathstart q =
17940 Cx(&2) * Cx pi * ii * winding_number(p,z) /\
17941 !t. t IN interval[vec 0,vec 1] ==> p(t) = z + cexp(q t)`,
17942 REPEAT STRIP_TAC THEN EXISTS_TAC
17943 `\t:real^1. Cx(&2) * Cx pi * ii * winding_number(subpath (vec 0) t p,z) +
17944 clog(pathstart p - z)` THEN
17945 REPEAT CONJ_TAC THENL
17946 [REWRITE_TAC[path] THEN MATCH_MP_TAC CONTINUOUS_ON_ADD THEN
17947 REWRITE_TAC[CONTINUOUS_ON_CONST] THEN
17948 REPEAT(MATCH_MP_TAC CONTINUOUS_ON_COMPLEX_MUL THEN
17949 REWRITE_TAC[CONTINUOUS_ON_CONST]) THEN
17950 REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN
17951 X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
17952 SUBGOAL_THEN `~((p:real^1->complex) t = z)` ASSUME_TAC THENL
17953 [ASM_MESON_TAC[path_image; IN_IMAGE]; ALL_TAC] THEN
17954 MP_TAC(SPEC `ball((p:real^1->complex) t,norm(p t - z))`
17955 SIMPLY_CONNECTED_EQ_CONTINUOUS_LOG) THEN
17956 SIMP_TAC[OPEN_BALL; CONVEX_BALL; CONVEX_IMP_SIMPLY_CONNECTED] THEN
17957 DISCH_THEN(MP_TAC o SPEC `\w:complex. w - z` o CONJUNCT2) THEN
17958 SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_ID; CONTINUOUS_ON_CONST] THEN
17959 REWRITE_TAC[COMPLEX_SUB_0] THEN ANTS_TAC THENL
17960 [GEN_TAC THEN ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
17961 SIMP_TAC[IN_BALL; dist; REAL_LT_REFL];
17962 DISCH_THEN(X_CHOOSE_THEN `l:complex->complex` STRIP_ASSUME_TAC)] THEN
17963 ONCE_REWRITE_TAC[WINDING_NUMBER_OFFSET] THEN
17964 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [path]) THEN
17965 GEN_REWRITE_TAC LAND_CONV [continuous_on] THEN
17966 DISCH_THEN(MP_TAC o SPEC `t:real^1`) THEN ASM_REWRITE_TAC[] THEN
17967 DISCH_THEN(MP_TAC o SPEC `norm((p:real^1->complex) t - z)`) THEN
17968 ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_SUB_EQ] THEN
17969 ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL] THEN
17970 DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN
17971 REWRITE_TAC[CONTINUOUS_WITHIN] THEN ONCE_REWRITE_TAC[LIM_NULL] THEN
17972 MATCH_MP_TAC LIM_TRANSFORM_WITHIN THEN EXISTS_TAC
17973 `\u. Cx(&1) / (Cx(&2) * Cx pi * ii) *
17974 (pathfinish((l:complex->complex) o subpath t u p) -
17975 pathstart(l o subpath t u p))` THEN
17976 EXISTS_TAC `d:real` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
17977 [X_GEN_TAC `u:real^1` THEN STRIP_TAC THEN
17979 `path_image(subpath t u p) SUBSET ball(p t:complex,norm (p t - z))`
17981 [REWRITE_TAC[PATH_IMAGE_SUBPATH_GEN] THEN
17982 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
17984 `segment[t,u] SUBSET interval[vec 0,vec 1] /\
17985 segment[t,u] SUBSET ball(t:real^1,d)`
17986 MP_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN
17987 CONJ_TAC THEN REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN
17988 MATCH_MP_TAC HULL_MINIMAL THEN
17989 REWRITE_TAC[CONVEX_BALL; CONVEX_INTERVAL] THEN
17990 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; CENTRE_IN_BALL] THEN
17991 ASM_REWRITE_TAC[ONCE_REWRITE_RULE[DIST_SYM] IN_BALL];
17993 W(MP_TAC o PART_MATCH (rand o rand) WINDING_NUMBER_COMPOSE_CEXP o
17996 [MATCH_MP_TAC PATH_CONTINUOUS_IMAGE THEN ASM_SIMP_TAC[PATH_SUBPATH] THEN
17997 ASM_MESON_TAC[CONTINUOUS_ON_SUBSET];
17998 DISCH_THEN(SUBST1_TAC o SYM)] THEN
17999 MATCH_MP_TAC EQ_TRANS THEN
18000 EXISTS_TAC `winding_number((\w. subpath t u p w - z),Cx(&0))` THEN
18002 [MATCH_MP_TAC WINDING_NUMBER_EQUAL THEN
18003 REWRITE_TAC[o_THM; GSYM path_image; SET_RULE
18004 `(!x. x IN s ==> cexp(l(subpath t u p x)) = subpath t u p x - z) <=>
18005 (!y. y IN IMAGE (subpath t u p) s ==> cexp(l y) = y - z)`] THEN
18007 ONCE_REWRITE_TAC[GSYM WINDING_NUMBER_OFFSET] THEN
18008 REWRITE_TAC[ETA_AX] THEN
18009 MP_TAC(ISPECL [`p:real^1->complex`; `vec 0:real^1`; `t:real^1`;
18010 `u:real^1`; `z:complex`]
18011 WINDING_NUMBER_SUBPATH_COMBINE) THEN
18012 ASM_REWRITE_TAC[ENDS_IN_UNIT_INTERVAL] THEN
18013 CONV_TAC COMPLEX_RING];
18014 REWRITE_TAC[COMPLEX_VEC_0] THEN MATCH_MP_TAC LIM_NULL_COMPLEX_LMUL THEN
18015 REWRITE_TAC[PATHSTART_COMPOSE; PATHSTART_SUBPATH;
18016 PATHFINISH_COMPOSE; PATHFINISH_SUBPATH] THEN
18017 REWRITE_TAC[GSYM COMPLEX_VEC_0; GSYM LIM_NULL] THEN
18018 REWRITE_TAC[GSYM CONTINUOUS_WITHIN] THEN
18019 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
18020 MATCH_MP_TAC CONTINUOUS_WITHIN_COMPOSE THEN CONJ_TAC THENL
18021 [ASM_MESON_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN; path];
18022 MATCH_MP_TAC CONTINUOUS_AT_WITHIN THEN
18023 UNDISCH_TAC `(l:complex->complex) continuous_on
18024 ball(p(t:real^1),norm(p t - z))` THEN
18025 SIMP_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_AT; OPEN_BALL] THEN
18026 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[CENTRE_IN_BALL] THEN
18027 ASM_REWRITE_TAC[VECTOR_SUB_EQ; NORM_POS_LT]]];
18028 REWRITE_TAC[pathstart; pathfinish; SUBPATH_REFL; SUBPATH_TRIVIAL] THEN
18029 MATCH_MP_TAC(COMPLEX_FIELD
18031 ==> (a * b * c * w + l) - (a * b * c * w' + l) = a * b * c * w`) THEN
18032 MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
18033 MP_TAC(ISPEC `p:real^1->complex` PATHSTART_IN_PATH_IMAGE) THEN
18034 REWRITE_TAC[pathstart] THEN ASM_MESON_TAC[];
18035 X_GEN_TAC `t:real^1` THEN DISCH_TAC THEN
18036 MP_TAC(ISPECL [`subpath (vec 0) t (p:real^1->complex)`; `z:complex`]
18037 WINDING_NUMBER_AHLFORS_FULL) THEN
18038 REWRITE_TAC[PATHSTART_SUBPATH; PATHFINISH_SUBPATH] THEN
18039 ASM_SIMP_TAC[ENDS_IN_UNIT_INTERVAL; PATH_SUBPATH; CEXP_ADD;
18040 REWRITE_RULE[SET_RULE `s SUBSET t <=> !x. ~(x IN t) ==> ~(x IN s)`]
18041 PATH_IMAGE_SUBPATH_SUBSET] THEN
18042 MATCH_MP_TAC(COMPLEX_RING
18043 `t:complex = s ==> p - z = e * s ==> p = z + e * t`) THEN
18044 REWRITE_TAC[pathstart] THEN MATCH_MP_TAC CEXP_CLOG THEN
18045 REWRITE_TAC[COMPLEX_SUB_0] THEN
18046 ASM_MESON_TAC[pathstart; PATHSTART_IN_PATH_IMAGE]]);;
18048 (* ------------------------------------------------------------------------- *)
18049 (* Winding number equality is the same as path/loop homotopy in C - {0}. *)
18050 (* ------------------------------------------------------------------------- *)
18052 let WINDING_NUMBER_HOMOTOPIC_LOOPS_NULL_EQ = prove
18053 (`!p z. path p /\ ~(z IN path_image p)
18054 ==> (winding_number(p,z) = Cx(&0) <=>
18055 ?a. homotopic_loops ((:complex) DELETE z) p (\t. a))`,
18056 REPEAT STRIP_TAC THEN EQ_TAC THEN STRIP_TAC THENL
18057 [REPEAT STRIP_TAC THEN
18058 MP_TAC(SPECL [`p:real^1->complex`; `z:complex`]
18059 WINDING_NUMBER_AS_CONTINUOUS_LOGARITHM) THEN
18060 ASM_REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_LID; COMPLEX_SUB_0] THEN
18061 DISCH_THEN(X_CHOOSE_THEN `q:real^1->complex` STRIP_ASSUME_TAC) THEN
18062 EXISTS_TAC `z + Cx(&1)` THEN
18063 MP_TAC(ISPECL [`\r:real^1->complex. pathfinish r = pathstart r`;
18064 `q:real^1->complex`; `\t:real^1. Cx(&0)`;
18066 `interval[vec 0:real^1,vec 1]`; `(:complex)`;
18067 `(:complex) DELETE z`]
18068 HOMOTOPIC_WITH_COMPOSE_CONTINUOUS_LEFT) THEN
18069 ASM_SIMP_TAC[CONTINUOUS_ON_CEXP; CONTINUOUS_ON_ADD; CONTINUOUS_ON_CONST;
18070 CEXP_0; homotopic_loops; o_DEF] THEN
18072 [REWRITE_TAC[CEXP_NZ; COMPLEX_EQ_ADD_LCANCEL_0; SET_RULE
18073 `IMAGE f UNIV SUBSET UNIV DELETE z <=> !x. ~(f x = z)`] THEN
18074 MATCH_MP_TAC HOMOTOPIC_WITH_MONO THEN
18075 EXISTS_TAC `\r:real^1->complex. pathfinish r = pathstart r` THEN
18077 [REWRITE_TAC[GSYM homotopic_loops] THEN
18078 MATCH_MP_TAC HOMOTOPIC_LOOPS_LINEAR THEN
18079 ASM_REWRITE_TAC[SUBSET_UNIV] THEN
18080 REWRITE_TAC[path; pathstart; pathfinish; CONTINUOUS_ON_CONST];
18081 SIMP_TAC[pathstart; pathfinish]];
18082 MATCH_MP_TAC(ONCE_REWRITE_RULE[IMP_CONJ_ALT] HOMOTOPIC_WITH_EQ) THEN
18083 ASM_SIMP_TAC[o_THM; pathstart; pathfinish; ENDS_IN_UNIT_INTERVAL]];
18084 FIRST_ASSUM(MP_TAC o MATCH_MP WINDING_NUMBER_HOMOTOPIC_LOOPS) THEN
18085 ASM_REWRITE_TAC[GSYM LINEPATH_REFL] THEN
18086 DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
18087 FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_LOOPS_IMP_SUBSET) THEN
18088 REWRITE_TAC[GSYM LINEPATH_REFL; PATH_IMAGE_LINEPATH; SEGMENT_REFL] THEN
18091 let WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EXPLICIT_EQ = prove
18092 (`!p z. path p /\ ~(z IN path_image p)
18093 ==> (winding_number(p,z) = Cx(&0) <=>
18094 homotopic_paths ((:complex) DELETE z)
18095 p (linepath(pathstart p,pathstart p)))`,
18096 REPEAT STRIP_TAC THEN EQ_TAC THENL
18097 [ASM_SIMP_TAC[WINDING_NUMBER_HOMOTOPIC_LOOPS_NULL_EQ] THEN
18098 REWRITE_TAC[GSYM LINEPATH_REFL; HOMOTOPIC_LOOPS_IMP_HOMOTOPIC_PATHS_NULL;
18099 LEFT_IMP_EXISTS_THM];
18101 FIRST_ASSUM(MP_TAC o MATCH_MP WINDING_NUMBER_HOMOTOPIC_PATHS) THEN
18102 ASM_REWRITE_TAC[GSYM LINEPATH_REFL] THEN
18103 DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
18104 ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE]]);;
18106 let WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EQ = prove
18107 (`!p z. path p /\ ~(z IN path_image p)
18108 ==> (winding_number(p,z) = Cx(&0) <=>
18109 ?a. homotopic_paths ((:complex) DELETE z) p (\t. a))`,
18110 REPEAT STRIP_TAC THEN EQ_TAC THENL
18111 [ASM_SIMP_TAC[WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EXPLICIT_EQ] THEN
18112 REWRITE_TAC[GSYM LINEPATH_REFL] THEN MESON_TAC[];
18114 FIRST_ASSUM(MP_TAC o MATCH_MP WINDING_NUMBER_HOMOTOPIC_PATHS) THEN
18115 ASM_REWRITE_TAC[GSYM LINEPATH_REFL] THEN
18116 DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC WINDING_NUMBER_TRIVIAL THEN
18117 FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_SUBSET) THEN
18118 REWRITE_TAC[GSYM LINEPATH_REFL; PATH_IMAGE_LINEPATH; SEGMENT_REFL] THEN
18121 let WINDING_NUMBER_HOMOTOPIC_PATHS_EQ = prove
18123 path p /\ ~(z IN path_image p) /\
18124 path q /\ ~(z IN path_image q) /\
18125 pathstart q = pathstart p /\ pathfinish q = pathfinish p
18126 ==> (winding_number(p,z) = winding_number(q,z) <=>
18127 homotopic_paths ((:complex) DELETE z) p q)`,
18128 REPEAT STRIP_TAC THEN EQ_TAC THEN
18129 REWRITE_TAC[WINDING_NUMBER_HOMOTOPIC_PATHS] THEN DISCH_TAC THEN
18130 MP_TAC(ISPECL [`p ++ reversepath q:real^1->complex`; `z:complex`]
18131 WINDING_NUMBER_HOMOTOPIC_PATHS_NULL_EQ) THEN
18132 ASM_SIMP_TAC[PATH_JOIN; PATH_REVERSEPATH; PATH_IMAGE_JOIN; IN_UNION;
18133 PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
18134 PATH_IMAGE_REVERSEPATH; WINDING_NUMBER_JOIN;
18135 WINDING_NUMBER_REVERSEPATH; COMPLEX_ADD_RINV] THEN
18136 REWRITE_TAC[GSYM LINEPATH_REFL] THEN STRIP_TAC THEN
18137 FIRST_ASSUM(MP_TAC o MATCH_MP
18138 (REWRITE_RULE[IMP_CONJ] HOMOTOPIC_PATHS_IMP_HOMOTOPIC_LOOPS)) THEN
18139 FIRST_ASSUM(MP_TAC o MATCH_MP HOMOTOPIC_PATHS_IMP_PATHSTART) THEN
18140 ASM_REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
18141 PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
18142 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
18143 DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
18144 DISCH_THEN(MP_TAC o MATCH_MP
18145 (REWRITE_RULE[IMP_CONJ] HOMOTOPIC_PATHS_LOOP_PARTS)) THEN
18146 ASM_REWRITE_TAC[]);;
18148 let WINDING_NUMBER_HOMOTOPIC_LOOPS_EQ = prove
18150 path p /\ pathfinish p = pathstart p /\ ~(z IN path_image p) /\
18151 path q /\ pathfinish q = pathstart q /\ ~(z IN path_image q)
18152 ==> (winding_number(p,z) = winding_number(q,z) <=>
18153 homotopic_loops ((:complex) DELETE z) p q)`,
18154 REPEAT STRIP_TAC THEN EQ_TAC THEN
18155 REWRITE_TAC[WINDING_NUMBER_HOMOTOPIC_LOOPS] THEN DISCH_TAC THEN
18156 SUBGOAL_THEN `~(pathstart p:complex = z) /\ ~(pathstart q = z)`
18157 STRIP_ASSUME_TAC THENL
18158 [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE];
18160 MP_TAC(ISPECL [`(:complex)`; `z:complex`]
18161 PATH_CONNECTED_OPEN_DELETE) THEN
18162 REWRITE_TAC[OPEN_UNIV; CONNECTED_UNIV; DIMINDEX_2; LE_REFL] THEN
18163 REWRITE_TAC[path_connected] THEN DISCH_THEN(MP_TAC o SPECL
18164 [`pathstart p:complex`; `pathstart q:complex`]) THEN
18165 ASM_REWRITE_TAC[IN_UNIV; IN_DELETE; LEFT_IMP_EXISTS_THM] THEN
18166 X_GEN_TAC `r:real^1->complex` THEN
18167 REWRITE_TAC[SET_RULE `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
18168 STRIP_TAC THEN SUBGOAL_THEN `~(pathstart r:complex = z)`
18169 STRIP_ASSUME_TAC THENL
18170 [ASM_MESON_TAC[PATHSTART_IN_PATH_IMAGE; PATHFINISH_IN_PATH_IMAGE];
18172 MATCH_MP_TAC HOMOTOPIC_LOOPS_TRANS THEN
18173 EXISTS_TAC `r ++ q ++ reversepath r:real^1->complex` THEN
18174 ASM_SIMP_TAC[HOMOTOPIC_LOOPS_CONJUGATE; SET_RULE
18175 `s SUBSET UNIV DELETE z <=> ~(z IN s)`] THEN
18176 MATCH_MP_TAC HOMOTOPIC_PATHS_IMP_HOMOTOPIC_LOOPS THEN
18177 ASM_REWRITE_TAC[PATHFINISH_JOIN; PATHFINISH_REVERSEPATH] THEN
18178 W(MP_TAC o PART_MATCH (rand o rand) WINDING_NUMBER_HOMOTOPIC_PATHS_EQ o
18180 ASM_SIMP_TAC[PATH_JOIN; PATH_REVERSEPATH; PATHSTART_JOIN; PATHFINISH_JOIN;
18181 PATHSTART_REVERSEPATH; PATHFINISH_REVERSEPATH;
18182 PATH_IMAGE_JOIN; IN_UNION; PATH_IMAGE_REVERSEPATH;
18183 WINDING_NUMBER_JOIN; WINDING_NUMBER_REVERSEPATH] THEN
18184 DISCH_THEN(SUBST1_TAC o SYM) THEN SIMPLE_COMPLEX_ARITH_TAC);;
18186 (* ------------------------------------------------------------------------- *)
18187 (* A few simple corollaries from the various equivalences. *)
18188 (* ------------------------------------------------------------------------- *)
18190 let SIMPLY_CONNECTED_INSIDE_SIMPLE_PATH = prove
18191 (`!p:real^1->real^2.
18192 simple_path p ==> simply_connected(inside(path_image p))`,
18193 REPEAT STRIP_TAC THEN
18194 FIRST_ASSUM(ASSUME_TAC o MATCH_MP SIMPLE_PATH_IMP_PATH) THEN
18195 ASM_SIMP_TAC[SIMPLY_CONNECTED_EQ_EMPTY_INSIDE;
18196 OPEN_INSIDE; CLOSED_PATH_IMAGE; INSIDE_INSIDE_EQ_EMPTY;
18197 CONNECTED_PATH_IMAGE] THEN
18198 ASM_CASES_TAC `pathstart(p):real^2 = pathfinish p` THEN
18199 ASM_SIMP_TAC[JORDAN_INSIDE_OUTSIDE; INSIDE_ARC_EMPTY; ARC_SIMPLE_PATH] THEN
18200 REWRITE_TAC[CONNECTED_EMPTY]);;
18202 let SIMPLY_CONNECTED_INTER = prove
18203 (`!s t:real^2->bool.
18204 open s /\ open t /\ simply_connected s /\ simply_connected t /\
18205 connected (s INTER t)
18206 ==> simply_connected (s INTER t)`,
18207 REPEAT GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
18208 SIMP_TAC[SIMPLY_CONNECTED_EQ_WINDING_NUMBER_ZERO; OPEN_INTER] THEN
18209 REWRITE_TAC[SUBSET; IN_INTER] THEN MESON_TAC[]);;
18211 (* ------------------------------------------------------------------------- *)
18212 (* Pick out the Riemann Mapping Theorem from the earlier chain. *)
18213 (* ------------------------------------------------------------------------- *)
18215 let RIEMANN_MAPPING_THEOREM = prove
18216 (`!s. open s /\ simply_connected s <=>
18219 ?f g. f holomorphic_on s /\
18220 g holomorphic_on ball(Cx(&0),&1) /\
18221 (!z. z IN s ==> f z IN ball(Cx(&0),&1) /\ g(f z) = z) /\
18222 (!z. z IN ball(Cx(&0),&1) ==> g z IN s /\ f(g z) = z)`,
18223 GEN_TAC THEN MATCH_MP_TAC(TAUT
18224 `(a ==> (b <=> c)) /\ (c ==> a) ==> (a /\ b <=> c)`) THEN
18225 REWRITE_TAC[SIMPLY_CONNECTED_EQ_BIHOLOMORPHIC_TO_DISC] THEN STRIP_TAC THEN
18226 ASM_REWRITE_TAC[OPEN_EMPTY; OPEN_UNIV] THEN
18227 SUBGOAL_THEN `s = IMAGE (g:complex->complex) (ball(Cx(&0),&1))`
18228 SUBST1_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
18229 MATCH_MP_TAC INVARIANCE_OF_DOMAIN THEN
18230 ASM_SIMP_TAC[OPEN_BALL; HOLOMORPHIC_ON_IMP_CONTINUOUS_ON] THEN