src/HOL/Analysis/Line_Segment.thy
author nipkow
Wed, 04 Dec 2019 18:28:24 +0100
changeset 71230 095cf95d7725
parent 71189 954ee5acaae0
child 71255 4258ee13f5d4
permissions -rw-r--r--
moved segment lemmas where they belong
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
     1
(* Title:      HOL/Analysis/Line_Segment.thy
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
     2
   Author:     L C Paulson, University of Cambridge
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
     3
   Author:     Robert Himmelmann, TU Muenchen
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
     4
   Author:     Bogdan Grechuk, University of Edinburgh
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
     5
   Author:     Armin Heller, TU Muenchen
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
     6
   Author:     Johannes Hoelzl, TU Muenchen
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
     7
*)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
     8
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
     9
section \<open>Line Segment\<close>
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    10
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    11
theory Line_Segment
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    12
imports
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    13
  Convex
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    14
  Topology_Euclidean_Space
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    15
begin
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    16
71169
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
    17
subsection\<^marker>\<open>tag unimportant\<close> \<open>Topological Properties of Convex Sets, Metric Spaces and Functions\<close>
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    18
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    19
lemma convex_supp_sum:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    20
  assumes "convex S" and 1: "supp_sum u I = 1"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    21
      and "\<And>i. i \<in> I \<Longrightarrow> 0 \<le> u i \<and> (u i = 0 \<or> f i \<in> S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    22
    shows "supp_sum (\<lambda>i. u i *\<^sub>R f i) I \<in> S"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    23
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    24
  have fin: "finite {i \<in> I. u i \<noteq> 0}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    25
    using 1 sum.infinite by (force simp: supp_sum_def support_on_def)
71169
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
    26
  then have "supp_sum (\<lambda>i. u i *\<^sub>R f i) I = sum (\<lambda>i. u i *\<^sub>R f i) {i \<in> I. u i \<noteq> 0}"
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    27
    by (force intro: sum.mono_neutral_left simp: supp_sum_def support_on_def)
71169
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
    28
  also have "... \<in> S"
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
    29
    using 1 assms by (force simp: supp_sum_def support_on_def intro: convex_sum [OF fin \<open>convex S\<close>])
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
    30
  finally show ?thesis .
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    31
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    32
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    33
lemma closure_bounded_linear_image_subset:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    34
  assumes f: "bounded_linear f"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    35
  shows "f ` closure S \<subseteq> closure (f ` S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    36
  using linear_continuous_on [OF f] closed_closure closure_subset
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    37
  by (rule image_closure_subset)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    38
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    39
lemma closure_linear_image_subset:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    40
  fixes f :: "'m::euclidean_space \<Rightarrow> 'n::real_normed_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    41
  assumes "linear f"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    42
  shows "f ` (closure S) \<subseteq> closure (f ` S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    43
  using assms unfolding linear_conv_bounded_linear
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    44
  by (rule closure_bounded_linear_image_subset)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    45
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    46
lemma closed_injective_linear_image:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    47
    fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    48
    assumes S: "closed S" and f: "linear f" "inj f"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    49
    shows "closed (f ` S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    50
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    51
  obtain g where g: "linear g" "g \<circ> f = id"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    52
    using linear_injective_left_inverse [OF f] by blast
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    53
  then have confg: "continuous_on (range f) g"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    54
    using linear_continuous_on linear_conv_bounded_linear by blast
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    55
  have [simp]: "g ` f ` S = S"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    56
    using g by (simp add: image_comp)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    57
  have cgf: "closed (g ` f ` S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    58
    by (simp add: \<open>g \<circ> f = id\<close> S image_comp)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    59
  have [simp]: "(range f \<inter> g -` S) = f ` S"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    60
    using g unfolding o_def id_def image_def by auto metis+
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    61
  show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    62
  proof (rule closedin_closed_trans [of "range f"])
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    63
    show "closedin (top_of_set (range f)) (f ` S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    64
      using continuous_closedin_preimage [OF confg cgf] by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    65
    show "closed (range f)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    66
      apply (rule closed_injective_image_subspace)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    67
      using f apply (auto simp: linear_linear linear_injective_0)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    68
      done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    69
  qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    70
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    71
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    72
lemma closed_injective_linear_image_eq:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    73
    fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    74
    assumes f: "linear f" "inj f"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    75
      shows "(closed(image f s) \<longleftrightarrow> closed s)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    76
  by (metis closed_injective_linear_image closure_eq closure_linear_image_subset closure_subset_eq f(1) f(2) inj_image_subset_iff)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    77
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    78
lemma closure_injective_linear_image:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    79
    fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    80
    shows "\<lbrakk>linear f; inj f\<rbrakk> \<Longrightarrow> f ` (closure S) = closure (f ` S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    81
  apply (rule subset_antisym)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    82
  apply (simp add: closure_linear_image_subset)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    83
  by (simp add: closure_minimal closed_injective_linear_image closure_subset image_mono)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    84
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    85
lemma closure_bounded_linear_image:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    86
    fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    87
    shows "\<lbrakk>linear f; bounded S\<rbrakk> \<Longrightarrow> f ` (closure S) = closure (f ` S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    88
  apply (rule subset_antisym, simp add: closure_linear_image_subset)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    89
  apply (rule closure_minimal, simp add: closure_subset image_mono)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    90
  by (meson bounded_closure closed_closure compact_continuous_image compact_eq_bounded_closed linear_continuous_on linear_conv_bounded_linear)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    91
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    92
lemma closure_scaleR:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    93
  fixes S :: "'a::real_normed_vector set"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    94
  shows "((*\<^sub>R) c) ` (closure S) = closure (((*\<^sub>R) c) ` S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    95
