src/HOL/Complex/CLim.thy
author wenzelm
Fri, 02 Jun 2006 23:22:29 +0200
changeset 19765 dfe940911617
parent 19233 77ca20b0ed77
child 20217 25b068a99d2b
permissions -rw-r--r--
misc cleanup;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     1
(*  Title       : CLim.thy
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     2
    Author      : Jacques D. Fleuriot
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     3
    Copyright   : 2001 University of Edinburgh
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
     4
    Conversion to Isar and new proofs by Lawrence C Paulson, 2004
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     5
*)
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     6
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
     7
header{*Limits, Continuity and Differentiation for Complex Functions*}
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
     8
15131
c69542757a4d New theory header syntax.
nipkow
parents: 15013
diff changeset
     9
theory CLim
15140
322485b816ac import -> imports
nipkow
parents: 15131
diff changeset
    10
imports CSeries
15131
c69542757a4d New theory header syntax.
nipkow
parents: 15013
diff changeset
    11
begin
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    12
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    13
(*not in simpset?*)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    14
declare hypreal_epsilon_not_zero [simp]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    15
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    16
(*??generalize*)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    17
lemma lemma_complex_mult_inverse_squared [simp]:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    18
     "x \<noteq> (0::complex) \<Longrightarrow> (x * inverse(x) ^ 2) = inverse x"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
    19
by (simp add: numeral_2_eq_2)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    20
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    21
text{*Changing the quantified variable. Install earlier?*}
14738
83f1a514dcb4 changes made due to new Ring_and_Field theory
obua
parents: 14469
diff changeset
    22
lemma all_shift: "(\<forall>x::'a::comm_ring_1. P x) = (\<forall>x. P (x-a))";
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    23
apply auto 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    24
apply (drule_tac x="x+a" in spec) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    25
apply (simp add: diff_minus add_assoc) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    26
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    27
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    28
lemma complex_add_minus_iff [simp]: "(x + - a = (0::complex)) = (x=a)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    29
by (simp add: diff_eq_eq diff_minus [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    30
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    31
lemma complex_add_eq_0_iff [iff]: "(x+y = (0::complex)) = (y = -x)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    32
apply auto
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    33
apply (drule sym [THEN diff_eq_eq [THEN iffD2]], auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    34
done
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    35
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    36
definition
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    37
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    38
  CLIM :: "[complex=>complex,complex,complex] => bool"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    39
				("((_)/ -- (_)/ --C> (_))" [60, 0, 60] 60)
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    40
  "f -- a --C> L =
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    41
     (\<forall>r. 0 < r -->
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    42
	     (\<exists>s. 0 < s & (\<forall>x. (x \<noteq> a & (cmod(x - a) < s)
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    43
			  --> cmod(f x - L) < r))))"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    44
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    45
  NSCLIM :: "[complex=>complex,complex,complex] => bool"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    46
			      ("((_)/ -- (_)/ --NSC> (_))" [60, 0, 60] 60)
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    47
  "f -- a --NSC> L = (\<forall>x. (x \<noteq> hcomplex_of_complex a &
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    48
           		         x @c= hcomplex_of_complex a
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
    49
                                   --> ( *f* f) x @c= hcomplex_of_complex L))"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    50
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    51
  (* f: C --> R *)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    52
  CRLIM :: "[complex=>real,complex,real] => bool"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    53
				("((_)/ -- (_)/ --CR> (_))" [60, 0, 60] 60)
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    54
  "f -- a --CR> L =
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    55
     (\<forall>r. 0 < r -->
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    56
	     (\<exists>s. 0 < s & (\<forall>x. (x \<noteq> a & (cmod(x - a) < s)
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    57
			  --> abs(f x - L) < r))))"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    58
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    59
  NSCRLIM :: "[complex=>real,complex,real] => bool"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    60
			      ("((_)/ -- (_)/ --NSCR> (_))" [60, 0, 60] 60)
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    61
  "f -- a --NSCR> L = (\<forall>x. (x \<noteq> hcomplex_of_complex a &
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    62
           		         x @c= hcomplex_of_complex a
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
    63
                                   --> ( *f* f) x @= hypreal_of_real L))"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    64
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    65
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    66
  isContc :: "[complex=>complex,complex] => bool"
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    67
  "isContc f a = (f -- a --C> (f a))"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    68
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    69
  (* NS definition dispenses with limit notions *)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    70
  isNSContc :: "[complex=>complex,complex] => bool"
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    71
  "isNSContc f a = (\<forall>y. y @c= hcomplex_of_complex a -->
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
    72
			   ( *f* f) y @c= hcomplex_of_complex (f a))"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    73
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    74
  isContCR :: "[complex=>real,complex] => bool"
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    75
  "isContCR f a = (f -- a --CR> (f a))"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    76
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    77
  (* NS definition dispenses with limit notions *)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    78
  isNSContCR :: "[complex=>real,complex] => bool"
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    79
  "isNSContCR f a = (\<forall>y. y @c= hcomplex_of_complex a -->
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
    80
			   ( *f* f) y @= hypreal_of_real (f a))"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    81
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    82
  (* differentiation: D is derivative of function f at x *)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    83
  cderiv:: "[complex=>complex,complex,complex] => bool"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    84
			    ("(CDERIV (_)/ (_)/ :> (_))" [60, 0, 60] 60)
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    85
  "CDERIV f x :> D = ((%h. (f(x + h) - f(x))/h) -- 0 --C> D)"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    86
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    87
  nscderiv :: "[complex=>complex,complex,complex] => bool"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    88
			    ("(NSCDERIV (_)/ (_)/ :> (_))" [60, 0, 60] 60)
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    89
  "NSCDERIV f x :> D = (\<forall>h \<in> CInfinitesimal - {0}.
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
    90
			      (( *f* f)(hcomplex_of_complex x + h)
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    91
        			 - hcomplex_of_complex (f x))/h @c= hcomplex_of_complex D)"
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    92
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    93
  cdifferentiable :: "[complex=>complex,complex] => bool"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    94
                     (infixl "cdifferentiable" 60)
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    95
  "f cdifferentiable x = (\<exists>D. CDERIV f x :> D)"
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    96
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    97
  NSCdifferentiable :: "[complex=>complex,complex] => bool"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
    98
                        (infixl "NSCdifferentiable" 60)
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
    99
  "f NSCdifferentiable x = (\<exists>D. NSCDERIV f x :> D)"
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   100
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   101
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   102
  isUContc :: "(complex=>complex) => bool"
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
   103
  "isUContc f =  (\<forall>r. 0 < r -->
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   104
		      (\<exists>s. 0 < s & (\<forall>x y. cmod(x - y) < s
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   105
			    --> cmod(f x - f y) < r)))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   106
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   107
  isNSUContc :: "(complex=>complex) => bool"
