src/HOL/Complex_Analysis/Complex_Singularities.thy
changeset 82517 111b1b2a2d13
parent 82310 41f5266e5595
equal deleted inserted replaced
82516:88f101c3cfe2 82517:111b1b2a2d13
     1 theory Complex_Singularities
     1 theory Complex_Singularities
     2   imports Conformal_Mappings
     2   imports Conformal_Mappings
     3 begin
     3 begin
     4 
     4 
     5 subsection \<open>Non-essential singular points\<close>
     5 subsection \<open>Non-essential singular points\<close>
       
     6 
       
     7 lemma at_to_0': "NO_MATCH 0 z \<Longrightarrow> at z = filtermap (\<lambda>x. x + z) (at 0)"
       
     8   for z :: "'a::real_normed_vector"
       
     9   by (rule at_to_0)
       
    10 
       
    11 lemma nhds_to_0: "nhds (x :: 'a :: real_normed_vector) = filtermap ((+) x) (nhds 0)"
       
    12 proof -
       
    13   have "(\<lambda>xa. xa - - x) = (+) x"
       
    14     by auto
       
    15   thus ?thesis
       
    16     using filtermap_nhds_shift[of "-x" 0] by simp
       
    17 qed
       
    18 
       
    19 lemma nhds_to_0': "NO_MATCH 0 x \<Longrightarrow> nhds (x :: 'a :: real_normed_vector) = filtermap ((+) x) (nhds 0)"
       
    20   by (rule nhds_to_0)
       
    21 
     6 
    22 
     7 definition\<^marker>\<open>tag important\<close>
    23 definition\<^marker>\<open>tag important\<close>
     8   is_pole :: "('a::topological_space \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a \<Rightarrow> bool" 
    24   is_pole :: "('a::topological_space \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a \<Rightarrow> bool" 
     9   where "is_pole f a =  (LIM x (at a). f x :> at_infinity)"
    25   where "is_pole f a =  (LIM x (at a). f x :> at_infinity)"
    10 
    26 
  2453 lemma deriv_divide_is_pole: \<comment>\<open>Generalises @{thm zorder_deriv}\<close>
  2469 lemma deriv_divide_is_pole: \<comment>\<open>Generalises @{thm zorder_deriv}\<close>
  2454   fixes f g:: "complex \<Rightarrow> complex" and z::complex
  2470   fixes f g:: "complex \<Rightarrow> complex" and z::complex
  2455   assumes f_iso: "isolated_singularity_at f z"
  2471   assumes f_iso: "isolated_singularity_at f z"
  2456       and f_ness: "not_essential f z" 
  2472       and f_ness: "not_essential f z" 
  2457       and fg_nconst: "\<exists>\<^sub>Fw in (at z). deriv f w *  f w \<noteq> 0"
  2473       and fg_nconst: "\<exists>\<^sub>Fw in (at z). deriv f w *  f w \<noteq> 0"
  2458       and f_ord: "zorder f z \<noteq>0"
  2474       and f_ord: "zorder f z \<noteq> 0"
  2459     shows "is_pole (\<lambda>z. deriv f z / f z) z"
  2475     shows "is_pole (\<lambda>z. deriv f z / f z) z"
  2460 proof (rule neg_zorder_imp_is_pole)
  2476 proof (rule neg_zorder_imp_is_pole)
  2461   define ff where "ff=(\<lambda>w. deriv f w / f w)"
  2477   define ff where "ff=(\<lambda>w. deriv f w / f w)"
  2462   show "isolated_singularity_at ff z" 
  2478   show "isolated_singularity_at ff z" 
  2463     using f_iso f_ness unfolding ff_def
  2479     using f_iso f_ness unfolding ff_def
  2488     using assms f_iso isolated_pole_imp_nzero_times by blast
  2504     using assms f_iso isolated_pole_imp_nzero_times by blast
  2489   show "zorder f z \<noteq> 0"
  2505   show "zorder f z \<noteq> 0"
  2490     using isolated_pole_imp_neg_zorder assms by fastforce
  2506     using isolated_pole_imp_neg_zorder assms by fastforce
  2491 qed
  2507 qed
  2492 
  2508 
  2493 subsection \<open>Isolated zeroes\<close>
       
  2494 
       
  2495 definition isolated_zero :: "(complex \<Rightarrow> complex) \<Rightarrow> complex \<Rightarrow> bool" where
       
  2496   "isolated_zero f z \<longleftrightarrow> f z = 0 \<and> eventually (\<lambda>z. f z \<noteq> 0) (at z)"
       
  2497 
       
  2498 lemma isolated_zero_altdef: "isolated_zero f z \<longleftrightarrow> f z = 0 \<and> \<not>z islimpt {z. f z = 0}"
       
  2499   unfolding isolated_zero_def eventually_at_filter eventually_nhds islimpt_def by blast
       
  2500 
       
  2501 lemma isolated_zero_mult1:
       
  2502   assumes "isolated_zero f x" "isolated_zero g x"
       
  2503   shows   "isolated_zero (\<lambda>x. f x * g x) x"
       
  2504 proof -
       
  2505   have "\<forall>\<^sub>F x in at x. f x \<noteq> 0" "\<forall>\<^sub>F x in at x. g x \<noteq> 0"
       
  2506     using assms unfolding isolated_zero_def by auto
       
  2507   hence "eventually (\<lambda>x. f x * g x \<noteq> 0) (at x)"
       
  2508     by eventually_elim auto
       
  2509   with assms show ?thesis
       
  2510     by (auto simp: isolated_zero_def)
       
  2511 qed
       
  2512 
       
  2513 lemma isolated_zero_mult2:
       
  2514   assumes "isolated_zero f x" "g x \<noteq> 0" "g analytic_on {x}"
       
  2515   shows   "isolated_zero (\<lambda>x. f x * g x) x"
       
  2516 proof -
       
  2517   have "eventually (\<lambda>x. f x \<noteq> 0) (at x)"
       
  2518     using assms unfolding isolated_zero_def by auto
       
  2519   moreover have "eventually (\<lambda>x. g x \<noteq> 0) (at x)"
       
  2520     using analytic_at_neq_imp_eventually_neq[of g x 0] assms by auto
       
  2521   ultimately have "eventually (\<lambda>x. f x * g x \<noteq> 0) (at x)"
       
  2522     by eventually_elim auto
       
  2523   thus ?thesis
       
  2524     using assms(1) by (auto simp: isolated_zero_def)
       
  2525 qed
       
  2526 
       
  2527 lemma isolated_zero_mult3:
       
  2528   assumes "isolated_zero f x" "g x \<noteq> 0" "g analytic_on {x}"
       
  2529   shows   "isolated_zero (\<lambda>x. g x * f x) x"
       
  2530   using isolated_zero_mult2[OF assms] by (simp add: mult_ac)
       
  2531   
       
  2532 lemma isolated_zero_prod:
       
  2533   assumes "\<And>x. x \<in> I \<Longrightarrow> isolated_zero (f x) z" "I \<noteq> {}" "finite I"
       
  2534   shows   "isolated_zero (\<lambda>y. \<Prod>x\<in>I. f x y) z"
       
  2535   using assms(3,2,1) by (induction rule: finite_ne_induct) (auto intro: isolated_zero_mult1)
       
  2536 
       
  2537 lemma non_isolated_zero':
       
  2538   assumes "isolated_singularity_at f z" "not_essential f z" "f z = 0" "\<not>isolated_zero f z"
       
  2539   shows   "eventually (\<lambda>z. f z = 0) (at z)"
       
  2540   by (metis assms isolated_zero_def non_zero_neighbour not_eventually)
       
  2541 
       
  2542 lemma non_isolated_zero:
       
  2543   assumes "\<not>isolated_zero f z" "f analytic_on {z}" "f z = 0"
       
  2544   shows   "eventually (\<lambda>z. f z = 0) (nhds z)"
       
  2545 proof -
       
  2546   have "eventually (\<lambda>z. f z = 0) (at z)"
       
  2547     by (rule non_isolated_zero')
       
  2548        (use assms in \<open>auto intro: not_essential_analytic isolated_singularity_at_analytic\<close>)
       
  2549   with \<open>f z = 0\<close> show ?thesis
       
  2550     unfolding eventually_at_filter by (auto elim!: eventually_mono)
       
  2551 qed
       
  2552 
       
  2553 lemma not_essential_compose:
       
  2554   assumes "not_essential f (g z)" "g analytic_on {z}"
       
  2555   shows   "not_essential (\<lambda>x. f (g x)) z"
       
  2556 proof (cases "isolated_zero (\<lambda>w. g w - g z) z")
       
  2557   case False
       
  2558   hence "eventually (\<lambda>w. g w - g z = 0) (nhds z)"
       
  2559     by (rule non_isolated_zero) (use assms in \<open>auto intro!: analytic_intros\<close>)
       
  2560   hence "not_essential (\<lambda>x. f (g x)) z \<longleftrightarrow> not_essential (\<lambda>_. f (g z)) z"
       
  2561     by (intro not_essential_cong refl)
       
  2562        (auto elim!: eventually_mono simp: eventually_at_filter)
       
  2563   thus ?thesis
       
  2564     by (simp add: not_essential_const)
       
  2565 next
       
  2566   case True
       
  2567   hence ev: "eventually (\<lambda>w. g w \<noteq> g z) (at z)"
       
  2568     by (auto simp: isolated_zero_def)
       
  2569   from assms consider c where "f \<midarrow>g z\<rightarrow> c" | "is_pole f (g z)"
       
  2570     by (auto simp: not_essential_def)  
       
  2571   have "isCont g z"
       
  2572     by (rule analytic_at_imp_isCont) fact
       
  2573   hence lim: "g \<midarrow>z\<rightarrow> g z"
       
  2574     using isContD by blast
       
  2575 
       
  2576   from assms(1) consider c where "f \<midarrow>g z\<rightarrow> c" | "is_pole f (g z)"
       
  2577     unfolding not_essential_def by blast
       
  2578   thus ?thesis
       
  2579   proof cases
       
  2580     fix c assume "f \<midarrow>g z\<rightarrow> c"
       
  2581     hence "(\<lambda>x. f (g x)) \<midarrow>z\<rightarrow> c"
       
  2582       by (rule filterlim_compose) (use lim ev in \<open>auto simp: filterlim_at\<close>)
       
  2583     thus ?thesis
       
  2584       by (auto simp: not_essential_def)
       
  2585   next
       
  2586     assume "is_pole f (g z)"
       
  2587     hence "is_pole (\<lambda>x. f (g x)) z"
       
  2588       by (rule is_pole_compose) fact+
       
  2589     thus ?thesis
       
  2590       by (auto simp: not_essential_def)
       
  2591   qed
       
  2592 qed
       
  2593   
  2509   
  2594 subsection \<open>Isolated points\<close>
  2510 subsection \<open>Isolated points\<close>
  2595 
  2511 
  2596 definition isolated_points_of :: "complex set \<Rightarrow> complex set" where
  2512 definition isolated_points_of :: "complex set \<Rightarrow> complex set" where
  2597   "isolated_points_of A = {z\<in>A. eventually (\<lambda>w. w \<notin> A) (at z)}"
  2513   "isolated_points_of A = {z\<in>A. eventually (\<lambda>w. w \<notin> A) (at z)}"
  2616   using assms by (auto simp: isolated_points_of_def discrete_altdef)
  2532   using assms by (auto simp: isolated_points_of_def discrete_altdef)
  2617 
  2533 
  2618 lemmas uniform_discreteI1 = uniformI1
  2534 lemmas uniform_discreteI1 = uniformI1
  2619 lemmas uniform_discreteI2 = uniformI2
  2535 lemmas uniform_discreteI2 = uniformI2
  2620 
  2536 
  2621 lemma isolated_singularity_at_compose:
  2537 lemma zorder_zero_eqI':
  2622   assumes "isolated_singularity_at f (g z)" "g analytic_on {z}"
  2538   assumes "f analytic_on {z}"
  2623   shows   "isolated_singularity_at (\<lambda>x. f (g x)) z"
  2539   assumes "\<And>i. i < nat n \<Longrightarrow> (deriv ^^ i) f z = 0"
  2624 proof (cases "isolated_zero (\<lambda>w. g w - g z) z")
  2540   assumes "(deriv ^^ nat n) f z \<noteq> 0" and "n \<ge> 0"
  2625   case False
  2541   shows   "zorder f z = n"
  2626   hence "eventually (\<lambda>w. g w - g z = 0) (nhds z)"
  2542 proof -
  2627     by (rule non_isolated_zero) (use assms in \<open>auto intro!: analytic_intros\<close>)
  2543   from assms(1) obtain A where "open A" "z \<in> A" "f holomorphic_on A"
  2628   hence "isolated_singularity_at (\<lambda>x. f (g x)) z \<longleftrightarrow> isolated_singularity_at (\<lambda>_. f (g z)) z"
  2544     using analytic_at by blast
  2629     by (intro isolated_singularity_at_cong refl)
       
  2630        (auto elim!: eventually_mono simp: eventually_at_filter)
       
  2631   thus ?thesis
  2545   thus ?thesis
  2632     by (simp add: isolated_singularity_at_const)
  2546     using zorder_zero_eqI[of f A z n] assms by blast
  2633 next
  2547 qed
  2634   case True
  2548 
  2635   from assms(1) obtain r where r: "r > 0" "f analytic_on ball (g z) r - {g z}"
  2549 
  2636     by (auto simp: isolated_singularity_at_def)
  2550 subsection \<open>Isolated zeros\<close>
  2637   hence holo_f: "f holomorphic_on ball (g z) r - {g z}"
  2551 
  2638     by (subst (asm) analytic_on_open) auto
  2552 definition isolated_zero :: "('a::topological_space \<Rightarrow> 'b::real_normed_div_algebra) \<Rightarrow> 'a \<Rightarrow> bool" where
  2639   from assms(2) obtain r' where r': "r' > 0" "g holomorphic_on ball z r'"
  2553   "isolated_zero f a \<longleftrightarrow> f \<midarrow>a\<rightarrow> 0 \<and> eventually (\<lambda>x. f x \<noteq> 0) (at a)" 
  2640     by (auto simp: analytic_on_def)
  2554 
  2641 
  2555 lemma isolated_zero_shift:
  2642   have "continuous_on (ball z r') g"
  2556   fixes z :: "'a :: real_normed_vector"
  2643     using holomorphic_on_imp_continuous_on r' by blast
  2557   shows "isolated_zero f z \<longleftrightarrow> isolated_zero (\<lambda>w. f (z + w)) 0"
  2644   hence "isCont g z"
  2558   unfolding isolated_zero_def
  2645     using r' by (subst (asm) continuous_on_eq_continuous_at) auto
  2559   by (simp add: at_to_0' eventually_filtermap filterlim_filtermap add_ac)  
  2646   hence "g \<midarrow>z\<rightarrow> g z"
  2560 
  2647     using isContD by blast
  2561 lemma isolated_zero_shift':
  2648   hence "eventually (\<lambda>w. g w \<in> ball (g z) r) (at z)"
  2562   fixes z :: "'a :: real_normed_vector"
  2649     using \<open>r > 0\<close> unfolding tendsto_def by force
  2563   assumes "NO_MATCH 0 z"
  2650   moreover have "eventually (\<lambda>w. g w \<noteq> g z) (at z)" using True
  2564   shows   "isolated_zero f z \<longleftrightarrow> isolated_zero (\<lambda>w. f (z + w)) 0"
  2651     by (auto simp: isolated_zero_def elim!: eventually_mono)
  2565   by (rule isolated_zero_shift)
  2652   ultimately have "eventually (\<lambda>w. g w \<in> ball (g z) r - {g z}) (at z)"
  2566 
  2653     by eventually_elim auto
  2567 lemma isolated_zero_imp_not_essential [intro]:
  2654   then obtain r'' where r'': "r'' > 0" "\<forall>w\<in>ball z r''-{z}. g w \<in> ball (g z) r - {g z}"
  2568   "isolated_zero f z \<Longrightarrow> not_essential f z"
  2655     unfolding eventually_at_filter eventually_nhds_metric ball_def
  2569   unfolding isolated_zero_def not_essential_def
  2656     by (auto simp: dist_commute)
  2570   using tendsto_nhds_iff by blast
  2657   have "f \<circ> g holomorphic_on ball z (min r' r'') - {z}"
  2571 
  2658   proof (rule holomorphic_on_compose_gen)
  2572 lemma pole_is_not_zero:
  2659     show "g holomorphic_on ball z (min r' r'') - {z}"
  2573   fixes f:: "'a::perfect_space \<Rightarrow> 'b::real_normed_field"
  2660       by (rule holomorphic_on_subset[OF r'(2)]) auto
  2574   assumes "is_pole f z" 
  2661     show "f holomorphic_on ball (g z) r - {g z}"
  2575   shows "\<not>isolated_zero f z"
  2662       by fact
  2576 proof 
  2663     show "g ` (ball z (min r' r'') - {z}) \<subseteq> ball (g z) r - {g z}"
  2577   assume "isolated_zero f z"
  2664       using r'' by force
  2578   then have "filterlim f (nhds 0) (at z)" 
  2665   qed
  2579     unfolding isolated_zero_def using tendsto_nhds_iff by blast
  2666   hence "f \<circ> g analytic_on ball z (min r' r'') - {z}"
  2580   moreover have "filterlim f at_infinity (at z)" 
  2667     by (subst analytic_on_open) auto
  2581     using \<open>is_pole f z\<close> unfolding is_pole_def .
  2668   thus ?thesis using \<open>r' > 0\<close> \<open>r'' > 0\<close>
  2582   ultimately show False
  2669     by (auto simp: isolated_singularity_at_def o_def intro!: exI[of _ "min r' r''"])
  2583     using not_tendsto_and_filterlim_at_infinity[OF at_neq_bot]
  2670 qed
  2584     by auto
  2671 
  2585 qed
  2672 lemma is_pole_power_int_0:
  2586 
  2673   assumes "f analytic_on {x}" "isolated_zero f x" "n < 0"
  2587 lemma isolated_zero_imp_pole_inverse:
  2674   shows   "is_pole (\<lambda>x. f x powi n) x"
  2588   fixes f :: "_ \<Rightarrow> 'b::{real_normed_div_algebra, division_ring}"
  2675 proof -
  2589   assumes "isolated_zero f z"
  2676   have "f \<midarrow>x\<rightarrow> f x"
  2590   shows   "is_pole (\<lambda>z. inverse (f z)) z"
  2677     using assms(1) by (simp add: analytic_at_imp_isCont isContD)
  2591 proof -
  2678   with assms show ?thesis
  2592   from assms have ev: "eventually (\<lambda>z. f z \<noteq> 0) (at z)"
  2679     unfolding is_pole_def
       
  2680     by (intro filterlim_power_int_neg_at_infinity) (auto simp: isolated_zero_def)
       
  2681 qed
       
  2682 
       
  2683 lemma isolated_zero_imp_not_constant_on:
       
  2684   assumes "isolated_zero f x" "x \<in> A" "open A"
       
  2685   shows   "\<not>f constant_on A"
       
  2686 proof
       
  2687   assume "f constant_on A"
       
  2688   then obtain c where c: "\<And>x. x \<in> A \<Longrightarrow> f x = c"
       
  2689     by (auto simp: constant_on_def)
       
  2690   from assms and c[of x] have [simp]: "c = 0"
       
  2691     by (auto simp: isolated_zero_def)
  2593     by (auto simp: isolated_zero_def)
  2692   have "eventually (\<lambda>x. f x \<noteq> 0) (at x)"
  2594   have "filterlim f (nhds 0) (at z)"
  2693     using assms by (auto simp: isolated_zero_def)
  2595     using assms by (simp add: isolated_zero_def)
  2694   moreover have "eventually (\<lambda>x. x \<in> A) (at x)"
  2596   with ev have "filterlim f (at 0) (at z)"
  2695     using assms by (intro eventually_at_in_open') auto
  2597     using filterlim_atI by blast
  2696   ultimately have "eventually (\<lambda>x. False) (at x)"
  2598   also have "?this \<longleftrightarrow> filterlim (\<lambda>z. inverse (inverse (f z))) (at 0) (at z)"
  2697     by eventually_elim (use c in auto)
  2599     by (rule filterlim_cong) (use ev in \<open>auto elim!: eventually_mono\<close>)
  2698   thus False
  2600   finally have "filterlim (\<lambda>z. inverse (f z)) at_infinity (at z)"
  2699     by simp
  2601     by (subst filterlim_inverse_at_iff [symmetric])
  2700 qed
  2602   thus ?thesis
       
  2603     by (simp add: is_pole_def)
       
  2604 qed
       
  2605 
       
  2606 lemma is_pole_imp_isolated_zero_inverse:
       
  2607   fixes f :: "_ \<Rightarrow> 'b::{real_normed_div_algebra, division_ring}"
       
  2608   assumes "is_pole f z"
       
  2609   shows   "isolated_zero (\<lambda>z. inverse (f z)) z"
       
  2610 proof -
       
  2611   from assms have ev: "eventually (\<lambda>z. f z \<noteq> 0) (at z)"
       
  2612     by (simp add: non_zero_neighbour_pole)
       
  2613   have "filterlim f at_infinity (at z)"
       
  2614     using assms by (simp add: is_pole_def)
       
  2615   also have "?this \<longleftrightarrow> filterlim (\<lambda>z. inverse (inverse (f z))) at_infinity (at z)"
       
  2616     by (rule filterlim_cong) (use ev in \<open>auto elim!: eventually_mono\<close>)
       
  2617   finally have "filterlim (\<lambda>z. inverse (f z)) (at 0) (at z)"
       
  2618     by (subst (asm) filterlim_inverse_at_iff [symmetric]) auto
       
  2619   hence "filterlim (\<lambda>z. inverse (f z)) (nhds 0) (at z)"
       
  2620     using filterlim_at by blast
       
  2621   moreover have "eventually (\<lambda>z. inverse (f z) \<noteq> 0) (at z)"
       
  2622     using ev by eventually_elim auto
       
  2623   ultimately show ?thesis
       
  2624     by (simp add: isolated_zero_def)
       
  2625 qed
       
  2626 
       
  2627 lemma is_pole_inverse_iff: "is_pole (\<lambda>z. inverse (f z)) z \<longleftrightarrow> isolated_zero f z"
       
  2628   using is_pole_imp_isolated_zero_inverse isolated_zero_imp_pole_inverse by fastforce
       
  2629 
       
  2630 lemma isolated_zero_inverse_iff: "isolated_zero (\<lambda>z. inverse (f z)) z \<longleftrightarrow> is_pole f z"
       
  2631   using is_pole_imp_isolated_zero_inverse isolated_zero_imp_pole_inverse by fastforce
       
  2632 
       
  2633 lemma zero_isolated_zero:
       
  2634   fixes f :: "'a :: {t2_space, perfect_space} \<Rightarrow> _"
       
  2635   assumes "isolated_zero f z" "isCont f z"
       
  2636   shows "f z = 0"
       
  2637 proof (rule tendsto_unique)
       
  2638   show "f \<midarrow>z\<rightarrow> f z"
       
  2639     using assms(2) by (rule isContD)
       
  2640   show "f \<midarrow>z\<rightarrow> 0"
       
  2641     using assms(1) by (simp add: isolated_zero_def)
       
  2642 qed auto
       
  2643 
       
  2644 lemma zero_isolated_zero_analytic:
       
  2645   assumes "isolated_zero f z" "f analytic_on {z}"
       
  2646   shows   "f z = 0"
       
  2647   using assms(1) analytic_at_imp_isCont[OF assms(2)] by (rule zero_isolated_zero)
       
  2648 
       
  2649 lemma isolated_zero_analytic_iff:
       
  2650   assumes "f analytic_on {z}"
       
  2651   shows   "isolated_zero f z \<longleftrightarrow> f z = 0 \<and> eventually (\<lambda>z. f z \<noteq> 0) (at z)"
       
  2652 proof safe
       
  2653   assume "f z = 0" "eventually (\<lambda>z. f z \<noteq> 0) (at z)"
       
  2654   with assms show "isolated_zero f z"
       
  2655     unfolding isolated_zero_def by (metis analytic_at_imp_isCont isCont_def)
       
  2656 qed (use zero_isolated_zero_analytic[OF _ assms] in \<open>auto simp: isolated_zero_def\<close>)
       
  2657 
       
  2658 lemma non_isolated_zero_imp_eventually_zero:
       
  2659   assumes "f analytic_on {z}" "f z = 0" "\<not>isolated_zero f z"
       
  2660   shows   "eventually (\<lambda>z. f z = 0) (at z)"
       
  2661 proof (rule not_essential_frequently_0_imp_eventually_0)
       
  2662   from assms(1) show "isolated_singularity_at f z"  "not_essential f z"
       
  2663     by (simp_all add: isolated_singularity_at_analytic not_essential_analytic)
       
  2664   from assms(1,2) have "f \<midarrow>z\<rightarrow> 0"
       
  2665     by (metis analytic_at_imp_isCont continuous_within)
       
  2666   thus "frequently (\<lambda>z. f z = 0) (at z)"
       
  2667     using assms(2,3) by (auto simp: isolated_zero_def frequently_def)
       
  2668 qed
       
  2669 
       
  2670 lemma non_isolated_zero_imp_eventually_zero':
       
  2671   assumes "f analytic_on {z}" "f z = 0" "\<not>isolated_zero f z"
       
  2672   shows   "eventually (\<lambda>z. f z = 0) (nhds z)"
       
  2673   using non_isolated_zero_imp_eventually_zero[OF assms] assms(2)
       
  2674   using eventually_nhds_conv_at by blast
  2701 
  2675 
  2702 end
  2676 end