proof
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    96
  show "((*\<^sub>R) c) ` (closure S) \<subseteq> closure (((*\<^sub>R) c) ` S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    97
    using bounded_linear_scaleR_right
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    98
    by (rule closure_bounded_linear_image_subset)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
    99
  show "closure (((*\<^sub>R) c) ` S) \<subseteq> ((*\<^sub>R) c) ` (closure S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   100
    by (intro closure_minimal image_mono closure_subset closed_scaling closed_closure)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   101
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   102
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   103
lemma sphere_eq_empty [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   104
  fixes a :: "'a::{real_normed_vector, perfect_space}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   105
  shows "sphere a r = {} \<longleftrightarrow> r < 0"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   106
by (auto simp: sphere_def dist_norm) (metis dist_norm le_less_linear vector_choose_dist)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   107
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   108
lemma cone_closure:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   109
  fixes S :: "'a::real_normed_vector set"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   110
  assumes "cone S"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   111
  shows "cone (closure S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   112
proof (cases "S = {}")
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   113
  case True
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   114
  then show ?thesis by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   115
next
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   116
  case False
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   117
  then have "0 \<in> S \<and> (\<forall>c. c > 0 \<longrightarrow> (*\<^sub>R) c ` S = S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   118
    using cone_iff[of S] assms by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   119
  then have "0 \<in> closure S \<and> (\<forall>c. c > 0 \<longrightarrow> (*\<^sub>R) c ` closure S = closure S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   120
    using closure_subset by (auto simp: closure_scaleR)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   121
  then show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   122
    using False cone_iff[of "closure S"] by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   123
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   124
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   125
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   126
corollary component_complement_connected:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   127
  fixes S :: "'a::real_normed_vector set"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   128
  assumes "connected S" "C \<in> components (-S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   129
  shows "connected(-C)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   130
  using component_diff_connected [of S UNIV] assms
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   131
  by (auto simp: Compl_eq_Diff_UNIV)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   132
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   133
proposition clopen:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   134
  fixes S :: "'a :: real_normed_vector set"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   135
  shows "closed S \<and> open S \<longleftrightarrow> S = {} \<or> S = UNIV"
71169
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   136
  by (force intro!: connected_UNIV [unfolded connected_clopen, rule_format])
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   137
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   138
corollary compact_open:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   139
  fixes S :: "'a :: euclidean_space set"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   140
  shows "compact S \<and> open S \<longleftrightarrow> S = {}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   141
  by (auto simp: compact_eq_bounded_closed clopen)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   142
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   143
corollary finite_imp_not_open:
71169
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   144
  fixes S :: "'a::{real_normed_vector, perfect_space} set"
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   145
  shows "\<lbrakk>finite S; open S\<rbrakk> \<Longrightarrow> S={}"
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   146
  using clopen [of S] finite_imp_closed not_bounded_UNIV by blast
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   147
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   148
corollary empty_interior_finite:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   149
    fixes S :: "'a::{real_normed_vector, perfect_space} set"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   150
    shows "finite S \<Longrightarrow> interior S = {}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   151
  by (metis interior_subset finite_subset open_interior [of S] finite_imp_not_open)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   152
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   153
text \<open>Balls, being convex, are connected.\<close>
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   154
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   155
lemma convex_local_global_minimum:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   156
  fixes s :: "'a::real_normed_vector set"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   157
  assumes "e > 0"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   158
    and "convex_on s f"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   159
    and "ball x e \<subseteq> s"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   160
    and "\<forall>y\<in>ball x e. f x \<le> f y"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   161
  shows "\<forall>y\<in>s. f x \<le> f y"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   162
proof (rule ccontr)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   163
  have "x \<in> s" using assms(1,3) by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   164
  assume "\<not> ?thesis"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   165
  then obtain y where "y\<in>s" and y: "f x > f y" by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   166
  then have xy: "0 < dist x y"  by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   167
  then obtain u where "0 < u" "u \<le> 1" and u: "u < e / dist x y"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   168
    using field_lbound_gt_zero[of 1 "e / dist x y"] xy \<open>e>0\<close> by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   169
  then have "f ((1-u) *\<^sub>R x + u *\<^sub>R y) \<le> (1-u) * f x + u * f y"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   170
    using \<open>x\<in>s\<close> \<open>y\<in>s\<close>
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   171
    using assms(2)[unfolded convex_on_def,
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   172
      THEN bspec[where x=x], THEN bspec[where x=y], THEN spec[where x="1-u"]]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   173
    by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   174
  moreover
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   175
  have *: "x - ((1 - u) *\<^sub>R x + u *\<^sub>R y) = u *\<^sub>R (x - y)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   176
    by (simp add: algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   177
  have "(1 - u) *\<^sub>R x + u *\<^sub>R y \<in> ball x e"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   178
    unfolding mem_ball dist_norm
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   179
    unfolding * and norm_scaleR and abs_of_pos[OF \<open>0<u\<close>]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   180
    unfolding dist_norm[symmetric]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   181
    using u
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   182
    unfolding pos_less_divide_eq[OF xy]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   183
    by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   184
  then have "f x \<le> f ((1 - u) *\<^sub>R x + u *\<^sub>R y)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   185
    using assms(4) by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   186
  ultimately show False
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   187
    using mult_strict_left_mono[OF y \<open>u>0\<close>]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   188
    unfolding left_diff_distrib
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   189
    by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   190
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   191
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   192
lemma convex_ball [iff]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   193
  fixes x :: "'a::real_normed_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   194
  shows "convex (ball x e)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   195
proof (auto simp: convex_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   196
  fix y z
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   197
  assume yz: "dist x y < e" "dist x z < e"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   198
  fix u v :: real
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   199
  assume uv: "0 \<le> u" "0 \<le> v" "u + v = 1"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   200
  have "dist x (u *\<^sub>R y + v *\<^sub>R z) \<le> u * dist x y + v * dist x z"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   201
    using uv yz
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   202
    using convex_on_dist [of "ball x e" x, unfolded convex_on_def,
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   203
      THEN bspec[where x=y], THEN bspec[where x=z]]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   204
    by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   205
  then show "dist x (u *\<^sub>R y + v *\<^sub>R z) < e"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   206
    using convex_bound_lt[OF yz uv] by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   207
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   208
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   209
lemma convex_cball [iff]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   210
  fixes x :: "'a::real_normed_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   211
  shows "convex (cball x e)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   212
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   213
  {
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   214
    fix y z
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   215
    assume yz: "dist x y \<le> e" "dist x z \<le> e"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   216
    fix u v :: real
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   217
    assume uv: "0 \<le> u" "0 \<le> v" "u + v = 1"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   218
    have "dist x (u *\<^sub>R y + v *\<^sub>R z) \<le> u * dist x y + v * dist x z"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   219
      using uv yz
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   220
      using convex_on_dist [of "cball x e" x, unfolded convex_on_def,
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   221
        THEN bspec[where x=y], THEN bspec[where x=z]]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   222
      by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   223
    then have "dist x (u *\<^sub>R y + v *\<^sub>R z) \<le> e"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   224
      using convex_bound_le[OF yz uv] by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   225
  }
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   226
  then show ?thesis by (auto simp: convex_def Ball_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   227
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   228
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   229
lemma connected_ball [iff]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   230
  fixes x :: "'a::real_normed_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   231
  shows "connected (ball x e)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   232
  using convex_connected convex_ball by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   233
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   234
lemma connected_cball [iff]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   235
  fixes x :: "'a::real_normed_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   236
  shows "connected (cball x e)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   237
  using convex_connected convex_cball by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   238
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   239
lemma bounded_convex_hull:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   240
  fixes s :: "'a::real_normed_vector set"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   241
  assumes "bounded s"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   242
  shows "bounded (convex hull s)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   243
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   244
  from assms obtain B where B: "\<forall>x\<in>s. norm x \<le> B"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   245
    unfolding bounded_iff by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   246
  show ?thesis
71169
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   247
    by (simp add: bounded_subset[OF bounded_cball, of _ 0 B] B subsetI subset_hull)
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   248
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   249
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   250
lemma finite_imp_bounded_convex_hull:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   251
  fixes s :: "'a::real_normed_vector set"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   252
  shows "finite s \<Longrightarrow> bounded (convex hull s)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   253
  using bounded_convex_hull finite_imp_bounded
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   254
  by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   255
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   256
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   257
subsection \<open>Midpoint\<close>
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   258
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   259
definition\<^marker>\<open>tag important\<close> midpoint :: "'a::real_vector \<Rightarrow> 'a \<Rightarrow> 'a"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   260
  where "midpoint a b = (inverse (2::real)) *\<^sub>R (a + b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   261
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   262
lemma midpoint_idem [simp]: "midpoint x x = x"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   263
  unfolding midpoint_def  by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   264
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   265
lemma midpoint_sym: "midpoint a b = midpoint b a"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   266
  unfolding midpoint_def by (auto simp add: scaleR_right_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   267
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   268
lemma midpoint_eq_iff: "midpoint a b = c \<longleftrightarrow> a + b = c + c"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   269
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   270
  have "midpoint a b = c \<longleftrightarrow> scaleR 2 (midpoint a b) = scaleR 2 c"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   271
    by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   272
  then show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   273
    unfolding midpoint_def scaleR_2 [symmetric] by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   274
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   275
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   276
lemma
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   277
  fixes a::real
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   278
  assumes "a \<le> b" shows ge_midpoint_1: "a \<le> midpoint a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   279
                    and le_midpoint_1: "midpoint a b \<le> b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   280
  by (simp_all add: midpoint_def assms)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   281
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   282
lemma dist_midpoint:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   283
  fixes a b :: "'a::real_normed_vector" shows
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   284
  "dist a (midpoint a b) = (dist a b) / 2" (is ?t1)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   285
  "dist b (midpoint a b) = (dist a b) / 2" (is ?t2)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   286
  "dist (midpoint a b) a = (dist a b) / 2" (is ?t3)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   287
  "dist (midpoint a b) b = (dist a b) / 2" (is ?t4)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   288
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   289
  have *: "\<And>x y::'a. 2 *\<^sub>R x = - y \<Longrightarrow> norm x = (norm y) / 2"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   290
    unfolding equation_minus_iff by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   291
  have **: "\<And>x y::'a. 2 *\<^sub>R x =   y \<Longrightarrow> norm x = (norm y) / 2"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   292
    by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   293
  note scaleR_right_distrib [simp]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   294
  show ?t1
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   295
    unfolding midpoint_def dist_norm
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   296
    apply (rule **)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   297
    apply (simp add: scaleR_right_diff_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   298
    apply (simp add: scaleR_2)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   299
    done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   300
  show ?t2
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   301
    unfolding midpoint_def dist_norm
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   302
    apply (rule *)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   303
    apply (simp add: scaleR_right_diff_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   304
    apply (simp add: scaleR_2)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   305
    done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   306
  show ?t3
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   307
    unfolding midpoint_def dist_norm
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   308
    apply (rule *)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   309
    apply (simp add: scaleR_right_diff_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   310
    apply (simp add: scaleR_2)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   311
    done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   312
  show ?t4
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   313
    unfolding midpoint_def dist_norm
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   314
    apply (rule **)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   315
    apply (simp add: scaleR_right_diff_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   316
    apply (simp add: scaleR_2)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   317
    done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   318
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   319
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   320
lemma midpoint_eq_endpoint [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   321
  "midpoint a b = a \<longleftrightarrow> a = b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   322
  "midpoint a b = b \<longleftrightarrow> a = b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   323
  unfolding midpoint_eq_iff by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   324
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   325
lemma midpoint_plus_self [simp]: "midpoint a b + midpoint a b = a + b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   326
  using midpoint_eq_iff by metis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   327
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   328
lemma midpoint_linear_image:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   329
   "linear f \<Longrightarrow> midpoint(f a)(f b) = f(midpoint a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   330
by (simp add: linear_iff midpoint_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   331
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   332
71169
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   333
subsection \<open>Open and closed segments\<close>
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   334
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   335
definition\<^marker>\<open>tag important\<close> closed_segment :: "'a::real_vector \<Rightarrow> 'a \<Rightarrow> 'a set"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   336
  where "closed_segment a b = {(1 - u) *\<^sub>R a + u *\<^sub>R b | u::real. 0 \<le> u \<and> u \<le> 1}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   337
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   338
definition\<^marker>\<open>tag important\<close> open_segment :: "'a::real_vector \<Rightarrow> 'a \<Rightarrow> 'a set" where
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   339
  "open_segment a b \<equiv> closed_segment a b - {a,b}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   340
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   341
lemmas segment = open_segment_def closed_segment_def
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   342
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   343
lemma in_segment:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   344
    "x \<in> closed_segment a b \<longleftrightarrow> (\<exists>u. 0 \<le> u \<and> u \<le> 1 \<and> x = (1 - u) *\<^sub>R a + u *\<^sub>R b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   345
    "x \<in> open_segment a b \<longleftrightarrow> a \<noteq> b \<and> (\<exists>u. 0 < u \<and> u < 1 \<and> x = (1 - u) *\<^sub>R a + u *\<^sub>R b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   346
  using less_eq_real_def by (auto simp: segment algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   347
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   348
lemma closed_segment_linear_image:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   349
  "closed_segment (f a) (f b) = f ` (closed_segment a b)" if "linear f"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   350
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   351
  interpret linear f by fact
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   352
  show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   353
    by (force simp add: in_segment add scale)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   354
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   355
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   356
lemma open_segment_linear_image:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   357
    "\<lbrakk>linear f; inj f\<rbrakk> \<Longrightarrow> open_segment (f a) (f b) = f ` (open_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   358
  by (force simp: open_segment_def closed_segment_linear_image inj_on_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   359
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   360
lemma closed_segment_translation:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   361
    "closed_segment (c + a) (c + b) = image (\<lambda>x. c + x) (closed_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   362
apply safe
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   363
apply (rule_tac x="x-c" in image_eqI)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   364
apply (auto simp: in_segment algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   365
done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   366
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   367
lemma open_segment_translation:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   368
    "open_segment (c + a) (c + b) = image (\<lambda>x. c + x) (open_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   369
by (simp add: open_segment_def closed_segment_translation translation_diff)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   370
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   371
lemma closed_segment_of_real:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   372
    "closed_segment (of_real x) (of_real y) = of_real ` closed_segment x y"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   373
  apply (auto simp: image_iff in_segment scaleR_conv_of_real)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   374
    apply (rule_tac x="(1-u)*x + u*y" in bexI)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   375
  apply (auto simp: in_segment)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   376
  done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   377
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   378
lemma open_segment_of_real:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   379
    "open_segment (of_real x) (of_real y) = of_real ` open_segment x y"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   380
  apply (auto simp: image_iff in_segment scaleR_conv_of_real)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   381
    apply (rule_tac x="(1-u)*x + u*y" in bexI)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   382
  apply (auto simp: in_segment)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   383
  done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   384
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   385
lemma closed_segment_Reals:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   386
    "\<lbrakk>x \<in> Reals; y \<in> Reals\<rbrakk> \<Longrightarrow> closed_segment x y = of_real ` closed_segment (Re x) (Re y)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   387
  by (metis closed_segment_of_real of_real_Re)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   388
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   389
lemma open_segment_Reals:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   390
    "\<lbrakk>x \<in> Reals; y \<in> Reals\<rbrakk> \<Longrightarrow> open_segment x y = of_real ` open_segment (Re x) (Re y)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   391
  by (metis open_segment_of_real of_real_Re)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   392
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   393
lemma open_segment_PairD:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   394
    "(x, x') \<in> open_segment (a, a') (b, b')
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   395
     \<Longrightarrow> (x \<in> open_segment a b \<or> a = b) \<and> (x' \<in> open_segment a' b' \<or> a' = b')"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   396
  by (auto simp: in_segment)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   397
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   398
lemma closed_segment_PairD:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   399
  "(x, x') \<in> closed_segment (a, a') (b, b') \<Longrightarrow> x \<in> closed_segment a b \<and> x' \<in> closed_segment a' b'"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   400
  by (auto simp: closed_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   401
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   402
lemma closed_segment_translation_eq [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   403
    "d + x \<in> closed_segment (d + a) (d + b) \<longleftrightarrow> x \<in> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   404
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   405
  have *: "\<And>d x a b. x \<in> closed_segment a b \<Longrightarrow> d + x \<in> closed_segment (d + a) (d + b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   406
    apply (simp add: closed_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   407
    apply (erule ex_forward)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   408
    apply (simp add: algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   409
    done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   410
  show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   411
  using * [where d = "-d"] *
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   412
  by (fastforce simp add:)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   413
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   414
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   415
lemma open_segment_translation_eq [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   416
    "d + x \<in> open_segment (d + a) (d + b) \<longleftrightarrow> x \<in> open_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   417
  by (simp add: open_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   418
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   419
lemma of_real_closed_segment [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   420
  "of_real x \<in> closed_segment (of_real a) (of_real b) \<longleftrightarrow> x \<in> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   421
  apply (auto simp: in_segment scaleR_conv_of_real elim!: ex_forward)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   422
  using of_real_eq_iff by fastforce
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   423
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   424
lemma of_real_open_segment [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   425
  "of_real x \<in> open_segment (of_real a) (of_real b) \<longleftrightarrow> x \<in> open_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   426
  apply (auto simp: in_segment scaleR_conv_of_real elim!: ex_forward del: exE)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   427
  using of_real_eq_iff by fastforce
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   428
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   429
lemma convex_contains_segment:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   430
  "convex S \<longleftrightarrow> (\<forall>a\<in>S. \<forall>b\<in>S. closed_segment a b \<subseteq> S)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   431
  unfolding convex_alt closed_segment_def by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   432
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   433
lemma closed_segment_in_Reals:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   434
   "\<lbrakk>x \<in> closed_segment a b; a \<in> Reals; b \<in> Reals\<rbrakk> \<Longrightarrow> x \<in> Reals"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   435
  by (meson subsetD convex_Reals convex_contains_segment)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   436
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   437
lemma open_segment_in_Reals:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   438
   "\<lbrakk>x \<in> open_segment a b; a \<in> Reals; b \<in> Reals\<rbrakk> \<Longrightarrow> x \<in> Reals"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   439
  by (metis Diff_iff closed_segment_in_Reals open_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   440
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   441
lemma closed_segment_subset: "\<lbrakk>x \<in> S; y \<in> S; convex S\<rbrakk> \<Longrightarrow> closed_segment x y \<subseteq> S"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   442
  by (simp add: convex_contains_segment)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   443
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   444
lemma closed_segment_subset_convex_hull:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   445
    "\<lbrakk>x \<in> convex hull S; y \<in> convex hull S\<rbrakk> \<Longrightarrow> closed_segment x y \<subseteq> convex hull S"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   446
  using convex_contains_segment by blast
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   447
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   448
lemma segment_convex_hull:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   449
  "closed_segment a b = convex hull {a,b}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   450
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   451
  have *: "\<And>x. {x} \<noteq> {}" by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   452
  show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   453
    unfolding segment convex_hull_insert[OF *] convex_hull_singleton
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   454
    by (safe; rule_tac x="1 - u" in exI; force)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   455
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   456
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   457
lemma open_closed_segment: "u \<in> open_segment w z \<Longrightarrow> u \<in> closed_segment w z"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   458
  by (auto simp add: closed_segment_def open_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   459
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   460
lemma segment_open_subset_closed:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   461
   "open_segment a b \<subseteq> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   462
  by (auto simp: closed_segment_def open_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   463
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   464
lemma bounded_closed_segment:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   465
  fixes a :: "'a::real_normed_vector" shows "bounded (closed_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   466
  by (rule boundedI[where B="max (norm a) (norm b)"])
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   467
    (auto simp: closed_segment_def max_def convex_bound_le intro!: norm_triangle_le)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   468
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   469
lemma bounded_open_segment:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   470
    fixes a :: "'a::real_normed_vector" shows "bounded (open_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   471
  by (rule bounded_subset [OF bounded_closed_segment segment_open_subset_closed])
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   472
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   473
lemmas bounded_segment = bounded_closed_segment open_closed_segment
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   474
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   475
lemma ends_in_segment [iff]: "a \<in> closed_segment a b" "b \<in> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   476
  unfolding segment_convex_hull
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   477
  by (auto intro!: hull_subset[unfolded subset_eq, rule_format])
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   478
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   479
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   480
lemma eventually_closed_segment:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   481
  fixes x0::"'a::real_normed_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   482
  assumes "open X0" "x0 \<in> X0"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   483
  shows "\<forall>\<^sub>F x in at x0 within U. closed_segment x0 x \<subseteq> X0"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   484
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   485
  from openE[OF assms]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   486
  obtain e where e: "0 < e" "ball x0 e \<subseteq> X0" .
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   487
  then have "\<forall>\<^sub>F x in at x0 within U. x \<in> ball x0 e"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   488
    by (auto simp: dist_commute eventually_at)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   489
  then show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   490
  proof eventually_elim
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   491
    case (elim x)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   492
    have "x0 \<in> ball x0 e" using \<open>e > 0\<close> by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   493
    from convex_ball[unfolded convex_contains_segment, rule_format, OF this elim]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   494
    have "closed_segment x0 x \<subseteq> ball x0 e" .
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   495
    also note \<open>\<dots> \<subseteq> X0\<close>
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   496
    finally show ?case .
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   497
  qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   498
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   499
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   500
lemma closed_segment_commute: "closed_segment a b = closed_segment b a"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   501
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   502
  have "{a, b} = {b, a}" by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   503
  thus ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   504
    by (simp add: segment_convex_hull)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   505
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   506
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   507
lemma segment_bound1:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   508
  assumes "x \<in> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   509
  shows "norm (x - a) \<le> norm (b - a)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   510
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   511
  obtain u where "x = (1 - u) *\<^sub>R a + u *\<^sub>R b" "0 \<le> u" "u \<le> 1"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   512
    using assms by (auto simp add: closed_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   513
  then show "norm (x - a) \<le> norm (b - a)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   514
    apply clarify
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   515
    apply (auto simp: algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   516
    apply (simp add: scaleR_diff_right [symmetric] mult_left_le_one_le)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   517
    done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   518
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   519
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   520
lemma segment_bound:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   521
  assumes "x \<in> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   522
  shows "norm (x - a) \<le> norm (b - a)" "norm (x - b) \<le> norm (b - a)"
71169
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   523
by (metis assms closed_segment_commute dist_commute dist_norm segment_bound1)+
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   524
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   525
lemma open_segment_commute: "open_segment a b = open_segment b a"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   526
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   527
  have "{a, b} = {b, a}" by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   528
  thus ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   529
    by (simp add: closed_segment_commute open_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   530
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   531
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   532
lemma closed_segment_idem [simp]: "closed_segment a a = {a}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   533
  unfolding segment by (auto simp add: algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   534
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   535
lemma open_segment_idem [simp]: "open_segment a a = {}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   536
  by (simp add: open_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   537
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   538
lemma closed_segment_eq_open: "closed_segment a b = open_segment a b \<union> {a,b}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   539
  using open_segment_def by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   540
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   541
lemma convex_contains_open_segment:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   542
  "convex s \<longleftrightarrow> (\<forall>a\<in>s. \<forall>b\<in>s. open_segment a b \<subseteq> s)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   543
  by (simp add: convex_contains_segment closed_segment_eq_open)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   544
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   545
lemma closed_segment_eq_real_ivl1:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   546
  fixes a b::real
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   547
  assumes "a \<le> b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   548
  shows "closed_segment a b = {a .. b}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   549
proof safe
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   550
  fix x
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   551
  assume "x \<in> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   552
  then obtain u where u: "0 \<le> u" "u \<le> 1" and x_def: "x = (1 - u) * a + u * b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   553
    by (auto simp: closed_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   554
  have "u * a \<le> u * b" "(1 - u) * a \<le> (1 - u) * b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   555
    by (auto intro!: mult_left_mono u assms)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   556
  then show "x \<in> {a .. b}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   557
    unfolding x_def by (auto simp: algebra_simps)
71169
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   558
next
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   559
  show "\<And>x. x \<in> {a..b} \<Longrightarrow> x \<in> closed_segment a b"
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   560
    by (force simp: closed_segment_def divide_simps algebra_simps
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   561
              intro: exI[where x="(x - a) / (b - a)" for x])
df1d96114754 Fixed a few messy proofs and adjusted inconsistent section headings
paulson <lp15@cam.ac.uk>
parents: 71028
diff changeset
   562
qed 
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   563
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   564
lemma closed_segment_eq_real_ivl:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   565
  fixes a b::real
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   566
  shows "closed_segment a b = (if a \<le> b then {a .. b} else {b .. a})"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   567
  using closed_segment_eq_real_ivl1[of a b] closed_segment_eq_real_ivl1[of b a]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   568
  by (auto simp: closed_segment_commute)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   569
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   570
lemma open_segment_eq_real_ivl:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   571
  fixes a b::real
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   572
  shows "open_segment a b = (if a \<le> b then {a<..<b} else {b<..<a})"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   573
by (auto simp: closed_segment_eq_real_ivl open_segment_def split: if_split_asm)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   574
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   575
lemma closed_segment_real_eq:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   576
  fixes u::real shows "closed_segment u v = (\<lambda>x. (v - u) * x + u) ` {0..1}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   577
  by (simp add: add.commute [of u] image_affinity_atLeastAtMost [where c=u] closed_segment_eq_real_ivl)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   578
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   579
lemma closed_segment_same_Re:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   580
  assumes "Re a = Re b"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   581
  shows   "closed_segment a b = {z. Re z = Re a \<and> Im z \<in> closed_segment (Im a) (Im b)}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   582
proof safe
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   583
  fix z assume "z \<in> closed_segment a b"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   584
  then obtain u where u: "u \<in> {0..1}" "z = a + of_real u * (b - a)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   585
    by (auto simp: closed_segment_def scaleR_conv_of_real algebra_simps)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   586
  from assms show "Re z = Re a" by (auto simp: u)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   587
  from u(1) show "Im z \<in> closed_segment (Im a) (Im b)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   588
    by (force simp: u closed_segment_def algebra_simps)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   589
next
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   590
  fix z assume [simp]: "Re z = Re a" and "Im z \<in> closed_segment (Im a) (Im b)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   591
  then obtain u where u: "u \<in> {0..1}" "Im z = Im a + of_real u * (Im b - Im a)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   592
    by (auto simp: closed_segment_def scaleR_conv_of_real algebra_simps)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   593
  from u(1) show "z \<in> closed_segment a b" using assms
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   594
    by (force simp: u closed_segment_def algebra_simps scaleR_conv_of_real complex_eq_iff)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   595
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   596
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   597
lemma closed_segment_same_Im:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   598
  assumes "Im a = Im b"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   599
  shows   "closed_segment a b = {z. Im z = Im a \<and> Re z \<in> closed_segment (Re a) (Re b)}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   600
proof safe
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   601
  fix z assume "z \<in> closed_segment a b"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   602
  then obtain u where u: "u \<in> {0..1}" "z = a + of_real u * (b - a)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   603
    by (auto simp: closed_segment_def scaleR_conv_of_real algebra_simps)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   604
  from assms show "Im z = Im a" by (auto simp: u)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   605
  from u(1) show "Re z \<in> closed_segment (Re a) (Re b)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   606
    by (force simp: u closed_segment_def algebra_simps)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   607
next
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   608
  fix z assume [simp]: "Im z = Im a" and "Re z \<in> closed_segment (Re a) (Re b)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   609
  then obtain u where u: "u \<in> {0..1}" "Re z = Re a + of_real u * (Re b - Re a)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   610
    by (auto simp: closed_segment_def scaleR_conv_of_real algebra_simps)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   611
  from u(1) show "z \<in> closed_segment a b" using assms
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   612
    by (force simp: u closed_segment_def algebra_simps scaleR_conv_of_real complex_eq_iff)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   613
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 71169
diff changeset
   614
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   615
lemma dist_in_closed_segment:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   616
  fixes a :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   617
  assumes "x \<in> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   618
    shows "dist x a \<le> dist a b \<and> dist x b \<le> dist a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   619
proof (intro conjI)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   620
  obtain u where u: "0 \<le> u" "u \<le> 1" and x: "x = (1 - u) *\<^sub>R a + u *\<^sub>R b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   621
    using assms by (force simp: in_segment algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   622
  have "dist x a = u * dist a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   623
    apply (simp add: dist_norm algebra_simps x)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   624
    by (metis \<open>0 \<le> u\<close> abs_of_nonneg norm_minus_commute norm_scaleR real_vector.scale_right_diff_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   625
  also have "...  \<le> dist a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   626
    by (simp add: mult_left_le_one_le u)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   627
  finally show "dist x a \<le> dist a b" .
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   628
  have "dist x b = norm ((1-u) *\<^sub>R a - (1-u) *\<^sub>R b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   629
    by (simp add: dist_norm algebra_simps x)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   630
  also have "... = (1-u) * dist a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   631
  proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   632
    have "norm ((1 - 1 * u) *\<^sub>R (a - b)) = (1 - 1 * u) * norm (a - b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   633
      using \<open>u \<le> 1\<close> by force
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   634
    then show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   635
      by (simp add: dist_norm real_vector.scale_right_diff_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   636
  qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   637
  also have "... \<le> dist a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   638
    by (simp add: mult_left_le_one_le u)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   639
  finally show "dist x b \<le> dist a b" .
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   640
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   641
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   642
lemma dist_in_open_segment:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   643
  fixes a :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   644
  assumes "x \<in> open_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   645
    shows "dist x a < dist a b \<and> dist x b < dist a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   646
proof (intro conjI)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   647
  obtain u where u: "0 < u" "u < 1" and x: "x = (1 - u) *\<^sub>R a + u *\<^sub>R b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   648
    using assms by (force simp: in_segment algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   649
  have "dist x a = u * dist a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   650
    apply (simp add: dist_norm algebra_simps x)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   651
    by (metis abs_of_nonneg less_eq_real_def norm_minus_commute norm_scaleR real_vector.scale_right_diff_distrib \<open>0 < u\<close>)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   652
  also have *: "...  < dist a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   653
    by (metis (no_types) assms dist_eq_0_iff dist_not_less_zero in_segment(2) linorder_neqE_linordered_idom mult.left_neutral real_mult_less_iff1 \<open>u < 1\<close>)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   654
  finally show "dist x a < dist a b" .
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   655
  have ab_ne0: "dist a b \<noteq> 0"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   656
    using * by fastforce
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   657
  have "dist x b = norm ((1-u) *\<^sub>R a - (1-u) *\<^sub>R b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   658
    by (simp add: dist_norm algebra_simps x)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   659
  also have "... = (1-u) * dist a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   660
  proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   661
    have "norm ((1 - 1 * u) *\<^sub>R (a - b)) = (1 - 1 * u) * norm (a - b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   662
      using \<open>u < 1\<close> by force
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   663
    then show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   664
      by (simp add: dist_norm real_vector.scale_right_diff_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   665
  qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   666
  also have "... < dist a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   667
    using ab_ne0 \<open>0 < u\<close> by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   668
  finally show "dist x b < dist a b" .
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   669
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   670
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   671
lemma dist_decreases_open_segment_0:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   672
  fixes x :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   673
  assumes "x \<in> open_segment 0 b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   674
    shows "dist c x < dist c 0 \<or> dist c x < dist c b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   675
proof (rule ccontr, clarsimp simp: not_less)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   676
  obtain u where u: "0 \<noteq> b" "0 < u" "u < 1" and x: "x = u *\<^sub>R b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   677
    using assms by (auto simp: in_segment)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   678
  have xb: "x \<bullet> b < b \<bullet> b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   679
    using u x by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   680
  assume "norm c \<le> dist c x"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   681
  then have "c \<bullet> c \<le> (c - x) \<bullet> (c - x)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   682
    by (simp add: dist_norm norm_le)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   683
  moreover have "0 < x \<bullet> b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   684
    using u x by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   685
  ultimately have less: "c \<bullet> b < x \<bullet> b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   686
    by (simp add: x algebra_simps inner_commute u)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   687
  assume "dist c b \<le> dist c x"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   688
  then have "(c - b) \<bullet> (c - b) \<le> (c - x) \<bullet> (c - x)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   689
    by (simp add: dist_norm norm_le)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   690
  then have "(b \<bullet> b) * (1 - u*u) \<le> 2 * (b \<bullet> c) * (1-u)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   691
    by (simp add: x algebra_simps inner_commute)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   692
  then have "(1+u) * (b \<bullet> b) * (1-u) \<le> 2 * (b \<bullet> c) * (1-u)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   693
    by (simp add: algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   694
  then have "(1+u) * (b \<bullet> b) \<le> 2 * (b \<bullet> c)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   695
    using \<open>u < 1\<close> by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   696
  with xb have "c \<bullet> b \<ge> x \<bullet> b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   697
    by (auto simp: x algebra_simps inner_commute)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   698
  with less show False by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   699
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   700
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   701
proposition dist_decreases_open_segment:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   702
  fixes a :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   703
  assumes "x \<in> open_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   704
    shows "dist c x < dist c a \<or> dist c x < dist c b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   705
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   706
  have *: "x - a \<in> open_segment 0 (b - a)" using assms
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   707
    by (metis diff_self open_segment_translation_eq uminus_add_conv_diff)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   708
  show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   709
    using dist_decreases_open_segment_0 [OF *, of "c-a"] assms
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   710
    by (simp add: dist_norm)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   711
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   712
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   713
corollary open_segment_furthest_le:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   714
  fixes a b x y :: "'a::euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   715
  assumes "x \<in> open_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   716
  shows "norm (y - x) < norm (y - a) \<or>  norm (y - x) < norm (y - b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   717
  by (metis assms dist_decreases_open_segment dist_norm)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   718
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   719
corollary dist_decreases_closed_segment:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   720
  fixes a :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   721
  assumes "x \<in> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   722
    shows "dist c x \<le> dist c a \<or> dist c x \<le> dist c b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   723
apply (cases "x \<in> open_segment a b")
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   724
 using dist_decreases_open_segment less_eq_real_def apply blast
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   725
by (metis DiffI assms empty_iff insertE open_segment_def order_refl)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   726
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   727
corollary segment_furthest_le:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   728
  fixes a b x y :: "'a::euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   729
  assumes "x \<in> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   730
  shows "norm (y - x) \<le> norm (y - a) \<or>  norm (y - x) \<le> norm (y - b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   731
  by (metis assms dist_decreases_closed_segment dist_norm)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   732
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   733
lemma convex_intermediate_ball:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   734
  fixes a :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   735
  shows "\<lbrakk>ball a r \<subseteq> T; T \<subseteq> cball a r\<rbrakk> \<Longrightarrow> convex T"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   736
apply (simp add: convex_contains_open_segment, clarify)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   737
by (metis (no_types, hide_lams) less_le_trans mem_ball mem_cball subsetCE dist_decreases_open_segment)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   738
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   739
lemma csegment_midpoint_subset: "closed_segment (midpoint a b) b \<subseteq> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   740
  apply (clarsimp simp: midpoint_def in_segment)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   741
  apply (rule_tac x="(1 + u) / 2" in exI)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   742
  apply (auto simp: algebra_simps add_divide_distrib diff_divide_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   743
  by (metis field_sum_of_halves scaleR_left.add)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   744
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   745
lemma notin_segment_midpoint:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   746
  fixes a :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   747
  shows "a \<noteq> b \<Longrightarrow> a \<notin> closed_segment (midpoint a b) b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   748
by (auto simp: dist_midpoint dest!: dist_in_closed_segment)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   749
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   750
subsubsection\<open>More lemmas, especially for working with the underlying formula\<close>
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   751
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   752
lemma segment_eq_compose:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   753
  fixes a :: "'a :: real_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   754
  shows "(\<lambda>u. (1 - u) *\<^sub>R a + u *\<^sub>R b) = (\<lambda>x. a + x) o (\<lambda>u. u *\<^sub>R (b - a))"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   755
    by (simp add: o_def algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   756
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   757
lemma segment_degen_1:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   758
  fixes a :: "'a :: real_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   759
  shows "(1 - u) *\<^sub>R a + u *\<^sub>R b = b \<longleftrightarrow> a=b \<or> u=1"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   760
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   761
  { assume "(1 - u) *\<^sub>R a + u *\<^sub>R b = b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   762
    then have "(1 - u) *\<^sub>R a = (1 - u) *\<^sub>R b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   763
      by (simp add: algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   764
    then have "a=b \<or> u=1"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   765
      by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   766
  } then show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   767
      by (auto simp: algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   768
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   769
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   770
lemma segment_degen_0:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   771
    fixes a :: "'a :: real_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   772
    shows "(1 - u) *\<^sub>R a + u *\<^sub>R b = a \<longleftrightarrow> a=b \<or> u=0"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   773
  using segment_degen_1 [of "1-u" b a]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   774
  by (auto simp: algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   775
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   776
lemma add_scaleR_degen:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   777
  fixes a b ::"'a::real_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   778
  assumes  "(u *\<^sub>R b + v *\<^sub>R a) = (u *\<^sub>R a + v *\<^sub>R b)"  "u \<noteq> v"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   779
  shows "a=b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   780
  by (metis (no_types, hide_lams) add.commute add_diff_eq diff_add_cancel real_vector.scale_cancel_left real_vector.scale_left_diff_distrib assms)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   781
  
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   782
lemma closed_segment_image_interval:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   783
     "closed_segment a b = (\<lambda>u. (1 - u) *\<^sub>R a + u *\<^sub>R b) ` {0..1}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   784
  by (auto simp: set_eq_iff image_iff closed_segment_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   785
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   786
lemma open_segment_image_interval:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   787
     "open_segment a b = (if a=b then {} else (\<lambda>u. (1 - u) *\<^sub>R a + u *\<^sub>R b) ` {0<..<1})"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   788
  by (auto simp:  open_segment_def closed_segment_def segment_degen_0 segment_degen_1)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   789
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   790
lemmas segment_image_interval = closed_segment_image_interval open_segment_image_interval
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   791
71230
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   792
lemma closed_segment_neq_empty [simp]: "closed_segment a b \<noteq> {}"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   793
  by auto
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   794
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   795
lemma open_segment_eq_empty [simp]: "open_segment a b = {} \<longleftrightarrow> a = b"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   796
proof -
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   797
  { assume a1: "open_segment a b = {}"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   798
    have "{} \<noteq> {0::real<..<1}"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   799
      by simp
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   800
    then have "a = b"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   801
      using a1 open_segment_image_interval by fastforce
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   802
  } then show ?thesis by auto
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   803
qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   804
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   805
lemma open_segment_eq_empty' [simp]: "{} = open_segment a b \<longleftrightarrow> a = b"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   806
  using open_segment_eq_empty by blast
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   807
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   808
lemmas segment_eq_empty = closed_segment_neq_empty open_segment_eq_empty
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   809
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   810
lemma inj_segment:
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   811
  fixes a :: "'a :: real_vector"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   812
  assumes "a \<noteq> b"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   813
    shows "inj_on (\<lambda>u. (1 - u) *\<^sub>R a + u *\<^sub>R b) I"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   814
proof
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   815
  fix x y
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   816
  assume "(1 - x) *\<^sub>R a + x *\<^sub>R b = (1 - y) *\<^sub>R a + y *\<^sub>R b"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   817
  then have "x *\<^sub>R (b - a) = y *\<^sub>R (b - a)"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   818
    by (simp add: algebra_simps)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   819
  with assms show "x = y"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   820
    by (simp add: real_vector.scale_right_imp_eq)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   821
qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   822
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   823
lemma finite_closed_segment [simp]: "finite(closed_segment a b) \<longleftrightarrow> a = b"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   824
  apply auto
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   825
  apply (rule ccontr)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   826
  apply (simp add: segment_image_interval)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   827
  using infinite_Icc [OF zero_less_one] finite_imageD [OF _ inj_segment] apply blast
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   828
  done
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   829
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   830
lemma finite_open_segment [simp]: "finite(open_segment a b) \<longleftrightarrow> a = b"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   831
  by (auto simp: open_segment_def)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   832
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   833
lemmas finite_segment = finite_closed_segment finite_open_segment
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   834
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   835
lemma closed_segment_eq_sing: "closed_segment a b = {c} \<longleftrightarrow> a = c \<and> b = c"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   836
  by auto
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   837
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   838
lemma open_segment_eq_sing: "open_segment a b \<noteq> {c}"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   839
  by (metis finite_insert finite_open_segment insert_not_empty open_segment_image_interval)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   840
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   841
lemmas segment_eq_sing = closed_segment_eq_sing open_segment_eq_sing
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   842
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   843
lemma open_segment_bound1:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   844
  assumes "x \<in> open_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   845
  shows "norm (x - a) < norm (b - a)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   846
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   847
  obtain u where "x = (1 - u) *\<^sub>R a + u *\<^sub>R b" "0 < u" "u < 1" "a \<noteq> b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   848
    using assms by (auto simp add: open_segment_image_interval split: if_split_asm)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   849
  then show "norm (x - a) < norm (b - a)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   850
    apply clarify
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   851
    apply (auto simp: algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   852
    apply (simp add: scaleR_diff_right [symmetric])
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   853
    done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   854
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   855
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   856
lemma compact_segment [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   857
  fixes a :: "'a::real_normed_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   858
  shows "compact (closed_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   859
  by (auto simp: segment_image_interval intro!: compact_continuous_image continuous_intros)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   860
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   861
lemma closed_segment [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   862
  fixes a :: "'a::real_normed_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   863
  shows "closed (closed_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   864
  by (simp add: compact_imp_closed)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   865
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   866
lemma closure_closed_segment [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   867
  fixes a :: "'a::real_normed_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   868
  shows "closure(closed_segment a b) = closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   869
  by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   870
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   871
lemma open_segment_bound:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   872
  assumes "x \<in> open_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   873
  shows "norm (x - a) < norm (b - a)" "norm (x - b) < norm (b - a)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   874
apply (simp add: assms open_segment_bound1)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   875
by (metis assms norm_minus_commute open_segment_bound1 open_segment_commute)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   876
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   877
lemma closure_open_segment [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   878
  "closure (open_segment a b) = (if a = b then {} else closed_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   879
    for a :: "'a::euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   880
proof (cases "a = b")
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   881
  case True
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   882
  then show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   883
    by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   884
next
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   885
  case False
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   886
  have "closure ((\<lambda>u. u *\<^sub>R (b - a)) ` {0<..<1}) = (\<lambda>u. u *\<^sub>R (b - a)) ` closure {0<..<1}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   887
    apply (rule closure_injective_linear_image [symmetric])
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   888
     apply (use False in \<open>auto intro!: injI\<close>)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   889
    done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   890
  then have "closure
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   891
     ((\<lambda>u. (1 - u) *\<^sub>R a + u *\<^sub>R b) ` {0<..<1}) =
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   892
    (\<lambda>x. (1 - x) *\<^sub>R a + x *\<^sub>R b) ` closure {0<..<1}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   893
    using closure_translation [of a "((\<lambda>x. x *\<^sub>R b - x *\<^sub>R a) ` {0<..<1})"]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   894
    by (simp add: segment_eq_compose field_simps scaleR_diff_left scaleR_diff_right image_image)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   895
  then show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   896
    by (simp add: segment_image_interval closure_greaterThanLessThan [symmetric] del: closure_greaterThanLessThan)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   897
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   898
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   899
lemma closed_open_segment_iff [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   900
    fixes a :: "'a::euclidean_space"  shows "closed(open_segment a b) \<longleftrightarrow> a = b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   901
  by (metis open_segment_def DiffE closure_eq closure_open_segment ends_in_segment(1) insert_iff segment_image_interval(2))
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   902
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   903
lemma compact_open_segment_iff [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   904
    fixes a :: "'a::euclidean_space"  shows "compact(open_segment a b) \<longleftrightarrow> a = b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   905
  by (simp add: bounded_open_segment compact_eq_bounded_closed)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   906
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   907
lemma convex_closed_segment [iff]: "convex (closed_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   908
  unfolding segment_convex_hull by(rule convex_convex_hull)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   909
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   910
lemma convex_open_segment [iff]: "convex (open_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   911
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   912
  have "convex ((\<lambda>u. u *\<^sub>R (b - a)) ` {0<..<1})"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   913
    by (rule convex_linear_image) auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   914
  then have "convex ((+) a ` (\<lambda>u. u *\<^sub>R (b - a)) ` {0<..<1})"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   915
    by (rule convex_translation)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   916
  then show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   917
    by (simp add: image_image open_segment_image_interval segment_eq_compose field_simps scaleR_diff_left scaleR_diff_right)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   918
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   919
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   920
lemmas convex_segment = convex_closed_segment convex_open_segment
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
   921
71230
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   922
lemma subset_closed_segment:
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   923
    "closed_segment a b \<subseteq> closed_segment c d \<longleftrightarrow>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   924
     a \<in> closed_segment c d \<and> b \<in> closed_segment c d"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   925
  by auto (meson contra_subsetD convex_closed_segment convex_contains_segment)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   926
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   927
lemma subset_co_segment:
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   928
    "closed_segment a b \<subseteq> open_segment c d \<longleftrightarrow>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   929
     a \<in> open_segment c d \<and> b \<in> open_segment c d"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   930
using closed_segment_subset by blast
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   931
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   932
lemma subset_open_segment:
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   933
  fixes a :: "'a::euclidean_space"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   934
  shows "open_segment a b \<subseteq> open_segment c d \<longleftrightarrow>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   935
         a = b \<or> a \<in> closed_segment c d \<and> b \<in> closed_segment c d"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   936
        (is "?lhs = ?rhs")
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   937
proof (cases "a = b")
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   938
  case True then show ?thesis by simp
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   939
next
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   940
  case False show ?thesis
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   941
  proof
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   942
    assume rhs: ?rhs
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   943
    with \<open>a \<noteq> b\<close> have "c \<noteq> d"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   944
      using closed_segment_idem singleton_iff by auto
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   945
    have "\<exists>uc. (1 - u) *\<^sub>R ((1 - ua) *\<^sub>R c + ua *\<^sub>R d) + u *\<^sub>R ((1 - ub) *\<^sub>R c + ub *\<^sub>R d) =
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   946
               (1 - uc) *\<^sub>R c + uc *\<^sub>R d \<and> 0 < uc \<and> uc < 1"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   947
        if neq: "(1 - ua) *\<^sub>R c + ua *\<^sub>R d \<noteq> (1 - ub) *\<^sub>R c + ub *\<^sub>R d" "c \<noteq> d"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   948
           and "a = (1 - ua) *\<^sub>R c + ua *\<^sub>R d" "b = (1 - ub) *\<^sub>R c + ub *\<^sub>R d"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   949
           and u: "0 < u" "u < 1" and uab: "0 \<le> ua" "ua \<le> 1" "0 \<le> ub" "ub \<le> 1"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   950
        for u ua ub
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   951
    proof -
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   952
      have "ua \<noteq> ub"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   953
        using neq by auto
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   954
      moreover have "(u - 1) * ua \<le> 0" using u uab
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   955
        by (simp add: mult_nonpos_nonneg)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   956
      ultimately have lt: "(u - 1) * ua < u * ub" using u uab
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   957
        by (metis antisym_conv diff_ge_0_iff_ge le_less_trans mult_eq_0_iff mult_le_0_iff not_less)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   958
      have "p * ua + q * ub < p+q" if p: "0 < p" and  q: "0 < q" for p q
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   959
      proof -
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   960
        have "\<not> p \<le> 0" "\<not> q \<le> 0"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   961
          using p q not_less by blast+
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   962
        then show ?thesis
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   963
          by (metis \<open>ua \<noteq> ub\<close> add_less_cancel_left add_less_cancel_right add_mono_thms_linordered_field(5)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   964
                    less_eq_real_def mult_cancel_left1 mult_less_cancel_left2 uab(2) uab(4))
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   965
      qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   966
      then have "(1 - u) * ua + u * ub < 1" using u \<open>ua \<noteq> ub\<close>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   967
        by (metis diff_add_cancel diff_gt_0_iff_gt)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   968
      with lt show ?thesis
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   969
        by (rule_tac x="ua + u*(ub-ua)" in exI) (simp add: algebra_simps)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   970
    qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   971
    with rhs \<open>a \<noteq> b\<close> \<open>c \<noteq> d\<close> show ?lhs
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   972
      unfolding open_segment_image_interval closed_segment_def
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   973
      by (fastforce simp add:)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   974
  next
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   975
    assume lhs: ?lhs
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   976
    with \<open>a \<noteq> b\<close> have "c \<noteq> d"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   977
      by (meson finite_open_segment rev_finite_subset)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   978
    have "closure (open_segment a b) \<subseteq> closure (open_segment c d)"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   979
      using lhs closure_mono by blast
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   980
    then have "closed_segment a b \<subseteq> closed_segment c d"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   981
      by (simp add: \<open>a \<noteq> b\<close> \<open>c \<noteq> d\<close>)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   982
    then show ?rhs
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   983
      by (force simp: \<open>a \<noteq> b\<close>)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   984
  qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   985
qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   986
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   987
lemma subset_oc_segment:
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   988
  fixes a :: "'a::euclidean_space"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   989
  shows "open_segment a b \<subseteq> closed_segment c d \<longleftrightarrow>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   990
         a = b \<or> a \<in> closed_segment c d \<and> b \<in> closed_segment c d"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   991
apply (simp add: subset_open_segment [symmetric])
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   992
apply (rule iffI)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   993
 apply (metis closure_closed_segment closure_mono closure_open_segment subset_closed_segment subset_open_segment)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   994
apply (meson dual_order.trans segment_open_subset_closed)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   995
done
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   996
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   997
lemmas subset_segment = subset_closed_segment subset_co_segment subset_oc_segment subset_open_segment
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   998
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
   999
lemma dist_half_times2:
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1000
  fixes a :: "'a :: real_normed_vector"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1001
  shows "dist ((1 / 2) *\<^sub>R (a + b)) x * 2 = dist (a+b) (2 *\<^sub>R x)"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1002
proof -
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1003
  have "norm ((1 / 2) *\<^sub>R (a + b) - x) * 2 = norm (2 *\<^sub>R ((1 / 2) *\<^sub>R (a + b) - x))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1004
    by simp
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1005
  also have "... = norm ((a + b) - 2 *\<^sub>R x)"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1006
    by (simp add: real_vector.scale_right_diff_distrib)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1007
  finally show ?thesis
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1008
    by (simp only: dist_norm)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1009
qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1010
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1011
lemma closed_segment_as_ball:
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1012
    "closed_segment a b = affine hull {a,b} \<inter> cball(inverse 2 *\<^sub>R (a + b))(norm(b - a) / 2)"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1013
proof (cases "b = a")
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1014
  case True then show ?thesis by (auto simp: hull_inc)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1015
next
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1016
  case False
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1017
  then have *: "((\<exists>u v. x = u *\<^sub>R a + v *\<^sub>R b \<and> u + v = 1) \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1018
                  dist ((1 / 2) *\<^sub>R (a + b)) x * 2 \<le> norm (b - a)) =
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1019
                 (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and> 0 \<le> u \<and> u \<le> 1)" for x
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1020
  proof -
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1021
    have "((\<exists>u v. x = u *\<^sub>R a + v *\<^sub>R b \<and> u + v = 1) \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1022
                  dist ((1 / 2) *\<^sub>R (a + b)) x * 2 \<le> norm (b - a)) =
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1023
          ((\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b) \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1024
                  dist ((1 / 2) *\<^sub>R (a + b)) x * 2 \<le> norm (b - a))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1025
      unfolding eq_diff_eq [symmetric] by simp
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1026
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1027
                          norm ((a+b) - (2 *\<^sub>R x)) \<le> norm (b - a))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1028
      by (simp add: dist_half_times2) (simp add: dist_norm)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1029
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1030
            norm ((a+b) - (2 *\<^sub>R ((1 - u) *\<^sub>R a + u *\<^sub>R b))) \<le> norm (b - a))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1031
      by auto
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1032
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1033
                norm ((1 - u * 2) *\<^sub>R (b - a)) \<le> norm (b - a))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1034
      by (simp add: algebra_simps scaleR_2)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1035
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1036
                          \<bar>1 - u * 2\<bar> * norm (b - a) \<le> norm (b - a))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1037
      by simp
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1038
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and> \<bar>1 - u * 2\<bar> \<le> 1)"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1039
      by (simp add: mult_le_cancel_right2 False)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1040
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and> 0 \<le> u \<and> u \<le> 1)"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1041
      by auto
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1042
    finally show ?thesis .
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1043
  qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1044
  show ?thesis
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1045
    by (simp add: affine_hull_2 Set.set_eq_iff closed_segment_def *)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1046
qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1047
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1048
lemma open_segment_as_ball:
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1049
    "open_segment a b =
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1050
     affine hull {a,b} \<inter> ball(inverse 2 *\<^sub>R (a + b))(norm(b - a) / 2)"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1051
proof (cases "b = a")
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1052
  case True then show ?thesis by (auto simp: hull_inc)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1053
next
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1054
  case False
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1055
  then have *: "((\<exists>u v. x = u *\<^sub>R a + v *\<^sub>R b \<and> u + v = 1) \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1056
                  dist ((1 / 2) *\<^sub>R (a + b)) x * 2 < norm (b - a)) =
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1057
                 (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and> 0 < u \<and> u < 1)" for x
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1058
  proof -
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1059
    have "((\<exists>u v. x = u *\<^sub>R a + v *\<^sub>R b \<and> u + v = 1) \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1060
                  dist ((1 / 2) *\<^sub>R (a + b)) x * 2 < norm (b - a)) =
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1061
          ((\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b) \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1062
                  dist ((1 / 2) *\<^sub>R (a + b)) x * 2 < norm (b - a))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1063
      unfolding eq_diff_eq [symmetric] by simp
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1064
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1065
                          norm ((a+b) - (2 *\<^sub>R x)) < norm (b - a))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1066
      by (simp add: dist_half_times2) (simp add: dist_norm)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1067
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1068
            norm ((a+b) - (2 *\<^sub>R ((1 - u) *\<^sub>R a + u *\<^sub>R b))) < norm (b - a))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1069
      by auto
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1070
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1071
                norm ((1 - u * 2) *\<^sub>R (b - a)) < norm (b - a))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1072
      by (simp add: algebra_simps scaleR_2)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1073
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and>
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1074
                          \<bar>1 - u * 2\<bar> * norm (b - a) < norm (b - a))"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1075
      by simp
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1076
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and> \<bar>1 - u * 2\<bar> < 1)"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1077
      by (simp add: mult_le_cancel_right2 False)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1078
    also have "... = (\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and> 0 < u \<and> u < 1)"
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1079
      by auto
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1080
    finally show ?thesis .
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1081
  qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1082
  show ?thesis
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1083
    using False by (force simp: affine_hull_2 Set.set_eq_iff open_segment_image_interval *)
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1084
qed
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1085
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1086
lemmas segment_as_ball = closed_segment_as_ball open_segment_as_ball
095cf95d7725 moved segment lemmas where they belong
nipkow
parents: 71189
diff changeset
  1087
71028
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1088
lemma connected_segment [iff]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1089
  fixes x :: "'a :: real_normed_vector"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1090
  shows "connected (closed_segment x y)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1091
  by (simp add: convex_connected)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1092
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1093
lemma is_interval_closed_segment_1[intro, simp]: "is_interval (closed_segment a b)" for a b::real
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1094
  unfolding closed_segment_eq_real_ivl
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1095
  by (auto simp: is_interval_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1096
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1097
lemma IVT'_closed_segment_real:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1098
  fixes f :: "real \<Rightarrow> real"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1099
  assumes "y \<in> closed_segment (f a) (f b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1100
  assumes "continuous_on (closed_segment a b) f"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1101
  shows "\<exists>x \<in> closed_segment a b. f x = y"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1102
  using IVT'[of f a y b]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1103
    IVT'[of "-f" a "-y" b]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1104
    IVT'[of f b y a]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1105
    IVT'[of "-f" b "-y" a] assms
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1106
  by (cases "a \<le> b"; cases "f b \<ge> f a") (auto simp: closed_segment_eq_real_ivl continuous_on_minus)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1107
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1108
subsection \<open>Betweenness\<close>
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1109
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1110
definition\<^marker>\<open>tag important\<close> "between = (\<lambda>(a,b) x. x \<in> closed_segment a b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1111
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1112
lemma betweenI:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1113
  assumes "0 \<le> u" "u \<le> 1" "x = (1 - u) *\<^sub>R a + u *\<^sub>R b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1114
  shows "between (a, b) x"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1115
using assms unfolding between_def closed_segment_def by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1116
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1117
lemma betweenE:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1118
  assumes "between (a, b) x"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1119
  obtains u where "0 \<le> u" "u \<le> 1" "x = (1 - u) *\<^sub>R a + u *\<^sub>R b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1120
using assms unfolding between_def closed_segment_def by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1121
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1122
lemma between_implies_scaled_diff:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1123
  assumes "between (S, T) X" "between (S, T) Y" "S \<noteq> Y"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1124
  obtains c where "(X - Y) = c *\<^sub>R (S - Y)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1125
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1126
  from \<open>between (S, T) X\<close> obtain u\<^sub>X where X: "X = u\<^sub>X *\<^sub>R S + (1 - u\<^sub>X) *\<^sub>R T"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1127
    by (metis add.commute betweenE eq_diff_eq)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1128
  from \<open>between (S, T) Y\<close> obtain u\<^sub>Y where Y: "Y = u\<^sub>Y *\<^sub>R S + (1 - u\<^sub>Y) *\<^sub>R T"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1129
    by (metis add.commute betweenE eq_diff_eq)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1130
  have "X - Y = (u\<^sub>X - u\<^sub>Y) *\<^sub>R (S - T)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1131
  proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1132
    from X Y have "X - Y =  u\<^sub>X *\<^sub>R S - u\<^sub>Y *\<^sub>R S + ((1 - u\<^sub>X) *\<^sub>R T - (1 - u\<^sub>Y) *\<^sub>R T)" by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1133
    also have "\<dots> = (u\<^sub>X - u\<^sub>Y) *\<^sub>R S - (u\<^sub>X - u\<^sub>Y) *\<^sub>R T" by (simp add: scaleR_left.diff)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1134
    finally show ?thesis by (simp add: real_vector.scale_right_diff_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1135
  qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1136
  moreover from Y have "S - Y = (1 - u\<^sub>Y) *\<^sub>R (S - T)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1137
    by (simp add: real_vector.scale_left_diff_distrib real_vector.scale_right_diff_distrib)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1138
  moreover note \<open>S \<noteq> Y\<close>
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1139
  ultimately have "(X - Y) = ((u\<^sub>X - u\<^sub>Y) / (1 - u\<^sub>Y)) *\<^sub>R (S - Y)" by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1140
  from this that show thesis by blast
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1141
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1142
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1143
lemma between_mem_segment: "between (a,b) x \<longleftrightarrow> x \<in> closed_segment a b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1144
  unfolding between_def by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1145
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1146
lemma between: "between (a, b) (x::'a::euclidean_space) \<longleftrightarrow> dist a b = (dist a x) + (dist x b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1147
proof (cases "a = b")
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1148
  case True
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1149
  then show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1150
    by (auto simp add: between_def dist_commute)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1151
next
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1152
  case False
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1153
  then have Fal: "norm (a - b) \<noteq> 0" and Fal2: "norm (a - b) > 0"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1154
    by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1155
  have *: "\<And>u. a - ((1 - u) *\<^sub>R a + u *\<^sub>R b) = u *\<^sub>R (a - b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1156
    by (auto simp add: algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1157
  have "norm (a - x) *\<^sub>R (x - b) = norm (x - b) *\<^sub>R (a - x)" if "x = (1 - u) *\<^sub>R a + u *\<^sub>R b" "0 \<le> u" "u \<le> 1" for u
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1158
  proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1159
    have *: "a - x = u *\<^sub>R (a - b)" "x - b = (1 - u) *\<^sub>R (a - b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1160
      unfolding that(1) by (auto simp add:algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1161
    show "norm (a - x) *\<^sub>R (x - b) = norm (x - b) *\<^sub>R (a - x)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1162
      unfolding norm_minus_commute[of x a] * using \<open>0 \<le> u\<close> \<open>u \<le> 1\<close>
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1163
      by simp
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1164
  qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1165
  moreover have "\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and> 0 \<le> u \<and> u \<le> 1" if "dist a b = dist a x + dist x b" 
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1166
  proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1167
    let ?\<beta> = "norm (a - x) / norm (a - b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1168
    show "\<exists>u. x = (1 - u) *\<^sub>R a + u *\<^sub>R b \<and> 0 \<le> u \<and> u \<le> 1"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1169
    proof (intro exI conjI)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1170
      show "?\<beta> \<le> 1"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1171
        using Fal2 unfolding that[unfolded dist_norm] norm_ge_zero by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1172
      show "x = (1 - ?\<beta>) *\<^sub>R a + (?\<beta>) *\<^sub>R b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1173
      proof (subst euclidean_eq_iff; intro ballI)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1174
        fix i :: 'a
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1175
        assume i: "i \<in> Basis"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1176
        have "((1 - ?\<beta>) *\<^sub>R a + (?\<beta>) *\<^sub>R b) \<bullet> i 
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1177
              = ((norm (a - b) - norm (a - x)) * (a \<bullet> i) + norm (a - x) * (b \<bullet> i)) / norm (a - b)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1178
          using Fal by (auto simp add: field_simps inner_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1179
        also have "\<dots> = x\<bullet>i"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1180
          apply (rule divide_eq_imp[OF Fal])
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1181
          unfolding that[unfolded dist_norm]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1182
          using that[unfolded dist_triangle_eq] i
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1183
          apply (subst (asm) euclidean_eq_iff)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1184
           apply (auto simp add: field_simps inner_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1185
          done
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1186
        finally show "x \<bullet> i = ((1 - ?\<beta>) *\<^sub>R a + (?\<beta>) *\<^sub>R b) \<bullet> i"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1187
          by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1188
      qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1189
    qed (use Fal2 in auto)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1190
  qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1191
  ultimately show ?thesis
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1192
    by (force simp add: between_def closed_segment_def dist_triangle_eq)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1193
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1194
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1195
lemma between_midpoint:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1196
  fixes a :: "'a::euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1197
  shows "between (a,b) (midpoint a b)" (is ?t1)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1198
    and "between (b,a) (midpoint a b)" (is ?t2)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1199
proof -
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1200
  have *: "\<And>x y z. x = (1/2::real) *\<^sub>R z \<Longrightarrow> y = (1/2) *\<^sub>R z \<Longrightarrow> norm z = norm x + norm y"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1201
    by auto
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1202
  show ?t1 ?t2
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1203
    unfolding between midpoint_def dist_norm
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1204
    by (auto simp add: field_simps inner_simps euclidean_eq_iff[where 'a='a] intro!: *)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1205
qed
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1206
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1207
lemma between_mem_convex_hull:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1208
  "between (a,b) x \<longleftrightarrow> x \<in> convex hull {a,b}"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1209
  unfolding between_mem_segment segment_convex_hull ..
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1210
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1211
lemma between_triv_iff [simp]: "between (a,a) b \<longleftrightarrow> a=b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1212
  by (auto simp: between_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1213
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1214
lemma between_triv1 [simp]: "between (a,b) a"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1215
  by (auto simp: between_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1216
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1217
lemma between_triv2 [simp]: "between (a,b) b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1218
  by (auto simp: between_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1219
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1220
lemma between_commute:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1221
   "between (a,b) = between (b,a)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1222
by (auto simp: between_def closed_segment_commute)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1223
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1224
lemma between_antisym:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1225
  fixes a :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1226
  shows "\<lbrakk>between (b,c) a; between (a,c) b\<rbrakk> \<Longrightarrow> a = b"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1227
by (auto simp: between dist_commute)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1228
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1229
lemma between_trans:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1230
    fixes a :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1231
    shows "\<lbrakk>between (b,c) a; between (a,c) d\<rbrakk> \<Longrightarrow> between (b,c) d"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1232
  using dist_triangle2 [of b c d] dist_triangle3 [of b d a]
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1233
  by (auto simp: between dist_commute)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1234
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1235
lemma between_norm:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1236
    fixes a :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1237
    shows "between (a,b) x \<longleftrightarrow> norm(x - a) *\<^sub>R (b - x) = norm(b - x) *\<^sub>R (x - a)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1238
  by (auto simp: between dist_triangle_eq norm_minus_commute algebra_simps)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1239
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1240
lemma between_swap:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1241
  fixes A B X Y :: "'a::euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1242
  assumes "between (A, B) X"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1243
  assumes "between (A, B) Y"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1244
  shows "between (X, B) Y \<longleftrightarrow> between (A, Y) X"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1245
using assms by (auto simp add: between)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1246
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1247
lemma between_translation [simp]: "between (a + y,a + z) (a + x) \<longleftrightarrow> between (y,z) x"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1248
  by (auto simp: between_def)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1249
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1250
lemma between_trans_2:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1251
  fixes a :: "'a :: euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1252
  shows "\<lbrakk>between (b,c) a; between (a,b) d\<rbrakk> \<Longrightarrow> between (c,d) a"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1253
  by (metis between_commute between_swap between_trans)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1254
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1255
lemma between_scaleR_lift [simp]:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1256
  fixes v :: "'a::euclidean_space"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1257
  shows "between (a *\<^sub>R v, b *\<^sub>R v) (c *\<^sub>R v) \<longleftrightarrow> v = 0 \<or> between (a, b) c"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1258
  by (simp add: between dist_norm scaleR_left_diff_distrib [symmetric] distrib_right [symmetric])
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1259
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1260
lemma between_1:
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1261
  fixes x::real
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1262
  shows "between (a,b) x \<longleftrightarrow> (a \<le> x \<and> x \<le> b) \<or> (b \<le> x \<and> x \<le> a)"
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1263
  by (auto simp: between_mem_segment closed_segment_eq_real_ivl)
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1264
c2465b429e6e Line_Segment is independent of Convex_Euclidean_Space
immler
parents:
diff changeset
  1265
end