src/HOL/Deriv.thy
author paulson <lp15@cam.ac.uk>
Tue, 24 May 2022 16:21:49 +0100
changeset 75462 7448423e5dba
parent 75243 a2b8394ce1f1
child 76033 97b6daab0233
permissions -rw-r--r--
Renamed the misleading has_field_derivative_iff_has_vector_derivative. Inserted a number of minor lemmas
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
     1
(*  Title:      HOL/Deriv.thy
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
     2
    Author:     Jacques D. Fleuriot, University of Cambridge, 1998
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
     3
    Author:     Brian Huffman
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
     4
    Author:     Lawrence C Paulson, 2004
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
     5
    Author:     Benjamin Porter, 2005
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
     6
*)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
     7
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
     8
section \<open>Differentiation\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
     9
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
    10
theory Deriv
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    11
  imports Limits
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
    12
begin
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
    13
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    14
subsection \<open>Frechet derivative\<close>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    15
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    16
definition has_derivative :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    17
    ('a \<Rightarrow> 'b) \<Rightarrow> 'a filter \<Rightarrow> bool"  (infix "(has'_derivative)" 50)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    18
  where "(f has_derivative f') F \<longleftrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    19
    bounded_linear f' \<and>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    20
    ((\<lambda>y. ((f y - f (Lim F (\<lambda>x. x))) - f' (y - Lim F (\<lambda>x. x))) /\<^sub>R norm (y - Lim F (\<lambda>x. x))) \<longlongrightarrow> 0) F"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    21
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    22
text \<open>
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
    23
  Usually the filter \<^term>\<open>F\<close> is \<^term>\<open>at x within s\<close>.  \<^term>\<open>(f has_derivative D)
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
    24
  (at x within s)\<close> means: \<^term>\<open>D\<close> is the derivative of function \<^term>\<open>f\<close> at point \<^term>\<open>x\<close>
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
    25
  within the set \<^term>\<open>s\<close>. Where \<^term>\<open>s\<close> is used to express left or right sided derivatives. In
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
    26
  most cases \<^term>\<open>s\<close> is either a variable or \<^term>\<open>UNIV\<close>.
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    27
\<close>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    28
67685
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
    29
text \<open>These are the only cases we'll care about, probably.\<close>
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
    30
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
    31
lemma has_derivative_within: "(f has_derivative f') (at x within s) \<longleftrightarrow>
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
    32
    bounded_linear f' \<and> ((\<lambda>y. (1 / norm(y - x)) *\<^sub>R (f y - (f x + f' (y - x)))) \<longlongrightarrow> 0) (at x within s)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
    33
  unfolding has_derivative_def tendsto_iff
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
    34
  by (subst eventually_Lim_ident_at) (auto simp add: field_simps)
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
    35
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    36
lemma has_derivative_eq_rhs: "(f has_derivative f') F \<Longrightarrow> f' = g' \<Longrightarrow> (f has_derivative g') F"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    37
  by simp
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    38
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    39
definition has_field_derivative :: "('a::real_normed_field \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a filter \<Rightarrow> bool"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    40
    (infix "(has'_field'_derivative)" 50)
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 69022
diff changeset
    41
  where "(f has_field_derivative D) F \<longleftrightarrow> (f has_derivative (*) D) F"
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    42
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    43
lemma DERIV_cong: "(f has_field_derivative X) F \<Longrightarrow> X = Y \<Longrightarrow> (f has_field_derivative Y) F"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    44
  by simp
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    45
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    46
definition has_vector_derivative :: "(real \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'b \<Rightarrow> real filter \<Rightarrow> bool"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    47
    (infix "has'_vector'_derivative" 50)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    48
  where "(f has_vector_derivative f') net \<longleftrightarrow> (f has_derivative (\<lambda>x. x *\<^sub>R f')) net"
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    49
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    50
lemma has_vector_derivative_eq_rhs:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    51
  "(f has_vector_derivative X) F \<Longrightarrow> X = Y \<Longrightarrow> (f has_vector_derivative Y) F"
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    52
  by simp
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    53
57953
69728243a614 updated to named_theorems;
wenzelm
parents: 57514
diff changeset
    54
named_theorems derivative_intros "structural introduction rules for derivatives"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    55
setup \<open>
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    56
  let
57953
69728243a614 updated to named_theorems;
wenzelm
parents: 57514
diff changeset
    57
    val eq_thms = @{thms has_derivative_eq_rhs DERIV_cong has_vector_derivative_eq_rhs}
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    58
    fun eq_rule thm = get_first (try (fn eq_thm => eq_thm OF [thm])) eq_thms
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    59
  in
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    60
    Global_Theory.add_thms_dynamic
67149
e61557884799 prefer control symbol antiquotations;
wenzelm
parents: 64272
diff changeset
    61
      (\<^binding>\<open>derivative_eq_intros\<close>,
57953
69728243a614 updated to named_theorems;
wenzelm
parents: 57514
diff changeset
    62
        fn context =>
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
    63
          Named_Theorems.get (Context.proof_of context) \<^named_theorems>\<open>derivative_intros\<close>
57953
69728243a614 updated to named_theorems;
wenzelm
parents: 57514
diff changeset
    64
          |> map_filter eq_rule)
69216
1a52baa70aed clarified ML_Context.expression: it is a closed expression, not a let-declaration -- thus source positions are more accurate (amending d8849cfad60f, 162a4c2e97bc);
wenzelm
parents: 69111
diff changeset
    65
  end
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    66
\<close>
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    67
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    68
text \<open>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    69
  The following syntax is only used as a legacy syntax.
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    70
\<close>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    71
abbreviation (input)
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    72
  FDERIV :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a \<Rightarrow>  ('a \<Rightarrow> 'b) \<Rightarrow> bool"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    73
  ("(FDERIV (_)/ (_)/ :> (_))" [1000, 1000, 60] 60)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
    74
  where "FDERIV f x :> f' \<equiv> (f has_derivative f') (at x)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    75
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    76
lemma has_derivative_bounded_linear: "(f has_derivative f') F \<Longrightarrow> bounded_linear f'"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    77
  by (simp add: has_derivative_def)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    78
56369
2704ca85be98 moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
hoelzl
parents: 56289
diff changeset
    79
lemma has_derivative_linear: "(f has_derivative f') F \<Longrightarrow> linear f'"
2704ca85be98 moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
hoelzl
parents: 56289
diff changeset
    80
  using bounded_linear.linear[OF has_derivative_bounded_linear] .
