src/HOL/Multivariate_Analysis/Convex_Euclidean_Space.thy
changeset 60303 00c06f1315d0
parent 60176 38b630409aa2
child 60307 75e1aa7a450e
equal deleted inserted replaced
60302:6dcb8aa0966a 60303:00c06f1315d0
   382   unfolding affine_alt by (auto simp add: scaleR_left_distrib [symmetric])
   382   unfolding affine_alt by (auto simp add: scaleR_left_distrib [symmetric])
   383 
   383 
   384 lemma affine_UNIV[intro]: "affine UNIV"
   384 lemma affine_UNIV[intro]: "affine UNIV"
   385   unfolding affine_def by auto
   385   unfolding affine_def by auto
   386 
   386 
   387 lemma affine_Inter: "(\<forall>s\<in>f. affine s) \<Longrightarrow> affine (\<Inter> f)"
   387 lemma affine_Inter[intro]: "(\<forall>s\<in>f. affine s) \<Longrightarrow> affine (\<Inter> f)"
   388   unfolding affine_def by auto
   388   unfolding affine_def by auto
   389 
   389 
   390 lemma affine_Int: "affine s \<Longrightarrow> affine t \<Longrightarrow> affine (s \<inter> t)"
   390 lemma affine_Int[intro]: "affine s \<Longrightarrow> affine t \<Longrightarrow> affine (s \<inter> t)"
   391   unfolding affine_def by auto
   391   unfolding affine_def by auto
   392 
   392 
   393 lemma affine_affine_hull: "affine(affine hull s)"
   393 lemma affine_affine_hull [simp]: "affine(affine hull s)"
   394   unfolding hull_def
   394   unfolding hull_def
   395   using affine_Inter[of "{t. affine t \<and> s \<subseteq> t}"] by auto
   395   using affine_Inter[of "{t. affine t \<and> s \<subseteq> t}"] by auto
   396 
   396 
   397 lemma affine_hull_eq[simp]: "(affine hull s = s) \<longleftrightarrow> affine s"
   397 lemma affine_hull_eq[simp]: "(affine hull s = s) \<longleftrightarrow> affine s"
   398   by (metis affine_affine_hull hull_same)
   398   by (metis affine_affine_hull hull_same)
  2353   by (simp add: affine_dependent_def)
  2353   by (simp add: affine_dependent_def)
  2354 
  2354 
  2355 lemma affine_hull_translation: "affine hull ((\<lambda>x. a + x) `  S) = (\<lambda>x. a + x) ` (affine hull S)"
  2355 lemma affine_hull_translation: "affine hull ((\<lambda>x. a + x) `  S) = (\<lambda>x. a + x) ` (affine hull S)"
  2356 proof -
  2356 proof -
  2357   have "affine ((\<lambda>x. a + x) ` (affine hull S))"
  2357   have "affine ((\<lambda>x. a + x) ` (affine hull S))"
  2358     using affine_translation affine_affine_hull by auto
  2358     using affine_translation affine_affine_hull by blast
  2359   moreover have "(\<lambda>x. a + x) `  S \<subseteq> (\<lambda>x. a + x) ` (affine hull S)"
  2359   moreover have "(\<lambda>x. a + x) `  S \<subseteq> (\<lambda>x. a + x) ` (affine hull S)"
  2360     using hull_subset[of S] by auto
  2360     using hull_subset[of S] by auto
  2361   ultimately have h1: "affine hull ((\<lambda>x. a + x) `  S) \<subseteq> (\<lambda>x. a + x) ` (affine hull S)"
  2361   ultimately have h1: "affine hull ((\<lambda>x. a + x) `  S) \<subseteq> (\<lambda>x. a + x) ` (affine hull S)"
  2362     by (metis hull_minimal)
  2362     by (metis hull_minimal)
  2363   have "affine((\<lambda>x. -a + x) ` (affine hull ((\<lambda>x. a + x) `  S)))"
  2363   have "affine((\<lambda>x. -a + x) ` (affine hull ((\<lambda>x. a + x) `  S)))"
  2364     using affine_translation affine_affine_hull by (auto simp del: uminus_add_conv_diff)
  2364     using affine_translation affine_affine_hull by blast
  2365   moreover have "(\<lambda>x. -a + x) ` (\<lambda>x. a + x) `  S \<subseteq> (\<lambda>x. -a + x) ` (affine hull ((\<lambda>x. a + x) `  S))"
  2365   moreover have "(\<lambda>x. -a + x) ` (\<lambda>x. a + x) `  S \<subseteq> (\<lambda>x. -a + x) ` (affine hull ((\<lambda>x. a + x) `  S))"
  2366     using hull_subset[of "(\<lambda>x. a + x) `  S"] by auto
  2366     using hull_subset[of "(\<lambda>x. a + x) `  S"] by auto
  2367   moreover have "S = (\<lambda>x. -a + x) ` (\<lambda>x. a + x) `  S"
  2367   moreover have "S = (\<lambda>x. -a + x) ` (\<lambda>x. a + x) `  S"
  2368     using translation_assoc[of "-a" a] by auto
  2368     using translation_assoc[of "-a" a] by auto
  2369   ultimately have "(\<lambda>x. -a + x) ` (affine hull ((\<lambda>x. a + x) `  S)) >= (affine hull S)"
  2369   ultimately have "(\<lambda>x. -a + x) ` (affine hull ((\<lambda>x. a + x) `  S)) >= (affine hull S)"
  2931   shows "dim (affine hull S) = dim S"
  2931   shows "dim (affine hull S) = dim S"
  2932 proof -
  2932 proof -
  2933   have "dim (affine hull S) \<ge> dim S"
  2933   have "dim (affine hull S) \<ge> dim S"
  2934     using dim_subset by auto
  2934     using dim_subset by auto
  2935   moreover have "dim (span S) \<ge> dim (affine hull S)"
  2935   moreover have "dim (span S) \<ge> dim (affine hull S)"
  2936     using dim_subset affine_hull_subset_span by auto
  2936     using dim_subset affine_hull_subset_span by blast
  2937   moreover have "dim (span S) = dim S"
  2937   moreover have "dim (span S) = dim S"
  2938     using dim_span by auto
  2938     using dim_span by auto
  2939   ultimately show ?thesis by auto
  2939   ultimately show ?thesis by auto
  2940 qed
  2940 qed
  2941 
  2941 
  3176 
  3176 
  3177 lemma rel_interior_cball:
  3177 lemma rel_interior_cball:
  3178   "rel_interior S = {x \<in> S. \<exists>e. e > 0 \<and> cball x e \<inter> affine hull S \<subseteq> S}"
  3178   "rel_interior S = {x \<in> S. \<exists>e. e > 0 \<and> cball x e \<inter> affine hull S \<subseteq> S}"
  3179   using mem_rel_interior_cball [of _ S] by auto
  3179   using mem_rel_interior_cball [of _ S] by auto
  3180 
  3180 
  3181 lemma rel_interior_empty: "rel_interior {} = {}"
  3181 lemma rel_interior_empty [simp]: "rel_interior {} = {}"
  3182    by (auto simp add: rel_interior_def)
  3182    by (auto simp add: rel_interior_def)
  3183 
  3183 
  3184 lemma affine_hull_sing: "affine hull {a :: 'n::euclidean_space} = {a}"
  3184 lemma affine_hull_sing [simp]: "affine hull {a :: 'n::euclidean_space} = {a}"
  3185   by (metis affine_hull_eq affine_sing)
  3185   by (metis affine_hull_eq affine_sing)
  3186 
  3186 
  3187 lemma rel_interior_sing: "rel_interior {a :: 'n::euclidean_space} = {a}"
  3187 lemma rel_interior_sing [simp]: "rel_interior {a :: 'n::euclidean_space} = {a}"
  3188   unfolding rel_interior_ball affine_hull_sing
  3188   unfolding rel_interior_ball affine_hull_sing
  3189   apply auto
  3189   apply auto
  3190   apply (rule_tac x = "1 :: real" in exI)
  3190   apply (rule_tac x = "1 :: real" in exI)
  3191   apply simp
  3191   apply simp
  3192   done
  3192   done
  3215   have "affine hull S = UNIV"
  3215   have "affine hull S = UNIV"
  3216     using assms affine_hull_univ[of S] by auto
  3216     using assms affine_hull_univ[of S] by auto
  3217   then show ?thesis
  3217   then show ?thesis
  3218     unfolding rel_interior interior_def by auto
  3218     unfolding rel_interior interior_def by auto
  3219 qed
  3219 qed
       
  3220 
       
  3221 lemma rel_interior_interior:
       
  3222   fixes S :: "'n::euclidean_space set"
       
  3223   assumes "affine hull S = UNIV"
       
  3224   shows "rel_interior S = interior S"
       
  3225   using assms unfolding rel_interior interior_def by auto
  3220 
  3226 
  3221 lemma rel_interior_open:
  3227 lemma rel_interior_open:
  3222   fixes S :: "'n::euclidean_space set"
  3228   fixes S :: "'n::euclidean_space set"
  3223   assumes "open S"
  3229   assumes "open S"
  3224   shows "rel_interior S = S"
  3230   shows "rel_interior S = S"
  3692     by auto
  3698     by auto
  3693   show ?thesis
  3699   show ?thesis
  3694     unfolding affine_hull_insert_span_gen span_substd_basis[OF assms,symmetric] * ..
  3700     unfolding affine_hull_insert_span_gen span_substd_basis[OF assms,symmetric] * ..
  3695 qed
  3701 qed
  3696 
  3702 
  3697 lemma affine_hull_convex_hull: "affine hull (convex hull S) = affine hull S"
  3703 lemma affine_hull_convex_hull [simp]: "affine hull (convex hull S) = affine hull S"
  3698   by (metis Int_absorb1 Int_absorb2 convex_hull_subset_affine_hull hull_hull hull_mono hull_subset)
  3704   by (metis Int_absorb1 Int_absorb2 convex_hull_subset_affine_hull hull_hull hull_mono hull_subset)
  3699 
  3705 
  3700 
  3706 
  3701 subsection {* Openness and compactness are preserved by convex hull operation. *}
  3707 subsection {* Openness and compactness are preserved by convex hull operation. *}
  3702 
  3708 
  8038     and T :: "'m::euclidean_space set"
  8044     and T :: "'m::euclidean_space set"
  8039   assumes "convex S"
  8045   assumes "convex S"
  8040     and "convex T"
  8046     and "convex T"
  8041   shows "rel_interior (S \<times> T) = rel_interior S \<times> rel_interior T"
  8047   shows "rel_interior (S \<times> T) = rel_interior S \<times> rel_interior T"
  8042 proof -
  8048 proof -
  8043   {
  8049   { assume "S = {}"
  8044     assume "S = {}"
       
  8045     then have ?thesis
  8050     then have ?thesis
  8046       apply auto
  8051       by auto
  8047       using rel_interior_empty
       
  8048       apply auto
       
  8049       done
       
  8050   }
  8052   }
  8051   moreover
  8053   moreover
  8052   {
  8054   { assume "T = {}"
  8053     assume "T = {}"
       
  8054     then have ?thesis
  8055     then have ?thesis
  8055       apply auto
  8056        by auto
  8056       using rel_interior_empty
       
  8057       apply auto
       
  8058       done
       
  8059   }
  8057   }
  8060   moreover
  8058   moreover
  8061   {
  8059   {
  8062     assume "S \<noteq> {}" "T \<noteq> {}"
  8060     assume "S \<noteq> {}" "T \<noteq> {}"
  8063     then have ri: "rel_interior S \<noteq> {}" "rel_interior T \<noteq> {}"
  8061     then have ri: "rel_interior S \<noteq> {}" "rel_interior T \<noteq> {}"