src/HOL/Multivariate_Analysis/Convex_Euclidean_Space.thy
changeset 56544 b60d5d119489
parent 56541 0e3abadbef39
child 56571 f4635657d66f
equal deleted inserted replaced
56543:9bd56f2e4c10 56544:b60d5d119489
  3297       done
  3297       done
  3298   }
  3298   }
  3299   then have "ball (x - e *\<^sub>R (x - c)) (e*d) \<inter> affine hull S \<subseteq> S"
  3299   then have "ball (x - e *\<^sub>R (x - c)) (e*d) \<inter> affine hull S \<subseteq> S"
  3300     by auto
  3300     by auto
  3301   moreover have "e * d > 0"
  3301   moreover have "e * d > 0"
  3302     using `e > 0` `d > 0` by (rule mult_pos_pos)
  3302     using `e > 0` `d > 0` by simp
  3303   moreover have c: "c \<in> S"
  3303   moreover have c: "c \<in> S"
  3304     using assms rel_interior_subset by auto
  3304     using assms rel_interior_subset by auto
  3305   moreover from c have "x - e *\<^sub>R (x - c) \<in> S"
  3305   moreover from c have "x - e *\<^sub>R (x - c) \<in> S"
  3306     using mem_convex[of S x c e]
  3306     using mem_convex[of S x c e]
  3307     apply (simp add: algebra_simps)
  3307     apply (simp add: algebra_simps)
  3451   have "\<exists>y \<in> S. norm (y - x) * (1 - e) < e * d"
  3451   have "\<exists>y \<in> S. norm (y - x) * (1 - e) < e * d"
  3452   proof (cases "x \<in> S")
  3452   proof (cases "x \<in> S")
  3453     case True
  3453     case True
  3454     then show ?thesis using `e > 0` `d > 0`
  3454     then show ?thesis using `e > 0` `d > 0`
  3455       apply (rule_tac bexI[where x=x])
  3455       apply (rule_tac bexI[where x=x])
  3456       apply (auto intro!: mult_pos_pos)
  3456       apply (auto)
  3457       done
  3457       done
  3458   next
  3458   next
  3459     case False
  3459     case False
  3460     then have x: "x islimpt S"
  3460     then have x: "x islimpt S"
  3461       using assms(3)[unfolded closure_def] by auto
  3461       using assms(3)[unfolded closure_def] by auto
  3471         apply auto
  3471         apply auto
  3472         done
  3472         done
  3473     next
  3473     next
  3474       case False
  3474       case False
  3475       then have "0 < e * d / (1 - e)" and *: "1 - e > 0"
  3475       then have "0 < e * d / (1 - e)" and *: "1 - e > 0"
  3476         using `e \<le> 1` `e > 0` `d > 0`
  3476         using `e \<le> 1` `e > 0` `d > 0` by (auto)
  3477         by (auto intro!:mult_pos_pos divide_pos_pos)
       
  3478       then obtain y where "y \<in> S" "y \<noteq> x" "dist y x < e * d / (1 - e)"
  3477       then obtain y where "y \<in> S" "y \<noteq> x" "dist y x < e * d / (1 - e)"
  3479         using x[unfolded islimpt_approachable,THEN spec[where x="e*d / (1 - e)"]] by auto
  3478         using x[unfolded islimpt_approachable,THEN spec[where x="e*d / (1 - e)"]] by auto
  3480       then show ?thesis
  3479       then show ?thesis
  3481         apply (rule_tac x=y in bexI)
  3480         apply (rule_tac x=y in bexI)
  3482         unfolding dist_norm
  3481         unfolding dist_norm
  3600      using assms Real_Vector_Spaces.bounded_linear.pos_bounded[of f] by auto
  3599      using assms Real_Vector_Spaces.bounded_linear.pos_bounded[of f] by auto
  3601     def e1 \<equiv> "1 / K"
  3600     def e1 \<equiv> "1 / K"
  3602     then have e1: "e1 > 0" "\<And>x. e1 * norm (f x) \<le> norm x"
  3601     then have e1: "e1 > 0" "\<And>x. e1 * norm (f x) \<le> norm x"
  3603       using K pos_le_divide_eq[of e1] by auto
  3602       using K pos_le_divide_eq[of e1] by auto
  3604     def e \<equiv> "e1 * e2"
  3603     def e \<equiv> "e1 * e2"
  3605     then have "e > 0" using e1 e2 mult_pos_pos by auto
  3604     then have "e > 0" using e1 e2 by auto
  3606     {
  3605     {
  3607       fix y
  3606       fix y
  3608       assume y: "y \<in> cball x e \<inter> affine hull S"
  3607       assume y: "y \<in> cball x e \<inter> affine hull S"
  3609       then have h1: "f y \<in> affine hull (f ` S)"
  3608       then have h1: "f y \<in> affine hull (f ` S)"
  3610         using affine_hull_linear_image[of f S] assms by auto
  3609         using affine_hull_linear_image[of f S] assms by auto
  3643     then obtain e1 where e1: "e1 > 0" "\<forall>x \<in> span S. e1 * norm x \<le> norm (f x)"
  3642     then obtain e1 where e1: "e1 > 0" "\<forall>x \<in> span S. e1 * norm x \<le> norm (f x)"
  3644       using assms injective_imp_isometric[of "span S" f]
  3643       using assms injective_imp_isometric[of "span S" f]
  3645         subspace_span[of S] closed_subspace[of "span S"]
  3644         subspace_span[of S] closed_subspace[of "span S"]
  3646       by auto
  3645       by auto
  3647     def e \<equiv> "e1 * e2"
  3646     def e \<equiv> "e1 * e2"
  3648     then have "e > 0"
  3647     hence "e > 0" using e1 e2 by auto
  3649       using e1 e2 mult_pos_pos by auto
       
  3650     {
  3648     {
  3651       fix y
  3649       fix y
  3652       assume y: "y \<in> cball (f x) e \<inter> affine hull (f ` S)"
  3650       assume y: "y \<in> cball (f x) e \<inter> affine hull (f ` S)"
  3653       then have "y \<in> f ` (affine hull S)"
  3651       then have "y \<in> f ` (affine hull S)"
  3654         using affine_hull_linear_image[of f S] assms by auto
  3652         using affine_hull_linear_image[of f S] assms by auto
  6089           using `t > 0` * `e > 0` by (auto simp add: field_simps)
  6087           using `t > 0` * `e > 0` by (auto simp add: field_simps)
  6090         finally have "f x - f y < e" by auto
  6088         finally have "f x - f y < e" by auto
  6091       }
  6089       }
  6092       ultimately show ?thesis by auto
  6090       ultimately show ?thesis by auto
  6093     qed (insert `0<e`, auto)
  6091     qed (insert `0<e`, auto)
  6094   qed (insert `0<e` `0<k` `0<B`, auto simp add:field_simps intro!:mult_pos_pos)
  6092   qed (insert `0<e` `0<k` `0<B`, auto simp: field_simps)
  6095 qed
  6093 qed
  6096 
  6094 
  6097 
  6095 
  6098 subsection {* Upper bound on a ball implies upper and lower bounds *}
  6096 subsection {* Upper bound on a ball implies upper and lower bounds *}
  6099 
  6097 
  6511       apply (rule d[unfolded subset_eq,rule_format])
  6509       apply (rule d[unfolded subset_eq,rule_format])
  6512       unfolding mem_ball
  6510       unfolding mem_ball
  6513       using assms(3-5)
  6511       using assms(3-5)
  6514       apply auto
  6512       apply auto
  6515       done
  6513       done
  6516   qed (rule mult_pos_pos, insert `e>0` `d>0`, auto)
  6514   qed (insert `e>0` `d>0`, auto)
  6517 qed
  6515 qed
  6518 
  6516 
  6519 lemma mem_interior_closure_convex_shrink:
  6517 lemma mem_interior_closure_convex_shrink:
  6520   fixes s :: "'a::euclidean_space set"
  6518   fixes s :: "'a::euclidean_space set"
  6521   assumes "convex s"
  6519   assumes "convex s"
  6531   proof (cases "x \<in> s")
  6529   proof (cases "x \<in> s")
  6532     case True
  6530     case True
  6533     then show ?thesis
  6531     then show ?thesis
  6534       using `e > 0` `d > 0`
  6532       using `e > 0` `d > 0`
  6535       apply (rule_tac bexI[where x=x])
  6533       apply (rule_tac bexI[where x=x])
  6536       apply (auto intro!: mult_pos_pos)
  6534       apply (auto)
  6537       done
  6535       done
  6538   next
  6536   next
  6539     case False
  6537     case False
  6540     then have x: "x islimpt s"
  6538     then have x: "x islimpt s"
  6541       using assms(3)[unfolded closure_def] by auto
  6539       using assms(3)[unfolded closure_def] by auto
  6551         apply auto
  6549         apply auto
  6552         done
  6550         done
  6553     next
  6551     next
  6554       case False
  6552       case False
  6555       then have "0 < e * d / (1 - e)" and *: "1 - e > 0"
  6553       then have "0 < e * d / (1 - e)" and *: "1 - e > 0"
  6556         using `e \<le> 1` `e > 0` `d > 0`
  6554         using `e \<le> 1` `e > 0` `d > 0` by auto
  6557         by (auto intro!:mult_pos_pos divide_pos_pos)
       
  6558       then obtain y where "y \<in> s" "y \<noteq> x" "dist y x < e * d / (1 - e)"
  6555       then obtain y where "y \<in> s" "y \<noteq> x" "dist y x < e * d / (1 - e)"
  6559         using x[unfolded islimpt_approachable,THEN spec[where x="e*d / (1 - e)"]] by auto
  6556         using x[unfolded islimpt_approachable,THEN spec[where x="e*d / (1 - e)"]] by auto
  6560       then show ?thesis
  6557       then show ?thesis
  6561         apply (rule_tac x=y in bexI)
  6558         apply (rule_tac x=y in bexI)
  6562         unfolding dist_norm
  6559         unfolding dist_norm