2704ca85be98 moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
hoelzl
parents: 56289
diff changeset
    81
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    82
lemma has_derivative_ident[derivative_intros, simp]: "((\<lambda>x. x) has_derivative (\<lambda>x. x)) F"
58729
e8ecc79aee43 add tendsto_const and tendsto_ident_at as simp and intro rules
hoelzl
parents: 57953
diff changeset
    83
  by (simp add: has_derivative_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    84
63469
b6900858dcb9 lots of new theorems about differentiable_on, retracts, ANRs, etc.
paulson <lp15@cam.ac.uk>
parents: 63299
diff changeset
    85
lemma has_derivative_id [derivative_intros, simp]: "(id has_derivative id) (at a)"
b6900858dcb9 lots of new theorems about differentiable_on, retracts, ANRs, etc.
paulson <lp15@cam.ac.uk>
parents: 63299
diff changeset
    86
  by (metis eq_id_iff has_derivative_ident)
b6900858dcb9 lots of new theorems about differentiable_on, retracts, ANRs, etc.
paulson <lp15@cam.ac.uk>
parents: 63299
diff changeset
    87
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    88
lemma has_derivative_const[derivative_intros, simp]: "((\<lambda>x. c) has_derivative (\<lambda>x. 0)) F"
58729
e8ecc79aee43 add tendsto_const and tendsto_ident_at as simp and intro rules
hoelzl
parents: 57953
diff changeset
    89
  by (simp add: has_derivative_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    90
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    91
lemma (in bounded_linear) bounded_linear: "bounded_linear f" ..
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    92
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    93
lemma (in bounded_linear) has_derivative:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    94
  "(g has_derivative g') F \<Longrightarrow> ((\<lambda>x. f (g x)) has_derivative (\<lambda>x. f (g' x))) F"
63092
a949b2a5f51d eliminated use of empty "assms";
wenzelm
parents: 63079
diff changeset
    95
  unfolding has_derivative_def
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
    96
  by (auto simp add: bounded_linear_compose [OF bounded_linear] scaleR diff dest: tendsto)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    97
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    98
lemmas has_derivative_scaleR_right [derivative_intros] =
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    99
  bounded_linear.has_derivative [OF bounded_linear_scaleR_right]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   100
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   101
lemmas has_derivative_scaleR_left [derivative_intros] =
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   102
  bounded_linear.has_derivative [OF bounded_linear_scaleR_left]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   103
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   104
lemmas has_derivative_mult_right [derivative_intros] =
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   105
  bounded_linear.has_derivative [OF bounded_linear_mult_right]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   106
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   107
lemmas has_derivative_mult_left [derivative_intros] =
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   108
  bounded_linear.has_derivative [OF bounded_linear_mult_left]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   109
70707
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
   110
lemmas has_derivative_of_real[derivative_intros, simp] = 
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
   111
  bounded_linear.has_derivative[OF bounded_linear_of_real] 
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
   112
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   113
lemma has_derivative_add[simp, derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   114
  assumes f: "(f has_derivative f') F"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   115
    and g: "(g has_derivative g') F"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   116
  shows "((\<lambda>x. f x + g x) has_derivative (\<lambda>x. f' x + g' x)) F"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   117
  unfolding has_derivative_def
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   118
proof safe
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   119
  let ?x = "Lim F (\<lambda>x. x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   120
  let ?D = "\<lambda>f f' y. ((f y - f ?x) - f' (y - ?x)) /\<^sub>R norm (y - ?x)"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   121
  have "((\<lambda>x. ?D f f' x + ?D g g' x) \<longlongrightarrow> (0 + 0)) F"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   122
    using f g by (intro tendsto_add) (auto simp: has_derivative_def)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   123
  then show "(?D (\<lambda>x. f x + g x) (\<lambda>x. f' x + g' x) \<longlongrightarrow> 0) F"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   124
    by (simp add: field_simps scaleR_add_right scaleR_diff_right)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   125
qed (blast intro: bounded_linear_add f g has_derivative_bounded_linear)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   126
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63952
diff changeset
   127
lemma has_derivative_sum[simp, derivative_intros]:
63915
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   128
  "(\<And>i. i \<in> I \<Longrightarrow> (f i has_derivative f' i) F) \<Longrightarrow>
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   129
    ((\<lambda>x. \<Sum>i\<in>I. f i x) has_derivative (\<lambda>x. \<Sum>i\<in>I. f' i x)) F"
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   130
  by (induct I rule: infinite_finite_induct) simp_all
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   131
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   132
lemma has_derivative_minus[simp, derivative_intros]:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   133
  "(f has_derivative f') F \<Longrightarrow> ((\<lambda>x. - f x) has_derivative (\<lambda>x. - f' x)) F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   134
  using has_derivative_scaleR_right[of f f' F "-1"] by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   135
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   136
lemma has_derivative_diff[simp, derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   137
  "(f has_derivative f') F \<Longrightarrow> (g has_derivative g') F \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   138
    ((\<lambda>x. f x - g x) has_derivative (\<lambda>x. f' x - g' x)) F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   139
  by (simp only: diff_conv_add_uminus has_derivative_add has_derivative_minus)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   140
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   141
lemma has_derivative_at_within:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   142
  "(f has_derivative f') (at x within s) \<longleftrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   143
    (bounded_linear f' \<and> ((\<lambda>y. ((f y - f x) - f' (y - x)) /\<^sub>R norm (y - x)) \<longlongrightarrow> 0) (at x within s))"
72219
0f38c96a0a74 tidying up some theorem statements
paulson <lp15@cam.ac.uk>
parents: 71837
diff changeset
   144
proof (cases "at x within s = bot")
0f38c96a0a74 tidying up some theorem statements
paulson <lp15@cam.ac.uk>
parents: 71837
diff changeset
   145
  case True
0f38c96a0a74 tidying up some theorem statements
paulson <lp15@cam.ac.uk>
parents: 71837
diff changeset
   146
  then show ?thesis
0f38c96a0a74 tidying up some theorem statements
paulson <lp15@cam.ac.uk>
parents: 71837
diff changeset
   147
    by (metis (no_types, lifting) has_derivative_within tendsto_bot)
0f38c96a0a74 tidying up some theorem statements
paulson <lp15@cam.ac.uk>
parents: 71837
diff changeset
   148
next
0f38c96a0a74 tidying up some theorem statements
paulson <lp15@cam.ac.uk>
parents: 71837
diff changeset
   149
  case False
0f38c96a0a74 tidying up some theorem statements
paulson <lp15@cam.ac.uk>
parents: 71837
diff changeset
   150
  then show ?thesis
0f38c96a0a74 tidying up some theorem statements
paulson <lp15@cam.ac.uk>
parents: 71837
diff changeset
   151
  by (simp add: Lim_ident_at has_derivative_def)
0f38c96a0a74 tidying up some theorem statements
paulson <lp15@cam.ac.uk>
parents: 71837
diff changeset
   152
qed
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   153
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   154
lemma has_derivative_iff_norm:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   155
  "(f has_derivative f') (at x within s) \<longleftrightarrow>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   156
    bounded_linear f' \<and> ((\<lambda>y. norm ((f y - f x) - f' (y - x)) / norm (y - x)) \<longlongrightarrow> 0) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   157
  using tendsto_norm_zero_iff[of _ "at x within s", where 'b="'b", symmetric]
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   158
  by (simp add: has_derivative_at_within divide_inverse ac_simps)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   159
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   160
lemma has_derivative_at:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   161
  "(f has_derivative D) (at x) \<longleftrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   162
    (bounded_linear D \<and> (\<lambda>h. norm (f (x + h) - f x - D h) / norm h) \<midarrow>0\<rightarrow> 0)"
72245
cbe7aa1c2bdc tidying and de-applying
paulson <lp15@cam.ac.uk>
parents: 72219
diff changeset
   163
  by (simp add: has_derivative_iff_norm LIM_offset_zero_iff)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   164
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   165
lemma field_has_derivative_at:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   166
  fixes x :: "'a::real_normed_field"
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 69022
diff changeset
   167
  shows "(f has_derivative (*) D) (at x) \<longleftrightarrow> (\<lambda>h. (f (x + h) - f x) / h) \<midarrow>0\<rightarrow> D" (is "?lhs = ?rhs")
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   168
proof -
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   169
  have "?lhs = (\<lambda>h. norm (f (x + h) - f x - D * h) / norm h) \<midarrow>0 \<rightarrow> 0"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   170
    by (simp add: bounded_linear_mult_right has_derivative_at)
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   171
  also have "... = (\<lambda>y. norm ((f (x + y) - f x - D * y) / y)) \<midarrow>0\<rightarrow> 0"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   172
    by (simp cong: LIM_cong flip: nonzero_norm_divide)
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   173
  also have "... = (\<lambda>y. norm ((f (x + y) - f x) / y - D / y * y)) \<midarrow>0\<rightarrow> 0"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   174
    by (simp only: diff_divide_distrib times_divide_eq_left [symmetric])
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   175
  also have "... = ?rhs"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   176
    by (simp add: tendsto_norm_zero_iff LIM_zero_iff cong: LIM_cong)
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   177
  finally show ?thesis .
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   178
qed
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   179
70999
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   180
lemma has_derivative_iff_Ex:
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   181
  "(f has_derivative f') (at x) \<longleftrightarrow>
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   182
    bounded_linear f' \<and> (\<exists>e. (\<forall>h. f (x+h) = f x + f' h + e h) \<and> ((\<lambda>h. norm (e h) / norm h) \<longlongrightarrow> 0) (at 0))"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   183
  unfolding has_derivative_at by force
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   184
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   185
lemma has_derivative_at_within_iff_Ex:
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   186
  assumes "x \<in> S" "open S"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   187
  shows "(f has_derivative f') (at x within S) \<longleftrightarrow>
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   188
         bounded_linear f' \<and> (\<exists>e. (\<forall>h. x+h \<in> S \<longrightarrow> f (x+h) = f x + f' h + e h) \<and> ((\<lambda>h. norm (e h) / norm h) \<longlongrightarrow> 0) (at 0))"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   189
    (is "?lhs = ?rhs")
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   190
proof safe
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   191
  show "bounded_linear f'"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   192
    if "(f has_derivative f') (at x within S)"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   193
    using has_derivative_bounded_linear that by blast
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   194
  show "\<exists>e. (\<forall>h. x + h \<in> S \<longrightarrow> f (x + h) = f x + f' h + e h) \<and> (\<lambda>h. norm (e h) / norm h) \<midarrow>0\<rightarrow> 0"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   195
    if "(f has_derivative f') (at x within S)"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   196
    by (metis (full_types) assms that has_derivative_iff_Ex at_within_open)
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   197
  show "(f has_derivative f') (at x within S)"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   198
    if "bounded_linear f'"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   199
      and eq [rule_format]: "\<forall>h. x + h \<in> S \<longrightarrow> f (x + h) = f x + f' h + e h"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   200
      and 0: "(\<lambda>h. norm (e (h::'a)::'b) / norm h) \<midarrow>0\<rightarrow> 0"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   201
    for e 
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   202
  proof -
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   203
    have 1: "f y - f x = f' (y-x) + e (y-x)" if "y \<in> S" for y
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   204
      using eq [of "y-x"] that by simp
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   205
    have 2: "((\<lambda>y. norm (e (y-x)) / norm (y - x)) \<longlongrightarrow> 0) (at x within S)"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   206
      by (simp add: "0" assms tendsto_offset_zero_iff)
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   207
    have "((\<lambda>y. norm (f y - f x - f' (y - x)) / norm (y - x)) \<longlongrightarrow> 0) (at x within S)"
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   208
      by (simp add: Lim_cong_within 1 2)
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   209
    then show ?thesis
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   210
      by (simp add: has_derivative_iff_norm \<open>bounded_linear f'\<close>)
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   211
  qed
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   212
qed
5b753486c075 Inverse function theorem + lemmas
paulson <lp15@cam.ac.uk>
parents: 70707
diff changeset
   213
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   214
lemma has_derivativeI:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   215
  "bounded_linear f' \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   216
    ((\<lambda>y. ((f y - f x) - f' (y - x)) /\<^sub>R norm (y - x)) \<longlongrightarrow> 0) (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   217
    (f has_derivative f') (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   218
  by (simp add: has_derivative_at_within)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   219
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   220
lemma has_derivativeI_sandwich:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   221
  assumes e: "0 < e"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   222
    and bounded: "bounded_linear f'"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   223
    and sandwich: "(\<And>y. y \<in> s \<Longrightarrow> y \<noteq> x \<Longrightarrow> dist y x < e \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   224
      norm ((f y - f x) - f' (y - x)) / norm (y - x) \<le> H y)"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   225
    and "(H \<longlongrightarrow> 0) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   226
  shows "(f has_derivative f') (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   227
  unfolding has_derivative_iff_norm
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   228
proof safe
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   229
  show "((\<lambda>y. norm (f y - f x - f' (y - x)) / norm (y - x)) \<longlongrightarrow> 0) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   230
  proof (rule tendsto_sandwich[where f="\<lambda>x. 0"])
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   231
    show "(H \<longlongrightarrow> 0) (at x within s)" by fact
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   232
    show "eventually (\<lambda>n. norm (f n - f x - f' (n - x)) / norm (n - x) \<le> H n) (at x within s)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   233
      unfolding eventually_at using e sandwich by auto
58729
e8ecc79aee43 add tendsto_const and tendsto_ident_at as simp and intro rules
hoelzl
parents: 57953
diff changeset
   234
  qed (auto simp: le_divide_eq)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   235
qed fact
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   236
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   237
lemma has_derivative_subset:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   238
  "(f has_derivative f') (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow> (f has_derivative f') (at x within t)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   239
  by (auto simp add: has_derivative_iff_norm intro: tendsto_within_subset)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   240
67685
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   241
lemma has_derivative_within_singleton_iff:
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   242
  "(f has_derivative g) (at x within {x}) \<longleftrightarrow> bounded_linear g"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   243
  by (auto intro!: has_derivativeI_sandwich[where e=1] has_derivative_bounded_linear)
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   244
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   245
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   246
subsubsection \<open>Limit transformation for derivatives\<close>
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   247
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   248
lemma has_derivative_transform_within:
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   249
  assumes "(f has_derivative f') (at x within s)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   250
    and "0 < d"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   251
    and "x \<in> s"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   252
    and "\<And>x'. \<lbrakk>x' \<in> s; dist x' x < d\<rbrakk> \<Longrightarrow> f x' = g x'"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   253
  shows "(g has_derivative f') (at x within s)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   254
  using assms
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   255
  unfolding has_derivative_within
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   256
  by (force simp add: intro: Lim_transform_within)
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   257
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   258
lemma has_derivative_transform_within_open:
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   259
  assumes "(f has_derivative f') (at x within t)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   260
    and "open s"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   261
    and "x \<in> s"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   262
    and "\<And>x. x\<in>s \<Longrightarrow> f x = g x"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   263
  shows "(g has_derivative f') (at x within t)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   264
  using assms unfolding has_derivative_within
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   265
  by (force simp add: intro: Lim_transform_within_open)
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   266
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   267
lemma has_derivative_transform:
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   268
  assumes "x \<in> s" "\<And>x. x \<in> s \<Longrightarrow> g x = f x"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   269
  assumes "(f has_derivative f') (at x within s)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   270
  shows "(g has_derivative f') (at x within s)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   271
  using assms
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   272
  by (intro has_derivative_transform_within[OF _ zero_less_one, where g=g]) auto
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   273
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   274
lemma has_derivative_transform_eventually:
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   275
  assumes "(f has_derivative f') (at x within s)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   276
    "(\<forall>\<^sub>F x' in at x within s. f x' = g x')"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   277
  assumes "f x = g x" "x \<in> s"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   278
  shows "(g has_derivative f') (at x within s)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   279
  using assms
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   280
proof -
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   281
  from assms(2,3) obtain d where "d > 0" "\<And>x'. x' \<in> s \<Longrightarrow> dist x' x < d \<Longrightarrow> f x' = g x'"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   282
    by (force simp: eventually_at)
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   283
  from has_derivative_transform_within[OF assms(1) this(1) assms(4) this(2)]
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   284
  show ?thesis .
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   285
qed
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   286
71029
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   287
lemma has_field_derivative_transform_within:
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   288
  assumes "(f has_field_derivative f') (at a within S)"
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   289
    and "0 < d"
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   290
    and "a \<in> S"
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   291
    and "\<And>x. \<lbrakk>x \<in> S; dist x a < d\<rbrakk> \<Longrightarrow> f x = g x"
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   292
  shows "(g has_field_derivative f') (at a within S)"
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   293
  using assms unfolding has_field_derivative_def
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   294
  by (metis has_derivative_transform_within)
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   295
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   296
lemma has_field_derivative_transform_within_open:
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   297
  assumes "(f has_field_derivative f') (at a)"
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   298
    and "open S" "a \<in> S"
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   299
    and "\<And>x. x \<in> S \<Longrightarrow> f x = g x"
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   300
  shows "(g has_field_derivative f') (at a)"
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   301
  using assms unfolding has_field_derivative_def
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   302
  by (metis has_derivative_transform_within_open)
934e0044e94b Moved or deleted some out of place material, also eliminating obsolete naming conventions
paulson <lp15@cam.ac.uk>
parents: 70999
diff changeset
   303
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   304
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   305
subsection \<open>Continuity\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   306
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   307
lemma has_derivative_continuous:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   308
  assumes f: "(f has_derivative f') (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   309
  shows "continuous (at x within s) f"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   310
proof -
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   311
  from f interpret F: bounded_linear f'
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   312
    by (rule has_derivative_bounded_linear)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   313
  note F.tendsto[tendsto_intros]
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   314
  let ?L = "\<lambda>f. (f \<longlongrightarrow> 0) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   315
  have "?L (\<lambda>y. norm ((f y - f x) - f' (y - x)) / norm (y - x))"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   316
    using f unfolding has_derivative_iff_norm by blast
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   317
  then have "?L (\<lambda>y. norm ((f y - f x) - f' (y - x)) / norm (y - x) * norm (y - x))" (is ?m)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   318
    by (rule tendsto_mult_zero) (auto intro!: tendsto_eq_intros)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   319
  also have "?m \<longleftrightarrow> ?L (\<lambda>y. norm ((f y - f x) - f' (y - x)))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   320
    by (intro filterlim_cong) (simp_all add: eventually_at_filter)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   321
  finally have "?L (\<lambda>y. (f y - f x) - f' (y - x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   322
    by (rule tendsto_norm_zero_cancel)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   323
  then have "?L (\<lambda>y. ((f y - f x) - f' (y - x)) + f' (y - x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   324
    by (rule tendsto_eq_intros) (auto intro!: tendsto_eq_intros simp: F.zero)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   325
  then have "?L (\<lambda>y. f y - f x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   326
    by simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   327
  from tendsto_add[OF this tendsto_const, of "f x"] show ?thesis
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   328
    by (simp add: continuous_within)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   329
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   330
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   331
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   332
subsection \<open>Composition\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   333
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   334
lemma tendsto_at_iff_tendsto_nhds_within:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   335
  "f x = y \<Longrightarrow> (f \<longlongrightarrow> y) (at x within s) \<longleftrightarrow> (f \<longlongrightarrow> y) (inf (nhds x) (principal s))"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   336
  unfolding tendsto_def eventually_inf_principal eventually_at_filter
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61799
diff changeset
   337
  by (intro ext all_cong imp_cong) (auto elim!: eventually_mono)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   338
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   339
lemma has_derivative_in_compose:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   340
  assumes f: "(f has_derivative f') (at x within s)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   341
    and g: "(g has_derivative g') (at (f x) within (f`s))"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   342
  shows "((\<lambda>x. g (f x)) has_derivative (\<lambda>x. g' (f' x))) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   343
proof -
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   344
  from f interpret F: bounded_linear f'
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   345
    by (rule has_derivative_bounded_linear)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   346
  from g interpret G: bounded_linear g'
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   347
    by (rule has_derivative_bounded_linear)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   348
  from F.bounded obtain kF where kF: "\<And>x. norm (f' x) \<le> norm x * kF"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   349
    by fast
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   350
  from G.bounded obtain kG where kG: "\<And>x. norm (g' x) \<le> norm x * kG"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   351
    by fast
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   352
  note G.tendsto[tendsto_intros]
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   353
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   354
  let ?L = "\<lambda>f. (f \<longlongrightarrow> 0) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   355
  let ?D = "\<lambda>f f' x y. (f y - f x) - f' (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   356
  let ?N = "\<lambda>f f' x y. norm (?D f f' x y) / norm (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   357
  let ?gf = "\<lambda>x. g (f x)" and ?gf' = "\<lambda>x. g' (f' x)"
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
   358
  define Nf where "Nf = ?N f f' x"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
   359
  define Ng where [abs_def]: "Ng y = ?N g g' (f x) (f y)" for y
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   360
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   361
  show ?thesis
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   362
  proof (rule has_derivativeI_sandwich[of 1])
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   363
    show "bounded_linear (\<lambda>x. g' (f' x))"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   364
      using f g by (blast intro: bounded_linear_compose has_derivative_bounded_linear)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   365
  next
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   366
    fix y :: 'a
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   367
    assume neq: "y \<noteq> x"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   368
    have "?N ?gf ?gf' x y = norm (g' (?D f f' x y) + ?D g g' (f x) (f y)) / norm (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   369
      by (simp add: G.diff G.add field_simps)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   370
    also have "\<dots> \<le> norm (g' (?D f f' x y)) / norm (y - x) + Ng y * (norm (f y - f x) / norm (y - x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   371
      by (simp add: add_divide_distrib[symmetric] divide_right_mono norm_triangle_ineq G.zero Ng_def)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   372
    also have "\<dots> \<le> Nf y * kG + Ng y * (Nf y + kF)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   373
    proof (intro add_mono mult_left_mono)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   374
      have "norm (f y - f x) = norm (?D f f' x y + f' (y - x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   375
        by simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   376
      also have "\<dots> \<le> norm (?D f f' x y) + norm (f' (y - x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   377
        by (rule norm_triangle_ineq)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   378
      also have "\<dots> \<le> norm (?D f f' x y) + norm (y - x) * kF"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   379
        using kF by (intro add_mono) simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   380
      finally show "norm (f y - f x) / norm (y - x) \<le> Nf y + kF"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   381
        by (simp add: neq Nf_def field_simps)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   382
    qed (use kG in \<open>simp_all add: Ng_def Nf_def neq zero_le_divide_iff field_simps\<close>)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   383
    finally show "?N ?gf ?gf' x y \<le> Nf y * kG + Ng y * (Nf y + kF)" .
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   384
  next
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   385
    have [tendsto_intros]: "?L Nf"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   386
      using f unfolding has_derivative_iff_norm Nf_def ..
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   387
    from f have "(f \<longlongrightarrow> f x) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   388
      by (blast intro: has_derivative_continuous continuous_within[THEN iffD1])
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   389
    then have f': "LIM x at x within s. f x :> inf (nhds (f x)) (principal (f`s))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   390
      unfolding filterlim_def
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   391
      by (simp add: eventually_filtermap eventually_at_filter le_principal)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   392
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   393
    have "((?N g  g' (f x)) \<longlongrightarrow> 0) (at (f x) within f`s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   394
      using g unfolding has_derivative_iff_norm ..
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   395
    then have g': "((?N g  g' (f x)) \<longlongrightarrow> 0) (inf (nhds (f x)) (principal (f`s)))"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   396
      by (rule tendsto_at_iff_tendsto_nhds_within[THEN iffD1, rotated]) simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   397
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   398
    have [tendsto_intros]: "?L Ng"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   399
      unfolding Ng_def by (rule filterlim_compose[OF g' f'])
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   400
    show "((\<lambda>y. Nf y * kG + Ng y * (Nf y + kF)) \<longlongrightarrow> 0) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   401
      by (intro tendsto_eq_intros) auto
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   402
  qed simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   403
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   404
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   405
lemma has_derivative_compose:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   406
  "(f has_derivative f') (at x within s) \<Longrightarrow> (g has_derivative g') (at (f x)) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   407
  ((\<lambda>x. g (f x)) has_derivative (\<lambda>x. g' (f' x))) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   408
  by (blast intro: has_derivative_in_compose has_derivative_subset)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   409
67685
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   410
lemma has_derivative_in_compose2:
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   411
  assumes "\<And>x. x \<in> t \<Longrightarrow> (g has_derivative g' x) (at x within t)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   412
  assumes "f ` s \<subseteq> t" "x \<in> s"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   413
  assumes "(f has_derivative f') (at x within s)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   414
  shows "((\<lambda>x. g (f x)) has_derivative (\<lambda>y. g' (f x) (f' y))) (at x within s)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   415
  using assms
72445
2c2de074832e tidying and removal of legacy name
paulson <lp15@cam.ac.uk>
parents: 72245
diff changeset
   416
  by (auto intro: has_derivative_subset intro!: has_derivative_in_compose[of f f' x s g])
67685
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   417
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   418
lemma (in bounded_bilinear) FDERIV:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   419
  assumes f: "(f has_derivative f') (at x within s)" and g: "(g has_derivative g') (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   420
  shows "((\<lambda>x. f x ** g x) has_derivative (\<lambda>h. f x ** g' h + f' h ** g x)) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   421
proof -
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   422
  from bounded_linear.bounded [OF has_derivative_bounded_linear [OF f]]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   423
  obtain KF where norm_F: "\<And>x. norm (f' x) \<le> norm x * KF" by fast
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   424
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   425
  from pos_bounded obtain K
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   426
    where K: "0 < K" and norm_prod: "\<And>a b. norm (a ** b) \<le> norm a * norm b * K"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   427
    by fast
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   428
  let ?D = "\<lambda>f f' y. f y - f x - f' (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   429
  let ?N = "\<lambda>f f' y. norm (?D f f' y) / norm (y - x)"
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
   430
  define Ng where "Ng = ?N g g'"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
   431
  define Nf where "Nf = ?N f f'"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   432
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   433
  let ?fun1 = "\<lambda>y. norm (f y ** g y - f x ** g x - (f x ** g' (y - x) + f' (y - x) ** g x)) / norm (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   434
  let ?fun2 = "\<lambda>y. norm (f x) * Ng y * K + Nf y * norm (g y) * K + KF * norm (g y - g x) * K"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   435
  let ?F = "at x within s"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   436
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   437
  show ?thesis
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   438
  proof (rule has_derivativeI_sandwich[of 1])
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   439
    show "bounded_linear (\<lambda>h. f x ** g' h + f' h ** g x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   440
      by (intro bounded_linear_add
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   441
        bounded_linear_compose [OF bounded_linear_right] bounded_linear_compose [OF bounded_linear_left]
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   442
        has_derivative_bounded_linear [OF g] has_derivative_bounded_linear [OF f])
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   443
  next
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   444
    from g have "(g \<longlongrightarrow> g x) ?F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   445
      by (intro continuous_within[THEN iffD1] has_derivative_continuous)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   446
    moreover from f g have "(Nf \<longlongrightarrow> 0) ?F" "(Ng \<longlongrightarrow> 0) ?F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   447
      by (simp_all add: has_derivative_iff_norm Ng_def Nf_def)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   448
    ultimately have "(?fun2 \<longlongrightarrow> norm (f x) * 0 * K + 0 * norm (g x) * K + KF * norm (0::'b) * K) ?F"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   449
      by (intro tendsto_intros) (simp_all add: LIM_zero_iff)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   450
    then show "(?fun2 \<longlongrightarrow> 0) ?F"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   451
      by simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   452
  next
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   453
    fix y :: 'd
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   454
    assume "y \<noteq> x"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   455
    have "?fun1 y =
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   456
        norm (f x ** ?D g g' y + ?D f f' y ** g y + f' (y - x) ** (g y - g x)) / norm (y - x)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   457
      by (simp add: diff_left diff_right add_left add_right field_simps)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   458
    also have "\<dots> \<le> (norm (f x) * norm (?D g g' y) * K + norm (?D f f' y) * norm (g y) * K +
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   459
        norm (y - x) * KF * norm (g y - g x) * K) / norm (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   460
      by (intro divide_right_mono mult_mono'
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   461
                order_trans [OF norm_triangle_ineq add_mono]
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   462
                order_trans [OF norm_prod mult_right_mono]
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   463
                mult_nonneg_nonneg order_refl norm_ge_zero norm_F
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   464
                K [THEN order_less_imp_le])
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   465
    also have "\<dots> = ?fun2 y"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   466
      by (simp add: add_divide_distrib Ng_def Nf_def)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   467
    finally show "?fun1 y \<le> ?fun2 y" .
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   468
  qed simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   469
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   470
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   471
lemmas has_derivative_mult[simp, derivative_intros] = bounded_bilinear.FDERIV[OF bounded_bilinear_mult]
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   472
lemmas has_derivative_scaleR[simp, derivative_intros] = bounded_bilinear.FDERIV[OF bounded_bilinear_scaleR]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   473
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   474
lemma has_derivative_prod[simp, derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   475
  fixes f :: "'i \<Rightarrow> 'a::real_normed_vector \<Rightarrow> 'b::real_normed_field"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   476
  shows "(\<And>i. i \<in> I \<Longrightarrow> (f i has_derivative f' i) (at x within S)) \<Longrightarrow>
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   477
    ((\<lambda>x. \<Prod>i\<in>I. f i x) has_derivative (\<lambda>y. \<Sum>i\<in>I. f' i y * (\<Prod>j\<in>I - {i}. f j x))) (at x within S)"
63915
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   478
proof (induct I rule: infinite_finite_induct)
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   479
  case infinite
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   480
  then show ?case by simp
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   481
next
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   482
  case empty
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   483
  then show ?case by simp
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   484
next
63915
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   485
  case (insert i I)
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   486
  let ?P = "\<lambda>y. f i x * (\<Sum>i\<in>I. f' i y * (\<Prod>j\<in>I - {i}. f j x)) + (f' i y) * (\<Prod>i\<in>I. f i x)"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   487
  have "((\<lambda>x. f i x * (\<Prod>i\<in>I. f i x)) has_derivative ?P) (at x within S)"
63915
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   488
    using insert by (intro has_derivative_mult) auto
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   489
  also have "?P = (\<lambda>y. \<Sum>i'\<in>insert i I. f' i' y * (\<Prod>j\<in>insert i I - {i'}. f j x))"
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   490
    using insert(1,2)
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63952
diff changeset
   491
    by (auto simp add: sum_distrib_left insert_Diff_if intro!: ext sum.cong)
63915
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   492
  finally show ?case
bab633745c7f tuned proofs;
wenzelm
parents: 63717
diff changeset
   493
    using insert by simp
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   494
qed
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   495
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   496
lemma has_derivative_power[simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   497
  fixes f :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   498
  assumes f: "(f has_derivative f') (at x within S)"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   499
  shows "((\<lambda>x. f x^n) has_derivative (\<lambda>y. of_nat n * f' y * f x^(n - 1))) (at x within S)"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   500
  using has_derivative_prod[OF f, of "{..< n}"] by (simp add: prod_constant ac_simps)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   501
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   502
lemma has_derivative_inverse':
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   503
  fixes x :: "'a::real_normed_div_algebra"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   504
  assumes x: "x \<noteq> 0"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   505
  shows "(inverse has_derivative (\<lambda>h. - (inverse x * h * inverse x))) (at x within S)"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   506
    (is "(_ has_derivative ?f) _")
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   507
proof (rule has_derivativeI_sandwich)
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   508
  show "bounded_linear (\<lambda>h. - (inverse x * h * inverse x))"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   509
    by (simp add: bounded_linear_minus bounded_linear_mult_const bounded_linear_mult_right)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   510
  show "0 < norm x" using x by simp
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   511
  have "(inverse \<longlongrightarrow> inverse x) (at x within S)"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   512
    using tendsto_inverse tendsto_ident_at x by auto
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   513
  then show "((\<lambda>y. norm (inverse y - inverse x) * norm (inverse x)) \<longlongrightarrow> 0) (at x within S)"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   514
    by (simp add: LIM_zero_iff tendsto_mult_left_zero tendsto_norm_zero)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   515
next
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   516
  fix y :: 'a
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   517
  assume h: "y \<noteq> x" "dist y x < norm x"
62397
5ae24f33d343 Substantial new material for multivariate analysis. Also removal of some duplicates.
paulson <lp15@cam.ac.uk>
parents: 61976
diff changeset
   518
  then have "y \<noteq> 0" by auto
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   519
  have "norm (inverse y - inverse x - ?f (y -x)) / norm (y - x) 
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   520
        = norm (- (inverse y * (y - x) * inverse x - inverse x * (y - x) * inverse x)) /
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   521
                norm (y - x)"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   522
    by (simp add: \<open>y \<noteq> 0\<close> inverse_diff_inverse x)
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   523
  also have "... = norm ((inverse y - inverse x) * (y - x) * inverse x) / norm (y - x)"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   524
    by (simp add: left_diff_distrib norm_minus_commute)
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   525
  also have "\<dots> \<le> norm (inverse y - inverse x) * norm (y - x) * norm (inverse x) / norm (y - x)"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   526
    by (simp add: norm_mult)
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   527
  also have "\<dots> = norm (inverse y - inverse x) * norm (inverse x)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   528
    by simp
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   529
  finally show "norm (inverse y - inverse x - ?f (y -x)) / norm (y - x) \<le>
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   530
    norm (inverse y - inverse x) * norm (inverse x)" .
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   531
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   532
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   533
lemma has_derivative_inverse[simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   534
  fixes f :: "_ \<Rightarrow> 'a::real_normed_div_algebra"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   535
  assumes x:  "f x \<noteq> 0"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   536
    and f: "(f has_derivative f') (at x within S)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   537
  shows "((\<lambda>x. inverse (f x)) has_derivative (\<lambda>h. - (inverse (f x) * f' h * inverse (f x))))
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   538
    (at x within S)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   539
  using has_derivative_compose[OF f has_derivative_inverse', OF x] .
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   540
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   541
lemma has_derivative_divide[simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   542
  fixes f :: "_ \<Rightarrow> 'a::real_normed_div_algebra"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   543
  assumes f: "(f has_derivative f') (at x within S)"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   544
    and g: "(g has_derivative g') (at x within S)"
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   545
  assumes x: "g x \<noteq> 0"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   546
  shows "((\<lambda>x. f x / g x) has_derivative
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   547
                (\<lambda>h. - f x * (inverse (g x) * g' h * inverse (g x)) + f' h / g x)) (at x within S)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   548
  using has_derivative_mult[OF f has_derivative_inverse[OF x g]]
56480
093ea91498e6 field_simps: better support for negation and division, and power
hoelzl
parents: 56479
diff changeset
   549
  by (simp add: field_simps)
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   550
71837
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   551
lemma has_derivative_power_int':
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   552
  fixes x :: "'a::real_normed_field"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   553
  assumes x: "x \<noteq> 0"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   554
  shows "((\<lambda>x. power_int x n) has_derivative (\<lambda>y. y * (of_int n * power_int x (n - 1)))) (at x within S)"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   555
proof (cases n rule: int_cases4)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   556
  case (nonneg n)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   557
  thus ?thesis using x
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   558
    by (cases "n = 0") (auto intro!: derivative_eq_intros simp: field_simps power_int_diff fun_eq_iff
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   559
                             simp flip: power_Suc)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   560
next
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   561
  case (neg n)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   562
  thus ?thesis using x
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   563
    by (auto intro!: derivative_eq_intros simp: field_simps power_int_diff power_int_minus
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   564
             simp flip: power_Suc power_Suc2 power_add)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   565
qed
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   566
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   567
lemma has_derivative_power_int[simp, derivative_intros]:
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   568
  fixes f :: "_ \<Rightarrow> 'a::real_normed_field"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   569
  assumes x:  "f x \<noteq> 0"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   570
    and f: "(f has_derivative f') (at x within S)"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   571
  shows "((\<lambda>x. power_int (f x) n) has_derivative (\<lambda>h. f' h * (of_int n * power_int (f x) (n - 1))))
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   572
           (at x within S)"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   573
  using has_derivative_compose[OF f has_derivative_power_int', OF x] .
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   574
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   575
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   576
text \<open>Conventional form requires mult-AC laws. Types real and complex only.\<close>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   577
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   578
lemma has_derivative_divide'[derivative_intros]:
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   579
  fixes f :: "_ \<Rightarrow> 'a::real_normed_field"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   580
  assumes f: "(f has_derivative f') (at x within S)"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   581
    and g: "(g has_derivative g') (at x within S)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   582
    and x: "g x \<noteq> 0"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   583
  shows "((\<lambda>x. f x / g x) has_derivative (\<lambda>h. (f' h * g x - f x * g' h) / (g x * g x))) (at x within S)"
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   584
proof -
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   585
  have "f' h / g x - f x * (inverse (g x) * g' h * inverse (g x)) =
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   586
      (f' h * g x - f x * g' h) / (g x * g x)" for h
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   587
    by (simp add: field_simps x)
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   588
  then show ?thesis
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   589
    using has_derivative_divide [OF f g] x
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   590
    by simp
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   591
qed
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   592
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   593
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   594
subsection \<open>Uniqueness\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   595
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   596
text \<open>
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
   597
This can not generally shown for \<^const>\<open>has_derivative\<close>, as we need to approach the point from
63627
6ddb43c6b711 rename HOL-Multivariate_Analysis to HOL-Analysis.
hoelzl
parents: 63558
diff changeset
   598
all directions. There is a proof in \<open>Analysis\<close> for \<open>euclidean_space\<close>.
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   599
\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   600
67685
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   601
lemma has_derivative_at2: "(f has_derivative f') (at x) \<longleftrightarrow>
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   602
    bounded_linear f' \<and> ((\<lambda>y. (1 / (norm(y - x))) *\<^sub>R (f y - (f x + f' (y - x)))) \<longlongrightarrow> 0) (at x)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   603
  using has_derivative_within [of f f' x UNIV]
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   604
  by simp
71827
5e315defb038 the Uniq quantifier
paulson <lp15@cam.ac.uk>
parents: 71029
diff changeset
   605
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   606
lemma has_derivative_zero_unique:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   607
  assumes "((\<lambda>x. 0) has_derivative F) (at x)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   608
  shows "F = (\<lambda>h. 0)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   609
proof -
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   610
  interpret F: bounded_linear F
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   611
    using assms by (rule has_derivative_bounded_linear)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   612
  let ?r = "\<lambda>h. norm (F h) / norm h"
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
   613
  have *: "?r \<midarrow>0\<rightarrow> 0"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   614
    using assms unfolding has_derivative_at by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   615
  show "F = (\<lambda>h. 0)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   616
  proof
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   617
    show "F h = 0" for h
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   618
    proof (rule ccontr)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   619
      assume **: "\<not> ?thesis"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   620
      then have h: "h \<noteq> 0"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   621
        by (auto simp add: F.zero)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   622
      with ** have "0 < ?r h"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   623
        by simp
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   624
      from LIM_D [OF * this] obtain S
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   625
        where S: "0 < S" and r: "\<And>x. x \<noteq> 0 \<Longrightarrow> norm x < S \<Longrightarrow> ?r x < ?r h"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   626
        by auto
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   627
      from dense [OF S] obtain t where t: "0 < t \<and> t < S" ..
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   628
      let ?x = "scaleR (t / norm h) h"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   629
      have "?x \<noteq> 0" and "norm ?x < S"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   630
        using t h by simp_all
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   631
      then have "?r ?x < ?r h"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   632
        by (rule r)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   633
      then show False
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   634
        using t h by (simp add: F.scaleR)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   635
    qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   636
  qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   637
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   638
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   639
lemma has_derivative_unique:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   640
  assumes "(f has_derivative F) (at x)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   641
    and "(f has_derivative F') (at x)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   642
  shows "F = F'"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   643
proof -
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   644
  have "((\<lambda>x. 0) has_derivative (\<lambda>h. F h - F' h)) (at x)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   645
    using has_derivative_diff [OF assms] by simp
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   646
  then have "(\<lambda>h. F h - F' h) = (\<lambda>h. 0)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   647
    by (rule has_derivative_zero_unique)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   648
  then show "F = F'"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   649
    unfolding fun_eq_iff right_minus_eq .
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   650
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   651
71827
5e315defb038 the Uniq quantifier
paulson <lp15@cam.ac.uk>
parents: 71029
diff changeset
   652
lemma has_derivative_Uniq: "\<exists>\<^sub>\<le>\<^sub>1F. (f has_derivative F) (at x)"
5e315defb038 the Uniq quantifier
paulson <lp15@cam.ac.uk>
parents: 71029
diff changeset
   653
  by (simp add: Uniq_def has_derivative_unique)
5e315defb038 the Uniq quantifier
paulson <lp15@cam.ac.uk>
parents: 71029
diff changeset
   654
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   655
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   656
subsection \<open>Differentiability predicate\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   657
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   658
definition differentiable :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a filter \<Rightarrow> bool"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   659
    (infix "differentiable" 50)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   660
  where "f differentiable F \<longleftrightarrow> (\<exists>D. (f has_derivative D) F)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   661
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   662
lemma differentiable_subset:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   663
  "f differentiable (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow> f differentiable (at x within t)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   664
  unfolding differentiable_def by (blast intro: has_derivative_subset)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   665
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   666
lemmas differentiable_within_subset = differentiable_subset
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   667
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   668
lemma differentiable_ident [simp, derivative_intros]: "(\<lambda>x. x) differentiable F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   669
  unfolding differentiable_def by (blast intro: has_derivative_ident)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   670
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   671
lemma differentiable_const [simp, derivative_intros]: "(\<lambda>z. a) differentiable F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   672
  unfolding differentiable_def by (blast intro: has_derivative_const)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   673
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   674
lemma differentiable_in_compose:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   675
  "f differentiable (at (g x) within (g`s)) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   676
    (\<lambda>x. f (g x)) differentiable (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   677
  unfolding differentiable_def by (blast intro: has_derivative_in_compose)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   678
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   679
lemma differentiable_compose:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   680
  "f differentiable (at (g x)) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   681
    (\<lambda>x. f (g x)) differentiable (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   682
  by (blast intro: differentiable_in_compose differentiable_subset)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   683
67685
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   684
lemma differentiable_add [simp, derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   685
  "f differentiable F \<Longrightarrow> g differentiable F \<Longrightarrow> (\<lambda>x. f x + g x) differentiable F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   686
  unfolding differentiable_def by (blast intro: has_derivative_add)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   687
67685
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   688
lemma differentiable_sum[simp, derivative_intros]:
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   689
  assumes "finite s" "\<forall>a\<in>s. (f a) differentiable net"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   690
  shows "(\<lambda>x. sum (\<lambda>a. f a x) s) differentiable net"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   691
proof -
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   692
  from bchoice[OF assms(2)[unfolded differentiable_def]]
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   693
  show ?thesis
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   694
    by (auto intro!: has_derivative_sum simp: differentiable_def)
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   695
qed
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   696
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   697
lemma differentiable_minus [simp, derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   698
  "f differentiable F \<Longrightarrow> (\<lambda>x. - f x) differentiable F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   699
  unfolding differentiable_def by (blast intro: has_derivative_minus)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   700
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   701
lemma differentiable_diff [simp, derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   702
  "f differentiable F \<Longrightarrow> g differentiable F \<Longrightarrow> (\<lambda>x. f x - g x) differentiable F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   703
  unfolding differentiable_def by (blast intro: has_derivative_diff)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   704
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   705
lemma differentiable_mult [simp, derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   706
  fixes f g :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_algebra"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   707
  shows "f differentiable (at x within s) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   708
    (\<lambda>x. f x * g x) differentiable (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   709
  unfolding differentiable_def by (blast intro: has_derivative_mult)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   710
73795
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   711
lemma differentiable_cmult_left_iff [simp]:
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   712
  fixes c::"'a::real_normed_field" 
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   713
  shows "(\<lambda>t. c * q t) differentiable at t \<longleftrightarrow> c = 0 \<or> (\<lambda>t. q t) differentiable at t" (is "?lhs = ?rhs")
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   714
proof
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   715
  assume L: ?lhs
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   716
  {assume "c \<noteq> 0"
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   717
    then have "q differentiable at t"
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   718
      using differentiable_mult [OF differentiable_const L, of concl: "1/c"] by auto
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   719
  } then show ?rhs
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   720
    by auto
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   721
qed auto
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   722
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   723
lemma differentiable_cmult_right_iff [simp]:
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   724
  fixes c::"'a::real_normed_field" 
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   725
  shows "(\<lambda>t. q t * c) differentiable at t \<longleftrightarrow> c = 0 \<or> (\<lambda>t. q t) differentiable at t" (is "?lhs = ?rhs")
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   726
  by (simp add: mult.commute flip: differentiable_cmult_left_iff)
8893e0ed263a new lemmas mostly about paths
paulson <lp15@cam.ac.uk>
parents: 72445
diff changeset
   727
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   728
lemma differentiable_inverse [simp, derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   729
  fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_field"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   730
  shows "f differentiable (at x within s) \<Longrightarrow> f x \<noteq> 0 \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   731
    (\<lambda>x. inverse (f x)) differentiable (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   732
  unfolding differentiable_def by (blast intro: has_derivative_inverse)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   733
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   734
lemma differentiable_divide [simp, derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   735
  fixes f g :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_field"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   736
  shows "f differentiable (at x within s) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   737
    g x \<noteq> 0 \<Longrightarrow> (\<lambda>x. f x / g x) differentiable (at x within s)"
63092
a949b2a5f51d eliminated use of empty "assms";
wenzelm
parents: 63079
diff changeset
   738
  unfolding divide_inverse by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   739
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   740
lemma differentiable_power [simp, derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   741
  fixes f g :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_field"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   742
  shows "f differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f x ^ n) differentiable (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   743
  unfolding differentiable_def by (blast intro: has_derivative_power)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   744
71837
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   745
lemma differentiable_power_int [simp, derivative_intros]:
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   746
  fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_field"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   747
  shows "f differentiable (at x within s) \<Longrightarrow> f x \<noteq> 0 \<Longrightarrow>
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   748
           (\<lambda>x. power_int (f x) n) differentiable (at x within s)"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   749
  unfolding differentiable_def by (blast intro: has_derivative_power_int)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
   750
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   751
lemma differentiable_scaleR [simp, derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   752
  "f differentiable (at x within s) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   753
    (\<lambda>x. f x *\<^sub>R g x) differentiable (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   754
  unfolding differentiable_def by (blast intro: has_derivative_scaleR)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   755
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   756
lemma has_derivative_imp_has_field_derivative:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   757
  "(f has_derivative D) F \<Longrightarrow> (\<And>x. x * D' = D x) \<Longrightarrow> (f has_field_derivative D') F"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   758
  unfolding has_field_derivative_def
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
   759
  by (rule has_derivative_eq_rhs[of f D]) (simp_all add: fun_eq_iff mult.commute)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   760
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   761
lemma has_field_derivative_imp_has_derivative:
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 69022
diff changeset
   762
  "(f has_field_derivative D) F \<Longrightarrow> (f has_derivative (*) D) F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   763
  by (simp add: has_field_derivative_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   764
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   765
lemma DERIV_subset:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   766
  "(f has_field_derivative f') (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   767
    (f has_field_derivative f') (at x within t)"
72445
2c2de074832e tidying and removal of legacy name
paulson <lp15@cam.ac.uk>
parents: 72245
diff changeset
   768
  by (simp add: has_field_derivative_def has_derivative_subset)
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   769
59862
44b3f4fa33ca New material and binomial fix
paulson <lp15@cam.ac.uk>
parents: 59615
diff changeset
   770
lemma has_field_derivative_at_within:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   771
  "(f has_field_derivative f') (at x) \<Longrightarrow> (f has_field_derivative f') (at x within s)"
59862
44b3f4fa33ca New material and binomial fix
paulson <lp15@cam.ac.uk>
parents: 59615
diff changeset
   772
  using DERIV_subset by blast
44b3f4fa33ca New material and binomial fix
paulson <lp15@cam.ac.uk>
parents: 59615
diff changeset
   773
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   774
abbreviation (input)
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   775
  DERIV :: "('a::real_normed_field \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a \<Rightarrow> bool"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   776
    ("(DERIV (_)/ (_)/ :> (_))" [1000, 1000, 60] 60)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   777
  where "DERIV f x :> D \<equiv> (f has_field_derivative D) (at x)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   778
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   779
abbreviation has_real_derivative :: "(real \<Rightarrow> real) \<Rightarrow> real \<Rightarrow> real filter \<Rightarrow> bool"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   780
    (infix "(has'_real'_derivative)" 50)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   781
  where "(f has_real_derivative D) F \<equiv> (f has_field_derivative D) F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   782
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   783
lemma real_differentiable_def:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   784
  "f differentiable at x within s \<longleftrightarrow> (\<exists>D. (f has_real_derivative D) (at x within s))"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   785
proof safe
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   786
  assume "f differentiable at x within s"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   787
  then obtain f' where *: "(f has_derivative f') (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   788
    unfolding differentiable_def by auto
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 69022
diff changeset
   789
  then obtain c where "f' = ((*) c)"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
   790
    by (metis real_bounded_linear has_derivative_bounded_linear mult.commute fun_eq_iff)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   791
  with * show "\<exists>D. (f has_real_derivative D) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   792
    unfolding has_field_derivative_def by auto
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   793
qed (auto simp: differentiable_def has_field_derivative_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   794
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   795
lemma real_differentiableE [elim?]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   796
  assumes f: "f differentiable (at x within s)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   797
  obtains df where "(f has_real_derivative df) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   798
  using assms by (auto simp: real_differentiable_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   799
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   800
lemma has_field_derivative_iff:
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   801
  "(f has_field_derivative D) (at x within S) \<longleftrightarrow>
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   802
    ((\<lambda>y. (f y - f x) / (y - x)) \<longlongrightarrow> D) (at x within S)"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   803
proof -
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   804
  have "((\<lambda>y. norm (f y - f x - D * (y - x)) / norm (y - x)) \<longlongrightarrow> 0) (at x within S) 
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   805
      = ((\<lambda>y. (f y - f x) / (y - x) - D) \<longlongrightarrow> 0) (at x within S)"
75243
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   806
    by (smt (verit, best) Lim_cong_within divide_diff_eq_iff norm_divide right_minus_eq tendsto_norm_zero_iff)
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   807
  then show ?thesis
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   808
    by (simp add: has_field_derivative_def has_derivative_iff_norm bounded_linear_mult_right LIM_zero_iff)
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   809
qed
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   810
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   811
lemma DERIV_def: "DERIV f x :> D \<longleftrightarrow> (\<lambda>h. (f (x + h) - f x) / h) \<midarrow>0\<rightarrow> D"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   812
  unfolding field_has_derivative_at has_field_derivative_def has_field_derivative_iff ..
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   813
75243
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   814
text \<open>due to Christian Pardillo Laursen, replacing a proper epsilon-delta horror\<close>
73885
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
   815
lemma field_derivative_lim_unique:
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
   816
  assumes f: "(f has_field_derivative df) (at z)"
75243
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   817
    and s: "s \<longlonglongrightarrow> 0"  "\<And>n. s n \<noteq> 0" 
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   818
    and a: "(\<lambda>n. (f (z + s n) - f z) / s n) \<longlonglongrightarrow> a"
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   819
  shows "df = a"
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   820
proof -
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   821
  have "((\<lambda>k. (f (z + k) - f z) / k) \<longlongrightarrow> df) (at 0)"
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   822
    using f by (simp add: DERIV_def)
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   823
  with s have "((\<lambda>n. (f (z + s n) - f z) / s n) \<longlonglongrightarrow> df)"
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   824
    by (simp flip: LIMSEQ_SEQ_conv)
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   825
  then show ?thesis
a2b8394ce1f1 Tidied some messy proofs
paulson <lp15@cam.ac.uk>
parents: 74878
diff changeset
   826
    using a by (rule LIMSEQ_unique)
73885
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
   827
qed
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
   828
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 69022
diff changeset
   829
lemma mult_commute_abs: "(\<lambda>x. x * c) = (*) c"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   830
  for c :: "'a::ab_semigroup_mult"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
   831
  by (simp add: fun_eq_iff mult.commute)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   832
67685
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   833
lemma DERIV_compose_FDERIV:
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   834
  fixes f::"real\<Rightarrow>real"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   835
  assumes "DERIV f (g x) :> f'"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   836
  assumes "(g has_derivative g') (at x within s)"
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   837
  shows "((\<lambda>x. f (g x)) has_derivative (\<lambda>x. g' x * f')) (at x within s)"
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 69022
diff changeset
   838
  using assms has_derivative_compose[of g g' x s f "(*) f'"]
67685
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   839
  by (auto simp: has_field_derivative_def ac_simps)
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
   840
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   841
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   842
subsection \<open>Vector derivative\<close>
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   843
75462
7448423e5dba Renamed the misleading has_field_derivative_iff_has_vector_derivative. Inserted a number of minor lemmas
paulson <lp15@cam.ac.uk>
parents: 75243
diff changeset
   844
text \<open>It's for real derivatives only, and not obviously generalisable to field derivatives\<close>
7448423e5dba Renamed the misleading has_field_derivative_iff_has_vector_derivative. Inserted a number of minor lemmas
paulson <lp15@cam.ac.uk>
parents: 75243
diff changeset
   845
lemma has_real_derivative_iff_has_vector_derivative:
7448423e5dba Renamed the misleading has_field_derivative_iff_has_vector_derivative. Inserted a number of minor lemmas
paulson <lp15@cam.ac.uk>
parents: 75243
diff changeset
   846
  "(f has_real_derivative y) F \<longleftrightarrow> (f has_vector_derivative y) F"
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   847
  unfolding has_vector_derivative_def has_field_derivative_def real_scaleR_def mult_commute_abs ..
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   848
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   849
lemma has_field_derivative_subset:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   850
  "(f has_field_derivative y) (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   851
    (f has_field_derivative y) (at x within t)"
75462
7448423e5dba Renamed the misleading has_field_derivative_iff_has_vector_derivative. Inserted a number of minor lemmas
paulson <lp15@cam.ac.uk>
parents: 75243
diff changeset
   852
  by (fact DERIV_subset)
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   853
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   854
lemma has_vector_derivative_const[simp, derivative_intros]: "((\<lambda>x. c) has_vector_derivative 0) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   855
  by (auto simp: has_vector_derivative_def)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   856
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   857
lemma has_vector_derivative_id[simp, derivative_intros]: "((\<lambda>x. x) has_vector_derivative 1) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   858
  by (auto simp: has_vector_derivative_def)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   859
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   860
lemma has_vector_derivative_minus[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   861
  "(f has_vector_derivative f') net \<Longrightarrow> ((\<lambda>x. - f x) has_vector_derivative (- f')) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   862
  by (auto simp: has_vector_derivative_def)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   863
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   864
lemma has_vector_derivative_add[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   865
  "(f has_vector_derivative f') net \<Longrightarrow> (g has_vector_derivative g') net \<Longrightarrow>
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   866
    ((\<lambda>x. f x + g x) has_vector_derivative (f' + g')) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   867
  by (auto simp: has_vector_derivative_def scaleR_right_distrib)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   868
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63952
diff changeset
   869
lemma has_vector_derivative_sum[derivative_intros]:
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   870
  "(\<And>i. i \<in> I \<Longrightarrow> (f i has_vector_derivative f' i) net) \<Longrightarrow>
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   871
    ((\<lambda>x. \<Sum>i\<in>I. f i x) has_vector_derivative (\<Sum>i\<in>I. f' i)) net"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63952
diff changeset
   872
  by (auto simp: has_vector_derivative_def fun_eq_iff scaleR_sum_right intro!: derivative_eq_intros)
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   873
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   874
lemma has_vector_derivative_diff[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   875
  "(f has_vector_derivative f') net \<Longrightarrow> (g has_vector_derivative g') net \<Longrightarrow>
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   876
    ((\<lambda>x. f x - g x) has_vector_derivative (f' - g')) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   877
  by (auto simp: has_vector_derivative_def scaleR_diff_right)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   878
61204
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   879
lemma has_vector_derivative_add_const:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   880
  "((\<lambda>t. g t + z) has_vector_derivative f') net = ((\<lambda>t. g t) has_vector_derivative f') net"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   881
  apply (intro iffI)
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   882
   apply (force dest: has_vector_derivative_diff [where g = "\<lambda>t. z", OF _ has_vector_derivative_const])
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
   883
  apply (force dest: has_vector_derivative_add [OF _ has_vector_derivative_const])
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   884
  done
61204
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   885
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   886
lemma has_vector_derivative_diff_const:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   887
  "((\<lambda>t. g t - z) has_vector_derivative f') net = ((\<lambda>t. g t) has_vector_derivative f') net"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   888
  using has_vector_derivative_add_const [where z = "-z"]
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   889
  by simp
61204
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   890
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   891
lemma (in bounded_linear) has_vector_derivative:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   892
  assumes "(g has_vector_derivative g') F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   893
  shows "((\<lambda>x. f (g x)) has_vector_derivative f g') F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   894
  using has_derivative[OF assms[unfolded has_vector_derivative_def]]
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   895
  by (simp add: has_vector_derivative_def scaleR)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   896
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   897
lemma (in bounded_bilinear) has_vector_derivative:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   898
  assumes "(f has_vector_derivative f') (at x within s)"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   899
    and "(g has_vector_derivative g') (at x within s)"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   900
  shows "((\<lambda>x. f x ** g x) has_vector_derivative (f x ** g' + f' ** g x)) (at x within s)"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   901
  using FDERIV[OF assms(1-2)[unfolded has_vector_derivative_def]]
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   902
  by (simp add: has_vector_derivative_def scaleR_right scaleR_left scaleR_right_distrib)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   903
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   904
lemma has_vector_derivative_scaleR[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   905
  "(f has_field_derivative f') (at x within s) \<Longrightarrow> (g has_vector_derivative g') (at x within s) \<Longrightarrow>
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   906
    ((\<lambda>x. f x *\<^sub>R g x) has_vector_derivative (f x *\<^sub>R g' + f' *\<^sub>R g x)) (at x within s)"
75462
7448423e5dba Renamed the misleading has_field_derivative_iff_has_vector_derivative. Inserted a number of minor lemmas
paulson <lp15@cam.ac.uk>
parents: 75243
diff changeset
   907
  unfolding has_real_derivative_iff_has_vector_derivative
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   908
  by (rule bounded_bilinear.has_vector_derivative[OF bounded_bilinear_scaleR])
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   909
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   910
lemma has_vector_derivative_mult[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   911
  "(f has_vector_derivative f') (at x within s) \<Longrightarrow> (g has_vector_derivative g') (at x within s) \<Longrightarrow>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   912
    ((\<lambda>x. f x * g x) has_vector_derivative (f x * g' + f' * g x)) (at x within s)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   913
  for f g :: "real \<Rightarrow> 'a::real_normed_algebra"
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   914
  by (rule bounded_bilinear.has_vector_derivative[OF bounded_bilinear_mult])
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   915
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   916
lemma has_vector_derivative_of_real[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   917
  "(f has_field_derivative D) F \<Longrightarrow> ((\<lambda>x. of_real (f x)) has_vector_derivative (of_real D)) F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   918
  by (rule bounded_linear.has_vector_derivative[OF bounded_linear_of_real])
75462
7448423e5dba Renamed the misleading has_field_derivative_iff_has_vector_derivative. Inserted a number of minor lemmas
paulson <lp15@cam.ac.uk>
parents: 75243
diff changeset
   919
    (simp add: has_real_derivative_iff_has_vector_derivative)
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   920
70707
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
   921
lemma has_vector_derivative_real_field:
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
   922
  "(f has_field_derivative f') (at (of_real a)) \<Longrightarrow> ((\<lambda>x. f (of_real x)) has_vector_derivative f') (at a within s)"
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
   923
  using has_derivative_compose[of of_real of_real a _ f "(*) f'"] 
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
   924
  by (simp add: scaleR_conv_of_real ac_simps has_vector_derivative_def has_field_derivative_def)
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
   925
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   926
lemma has_vector_derivative_continuous:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   927
  "(f has_vector_derivative D) (at x within s) \<Longrightarrow> continuous (at x within s) f"
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   928
  by (auto intro: has_derivative_continuous simp: has_vector_derivative_def)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   929
70613
8b7f6ecb3369 moved basic theorem
immler
parents: 70346
diff changeset
   930
lemma continuous_on_vector_derivative:
8b7f6ecb3369 moved basic theorem
immler
parents: 70346
diff changeset
   931
  "(\<And>x. x \<in> S \<Longrightarrow> (f has_vector_derivative f' x) (at x within S)) \<Longrightarrow> continuous_on S f"
8b7f6ecb3369 moved basic theorem
immler
parents: 70346
diff changeset
   932
  by (auto simp: continuous_on_eq_continuous_within intro!: has_vector_derivative_continuous)
8b7f6ecb3369 moved basic theorem
immler
parents: 70346
diff changeset
   933
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   934
lemma has_vector_derivative_mult_right[derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   935
  fixes a :: "'a::real_normed_algebra"
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   936
  shows "(f has_vector_derivative x) F \<Longrightarrow> ((\<lambda>x. a * f x) has_vector_derivative (a * x)) F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   937
  by (rule bounded_linear.has_vector_derivative[OF bounded_linear_mult_right])
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   938
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   939
lemma has_vector_derivative_mult_left[derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   940
  fixes a :: "'a::real_normed_algebra"
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   941
  shows "(f has_vector_derivative x) F \<Longrightarrow> ((\<lambda>x. f x * a) has_vector_derivative (x * a)) F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   942
  by (rule bounded_linear.has_vector_derivative[OF bounded_linear_mult_left])
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   943
74007
df976eefcba0 A few new lemmas and simplifications
paulson <lp15@cam.ac.uk>
parents: 73933
diff changeset
   944
lemma has_vector_derivative_divide[derivative_intros]:
df976eefcba0 A few new lemmas and simplifications
paulson <lp15@cam.ac.uk>
parents: 73933
diff changeset
   945
  fixes a :: "'a::real_normed_field"
df976eefcba0 A few new lemmas and simplifications
paulson <lp15@cam.ac.uk>
parents: 73933
diff changeset
   946
  shows "(f has_vector_derivative x) F \<Longrightarrow> ((\<lambda>x. f x / a) has_vector_derivative (x / a)) F"
df976eefcba0 A few new lemmas and simplifications
paulson <lp15@cam.ac.uk>
parents: 73933
diff changeset
   947
  using has_vector_derivative_mult_left [of f x F "inverse a"]
df976eefcba0 A few new lemmas and simplifications
paulson <lp15@cam.ac.uk>
parents: 73933
diff changeset
   948
  by (simp add: field_class.field_divide_inverse)
df976eefcba0 A few new lemmas and simplifications
paulson <lp15@cam.ac.uk>
parents: 73933
diff changeset
   949
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   950
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   951
subsection \<open>Derivatives\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   952
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
   953
lemma DERIV_D: "DERIV f x :> D \<Longrightarrow> (\<lambda>h. (f (x + h) - f x) / h) \<midarrow>0\<rightarrow> D"
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   954
  by (simp add: DERIV_def)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   955
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   956
lemma has_field_derivativeD:
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   957
  "(f has_field_derivative D) (at x within S) \<Longrightarrow>
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   958
    ((\<lambda>y. (f y - f x) / (y - x)) \<longlongrightarrow> D) (at x within S)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   959
  by (simp add: has_field_derivative_iff)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   960
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   961
lemma DERIV_const [simp, derivative_intros]: "((\<lambda>x. k) has_field_derivative 0) F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   962
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_const]) auto
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   963
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   964
lemma DERIV_ident [simp, derivative_intros]: "((\<lambda>x. x) has_field_derivative 1) F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   965
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_ident]) auto
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   966
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   967
lemma field_differentiable_add[derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   968
  "(f has_field_derivative f') F \<Longrightarrow> (g has_field_derivative g') F \<Longrightarrow>
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   969
    ((\<lambda>z. f z + g z) has_field_derivative f' + g') F"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   970
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_add])
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   971
     (auto simp: has_field_derivative_def field_simps mult_commute_abs)
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   972
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   973
corollary DERIV_add:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   974
  "(f has_field_derivative D) (at x within s) \<Longrightarrow> (g has_field_derivative E) (at x within s) \<Longrightarrow>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   975
    ((\<lambda>x. f x + g x) has_field_derivative D + E) (at x within s)"
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   976
  by (rule field_differentiable_add)
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   977
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   978
lemma field_differentiable_minus[derivative_intros]:
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   979
  "(f has_field_derivative f') F \<Longrightarrow> ((\<lambda>z. - (f z)) has_field_derivative -f') F"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   980
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_minus])
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   981
     (auto simp: has_field_derivative_def field_simps mult_commute_abs)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   982
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   983
corollary DERIV_minus:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   984
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   985
    ((\<lambda>x. - f x) has_field_derivative -D) (at x within s)"
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   986
  by (rule field_differentiable_minus)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   987
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   988
lemma field_differentiable_diff[derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   989
  "(f has_field_derivative f') F \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   990
    (g has_field_derivative g') F \<Longrightarrow> ((\<lambda>z. f z - g z) has_field_derivative f' - g') F"
63092
a949b2a5f51d eliminated use of empty "assms";
wenzelm
parents: 63079
diff changeset
   991
  by (simp only: diff_conv_add_uminus field_differentiable_add field_differentiable_minus)
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   992
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   993
corollary DERIV_diff:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   994
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   995
    (g has_field_derivative E) (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
   996
    ((\<lambda>x. f x - g x) has_field_derivative D - E) (at x within s)"
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   997
  by (rule field_differentiable_diff)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   998
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   999
lemma DERIV_continuous: "(f has_field_derivative D) (at x within s) \<Longrightarrow> continuous (at x within s) f"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1000
  by (drule has_derivative_continuous[OF has_field_derivative_imp_has_derivative]) simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1001
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1002
corollary DERIV_isCont: "DERIV f x :> D \<Longrightarrow> isCont f x"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1003
  by (rule DERIV_continuous)
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1004
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1005
lemma DERIV_atLeastAtMost_imp_continuous_on:
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1006
  assumes "\<And>x. \<lbrakk>a \<le> x; x \<le> b\<rbrakk> \<Longrightarrow> \<exists>y. DERIV f x :> y"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1007
  shows "continuous_on {a..b} f"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1008
  by (meson DERIV_isCont assms atLeastAtMost_iff continuous_at_imp_continuous_at_within continuous_on_eq_continuous_within)
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1009
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1010
lemma DERIV_continuous_on:
63299
71805faedeb2 Integration by substitution
eberlm
parents: 63263
diff changeset
  1011
  "(\<And>x. x \<in> s \<Longrightarrow> (f has_field_derivative (D x)) (at x within s)) \<Longrightarrow> continuous_on s f"
71805faedeb2 Integration by substitution
eberlm
parents: 63263
diff changeset
  1012
  unfolding continuous_on_eq_continuous_within
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1013
  by (intro continuous_at_imp_continuous_on ballI DERIV_continuous)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1014
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1015
lemma DERIV_mult':
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1016
  "(f has_field_derivative D) (at x within s) \<Longrightarrow> (g has_field_derivative E) (at x within s) \<Longrightarrow>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1017
    ((\<lambda>x. f x * g x) has_field_derivative f x * E + D * g x) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1018
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_mult])
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1019
     (auto simp: field_simps mult_commute_abs dest: has_field_derivative_imp_has_derivative)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1020
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
  1021
lemma DERIV_mult[derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1022
  "(f has_field_derivative Da) (at x within s) \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1023
    ((\<lambda>x. f x * g x) has_field_derivative Da * g x + Db * f x) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1024
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_mult])
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1025
     (auto simp: field_simps dest: has_field_derivative_imp_has_derivative)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1026
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1027
text \<open>Derivative of linear multiplication\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1028
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1029
lemma DERIV_cmult:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1030
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1031
    ((\<lambda>x. c * f x) has_field_derivative c * D) (at x within s)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1032
  by (drule DERIV_mult' [OF DERIV_const]) simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1033
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1034
lemma DERIV_cmult_right:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1035
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1036
    ((\<lambda>x. f x * c) has_field_derivative D * c) (at x within s)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1037
  using DERIV_cmult by (auto simp add: ac_simps)
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1038
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 69022
diff changeset
  1039
lemma DERIV_cmult_Id [simp]: "((*) c has_field_derivative c) (at x within s)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1040
  using DERIV_ident [THEN DERIV_cmult, where c = c and x = x] by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1041
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1042
lemma DERIV_cdivide:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1043
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1044
    ((\<lambda>x. f x / c) has_field_derivative D / c) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1045
  using DERIV_cmult_right[of f D x s "1 / c"] by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1046
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1047
lemma DERIV_unique: "DERIV f x :> D \<Longrightarrow> DERIV f x :> E \<Longrightarrow> D = E"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1048
  unfolding DERIV_def by (rule LIM_unique)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1049
71827
5e315defb038 the Uniq quantifier
paulson <lp15@cam.ac.uk>
parents: 71029
diff changeset
  1050
lemma DERIV_Uniq: "\<exists>\<^sub>\<le>\<^sub>1D. DERIV f x :> D"
5e315defb038 the Uniq quantifier
paulson <lp15@cam.ac.uk>
parents: 71029
diff changeset
  1051
  by (simp add: DERIV_unique Uniq_def)
5e315defb038 the Uniq quantifier
paulson <lp15@cam.ac.uk>
parents: 71029
diff changeset
  1052
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63952
diff changeset
  1053
lemma DERIV_sum[derivative_intros]:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1054
  "(\<And> n. n \<in> S \<Longrightarrow> ((\<lambda>x. f x n) has_field_derivative (f' x n)) F) \<Longrightarrow>
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63952
diff changeset
  1055
    ((\<lambda>x. sum (f x) S) has_field_derivative sum (f' x) S) F"
b9a1486e79be setsum -> sum
nipkow
parents: 63952
diff changeset
  1056
  by (rule has_derivative_imp_has_field_derivative [OF has_derivative_sum])
b9a1486e79be setsum -> sum
nipkow
parents: 63952
diff changeset
  1057
     (auto simp: sum_distrib_left mult_commute_abs dest: has_field_derivative_imp_has_derivative)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1058
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
  1059
lemma DERIV_inverse'[derivative_intros]:
59867
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
  1060
  assumes "(f has_field_derivative D) (at x within s)"
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
  1061
    and "f x \<noteq> 0"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1062
  shows "((\<lambda>x. inverse (f x)) has_field_derivative - (inverse (f x) * D * inverse (f x)))
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1063
    (at x within s)"
59867
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
  1064
proof -
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 69022
diff changeset
  1065
  have "(f has_derivative (\<lambda>x. x * D)) = (f has_derivative (*) D)"
59867
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
  1066
    by (rule arg_cong [of "\<lambda>x. x * D"]) (simp add: fun_eq_iff)
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
  1067
  with assms have "(f has_derivative (\<lambda>x. x * D)) (at x within s)"
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
  1068
    by (auto dest!: has_field_derivative_imp_has_derivative)
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1069
  then show ?thesis using \<open>f x \<noteq> 0\<close>
59867
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
  1070
    by (auto intro: has_derivative_imp_has_field_derivative has_derivative_inverse)
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
  1071
qed
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1072
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
  1073
text \<open>Power of \<open>-1\<close>\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1074
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1075
lemma DERIV_inverse:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1076
  "x \<noteq> 0 \<Longrightarrow> ((\<lambda>x. inverse(x)) has_field_derivative - (inverse x ^ Suc (Suc 0))) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1077
  by (drule DERIV_inverse' [OF DERIV_ident]) simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1078
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1079
text \<open>Derivative of inverse\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1080
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1081
lemma DERIV_inverse_fun:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1082
  "(f has_field_derivative d) (at x within s) \<Longrightarrow> f x \<noteq> 0 \<Longrightarrow>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1083
    ((\<lambda>x. inverse (f x)) has_field_derivative (- (d * inverse(f x ^ Suc (Suc 0))))) (at x within s)"
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
  1084
  by (drule (1) DERIV_inverse') (simp add: ac_simps nonzero_inverse_mult_distrib)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1085
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1086
text \<open>Derivative of quotient\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1087
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
  1088
lemma DERIV_divide[derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1089
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1090
    (g has_field_derivative E) (at x within s) \<Longrightarrow> g x \<noteq> 0 \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1091
    ((\<lambda>x. f x / g x) has_field_derivative (D * g x - f x * E) / (g x * g x)) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1092
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_divide])
56480
093ea91498e6 field_simps: better support for negation and division, and power
hoelzl
parents: 56479
diff changeset
  1093
     (auto dest: has_field_derivative_imp_has_derivative simp: field_simps)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1094
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1095
lemma DERIV_quotient:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1096
  "(f has_field_derivative d) (at x within s) \<Longrightarrow>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1097
    (g has_field_derivative e) (at x within s)\<Longrightarrow> g x \<noteq> 0 \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1098
    ((\<lambda>y. f y / g y) has_field_derivative (d * g x - (e * f x)) / (g x ^ Suc (Suc 0))) (at x within s)"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
  1099
  by (drule (2) DERIV_divide) (simp add: mult.commute)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1100
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1101
lemma DERIV_power_Suc:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1102
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1103
    ((\<lambda>x. f x ^ Suc n) has_field_derivative (1 + of_nat n) * (D * f x ^ n)) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1104
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_power])
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1105
     (auto simp: has_field_derivative_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1106
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
  1107
lemma DERIV_power[derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1108
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1109
    ((\<lambda>x. f x ^ n) has_field_derivative of_nat n * (D * f x ^ (n - Suc 0))) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1110
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_power])
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1111
     (auto simp: has_field_derivative_def)
31880
6fb86c61747c Added DERIV_intros
hoelzl
parents: 31404
diff changeset
  1112
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1113
lemma DERIV_pow: "((\<lambda>x. x ^ n) has_field_derivative real n * (x ^ (n - Suc 0))) (at x within s)"
61609
77b453bd616f Coercion "real" now has type nat => real only and is no longer overloaded. Type class "real_of" is gone. Many duplicate theorems removed.
paulson <lp15@cam.ac.uk>
parents: 61552
diff changeset
  1114
  using DERIV_power [OF DERIV_ident] by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1115
71837
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1116
lemma DERIV_power_int [derivative_intros]:
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1117
  assumes [derivative_intros]: "(f has_field_derivative d) (at x within s)" and [simp]: "f x \<noteq> 0"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1118
  shows   "((\<lambda>x. power_int (f x) n) has_field_derivative
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1119
             (of_int n * power_int (f x) (n - 1) * d)) (at x within s)"
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1120
proof (cases n rule: int_cases4)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1121
  case (nonneg n)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1122
  thus ?thesis 
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1123
    by (cases "n = 0")
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1124
       (auto intro!: derivative_eq_intros simp: field_simps power_int_diff
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1125
             simp flip: power_Suc power_Suc2 power_add)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1126
next
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1127
  case (neg n)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1128
  thus ?thesis
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1129
    by (auto intro!: derivative_eq_intros simp: field_simps power_int_diff power_int_minus
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1130
             simp flip: power_Suc power_Suc2 power_add)
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1131
qed
dca11678c495 new constant power_int in HOL
Manuel Eberl <eberlm@in.tum.de>
parents: 71827
diff changeset
  1132
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1133
lemma DERIV_chain': "(f has_field_derivative D) (at x within s) \<Longrightarrow> DERIV g (f x) :> E \<Longrightarrow>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1134
  ((\<lambda>x. g (f x)) has_field_derivative E * D) (at x within s)"
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 69022
diff changeset
  1135
  using has_derivative_compose[of f "(*) D" x s g "(*) E"]
63170
eae6549dbea2 tuned proofs, to allow unfold_abs_def;
wenzelm
parents: 63092
diff changeset
  1136
  by (simp only: has_field_derivative_def mult_commute_abs ac_simps)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1137
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1138
corollary DERIV_chain2: "DERIV f (g x) :> Da \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1139
  ((\<lambda>x. f (g x)) has_field_derivative Da * Db) (at x within s)"
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1140
  by (rule DERIV_chain')
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1141
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1142
text \<open>Standard version\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1143
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1144
lemma DERIV_chain:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1145
  "DERIV f (g x) :> Da \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1146
    (f \<circ> g has_field_derivative Da * Db) (at x within s)"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
  1147
  by (drule (1) DERIV_chain', simp add: o_def mult.commute)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1148
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1149
lemma DERIV_image_chain:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1150
  "(f has_field_derivative Da) (at (g x) within (g ` s)) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1151
    (g has_field_derivative Db) (at x within s) \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1152
    (f \<circ> g has_field_derivative Da * Db) (at x within s)"
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 69022
diff changeset
  1153
  using has_derivative_in_compose [of g "(*) Db" x s f "(*) Da "]
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1154
  by (simp add: has_field_derivative_def o_def mult_commute_abs ac_simps)
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1155
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1156
(*These two are from HOL Light: HAS_COMPLEX_DERIVATIVE_CHAIN*)
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1157
lemma DERIV_chain_s:
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1158
  assumes "(\<And>x. x \<in> s \<Longrightarrow> DERIV g x :> g'(x))"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1159
    and "DERIV f x :> f'"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1160
    and "f x \<in> s"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1161
  shows "DERIV (\<lambda>x. g(f x)) x :> f' * g'(f x)"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
  1162
  by (metis (full_types) DERIV_chain' mult.commute assms)
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1163
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1164
lemma DERIV_chain3: (*HAS_COMPLEX_DERIVATIVE_CHAIN_UNIV*)
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1165
  assumes "(\<And>x. DERIV g x :> g'(x))"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1166
    and "DERIV f x :> f'"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1167
  shows "DERIV (\<lambda>x. g(f x)) x :> f' * g'(f x)"
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1168
  by (metis UNIV_I DERIV_chain_s [of UNIV] assms)
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
  1169
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1170
text \<open>Alternative definition for differentiability\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1171
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1172
lemma DERIV_LIM_iff:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1173
  fixes f :: "'a::{real_normed_vector,inverse} \<Rightarrow> 'a"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1174
  shows "((\<lambda>h. (f (a + h) - f a) / h) \<midarrow>0\<rightarrow> D) = ((\<lambda>x. (f x - f a) / (x - a)) \<midarrow>a\<rightarrow> D)" (is "?lhs = ?rhs")
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1175
proof
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1176
  assume ?lhs
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1177
  then have "(\<lambda>x. (f (a + (x + - a)) - f a) / (x + - a)) \<midarrow>0 - - a\<rightarrow> D"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1178
    by (rule LIM_offset)
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1179
  then show ?rhs
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1180
    by simp
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1181
next
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1182
  assume ?rhs
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1183
  then have "(\<lambda>x. (f (x+a) - f a) / ((x+a) - a)) \<midarrow>a-a\<rightarrow> D"
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1184
    by (rule LIM_offset)
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1185
  then show ?lhs
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1186
    by (simp add: add.commute)
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1187
qed
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1188
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1189
lemma has_field_derivative_cong_ev:
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1190
  assumes "x = y"
68635
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1191
    and *: "eventually (\<lambda>x. x \<in> S \<longrightarrow> f x = g x) (nhds x)"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1192
    and "u = v" "S = t" "x \<in> S"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1193
  shows "(f has_field_derivative u) (at x within S) = (g has_field_derivative v) (at y within t)"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1194
  unfolding has_field_derivative_iff
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1195
proof (rule filterlim_cong)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1196
  from assms have "f y = g y"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1197
    by (auto simp: eventually_nhds)
68635
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1198
  with * show "\<forall>\<^sub>F z in at x within S. (f z - f x) / (z - x) = (g z - g y) / (z - y)"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1199
    unfolding eventually_at_filter
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1200
    by eventually_elim (auto simp: assms \<open>f y = g y\<close>)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1201
qed (simp_all add: assms)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1202
67706
4ddc49205f5d Unified the order of zeros and poles; improved reasoning around non-essential singularites
Wenda Li <wl302@cam.ac.uk>
parents: 67443
diff changeset
  1203
lemma has_field_derivative_cong_eventually:
68635
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1204
  assumes "eventually (\<lambda>x. f x = g x) (at x within S)" "f x = g x"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1205
  shows "(f has_field_derivative u) (at x within S) = (g has_field_derivative u) (at x within S)"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1206
  unfolding has_field_derivative_iff
68635
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1207
proof (rule tendsto_cong)
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1208
  show "\<forall>\<^sub>F y in at x within S. (f y - f x) / (y - x) = (g y - g x) / (y - x)"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1209
    using assms by (auto elim: eventually_mono)
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1210
qed
67706
4ddc49205f5d Unified the order of zeros and poles; improved reasoning around non-essential singularites
Wenda Li <wl302@cam.ac.uk>
parents: 67443
diff changeset
  1211
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1212
lemma DERIV_cong_ev:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1213
  "x = y \<Longrightarrow> eventually (\<lambda>x. f x = g x) (nhds x) \<Longrightarrow> u = v \<Longrightarrow>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1214
    DERIV f x :> u \<longleftrightarrow> DERIV g y :> v"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1215
  by (rule has_field_derivative_cong_ev) simp_all
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1216
73885
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1217
lemma DERIV_mirror: "(DERIV f (- x) :> y) \<longleftrightarrow> (DERIV (\<lambda>x. f (- x)) x :> - y)"
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1218
  for f :: "real \<Rightarrow> real" and x y :: real
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1219
  by (simp add: DERIV_def filterlim_at_split filterlim_at_left_to_right
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1220
      tendsto_minus_cancel_left field_simps conj_commute)
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1221
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1222
lemma DERIV_shift:
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1223
  "(f has_field_derivative y) (at (x + z)) = ((\<lambda>x. f (x + z)) has_field_derivative y) (at x)"
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
  1224
  by (simp add: DERIV_def field_simps)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1225
73885
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1226
lemma DERIV_at_within_shift_lemma:
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1227
  assumes "(f has_field_derivative y) (at (z+x) within (+) z ` S)"
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1228
  shows "(f \<circ> (+)z has_field_derivative y) (at x within S)"
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1229
proof -
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1230
  have "((+)z has_field_derivative 1) (at x within S)"
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1231
    by (rule derivative_eq_intros | simp)+
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1232
  with assms DERIV_image_chain show ?thesis
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1233
    by (metis mult.right_neutral)
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1234
qed
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1235
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1236
lemma DERIV_at_within_shift:
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1237
  "(f has_field_derivative y) (at (z+x) within (+) z ` S) \<longleftrightarrow> 
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1238
   ((\<lambda>x. f (z+x)) has_field_derivative y) (at x within S)"   (is "?lhs = ?rhs")
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1239
proof
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1240
  assume ?lhs then show ?rhs
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1241
    using DERIV_at_within_shift_lemma unfolding o_def by blast
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1242
next
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1243
  have [simp]: "(\<lambda>x. x - z) ` (+) z ` S = S"
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1244
    by force
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1245
  assume R: ?rhs
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1246
  have "(f \<circ> (+) z \<circ> (+) (- z) has_field_derivative y) (at (z + x) within (+) z ` S)"
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1247
    by (rule DERIV_at_within_shift_lemma) (use R in \<open>simp add: o_def\<close>)
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1248
  then show ?lhs
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1249
    by (simp add: o_def)
26171a89466a A few useful lemmas about derivatives, colinearity and other topics
paulson <lp15@cam.ac.uk>
parents: 73795
diff changeset
  1250
qed
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1251
63263
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1252
lemma floor_has_real_derivative:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1253
  fixes f :: "real \<Rightarrow> 'a::{floor_ceiling,order_topology}"
63263
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1254
  assumes "isCont f x"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1255
    and "f x \<notin> \<int>"
63263
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1256
  shows "((\<lambda>x. floor (f x)) has_real_derivative 0) (at x)"
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1257
proof (subst DERIV_cong_ev[OF refl _ refl])
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1258
  show "((\<lambda>_. floor (f x)) has_real_derivative 0) (at x)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1259
    by simp
63263
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1260
  have "\<forall>\<^sub>F y in at x. \<lfloor>f y\<rfloor> = \<lfloor>f x\<rfloor>"
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1261
    by (rule eventually_floor_eq[OF assms[unfolded continuous_at]])
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1262
  then show "\<forall>\<^sub>F y in nhds x. real_of_int \<lfloor>f y\<rfloor> = real_of_int \<lfloor>f x\<rfloor>"
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1263
    unfolding eventually_at_filter
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1264
    by eventually_elim auto
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1265
qed
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1266
67685
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
  1267
lemmas has_derivative_floor[derivative_intros] =
bdff8bf0a75b moved theorems from AFP/Affine_Arithmetic and AFP/Ordinary_Differential_Equations
immler
parents: 67443
diff changeset
  1268
  floor_has_real_derivative[THEN DERIV_compose_FDERIV]
63263
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
  1269
70707
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1270
lemma continuous_floor:
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1271
  fixes x::real
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1272
  shows "x \<notin> \<int> \<Longrightarrow> continuous (at x) (real_of_int \<circ> floor)"
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1273
  using floor_has_real_derivative [where f=id]
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1274
  by (auto simp: o_def has_field_derivative_def intro: has_derivative_continuous)
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1275
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1276
lemma continuous_frac:
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1277
  fixes x::real
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1278
  assumes "x \<notin> \<int>"
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1279
  shows "continuous (at x) frac"
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1280
proof -
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1281
  have "isCont (\<lambda>x. real_of_int \<lfloor>x\<rfloor>) x"
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1282
    using continuous_floor [OF assms] by (simp add: o_def)
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1283
  then have *: "continuous (at x) (\<lambda>x. x - real_of_int \<lfloor>x\<rfloor>)"
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1284
    by (intro continuous_intros)
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1285
  moreover have "\<forall>\<^sub>F x in nhds x. frac x = x - real_of_int \<lfloor>x\<rfloor>"
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1286
    by (simp add: frac_def)
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1287
  ultimately show ?thesis
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1288
    by (simp add: LIM_imp_LIM frac_def isCont_def)
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1289
qed
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70615
diff changeset
  1290
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1291
text \<open>Caratheodory formulation of derivative at a point\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1292
68644
242d298526a3 de-applying and simplifying proofs
paulson <lp15@cam.ac.uk>
parents: 68638
diff changeset
  1293
lemma CARAT_DERIV:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
  1294
  "(DERIV f x :> l) \<longleftrightarrow> (\<exists>g. (\<forall>z. f z - f x = g z * (z - x)) \<and> isCont g x \<and> g x = l)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1295
  (is "?lhs = ?rhs")
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1296
proof
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1297
  assume ?lhs
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1298
  show "\<exists>g. (\<forall>z. f z - f x = g z * (z - x)) \<and> isCont g x \<and> g x = l"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1299
  proof (intro exI conjI)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1300
    let ?g = "(\<lambda>z. if z = x then l else (f z - f x) / (z-x))"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1301
    show "\<forall>z. f z - f x = ?g z * (z - x)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1302
      by simp
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1303
    show "isCont ?g x"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1304
      using \<open>?lhs\<close> by (simp add: isCont_iff DERIV_def cong: LIM_equal [rule_format])
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1305
    show "?g x = l"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1306
      by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1307
  qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1308
next
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1309
  assume ?rhs
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1310
  then show ?lhs
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1311
    by (auto simp add: isCont_iff DERIV_def cong: LIM_cong)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1312
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1313
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1314
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1315
subsection \<open>Local extrema\<close>
29975
28c5322f0df3 more subsection headings
huffman
parents: 29803
diff changeset
  1316
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
  1317
text \<open>If \<^term>\<open>0 < f' x\<close> then \<^term>\<open>x\<close> is Locally Strictly Increasing At The Right.\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1318
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1319
lemma has_real_derivative_pos_inc_right:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1320
  fixes f :: "real \<Rightarrow> real"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1321
  assumes der: "(f has_real_derivative l) (at x within S)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1322
    and l: "0 < l"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1323
  shows "\<exists>d > 0. \<forall>h > 0. x + h \<in> S \<longrightarrow> h < d \<longrightarrow> f x < f (x + h)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1324
  using assms
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1325
proof -
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1326
  from der [THEN has_field_derivativeD, THEN tendstoD, OF l, unfolded eventually_at]
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1327
  obtain s where s: "0 < s"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1328
    and all: "\<And>xa. xa\<in>S \<Longrightarrow> xa \<noteq> x \<and> dist xa x < s \<longrightarrow> \<bar>(f xa - f x) / (xa - x) - l\<bar> < l"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1329
    by (auto simp: dist_real_def)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1330
  then show ?thesis
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1331
  proof (intro exI conjI strip)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1332
    show "0 < s" by (rule s)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1333
  next
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1334
    fix h :: real
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1335
    assume "0 < h" "h < s" "x + h \<in> S"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1336
    with all [of "x + h"] show "f x < f (x+h)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1337
    proof (simp add: abs_if dist_real_def pos_less_divide_eq split: if_split_asm)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1338
      assume "\<not> (f (x + h) - f x) / h < l" and h: "0 < h"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1339
      with l have "0 < (f (x + h) - f x) / h"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1340
        by arith
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1341
      then show "f x < f (x + h)"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1342
        by (simp add: pos_less_divide_eq h)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1343
    qed
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1344
  qed
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1345
qed
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1346
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1347
lemma DERIV_pos_inc_right:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1348
  fixes f :: "real \<Rightarrow> real"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1349
  assumes der: "DERIV f x :> l"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1350
    and l: "0 < l"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1351
  shows "\<exists>d > 0. \<forall>h > 0. h < d \<longrightarrow> f x < f (x + h)"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1352
  using has_real_derivative_pos_inc_right[OF assms]
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1353
  by auto
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1354
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1355
lemma has_real_derivative_neg_dec_left:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1356
  fixes f :: "real \<Rightarrow> real"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1357
  assumes der: "(f has_real_derivative l) (at x within S)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1358
    and "l < 0"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1359
  shows "\<exists>d > 0. \<forall>h > 0. x - h \<in> S \<longrightarrow> h < d \<longrightarrow> f x < f (x - h)"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1360
proof -
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1361
  from \<open>l < 0\<close> have l: "- l > 0"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1362
    by simp
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1363
  from der [THEN has_field_derivativeD, THEN tendstoD, OF l, unfolded eventually_at]
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1364
  obtain s where s: "0 < s"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1365
    and all: "\<And>xa. xa\<in>S \<Longrightarrow> xa \<noteq> x \<and> dist xa x < s \<longrightarrow> \<bar>(f xa - f x) / (xa - x) - l\<bar> < - l"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1366
    by (auto simp: dist_real_def)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1367
  then show ?thesis
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1368
  proof (intro exI conjI strip)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1369
    show "0 < s" by (rule s)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1370
  next
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1371
    fix h :: real
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1372
    assume "0 < h" "h < s" "x - h \<in> S"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1373
    with all [of "x - h"] show "f x < f (x-h)"
63648
f9f3006a5579 "split add" -> "split"
nipkow
parents: 63627
diff changeset
  1374
    proof (simp add: abs_if pos_less_divide_eq dist_real_def split: if_split_asm)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1375
      assume "- ((f (x-h) - f x) / h) < l" and h: "0 < h"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1376
      with l have "0 < (f (x-h) - f x) / h"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1377
        by arith
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1378
      then show "f x < f (x - h)"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1379
        by (simp add: pos_less_divide_eq h)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1380
    qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1381
  qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1382
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1383
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1384
lemma DERIV_neg_dec_left:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1385
  fixes f :: "real \<Rightarrow> real"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1386
  assumes der: "DERIV f x :> l"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1387
    and l: "l < 0"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1388
  shows "\<exists>d > 0. \<forall>h > 0. h < d \<longrightarrow> f x < f (x - h)"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1389
  using has_real_derivative_neg_dec_left[OF assms]
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1390
  by auto
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1391
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1392
lemma has_real_derivative_pos_inc_left:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1393
  fixes f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1394
  shows "(f has_real_derivative l) (at x within S) \<Longrightarrow> 0 < l \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1395
    \<exists>d>0. \<forall>h>0. x - h \<in> S \<longrightarrow> h < d \<longrightarrow> f (x - h) < f x"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1396
  by (rule has_real_derivative_neg_dec_left [of "\<lambda>x. - f x" "-l" x S, simplified])
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1397
      (auto simp add: DERIV_minus)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1398
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1399
lemma DERIV_pos_inc_left:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1400
  fixes f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1401
  shows "DERIV f x :> l \<Longrightarrow> 0 < l \<Longrightarrow> \<exists>d > 0. \<forall>h > 0. h < d \<longrightarrow> f (x - h) < f x"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1402
  using has_real_derivative_pos_inc_left
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1403
  by blast
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1404
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1405
lemma has_real_derivative_neg_dec_right:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1406
  fixes f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1407
  shows "(f has_real_derivative l) (at x within S) \<Longrightarrow> l < 0 \<Longrightarrow>
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1408
    \<exists>d > 0. \<forall>h > 0. x + h \<in> S \<longrightarrow> h < d \<longrightarrow> f x > f (x + h)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1409
  by (rule has_real_derivative_pos_inc_right [of "\<lambda>x. - f x" "-l" x S, simplified])
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1410
      (auto simp add: DERIV_minus)
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1411
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1412
lemma DERIV_neg_dec_right:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1413
  fixes f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1414
  shows "DERIV f x :> l \<Longrightarrow> l < 0 \<Longrightarrow> \<exists>d > 0. \<forall>h > 0. h < d \<longrightarrow> f x > f (x + h)"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1415
  using has_real_derivative_neg_dec_right by blast
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1416
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1417
lemma DERIV_local_max:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1418
  fixes f :: "real \<Rightarrow> real"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1419
  assumes der: "DERIV f x :> l"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1420
    and d: "0 < d"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1421
    and le: "\<forall>y. \<bar>x - y\<bar> < d \<longrightarrow> f y \<le> f x"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1422
  shows "l = 0"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1423
proof (cases rule: linorder_cases [of l 0])
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1424
  case equal
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1425
  then show ?thesis .
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1426
next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1427
  case less
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1428
  from DERIV_neg_dec_left [OF der less]
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1429
  obtain d' where d': "0 < d'" and lt: "\<forall>h > 0. h < d' \<longrightarrow> f x < f (x - h)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1430
    by blast
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1431
  obtain e where "0 < e \<and> e < d \<and> e < d'"
68527
2f4e2aab190a Generalising and renaming some basic results
paulson <lp15@cam.ac.uk>
parents: 67707
diff changeset
  1432
    using field_lbound_gt_zero [OF d d']  ..
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1433
  with lt le [THEN spec [where x="x - e"]] show ?thesis
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1434
    by (auto simp add: abs_if)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1435
next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1436
  case greater
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1437
  from DERIV_pos_inc_right [OF der greater]
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1438
  obtain d' where d': "0 < d'" and lt: "\<forall>h > 0. h < d' \<longrightarrow> f x < f (x + h)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1439
    by blast
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1440
  obtain e where "0 < e \<and> e < d \<and> e < d'"
68527
2f4e2aab190a Generalising and renaming some basic results
paulson <lp15@cam.ac.uk>
parents: 67707
diff changeset
  1441
    using field_lbound_gt_zero [OF d d'] ..
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1442
  with lt le [THEN spec [where x="x + e"]] show ?thesis
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1443
    by (auto simp add: abs_if)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1444
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1445
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1446
text \<open>Similar theorem for a local minimum\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1447
lemma DERIV_local_min:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1448
  fixes f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1449
  shows "DERIV f x :> l \<Longrightarrow> 0 < d \<Longrightarrow> \<forall>y. \<bar>x - y\<bar> < d \<longrightarrow> f x \<le> f y \<Longrightarrow> l = 0"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1450
  by (drule DERIV_minus [THEN DERIV_local_max]) auto
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1451
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1452
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1453
text\<open>In particular, if a function is locally flat\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1454
lemma DERIV_local_const:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1455
  fixes f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1456
  shows "DERIV f x :> l \<Longrightarrow> 0 < d \<Longrightarrow> \<forall>y. \<bar>x - y\<bar> < d \<longrightarrow> f x = f y \<Longrightarrow> l = 0"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1457
  by (auto dest!: DERIV_local_max)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1458
29975
28c5322f0df3 more subsection headings
huffman
parents: 29803
diff changeset
  1459
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1460
subsection \<open>Rolle's Theorem\<close>
29975
28c5322f0df3 more subsection headings
huffman
parents: 29803
diff changeset
  1461
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1462
text \<open>Lemma about introducing open ball in open interval\<close>
68635
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1463
lemma lemma_interval_lt: 
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1464
  fixes a b x :: real
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1465
  assumes "a < x" "x < b"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1466
  shows "\<exists>d. 0 < d \<and> (\<forall>y. \<bar>x - y\<bar> < d \<longrightarrow> a < y \<and> y < b)"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1467
  using linorder_linear [of "x - a" "b - x"]
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1468
proof 
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1469
  assume "x - a \<le> b - x"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1470
  with assms show ?thesis
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1471
    by (rule_tac x = "x - a" in exI) auto
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1472
next
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1473
  assume "b - x \<le> x - a"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1474
  with assms show ?thesis
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1475
    by (rule_tac x = "b - x" in exI) auto
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1476
qed
27668
6eb20b2cecf8 Tuned and simplified proofs
chaieb
parents: 26120
diff changeset
  1477
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1478
lemma lemma_interval: "a < x \<Longrightarrow> x < b \<Longrightarrow> \<exists>d. 0 < d \<and> (\<forall>y. \<bar>x - y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1479
  for a b x :: real
68635
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1480
  by (force dest: lemma_interval_lt)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1481
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1482
text \<open>Rolle's Theorem.
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
  1483
   If \<^term>\<open>f\<close> is defined and continuous on the closed interval
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
  1484
   \<open>[a,b]\<close> and differentiable on the open interval \<open>(a,b)\<close>,
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
  1485
   and \<^term>\<open>f a = f b\<close>,
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
  1486
   then there exists \<open>x0 \<in> (a,b)\<close> such that \<^term>\<open>f' x0 = 0\<close>\<close>
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1487
theorem Rolle_deriv:
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1488
  fixes f :: "real \<Rightarrow> real"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1489
  assumes "a < b"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1490
    and fab: "f a = f b"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1491
    and contf: "continuous_on {a..b} f"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1492
    and derf: "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> (f has_derivative f' x) (at x)"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1493
  shows "\<exists>z. a < z \<and> z < b \<and> f' z = (\<lambda>v. 0)"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1494
proof -
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1495
  have le: "a \<le> b"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1496
    using \<open>a < b\<close> by simp
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1497
    have "(a + b) / 2 \<in> {a..b}"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1498
      using assms(1) by auto
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1499
    then have *: "{a..b} \<noteq> {}"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1500
      by auto
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1501
  obtain x where x_max: "\<forall>z. a \<le> z \<and> z \<le> b \<longrightarrow> f z \<le> f x" and "a \<le> x" "x \<le> b"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1502
    using continuous_attains_sup[OF compact_Icc * contf]
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1503
    by (meson atLeastAtMost_iff)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1504
  obtain x' where x'_min: "\<forall>z. a \<le> z \<and> z \<le> b \<longrightarrow> f x' \<le> f z" and "a \<le> x'" "x' \<le> b"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1505
    using continuous_attains_inf[OF compact_Icc * contf] by (meson atLeastAtMost_iff)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1506
  consider "a < x" "x < b" | "x = a \<or> x = b"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1507
    using \<open>a \<le> x\<close> \<open>x \<le> b\<close> by arith
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1508
  then show ?thesis
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1509
  proof cases
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1510
    case 1
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
  1511
    \<comment> \<open>\<^term>\<open>f\<close> attains its maximum within the interval\<close>
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1512
    then obtain l where der: "DERIV f x :> l"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1513
      using derf differentiable_def real_differentiable_def by blast
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1514
    obtain d where d: "0 < d" and bound: "\<forall>y. \<bar>x - y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1515
      using lemma_interval [OF 1] by blast
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1516
    then have bound': "\<forall>y. \<bar>x - y\<bar> < d \<longrightarrow> f y \<le> f x"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1517
      using x_max by blast
67443
3abf6a722518 standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents: 67399
diff changeset
  1518
    \<comment> \<open>the derivative at a local maximum is zero\<close>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1519
    have "l = 0"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1520
      by (rule DERIV_local_max [OF der d bound'])
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1521
    with 1 der derf [of x] show ?thesis
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1522
      by (metis has_derivative_unique has_field_derivative_def mult_zero_left)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1523
  next
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1524
    case 2
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1525
    then have fx: "f b = f x" by (auto simp add: fab)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1526
    consider "a < x'" "x' < b" | "x' = a \<or> x' = b"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1527
      using \<open>a \<le> x'\<close> \<open>x' \<le> b\<close> by arith
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1528
    then show ?thesis
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1529
    proof cases
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1530
      case 1
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
  1531
        \<comment> \<open>\<^term>\<open>f\<close> attains its minimum within the interval\<close>
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1532
      then obtain l where der: "DERIV f x' :> l"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1533
        using derf differentiable_def real_differentiable_def by blast 
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1534
      from lemma_interval [OF 1]
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1535
      obtain d where d: "0<d" and bound: "\<forall>y. \<bar>x'-y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1536
        by blast
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1537
      then have bound': "\<forall>y. \<bar>x' - y\<bar> < d \<longrightarrow> f x' \<le> f y"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1538
        using x'_min by blast
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1539
      have "l = 0" by (rule DERIV_local_min [OF der d bound'])
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1540
        \<comment> \<open>the derivative at a local minimum is zero\<close>
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1541
      then show ?thesis using 1 der derf [of x'] 
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1542
        by (metis has_derivative_unique has_field_derivative_def mult_zero_left)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1543
    next
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1544
      case 2
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69216
diff changeset
  1545
        \<comment> \<open>\<^term>\<open>f\<close> is constant throughout the interval\<close>
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1546
      then have fx': "f b = f x'" by (auto simp: fab)
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1547
      from dense [OF \<open>a < b\<close>] obtain r where r: "a < r" "r < b" by blast
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1548
      obtain d where d: "0 < d" and bound: "\<forall>y. \<bar>r - y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1549
        using lemma_interval [OF r] by blast
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1550
      have eq_fb: "f z = f b" if "a \<le> z" and "z \<le> b" for z
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1551
      proof (rule order_antisym)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1552
        show "f z \<le> f b" by (simp add: fx x_max that)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1553
        show "f b \<le> f z" by (simp add: fx' x'_min that)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1554
      qed
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1555
      have bound': "\<forall>y. \<bar>r - y\<bar> < d \<longrightarrow> f r = f y"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1556
      proof (intro strip)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1557
        fix y :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1558
        assume lt: "\<bar>r - y\<bar> < d"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1559
        then have "f y = f b" by (simp add: eq_fb bound)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1560
        then show "f r = f y" by (simp add: eq_fb r order_less_imp_le)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1561
      qed
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1562
      obtain l where der: "DERIV f r :> l"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1563
        using derf differentiable_def r(1) r(2) real_differentiable_def by blast
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1564
      have "l = 0"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1565
        by (rule DERIV_local_const [OF der d bound'])
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1566
        \<comment> \<open>the derivative of a constant function is zero\<close>
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1567
      with r der derf [of r] show ?thesis
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1568
        by (metis has_derivative_unique has_field_derivative_def mult_zero_left)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1569
    qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1570
  qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1571
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1572
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1573
corollary Rolle:
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1574
  fixes a b :: real
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1575
  assumes ab: "a < b" "f a = f b" "continuous_on {a..b} f"
69022
e2858770997a removal of more redundancies, and fixes
paulson <lp15@cam.ac.uk>
parents: 69020
diff changeset
  1576
    and dif [rule_format]: "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> f differentiable (at x)"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1577
  shows "\<exists>z. a < z \<and> z < b \<and> DERIV f z :> 0"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1578
proof -
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1579
  obtain f' where f': "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> (f has_derivative f' x) (at x)"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1580
    using dif unfolding differentiable_def by metis
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1581
  then have "\<exists>z. a < z \<and> z < b \<and> f' z = (\<lambda>v. 0)"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1582
    by (metis Rolle_deriv [OF ab])
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1583
  then show ?thesis
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1584
    using f' has_derivative_imp_has_field_derivative by fastforce
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1585
qed
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1586
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1587
subsection \<open>Mean Value Theorem\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1588
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1589
theorem mvt:
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1590
  fixes f :: "real \<Rightarrow> real"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1591
  assumes "a < b"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1592
    and contf: "continuous_on {a..b} f"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1593
    and derf: "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> (f has_derivative f' x) (at x)"
69109
c9ea9290880f cosmetic change to mvt
paulson <lp15@cam.ac.uk>
parents: 69022
diff changeset
  1594
  obtains \<xi> where "a < \<xi>" "\<xi> < b" "f b - f a = (f' \<xi>) (b - a)"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1595
proof -
74878
0263787a06b4 a slightly simpler proof
paulson <lp15@cam.ac.uk>
parents: 74007
diff changeset
  1596
  have "\<exists>\<xi>. a < \<xi> \<and> \<xi> < b \<and> (\<lambda>y. f' \<xi> y - (f b - f a) / (b - a) * y) = (\<lambda>v. 0)"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1597
  proof (intro Rolle_deriv[OF \<open>a < b\<close>])
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1598
    fix x
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1599
    assume x: "a < x" "x < b"
69109
c9ea9290880f cosmetic change to mvt
paulson <lp15@cam.ac.uk>
parents: 69022
diff changeset
  1600
    show "((\<lambda>x. f x - (f b - f a) / (b - a) * x) 
c9ea9290880f cosmetic change to mvt
paulson <lp15@cam.ac.uk>
parents: 69022
diff changeset
  1601
          has_derivative (\<lambda>y. f' x y - (f b - f a) / (b - a) * y)) (at x)"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1602
      by (intro derivative_intros derf[OF x])
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1603
  qed (use assms in \<open>auto intro!: continuous_intros simp: field_simps\<close>)
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1604
  then show ?thesis
74878
0263787a06b4 a slightly simpler proof
paulson <lp15@cam.ac.uk>
parents: 74007
diff changeset
  1605
    by (smt (verit, ccfv_SIG) pos_le_divide_eq pos_less_divide_eq that)
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1606
qed
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1607
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1608
theorem MVT:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1609
  fixes a b :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1610
  assumes lt: "a < b"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1611
    and contf: "continuous_on {a..b} f"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1612
    and dif: "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> f differentiable (at x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1613
  shows "\<exists>l z. a < z \<and> z < b \<and> DERIV f z :> l \<and> f b - f a = (b - a) * l"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1614
proof -
70346
408e15cbd2a6 tuned proofs
haftmann
parents: 69593
diff changeset
  1615
  obtain f' :: "real \<Rightarrow> real \<Rightarrow> real"
408e15cbd2a6 tuned proofs
haftmann
parents: 69593
diff changeset
  1616
    where derf: "\<And>x. a < x \<Longrightarrow> x < b \<Longrightarrow> (f has_derivative f' x) (at x)"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1617
    using dif unfolding differentiable_def by metis
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1618
  then obtain z where "a < z" "z < b" "f b - f a = (f' z) (b - a)"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1619
    using mvt [OF lt contf] by blast
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1620
  then show ?thesis
70346
408e15cbd2a6 tuned proofs
haftmann
parents: 69593
diff changeset
  1621
    by (simp add: ac_simps)
408e15cbd2a6 tuned proofs
haftmann
parents: 69593
diff changeset
  1622
      (metis derf dif has_derivative_unique has_field_derivative_imp_has_derivative real_differentiable_def)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1623
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1624
68635
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1625
corollary MVT2:
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1626
  assumes "a < b" and der: "\<And>x. \<lbrakk>a \<le> x; x \<le> b\<rbrakk> \<Longrightarrow> DERIV f x :> f' x"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1627
  shows "\<exists>z::real. a < z \<and> z < b \<and> (f b - f a = (b - a) * f' z)"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1628
proof -
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1629
  have "\<exists>l z. a < z \<and>
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1630
           z < b \<and>
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1631
           (f has_real_derivative l) (at z) \<and>
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1632
           f b - f a = (b - a) * l"
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1633
  proof (rule MVT [OF \<open>a < b\<close>])
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1634
    show "continuous_on {a..b} f"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1635
      by (meson DERIV_continuous atLeastAtMost_iff continuous_at_imp_continuous_on der) 
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1636
    show "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> f differentiable (at x)"
68635
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1637
      using assms by (force dest: order_less_imp_le simp add: real_differentiable_def)
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1638
  qed
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1639
  with assms show ?thesis
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1640
    by (blast dest: DERIV_unique order_less_imp_le)
8094b853a92f fixes and more de-applying
paulson <lp15@cam.ac.uk>
parents: 68634
diff changeset
  1641
qed
29803
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1642
68601
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1643
lemma pos_deriv_imp_strict_mono:
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1644
  assumes "\<And>x. (f has_real_derivative f' x) (at x)"
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1645
  assumes "\<And>x. f' x > 0"
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1646
  shows   "strict_mono f"
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1647
proof (rule strict_monoI)
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1648
  fix x y :: real assume xy: "x < y"
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1649
  from assms and xy have "\<exists>z>x. z < y \<and> f y - f x = (y - x) * f' z"
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1650
    by (intro MVT2) (auto dest: connectedD_interval)
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1651
  then obtain z where z: "z > x" "z < y" "f y - f x = (y - x) * f' z" by blast
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1652
  note \<open>f y - f x = (y - x) * f' z\<close>
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1653
  also have "(y - x) * f' z > 0" using xy assms by (intro mult_pos_pos) auto
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1654
  finally show "f x < f y" by simp
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1655
qed
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1656
70614
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1657
proposition  deriv_nonneg_imp_mono:
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1658
  assumes deriv: "\<And>x. x \<in> {a..b} \<Longrightarrow> (g has_real_derivative g' x) (at x)"
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1659
  assumes nonneg: "\<And>x. x \<in> {a..b} \<Longrightarrow> g' x \<ge> 0"
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1660
  assumes ab: "a \<le> b"
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1661
  shows "g a \<le> g b"
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1662
proof (cases "a < b")
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1663
  assume "a < b"
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1664
  from deriv have "\<And>x. \<lbrakk>x \<ge> a; x \<le> b\<rbrakk> \<Longrightarrow> (g has_real_derivative g' x) (at x)" by simp
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1665
  with MVT2[OF \<open>a < b\<close>] and deriv
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1666
    obtain \<xi> where \<xi>_ab: "\<xi> > a" "\<xi> < b" and g_ab: "g b - g a = (b - a) * g' \<xi>" by blast
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1667
  from \<xi>_ab ab nonneg have "(b - a) * g' \<xi> \<ge> 0" by simp
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1668
  with g_ab show ?thesis by simp
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1669
qed (insert ab, simp)
6a2c982363e9 moved lemmas
nipkow
parents: 70346
diff changeset
  1670
68601
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1671
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1672
subsubsection \<open>A function is constant if its derivative is 0 over an interval.\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1673
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1674
lemma DERIV_isconst_end:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1675
  fixes f :: "real \<Rightarrow> real"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1676
  assumes "a < b" and contf: "continuous_on {a..b} f"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1677
    and 0: "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> DERIV f x :> 0"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1678
  shows "f b = f a"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1679
  using MVT [OF \<open>a < b\<close>] "0" DERIV_unique contf real_differentiable_def
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1680
  by (fastforce simp: algebra_simps)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1681
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1682
lemma DERIV_isconst2:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1683
  fixes f :: "real \<Rightarrow> real"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1684
  assumes "a < b" and contf: "continuous_on {a..b} f" and derf: "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> DERIV f x :> 0"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1685
    and "a \<le> x" "x \<le> b"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1686
shows "f x = f a"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1687
proof (cases "a < x")
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1688
  case True
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1689
  have *: "continuous_on {a..x} f"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1690
    using \<open>x \<le> b\<close> contf continuous_on_subset by fastforce
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1691
  show ?thesis
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1692
    by (rule DERIV_isconst_end [OF True *]) (use \<open>x \<le> b\<close> derf in auto)
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1693
qed (use \<open>a \<le> x\<close> in auto)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1694
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1695
lemma DERIV_isconst3:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1696
  fixes a b x y :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1697
  assumes "a < b"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1698
    and "x \<in> {a <..< b}"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1699
    and "y \<in> {a <..< b}"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1700
    and derivable: "\<And>x. x \<in> {a <..< b} \<Longrightarrow> DERIV f x :> 0"
29803
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1701
  shows "f x = f y"
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1702
proof (cases "x = y")
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1703
  case False
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1704
  let ?a = "min x y"
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1705
  let ?b = "max x y"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1706
  have *: "DERIV f z :> 0" if "?a \<le> z" "z \<le> ?b" for z
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1707
  proof -
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1708
    have "a < z" and "z < b"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1709
      using that \<open>x \<in> {a <..< b}\<close> and \<open>y \<in> {a <..< b}\<close> by auto
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1710
    then have "z \<in> {a<..<b}" by auto
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1711
    then show "DERIV f z :> 0" by (rule derivable)
29803
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1712
  qed
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1713
  have isCont: "continuous_on {?a..?b} f"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1714
    by (meson * DERIV_continuous_on atLeastAtMost_iff has_field_derivative_at_within)
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1715
  have DERIV: "\<And>z. \<lbrakk>?a < z; z < ?b\<rbrakk> \<Longrightarrow> DERIV f z :> 0"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1716
    using * by auto
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1717
  have "?a < ?b" using \<open>x \<noteq> y\<close> by auto
29803
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1718
  from DERIV_isconst2[OF this isCont DERIV, of x] and DERIV_isconst2[OF this isCont DERIV, of y]
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1719
  show ?thesis by auto
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1720
qed auto
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1721
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1722
lemma DERIV_isconst_all:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1723
  fixes f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1724
  shows "\<forall>x. DERIV f x :> 0 \<Longrightarrow> f x = f y"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1725
  apply (rule linorder_cases [of x y])
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1726
  apply (metis DERIV_continuous DERIV_isconst_end continuous_at_imp_continuous_on)+
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1727
  done
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1728
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1729
lemma DERIV_const_ratio_const:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1730
  fixes f :: "real \<Rightarrow> real"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1731
  assumes "a \<noteq> b" and df: "\<And>x. DERIV f x :> k"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1732
  shows "f b - f a = (b - a) * k"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1733
proof (cases a b rule: linorder_cases)
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1734
  case less
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1735
  show ?thesis
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1736
    using MVT [OF less] df
69022
e2858770997a removal of more redundancies, and fixes
paulson <lp15@cam.ac.uk>
parents: 69020
diff changeset
  1737
    by (metis DERIV_continuous DERIV_unique continuous_at_imp_continuous_on real_differentiable_def)
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1738
next
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1739
  case greater
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1740
  have  "f a - f b = (a - b) * k"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1741
    using MVT [OF greater] df
69022
e2858770997a removal of more redundancies, and fixes
paulson <lp15@cam.ac.uk>
parents: 69020
diff changeset
  1742
    by (metis DERIV_continuous DERIV_unique continuous_at_imp_continuous_on real_differentiable_def)
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1743
  then show ?thesis
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1744
    by (simp add: algebra_simps)
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1745
qed auto
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1746
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1747
lemma DERIV_const_ratio_const2:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1748
  fixes f :: "real \<Rightarrow> real"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1749
  assumes "a \<noteq> b" and df: "\<And>x. DERIV f x :> k"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1750
  shows "(f b - f a) / (b - a) = k"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1751
  using DERIV_const_ratio_const [OF assms] \<open>a \<noteq> b\<close> by auto
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1752
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1753
lemma real_average_minus_first [simp]: "(a + b) / 2 - a = (b - a) / 2"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1754
  for a b :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1755
  by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1756
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1757
lemma real_average_minus_second [simp]: "(b + a) / 2 - a = (b - a) / 2"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1758
  for a b :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1759
  by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1760
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1761
text \<open>Gallileo's "trick": average velocity = av. of end velocities.\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1762
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1763
lemma DERIV_const_average:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1764
  fixes v :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1765
    and a b :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1766
  assumes neq: "a \<noteq> b"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1767
    and der: "\<And>x. DERIV v x :> k"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1768
  shows "v ((a + b) / 2) = (v a + v b) / 2"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1769
proof (cases rule: linorder_cases [of a b])
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1770
  case equal
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1771
  with neq show ?thesis by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1772
next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1773
  case less
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1774
  have "(v b - v a) / (b - a) = k"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1775
    by (rule DERIV_const_ratio_const2 [OF neq der])
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1776
  then have "(b - a) * ((v b - v a) / (b - a)) = (b - a) * k"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1777
    by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1778
  moreover have "(v ((a + b) / 2) - v a) / ((a + b) / 2 - a) = k"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1779
    by (rule DERIV_const_ratio_const2 [OF _ der]) (simp add: neq)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1780
  ultimately show ?thesis
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1781
    using neq by force
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1782
next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1783
  case greater
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1784
  have "(v b - v a) / (b - a) = k"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1785
    by (rule DERIV_const_ratio_const2 [OF neq der])
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1786
  then have "(b - a) * ((v b - v a) / (b - a)) = (b - a) * k"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1787
    by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1788
  moreover have " (v ((b + a) / 2) - v a) / ((b + a) / 2 - a) = k"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1789
    by (rule DERIV_const_ratio_const2 [OF _ der]) (simp add: neq)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1790
  ultimately show ?thesis
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1791
    using neq by (force simp add: add.commute)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1792
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1793
68601
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1794
subsubsection\<open>A function with positive derivative is increasing\<close>
7828f3b85156 de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68527
diff changeset
  1795
text \<open>A simple proof using the MVT, by Jeremy Avigad. And variants.\<close>
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1796
lemma DERIV_pos_imp_increasing_open:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1797
  fixes a b :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1798
    and f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1799
  assumes "a < b"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1800
    and "\<And>x. a < x \<Longrightarrow> x < b \<Longrightarrow> (\<exists>y. DERIV f x :> y \<and> y > 0)"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1801
    and con: "continuous_on {a..b} f"
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1802
  shows "f a < f b"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1803
proof (rule ccontr)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1804
  assume f: "\<not> ?thesis"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1805
  have "\<exists>l z. a < z \<and> z < b \<and> DERIV f z :> l \<and> f b - f a = (b - a) * l"
69022
e2858770997a removal of more redundancies, and fixes
paulson <lp15@cam.ac.uk>
parents: 69020
diff changeset
  1806
    by (rule MVT) (use assms real_differentiable_def in \<open>force+\<close>)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1807
  then obtain l z where z: "a < z" "z < b" "DERIV f z :> l" and "f b - f a = (b - a) * l"
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1808
    by auto
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1809
  with assms f have "\<not> l > 0"
36777
be5461582d0f avoid using real-specific versions of generic lemmas
huffman
parents: 35216
diff changeset
  1810
    by (metis linorder_not_le mult_le_0_iff diff_le_0_iff_le)
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1811
  with assms z show False
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1812
    by (metis DERIV_unique)
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1813
qed
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1814
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1815
lemma DERIV_pos_imp_increasing:
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1816
  fixes a b :: real and f :: "real \<Rightarrow> real"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1817
  assumes "a < b"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1818
    and der: "\<And>x. \<lbrakk>a \<le> x; x \<le> b\<rbrakk> \<Longrightarrow> \<exists>y. DERIV f x :> y \<and> y > 0"
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1819
  shows "f a < f b"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1820
  by (metis less_le_not_le DERIV_atLeastAtMost_imp_continuous_on DERIV_pos_imp_increasing_open [OF \<open>a < b\<close>] der)
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1821
45791
d985ec974815 more systematic lemma name
noschinl
parents: 45600
diff changeset
  1822
lemma DERIV_nonneg_imp_nondecreasing:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1823
  fixes a b :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1824
    and f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1825
  assumes "a \<le> b"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1826
    and "\<And>x. \<lbrakk>a \<le> x; x \<le> b\<rbrakk> \<Longrightarrow> \<exists>y. DERIV f x :> y \<and> y \<ge> 0"
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1827
  shows "f a \<le> f b"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1828
proof (rule ccontr, cases "a = b")
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1829
  assume "\<not> ?thesis" and "a = b"
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1830
  then show False by auto
37891
c26f9d06e82c robustified metis proof
haftmann
parents: 37888
diff changeset
  1831
next
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1832
  assume *: "\<not> ?thesis"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1833
  assume "a \<noteq> b"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1834
  with \<open>a \<le> b\<close> have "a < b"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1835
    by linarith
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1836
  moreover have "continuous_on {a..b} f"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1837
    by (meson DERIV_isCont assms(2) atLeastAtMost_iff continuous_at_imp_continuous_on)
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1838
  ultimately have "\<exists>l z. a < z \<and> z < b \<and> DERIV f z :> l \<and> f b - f a = (b - a) * l"
69022
e2858770997a removal of more redundancies, and fixes
paulson <lp15@cam.ac.uk>
parents: 69020
diff changeset
  1839
    using assms MVT [OF \<open>a < b\<close>, of f] real_differentiable_def less_eq_real_def by blast
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1840
  then obtain l z where lz: "a < z" "z < b" "DERIV f z :> l" and **: "f b - f a = (b - a) * l"
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1841
    by auto
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1842
  with * have "a < b" "f b < f a" by auto
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1843
  with ** have "\<not> l \<ge> 0" by (auto simp add: not_le algebra_simps)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1844
    (metis * add_le_cancel_right assms(1) less_eq_real_def mult_right_mono add_left_mono linear order_refl)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1845
  with assms lz show False
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1846
    by (metis DERIV_unique order_less_imp_le)
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1847
qed
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1848
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1849
lemma DERIV_neg_imp_decreasing_open:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1850
  fixes a b :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1851
    and f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1852
  assumes "a < b"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1853
    and "\<And>x. a < x \<Longrightarrow> x < b \<Longrightarrow> \<exists>y. DERIV f x :> y \<and> y < 0"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1854
    and con: "continuous_on {a..b} f"
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1855
  shows "f a > f b"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1856
proof -
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1857
  have "(\<lambda>x. -f x) a < (\<lambda>x. -f x) b"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1858
  proof (rule DERIV_pos_imp_increasing_open [of a b])
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1859
    show "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> \<exists>y. ((\<lambda>x. - f x) has_real_derivative y) (at x) \<and> 0 < y"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1860
      using assms
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1861
      by simp (metis field_differentiable_minus neg_0_less_iff_less)
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1862
    show "continuous_on {a..b} (\<lambda>x. - f x)"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1863
      using con continuous_on_minus by blast
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1864
  qed (use assms in auto)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1865
  then show ?thesis
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1866
    by simp
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1867
qed
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1868
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1869
lemma DERIV_neg_imp_decreasing:
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1870
  fixes a b :: real and f :: "real \<Rightarrow> real"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1871
  assumes "a < b"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1872
    and der: "\<And>x. \<lbrakk>a \<le> x; x \<le> b\<rbrakk> \<Longrightarrow> \<exists>y. DERIV f x :> y \<and> y < 0"
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1873
  shows "f a > f b"
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1874
  by (metis less_le_not_le DERIV_atLeastAtMost_imp_continuous_on DERIV_neg_imp_decreasing_open [OF \<open>a < b\<close>] der)
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1875
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1876
lemma DERIV_nonpos_imp_nonincreasing:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1877
  fixes a b :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1878
    and f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1879
  assumes "a \<le> b"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1880
    and "\<And>x. \<lbrakk>a \<le> x; x \<le> b\<rbrakk> \<Longrightarrow> \<exists>y. DERIV f x :> y \<and> y \<le> 0"
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1881
  shows "f a \<ge> f b"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1882
proof -
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1883
  have "(\<lambda>x. -f x) a \<le> (\<lambda>x. -f x) b"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1884
    using DERIV_nonneg_imp_nondecreasing [of a b "\<lambda>x. -f x"] assms DERIV_minus by fastforce
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1885
  then show ?thesis
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1886
    by simp
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1887
qed
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1888
56289
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1889
lemma DERIV_pos_imp_increasing_at_bot:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1890
  fixes f :: "real \<Rightarrow> real"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1891
  assumes "\<And>x. x \<le> b \<Longrightarrow> (\<exists>y. DERIV f x :> y \<and> y > 0)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1892
    and lim: "(f \<longlongrightarrow> flim) at_bot"
56289
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1893
  shows "flim < f b"
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1894
proof -
63952
354808e9f44b new material connected with HOL Light measure theory, plus more rationalisation
paulson <lp15@cam.ac.uk>
parents: 63918
diff changeset
  1895
  have "\<exists>N. \<forall>n\<le>N. f n \<le> f (b - 1)"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1896
    by (rule_tac x="b - 2" in exI) (force intro: order.strict_implies_order DERIV_pos_imp_increasing assms)
63952
354808e9f44b new material connected with HOL Light measure theory, plus more rationalisation
paulson <lp15@cam.ac.uk>
parents: 63918
diff changeset
  1897
  then have "flim \<le> f (b - 1)"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1898
     by (auto simp: eventually_at_bot_linorder tendsto_upperbound [OF lim])
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1899
  also have "\<dots> < f b"
56289
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1900
    by (force intro: DERIV_pos_imp_increasing [where f=f] assms)
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1901
  finally show ?thesis .
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1902
qed
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1903
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1904
lemma DERIV_neg_imp_decreasing_at_top:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1905
  fixes f :: "real \<Rightarrow> real"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1906
  assumes der: "\<And>x. x \<ge> b \<Longrightarrow> \<exists>y. DERIV f x :> y \<and> y < 0"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1907
    and lim: "(f \<longlongrightarrow> flim) at_top"
56289
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1908
  shows "flim < f b"
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1909
  apply (rule DERIV_pos_imp_increasing_at_bot [where f = "\<lambda>i. f (-i)" and b = "-b", simplified])
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1910
   apply (metis DERIV_mirror der le_minus_iff neg_0_less_iff_less)
56289
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1911
  apply (metis filterlim_at_top_mirror lim)
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1912
  done
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1913
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1914
text \<open>Derivative of inverse function\<close>
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1915
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1916
lemma DERIV_inverse_function:
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1917
  fixes f g :: "real \<Rightarrow> real"
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1918
  assumes der: "DERIV f (g x) :> D"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1919
    and neq: "D \<noteq> 0"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1920
    and x: "a < x" "x < b"
68611
4bc4b5c0ccfc de-applying, etc.
paulson <lp15@cam.ac.uk>
parents: 68601
diff changeset
  1921
    and inj: "\<And>y. \<lbrakk>a < y; y < b\<rbrakk> \<Longrightarrow> f (g y) = y"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1922
    and cont: "isCont g x"
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1923
  shows "DERIV g x :> inverse D"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1924
unfolding has_field_derivative_iff
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1925
proof (rule LIM_equal2)
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1926
  show "0 < min (x - a) (b - x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1927
    using x by arith
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1928
next
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1929
  fix y
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1930
  assume "norm (y - x) < min (x - a) (b - x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1931
  then have "a < y" and "y < b"
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1932
    by (simp_all add: abs_less_iff)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1933
  then show "(g y - g x) / (y - x) = inverse ((f (g y) - x) / (g y - g x))"
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1934
    by (simp add: inj)
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1935
next
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
  1936
  have "(\<lambda>z. (f z - f (g x)) / (z - g x)) \<midarrow>g x\<rightarrow> D"
68634
db0980691ef4 more de-applying and a fix
paulson <lp15@cam.ac.uk>
parents: 68611
diff changeset
  1937
    by (rule der [unfolded has_field_derivative_iff])
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1938
  then have 1: "(\<lambda>z. (f z - x) / (z - g x)) \<midarrow>g x\<rightarrow> D"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1939
    using inj x by simp
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1940
  have 2: "\<exists>d>0. \<forall>y. y \<noteq> x \<and> norm (y - x) < d \<longrightarrow> g y \<noteq> g x"
56219
bf80d125406b tuned proofs;
wenzelm
parents: 56217
diff changeset
  1941
  proof (rule exI, safe)
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1942
    show "0 < min (x - a) (b - x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1943
      using x by simp
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1944
  next
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1945
    fix y
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1946
    assume "norm (y - x) < min (x - a) (b - x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1947
    then have y: "a < y" "y < b"
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1948
      by (simp_all add: abs_less_iff)
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1949
    assume "g y = g x"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1950
    then have "f (g y) = f (g x)" by simp
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1951
    then have "y = x" using inj y x by simp
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1952
    also assume "y \<noteq> x"
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1953
    finally show False by simp
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1954
  qed
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
  1955
  have "(\<lambda>y. (f (g y) - x) / (g y - g x)) \<midarrow>x\<rightarrow> D"
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1956
    using cont 1 2 by (rule isCont_LIM_compose2)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1957
  then show "(\<lambda>y. inverse ((f (g y) - x) / (g y - g x))) \<midarrow>x\<rightarrow> inverse D"
44568
e6f291cb5810 discontinue many legacy theorems about LIM and LIMSEQ, in favor of tendsto theorems
huffman
parents: 44317
diff changeset
  1958
    using neq by (rule tendsto_inverse)
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1959
qed
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1960
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1961
subsection \<open>Generalized Mean Value Theorem\<close>
29975
28c5322f0df3 more subsection headings
huffman
parents: 29803
diff changeset
  1962
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1963
theorem GMVT:
21784
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
  1964
  fixes a b :: real
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1965
  assumes alb: "a < b"
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1966
    and fc: "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont f x"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1967
    and fd: "\<forall>x. a < x \<and> x < b \<longrightarrow> f differentiable (at x)"
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1968
    and gc: "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont g x"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1969
    and gd: "\<forall>x. a < x \<and> x < b \<longrightarrow> g differentiable (at x)"
53381
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  1970
  shows "\<exists>g'c f'c c.
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1971
    DERIV g c :> g'c \<and> DERIV f c :> f'c \<and> a < c \<and> c < b \<and> (f b - f a) * g'c = (g b - g a) * f'c"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1972
proof -
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1973
  let ?h = "\<lambda>x. (f b - f a) * g x - (g b - g a) * f x"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1974
  have "\<exists>l z. a < z \<and> z < b \<and> DERIV ?h z :> l \<and> ?h b - ?h a = (b - a) * l"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1975
  proof (rule MVT)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1976
    from assms show "a < b" by simp
69020
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1977
    show "continuous_on {a..b} ?h"
4f94e262976d elimination of near duplication involving Rolle's theorem and the MVT
paulson <lp15@cam.ac.uk>
parents: 68644
diff changeset
  1978
      by (simp add: continuous_at_imp_continuous_on fc gc)
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  1979
    show "\<And>x. \<lbrakk>a < x; x < b\<rbrakk> \<Longrightarrow> ?h differentiable (at x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1980
      using fd gd by simp
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1981
  qed
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1982
  then obtain l where l: "\<exists>z. a < z \<and> z < b \<and> DERIV ?h z :> l \<and> ?h b - ?h a = (b - a) * l" ..
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1983
  then obtain c where c: "a < c \<and> c < b \<and> DERIV ?h c :> l \<and> ?h b - ?h a = (b - a) * l" ..
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1984
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1985
  from c have cint: "a < c \<and> c < b" by auto
69022
e2858770997a removal of more redundancies, and fixes
paulson <lp15@cam.ac.uk>
parents: 69020
diff changeset
  1986
  then obtain g'c where g'c: "DERIV g c :> g'c"
e2858770997a removal of more redundancies, and fixes
paulson <lp15@cam.ac.uk>
parents: 69020
diff changeset
  1987
    using gd real_differentiable_def by blast 
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1988
  from c have "a < c \<and> c < b" by auto
69022
e2858770997a removal of more redundancies, and fixes
paulson <lp15@cam.ac.uk>
parents: 69020
diff changeset
  1989
  then obtain f'c where f'c: "DERIV f c :> f'c"
e2858770997a removal of more redundancies, and fixes
paulson <lp15@cam.ac.uk>
parents: 69020
diff changeset
  1990
    using fd real_differentiable_def by blast 
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1991
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1992
  from c have "DERIV ?h c :> l" by auto
41368
8afa26855137 use DERIV_intros
hoelzl
parents: 37891
diff changeset
  1993
  moreover have "DERIV ?h c :>  g'c * (f b - f a) - f'c * (g b - g a)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1994
    using g'c f'c by (auto intro!: derivative_eq_intros)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1995
  ultimately have leq: "l =  g'c * (f b - f a) - f'c * (g b - g a)" by (rule DERIV_unique)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1996
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1997
  have "?h b - ?h a = (b - a) * (g'c * (f b - f a) - f'c * (g b - g a))"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1998
  proof -
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  1999
    from c have "?h b - ?h a = (b - a) * l" by auto
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 51642
diff changeset
  2000
    also from leq have "\<dots> = (b - a) * (g'c * (f b - f a) - f'c * (g b - g a))" by simp
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2001
    finally show ?thesis by simp
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2002
  qed
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2003
  moreover have "?h b - ?h a = 0"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2004
  proof -
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  2005
    have "?h b - ?h a =
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2006
      ((f b)*(g b) - (f a)*(g b) - (g b)*(f b) + (g a)*(f b)) -
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2007
      ((f b)*(g a) - (f a)*(g a) - (g b)*(f a) + (g a)*(f a))"
29667
53103fc8ffa3 Replaced group_ and ring_simps by algebra_simps;
nipkow
parents: 29472
diff changeset
  2008
      by (simp add: algebra_simps)
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2009
    then show ?thesis  by auto
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2010
  qed
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  2011
  ultimately have "(b - a) * (g'c * (f b - f a) - f'c * (g b - g a)) = 0" by auto
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  2012
  with alb have "g'c * (f b - f a) - f'c * (g b - g a) = 0" by simp
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2013
  then have "g'c * (f b - f a) = f'c * (g b - g a)" by simp
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2014
  then have "(f b - f a) * g'c = (g b - g a) * f'c" by (simp add: ac_simps)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2015
  with g'c f'c cint show ?thesis by auto
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  2016
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  2017
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2018
lemma GMVT':
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2019
  fixes f g :: "real \<Rightarrow> real"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2020
  assumes "a < b"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2021
    and isCont_f: "\<And>z. a \<le> z \<Longrightarrow> z \<le> b \<Longrightarrow> isCont f z"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2022
    and isCont_g: "\<And>z. a \<le> z \<Longrightarrow> z \<le> b \<Longrightarrow> isCont g z"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2023
    and DERIV_g: "\<And>z. a < z \<Longrightarrow> z < b \<Longrightarrow> DERIV g z :> (g' z)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2024
    and DERIV_f: "\<And>z. a < z \<Longrightarrow> z < b \<Longrightarrow> DERIV f z :> (f' z)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2025
  shows "\<exists>c. a < c \<and> c < b \<and> (f b - f a) * g' c = (g b - g a) * f' c"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2026
proof -
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2027
  have "\<exists>g'c f'c c. DERIV g c :> g'c \<and> DERIV f c :> f'c \<and>
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2028
      a < c \<and> c < b \<and> (f b - f a) * g'c = (g b - g a) * f'c"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  2029
    using assms by (intro GMVT) (force simp: real_differentiable_def)+
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2030
  then obtain c where "a < c" "c < b" "(f b - f a) * g' c = (g b - g a) * f' c"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2031
    using DERIV_f DERIV_g by (force dest: DERIV_unique)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2032
  then show ?thesis
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2033
    by auto
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2034
qed
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2035
51529
2d2f59e6055a move theorems about compactness of real closed intervals, the intermediate value theorem, and lemmas about continuity of bijective functions from Deriv.thy to Limits.thy
hoelzl
parents: 51526
diff changeset
  2036
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  2037
subsection \<open>L'Hopitals rule\<close>
51529
2d2f59e6055a move theorems about compactness of real closed intervals, the intermediate value theorem, and lemmas about continuity of bijective functions from Deriv.thy to Limits.thy
hoelzl
parents: 51526
diff changeset
  2038
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  2039
lemma isCont_If_ge:
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  2040
  fixes a :: "'a :: linorder_topology"
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2041
  assumes "continuous (at_left a) g" and f: "(f \<longlongrightarrow> g a) (at_right a)"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2042
  shows "isCont (\<lambda>x. if x \<le> a then g x else f x) a" (is "isCont ?gf a")
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2043
proof -
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2044
  have g: "(g \<longlongrightarrow> g a) (at_left a)"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2045
    using assms continuous_within by blast
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2046
  show ?thesis
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2047
    unfolding isCont_def continuous_within
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2048
  proof (intro filterlim_split_at; simp)
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2049
    show "(?gf \<longlongrightarrow> g a) (at_left a)"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2050
      by (subst filterlim_cong[OF refl refl, where g=g]) (simp_all add: eventually_at_filter less_le g)
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2051
    show "(?gf \<longlongrightarrow> g a) (at_right a)"
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2052
      by (subst filterlim_cong[OF refl refl, where g=f]) (simp_all add: eventually_at_filter less_le f)
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2053
  qed
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2054
qed
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  2055
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2056
lemma lhopital_right_0:
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2057
  fixes f0 g0 :: "real \<Rightarrow> real"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2058
  assumes f_0: "(f0 \<longlongrightarrow> 0) (at_right 0)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2059
    and g_0: "(g0 \<longlongrightarrow> 0) (at_right 0)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2060
    and ev:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2061
      "eventually (\<lambda>x. g0 x \<noteq> 0) (at_right 0)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2062
      "eventually (\<lambda>x. g' x \<noteq> 0) (at_right 0)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2063
      "eventually (\<lambda>x. DERIV f0 x :> f' x) (at_right 0)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2064
      "eventually (\<lambda>x. DERIV g0 x :> g' x) (at_right 0)"
63713
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2065
    and lim: "filterlim (\<lambda> x. (f' x / g' x)) F (at_right 0)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2066
  shows "filterlim (\<lambda> x. f0 x / g0 x) F (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2067
proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
  2068
  define f where [abs_def]: "f x = (if x \<le> 0 then 0 else f0 x)" for x
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2069
  then have "f 0 = 0" by simp
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2070
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
  2071
  define g where [abs_def]: "g x = (if x \<le> 0 then 0 else g0 x)" for x
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2072
  then have "g 0 = 0" by simp
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2073
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2074
  have "eventually (\<lambda>x. g0 x \<noteq> 0 \<and> g' x \<noteq> 0 \<and>
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2075
      DERIV f0 x :> (f' x) \<and> DERIV g0 x :> (g' x)) (at_right 0)"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2076
    using ev by eventually_elim auto
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2077
  then obtain a where [arith]: "0 < a"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2078
    and g0_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g0 x \<noteq> 0"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2079
    and g'_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g' x \<noteq> 0"
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2080
    and f0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> DERIV f0 x :> (f' x)"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2081
    and g0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> DERIV g0 x :> (g' x)"
56219
bf80d125406b tuned proofs;
wenzelm
parents: 56217
diff changeset
  2082
    unfolding eventually_at by (auto simp: dist_real_def)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2083
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2084
  have g_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g x \<noteq> 0"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2085
    using g0_neq_0 by (simp add: g_def)
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2086
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2087
  have f: "DERIV f x :> (f' x)" if x: "0 < x" "x < a" for x
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2088
    using that
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2089
    by (intro DERIV_cong_ev[THEN iffD1, OF _ _ _ f0[OF x]])
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2090
      (auto simp: f_def eventually_nhds_metric dist_real_def intro!: exI[of _ x])
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2091
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2092
  have g: "DERIV g x :> (g' x)" if x: "0 < x" "x < a" for x
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2093
    using that
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2094
    by (intro DERIV_cong_ev[THEN iffD1, OF _ _ _ g0[OF x]])
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2095
         (auto simp: g_def eventually_nhds_metric dist_real_def intro!: exI[of _ x])
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2096
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2097
  have "isCont f 0"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  2098
    unfolding f_def by (intro isCont_If_ge f_0 continuous_const)
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  2099
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2100
  have "isCont g 0"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  2101
    unfolding g_def by (intro isCont_If_ge g_0 continuous_const)
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2102
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2103
  have "\<exists>\<zeta>. \<forall>x\<in>{0 <..< a}. 0 < \<zeta> x \<and> \<zeta> x < x \<and> f x / g x = f' (\<zeta> x) / g' (\<zeta> x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2104
  proof (rule bchoice, rule ballI)
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2105
    fix x
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2106
    assume "x \<in> {0 <..< a}"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2107
    then have x[arith]: "0 < x" "x < a" by auto
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  2108
    with g'_neq_0 g_neq_0 \<open>g 0 = 0\<close> have g': "\<And>x. 0 < x \<Longrightarrow> x < a  \<Longrightarrow> 0 \<noteq> g' x" "g 0 \<noteq> g x"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2109
      by auto
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  2110
    have "\<And>x. 0 \<le> x \<Longrightarrow> x < a \<Longrightarrow> isCont f x"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  2111
      using \<open>isCont f 0\<close> f by (auto intro: DERIV_isCont simp: le_less)
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  2112
    moreover have "\<And>x. 0 \<le> x \<Longrightarrow> x < a \<Longrightarrow> isCont g x"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  2113
      using \<open>isCont g 0\<close> g by (auto intro: DERIV_isCont simp: le_less)
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  2114
    ultimately have "\<exists>c. 0 < c \<and> c < x \<and> (f x - f 0) * g' c = (g x - g 0) * f' c"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  2115
      using f g \<open>x < a\<close> by (intro GMVT') auto
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 51642
diff changeset
  2116
    then obtain c where *: "0 < c" "c < x" "(f x - f 0) * g' c = (g x - g 0) * f' c"
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 51642
diff changeset
  2117
      by blast
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2118
    moreover
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 51642
diff changeset
  2119
    from * g'(1)[of c] g'(2) have "(f x - f 0)  / (g x - g 0) = f' c / g' c"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2120
      by (simp add: field_simps)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2121
    ultimately show "\<exists>y. 0 < y \<and> y < x \<and> f x / g x = f' y / g' y"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  2122
      using \<open>f 0 = 0\<close> \<open>g 0 = 0\<close> by (auto intro!: exI[of _ c])
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2123
  qed
53381
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  2124
  then obtain \<zeta> where "\<forall>x\<in>{0 <..< a}. 0 < \<zeta> x \<and> \<zeta> x < x \<and> f x / g x = f' (\<zeta> x) / g' (\<zeta> x)" ..
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2125
  then have \<zeta>: "eventually (\<lambda>x. 0 < \<zeta> x \<and> \<zeta> x < x \<and> f x / g x = f' (\<zeta> x) / g' (\<zeta> x)) (at_right 0)"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  2126
    unfolding eventually_at by (intro exI[of _ a]) (auto simp: dist_real_def)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2127
  moreover
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2128
  from \<zeta> have "eventually (\<lambda>x. norm (\<zeta> x) \<le> x) (at_right 0)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2129
    by eventually_elim auto
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2130
  then have "((\<lambda>x. norm (\<zeta> x)) \<longlongrightarrow> 0) (at_right 0)"
58729
e8ecc79aee43 add tendsto_const and tendsto_ident_at as simp and intro rules
hoelzl
parents: 57953
diff changeset
  2131
    by (rule_tac real_tendsto_sandwich[where f="\<lambda>x. 0" and h="\<lambda>x. x"]) auto
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2132
  then have "(\<zeta> \<longlongrightarrow> 0) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2133
    by (rule tendsto_norm_zero_cancel)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2134
  with \<zeta> have "filterlim \<zeta> (at_right 0) (at_right 0)"
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61799
diff changeset
  2135
    by (auto elim!: eventually_mono simp: filterlim_at)
63713
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2136
  from this lim have "filterlim (\<lambda>t. f' (\<zeta> t) / g' (\<zeta> t)) F (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2137
    by (rule_tac filterlim_compose[of _ _ _ \<zeta>])
63713
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2138
  ultimately have "filterlim (\<lambda>t. f t / g t) F (at_right 0)" (is ?P)
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  2139
    by (rule_tac filterlim_cong[THEN iffD1, OF refl refl])
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61799
diff changeset
  2140
       (auto elim: eventually_mono)
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2141
  also have "?P \<longleftrightarrow> ?thesis"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  2142
    by (rule filterlim_cong) (auto simp: f_def g_def eventually_at_filter)
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  2143
  finally show ?thesis .
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2144
qed
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2145
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2146
lemma lhopital_right:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2147
  "(f \<longlongrightarrow> 0) (at_right x) \<Longrightarrow> (g \<longlongrightarrow> 0) (at_right x) \<Longrightarrow>
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2148
    eventually (\<lambda>x. g x \<noteq> 0) (at_right x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2149
    eventually (\<lambda>x. g' x \<noteq> 0) (at_right x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2150
    eventually (\<lambda>x. DERIV f x :> f' x) (at_right x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2151
    eventually (\<lambda>x. DERIV g x :> g' x) (at_right x) \<Longrightarrow>
63713
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2152
    filterlim (\<lambda> x. (f' x / g' x)) F (at_right x) \<Longrightarrow>
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2153
  filterlim (\<lambda> x. f x / g x) F (at_right x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2154
  for x :: real
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2155
  unfolding eventually_at_right_to_0[of _ x] filterlim_at_right_to_0[of _ _ x] DERIV_shift
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2156
  by (rule lhopital_right_0)
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2157
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2158
lemma lhopital_left:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2159
  "(f \<longlongrightarrow> 0) (at_left x) \<Longrightarrow> (g \<longlongrightarrow> 0) (at_left x) \<Longrightarrow>
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2160
    eventually (\<lambda>x. g x \<noteq> 0) (at_left x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2161
    eventually (\<lambda>x. g' x \<noteq> 0) (at_left x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2162
    eventually (\<lambda>x. DERIV f x :> f' x) (at_left x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2163
    eventually (\<lambda>x. DERIV g x :> g' x) (at_left x) \<Longrightarrow>
63713
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2164
    filterlim (\<lambda> x. (f' x / g' x)) F (at_left x) \<Longrightarrow>
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2165
  filterlim (\<lambda> x. f x / g x) F (at_left x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2166
  for x :: real
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2167
  unfolding eventually_at_left_to_right filterlim_at_left_to_right DERIV_mirror
56479
91958d4b30f7 revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
hoelzl
parents: 56409
diff changeset
  2168
  by (rule lhopital_right[where f'="\<lambda>x. - f' (- x)"]) (auto simp: DERIV_mirror)
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2169
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2170
lemma lhopital:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2171
  "(f \<longlongrightarrow> 0) (at x) \<Longrightarrow> (g \<longlongrightarrow> 0) (at x) \<Longrightarrow>
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2172
    eventually (\<lambda>x. g x \<noteq> 0) (at x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2173
    eventually (\<lambda>x. g' x \<noteq> 0) (at x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2174
    eventually (\<lambda>x. DERIV f x :> f' x) (at x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2175
    eventually (\<lambda>x. DERIV g x :> g' x) (at x) \<Longrightarrow>
63713
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2176
    filterlim (\<lambda> x. (f' x / g' x)) F (at x) \<Longrightarrow>
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2177
  filterlim (\<lambda> x. f x / g x) F (at x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2178
  for x :: real
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2179
  unfolding eventually_at_split filterlim_at_split
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2180
  by (auto intro!: lhopital_right[of f x g g' f'] lhopital_left[of f x g g' f'])
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2181
63713
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2182
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2183
lemma lhopital_right_0_at_top:
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2184
  fixes f g :: "real \<Rightarrow> real"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2185
  assumes g_0: "LIM x at_right 0. g x :> at_top"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2186
    and ev:
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2187
      "eventually (\<lambda>x. g' x \<noteq> 0) (at_right 0)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2188
      "eventually (\<lambda>x. DERIV f x :> f' x) (at_right 0)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2189
      "eventually (\<lambda>x. DERIV g x :> g' x) (at_right 0)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2190
    and lim: "((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> x) (at_right 0)"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2191
  shows "((\<lambda> x. f x / g x) \<longlongrightarrow> x) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2192
  unfolding tendsto_iff
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2193
proof safe
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2194
  fix e :: real
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2195
  assume "0 < e"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2196
  with lim[unfolded tendsto_iff, rule_format, of "e / 4"]
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2197
  have "eventually (\<lambda>t. dist (f' t / g' t) x < e / 4) (at_right 0)"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2198
    by simp
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2199
  from eventually_conj[OF eventually_conj[OF ev(1) ev(2)] eventually_conj[OF ev(3) this]]
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2200
  obtain a where [arith]: "0 < a"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2201
    and g'_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g' x \<noteq> 0"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2202
    and f0: "\<And>x. 0 < x \<Longrightarrow> x \<le> a \<Longrightarrow> DERIV f x :> (f' x)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2203
    and g0: "\<And>x. 0 < x \<Longrightarrow> x \<le> a \<Longrightarrow> DERIV g x :> (g' x)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2204
    and Df: "\<And>t. 0 < t \<Longrightarrow> t < a \<Longrightarrow> dist (f' t / g' t) x < e / 4"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  2205
    unfolding eventually_at_le by (auto simp: dist_real_def)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2206
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2207
  from Df have "eventually (\<lambda>t. t < a) (at_right 0)" "eventually (\<lambda>t::real. 0 < t) (at_right 0)"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  2208
    unfolding eventually_at by (auto intro!: exI[of _ a] simp: dist_real_def)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2209
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2210
  moreover
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  2211
  have "eventually (\<lambda>t. 0 < g t) (at_right 0)" "eventually (\<lambda>t. g a < g t) (at_right 0)"
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61799
diff changeset
  2212
    using g_0 by (auto elim: eventually_mono simp: filterlim_at_top_dense)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2213
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2214
  moreover
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2215
  have inv_g: "((\<lambda>x. inverse (g x)) \<longlongrightarrow> 0) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2216
    using tendsto_inverse_0 filterlim_mono[OF g_0 at_top_le_at_infinity order_refl]
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2217
    by (rule filterlim_compose)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2218
  then have "((\<lambda>x. norm (1 - g a * inverse (g x))) \<longlongrightarrow> norm (1 - g a * 0)) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2219
    by (intro tendsto_intros)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2220
  then have "((\<lambda>x. norm (1 - g a / g x)) \<longlongrightarrow> 1) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2221
    by (simp add: inverse_eq_divide)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2222
  from this[unfolded tendsto_iff, rule_format, of 1]
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2223
  have "eventually (\<lambda>x. norm (1 - g a / g x) < 2) (at_right 0)"
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61799
diff changeset
  2224
    by (auto elim!: eventually_mono simp: dist_real_def)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2225
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2226
  moreover
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2227
  from inv_g have "((\<lambda>t. norm ((f a - x * g a) * inverse (g t))) \<longlongrightarrow> norm ((f a - x * g a) * 0))
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2228
      (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2229
    by (intro tendsto_intros)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2230
  then have "((\<lambda>t. norm (f a - x * g a) / norm (g t)) \<longlongrightarrow> 0) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2231
    by (simp add: inverse_eq_divide)
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  2232
  from this[unfolded tendsto_iff, rule_format, of "e / 2"] \<open>0 < e\<close>
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2233
  have "eventually (\<lambda>t. norm (f a - x * g a) / norm (g t) < e / 2) (at_right 0)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2234
    by (auto simp: dist_real_def)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2235
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2236
  ultimately show "eventually (\<lambda>t. dist (f t / g t) x < e) (at_right 0)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2237
  proof eventually_elim
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2238
    fix t assume t[arith]: "0 < t" "t < a" "g a < g t" "0 < g t"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2239
    assume ineq: "norm (1 - g a / g t) < 2" "norm (f a - x * g a) / norm (g t) < e / 2"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2240
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2241
    have "\<exists>y. t < y \<and> y < a \<and> (g a - g t) * f' y = (f a - f t) * g' y"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2242
      using f0 g0 t(1,2) by (intro GMVT') (force intro!: DERIV_isCont)+
53381
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  2243
    then obtain y where [arith]: "t < y" "y < a"
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  2244
      and D_eq0: "(g a - g t) * f' y = (f a - f t) * g' y"
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  2245
      by blast
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  2246
    from D_eq0 have D_eq: "(f t - f a) / (g t - g a) = f' y / g' y"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  2247
      using \<open>g a < g t\<close> g'_neq_0[of y] by (auto simp add: field_simps)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2248
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2249
    have *: "f t / g t - x = ((f t - f a) / (g t - g a) - x) * (1 - g a / g t) + (f a - x * g a) / g t"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2250
      by (simp add: field_simps)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2251
    have "norm (f t / g t - x) \<le>
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2252
        norm (((f t - f a) / (g t - g a) - x) * (1 - g a / g t)) + norm ((f a - x * g a) / g t)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2253
      unfolding * by (rule norm_triangle_ineq)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2254
    also have "\<dots> = dist (f' y / g' y) x * norm (1 - g a / g t) + norm (f a - x * g a) / norm (g t)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2255
      by (simp add: abs_mult D_eq dist_real_def)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2256
    also have "\<dots> < (e / 4) * 2 + e / 2"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  2257
      using ineq Df[of y] \<open>0 < e\<close> by (intro add_le_less_mono mult_mono) auto
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2258
    finally show "dist (f t / g t) x < e"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2259
      by (simp add: dist_real_def)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2260
  qed
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2261
qed
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  2262
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2263
lemma lhopital_right_at_top:
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2264
  "LIM x at_right x. (g::real \<Rightarrow> real) x :> at_top \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2265
    eventually (\<lambda>x. g' x \<noteq> 0) (at_right x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2266
    eventually (\<lambda>x. DERIV f x :> f' x) (at_right x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2267
    eventually (\<lambda>x. DERIV g x :> g' x) (at_right x) \<Longrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2268
    ((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> y) (at_right x) \<Longrightarrow>
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2269
    ((\<lambda> x. f x / g x) \<longlongrightarrow> y) (at_right x)"
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2270
  unfolding eventually_at_right_to_0[of _ x] filterlim_at_right_to_0[of _ _ x] DERIV_shift
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2271
  by (rule lhopital_right_0_at_top)
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2272
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2273
lemma lhopital_left_at_top:
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2274
  "LIM x at_left x. g x :> at_top \<Longrightarrow>
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2275
    eventually (\<lambda>x. g' x \<noteq> 0) (at_left x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2276
    eventually (\<lambda>x. DERIV f x :> f' x) (at_left x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2277
    eventually (\<lambda>x. DERIV g x :> g' x) (at_left x) \<Longrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2278
    ((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> y) (at_left x) \<Longrightarrow>
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2279
    ((\<lambda> x. f x / g x) \<longlongrightarrow> y) (at_left x)"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2280
  for x :: real
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2281
  unfolding eventually_at_left_to_right filterlim_at_left_to_right DERIV_mirror
56479
91958d4b30f7 revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
hoelzl
parents: 56409
diff changeset
  2282
  by (rule lhopital_right_at_top[where f'="\<lambda>x. - f' (- x)"]) (auto simp: DERIV_mirror)
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2283
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2284
lemma lhopital_at_top:
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2285
  "LIM x at x. (g::real \<Rightarrow> real) x :> at_top \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2286
    eventually (\<lambda>x. g' x \<noteq> 0) (at x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2287
    eventually (\<lambda>x. DERIV f x :> f' x) (at x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2288
    eventually (\<lambda>x. DERIV g x :> g' x) (at x) \<Longrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2289
    ((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> y) (at x) \<Longrightarrow>
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2290
    ((\<lambda> x. f x / g x) \<longlongrightarrow> y) (at x)"
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2291
  unfolding eventually_at_split filterlim_at_split
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2292
  by (auto intro!: lhopital_right_at_top[of g x g' f f'] lhopital_left_at_top[of g x g' f f'])
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  2293
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2294
lemma lhospital_at_top_at_top:
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2295
  fixes f g :: "real \<Rightarrow> real"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2296
  assumes g_0: "LIM x at_top. g x :> at_top"
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2297
    and g': "eventually (\<lambda>x. g' x \<noteq> 0) at_top"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2298
    and Df: "eventually (\<lambda>x. DERIV f x :> f' x) at_top"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2299
    and Dg: "eventually (\<lambda>x. DERIV g x :> g' x) at_top"
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2300
    and lim: "((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> x) at_top"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2301
  shows "((\<lambda> x. f x / g x) \<longlongrightarrow> x) at_top"
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2302
  unfolding filterlim_at_top_to_right
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2303
proof (rule lhopital_right_0_at_top)
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2304
  let ?F = "\<lambda>x. f (inverse x)"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2305
  let ?G = "\<lambda>x. g (inverse x)"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2306
  let ?R = "at_right (0::real)"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2307
  let ?D = "\<lambda>f' x. f' (inverse x) * - (inverse x ^ Suc (Suc 0))"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2308
  show "LIM x ?R. ?G x :> at_top"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2309
    using g_0 unfolding filterlim_at_top_to_right .
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2310
  show "eventually (\<lambda>x. DERIV ?G x  :> ?D g' x) ?R"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2311
    unfolding eventually_at_right_to_top
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2312
    using Dg eventually_ge_at_top[where c=1]
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2313
    by eventually_elim (rule derivative_eq_intros DERIV_chain'[where f=inverse] | simp)+
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2314
  show "eventually (\<lambda>x. DERIV ?F x  :> ?D f' x) ?R"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2315
    unfolding eventually_at_right_to_top
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2316
    using Df eventually_ge_at_top[where c=1]
68638
87d1bff264df de-applying and meta-quantifying
paulson <lp15@cam.ac.uk>
parents: 68635
diff changeset
  2317
    by eventually_elim (rule derivative_eq_intros DERIV_chain'[where f=inverse] | simp)+
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2318
  show "eventually (\<lambda>x. ?D g' x \<noteq> 0) ?R"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2319
    unfolding eventually_at_right_to_top
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2320
    using g' eventually_ge_at_top[where c=1]
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2321
    by eventually_elim auto
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  2322
  show "((\<lambda>x. ?D f' x / ?D g' x) \<longlongrightarrow> x) ?R"
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2323
    unfolding filterlim_at_right_to_top
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2324
    apply (intro filterlim_cong[THEN iffD2, OF refl refl _ lim])
63558
0aa33085c8b1 misc tuning and modernization;
wenzelm
parents: 63469
diff changeset
  2325
    using eventually_ge_at_top[where c=1]
56479
91958d4b30f7 revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
hoelzl
parents: 56409
diff changeset
  2326
    by eventually_elim simp
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2327
qed
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  2328
63713
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2329
lemma lhopital_right_at_top_at_top:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2330
  fixes f g :: "real \<Rightarrow> real"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2331
  assumes f_0: "LIM x at_right a. f x :> at_top"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2332
  assumes g_0: "LIM x at_right a. g x :> at_top"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2333
    and ev:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2334
      "eventually (\<lambda>x. DERIV f x :> f' x) (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2335
      "eventually (\<lambda>x. DERIV g x :> g' x) (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2336
    and lim: "filterlim (\<lambda> x. (f' x / g' x)) at_top (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2337
  shows "filterlim (\<lambda> x. f x / g x) at_top (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2338
proof -
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2339
  from lim have pos: "eventually (\<lambda>x. f' x / g' x > 0) (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2340
    unfolding filterlim_at_top_dense by blast
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2341
  have "((\<lambda>x. g x / f x) \<longlongrightarrow> 0) (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2342
  proof (rule lhopital_right_at_top)
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2343
    from pos show "eventually (\<lambda>x. f' x \<noteq> 0) (at_right a)" by eventually_elim auto
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2344
    from tendsto_inverse_0_at_top[OF lim]
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2345
      show "((\<lambda>x. g' x / f' x) \<longlongrightarrow> 0) (at_right a)" by simp
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2346
  qed fact+
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2347
  moreover from f_0 g_0 
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2348
    have "eventually (\<lambda>x. f x > 0) (at_right a)" "eventually (\<lambda>x. g x > 0) (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2349
    unfolding filterlim_at_top_dense by blast+
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2350
  hence "eventually (\<lambda>x. g x / f x > 0) (at_right a)" by eventually_elim simp
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2351
  ultimately have "filterlim (\<lambda>x. inverse (g x / f x)) at_top (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2352
    by (rule filterlim_inverse_at_top)
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2353
  thus ?thesis by simp
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2354
qed
63717
3b0500bd2240 remove spurious find_theorems
hoelzl
parents: 63713
diff changeset
  2355
63713
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2356
lemma lhopital_right_at_top_at_bot:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2357
  fixes f g :: "real \<Rightarrow> real"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2358
  assumes f_0: "LIM x at_right a. f x :> at_top"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2359
  assumes g_0: "LIM x at_right a. g x :> at_bot"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2360
    and ev:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2361
      "eventually (\<lambda>x. DERIV f x :> f' x) (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2362
      "eventually (\<lambda>x. DERIV g x :> g' x) (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2363
    and lim: "filterlim (\<lambda> x. (f' x / g' x)) at_bot (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2364
  shows "filterlim (\<lambda> x. f x / g x) at_bot (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2365
proof -
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2366
  from ev(2) have ev': "eventually (\<lambda>x. DERIV (\<lambda>x. -g x) x :> -g' x) (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2367
    by eventually_elim (auto intro: derivative_intros)
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2368
  have "filterlim (\<lambda>x. f x / (-g x)) at_top (at_right a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2369
    by (rule lhopital_right_at_top_at_top[where f' = f' and g' = "\<lambda>x. -g' x"])
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2370
       (insert assms ev', auto simp: filterlim_uminus_at_bot)
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2371
  hence "filterlim (\<lambda>x. -(f x / g x)) at_top (at_right a)" by simp
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2372
  thus ?thesis by (simp add: filterlim_uminus_at_bot)
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2373
qed
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2374
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2375
lemma lhopital_left_at_top_at_top:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2376
  fixes f g :: "real \<Rightarrow> real"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2377
  assumes f_0: "LIM x at_left a. f x :> at_top"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2378
  assumes g_0: "LIM x at_left a. g x :> at_top"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2379
    and ev:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2380
      "eventually (\<lambda>x. DERIV f x :> f' x) (at_left a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2381
      "eventually (\<lambda>x. DERIV g x :> g' x) (at_left a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2382
    and lim: "filterlim (\<lambda> x. (f' x / g' x)) at_top (at_left a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2383
  shows "filterlim (\<lambda> x. f x / g x) at_top (at_left a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2384
  by (insert assms, unfold eventually_at_left_to_right filterlim_at_left_to_right DERIV_mirror,
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2385
      rule lhopital_right_at_top_at_top[where f'="\<lambda>x. - f' (- x)"]) 
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2386
     (insert assms, auto simp: DERIV_mirror)
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2387
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2388
lemma lhopital_left_at_top_at_bot:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2389
  fixes f g :: "real \<Rightarrow> real"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2390
  assumes f_0: "LIM x at_left a. f x :> at_top"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2391
  assumes g_0: "LIM x at_left a. g x :> at_bot"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2392
    and ev:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2393
      "eventually (\<lambda>x. DERIV f x :> f' x) (at_left a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2394
      "eventually (\<lambda>x. DERIV g x :> g' x) (at_left a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2395
    and lim: "filterlim (\<lambda> x. (f' x / g' x)) at_bot (at_left a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2396
  shows "filterlim (\<lambda> x. f x / g x) at_bot (at_left a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2397
  by (insert assms, unfold eventually_at_left_to_right filterlim_at_left_to_right DERIV_mirror,
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2398
      rule lhopital_right_at_top_at_bot[where f'="\<lambda>x. - f' (- x)"]) 
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2399
     (insert assms, auto simp: DERIV_mirror)
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2400
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2401
lemma lhopital_at_top_at_top:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2402
  fixes f g :: "real \<Rightarrow> real"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2403
  assumes f_0: "LIM x at a. f x :> at_top"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2404
  assumes g_0: "LIM x at a. g x :> at_top"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2405
    and ev:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2406
      "eventually (\<lambda>x. DERIV f x :> f' x) (at a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2407
      "eventually (\<lambda>x. DERIV g x :> g' x) (at a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2408
    and lim: "filterlim (\<lambda> x. (f' x / g' x)) at_top (at a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2409
  shows "filterlim (\<lambda> x. f x / g x) at_top (at a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2410
  using assms unfolding eventually_at_split filterlim_at_split
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2411
  by (auto intro!: lhopital_right_at_top_at_top[of f a g f' g'] 
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2412
                   lhopital_left_at_top_at_top[of f a g f' g'])
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2413
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2414
lemma lhopital_at_top_at_bot:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2415
  fixes f g :: "real \<Rightarrow> real"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2416
  assumes f_0: "LIM x at a. f x :> at_top"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2417
  assumes g_0: "LIM x at a. g x :> at_bot"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2418
    and ev:
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2419
      "eventually (\<lambda>x. DERIV f x :> f' x) (at a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2420
      "eventually (\<lambda>x. DERIV g x :> g' x) (at a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2421
    and lim: "filterlim (\<lambda> x. (f' x / g' x)) at_bot (at a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2422
  shows "filterlim (\<lambda> x. f x / g x) at_bot (at a)"
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2423
  using assms unfolding eventually_at_split filterlim_at_split
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2424
  by (auto intro!: lhopital_right_at_top_at_bot[of f a g f' g'] 
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2425
                   lhopital_left_at_top_at_bot[of f a g f' g'])
009e176e1010 Tuned L'Hospital
eberlm <eberlm@in.tum.de>
parents: 63648
diff changeset
  2426
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  2427
end