19765
dfe940911617 misc cleanup;
wenzelm
parents: 19233
diff changeset
   108
  "isNSUContc f = (\<forall>x y. x @c= y --> ( *f* f) x @c= ( *f* f) y)"
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   109
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   110
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   111
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   112
subsection{*Limit of Complex to Complex Function*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   113
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   114
lemma NSCLIM_NSCRLIM_Re: "f -- a --NSC> L ==> (%x. Re(f x)) -- a --NSCR> Re(L)"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   115
by (simp add: NSCLIM_def NSCRLIM_def starfunC_approx_Re_Im_iff 
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   116
              hRe_hcomplex_of_complex)
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   117
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   118
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   119
lemma NSCLIM_NSCRLIM_Im: "f -- a --NSC> L ==> (%x. Im(f x)) -- a --NSCR> Im(L)"
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   120
by (simp add: NSCLIM_def NSCRLIM_def starfunC_approx_Re_Im_iff 
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   121
              hIm_hcomplex_of_complex)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   122
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   123
lemma CLIM_NSCLIM:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   124
      "f -- x --C> L ==> f -- x --NSC> L"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   125
apply (simp add: CLIM_def NSCLIM_def capprox_def, auto)
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   126
apply (rule_tac x = xa in star_cases)
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   127
apply (auto simp add: starfun star_n_diff star_of_def star_n_eq_iff
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   128
         CInfinitesimal_hcmod_iff hcmod Infinitesimal_FreeUltrafilterNat_iff)
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   129
apply (rule bexI [OF _ Rep_star_star_n], safe)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   130
apply (drule_tac x = u in spec, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   131
apply (drule_tac x = s in spec, auto, ultra)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   132
apply (drule sym, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   133
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   134
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   135
lemma eq_Abs_star_ALL: "(\<forall>t. P t) = (\<forall>X. P (star_n X))"
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   136
apply auto
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   137
apply (rule_tac x = t in star_cases, auto)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   138
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   139
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   140
lemma lemma_CLIM:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   141
     "\<forall>s. 0 < s --> (\<exists>xa.  xa \<noteq> x &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   142
         cmod (xa - x) < s  & r \<le> cmod (f xa - L))
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   143
      ==> \<forall>(n::nat). \<exists>xa.  xa \<noteq> x &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   144
              cmod(xa - x) < inverse(real(Suc n)) & r \<le> cmod(f xa - L)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   145
apply clarify
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   146
apply (cut_tac n1 = n in real_of_nat_Suc_gt_zero [THEN positive_imp_inverse_positive], auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   147
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   148
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   149
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   150
lemma lemma_skolemize_CLIM2:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   151
     "\<forall>s. 0 < s --> (\<exists>xa.  xa \<noteq> x &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   152
         cmod (xa - x) < s  & r \<le> cmod (f xa - L))
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   153
      ==> \<exists>X. \<forall>(n::nat). X n \<noteq> x &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   154
                cmod(X n - x) < inverse(real(Suc n)) & r \<le> cmod(f (X n) - L)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   155
apply (drule lemma_CLIM)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   156
apply (drule choice, blast)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   157
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   158
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   159
lemma lemma_csimp:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   160
     "\<forall>n. X n \<noteq> x &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   161
          cmod (X n - x) < inverse (real(Suc n)) &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   162
          r \<le> cmod (f (X n) - L) ==>
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   163
          \<forall>n. cmod (X n - x) < inverse (real(Suc n))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   164
by auto
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   165
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   166
lemma NSCLIM_CLIM:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   167
     "f -- x --NSC> L ==> f -- x --C> L"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   168
apply (simp add: CLIM_def NSCLIM_def)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   169
apply (rule ccontr) 
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   170
apply (auto simp add: eq_Abs_star_ALL starfun
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   171
            CInfinitesimal_capprox_minus [symmetric] star_n_diff
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   172
            CInfinitesimal_hcmod_iff star_of_def star_n_eq_iff
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   173
            Infinitesimal_FreeUltrafilterNat_iff hcmod)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   174
apply (simp add: linorder_not_less)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   175
apply (drule lemma_skolemize_CLIM2, safe)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   176
apply (drule_tac x = X in spec, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   177
apply (drule lemma_csimp [THEN complex_seq_to_hcomplex_CInfinitesimal])
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   178
apply (simp add: CInfinitesimal_hcmod_iff star_of_def
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   179
            Infinitesimal_FreeUltrafilterNat_iff star_n_diff hcmod,  blast)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   180
apply (drule_tac x = r in spec, clarify)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   181
apply (drule FreeUltrafilterNat_all, ultra, arith)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   182
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   183
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   184
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   185
text{*First key result*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   186
theorem CLIM_NSCLIM_iff: "(f -- x --C> L) = (f -- x --NSC> L)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   187
by (blast intro: CLIM_NSCLIM NSCLIM_CLIM)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   188
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   189
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   190
subsection{*Limit of Complex to Real Function*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   191
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   192
lemma CRLIM_NSCRLIM: "f -- x --CR> L ==> f -- x --NSCR> L"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   193
apply (simp add: CRLIM_def NSCRLIM_def capprox_def, auto)
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   194
apply (rule_tac x = xa in star_cases)
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   195
apply (auto simp add: starfun star_n_diff
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   196
              CInfinitesimal_hcmod_iff hcmod
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   197
              Infinitesimal_FreeUltrafilterNat_iff
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   198
              star_of_def star_n_eq_iff
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   199
              Infinitesimal_approx_minus [symmetric])
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   200
apply (rule bexI [OF _ Rep_star_star_n], safe)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   201
apply (drule_tac x = u in spec, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   202
apply (drule_tac x = s in spec, auto, ultra)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   203
apply (drule sym, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   204
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   205
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   206
lemma lemma_CRLIM:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   207
     "\<forall>s. 0 < s --> (\<exists>xa.  xa \<noteq> x &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   208
         cmod (xa - x) < s  & r \<le> abs (f xa - L))
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   209
      ==> \<forall>(n::nat). \<exists>xa.  xa \<noteq> x &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   210
              cmod(xa - x) < inverse(real(Suc n)) & r \<le> abs (f xa - L)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   211
apply clarify
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   212
apply (cut_tac n1 = n in real_of_nat_Suc_gt_zero [THEN positive_imp_inverse_positive], auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   213
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   214
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   215
lemma lemma_skolemize_CRLIM2:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   216
     "\<forall>s. 0 < s --> (\<exists>xa.  xa \<noteq> x &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   217
         cmod (xa - x) < s  & r \<le> abs (f xa - L))
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   218
      ==> \<exists>X. \<forall>(n::nat). X n \<noteq> x &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   219
                cmod(X n - x) < inverse(real(Suc n)) & r \<le> abs (f (X n) - L)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   220
apply (drule lemma_CRLIM)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   221
apply (drule choice, blast)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   222
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   223
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   224
lemma lemma_crsimp:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   225
     "\<forall>n. X n \<noteq> x &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   226
          cmod (X n - x) < inverse (real(Suc n)) &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   227
          r \<le> abs (f (X n) - L) ==>
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   228
      \<forall>n. cmod (X n - x) < inverse (real(Suc n))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   229
by auto
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   230
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   231
lemma NSCRLIM_CRLIM: "f -- x --NSCR> L ==> f -- x --CR> L"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   232
apply (simp add: CRLIM_def NSCRLIM_def capprox_def)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   233
apply (rule ccontr) 
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   234
apply (auto simp add: eq_Abs_star_ALL starfun star_n_diff 
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   235
             CInfinitesimal_hcmod_iff 
17300
5798fbf42a6a replace type hcomplex with complex star
huffman
parents: 17298
diff changeset
   236
             hcmod Infinitesimal_approx_minus [symmetric]
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   237
             star_of_def star_n_eq_iff
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   238
             Infinitesimal_FreeUltrafilterNat_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   239
apply (simp add: linorder_not_less)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   240
apply (drule lemma_skolemize_CRLIM2, safe)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   241
apply (drule_tac x = X in spec, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   242
apply (drule lemma_crsimp [THEN complex_seq_to_hcomplex_CInfinitesimal])
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   243
apply (simp add: CInfinitesimal_hcmod_iff star_of_def
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   244
             Infinitesimal_FreeUltrafilterNat_iff star_n_diff hcmod)
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   245
apply (auto simp add: star_of_def star_n_diff)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   246
apply (drule_tac x = r in spec, clarify)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   247
apply (drule FreeUltrafilterNat_all, ultra)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   248
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   249
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   250
text{*Second key result*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   251
theorem CRLIM_NSCRLIM_iff: "(f -- x --CR> L) = (f -- x --NSCR> L)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   252
by (blast intro: CRLIM_NSCRLIM NSCRLIM_CRLIM)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   253
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   254
(** get this result easily now **)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   255
lemma CLIM_CRLIM_Re: "f -- a --C> L ==> (%x. Re(f x)) -- a --CR> Re(L)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   256
by (auto dest: NSCLIM_NSCRLIM_Re simp add: CLIM_NSCLIM_iff CRLIM_NSCRLIM_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   257
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   258
lemma CLIM_CRLIM_Im: "f -- a --C> L ==> (%x. Im(f x)) -- a --CR> Im(L)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   259
by (auto dest: NSCLIM_NSCRLIM_Im simp add: CLIM_NSCLIM_iff CRLIM_NSCRLIM_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   260
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   261
lemma CLIM_cnj: "f -- a --C> L ==> (%x. cnj (f x)) -- a --C> cnj L"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   262
by (simp add: CLIM_def complex_cnj_diff [symmetric])
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   263
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   264
lemma CLIM_cnj_iff: "((%x. cnj (f x)) -- a --C> cnj L) = (f -- a --C> L)"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   265
by (simp add: CLIM_def complex_cnj_diff [symmetric])
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   266
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   267
(*** NSLIM_add hence CLIM_add *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   268
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   269
lemma NSCLIM_add:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   270
     "[| f -- x --NSC> l; g -- x --NSC> m |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   271
      ==> (%x. f(x) + g(x)) -- x --NSC> (l + m)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   272
by (auto simp: NSCLIM_def intro!: capprox_add)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   273
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   274
lemma CLIM_add:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   275
     "[| f -- x --C> l; g -- x --C> m |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   276
      ==> (%x. f(x) + g(x)) -- x --C> (l + m)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   277
by (simp add: CLIM_NSCLIM_iff NSCLIM_add)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   278
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   279
(*** NSLIM_mult hence CLIM_mult *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   280
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   281
lemma NSCLIM_mult:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   282
     "[| f -- x --NSC> l; g -- x --NSC> m |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   283
      ==> (%x. f(x) * g(x)) -- x --NSC> (l * m)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   284
by (auto simp add: NSCLIM_def intro!: capprox_mult_CFinite)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   285
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   286
lemma CLIM_mult:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   287
     "[| f -- x --C> l; g -- x --C> m |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   288
      ==> (%x. f(x) * g(x)) -- x --C> (l * m)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   289
by (simp add: CLIM_NSCLIM_iff NSCLIM_mult)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   290
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   291
(*** NSCLIM_const and CLIM_const ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   292
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   293
lemma NSCLIM_const [simp]: "(%x. k) -- x --NSC> k"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   294
by (simp add: NSCLIM_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   295
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   296
lemma CLIM_const [simp]: "(%x. k) -- x --C> k"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   297
by (simp add: CLIM_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   298
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   299
(*** NSCLIM_minus and CLIM_minus ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   300
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   301
lemma NSCLIM_minus: "f -- a --NSC> L ==> (%x. -f(x)) -- a --NSC> -L"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   302
by (simp add: NSCLIM_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   303
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   304
lemma CLIM_minus: "f -- a --C> L ==> (%x. -f(x)) -- a --C> -L"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   305
by (simp add: CLIM_NSCLIM_iff NSCLIM_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   306
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   307
(*** NSCLIM_diff hence CLIM_diff ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   308
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   309
lemma NSCLIM_diff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   310
     "[| f -- x --NSC> l; g -- x --NSC> m |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   311
      ==> (%x. f(x) - g(x)) -- x --NSC> (l - m)"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   312
by (simp add: diff_minus NSCLIM_add NSCLIM_minus)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   313
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   314
lemma CLIM_diff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   315
     "[| f -- x --C> l; g -- x --C> m |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   316
      ==> (%x. f(x) - g(x)) -- x --C> (l - m)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   317
by (simp add: CLIM_NSCLIM_iff NSCLIM_diff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   318
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   319
(*** NSCLIM_inverse and hence CLIM_inverse *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   320
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   321
lemma NSCLIM_inverse:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   322
     "[| f -- a --NSC> L;  L \<noteq> 0 |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   323
      ==> (%x. inverse(f(x))) -- a --NSC> (inverse L)"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   324
apply (simp add: NSCLIM_def, clarify)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   325
apply (drule spec)
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   326
apply (force simp add: hcomplex_of_complex_capprox_inverse)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   327
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   328
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   329
lemma CLIM_inverse:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   330
     "[| f -- a --C> L;  L \<noteq> 0 |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   331
      ==> (%x. inverse(f(x))) -- a --C> (inverse L)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   332
by (simp add: CLIM_NSCLIM_iff NSCLIM_inverse)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   333
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   334
(*** NSCLIM_zero, CLIM_zero, etc. ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   335
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   336
lemma NSCLIM_zero: "f -- a --NSC> l ==> (%x. f(x) - l) -- a --NSC> 0"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   337
apply (simp add: diff_minus)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   338
apply (rule_tac a1 = l in right_minus [THEN subst])
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   339
apply (rule NSCLIM_add, auto) 
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   340
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   341
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   342
lemma CLIM_zero: "f -- a --C> l ==> (%x. f(x) - l) -- a --C> 0"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   343
by (simp add: CLIM_NSCLIM_iff NSCLIM_zero)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   344
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   345
lemma NSCLIM_zero_cancel: "(%x. f(x) - l) -- x --NSC> 0 ==> f -- x --NSC> l"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   346
by (drule_tac g = "%x. l" and m = l in NSCLIM_add, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   347
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   348
lemma CLIM_zero_cancel: "(%x. f(x) - l) -- x --C> 0 ==> f -- x --C> l"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   349
by (drule_tac g = "%x. l" and m = l in CLIM_add, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   350
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   351
(*** NSCLIM_not zero and hence CLIM_not_zero ***)
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
   352
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   353
lemma NSCLIM_not_zero: "k \<noteq> 0 ==> ~ ((%x. k) -- x --NSC> 0)"
17373
27509e72f29e removed duplicated lemmas; convert more proofs to transfer principle
huffman
parents: 17318
diff changeset
   354
apply (auto simp del: star_of_zero simp add: NSCLIM_def)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   355
apply (rule_tac x = "hcomplex_of_complex x + hcomplex_of_hypreal epsilon" in exI)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   356
apply (auto intro: CInfinitesimal_add_capprox_self [THEN capprox_sym]
17373
27509e72f29e removed duplicated lemmas; convert more proofs to transfer principle
huffman
parents: 17318
diff changeset
   357
            simp del: star_of_zero)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   358
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   359
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   360
(* [| k \<noteq> 0; (%x. k) -- x --NSC> 0 |] ==> R *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   361
lemmas NSCLIM_not_zeroE = NSCLIM_not_zero [THEN notE, standard]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   362
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   363
lemma CLIM_not_zero: "k \<noteq> 0 ==> ~ ((%x. k) -- x --C> 0)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   364
by (simp add: CLIM_NSCLIM_iff NSCLIM_not_zero)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   365
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   366
(*** NSCLIM_const hence CLIM_const ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   367
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   368
lemma NSCLIM_const_eq: "(%x. k) -- x --NSC> L ==> k = L"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   369
apply (rule ccontr)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   370
apply (drule NSCLIM_zero)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   371
apply (rule NSCLIM_not_zeroE [of "k-L"], auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   372
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   373
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   374
lemma CLIM_const_eq: "(%x. k) -- x --C> L ==> k = L"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   375
by (simp add: CLIM_NSCLIM_iff NSCLIM_const_eq)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   376
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   377
(*** NSCLIM and hence CLIM are unique ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   378
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   379
lemma NSCLIM_unique: "[| f -- x --NSC> L; f -- x --NSC> M |] ==> L = M"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   380
apply (drule NSCLIM_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   381
apply (drule NSCLIM_add, assumption)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   382
apply (auto dest!: NSCLIM_const_eq [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   383
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   384
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   385
lemma CLIM_unique: "[| f -- x --C> L; f -- x --C> M |] ==> L = M"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   386
by (simp add: CLIM_NSCLIM_iff NSCLIM_unique)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   387
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   388
(***  NSCLIM_mult_zero and CLIM_mult_zero ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   389
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   390
lemma NSCLIM_mult_zero:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   391
     "[| f -- x --NSC> 0; g -- x --NSC> 0 |] ==> (%x. f(x)*g(x)) -- x --NSC> 0"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   392
by (drule NSCLIM_mult, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   393
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   394
lemma CLIM_mult_zero:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   395
     "[| f -- x --C> 0; g -- x --C> 0 |] ==> (%x. f(x)*g(x)) -- x --C> 0"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   396
by (drule CLIM_mult, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   397
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   398
(*** NSCLIM_self hence CLIM_self ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   399
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   400
lemma NSCLIM_self: "(%x. x) -- a --NSC> a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   401
by (auto simp add: NSCLIM_def intro: starfunC_Idfun_capprox)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   402
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   403
lemma CLIM_self: "(%x. x) -- a --C> a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   404
by (simp add: CLIM_NSCLIM_iff NSCLIM_self)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   406
(** another equivalence result **)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   407
lemma NSCLIM_NSCRLIM_iff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   408
   "(f -- x --NSC> L) = ((%y. cmod(f y - L)) -- x --NSCR> 0)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   409
apply (auto simp add: NSCLIM_def NSCRLIM_def CInfinitesimal_capprox_minus [symmetric] CInfinitesimal_hcmod_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   410
apply (auto dest!: spec) 
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   411
apply (rule_tac [!] x = xa in star_cases)
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   412
apply (auto simp add: star_n_diff starfun hcmod mem_infmal_iff star_of_def)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   413
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   414
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   415
(** much, much easier standard proof **)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   416
lemma CLIM_CRLIM_iff: "(f -- x --C> L) = ((%y. cmod(f y - L)) -- x --CR> 0)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   417
by (simp add: CLIM_def CRLIM_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   418
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   419
(* so this is nicer nonstandard proof *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   420
lemma NSCLIM_NSCRLIM_iff2:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   421
     "(f -- x --NSC> L) = ((%y. cmod(f y - L)) -- x --NSCR> 0)"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   422
by (simp add: CRLIM_NSCRLIM_iff [symmetric] CLIM_CRLIM_iff CLIM_NSCLIM_iff [symmetric])
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   423
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   424
lemma NSCLIM_NSCRLIM_Re_Im_iff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   425
     "(f -- a --NSC> L) = ((%x. Re(f x)) -- a --NSCR> Re(L) &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   426
                            (%x. Im(f x)) -- a --NSCR> Im(L))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   427
apply (auto intro: NSCLIM_NSCRLIM_Re NSCLIM_NSCRLIM_Im)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   428
apply (auto simp add: NSCLIM_def NSCRLIM_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   429
apply (auto dest!: spec) 
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   430
apply (rule_tac x = x in star_cases)
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   431
apply (simp add: capprox_approx_iff starfun star_of_def)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   432
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   433
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   434
lemma CLIM_CRLIM_Re_Im_iff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   435
     "(f -- a --C> L) = ((%x. Re(f x)) -- a --CR> Re(L) &
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   436
                         (%x. Im(f x)) -- a --CR> Im(L))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   437
by (simp add: CLIM_NSCLIM_iff CRLIM_NSCRLIM_iff NSCLIM_NSCRLIM_Re_Im_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   438
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   439
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   440
subsection{*Continuity*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   441
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   442
lemma isNSContcD:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   443
      "[| isNSContc f a; y @c= hcomplex_of_complex a |]
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   444
       ==> ( *f* f) y @c= hcomplex_of_complex (f a)"
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   445
by (simp add: isNSContc_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   446
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   447
lemma isNSContc_NSCLIM: "isNSContc f a ==> f -- a --NSC> (f a) "
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   448
by (simp add: isNSContc_def NSCLIM_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   449
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   450
lemma NSCLIM_isNSContc:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   451
      "f -- a --NSC> (f a) ==> isNSContc f a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   452
apply (simp add: isNSContc_def NSCLIM_def, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   453
apply (case_tac "y = hcomplex_of_complex a", auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   454
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   455
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   456
text{*Nonstandard continuity can be defined using NS Limit in 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   457
similar fashion to standard definition of continuity*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   458
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   459
lemma isNSContc_NSCLIM_iff: "(isNSContc f a) = (f -- a --NSC> (f a))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   460
by (blast intro: isNSContc_NSCLIM NSCLIM_isNSContc)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   461
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   462
lemma isNSContc_CLIM_iff: "(isNSContc f a) = (f -- a --C> (f a))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   463
by (simp add: CLIM_NSCLIM_iff isNSContc_NSCLIM_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   464
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   465
(*** key result for continuity ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   466
lemma isNSContc_isContc_iff: "(isNSContc f a) = (isContc f a)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   467
by (simp add: isContc_def isNSContc_CLIM_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   468
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   469
lemma isContc_isNSContc: "isContc f a ==> isNSContc f a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   470
by (erule isNSContc_isContc_iff [THEN iffD2])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   471
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   472
lemma isNSContc_isContc: "isNSContc f a ==> isContc f a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   473
by (erule isNSContc_isContc_iff [THEN iffD1])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   474
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   475
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   476
text{*Alternative definition of continuity*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   477
lemma NSCLIM_h_iff: "(f -- a --NSC> L) = ((%h. f(a + h)) -- 0 --NSC> L)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   478
apply (simp add: NSCLIM_def, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   479
apply (drule_tac x = "hcomplex_of_complex a + x" in spec)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   480
apply (drule_tac [2] x = "- hcomplex_of_complex a + x" in spec, safe, simp)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   481
apply (rule mem_cinfmal_iff [THEN iffD2, THEN CInfinitesimal_add_capprox_self [THEN capprox_sym]])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   482
apply (rule_tac [4] capprox_minus_iff2 [THEN iffD1])
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   483
 prefer 3 apply (simp add: compare_rls add_commute)
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   484
apply (rule_tac [2] x = x in star_cases)
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   485
apply (rule_tac [4] x = x in star_cases)
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   486
apply (auto simp add: starfun star_n_minus star_n_add star_of_def)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   487
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   488
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   489
lemma NSCLIM_isContc_iff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   490
     "(f -- a --NSC> f a) = ((%h. f(a + h)) -- 0 --NSC> f a)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   491
by (rule NSCLIM_h_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   492
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   493
lemma CLIM_isContc_iff: "(f -- a --C> f a) = ((%h. f(a + h)) -- 0 --C> f(a))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   494
by (simp add: CLIM_NSCLIM_iff NSCLIM_isContc_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   495
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   496
lemma isContc_iff: "(isContc f x) = ((%h. f(x + h)) -- 0 --C> f(x))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   497
by (simp add: isContc_def CLIM_isContc_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   498
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   499
lemma isContc_add:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   500
     "[| isContc f a; isContc g a |] ==> isContc (%x. f(x) + g(x)) a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   501
by (auto intro: capprox_add simp add: isNSContc_isContc_iff [symmetric] isNSContc_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   502
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   503
lemma isContc_mult:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   504
     "[| isContc f a; isContc g a |] ==> isContc (%x. f(x) * g(x)) a"
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   505
by (auto intro!: starfun_mult_CFinite_capprox
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   506
            [simplified starfun_mult [symmetric]]
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   507
            simp add: isNSContc_isContc_iff [symmetric] isNSContc_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   508
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   509
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   510
lemma isContc_o: "[| isContc f a; isContc g (f a) |] ==> isContc (g o f) a"
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   511
by (simp add: isNSContc_isContc_iff [symmetric] isNSContc_def starfun_o [symmetric])
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   512
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   513
lemma isContc_o2:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   514
     "[| isContc f a; isContc g (f a) |] ==> isContc (%x. g (f x)) a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   515
by (auto dest: isContc_o simp add: o_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   516
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   517
lemma isNSContc_minus: "isNSContc f a ==> isNSContc (%x. - f x) a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   518
by (simp add: isNSContc_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   519
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   520
lemma isContc_minus: "isContc f a ==> isContc (%x. - f x) a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   521
by (simp add: isNSContc_isContc_iff [symmetric] isNSContc_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   522
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   523
lemma isContc_inverse:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   524
      "[| isContc f x; f x \<noteq> 0 |] ==> isContc (%x. inverse (f x)) x"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   525
by (simp add: isContc_def CLIM_inverse)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   526
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   527
lemma isNSContc_inverse:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   528
     "[| isNSContc f x; f x \<noteq> 0 |] ==> isNSContc (%x. inverse (f x)) x"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   529
by (auto intro: isContc_inverse simp add: isNSContc_isContc_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   530
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   531
lemma isContc_diff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   532
      "[| isContc f a; isContc g a |] ==> isContc (%x. f(x) - g(x)) a"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   533
apply (simp add: diff_minus)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   534
apply (auto intro: isContc_add isContc_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   535
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   536
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   537
lemma isContc_const [simp]: "isContc (%x. k) a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   538
by (simp add: isContc_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   539
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   540
lemma isNSContc_const [simp]: "isNSContc (%x. k) a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   541
by (simp add: isNSContc_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   542
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   543
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   544
subsection{*Functions from Complex to Reals*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   545
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   546
lemma isNSContCRD:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   547
      "[| isNSContCR f a; y @c= hcomplex_of_complex a |]
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   548
       ==> ( *f* f) y @= hypreal_of_real (f a)"
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   549
by (simp add: isNSContCR_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   550
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   551
lemma isNSContCR_NSCRLIM: "isNSContCR f a ==> f -- a --NSCR> (f a) "
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   552
by (simp add: isNSContCR_def NSCRLIM_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   553
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   554
lemma NSCRLIM_isNSContCR: "f -- a --NSCR> (f a) ==> isNSContCR f a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   555
apply (auto simp add: isNSContCR_def NSCRLIM_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   556
apply (case_tac "y = hcomplex_of_complex a", auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   557
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   558
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   559
lemma isNSContCR_NSCRLIM_iff: "(isNSContCR f a) = (f -- a --NSCR> (f a))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   560
by (blast intro: isNSContCR_NSCRLIM NSCRLIM_isNSContCR)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   561
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   562
lemma isNSContCR_CRLIM_iff: "(isNSContCR f a) = (f -- a --CR> (f a))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   563
by (simp add: CRLIM_NSCRLIM_iff isNSContCR_NSCRLIM_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   564
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   565
(*** another key result for continuity ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   566
lemma isNSContCR_isContCR_iff: "(isNSContCR f a) = (isContCR f a)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   567
by (simp add: isContCR_def isNSContCR_CRLIM_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   568
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   569
lemma isContCR_isNSContCR: "isContCR f a ==> isNSContCR f a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   570
by (erule isNSContCR_isContCR_iff [THEN iffD2])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   571
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   572
lemma isNSContCR_isContCR: "isNSContCR f a ==> isContCR f a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   573
by (erule isNSContCR_isContCR_iff [THEN iffD1])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   574
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   575
lemma isNSContCR_cmod [simp]: "isNSContCR cmod (a)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   576
by (auto intro: capprox_hcmod_approx 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   577
         simp add: starfunCR_cmod hcmod_hcomplex_of_complex [symmetric] 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   578
                    isNSContCR_def) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   579
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   580
lemma isContCR_cmod [simp]: "isContCR cmod (a)"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   581
by (simp add: isNSContCR_isContCR_iff [symmetric])
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   582
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   583
lemma isContc_isContCR_Re: "isContc f a ==> isContCR (%x. Re (f x)) a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   584
by (simp add: isContc_def isContCR_def CLIM_CRLIM_Re)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   585
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   586
lemma isContc_isContCR_Im: "isContc f a ==> isContCR (%x. Im (f x)) a"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   587
by (simp add: isContc_def isContCR_def CLIM_CRLIM_Im)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   588
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   589
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   590
subsection{*Derivatives*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   591
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   592
lemma CDERIV_iff: "(CDERIV f x :> D) = ((%h. (f(x + h) - f(x))/h) -- 0 --C> D)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   593
by (simp add: cderiv_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   594
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   595
lemma CDERIV_NSC_iff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   596
      "(CDERIV f x :> D) = ((%h. (f(x + h) - f(x))/h) -- 0 --NSC> D)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   597
by (simp add: cderiv_def CLIM_NSCLIM_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   598
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   599
lemma CDERIVD: "CDERIV f x :> D ==> (%h. (f(x + h) - f(x))/h) -- 0 --C> D"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   600
by (simp add: cderiv_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   601
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   602
lemma NSC_DERIVD: "CDERIV f x :> D ==> (%h. (f(x + h) - f(x))/h) -- 0 --NSC> D"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   603
by (simp add: cderiv_def CLIM_NSCLIM_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   604
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   605
text{*Uniqueness*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   606
lemma CDERIV_unique: "[| CDERIV f x :> D; CDERIV f x :> E |] ==> D = E"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   607
by (simp add: cderiv_def CLIM_unique)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   608
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   609
(*** uniqueness: a nonstandard proof ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   610
lemma NSCDeriv_unique: "[| NSCDERIV f x :> D; NSCDERIV f x :> E |] ==> D = E"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   611
apply (simp add: nscderiv_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   612
apply (auto dest!: bspec [where x = "hcomplex_of_hypreal epsilon"]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   613
            intro!: inj_hcomplex_of_complex [THEN injD] dest: capprox_trans3)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   614
done
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
   615
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
   616
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   617
subsection{* Differentiability*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   618
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   619
lemma CDERIV_CLIM_iff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   620
     "((%h. (f(a + h) - f(a))/h) -- 0 --C> D) =
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   621
      ((%x. (f(x) - f(a)) / (x - a)) -- a --C> D)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   622
apply (simp add: CLIM_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   623
apply (rule_tac f=All in arg_cong) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   624
apply (rule ext) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   625
apply (rule imp_cong) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   626
apply (rule refl) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   627
apply (rule_tac f=Ex in arg_cong) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   628
apply (rule ext) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   629
apply (rule conj_cong) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   630
apply (rule refl) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   631
apply (rule trans) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   632
apply (rule all_shift [where a=a], simp) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   633
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   634
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   635
lemma CDERIV_iff2:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   636
     "(CDERIV f x :> D) = ((%z. (f(z) - f(x)) / (z - x)) -- x --C> D)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   637
by (simp add: cderiv_def CDERIV_CLIM_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   638
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   639
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   640
subsection{* Equivalence of NS and Standard Differentiation*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   641
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   642
(*** first equivalence ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   643
lemma NSCDERIV_NSCLIM_iff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   644
      "(NSCDERIV f x :> D) = ((%h. (f(x + h) - f(x))/h) -- 0 --NSC> D)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   645
apply (simp add: nscderiv_def NSCLIM_def, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   646
apply (drule_tac x = xa in bspec)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   647
apply (rule_tac [3] ccontr)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   648
apply (drule_tac [3] x = h in spec)
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   649
apply (auto simp add: mem_cinfmal_iff starfun_lambda_cancel)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   650
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   651
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   652
(*** 2nd equivalence ***)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   653
lemma NSCDERIV_NSCLIM_iff2:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   654
     "(NSCDERIV f x :> D) = ((%z. (f(z) - f(x)) / (z - x)) -- x --NSC> D)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   655
by (simp add: NSCDERIV_NSCLIM_iff CDERIV_CLIM_iff CLIM_NSCLIM_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   656
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   657
lemma NSCDERIV_iff2:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   658
     "(NSCDERIV f x :> D) =
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   659
      (\<forall>xa. xa \<noteq> hcomplex_of_complex x & xa @c= hcomplex_of_complex x -->
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   660
        ( *f* (%z. (f z - f x) / (z - x))) xa @c= hcomplex_of_complex D)"
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   661
by (simp add: NSCDERIV_NSCLIM_iff2 NSCLIM_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   662
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   663
lemma NSCDERIV_CDERIV_iff: "(NSCDERIV f x :> D) = (CDERIV f x :> D)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   664
by (simp add: cderiv_def NSCDERIV_NSCLIM_iff CLIM_NSCLIM_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   665
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   666
lemma NSCDERIV_isNSContc: "NSCDERIV f x :> D ==> isNSContc f x"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   667
apply (auto simp add: nscderiv_def isNSContc_NSCLIM_iff NSCLIM_def diff_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   668
apply (drule capprox_minus_iff [THEN iffD1])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   669
apply (subgoal_tac "xa + - (hcomplex_of_complex x) \<noteq> 0")
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   670
 prefer 2 apply (simp add: compare_rls) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   671
apply (drule_tac x = "- hcomplex_of_complex x + xa" in bspec)
15013
34264f5e4691 new treatment of binary numerals
paulson
parents: 14738
diff changeset
   672
 prefer 2 apply (simp add: add_assoc [symmetric]) 
34264f5e4691 new treatment of binary numerals
paulson
parents: 14738
diff changeset
   673
apply (auto simp add: mem_cinfmal_iff [symmetric] add_commute)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   674
apply (drule_tac c = "xa + - hcomplex_of_complex x" in capprox_mult1)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   675
apply (auto intro: CInfinitesimal_subset_CFinite [THEN subsetD]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   676
            simp add: mult_assoc)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   677
apply (drule_tac x3 = D in 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   678
       CFinite_hcomplex_of_complex [THEN [2] CInfinitesimal_CFinite_mult,
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   679
                                    THEN mem_cinfmal_iff [THEN iffD1]])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   680
apply (blast intro: capprox_trans mult_commute [THEN subst] capprox_minus_iff [THEN iffD2])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   681
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   682
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   683
lemma CDERIV_isContc: "CDERIV f x :> D ==> isContc f x"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   684
by (simp add: NSCDERIV_CDERIV_iff [symmetric] isNSContc_isContc_iff [symmetric] NSCDERIV_isNSContc)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   685
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   686
text{* Differentiation rules for combinations of functions follow by clear, 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   687
straightforard algebraic manipulations*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   688
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   689
(* use simple constant nslimit theorem *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   690
lemma NSCDERIV_const [simp]: "(NSCDERIV (%x. k) x :> 0)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   691
by (simp add: NSCDERIV_NSCLIM_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   692
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   693
lemma CDERIV_const [simp]: "(CDERIV (%x. k) x :> 0)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   694
by (simp add: NSCDERIV_CDERIV_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   695
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   696
lemma NSCDERIV_add:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   697
     "[| NSCDERIV f x :> Da;  NSCDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   698
      ==> NSCDERIV (%x. f x + g x) x :> Da + Db"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   699
apply (simp add: NSCDERIV_NSCLIM_iff NSCLIM_def, clarify)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   700
apply (auto dest!: spec simp add: add_divide_distrib diff_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   701
apply (drule_tac b = "hcomplex_of_complex Da" and d = "hcomplex_of_complex Db" in capprox_add)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   702
apply (auto simp add: add_ac)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   703
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   704
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   705
lemma CDERIV_add:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   706
     "[| CDERIV f x :> Da; CDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   707
      ==> CDERIV (%x. f x + g x) x :> Da + Db"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   708
by (simp add: NSCDERIV_add NSCDERIV_CDERIV_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   709
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   710
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   711
subsection{*Lemmas for Multiplication*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   712
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   713
lemma lemma_nscderiv1: "((a::hcomplex)*b) - (c*d) = (b*(a - c)) + (c*(b - d))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   714
by (simp add: right_diff_distrib)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   715
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   716
lemma lemma_nscderiv2:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   717
     "[| (x + y) / z = hcomplex_of_complex D + yb; z \<noteq> 0;
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   718
         z : CInfinitesimal; yb : CInfinitesimal |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   719
      ==> x + y @c= 0"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   720
apply (frule_tac c1 = z in hcomplex_mult_right_cancel [THEN iffD2], assumption)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   721
apply (erule_tac V = " (x + y) / z = hcomplex_of_complex D + yb" in thin_rl)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   722
apply (auto intro!: CInfinitesimal_CFinite_mult2 CFinite_add 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   723
            simp add: mem_cinfmal_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   724
apply (erule CInfinitesimal_subset_CFinite [THEN subsetD])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   725
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   726
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   727
lemma NSCDERIV_mult:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   728
     "[| NSCDERIV f x :> Da; NSCDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   729
      ==> NSCDERIV (%x. f x * g x) x :> (Da * g(x)) + (Db * f(x))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   730
apply (simp add: NSCDERIV_NSCLIM_iff NSCLIM_def, clarify) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   731
apply (auto dest!: spec
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   732
            simp add: starfun_lambda_cancel lemma_nscderiv1)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   733
apply (simp (no_asm) add: add_divide_distrib)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   734
apply (drule bex_CInfinitesimal_iff2 [THEN iffD2])+
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   735
apply (auto simp del: times_divide_eq_right simp add: times_divide_eq_right [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   736
apply (simp add: diff_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   737
apply (drule_tac D = Db in lemma_nscderiv2)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   738
apply (drule_tac [4]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   739
        capprox_minus_iff [THEN iffD2, THEN bex_CInfinitesimal_iff2 [THEN iffD2]])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   740
apply (auto intro!: capprox_add_mono1 simp add: left_distrib right_distrib mult_commute add_assoc)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   741
apply (rule_tac b1 = "hcomplex_of_complex Db * hcomplex_of_complex (f x) " in add_commute [THEN subst])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   742
apply (auto intro!: CInfinitesimal_add_capprox_self2 [THEN capprox_sym] 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   743
		    CInfinitesimal_add CInfinitesimal_mult
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   744
		    CInfinitesimal_hcomplex_of_complex_mult
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   745
		    CInfinitesimal_hcomplex_of_complex_mult2
15013
34264f5e4691 new treatment of binary numerals
paulson
parents: 14738
diff changeset
   746
            simp add: add_assoc [symmetric])
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   747
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   748
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   749
lemma CDERIV_mult:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   750
     "[| CDERIV f x :> Da; CDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   751
      ==> CDERIV (%x. f x * g x) x :> (Da * g(x)) + (Db * f(x))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   752
by (simp add: NSCDERIV_mult NSCDERIV_CDERIV_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   753
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   754
lemma NSCDERIV_cmult: "NSCDERIV f x :> D ==> NSCDERIV (%x. c * f x) x :> c*D"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   755
apply (simp add: times_divide_eq_right [symmetric] NSCDERIV_NSCLIM_iff 
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   756
                 minus_mult_right right_distrib [symmetric] diff_minus
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   757
            del: times_divide_eq_right minus_mult_right [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   758
apply (erule NSCLIM_const [THEN NSCLIM_mult])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   759
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   760
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   761
lemma CDERIV_cmult: "CDERIV f x :> D ==> CDERIV (%x. c * f x) x :> c*D"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   762
by (simp add: NSCDERIV_cmult NSCDERIV_CDERIV_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   763
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   764
lemma NSCDERIV_minus: "NSCDERIV f x :> D ==> NSCDERIV (%x. -(f x)) x :> -D"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   765
apply (simp add: NSCDERIV_NSCLIM_iff diff_minus)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   766
apply (rule_tac t = "f x" in minus_minus [THEN subst])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   767
apply (simp (no_asm_simp) add: minus_add_distrib [symmetric]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   768
            del: minus_add_distrib minus_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   769
apply (erule NSCLIM_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   770
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   771
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   772
lemma CDERIV_minus: "CDERIV f x :> D ==> CDERIV (%x. -(f x)) x :> -D"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   773
by (simp add: NSCDERIV_minus NSCDERIV_CDERIV_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   774
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   775
lemma NSCDERIV_add_minus:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   776
     "[| NSCDERIV f x :> Da; NSCDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   777
      ==> NSCDERIV (%x. f x + -g x) x :> Da + -Db"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   778
by (blast dest: NSCDERIV_add NSCDERIV_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   779
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   780
lemma CDERIV_add_minus:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   781
     "[| CDERIV f x :> Da; CDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   782
      ==> CDERIV (%x. f x + -g x) x :> Da + -Db"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   783
by (blast dest: CDERIV_add CDERIV_minus)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   784
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   785
lemma NSCDERIV_diff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   786
     "[| NSCDERIV f x :> Da; NSCDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   787
      ==> NSCDERIV (%x. f x - g x) x :> Da - Db"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   788
by (simp add: diff_minus NSCDERIV_add_minus)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   789
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   790
lemma CDERIV_diff:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   791
     "[| CDERIV f x :> Da; CDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   792
       ==> CDERIV (%x. f x - g x) x :> Da - Db"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   793
by (simp add: diff_minus CDERIV_add_minus)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   794
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   795
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   796
subsection{*Chain Rule*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   797
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   798
(* lemmas *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   799
lemma NSCDERIV_zero:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   800
      "[| NSCDERIV g x :> D;
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   801
          ( *f* g) (hcomplex_of_complex(x) + xa) = hcomplex_of_complex(g x);
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   802
          xa : CInfinitesimal; xa \<noteq> 0
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   803
       |] ==> D = 0"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   804
apply (simp add: nscderiv_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   805
apply (drule bspec, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   806
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   807
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   808
lemma NSCDERIV_capprox:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   809
  "[| NSCDERIV f x :> D;  h: CInfinitesimal;  h \<noteq> 0 |]
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   810
   ==> ( *f* f) (hcomplex_of_complex(x) + h) - hcomplex_of_complex(f x) @c= 0"
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   811
apply (simp add: nscderiv_def mem_cinfmal_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   812
apply (rule CInfinitesimal_ratio)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   813
apply (rule_tac [3] capprox_hcomplex_of_complex_CFinite, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   814
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   815
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   816
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   817
(*--------------------------------------------------*)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   818
(* from one version of differentiability            *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   819
(*                                                  *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   820
(*   f(x) - f(a)                                    *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   821
(* --------------- @= Db                            *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   822
(*     x - a                                        *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   823
(* -------------------------------------------------*)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   824
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   825
lemma NSCDERIVD1:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   826
   "[| NSCDERIV f (g x) :> Da;
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   827
       ( *f* g) (hcomplex_of_complex(x) + xa) \<noteq> hcomplex_of_complex (g x);
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   828
       ( *f* g) (hcomplex_of_complex(x) + xa) @c= hcomplex_of_complex (g x)|]
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   829
    ==> (( *f* f) (( *f* g) (hcomplex_of_complex(x) + xa))
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   830
	 - hcomplex_of_complex (f (g x))) /
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   831
	(( *f* g) (hcomplex_of_complex(x) + xa) - hcomplex_of_complex (g x))
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   832
	   @c= hcomplex_of_complex (Da)"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   833
by (simp add: NSCDERIV_NSCLIM_iff2 NSCLIM_def)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   834
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   835
(*--------------------------------------------------*)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   836
(* from other version of differentiability          *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   837
(*                                                  *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   838
(*  f(x + h) - f(x)                                 *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   839
(* ----------------- @= Db                          *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   840
(*         h                                        *)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   841
(*--------------------------------------------------*)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   842
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   843
lemma NSCDERIVD2:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   844
  "[| NSCDERIV g x :> Db; xa: CInfinitesimal; xa \<noteq> 0 |]
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   845
   ==> (( *f* g) (hcomplex_of_complex x + xa) - hcomplex_of_complex(g x)) / xa
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   846
       @c= hcomplex_of_complex (Db)"
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   847
by (simp add: NSCDERIV_NSCLIM_iff NSCLIM_def mem_cinfmal_iff starfun_lambda_cancel)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   848
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   849
lemma lemma_complex_chain: "(z::hcomplex) \<noteq> 0 ==> x*y = (x*inverse(z))*(z*y)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   850
by auto
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   851
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   852
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   853
text{*Chain rule*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   854
theorem NSCDERIV_chain:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   855
     "[| NSCDERIV f (g x) :> Da; NSCDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   856
      ==> NSCDERIV (f o g) x :> Da * Db"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   857
apply (simp (no_asm_simp) add: NSCDERIV_NSCLIM_iff NSCLIM_def mem_cinfmal_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   858
apply safe
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   859
apply (frule_tac f = g in NSCDERIV_capprox)
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   860
apply (auto simp add: starfun_lambda_cancel2 starfun_o [symmetric])
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   861
apply (case_tac "( *f* g) (hcomplex_of_complex (x) + xa) = hcomplex_of_complex (g x) ")
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   862
apply (drule_tac g = g in NSCDERIV_zero)
17300
5798fbf42a6a replace type hcomplex with complex star
huffman
parents: 17298
diff changeset
   863
apply (auto simp add: divide_inverse)
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   864
apply (rule_tac z1 = "( *f* g) (hcomplex_of_complex (x) + xa) - hcomplex_of_complex (g x) " and y1 = "inverse xa" in lemma_complex_chain [THEN ssubst])
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   865
apply (simp (no_asm_simp))
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   866
apply (rule capprox_mult_hcomplex_of_complex)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   867
apply (auto intro!: NSCDERIVD1 intro: capprox_minus_iff [THEN iffD2] 
14430
5cb24165a2e1 new material from Avigad, and simplified treatment of division by 0
paulson
parents: 14405
diff changeset
   868
            simp add: diff_minus [symmetric] divide_inverse [symmetric])
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   869
apply (blast intro: NSCDERIVD2)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   870
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   871
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   872
text{*standard version*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   873
lemma CDERIV_chain:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   874
     "[| CDERIV f (g x) :> Da; CDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   875
      ==> CDERIV (f o g) x :> Da * Db"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   876
by (simp add: NSCDERIV_CDERIV_iff [symmetric] NSCDERIV_chain)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   877
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   878
lemma CDERIV_chain2:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   879
     "[| CDERIV f (g x) :> Da; CDERIV g x :> Db |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   880
      ==> CDERIV (%x. f (g x)) x :> Da * Db"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   881
by (auto dest: CDERIV_chain simp add: o_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   882
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   883
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   884
subsection{* Differentiation of Natural Number Powers*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   885
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   886
lemma NSCDERIV_Id [simp]: "NSCDERIV (%x. x) x :> 1"
15228
4d332d10fa3d revised simprules for division
paulson
parents: 15140
diff changeset
   887
by (simp add: NSCDERIV_NSCLIM_iff NSCLIM_def divide_self del: divide_self_if)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   888
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   889
lemma CDERIV_Id [simp]: "CDERIV (%x. x) x :> 1"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   890
by (simp add: NSCDERIV_CDERIV_iff [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   891
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   892
lemmas isContc_Id = CDERIV_Id [THEN CDERIV_isContc, standard]
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
   893
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   894
text{*derivative of linear multiplication*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   895
lemma CDERIV_cmult_Id [simp]: "CDERIV (op * c) x :> c"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   896
by (cut_tac c = c and x = x in CDERIV_Id [THEN CDERIV_cmult], simp)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   897
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   898
lemma NSCDERIV_cmult_Id [simp]: "NSCDERIV (op * c) x :> c"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   899
by (simp add: NSCDERIV_CDERIV_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   900
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   901
lemma CDERIV_pow [simp]:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   902
     "CDERIV (%x. x ^ n) x :> (complex_of_real (real n)) * (x ^ (n - Suc 0))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   903
apply (induct_tac "n")
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   904
apply (drule_tac [2] CDERIV_Id [THEN CDERIV_mult])
15013
34264f5e4691 new treatment of binary numerals
paulson
parents: 14738
diff changeset
   905
apply (auto simp add: left_distrib real_of_nat_Suc)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   906
apply (case_tac "n")
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   907
apply (auto simp add: mult_ac add_commute)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   908
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   909
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   910
text{*Nonstandard version*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   911
lemma NSCDERIV_pow:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   912
     "NSCDERIV (%x. x ^ n) x :> complex_of_real (real n) * (x ^ (n - 1))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   913
by (simp add: NSCDERIV_CDERIV_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   914
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   915
lemma lemma_CDERIV_subst:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   916
     "[|CDERIV f x :> D; D = E|] ==> CDERIV f x :> E"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   917
by auto
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   918
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   919
(*used once, in NSCDERIV_inverse*)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   920
lemma CInfinitesimal_add_not_zero:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   921
     "[| h: CInfinitesimal; x \<noteq> 0 |] ==> hcomplex_of_complex x + h \<noteq> 0"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   922
apply clarify
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   923
apply (drule equals_zero_I, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   924
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   925
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   926
text{*Can't relax the premise @{term "x \<noteq> 0"}: it isn't continuous at zero*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   927
lemma NSCDERIV_inverse:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   928
     "x \<noteq> 0 ==> NSCDERIV (%x. inverse(x)) x :> (- (inverse x ^ 2))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   929
apply (simp add: nscderiv_def Ball_def, clarify) 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   930
apply (frule CInfinitesimal_add_not_zero [where x=x])
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   931
apply (auto simp add: starfun_inverse_inverse diff_minus 
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   932
           simp del: minus_mult_left [symmetric] minus_mult_right [symmetric])
17318
bc1c75855f3d starfun, starset, and other functions on NS types are now polymorphic;
huffman
parents: 17300
diff changeset
   933
apply (simp add: add_commute numeral_2_eq_2 inverse_add
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   934
                 inverse_mult_distrib [symmetric] inverse_minus_eq [symmetric]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   935
                 add_ac mult_ac 
15013
34264f5e4691 new treatment of binary numerals
paulson
parents: 14738
diff changeset
   936
            del: inverse_minus_eq inverse_mult_distrib
34264f5e4691 new treatment of binary numerals
paulson
parents: 14738
diff changeset
   937
                 minus_mult_right [symmetric] minus_mult_left [symmetric])
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   938
apply (simp only: mult_assoc [symmetric] right_distrib)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   939
apply (rule_tac y = " inverse (- hcomplex_of_complex x * hcomplex_of_complex x) " in capprox_trans)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   940
apply (rule inverse_add_CInfinitesimal_capprox2)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   941
apply (auto dest!: hcomplex_of_complex_CFinite_diff_CInfinitesimal 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   942
            intro: CFinite_mult 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   943
            simp add: inverse_minus_eq [symmetric])
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   944
apply (rule CInfinitesimal_CFinite_mult2, auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   945
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   946
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   947
lemma CDERIV_inverse:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   948
     "x \<noteq> 0 ==> CDERIV (%x. inverse(x)) x :> (-(inverse x ^ 2))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   949
by (simp add: NSCDERIV_inverse NSCDERIV_CDERIV_iff [symmetric] 
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   950
         del: complexpow_Suc)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   951
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   952
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   953
subsection{*Derivative of Reciprocals (Function @{term inverse})*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   954
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   955
lemma CDERIV_inverse_fun:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   956
     "[| CDERIV f x :> d; f(x) \<noteq> 0 |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   957
      ==> CDERIV (%x. inverse(f x)) x :> (- (d * inverse(f(x) ^ 2)))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   958
apply (rule mult_commute [THEN subst])
15013
34264f5e4691 new treatment of binary numerals
paulson
parents: 14738
diff changeset
   959
apply (simp add: minus_mult_left power_inverse
34264f5e4691 new treatment of binary numerals
paulson
parents: 14738
diff changeset
   960
            del: complexpow_Suc minus_mult_left [symmetric])
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   961
apply (fold o_def)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   962
apply (blast intro!: CDERIV_chain CDERIV_inverse)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   963
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   964
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   965
lemma NSCDERIV_inverse_fun:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   966
     "[| NSCDERIV f x :> d; f(x) \<noteq> 0 |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   967
      ==> NSCDERIV (%x. inverse(f x)) x :> (- (d * inverse(f(x) ^ 2)))"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   968
by (simp add: NSCDERIV_CDERIV_iff CDERIV_inverse_fun del: complexpow_Suc)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   969
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   970
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   971
subsection{* Derivative of Quotient*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   972
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   973
lemma CDERIV_quotient:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   974
     "[| CDERIV f x :> d; CDERIV g x :> e; g(x) \<noteq> 0 |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   975
       ==> CDERIV (%y. f(y) / (g y)) x :> (d*g(x) - (e*f(x))) / (g(x) ^ 2)"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
   976
apply (simp add: diff_minus)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   977
apply (drule_tac f = g in CDERIV_inverse_fun)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   978
apply (drule_tac [2] CDERIV_mult, assumption+)
19233
77ca20b0ed77 renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents: 17373
diff changeset
   979
apply (simp add: divide_inverse left_distrib power_inverse minus_mult_left 
14430
5cb24165a2e1 new material from Avigad, and simplified treatment of division by 0
paulson
parents: 14405
diff changeset
   980
                 mult_ac 
5cb24165a2e1 new material from Avigad, and simplified treatment of division by 0
paulson
parents: 14405
diff changeset
   981
            del: minus_mult_right [symmetric] minus_mult_left [symmetric]
5cb24165a2e1 new material from Avigad, and simplified treatment of division by 0
paulson
parents: 14405
diff changeset
   982
                 complexpow_Suc)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   983
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   984
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   985
lemma NSCDERIV_quotient:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   986
     "[| NSCDERIV f x :> d; NSCDERIV g x :> e; g(x) \<noteq> 0 |]
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   987
       ==> NSCDERIV (%y. f(y) / (g y)) x :> (d*g(x) - (e*f(x))) / (g(x) ^ 2)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   988
by (simp add: NSCDERIV_CDERIV_iff CDERIV_quotient del: complexpow_Suc)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   989
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   990
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   991
subsection{*Caratheodory Formulation of Derivative at a Point: Standard Proof*}
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   992
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   993
lemma CLIM_equal:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   994
      "[| \<forall>x. x \<noteq> a --> (f x = g x) |] ==> (f -- a --C> l) = (g -- a --C> l)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   995
by (simp add: CLIM_def complex_add_minus_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   996
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   997
lemma CLIM_trans:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   998
     "[| (%x. f(x) + -g(x)) -- a --C> 0; g -- a --C> l |] ==> f -- a --C> l"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
   999
apply (drule CLIM_add, assumption)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1000
apply (simp add: complex_add_assoc)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1001
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1002
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1003
lemma CARAT_CDERIV:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1004
     "(CDERIV f x :> l) =
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1005
      (\<exists>g. (\<forall>z. f z - f x = g z * (z - x)) & isContc g x & g x = l)"
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1006
apply safe
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1007
apply (rule_tac x = "%z. if z=x then l else (f (z) - f (x)) / (z-x)" in exI)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1008
apply (auto simp add: mult_assoc isContc_iff CDERIV_iff)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1009
apply (rule_tac [!] CLIM_equal [THEN iffD1], auto)
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1010
done
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1011
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1012
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1013
lemma CARAT_NSCDERIV:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1014
     "NSCDERIV f x :> l ==>
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1015
      \<exists>g. (\<forall>z. f z - f x = g z * (z - x)) & isNSContc g x & g x = l"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14430
diff changeset
  1016
by (simp add: NSCDERIV_CDERIV_iff isNSContc_isContc_iff CARAT_CDERIV)
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1017
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1018
lemma CARAT_CDERIVD:
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1019
     "(\<forall>z. f z - f x = g z * (z - x)) & isNSContc g x & g x = l
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1020
      ==> NSCDERIV f x :> l"
15234
ec91a90c604e simplification tweaks for better arithmetic reasoning
paulson
parents: 15228
diff changeset
  1021
by (auto simp add: NSCDERIV_iff2 isNSContc_def cstarfun_if_eq); 
ec91a90c604e simplification tweaks for better arithmetic reasoning
paulson
parents: 15228
diff changeset
  1022
14405
534de3572a65 conversion of Complex/CLim to Isar script
paulson
parents: 13957
diff changeset
  1023
end