src/HOL/Analysis/Polytope.thy
changeset 67399 eab6ce8368fa
parent 66652 93edcbc88536
child 67613 ce654b0e6d69
equal deleted inserted replaced
67398:5eb932e604a2 67399:eab6ce8368fa
    16 
    16 
    17 lemma face_ofD: "\<lbrakk>T face_of S; x \<in> open_segment a b; a \<in> S; b \<in> S; x \<in> T\<rbrakk> \<Longrightarrow> a \<in> T \<and> b \<in> T"
    17 lemma face_ofD: "\<lbrakk>T face_of S; x \<in> open_segment a b; a \<in> S; b \<in> S; x \<in> T\<rbrakk> \<Longrightarrow> a \<in> T \<and> b \<in> T"
    18   unfolding face_of_def by blast
    18   unfolding face_of_def by blast
    19 
    19 
    20 lemma face_of_translation_eq [simp]:
    20 lemma face_of_translation_eq [simp]:
    21     "(op + a ` T face_of op + a ` S) \<longleftrightarrow> T face_of S"
    21     "((+) a ` T face_of (+) a ` S) \<longleftrightarrow> T face_of S"
    22 proof -
    22 proof -
    23   have *: "\<And>a T S. T face_of S \<Longrightarrow> (op + a ` T face_of op + a ` S)"
    23   have *: "\<And>a T S. T face_of S \<Longrightarrow> ((+) a ` T face_of (+) a ` S)"
    24     apply (simp add: face_of_def Ball_def, clarify)
    24     apply (simp add: face_of_def Ball_def, clarify)
    25     apply (drule open_segment_translation_eq [THEN iffD1])
    25     apply (drule open_segment_translation_eq [THEN iffD1])
    26     using inj_image_mem_iff inj_add_left apply metis
    26     using inj_image_mem_iff inj_add_left apply metis
    27     done
    27     done
    28   show ?thesis
    28   show ?thesis
  1123     assume unot: "u \<notin> closure(convex hull {x. x extreme_point_of S})"
  1123     assume unot: "u \<notin> closure(convex hull {x. x extreme_point_of S})"
  1124     then obtain a b where "a \<bullet> u < b"
  1124     then obtain a b where "a \<bullet> u < b"
  1125           and ab: "\<And>x. x \<in> closure(convex hull {x. x extreme_point_of S}) \<Longrightarrow> b < a \<bullet> x"
  1125           and ab: "\<And>x. x \<in> closure(convex hull {x. x extreme_point_of S}) \<Longrightarrow> b < a \<bullet> x"
  1126       using separating_hyperplane_closed_point [of "closure(convex hull {x. x extreme_point_of S})"]
  1126       using separating_hyperplane_closed_point [of "closure(convex hull {x. x extreme_point_of S})"]
  1127       by blast
  1127       by blast
  1128     have "continuous_on S (op \<bullet> a)"
  1128     have "continuous_on S ((\<bullet>) a)"
  1129       by (rule continuous_intros)+
  1129       by (rule continuous_intros)+
  1130     then obtain m where "m \<in> S" and m: "\<And>y. y \<in> S \<Longrightarrow> a \<bullet> m \<le> a \<bullet> y"
  1130     then obtain m where "m \<in> S" and m: "\<And>y. y \<in> S \<Longrightarrow> a \<bullet> m \<le> a \<bullet> y"
  1131       using continuous_attains_inf [of S "\<lambda>x. a \<bullet> x"] \<open>compact S\<close> \<open>u \<in> S\<close>
  1131       using continuous_attains_inf [of S "\<lambda>x. a \<bullet> x"] \<open>compact S\<close> \<open>u \<in> S\<close>
  1132       by auto
  1132       by auto
  1133     define T where "T = S \<inter> {x. a \<bullet> x = a \<bullet> m}"
  1133     define T where "T = S \<inter> {x. a \<bullet> x = a \<bullet> m}"
  1204     shows "S = convex hull {x. x extreme_point_of S}"
  1204     shows "S = convex hull {x. x extreme_point_of S}"
  1205 proof
  1205 proof
  1206   show "S \<subseteq> convex hull {x. x extreme_point_of S}"
  1206   show "S \<subseteq> convex hull {x. x extreme_point_of S}"
  1207   proof
  1207   proof
  1208     fix a assume [simp]: "a \<in> S"
  1208     fix a assume [simp]: "a \<in> S"
  1209     have 1: "compact (op + (- a) ` S)"
  1209     have 1: "compact ((+) (- a) ` S)"
  1210       by (simp add: \<open>compact S\<close> compact_translation)
  1210       by (simp add: \<open>compact S\<close> compact_translation)
  1211     have 2: "convex (op + (- a) ` S)"
  1211     have 2: "convex ((+) (- a) ` S)"
  1212       by (simp add: \<open>convex S\<close> convex_translation)
  1212       by (simp add: \<open>convex S\<close> convex_translation)
  1213     show a_invex: "a \<in> convex hull {x. x extreme_point_of S}"
  1213     show a_invex: "a \<in> convex hull {x. x extreme_point_of S}"
  1214       using Krein_Milman_Minkowski_aux [OF refl 1 2]
  1214       using Krein_Milman_Minkowski_aux [OF refl 1 2]
  1215             convex_hull_translation [of "-a"]
  1215             convex_hull_translation [of "-a"]
  1216       by (auto simp: extreme_points_of_translation translation_assoc)
  1216       by (auto simp: extreme_points_of_translation translation_assoc)
  1628   assumes "polytope S"
  1628   assumes "polytope S"
  1629   shows "finite {F. F face_of S}"
  1629   shows "finite {F. F face_of S}"
  1630 proof -
  1630 proof -
  1631   obtain v where "finite v" "S = convex hull v"
  1631   obtain v where "finite v" "S = convex hull v"
  1632     using assms polytope_def by auto
  1632     using assms polytope_def by auto
  1633   have "finite (op hull convex ` {T. T \<subseteq> v})"
  1633   have "finite ((hull) convex ` {T. T \<subseteq> v})"
  1634     by (simp add: \<open>finite v\<close>)
  1634     by (simp add: \<open>finite v\<close>)
  1635   moreover have "{F. F face_of S} \<subseteq> (op hull convex ` {T. T \<subseteq> v})"
  1635   moreover have "{F. F face_of S} \<subseteq> ((hull) convex ` {T. T \<subseteq> v})"
  1636     by (metis (no_types, lifting) \<open>finite v\<close> \<open>S = convex hull v\<close> face_of_convex_hull_subset finite_imp_compact image_eqI mem_Collect_eq subsetI)
  1636     by (metis (no_types, lifting) \<open>finite v\<close> \<open>S = convex hull v\<close> face_of_convex_hull_subset finite_imp_compact image_eqI mem_Collect_eq subsetI)
  1637   ultimately show ?thesis
  1637   ultimately show ?thesis
  1638     by (blast intro: finite_subset)
  1638     by (blast intro: finite_subset)
  1639 qed
  1639 qed
  1640 
  1640 
  2501     then show ?thesis
  2501     then show ?thesis
  2502     proof cases
  2502     proof cases
  2503       case 1 then show ?thesis .
  2503       case 1 then show ?thesis .
  2504     next
  2504     next
  2505       case 2
  2505       case 2
  2506       have "Collect (op \<in> x) \<notin> Collect (op \<in> (\<Union>{A. A facet_of S}))"
  2506       have "Collect ((\<in>) x) \<notin> Collect ((\<in>) (\<Union>{A. A facet_of S}))"
  2507         using xnot by fastforce
  2507         using xnot by fastforce
  2508       then have "F \<notin> Collect (op \<in> h)"
  2508       then have "F \<notin> Collect ((\<in>) h)"
  2509         using 2 \<open>x \<in> S\<close> facet by blast
  2509         using 2 \<open>x \<in> S\<close> facet by blast
  2510       with \<open>h \<in> F\<close> have "\<Inter>F \<subseteq> S \<inter> {x. a h \<bullet> x = b h}" by blast
  2510       with \<open>h \<in> F\<close> have "\<Inter>F \<subseteq> S \<inter> {x. a h \<bullet> x = b h}" by blast
  2511       with 2 that \<open>x \<in> \<Inter>F\<close> show ?thesis
  2511       with 2 that \<open>x \<in> \<Inter>F\<close> show ?thesis
  2512         apply simp
  2512         apply simp
  2513         apply (drule_tac x="\<Inter>F" in spec)
  2513         apply (drule_tac x="\<Inter>F" in spec)
  2659     apply safe
  2659     apply safe
  2660     apply (rule_tac x="inv h ` x" in image_eqI)
  2660     apply (rule_tac x="inv h ` x" in image_eqI)
  2661     apply (auto simp: \<open>bij h\<close> bij_is_surj image_f_inv_f)
  2661     apply (auto simp: \<open>bij h\<close> bij_is_surj image_f_inv_f)
  2662     done
  2662     done
  2663   have "inj h" using bij_is_inj assms by blast
  2663   have "inj h" using bij_is_inj assms by blast
  2664   then have injim: "inj_on (op ` h) A" for A
  2664   then have injim: "inj_on ((`) h) A" for A
  2665     by (simp add: inj_on_def inj_image_eq_iff)
  2665     by (simp add: inj_on_def inj_image_eq_iff)
  2666   show ?thesis
  2666   show ?thesis
  2667     using \<open>linear h\<close> \<open>inj h\<close>
  2667     using \<open>linear h\<close> \<open>inj h\<close>
  2668     apply (simp add: polyhedron_eq_finite_faces closed_injective_linear_image_eq)
  2668     apply (simp add: polyhedron_eq_finite_faces closed_injective_linear_image_eq)
  2669     apply (simp add: * face_of_linear_image [of h _ S, symmetric] finite_image_iff injim)
  2669     apply (simp add: * face_of_linear_image [of h _ S, symmetric] finite_image_iff injim)