src/HOL/Analysis/Smooth_Paths.thy
author haftmann
Thu, 19 Jun 2025 17:15:40 +0200
changeset 82734 89347c0cc6a3
parent 80052 35b2143aeec6
permissions -rw-r--r--
treat map_filter similar to list_all, list_ex, list_ex1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     1
(*
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     2
  Material originally from HOL Light, ported by Larry Paulson, moved here by Manuel Eberl
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     3
*)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     4
section\<^marker>\<open>tag unimportant\<close> \<open>Smooth paths\<close>
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     5
theory Smooth_Paths
80052
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
     6
  imports Retracts
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     7
begin
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     8
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     9
subsection\<^marker>\<open>tag unimportant\<close> \<open>Homeomorphisms of arc images\<close>
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    10
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    11
lemma path_connected_arc_complement:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    12
  fixes \<gamma> :: "real \<Rightarrow> 'a::euclidean_space"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    13
  assumes "arc \<gamma>" "2 \<le> DIM('a)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    14
  shows "path_connected(- path_image \<gamma>)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    15
proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    16
  have "path_image \<gamma> homeomorphic {0..1::real}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    17
    by (simp add: assms homeomorphic_arc_image_interval)
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    18
  then show ?thesis
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    19
    by (intro path_connected_complement_homeomorphic_convex_compact) (auto simp: assms)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    20
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    21
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    22
lemma connected_arc_complement:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    23
  fixes \<gamma> :: "real \<Rightarrow> 'a::euclidean_space"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    24
  assumes "arc \<gamma>" "2 \<le> DIM('a)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    25
  shows "connected(- path_image \<gamma>)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    26
  by (simp add: assms path_connected_arc_complement path_connected_imp_connected)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    27
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    28
lemma inside_arc_empty:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    29
  fixes \<gamma> :: "real \<Rightarrow> 'a::euclidean_space"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    30
  assumes "arc \<gamma>"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    31
    shows "inside(path_image \<gamma>) = {}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    32
proof (cases "DIM('a) = 1")
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    33
  case True
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    34
  then show ?thesis
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    35
    using assms connected_arc_image connected_convex_1_gen inside_convex by blast
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    36
next
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    37
  case False
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    38
  then have "connected (- path_image \<gamma>)"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    39
      by (metis DIM_ge_Suc0 One_nat_def Suc_1 antisym assms connected_arc_complement not_less_eq_eq)
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    40
    then
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    41
  show ?thesis
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    42
    by (simp add: assms bounded_arc_image inside_bounded_complement_connected_empty)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    43
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    44
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    45
lemma inside_simple_curve_imp_closed:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    46
  fixes \<gamma> :: "real \<Rightarrow> 'a::euclidean_space"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    47
    shows "\<lbrakk>simple_path \<gamma>; x \<in> inside(path_image \<gamma>)\<rbrakk> \<Longrightarrow> pathfinish \<gamma> = pathstart \<gamma>"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    48
  using arc_simple_path  inside_arc_empty by blast
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    49
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    50
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    51
subsection \<open>Piecewise differentiability of paths\<close>
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    52
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    53
lemma continuous_on_joinpaths_D1:
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    54
  assumes "continuous_on {0..1} (g1 +++ g2)"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    55
  shows "continuous_on {0..1} g1"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    56
proof (rule continuous_on_eq)
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    57
  have "continuous_on {0..1/2} (g1 +++ g2)"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    58
    using assms continuous_on_subset split_01 by auto
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    59
  then show "continuous_on {0..1} (g1 +++ g2 \<circ> (*) (inverse 2))"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    60
    by (intro continuous_intros) force
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    61
qed (auto simp: joinpaths_def)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    62
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    63
lemma continuous_on_joinpaths_D2:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    64
    "\<lbrakk>continuous_on {0..1} (g1 +++ g2); pathfinish g1 = pathstart g2\<rbrakk> \<Longrightarrow> continuous_on {0..1} g2"
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
    65
  using path_def path_join by blast
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    66
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    67
lemma piecewise_differentiable_D1:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    68
  assumes "(g1 +++ g2) piecewise_differentiable_on {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    69
  shows "g1 piecewise_differentiable_on {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    70
proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    71
  obtain S where cont: "continuous_on {0..1} g1" and "finite S"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    72
    and S: "\<And>x. x \<in> {0..1} - S \<Longrightarrow> g1 +++ g2 differentiable at x within {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    73
    using assms unfolding piecewise_differentiable_on_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    74
    by (blast dest!: continuous_on_joinpaths_D1)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    75
  show ?thesis
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    76
    unfolding piecewise_differentiable_on_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    77
  proof (intro exI conjI ballI cont)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    78
    show "finite (insert 1 (((*)2) ` S))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    79
      by (simp add: \<open>finite S\<close>)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    80
    show "g1 differentiable at x within {0..1}" if "x \<in> {0..1} - insert 1 ((*) 2 ` S)" for x
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    81
    proof (rule_tac d="dist (x/2) (1/2)" in differentiable_transform_within)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    82
      have "g1 +++ g2 differentiable at (x / 2) within {0..1/2}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    83
        by (rule differentiable_subset [OF S [of "x/2"]] | use that in force)+
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    84
      then show "g1 +++ g2 \<circ> (*) (inverse 2) differentiable at x within {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    85
        using image_affinity_atLeastAtMost_div [of 2 0 "0::real" 1]
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    86
        by (auto intro: differentiable_chain_within)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    87
    qed (use that in \<open>auto simp: joinpaths_def\<close>)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    88
  qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    89
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    90
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    91
lemma piecewise_differentiable_D2:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    92
  assumes "(g1 +++ g2) piecewise_differentiable_on {0..1}" and eq: "pathfinish g1 = pathstart g2"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    93
  shows "g2 piecewise_differentiable_on {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    94
proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    95
  have [simp]: "g1 1 = g2 0"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    96
    using eq by (simp add: pathfinish_def pathstart_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    97
  obtain S where cont: "continuous_on {0..1} g2" and "finite S"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    98
    and S: "\<And>x. x \<in> {0..1} - S \<Longrightarrow> g1 +++ g2 differentiable at x within {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    99
    using assms unfolding piecewise_differentiable_on_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   100
    by (blast dest!: continuous_on_joinpaths_D2)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   101
  show ?thesis
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   102
    unfolding piecewise_differentiable_on_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   103
  proof (intro exI conjI ballI cont)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   104
    show "finite (insert 0 ((\<lambda>x. 2*x-1)`S))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   105
      by (simp add: \<open>finite S\<close>)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   106
    show "g2 differentiable at x within {0..1}" if "x \<in> {0..1} - insert 0 ((\<lambda>x. 2*x-1)`S)" for x
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   107
    proof (rule_tac d="dist ((x+1)/2) (1/2)" in differentiable_transform_within)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   108
      have x2: "(x + 1) / 2 \<notin> S"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   109
        using that
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   110
        apply (clarsimp simp: image_iff)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   111
        by (metis add.commute add_diff_cancel_left' mult_2 field_sum_of_halves)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   112
      have "g1 +++ g2 \<circ> (\<lambda>x. (x+1) / 2) differentiable at x within {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   113
        by (rule differentiable_chain_within differentiable_subset [OF S [of "(x+1)/2"]] | use x2 that in force)+
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   114
      then show "g1 +++ g2 \<circ> (\<lambda>x. (x+1) / 2) differentiable at x within {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   115
        by (auto intro: differentiable_chain_within)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   116
      show "(g1 +++ g2 \<circ> (\<lambda>x. (x + 1) / 2)) x' = g2 x'" if "x' \<in> {0..1}" "dist x' x < dist ((x + 1) / 2) (1/2)" for x'
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   117
      proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   118
        have [simp]: "(2*x'+2)/2 = x'+1"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   119
          by (simp add: field_split_simps)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   120
        show ?thesis
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   121
          using that by (auto simp: joinpaths_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   122
      qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   123
    qed (use that in \<open>auto simp: joinpaths_def\<close>)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   124
  qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   125
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   126
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   127
lemma piecewise_C1_differentiable_D1:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   128
  fixes g1 :: "real \<Rightarrow> 'a::real_normed_field"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   129
  assumes "(g1 +++ g2) piecewise_C1_differentiable_on {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   130
    shows "g1 piecewise_C1_differentiable_on {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   131
proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   132
  obtain S where "finite S"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   133
             and co12: "continuous_on ({0..1} - S) (\<lambda>x. vector_derivative (g1 +++ g2) (at x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   134
             and g12D: "\<forall>x\<in>{0..1} - S. g1 +++ g2 differentiable at x"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   135
    using assms  by (auto simp: piecewise_C1_differentiable_on_def C1_differentiable_on_eq)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   136
  have g1D: "g1 differentiable at x" if "x \<in> {0..1} - insert 1 ((*) 2 ` S)" for x
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   137
  proof (rule differentiable_transform_within)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   138
    show "g1 +++ g2 \<circ> (*) (inverse 2) differentiable at x"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   139
      using that g12D
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   140
      unfolding joinpaths_def
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   141
      by (intro differentiable_chain_at derivative_intros | force)+
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   142
    show "\<And>x'. \<lbrakk>dist x' x < dist (x/2) (1/2)\<rbrakk>
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   143
          \<Longrightarrow> (g1 +++ g2 \<circ> (*) (inverse 2)) x' = g1 x'"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   144
      using that by (auto simp: dist_real_def joinpaths_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   145
  qed (use that in \<open>auto simp: dist_real_def\<close>)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   146
  have [simp]: "vector_derivative (g1 \<circ> (*) 2) (at (x/2)) = 2 *\<^sub>R vector_derivative g1 (at x)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   147
               if "x \<in> {0..1} - insert 1 ((*) 2 ` S)" for x
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   148
    apply (subst vector_derivative_chain_at)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   149
    using that
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   150
    apply (rule derivative_eq_intros g1D | simp)+
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   151
    done
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   152
  have "continuous_on ({0..1/2} - insert (1/2) S) (\<lambda>x. vector_derivative (g1 +++ g2) (at x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   153
    using co12 by (rule continuous_on_subset) force
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   154
  then have coDhalf: "continuous_on ({0..1/2} - insert (1/2) S) (\<lambda>x. vector_derivative (g1 \<circ> (*)2) (at x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   155
  proof (rule continuous_on_eq [OF _ vector_derivative_at])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   156
    show "(g1 +++ g2 has_vector_derivative vector_derivative (g1 \<circ> (*) 2) (at x)) (at x)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   157
      if "x \<in> {0..1/2} - insert (1/2) S" for x
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   158
    proof (rule has_vector_derivative_transform_within)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   159
      show "(g1 \<circ> (*) 2 has_vector_derivative vector_derivative (g1 \<circ> (*) 2) (at x)) (at x)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   160
        using that
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   161
        by (force intro: g1D differentiable_chain_at simp: vector_derivative_works [symmetric])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   162
      show "\<And>x'. \<lbrakk>dist x' x < dist x (1/2)\<rbrakk> \<Longrightarrow> (g1 \<circ> (*) 2) x' = (g1 +++ g2) x'"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   163
        using that by (auto simp: dist_norm joinpaths_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   164
    qed (use that in \<open>auto simp: dist_norm\<close>)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   165
  qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   166
  have "continuous_on ({0..1} - insert 1 ((*) 2 ` S))
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   167
                      ((\<lambda>x. 1/2 * vector_derivative (g1 \<circ> (*)2) (at x)) \<circ> (*)(1/2))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   168
    using coDhalf
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   169
    apply (intro continuous_intros)
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   170
    by (simp add: scaleR_conv_of_real image_set_diff image_image)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   171
  then have con_g1: "continuous_on ({0..1} - insert 1 ((*) 2 ` S)) (\<lambda>x. vector_derivative g1 (at x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   172
    by (rule continuous_on_eq) (simp add: scaleR_conv_of_real)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   173
  have "continuous_on {0..1} g1"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   174
    using continuous_on_joinpaths_D1 assms piecewise_C1_differentiable_on_def by blast
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   175
  with \<open>finite S\<close> show ?thesis
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   176
    apply (clarsimp simp add: piecewise_C1_differentiable_on_def C1_differentiable_on_eq)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   177
    apply (rule_tac x="insert 1 (((*)2)`S)" in exI)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   178
    apply (simp add: g1D con_g1)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   179
  done
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   180
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   181
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   182
lemma piecewise_C1_differentiable_D2:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   183
  fixes g2 :: "real \<Rightarrow> 'a::real_normed_field"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   184
  assumes "(g1 +++ g2) piecewise_C1_differentiable_on {0..1}" "pathfinish g1 = pathstart g2"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   185
    shows "g2 piecewise_C1_differentiable_on {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   186
proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   187
  obtain S where "finite S"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   188
             and co12: "continuous_on ({0..1} - S) (\<lambda>x. vector_derivative (g1 +++ g2) (at x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   189
             and g12D: "\<forall>x\<in>{0..1} - S. g1 +++ g2 differentiable at x"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   190
    using assms  by (auto simp: piecewise_C1_differentiable_on_def C1_differentiable_on_eq)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   191
  have g2D: "g2 differentiable at x" if "x \<in> {0..1} - insert 0 ((\<lambda>x. 2*x-1) ` S)" for x
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   192
  proof (rule differentiable_transform_within)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   193
    show "g1 +++ g2 \<circ> (\<lambda>x. (x + 1) / 2) differentiable at x"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   194
      using g12D that
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   195
      unfolding joinpaths_def
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   196
      apply (drule_tac x= "(x+1) / 2" in bspec, force simp: field_split_simps)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   197
      apply (rule differentiable_chain_at derivative_intros | force)+
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   198
      done
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   199
    show "\<And>x'. dist x' x < dist ((x + 1) / 2) (1/2) \<Longrightarrow> (g1 +++ g2 \<circ> (\<lambda>x. (x + 1) / 2)) x' = g2 x'"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   200
      using that by (auto simp: dist_real_def joinpaths_def field_simps)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   201
    qed (use that in \<open>auto simp: dist_norm\<close>)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   202
  have [simp]: "vector_derivative (g2 \<circ> (\<lambda>x. 2*x-1)) (at ((x+1)/2)) = 2 *\<^sub>R vector_derivative g2 (at x)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   203
               if "x \<in> {0..1} - insert 0 ((\<lambda>x. 2*x-1) ` S)" for x
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   204
    using that  by (auto simp: vector_derivative_chain_at field_split_simps g2D)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   205
  have "continuous_on ({1/2..1} - insert (1/2) S) (\<lambda>x. vector_derivative (g1 +++ g2) (at x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   206
    using co12 by (rule continuous_on_subset) force
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   207
  then have coDhalf: "continuous_on ({1/2..1} - insert (1/2) S) (\<lambda>x. vector_derivative (g2 \<circ> (\<lambda>x. 2*x-1)) (at x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   208
  proof (rule continuous_on_eq [OF _ vector_derivative_at])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   209
    show "(g1 +++ g2 has_vector_derivative vector_derivative (g2 \<circ> (\<lambda>x. 2 * x - 1)) (at x))
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   210
          (at x)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   211
      if "x \<in> {1 / 2..1} - insert (1 / 2) S" for x
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   212
    proof (rule_tac f="g2 \<circ> (\<lambda>x. 2*x-1)" and d="dist (3/4) ((x+1)/2)" in has_vector_derivative_transform_within)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   213
      show "(g2 \<circ> (\<lambda>x. 2 * x - 1) has_vector_derivative vector_derivative (g2 \<circ> (\<lambda>x. 2 * x - 1)) (at x))
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   214
            (at x)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   215
        using that by (force intro: g2D differentiable_chain_at simp: vector_derivative_works [symmetric])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   216
      show "\<And>x'. \<lbrakk>dist x' x < dist (3 / 4) ((x + 1) / 2)\<rbrakk> \<Longrightarrow> (g2 \<circ> (\<lambda>x. 2 * x - 1)) x' = (g1 +++ g2) x'"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   217
        using that by (auto simp: dist_norm joinpaths_def add_divide_distrib)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   218
    qed (use that in \<open>auto simp: dist_norm\<close>)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   219
  qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   220
  have [simp]: "((\<lambda>x. (x+1) / 2) ` ({0..1} - insert 0 ((\<lambda>x. 2 * x - 1) ` S))) = ({1/2..1} - insert (1/2) S)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   221
    apply (simp add: image_set_diff inj_on_def image_image)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   222
    apply (auto simp: image_affinity_atLeastAtMost_div add_divide_distrib)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   223
    done
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   224
  have "continuous_on ({0..1} - insert 0 ((\<lambda>x. 2*x-1) ` S))
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   225
                      ((\<lambda>x. 1/2 * vector_derivative (g2 \<circ> (\<lambda>x. 2*x-1)) (at x)) \<circ> (\<lambda>x. (x+1)/2))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   226
    by (rule continuous_intros | simp add:  coDhalf)+
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   227
  then have con_g2: "continuous_on ({0..1} - insert 0 ((\<lambda>x. 2*x-1) ` S)) (\<lambda>x. vector_derivative g2 (at x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   228
    by (rule continuous_on_eq) (simp add: scaleR_conv_of_real)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   229
  have "continuous_on {0..1} g2"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   230
    using continuous_on_joinpaths_D2 assms piecewise_C1_differentiable_on_def by blast
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   231
  with \<open>finite S\<close> show ?thesis
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   232
    by (meson C1_differentiable_on_eq con_g2 finite_imageI finite_insert g2D piecewise_C1_differentiable_on_def)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   233
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   234
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   235
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   236
subsection \<open>Valid paths, and their start and finish\<close>
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   237
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   238
definition\<^marker>\<open>tag important\<close> valid_path :: "(real \<Rightarrow> 'a :: real_normed_vector) \<Rightarrow> bool"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   239
  where "valid_path f \<equiv> f piecewise_C1_differentiable_on {0..1::real}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   240
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   241
definition closed_path :: "(real \<Rightarrow> 'a :: real_normed_vector) \<Rightarrow> bool"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   242
  where "closed_path g \<equiv> g 0 = g 1"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   243
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   244
text\<open>In particular, all results for paths apply\<close>
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   245
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   246
lemma valid_path_imp_path: "valid_path g \<Longrightarrow> path g"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   247
  by (simp add: path_def piecewise_C1_differentiable_on_def valid_path_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   248
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   249
lemma connected_valid_path_image: "valid_path g \<Longrightarrow> connected(path_image g)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   250
  by (metis connected_path_image valid_path_imp_path)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   251
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   252
lemma compact_valid_path_image: "valid_path g \<Longrightarrow> compact(path_image g)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   253
  by (metis compact_path_image valid_path_imp_path)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   254
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   255
lemma bounded_valid_path_image: "valid_path g \<Longrightarrow> bounded(path_image g)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   256
  by (metis bounded_path_image valid_path_imp_path)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   257
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   258
lemma closed_valid_path_image: "valid_path g \<Longrightarrow> closed(path_image g)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   259
  by (metis closed_path_image valid_path_imp_path)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   260
77140
9a60c1759543 Lots more new material thanks to Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 71193
diff changeset
   261
lemma valid_path_translation_eq: "valid_path ((+)d \<circ> p) \<longleftrightarrow> valid_path p"
9a60c1759543 Lots more new material thanks to Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 71193
diff changeset
   262
  by (simp add: valid_path_def piecewise_C1_differentiable_on_translation_eq)
9a60c1759543 Lots more new material thanks to Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 71193
diff changeset
   263
 
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   264
lemma valid_path_compose:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   265
  assumes "valid_path g"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   266
      and der: "\<And>x. x \<in> path_image g \<Longrightarrow> f field_differentiable (at x)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   267
      and con: "continuous_on (path_image g) (deriv f)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   268
    shows "valid_path (f \<circ> g)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   269
proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   270
  obtain S where "finite S" and g_diff: "g C1_differentiable_on {0..1} - S"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   271
    using \<open>valid_path g\<close> unfolding valid_path_def piecewise_C1_differentiable_on_def by auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   272
  have "f \<circ> g differentiable at t" when "t\<in>{0..1} - S" for t
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   273
    proof (rule differentiable_chain_at)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   274
      show "g differentiable at t" using \<open>valid_path g\<close>
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   275
        by (meson C1_differentiable_on_eq \<open>g C1_differentiable_on {0..1} - S\<close> that)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   276
    next
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   277
      have "g t\<in>path_image g" using that DiffD1 image_eqI path_image_def by metis
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   278
      then show "f differentiable at (g t)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   279
        using der[THEN field_differentiable_imp_differentiable] by auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   280
    qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   281
  moreover have "continuous_on ({0..1} - S) (\<lambda>x. vector_derivative (f \<circ> g) (at x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   282
    proof (rule continuous_on_eq [where f = "\<lambda>x. vector_derivative g (at x) * deriv f (g x)"],
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   283
        rule continuous_intros)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   284
      show "continuous_on ({0..1} - S) (\<lambda>x. vector_derivative g (at x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   285
        using g_diff C1_differentiable_on_eq by auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   286
    next
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   287
      have "continuous_on {0..1} (\<lambda>x. deriv f (g x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   288
        using continuous_on_compose[OF _ con[unfolded path_image_def],unfolded comp_def]
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   289
          \<open>valid_path g\<close> piecewise_C1_differentiable_on_def valid_path_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   290
        by blast
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   291
      then show "continuous_on ({0..1} - S) (\<lambda>x. deriv f (g x))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   292
        using continuous_on_subset by blast
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   293
    next
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   294
      show "vector_derivative g (at t) * deriv f (g t) = vector_derivative (f \<circ> g) (at t)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   295
          when "t \<in> {0..1} - S" for t
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   296
        by (metis C1_differentiable_on_eq DiffD1 der g_diff imageI path_image_def that 
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   297
                  vector_derivative_chain_at_general)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   298
    qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   299
  ultimately have "f \<circ> g C1_differentiable_on {0..1} - S"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   300
    using C1_differentiable_on_eq by blast
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   301
  moreover have "path (f \<circ> g)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   302
    using der
77140
9a60c1759543 Lots more new material thanks to Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 71193
diff changeset
   303
    by (simp add: path_continuous_image[OF valid_path_imp_path[OF \<open>valid_path g\<close>]] continuous_at_imp_continuous_on field_differentiable_imp_continuous_at)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   304
  ultimately show ?thesis unfolding valid_path_def piecewise_C1_differentiable_on_def path_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   305
    using \<open>finite S\<close> by auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   306
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   307
  
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   308
lemma valid_path_uminus_comp[simp]:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   309
  fixes g::"real \<Rightarrow> 'a ::real_normed_field"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   310
  shows "valid_path (uminus \<circ> g) \<longleftrightarrow> valid_path g"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   311
proof 
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   312
  show "valid_path g \<Longrightarrow> valid_path (uminus \<circ> g)" for g::"real \<Rightarrow> 'a"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   313
    by (auto intro!: valid_path_compose derivative_intros)  
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   314
  then show "valid_path g" when "valid_path (uminus \<circ> g)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   315
    by (metis fun.map_comp group_add_class.minus_comp_minus id_comp that)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   316
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   317
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   318
lemma valid_path_offset[simp]:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   319
  shows "valid_path (\<lambda>t. g t - z) \<longleftrightarrow> valid_path g"  
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   320
proof 
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   321
  show *: "valid_path (g::real\<Rightarrow>'a) \<Longrightarrow> valid_path (\<lambda>t. g t - z)" for g z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   322
    unfolding valid_path_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   323
    by (fastforce intro:derivative_intros C1_differentiable_imp_piecewise piecewise_C1_differentiable_diff)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   324
  show "valid_path (\<lambda>t. g t - z) \<Longrightarrow> valid_path g"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   325
    using *[of "\<lambda>t. g t - z" "-z",simplified] .
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   326
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   327
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   328
lemma valid_path_imp_reverse:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   329
  assumes "valid_path g"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   330
    shows "valid_path(reversepath g)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   331
proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   332
  obtain S where "finite S" and S: "g C1_differentiable_on ({0..1} - S)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   333
    using assms by (auto simp: valid_path_def piecewise_C1_differentiable_on_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   334
  then have "finite ((-) 1 ` S)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   335
    by auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   336
  moreover have "(reversepath g C1_differentiable_on ({0..1} - (-) 1 ` S))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   337
    unfolding reversepath_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   338
    apply (rule C1_differentiable_compose [of "\<lambda>x::real. 1-x" _ g, unfolded o_def])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   339
    using S
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   340
    by (force simp: finite_vimageI inj_on_def C1_differentiable_on_eq elim!: continuous_on_subset)+
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   341
  ultimately show ?thesis using assms
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   342
    by (auto simp: valid_path_def piecewise_C1_differentiable_on_def path_def [symmetric])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   343
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   344
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   345
lemma valid_path_reversepath [simp]: "valid_path(reversepath g) \<longleftrightarrow> valid_path g"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   346
  using valid_path_imp_reverse by force
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   347
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   348
lemma valid_path_join:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   349
  assumes "valid_path g1" "valid_path g2" "pathfinish g1 = pathstart g2"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   350
    shows "valid_path(g1 +++ g2)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   351
proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   352
  have "g1 1 = g2 0"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   353
    using assms by (auto simp: pathfinish_def pathstart_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   354
  moreover have "(g1 \<circ> (\<lambda>x. 2*x)) piecewise_C1_differentiable_on {0..1/2}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   355
    apply (rule piecewise_C1_differentiable_compose)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   356
    using assms
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   357
    apply (auto simp: valid_path_def piecewise_C1_differentiable_on_def continuous_on_joinpaths)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   358
    apply (force intro: finite_vimageI [where h = "(*)2"] inj_onI)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   359
    done
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   360
  moreover have "(g2 \<circ> (\<lambda>x. 2*x-1)) piecewise_C1_differentiable_on {1/2..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   361
    apply (rule piecewise_C1_differentiable_compose)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   362
    using assms unfolding valid_path_def piecewise_C1_differentiable_on_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   363
    by (auto intro!: continuous_intros finite_vimageI [where h = "(\<lambda>x. 2*x - 1)"] inj_onI
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   364
             simp: image_affinity_atLeastAtMost_diff continuous_on_joinpaths)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   365
  ultimately show ?thesis
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   366
    unfolding valid_path_def continuous_on_joinpaths joinpaths_def
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   367
    by (intro piecewise_C1_differentiable_cases) (auto simp: o_def)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   368
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   369
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   370
lemma valid_path_join_D1:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   371
  fixes g1 :: "real \<Rightarrow> 'a::real_normed_field"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   372
  shows "valid_path (g1 +++ g2) \<Longrightarrow> valid_path g1"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   373
  unfolding valid_path_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   374
  by (rule piecewise_C1_differentiable_D1)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   375
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   376
lemma valid_path_join_D2:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   377
  fixes g2 :: "real \<Rightarrow> 'a::real_normed_field"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   378
  shows "\<lbrakk>valid_path (g1 +++ g2); pathfinish g1 = pathstart g2\<rbrakk> \<Longrightarrow> valid_path g2"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   379
  unfolding valid_path_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   380
  by (rule piecewise_C1_differentiable_D2)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   381
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   382
lemma valid_path_join_eq [simp]:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   383
  fixes g2 :: "real \<Rightarrow> 'a::real_normed_field"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   384
  shows "pathfinish g1 = pathstart g2 \<Longrightarrow> (valid_path(g1 +++ g2) \<longleftrightarrow> valid_path g1 \<and> valid_path g2)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   385
  using valid_path_join_D1 valid_path_join_D2 valid_path_join by blast
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   386
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   387
lemma valid_path_shiftpath [intro]:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   388
  assumes "valid_path g" "pathfinish g = pathstart g" "a \<in> {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   389
    shows "valid_path(shiftpath a g)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   390
  using assms
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   391
  unfolding valid_path_def shiftpath_alt_def
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   392
  apply (intro piecewise_C1_differentiable_cases)
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   393
      apply (simp_all add: add.commute)
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   394
    apply (rule piecewise_C1_differentiable_affine [of g 1 a, simplified o_def scaleR_one])
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   395
    apply (force simp: pathfinish_def pathstart_def elim: piecewise_C1_differentiable_on_subset)
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   396
   apply (rule piecewise_C1_differentiable_affine [of g 1 "a-1", simplified o_def scaleR_one algebra_simps])
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   397
   apply (auto simp: pathfinish_def pathstart_def elim: piecewise_C1_differentiable_on_subset)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   398
  done
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   399
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   400
lemma vector_derivative_linepath_within:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   401
    "x \<in> {0..1} \<Longrightarrow> vector_derivative (linepath a b) (at x within {0..1}) = b - a"
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   402
  by (simp add: has_vector_derivative_linepath_within vector_derivative_at_within_ivl)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   403
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   404
lemma vector_derivative_linepath_at [simp]: "vector_derivative (linepath a b) (at x) = b - a"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   405
  by (simp add: has_vector_derivative_linepath_within vector_derivative_at)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   406
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   407
lemma valid_path_linepath [iff]: "valid_path (linepath a b)"
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   408
  using C1_differentiable_on_eq piecewise_C1_differentiable_on_def valid_path_def by fastforce
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   409
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   410
lemma valid_path_subpath:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   411
  fixes g :: "real \<Rightarrow> 'a :: real_normed_vector"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   412
  assumes "valid_path g" "u \<in> {0..1}" "v \<in> {0..1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   413
    shows "valid_path(subpath u v g)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   414
proof (cases "v=u")
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   415
  case True
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   416
  then show ?thesis
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   417
    unfolding valid_path_def subpath_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   418
    by (force intro: C1_differentiable_on_const C1_differentiable_imp_piecewise)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   419
next
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   420
  case False
78475
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   421
  let ?f = "\<lambda>x. ((v-u) * x + u)"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   422
  have "(g \<circ> ?f) piecewise_C1_differentiable_on {0..1}"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   423
  proof (rule piecewise_C1_differentiable_compose)
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   424
    show "?f piecewise_C1_differentiable_on {0..1}"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   425
      by (simp add: C1_differentiable_imp_piecewise)
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   426
    have "g piecewise_C1_differentiable_on (if u \<le> v then {u..v} else {v..u})"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   427
      using assms piecewise_C1_differentiable_on_subset valid_path_def by force
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   428
    then show "g piecewise_C1_differentiable_on ?f ` {0..1}"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   429
      by (simp add: image_affinity_atLeastAtMost split: if_split_asm)
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   430
    show "\<And>x. finite ({0..1} \<inter> ?f -` {x})"
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   431
      using False
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   432
      by (simp add: Int_commute [of "{0..1}"] inj_on_def crossproduct_eq finite_vimage_IntI)
a5f6d2fc1b1f More cosmetic changes
paulson <lp15@cam.ac.uk>
parents: 77140
diff changeset
   433
  qed
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   434
  then show ?thesis
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   435
    by (auto simp: o_def valid_path_def subpath_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   436
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   437
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   438
lemma valid_path_rectpath [simp, intro]: "valid_path (rectpath a b)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   439
  by (simp add: Let_def rectpath_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   440
80052
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   441
lemma linear_image_valid_path:
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   442
  fixes p :: "real \<Rightarrow> 'a :: euclidean_space"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   443
  assumes  "valid_path p" "linear f"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   444
  shows    "valid_path (f \<circ> p)"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   445
  unfolding valid_path_def piecewise_C1_differentiable_on_def
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   446
proof (intro conjI)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   447
  from assms have "path p"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   448
    by (simp add: valid_path_imp_path)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   449
  thus "continuous_on {0..1} (f \<circ> p)"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   450
    unfolding o_def path_def by (intro linear_continuous_on_compose[OF _ assms(2)])
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   451
  from assms(1) obtain S where S: "finite S" "p C1_differentiable_on {0..1} - S"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   452
    by (auto simp: valid_path_def piecewise_C1_differentiable_on_def)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   453
  from S(2) obtain p' :: "real \<Rightarrow> 'a"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   454
    where p': "\<And>x. x \<in> {0..1} - S \<Longrightarrow> (p has_vector_derivative p' x) (at x)"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   455
              "continuous_on ({0..1} - S) p'"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   456
    by (fastforce simp: C1_differentiable_on_def)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   457
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   458
  have "(f \<circ> p has_vector_derivative f (p' x)) (at x)" if "x \<in> {0..1} - S" for x
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   459
    by (rule vector_derivative_diff_chain_within [OF p'(1)[OF that]]
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   460
             linear_imp_has_derivative assms)+
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   461
  moreover have "continuous_on ({0..1} - S) (\<lambda>x. f (p' x))"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   462
    by (rule linear_continuous_on_compose [OF p'(2) assms(2)])
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   463
  ultimately have "f \<circ> p C1_differentiable_on {0..1} - S"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   464
    unfolding C1_differentiable_on_def by (intro exI[of _ "\<lambda>x. f (p' x)"]) fast
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   465
  thus "\<exists>S. finite S \<and> f \<circ> p C1_differentiable_on {0..1} - S"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   466
    using \<open>finite S\<close> by blast
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   467
qed
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   468
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   469
lemma valid_path_times:
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   470
  fixes \<gamma>::"real \<Rightarrow> 'a ::real_normed_field"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   471
  assumes "c\<noteq>0"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   472
  shows "valid_path ((*) c \<circ> \<gamma>) = valid_path \<gamma>"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   473
proof 
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   474
  assume "valid_path ((*) c \<circ> \<gamma>)"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   475
  then have "valid_path ((*) (1/c) \<circ> ((*) c \<circ> \<gamma>))"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   476
    by (simp add: valid_path_compose)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   477
  then show "valid_path \<gamma>" 
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   478
    unfolding comp_def using \<open>c\<noteq>0\<close> by auto
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   479
next
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   480
  assume "valid_path \<gamma>"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   481
  then show "valid_path ((*) c \<circ> \<gamma>)"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   482
    by (simp add: valid_path_compose)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   483
qed
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   484
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   485
lemma path_compose_cnj_iff [simp]: "path (cnj \<circ> p) \<longleftrightarrow> path p"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   486
proof -
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   487
  have "path (cnj \<circ> p)" if "path p" for p
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   488
    by (intro path_continuous_image continuous_intros that)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   489
  from this[of p] and this[of "cnj \<circ> p"] show ?thesis
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   490
    by (auto simp: o_def)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   491
qed
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   492
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   493
lemma valid_path_cnj:
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   494
  fixes g::"real \<Rightarrow> complex"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   495
    shows "valid_path (cnj \<circ> g) = valid_path g"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   496
proof
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   497
  show valid:"valid_path (cnj \<circ> g)" if "valid_path g" for g
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   498
  proof -
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   499
    obtain S where "finite S" and g_diff: "g C1_differentiable_on {0..1} - S"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   500
      using \<open>valid_path g\<close> unfolding valid_path_def piecewise_C1_differentiable_on_def by auto
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   501
  
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   502
    have g_diff':"g differentiable at t" when "t\<in>{0..1} - S" for t
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   503
      by (meson C1_differentiable_on_eq \<open>g C1_differentiable_on {0..1} - S\<close> that)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   504
    then have "(cnj \<circ> g) differentiable at t" when "t\<in>{0..1} - S" for t
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   505
      using bounded_linear_cnj bounded_linear_imp_differentiable differentiable_chain_at that by blast
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   506
    moreover have "continuous_on ({0..1} - S)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   507
        (\<lambda>x. vector_derivative (cnj \<circ> g) (at x))"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   508
    proof -
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   509
      have "continuous_on ({0..1} - S)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   510
          (\<lambda>x. vector_derivative (cnj \<circ> g) (at x))
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   511
        = continuous_on ({0..1} - S)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   512
          (\<lambda>x. cnj (vector_derivative g (at x)))"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   513
        apply (rule continuous_on_cong[OF refl])
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   514
        unfolding comp_def using g_diff'
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   515
        using has_vector_derivative_cnj vector_derivative_at vector_derivative_works by blast
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   516
      also have "\<dots>"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   517
        apply (intro continuous_intros)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   518
        using C1_differentiable_on_eq g_diff by blast
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   519
      finally show ?thesis .
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   520
    qed
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   521
    ultimately have "cnj \<circ> g C1_differentiable_on {0..1} - S"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   522
      using C1_differentiable_on_eq by blast
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   523
    moreover have "path (cnj \<circ> g)"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   524
      apply (rule path_continuous_image[OF valid_path_imp_path[OF \<open>valid_path g\<close>]])
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   525
      by (intro continuous_intros)
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   526
    ultimately show ?thesis unfolding valid_path_def piecewise_C1_differentiable_on_def path_def
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   527
      using \<open>finite S\<close> by auto
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   528
  qed
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   529
  from this[of "cnj o g"]
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   530
  show "valid_path (cnj \<circ> g) \<Longrightarrow> valid_path g"
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   531
    unfolding comp_def by simp
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   532
qed
35b2143aeec6 An assortment of new material, mostly due to Manuel
paulson <lp15@cam.ac.uk>
parents: 78475
diff changeset
   533
71193
777d673fa672 Removed duplicate theorems from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71189
diff changeset
   534
end