author paulson Tue, 06 Oct 2020 20:34:29 +0100 changeset 72385 4a2c0eb482aa parent 72383 698b58513fd1 child 72386 6846b6df9a5f
Simplified some proofs
```--- a/src/HOL/Analysis/Convex.thy	Mon Oct 05 22:53:40 2020 +0100
+++ b/src/HOL/Analysis/Convex.thy	Tue Oct 06 20:34:29 2020 +0100
@@ -59,10 +59,8 @@
lemma mem_convex_alt:
assumes "convex S" "x \<in> S" "y \<in> S" "u \<ge> 0" "v \<ge> 0" "u + v > 0"
shows "((u/(u+v)) *\<^sub>R x + (v/(u+v)) *\<^sub>R y) \<in> S"
-  apply (rule convexD)
using assms
-  done

lemma convex_empty[intro,simp]: "convex {}"
unfolding convex_def by simp
@@ -193,72 +191,72 @@

lemma convex_sum:
fixes C :: "'a::real_vector set"
-  assumes "finite s"
+  assumes "finite S"
and "convex C"
-    and "(\<Sum> i \<in> s. a i) = 1"
-  assumes "\<And>i. i \<in> s \<Longrightarrow> a i \<ge> 0"
-    and "\<And>i. i \<in> s \<Longrightarrow> y i \<in> C"
-  shows "(\<Sum> j \<in> s. a j *\<^sub>R y j) \<in> C"
+    and "(\<Sum> i \<in> S. a i) = 1"
+  assumes "\<And>i. i \<in> S \<Longrightarrow> a i \<ge> 0"
+    and "\<And>i. i \<in> S \<Longrightarrow> y i \<in> C"
+  shows "(\<Sum> j \<in> S. a j *\<^sub>R y j) \<in> C"
using assms(1,3,4,5)
proof (induct arbitrary: a set: finite)
case empty
then show ?case by simp
next
-  case (insert i s) note IH = this(3)
-  have "a i + sum a s = 1"
+  case (insert i S) note IH = this(3)
+  have "a i + sum a S = 1"
and "0 \<le> a i"
-    and "\<forall>j\<in>s. 0 \<le> a j"
+    and "\<forall>j\<in>S. 0 \<le> a j"
and "y i \<in> C"
-    and "\<forall>j\<in>s. y j \<in> C"
+    and "\<forall>j\<in>S. y j \<in> C"
using insert.hyps(1,2) insert.prems by simp_all
-  then have "0 \<le> sum a s"
+  then have "0 \<le> sum a S"
-  have "a i *\<^sub>R y i + (\<Sum>j\<in>s. a j *\<^sub>R y j) \<in> C"
-  proof (cases "sum a s = 0")
+  have "a i *\<^sub>R y i + (\<Sum>j\<in>S. a j *\<^sub>R y j) \<in> C"
+  proof (cases "sum a S = 0")
case True
-    with \<open>a i + sum a s = 1\<close> have "a i = 1"
+    with \<open>a i + sum a S = 1\<close> have "a i = 1"
by simp
-    from sum_nonneg_0 [OF \<open>finite s\<close> _ True] \<open>\<forall>j\<in>s. 0 \<le> a j\<close> have "\<forall>j\<in>s. a j = 0"
+    from sum_nonneg_0 [OF \<open>finite S\<close> _ True] \<open>\<forall>j\<in>S. 0 \<le> a j\<close> have "\<forall>j\<in>S. a j = 0"
by simp
-    show ?thesis using \<open>a i = 1\<close> and \<open>\<forall>j\<in>s. a j = 0\<close> and \<open>y i \<in> C\<close>
+    show ?thesis using \<open>a i = 1\<close> and \<open>\<forall>j\<in>S. a j = 0\<close> and \<open>y i \<in> C\<close>
by simp
next
case False
-    with \<open>0 \<le> sum a s\<close> have "0 < sum a s"
+    with \<open>0 \<le> sum a S\<close> have "0 < sum a S"
by simp
-    then have "(\<Sum>j\<in>s. (a j / sum a s) *\<^sub>R y j) \<in> C"
-      using \<open>\<forall>j\<in>s. 0 \<le> a j\<close> and \<open>\<forall>j\<in>s. y j \<in> C\<close>
+    then have "(\<Sum>j\<in>S. (a j / sum a S) *\<^sub>R y j) \<in> C"
+      using \<open>\<forall>j\<in>S. 0 \<le> a j\<close> and \<open>\<forall>j\<in>S. y j \<in> C\<close>
by (simp add: IH sum_divide_distrib [symmetric])
from \<open>convex C\<close> and \<open>y i \<in> C\<close> and this and \<open>0 \<le> a i\<close>
-      and \<open>0 \<le> sum a s\<close> and \<open>a i + sum a s = 1\<close>
-    have "a i *\<^sub>R y i + sum a s *\<^sub>R (\<Sum>j\<in>s. (a j / sum a s) *\<^sub>R y j) \<in> C"
+      and \<open>0 \<le> sum a S\<close> and \<open>a i + sum a S = 1\<close>
+    have "a i *\<^sub>R y i + sum a S *\<^sub>R (\<Sum>j\<in>S. (a j / sum a S) *\<^sub>R y j) \<in> C"
by (rule convexD)
then show ?thesis
qed
-  then show ?case using \<open>finite s\<close> and \<open>i \<notin> s\<close>
+  then show ?case using \<open>finite S\<close> and \<open>i \<notin> S\<close>
by simp
qed

lemma convex:
-  "convex s \<longleftrightarrow> (\<forall>(k::nat) u x. (\<forall>i. 1\<le>i \<and> i\<le>k \<longrightarrow> 0 \<le> u i \<and> x i \<in>s) \<and> (sum u {1..k} = 1)
-      \<longrightarrow> sum (\<lambda>i. u i *\<^sub>R x i) {1..k} \<in> s)"
+  "convex S \<longleftrightarrow> (\<forall>(k::nat) u x. (\<forall>i. 1\<le>i \<and> i\<le>k \<longrightarrow> 0 \<le> u i \<and> x i \<in>S) \<and> (sum u {1..k} = 1)
+      \<longrightarrow> sum (\<lambda>i. u i *\<^sub>R x i) {1..k} \<in> S)"
proof safe
fix k :: nat
fix u :: "nat \<Rightarrow> real"
fix x
-  assume "convex s"
-    "\<forall>i. 1 \<le> i \<and> i \<le> k \<longrightarrow> 0 \<le> u i \<and> x i \<in> s"
+  assume "convex S"
+    "\<forall>i. 1 \<le> i \<and> i \<le> k \<longrightarrow> 0 \<le> u i \<and> x i \<in> S"
"sum u {1..k} = 1"
-  with convex_sum[of "{1 .. k}" s] show "(\<Sum>j\<in>{1 .. k}. u j *\<^sub>R x j) \<in> s"
+  with convex_sum[of "{1 .. k}" S] show "(\<Sum>j\<in>{1 .. k}. u j *\<^sub>R x j) \<in> S"
by auto
next
-  assume *: "\<forall>k u x. (\<forall> i :: nat. 1 \<le> i \<and> i \<le> k \<longrightarrow> 0 \<le> u i \<and> x i \<in> s) \<and> sum u {1..k} = 1
-    \<longrightarrow> (\<Sum>i = 1..k. u i *\<^sub>R (x i :: 'a)) \<in> s"
+  assume *: "\<forall>k u x. (\<forall> i :: nat. 1 \<le> i \<and> i \<le> k \<longrightarrow> 0 \<le> u i \<and> x i \<in> S) \<and> sum u {1..k} = 1
+    \<longrightarrow> (\<Sum>i = 1..k. u i *\<^sub>R (x i :: 'a)) \<in> S"
{
fix \<mu> :: real
fix x y :: 'a
-    assume xy: "x \<in> s" "y \<in> s"
+    assume xy: "x \<in> S" "y \<in> S"
assume mu: "\<mu> \<ge> 0" "\<mu> \<le> 1"
let ?u = "\<lambda>i. if (i :: nat) = 1 then \<mu> else 1 - \<mu>"
let ?x = "\<lambda>i. if (i :: nat) = 1 then x else y"
@@ -269,43 +267,43 @@
then have "sum ?u {1 .. 2} = 1"
using sum.If_cases[of "{(1 :: nat) .. 2}" "\<lambda> x. x = 1" "\<lambda> x. \<mu>" "\<lambda> x. 1 - \<mu>"]
by auto
-    with *[rule_format, of "2" ?u ?x] have s: "(\<Sum>j \<in> {1..2}. ?u j *\<^sub>R ?x j) \<in> s"
+    with *[rule_format, of "2" ?u ?x] have S: "(\<Sum>j \<in> {1..2}. ?u j *\<^sub>R ?x j) \<in> S"
using mu xy by auto
have grarr: "(\<Sum>j \<in> {Suc (Suc 0)..2}. ?u j *\<^sub>R ?x j) = (1 - \<mu>) *\<^sub>R y"
using sum.atLeast_Suc_atMost[of "Suc (Suc 0)" 2 "\<lambda> j. (1 - \<mu>) *\<^sub>R y"] by auto
from sum.atLeast_Suc_atMost[of "Suc 0" 2 "\<lambda> j. ?u j *\<^sub>R ?x j", simplified this]
have "(\<Sum>j \<in> {1..2}. ?u j *\<^sub>R ?x j) = \<mu> *\<^sub>R x + (1 - \<mu>) *\<^sub>R y"
by auto
-    then have "(1 - \<mu>) *\<^sub>R y + \<mu> *\<^sub>R x \<in> s"
-      using s by (auto simp: add.commute)
+    then have "(1 - \<mu>) *\<^sub>R y + \<mu> *\<^sub>R x \<in> S"
+      using S by (auto simp: add.commute)
}
-  then show "convex s"
+  then show "convex S"
unfolding convex_alt by auto
qed

lemma convex_explicit:
-  fixes s :: "'a::real_vector set"
-  shows "convex s \<longleftrightarrow>
-    (\<forall>t u. finite t \<and> t \<subseteq> s \<and> (\<forall>x\<in>t. 0 \<le> u x) \<and> sum u t = 1 \<longrightarrow> sum (\<lambda>x. u x *\<^sub>R x) t \<in> s)"
+  fixes S :: "'a::real_vector set"
+  shows "convex S \<longleftrightarrow>
+    (\<forall>t u. finite t \<and> t \<subseteq> S \<and> (\<forall>x\<in>t. 0 \<le> u x) \<and> sum u t = 1 \<longrightarrow> sum (\<lambda>x. u x *\<^sub>R x) t \<in> S)"
proof safe
fix t
fix u :: "'a \<Rightarrow> real"
-  assume "convex s"
+  assume "convex S"
and "finite t"
-    and "t \<subseteq> s" "\<forall>x\<in>t. 0 \<le> u x" "sum u t = 1"
-  then show "(\<Sum>x\<in>t. u x *\<^sub>R x) \<in> s"
-    using convex_sum[of t s u "\<lambda> x. x"] by auto
+    and "t \<subseteq> S" "\<forall>x\<in>t. 0 \<le> u x" "sum u t = 1"
+  then show "(\<Sum>x\<in>t. u x *\<^sub>R x) \<in> S"
+    using convex_sum[of t S u "\<lambda> x. x"] by auto
next
-  assume *: "\<forall>t. \<forall> u. finite t \<and> t \<subseteq> s \<and> (\<forall>x\<in>t. 0 \<le> u x) \<and>
-    sum u t = 1 \<longrightarrow> (\<Sum>x\<in>t. u x *\<^sub>R x) \<in> s"
-  show "convex s"
+  assume *: "\<forall>t. \<forall> u. finite t \<and> t \<subseteq> S \<and> (\<forall>x\<in>t. 0 \<le> u x) \<and>
+    sum u t = 1 \<longrightarrow> (\<Sum>x\<in>t. u x *\<^sub>R x) \<in> S"
+  show "convex S"
unfolding convex_alt
proof safe
fix x y
fix \<mu> :: real
-    assume **: "x \<in> s" "y \<in> s" "0 \<le> \<mu>" "\<mu> \<le> 1"
-    show "(1 - \<mu>) *\<^sub>R x + \<mu> *\<^sub>R y \<in> s"
+    assume **: "x \<in> S" "y \<in> S" "0 \<le> \<mu>" "\<mu> \<le> 1"
+    show "(1 - \<mu>) *\<^sub>R x + \<mu> *\<^sub>R y \<in> S"
proof (cases "x = y")
case False
then show ?thesis
@@ -321,30 +319,30 @@
qed

lemma convex_finite:
-  assumes "finite s"
-  shows "convex s \<longleftrightarrow> (\<forall>u. (\<forall>x\<in>s. 0 \<le> u x) \<and> sum u s = 1 \<longrightarrow> sum (\<lambda>x. u x *\<^sub>R x) s \<in> s)"
-  unfolding convex_explicit
-  apply safe
-  subgoal for u by (erule allE [where x=s], erule allE [where x=u]) auto
-  subgoal for t u
-  proof -
-    have if_distrib_arg: "\<And>P f g x. (if P then f else g) x = (if P then f x else g x)"
+  assumes "finite S"
+  shows "convex S \<longleftrightarrow> (\<forall>u. (\<forall>x\<in>S. 0 \<le> u x) \<and> sum u S = 1 \<longrightarrow> sum (\<lambda>x. u x *\<^sub>R x) S \<in> S)"
+       (is "?lhs = ?rhs")
+proof
+  { have if_distrib_arg: "\<And>P f g x. (if P then f else g) x = (if P then f x else g x)"
by simp
-    assume sum: "\<forall>u. (\<forall>x\<in>s. 0 \<le> u x) \<and> sum u s = 1 \<longrightarrow> (\<Sum>x\<in>s. u x *\<^sub>R x) \<in> s"
-    assume *: "\<forall>x\<in>t. 0 \<le> u x" "sum u t = 1"
-    assume "t \<subseteq> s"
-    then have "s \<inter> t = t" by auto
-    with sum[THEN spec[where x="\<lambda>x. if x\<in>t then u x else 0"]] * show "(\<Sum>x\<in>t. u x *\<^sub>R x) \<in> s"
-      by (auto simp: assms sum.If_cases if_distrib if_distrib_arg)
-  qed
-  done
+    fix T :: "'a set" and u :: "'a \<Rightarrow> real"
+    assume sum: "\<forall>u. (\<forall>x\<in>S. 0 \<le> u x) \<and> sum u S = 1 \<longrightarrow> (\<Sum>x\<in>S. u x *\<^sub>R x) \<in> S"
+    assume *: "\<forall>x\<in>T. 0 \<le> u x" "sum u T = 1"
+    assume "T \<subseteq> S"
+    then have "S \<inter> T = T" by auto
+    with sum[THEN spec[where x="\<lambda>x. if x\<in>T then u x else 0"]] * have "(\<Sum>x\<in>T. u x *\<^sub>R x) \<in> S"
+      by (auto simp: assms sum.If_cases if_distrib if_distrib_arg) }
+  moreover assume ?rhs
+  ultimately show ?lhs
+    unfolding convex_explicit by auto
+qed (auto simp: convex_explicit assms)

subsection \<open>Convex Functions on a Set\<close>

definition\<^marker>\<open>tag important\<close> convex_on :: "'a::real_vector set \<Rightarrow> ('a \<Rightarrow> real) \<Rightarrow> bool"
-  where "convex_on s f \<longleftrightarrow>
-    (\<forall>x\<in>s. \<forall>y\<in>s. \<forall>u\<ge>0. \<forall>v\<ge>0. u + v = 1 \<longrightarrow> f (u *\<^sub>R x + v *\<^sub>R y) \<le> u * f x + v * f y)"
+  where "convex_on S f \<longleftrightarrow>
+    (\<forall>x\<in>S. \<forall>y\<in>S. \<forall>u\<ge>0. \<forall>v\<ge>0. u + v = 1 \<longrightarrow> f (u *\<^sub>R x + v *\<^sub>R y) \<le> u * f x + v * f y)"

lemma convex_onI [intro?]:
assumes "\<And>t x y. t > 0 \<Longrightarrow> t < 1 \<Longrightarrow> x \<in> A \<Longrightarrow> y \<in> A \<Longrightarrow>
@@ -388,17 +386,17 @@
f ((1 - t) *\<^sub>R x + t *\<^sub>R y) \<le> (1 - t) * f x + t * f y"
using assms(2) by (intro convex_onD [OF assms(1)]) simp_all

-lemma convex_on_subset: "convex_on t f \<Longrightarrow> s \<subseteq> t \<Longrightarrow> convex_on s f"
+lemma convex_on_subset: "convex_on t f \<Longrightarrow> S \<subseteq> t \<Longrightarrow> convex_on S f"
unfolding convex_on_def by auto

-  assumes "convex_on s f"
-    and "convex_on s g"
-  shows "convex_on s (\<lambda>x. f x + g x)"
+  assumes "convex_on S f"
+    and "convex_on S g"
+  shows "convex_on S (\<lambda>x. f x + g x)"
proof -
{
fix x y
-    assume "x \<in> s" "y \<in> s"
+    assume "x \<in> S" "y \<in> S"
moreover
fix u v :: real
assume "0 \<le> u" "0 \<le> v" "u + v = 1"
@@ -415,8 +413,8 @@
lemma convex_on_cmul [intro]:
fixes c :: real
assumes "0 \<le> c"
-    and "convex_on s f"
-  shows "convex_on s (\<lambda>x. c * f x)"
+    and "convex_on S f"
+  shows "convex_on S (\<lambda>x. c * f x)"
proof -
have *: "u * (c * fx) + v * (c * fy) = c * (u * fx + v * fy)"
for u c fx v fy :: real
@@ -426,9 +424,9 @@
qed

lemma convex_lower:
-  assumes "convex_on s f"
-    and "x \<in> s"
-    and "y \<in> s"
+  assumes "convex_on S f"
+    and "x \<in> S"
+    and "y \<in> S"
and "0 \<le> u"
and "0 \<le> v"
and "u + v = 1"
@@ -444,11 +442,11 @@
qed

lemma convex_on_dist [intro]:
-  fixes s :: "'a::real_normed_vector set"
-  shows "convex_on s (\<lambda>x. dist a x)"
+  fixes S :: "'a::real_normed_vector set"
+  shows "convex_on S (\<lambda>x. dist a x)"
proof (auto simp: convex_on_def dist_norm)
fix x y
-  assume "x \<in> s" "y \<in> s"
+  assume "x \<in> S" "y \<in> S"
fix u v :: real
assume "0 \<le> u"
assume "0 \<le> v"
@@ -467,32 +465,32 @@

lemma convex_linear_image:
assumes "linear f"
-    and "convex s"
-  shows "convex (f ` s)"
+    and "convex S"
+  shows "convex (f ` S)"
proof -
interpret f: linear f by fact
-  from \<open>convex s\<close> show "convex (f ` s)"
+  from \<open>convex S\<close> show "convex (f ` S)"
qed

lemma convex_linear_vimage:
assumes "linear f"
-    and "convex s"
-  shows "convex (f -` s)"
+    and "convex S"
+  shows "convex (f -` S)"
proof -
interpret f: linear f by fact
-  from \<open>convex s\<close> show "convex (f -` s)"
+  from \<open>convex S\<close> show "convex (f -` S)"
qed

lemma convex_scaling:
-  assumes "convex s"
-  shows "convex ((\<lambda>x. c *\<^sub>R x) ` s)"
+  assumes "convex S"
+  shows "convex ((\<lambda>x. c *\<^sub>R x) ` S)"
proof -
have "linear (\<lambda>x. c *\<^sub>R x)"
then show ?thesis
-    using \<open>convex s\<close> by (rule convex_linear_image)
+    using \<open>convex S\<close> by (rule convex_linear_image)
qed

lemma convex_scaled:
@@ -656,7 +654,6 @@

lemma convex_on_alt:
fixes C :: "'a::real_vector set"
-  assumes "convex C"
shows "convex_on C f \<longleftrightarrow>
(\<forall>x \<in> C. \<forall> y \<in> C. \<forall> \<mu> :: real. \<mu> \<ge> 0 \<and> \<mu> \<le> 1 \<longrightarrow>
f (\<mu> *\<^sub>R x + (1 - \<mu>) *\<^sub>R y) \<le> \<mu> * f x + (1 - \<mu>) * f y)"
@@ -720,7 +717,7 @@
assumes "convex C"
and leq: "\<And>x y. x \<in> C \<Longrightarrow> y \<in> C \<Longrightarrow> f' x * (y - x) \<le> f y - f x"
shows "convex_on C f"
-  unfolding convex_on_alt[OF assms(1)]
+  unfolding convex_on_alt
using assms
proof safe
fix x y \<mu> :: real
@@ -737,7 +734,7 @@
then have "\<mu> * f x + (1 - \<mu>) * f y - f ?x \<ge> 0"
by (auto simp: field_simps)
then show "f (\<mu> *\<^sub>R x + (1 - \<mu>) *\<^sub>R y) \<le> \<mu> * f x + (1 - \<mu>) * f y"
-    using convex_on_alt by auto
+    by auto
qed

lemma atMostAtLeast_subset_convex:
@@ -1081,15 +1078,11 @@

subsubsection \<open>Conic hull\<close>

-lemma cone_cone_hull: "cone (cone hull s)"
+lemma cone_cone_hull: "cone (cone hull S)"
unfolding hull_def by auto

-lemma cone_hull_eq: "cone hull s = s \<longleftrightarrow> cone s"
-  apply (rule hull_eq)
-  using cone_Inter
-  unfolding subset_eq
-  apply auto
-  done
+lemma cone_hull_eq: "cone hull S = S \<longleftrightarrow> cone S"
+  by (metis cone_cone_hull hull_same)

lemma mem_cone:
assumes "cone S" "x \<in> S" "c \<ge> 0"
@@ -1099,15 +1092,7 @@
lemma cone_contains_0:
assumes "cone S"
shows "S \<noteq> {} \<longleftrightarrow> 0 \<in> S"
-proof -
-  {
-    assume "S \<noteq> {}"
-    then obtain a where "a \<in> S" by auto
-    then have "0 \<in> S"
-      using assms mem_cone[of S a 0] by auto
-  }
-  then show ?thesis by auto
-qed
+  using assms mem_cone by fastforce

lemma cone_0: "cone {0}"
unfolding cone_def by auto
@@ -1138,8 +1123,7 @@
fix x
assume "x \<in> ((*\<^sub>R) c) ` S"
then have "x \<in> S"
-          using \<open>cone S\<close> \<open>c > 0\<close>
-          unfolding cone_def image_def \<open>c > 0\<close> by auto
+          using \<open>0 < c\<close> \<open>cone S\<close> mem_cone by fastforce
}
ultimately have "((*\<^sub>R) c) ` S = S" by blast
}
@@ -1202,9 +1186,7 @@
fix x
assume "x \<in> S"
then have "1 *\<^sub>R x \<in> ?rhs"
-      apply auto
-      apply (rule_tac x = 1 in exI, auto)
-      done
+      using zero_le_one by blast
then have "x \<in> ?rhs" by auto
}
then have "S \<subseteq> ?rhs" by auto
@@ -1477,7 +1459,7 @@
else {(1 - u) *\<^sub>R a + u *\<^sub>R x |x u. 0 \<le> u \<and> u \<le> 1 \<and> x \<in> convex hull S})"
apply (auto simp: convex_hull_insert)
using diff_eq_eq apply fastforce
+  using diff_add_cancel diff_ge_0_iff_ge by blast

subsubsection\<^marker>\<open>tag unimportant\<close> \<open>Explicit expression for convex hull\<close>

@@ -1580,13 +1562,9 @@
{
fix j
assume "j\<in>{1..k}"
-      then have "y j \<in> p" "0 \<le> sum u {i. Suc 0 \<le> i \<and> i \<le> k \<and> y i = y j}"
+      then have "y j \<in> p \<and> 0 \<le> sum u {i. Suc 0 \<le> i \<and> i \<le> k \<and> y i = y j}"
using obt(1)[THEN bspec[where x=j]] and obt(2)
-        apply simp
-        apply (rule sum_nonneg)
-        using obt(1)
-        apply auto
-        done
+        by (metis (no_types, lifting) One_nat_def atLeastAtMost_iff mem_Collect_eq obt(1) sum_nonneg)
}
moreover
have "(\<Sum>v\<in>y ` {1..k}. sum u {i \<in> {1..k}. y i = v}) = 1"
@@ -1611,7 +1589,6 @@

obtain f where f: "inj_on f {1..card S}" "f ` {1..card S} = S"
using ex_bij_betw_nat_finite_1[OF obt(1)] unfolding bij_betw_def by auto
-
{
fix i :: nat
assume "i\<in>{1..card S}"
@@ -1627,9 +1604,7 @@
using f using image_iff[of y f "{1..card S}"]
by auto
then have "{x. Suc 0 \<le> x \<and> x \<le> card S \<and> f x = y} = {i}"
-        apply auto
-        using f(1)[unfolded inj_on_def]
-        by (metis One_nat_def atLeastAtMost_iff)
+        using f(1) inj_onD by fastforce
then have "card {x. Suc 0 \<le> x \<and> x \<le> card S \<and> f x = y} = 1" by auto
then have "(\<Sum>x\<in>{x \<in> {1..card S}. f x = y}. u (f x)) = u y"
"(\<Sum>x\<in>{x \<in> {1..card S}. f x = y}. u (f x) *\<^sub>R f x) = u y *\<^sub>R y"
@@ -1667,71 +1642,65 @@
"(\<exists>u. (\<forall>x\<in>insert a S. 0 \<le> u x) \<and> sum u (insert a S) = w \<and> sum (\<lambda>x. u x *\<^sub>R x) (insert a S) = y)
\<longleftrightarrow> (\<exists>v\<ge>0. \<exists>u. (\<forall>x\<in>S. 0 \<le> u x) \<and> sum u S = w - v \<and> sum (\<lambda>x. u x *\<^sub>R x) S = y - v *\<^sub>R a)"
(is "?lhs = ?rhs")
-proof (rule, case_tac[!] "a\<in>S")
-  assume "a \<in> S"
-  then have *: "insert a S = S" by auto
-  assume ?lhs
-  then show ?rhs
-    unfolding *  by (rule_tac x=0 in exI, auto)
-next
-  assume ?lhs
-  then obtain u where
-      u: "\<forall>x\<in>insert a S. 0 \<le> u x" "sum u (insert a S) = w" "(\<Sum>x\<in>insert a S. u x *\<^sub>R x) = y"
-    by auto
-  assume "a \<notin> S"
-  then show ?rhs
-    apply (rule_tac x="u a" in exI)
-    using u(1)[THEN bspec[where x=a]]
-    apply simp
-    apply (rule_tac x=u in exI)
-    using u[unfolded sum_clauses(2)[OF assms]] and \<open>a\<notin>S\<close>
-    apply auto
-    done
-next
-  assume "a \<in> S"
+proof (cases "a \<in> S")
+  case True
then have *: "insert a S = S" by auto
-  have fin: "finite (insert a S)" using assms by auto
-  assume ?rhs
-  then obtain v u where uv: "v\<ge>0" "\<forall>x\<in>S. 0 \<le> u x" "sum u S = w - v" "(\<Sum>x\<in>S. u x *\<^sub>R x) = y - v *\<^sub>R a"
-    by auto
-  show ?lhs
-    apply (rule_tac x = "\<lambda>x. (if a = x then v else 0) + u x" in exI)
-    unfolding scaleR_left_distrib and sum.distrib and sum_delta''[OF fin] and sum.delta'[OF fin]
-    unfolding sum_clauses(2)[OF assms]
-    using uv and uv(2)[THEN bspec[where x=a]] and \<open>a\<in>S\<close>
-    apply auto
-    done
+  show ?thesis
+  proof
+    assume ?lhs
+    then show ?rhs
+      unfolding * by force
+  next
+    have fin: "finite (insert a S)" using assms by auto
+    assume ?rhs
+    then obtain v u where uv: "v\<ge>0" "\<forall>x\<in>S. 0 \<le> u x" "sum u S = w - v" "(\<Sum>x\<in>S. u x *\<^sub>R x) = y - v *\<^sub>R a"
+      by auto
+    then show ?lhs
+      using uv True assms
+      apply (rule_tac x = "\<lambda>x. (if a = x then v else 0) + u x" in exI)
+      apply (auto simp: sum_clauses scaleR_left_distrib sum.distrib sum_delta''[OF fin])
+      done
+  qed
next
-  assume ?rhs
-  then obtain v u where uv: "v\<ge>0" "\<forall>x\<in>S. 0 \<le> u x" "sum u S = w - v" "(\<Sum>x\<in>S. u x *\<^sub>R x) = y - v *\<^sub>R a"
-    by auto
-  moreover assume "a \<notin> S"
-  moreover
-  have "(\<Sum>x\<in>S. if a = x then v else u x) = sum u S"  "(\<Sum>x\<in>S. (if a = x then v else u x) *\<^sub>R x) = (\<Sum>x\<in>S. u x *\<^sub>R x)"
-    using \<open>a \<notin> S\<close>
-    by (auto simp: intro!: sum.cong)
-  ultimately show ?lhs
-    by (rule_tac x="\<lambda>x. if a = x then v else u x" in exI) (auto simp: sum_clauses(2)[OF assms])
+  case False
+  show ?thesis
+  proof
+    assume ?lhs
+    then obtain u where u: "\<forall>x\<in>insert a S. 0 \<le> u x" "sum u (insert a S) = w" "(\<Sum>x\<in>insert a S. u x *\<^sub>R x) = y"
+      by auto
+    then show ?rhs
+      using u \<open>a\<notin>S\<close> by (rule_tac x="u a" in exI) (auto simp: sum_clauses assms)
+  next
+    assume ?rhs
+    then obtain v u where uv: "v\<ge>0" "\<forall>x\<in>S. 0 \<le> u x" "sum u S = w - v" "(\<Sum>x\<in>S. u x *\<^sub>R x) = y - v *\<^sub>R a"
+      by auto
+    moreover
+    have "(\<Sum>x\<in>S. if a = x then v else u x) = sum u S"  "(\<Sum>x\<in>S. (if a = x then v else u x) *\<^sub>R x) = (\<Sum>x\<in>S. u x *\<^sub>R x)"
+      using False by (auto intro!: sum.cong)
+    ultimately show ?lhs
+      using False by (rule_tac x="\<lambda>x. if a = x then v else u x" in exI) (auto simp: sum_clauses(2)[OF assms])
+  qed
qed

subsubsection\<^marker>\<open>tag unimportant\<close> \<open>Hence some special cases\<close>

-lemma convex_hull_2:
-  "convex hull {a,b} = {u *\<^sub>R a + v *\<^sub>R b | u v. 0 \<le> u \<and> 0 \<le> v \<and> u + v = 1}"
+lemma convex_hull_2: "convex hull {a,b} = {u *\<^sub>R a + v *\<^sub>R b | u v. 0 \<le> u \<and> 0 \<le> v \<and> u + v = 1}"
+       (is "?lhs = ?rhs")
proof -
-  have *: "\<And>u. (\<forall>x\<in>{a, b}. 0 \<le> u x) \<longleftrightarrow> 0 \<le> u a \<and> 0 \<le> u b"
-    by auto
have **: "finite {b}" by auto
-  show ?thesis
-    unfolding convex_hull_finite_step[OF **, of a 1, unfolded * conj_assoc]
-    apply auto
-    apply (rule_tac x=v in exI)
-    apply (rule_tac x="1 - v" in exI, simp)
+  have "\<And>x v u. \<lbrakk>0 \<le> v; v \<le> 1; (1 - v) *\<^sub>R b = x - v *\<^sub>R a\<rbrakk>
+                \<Longrightarrow> \<exists>u v. x = u *\<^sub>R a + v *\<^sub>R b \<and> 0 \<le> u \<and> 0 \<le> v \<and> u + v = 1"
+  moreover
+  have "\<And>u v. \<lbrakk>0 \<le> u; 0 \<le> v; u + v = 1\<rbrakk>
+               \<Longrightarrow> \<exists>p\<ge>0. \<exists>q. 0 \<le> q b \<and> q b = 1 - p \<and> q b *\<^sub>R b = u *\<^sub>R a + v *\<^sub>R b - p *\<^sub>R a"
apply (rule_tac x=u in exI, simp)
apply (rule_tac x="\<lambda>x. v" in exI, simp)
done
+  ultimately show ?thesis
+    using convex_hull_finite_step[OF **, of a 1]
+    by (auto simp add: convex_hull_finite)
qed

lemma convex_hull_2_alt: "convex hull {a,b} = {a + u *\<^sub>R (b - a) | u.  0 \<le> u \<and> u \<le> 1}"
@@ -1742,11 +1711,8 @@
fix x
show "(\<exists>v u. x = v *\<^sub>R a + u *\<^sub>R b \<and> 0 \<le> v \<and> 0 \<le> u \<and> v + u = 1) \<longleftrightarrow>
(\<exists>u. x = a + u *\<^sub>R (b - a) \<and> 0 \<le> u \<and> u \<le> 1)"
-    unfolding *
-    apply auto
-    apply (rule_tac[!] x=u in exI)
-    apply (auto simp: algebra_simps)
-    done
+    by (rule ex_cong1) (auto simp: algebra_simps)
qed

lemma convex_hull_3:
@@ -1818,54 +1784,51 @@
lemma convex_hull_caratheodory_aff_dim:
fixes p :: "('a::euclidean_space) set"
shows "convex hull p =
-    {y. \<exists>s u. finite s \<and> s \<subseteq> p \<and> card s \<le> aff_dim p + 1 \<and>
-      (\<forall>x\<in>s. 0 \<le> u x) \<and> sum u s = 1 \<and> sum (\<lambda>v. u v *\<^sub>R v) s = y}"
+    {y. \<exists>S u. finite S \<and> S \<subseteq> p \<and> card S \<le> aff_dim p + 1 \<and>
+        (\<forall>x\<in>S. 0 \<le> u x) \<and> sum u S = 1 \<and> sum (\<lambda>v. u v *\<^sub>R v) S = y}"
unfolding convex_hull_explicit set_eq_iff mem_Collect_eq
proof (intro allI iffI)
fix y
-  let ?P = "\<lambda>n. \<exists>s u. finite s \<and> card s = n \<and> s \<subseteq> p \<and> (\<forall>x\<in>s. 0 \<le> u x) \<and>
-    sum u s = 1 \<and> (\<Sum>v\<in>s. u v *\<^sub>R v) = y"
-  assume "\<exists>s u. finite s \<and> s \<subseteq> p \<and> (\<forall>x\<in>s. 0 \<le> u x) \<and> sum u s = 1 \<and> (\<Sum>v\<in>s. u v *\<^sub>R v) = y"
+  let ?P = "\<lambda>n. \<exists>S u. finite S \<and> card S = n \<and> S \<subseteq> p \<and> (\<forall>x\<in>S. 0 \<le> u x) \<and>
+    sum u S = 1 \<and> (\<Sum>v\<in>S. u v *\<^sub>R v) = y"
+  assume "\<exists>S u. finite S \<and> S \<subseteq> p \<and> (\<forall>x\<in>S. 0 \<le> u x) \<and> sum u S = 1 \<and> (\<Sum>v\<in>S. u v *\<^sub>R v) = y"
then obtain N where "?P N" by auto
then have "\<exists>n\<le>N. (\<forall>k<n. \<not> ?P k) \<and> ?P n"
-    apply (rule_tac ex_least_nat_le, auto)
-    done
+    by (rule_tac ex_least_nat_le, auto)
then obtain n where "?P n" and smallest: "\<forall>k<n. \<not> ?P k"
by blast
-  then obtain s u where obt: "finite s" "card s = n" "s\<subseteq>p" "\<forall>x\<in>s. 0 \<le> u x"
-    "sum u s = 1"  "(\<Sum>v\<in>s. u v *\<^sub>R v) = y" by auto
+  then obtain S u where obt: "finite S" "card S = n" "S\<subseteq>p" "\<forall>x\<in>S. 0 \<le> u x"
+    "sum u S = 1"  "(\<Sum>v\<in>S. u v *\<^sub>R v) = y" by auto

-  have "card s \<le> aff_dim p + 1"
+  have "card S \<le> aff_dim p + 1"
proof (rule ccontr, simp only: not_le)
-    assume "aff_dim p + 1 < card s"
-    then have "affine_dependent s"
+    assume "aff_dim p + 1 < card S"
+    then have "affine_dependent S"
using affine_dependent_biggerset[OF obt(1)] independent_card_le_aff_dim not_less obt(3)
by blast
-    then obtain w v where wv: "sum w s = 0" "v\<in>s" "w v \<noteq> 0" "(\<Sum>v\<in>s. w v *\<^sub>R v) = 0"
+    then obtain w v where wv: "sum w S = 0" "v\<in>S" "w v \<noteq> 0" "(\<Sum>v\<in>S. w v *\<^sub>R v) = 0"
using affine_dependent_explicit_finite[OF obt(1)] by auto
-    define i where "i = (\<lambda>v. (u v) / (- w v)) ` {v\<in>s. w v < 0}"
+    define i where "i = (\<lambda>v. (u v) / (- w v)) ` {v\<in>S. w v < 0}"
define t where "t = Min i"
-    have "\<exists>x\<in>s. w x < 0"
+    have "\<exists>x\<in>S. w x < 0"
proof (rule ccontr, simp add: not_less)
-      assume as:"\<forall>x\<in>s. 0 \<le> w x"
-      then have "sum w (s - {v}) \<ge> 0"
-        apply (rule_tac sum_nonneg, auto)
-        done
-      then have "sum w s > 0"
-        unfolding sum.remove[OF obt(1) \<open>v\<in>s\<close>]
-        using as[THEN bspec[where x=v]]  \<open>v\<in>s\<close>  \<open>w v \<noteq> 0\<close> by auto
+      assume as:"\<forall>x\<in>S. 0 \<le> w x"
+      then have "sum w (S - {v}) \<ge> 0"
+        by (meson Diff_iff sum_nonneg)
+      then have "sum w S > 0"
+        using as obt(1) sum_nonneg_eq_0_iff wv by blast
then show False using wv(1) by auto
qed
then have "i \<noteq> {}" unfolding i_def by auto
then have "t \<ge> 0"
-      using Min_ge_iff[of i 0 ] and obt(1)
+      using Min_ge_iff[of i 0] and obt(1)
unfolding t_def i_def
using obt(4)[unfolded le_less]
by (auto simp: divide_le_0_iff)
-    have t: "\<forall>v\<in>s. u v + t * w v \<ge> 0"
+    have t: "\<forall>v\<in>S. u v + t * w v \<ge> 0"
proof
fix v
-      assume "v \<in> s"
+      assume "v \<in> S"
then have v: "0 \<le> u v"
using obt(4)[THEN bspec[where x=v]] by auto
show "0 \<le> u v + t * w v"
@@ -1875,28 +1838,24 @@
next
case True
then have "t \<le> u v / (- w v)"
-          using \<open>v\<in>s\<close> unfolding t_def i_def
-          apply (rule_tac Min_le)
-          using obt(1) apply auto
-          done
+          using \<open>v\<in>S\<close> obt unfolding t_def i_def by (auto intro: Min_le)
then show ?thesis
-          using pos_le_divide_eq[OF True[unfolded neg_0_less_iff_less[symmetric]]]
-          by auto
+          using True neg_le_minus_divide_eq by auto
qed
qed
-    obtain a where "a \<in> s" and "t = (\<lambda>v. (u v) / (- w v)) a" and "w a < 0"
+    obtain a where "a \<in> S" and "t = (\<lambda>v. (u v) / (- w v)) a" and "w a < 0"
using Min_in[OF _ \<open>i\<noteq>{}\<close>] and obt(1) unfolding i_def t_def by auto
-    then have a: "a \<in> s" "u a + t * w a = 0" by auto
-    have *: "\<And>f. sum f (s - {a}) = sum f s - ((f a)::'b::ab_group_add)"
-      unfolding sum.remove[OF obt(1) \<open>a\<in>s\<close>] by auto
-    have "(\<Sum>v\<in>s. u v + t * w v) = 1"
+    then have a: "a \<in> S" "u a + t * w a = 0" by auto
+    have *: "\<And>f. sum f (S - {a}) = sum f S - ((f a)::'b::ab_group_add)"
+      unfolding sum.remove[OF obt(1) \<open>a\<in>S\<close>] by auto
+    have "(\<Sum>v\<in>S. u v + t * w v) = 1"
unfolding sum.distrib wv(1) sum_distrib_left[symmetric] obt(5) by auto
-    moreover have "(\<Sum>v\<in>s. u v *\<^sub>R v + (t * w v) *\<^sub>R v) - (u a *\<^sub>R a + (t * w a) *\<^sub>R a) = y"
+    moreover have "(\<Sum>v\<in>S. u v *\<^sub>R v + (t * w v) *\<^sub>R v) - (u a *\<^sub>R a + (t * w a) *\<^sub>R a) = y"
unfolding sum.distrib obt(6) scaleR_scaleR[symmetric] scaleR_right.sum [symmetric] wv(4)
using a(2) [THEN eq_neg_iff_add_eq_0 [THEN iffD2]] by simp
ultimately have "?P (n - 1)"
-      apply (rule_tac x="(s - {a})" in exI)
+      apply (rule_tac x="(S - {a})" in exI)
apply (rule_tac x="\<lambda>v. u v + t * w v" in exI)
using obt(1-3) and t and a
apply (auto simp: * scaleR_left_distrib)
@@ -1904,69 +1863,48 @@
then show False
using smallest[THEN spec[where x="n - 1"]] by auto
qed
-  then show "\<exists>s u. finite s \<and> s \<subseteq> p \<and> card s \<le> aff_dim p + 1 \<and>
-      (\<forall>x\<in>s. 0 \<le> u x) \<and> sum u s = 1 \<and> (\<Sum>v\<in>s. u v *\<^sub>R v) = y"
+  then show "\<exists>S u. finite S \<and> S \<subseteq> p \<and> card S \<le> aff_dim p + 1 \<and>
+      (\<forall>x\<in>S. 0 \<le> u x) \<and> sum u S = 1 \<and> (\<Sum>v\<in>S. u v *\<^sub>R v) = y"
using obt by auto
qed auto

lemma caratheodory_aff_dim:
fixes p :: "('a::euclidean_space) set"
-  shows "convex hull p = {x. \<exists>s. finite s \<and> s \<subseteq> p \<and> card s \<le> aff_dim p + 1 \<and> x \<in> convex hull s}"
+  shows "convex hull p = {x. \<exists>S. finite S \<and> S \<subseteq> p \<and> card S \<le> aff_dim p + 1 \<and> x \<in> convex hull S}"
(is "?lhs = ?rhs")
proof
-  show "?lhs \<subseteq> ?rhs"
-    apply (subst convex_hull_caratheodory_aff_dim, clarify)
-    apply (rule_tac x=s in exI)
-    apply (simp add: hull_subset convex_explicit [THEN iffD1, OF convex_convex_hull])
-    done
-next
-  show "?rhs \<subseteq> ?lhs"
-    using hull_mono by blast
-qed
+  have "\<And>x S u. \<lbrakk>finite S; S \<subseteq> p; int (card S) \<le> aff_dim p + 1; \<forall>x\<in>S. 0 \<le> u x; sum u S = 1\<rbrakk>
+                \<Longrightarrow> (\<Sum>v\<in>S. u v *\<^sub>R v) \<in> convex hull S"
+    by (simp add: hull_subset convex_explicit [THEN iffD1, OF convex_convex_hull])
+  then show "?lhs \<subseteq> ?rhs"
+    by (subst convex_hull_caratheodory_aff_dim, auto)
+qed (use hull_mono in auto)

lemma convex_hull_caratheodory:
fixes p :: "('a::euclidean_space) set"
shows "convex hull p =
-            {y. \<exists>s u. finite s \<and> s \<subseteq> p \<and> card s \<le> DIM('a) + 1 \<and>
-              (\<forall>x\<in>s. 0 \<le> u x) \<and> sum u s = 1 \<and> sum (\<lambda>v. u v *\<^sub>R v) s = y}"
+            {y. \<exists>S u. finite S \<and> S \<subseteq> p \<and> card S \<le> DIM('a) + 1 \<and>
+              (\<forall>x\<in>S. 0 \<le> u x) \<and> sum u S = 1 \<and> sum (\<lambda>v. u v *\<^sub>R v) S = y}"
(is "?lhs = ?rhs")
proof (intro set_eqI iffI)
fix x
assume "x \<in> ?lhs" then show "x \<in> ?rhs"
-    apply (simp only: convex_hull_caratheodory_aff_dim Set.mem_Collect_eq)
-    apply (erule ex_forward)+
-    using aff_dim_le_DIM [of p]
-    apply simp
-    done
-next
-  fix x
-  assume "x \<in> ?rhs" then show "x \<in> ?lhs"
-    by (auto simp: convex_hull_explicit)
-qed
+    unfolding convex_hull_caratheodory_aff_dim
+    using aff_dim_le_DIM [of p] by fastforce
+qed (auto simp: convex_hull_explicit)

theorem caratheodory:
"convex hull p =
-    {x::'a::euclidean_space. \<exists>s. finite s \<and> s \<subseteq> p \<and>
-      card s \<le> DIM('a) + 1 \<and> x \<in> convex hull s}"
+    {x::'a::euclidean_space. \<exists>S. finite S \<and> S \<subseteq> p \<and> card S \<le> DIM('a) + 1 \<and> x \<in> convex hull S}"
proof safe
fix x
assume "x \<in> convex hull p"
-  then obtain s u where "finite s" "s \<subseteq> p" "card s \<le> DIM('a) + 1"
-    "\<forall>x\<in>s. 0 \<le> u x" "sum u s = 1" "(\<Sum>v\<in>s. u v *\<^sub>R v) = x"
+  then obtain S u where "finite S" "S \<subseteq> p" "card S \<le> DIM('a) + 1"
+    "\<forall>x\<in>S. 0 \<le> u x" "sum u S = 1" "(\<Sum>v\<in>S. u v *\<^sub>R v) = x"
unfolding convex_hull_caratheodory by auto
-  then show "\<exists>s. finite s \<and> s \<subseteq> p \<and> card s \<le> DIM('a) + 1 \<and> x \<in> convex hull s"
-    apply (rule_tac x=s in exI)
-    using hull_subset[of s convex]
-    using convex_convex_hull[simplified convex_explicit, of s,
-      THEN spec[where x=s], THEN spec[where x=u]]
-    apply auto
-    done
-next
-  fix x s
-  assume  "finite s" "s \<subseteq> p" "card s \<le> DIM('a) + 1" "x \<in> convex hull s"
-  then show "x \<in> convex hull p"
-    using hull_mono[OF \<open>s\<subseteq>p\<close>] by auto
-qed
+  then show "\<exists>S. finite S \<and> S \<subseteq> p \<and> card S \<le> DIM('a) + 1 \<and> x \<in> convex hull S"
+    using convex_hull_finite by fastforce
+qed (use hull_mono in force)

subsection\<^marker>\<open>tag unimportant\<close>\<open>Some Properties of subset of standard basis\<close>

@@ -1989,7 +1927,7 @@

lemma convex_hull_set_plus:
"convex hull (S + T) = convex hull S + convex hull T"
-  unfolding set_plus_image
+  unfolding set_plus_image
apply (subst convex_hull_linear_image [symmetric])
@@ -2009,7 +1947,7 @@

lemma convex_hull_affinity:
"convex hull ((\<lambda>x. a + c *\<^sub>R x) ` S) = (\<lambda>x. a + c *\<^sub>R x) ` (convex hull S)"
-  by(simp only: image_image[symmetric] convex_hull_scaling convex_hull_translation)
+  by (metis convex_hull_scaling convex_hull_translation image_image)

subsection\<^marker>\<open>tag unimportant\<close> \<open>Convexity of cone hulls\<close>
@@ -2089,20 +2027,19 @@
shows "\<exists>u. sum u c = 0 \<and> (\<exists>v\<in>c. u v \<noteq> 0) \<and> sum (\<lambda>v. u v *\<^sub>R v) c = 0"
proof -
from assms(2)[unfolded affine_dependent_explicit]
-  obtain s u where
-      "finite s" "s \<subseteq> c" "sum u s = 0" "\<exists>v\<in>s. u v \<noteq> 0" "(\<Sum>v\<in>s. u v *\<^sub>R v) = 0"
+  obtain S u where
+      "finite S" "S \<subseteq> c" "sum u S = 0" "\<exists>v\<in>S. u v \<noteq> 0" "(\<Sum>v\<in>S. u v *\<^sub>R v) = 0"
by blast
then show ?thesis
-    apply (rule_tac x="\<lambda>v. if v\<in>s then u v else 0" in exI)
-    unfolding if_smult scaleR_zero_left and sum.inter_restrict[OF assms(1), symmetric]
-    apply (auto simp: Int_absorb1)
-    done
+    apply (rule_tac x="\<lambda>v. if v\<in>S then u v else 0" in exI)
+    unfolding if_smult scaleR_zero_left
+    by (auto simp: Int_absorb1 sum.inter_restrict[OF \<open>finite c\<close>, symmetric])
qed

-  assumes "finite s"
-    and "sum f s = (0::real)"
-  shows "sum f {x\<in>s. 0 < f x} = - sum f {x\<in>s. f x < 0}"
+  assumes "finite S"
+    and "sum f S = (0::real)"
+  shows "sum f {x\<in>S. 0 < f x} = - sum f {x\<in>S. f x < 0}"
proof -
have *: "\<And>x. (if f x < 0 then f x else 0) + (if 0 < f x then f x else 0) = f x"
by auto
@@ -2114,10 +2051,10 @@
qed

-  assumes "finite s"
-    and "sum f s = 0"
+  assumes "finite S"
+    and "sum f S = 0"
and "\<forall>x. g x = (0::real) \<longrightarrow> f x = (0::'a::euclidean_space)"
-  shows "(sum f {x\<in>s. 0 < g x}) = - sum f {x\<in>s. g x < 0}"
+  shows "(sum f {x\<in>S. 0 < g x}) = - sum f {x\<in>S. g x < 0}"
proof -
have *: "\<And>x. (if 0 < g x then f x else 0) + (if g x < 0 then f x else 0) = f x"
using assms(3) by auto
@@ -2130,79 +2067,63 @@
qed

-  assumes "finite c" "affine_dependent c"
-  shows "\<exists>m p. m \<inter> p = {} \<and> m \<union> p = c \<and> (convex hull m) \<inter> (convex hull p) \<noteq> {}"
+  assumes "finite C" "affine_dependent C"
+  shows "\<exists>m p. m \<inter> p = {} \<and> m \<union> p = C \<and> (convex hull m) \<inter> (convex hull p) \<noteq> {}"
proof -
-  obtain u v where uv: "sum u c = 0" "v\<in>c" "u v \<noteq> 0"  "(\<Sum>v\<in>c. u v *\<^sub>R v) = 0"
+  obtain u v where uv: "sum u C = 0" "v\<in>C" "u v \<noteq> 0"  "(\<Sum>v\<in>C. u v *\<^sub>R v) = 0"
-  have fin: "finite {x \<in> c. 0 < u x}" "finite {x \<in> c. 0 > u x}"
+  have fin: "finite {x \<in> C. 0 < u x}" "finite {x \<in> C. 0 > u x}"
using assms(1) by auto
-  define z  where "z = inverse (sum u {x\<in>c. u x > 0}) *\<^sub>R sum (\<lambda>x. u x *\<^sub>R x) {x\<in>c. u x > 0}"
-  have "sum u {x \<in> c. 0 < u x} \<noteq> 0"
+  define z  where "z = inverse (sum u {x\<in>C. u x > 0}) *\<^sub>R sum (\<lambda>x. u x *\<^sub>R x) {x\<in>C. u x > 0}"
+  have "sum u {x \<in> C. 0 < u x} \<noteq> 0"
proof (cases "u v \<ge> 0")
case False
then have "u v < 0" by auto
then show ?thesis
-    proof (cases "\<exists>w\<in>{x \<in> c. 0 < u x}. u w > 0")
+    proof (cases "\<exists>w\<in>{x \<in> C. 0 < u x}. u w > 0")
case True
then show ?thesis
using sum_nonneg_eq_0_iff[of _ u, OF fin(1)] by auto
next
case False
-      then have "sum u c \<le> sum (\<lambda>x. if x=v then u v else 0) c"
-        apply (rule_tac sum_mono, auto)
-        done
+      then have "sum u C \<le> sum (\<lambda>x. if x=v then u v else 0) C"
+        by (rule_tac sum_mono, auto)
then show ?thesis
unfolding sum.delta[OF assms(1)] using uv(2) and \<open>u v < 0\<close> and uv(1) by auto
qed
qed (insert sum_nonneg_eq_0_iff[of _ u, OF fin(1)] uv(2-3), auto)

-  then have *: "sum u {x\<in>c. u x > 0} > 0"
-    unfolding less_le
-    apply (rule_tac conjI)
-    apply (rule_tac sum_nonneg, auto)
-    done
-  moreover have "sum u ({x \<in> c. 0 < u x} \<union> {x \<in> c. u x < 0}) = sum u c"
-    "(\<Sum>x\<in>{x \<in> c. 0 < u x} \<union> {x \<in> c. u x < 0}. u x *\<^sub>R x) = (\<Sum>x\<in>c. u x *\<^sub>R x)"
+  then have *: "sum u {x\<in>C. u x > 0} > 0"
+    unfolding less_le by (metis (no_types, lifting) mem_Collect_eq sum_nonneg)
+  moreover have "sum u ({x \<in> C. 0 < u x} \<union> {x \<in> C. u x < 0}) = sum u C"
+    "(\<Sum>x\<in>{x \<in> C. 0 < u x} \<union> {x \<in> C. u x < 0}. u x *\<^sub>R x) = (\<Sum>x\<in>C. u x *\<^sub>R x)"
using assms(1)
-    apply (rule_tac[!] sum.mono_neutral_left, auto)
-    done
-  then have "sum u {x \<in> c. 0 < u x} = - sum u {x \<in> c. 0 > u x}"
-    "(\<Sum>x\<in>{x \<in> c. 0 < u x}. u x *\<^sub>R x) = - (\<Sum>x\<in>{x \<in> c. 0 > u x}. u x *\<^sub>R x)"
+    by (rule_tac[!] sum.mono_neutral_left, auto)
+  then have "sum u {x \<in> C. 0 < u x} = - sum u {x \<in> C. 0 > u x}"
+    "(\<Sum>x\<in>{x \<in> C. 0 < u x}. u x *\<^sub>R x) = - (\<Sum>x\<in>{x \<in> C. 0 > u x}. u x *\<^sub>R x)"
using uv(1,4)
by (auto simp: sum.union_inter_neutral[OF fin, symmetric])
-  moreover have "\<forall>x\<in>{v \<in> c. u v < 0}. 0 \<le> inverse (sum u {x \<in> c. 0 < u x}) * - u x"
-    apply rule
-    apply (rule mult_nonneg_nonneg)
-    using *
-    apply auto
-    done
-  ultimately have "z \<in> convex hull {v \<in> c. u v \<le> 0}"
+  moreover have "\<forall>x\<in>{v \<in> C. u v < 0}. 0 \<le> inverse (sum u {x \<in> C. 0 < u x}) * - u x"
+    using * by (fastforce intro: mult_nonneg_nonneg)
+  ultimately have "z \<in> convex hull {v \<in> C. u v \<le> 0}"
unfolding convex_hull_explicit mem_Collect_eq
-    apply (rule_tac x="{v \<in> c. u v < 0}" in exI)
-    apply (rule_tac x="\<lambda>y. inverse (sum u {x\<in>c. u x > 0}) * - u y" in exI)
-    using assms(1) unfolding scaleR_scaleR[symmetric] scaleR_right.sum [symmetric] and z_def
-    apply (auto simp: sum_negf sum_distrib_left[symmetric])
-    done
-  moreover have "\<forall>x\<in>{v \<in> c. 0 < u v}. 0 \<le> inverse (sum u {x \<in> c. 0 < u x}) * u x"
-    apply rule
-    apply (rule mult_nonneg_nonneg)
-    using *
-    apply auto
-    done
-  then have "z \<in> convex hull {v \<in> c. u v > 0}"
+    apply (rule_tac x="{v \<in> C. u v < 0}" in exI)
+    apply (rule_tac x="\<lambda>y. inverse (sum u {x\<in>C. u x > 0}) * - u y" in exI)
+    using assms(1) unfolding scaleR_scaleR[symmetric] scaleR_right.sum [symmetric]
+    by (auto simp: z_def sum_negf sum_distrib_left[symmetric])
+  moreover have "\<forall>x\<in>{v \<in> C. 0 < u v}. 0 \<le> inverse (sum u {x \<in> C. 0 < u x}) * u x"
+    using * by (fastforce intro: mult_nonneg_nonneg)
+  then have "z \<in> convex hull {v \<in> C. u v > 0}"
unfolding convex_hull_explicit mem_Collect_eq
-    apply (rule_tac x="{v \<in> c. 0 < u v}" in exI)
-    apply (rule_tac x="\<lambda>y. inverse (sum u {x\<in>c. u x > 0}) * u y" in exI)
+    apply (rule_tac x="{v \<in> C. 0 < u v}" in exI)
+    apply (rule_tac x="\<lambda>y. inverse (sum u {x\<in>C. u x > 0}) * u y" in exI)
using assms(1)
-    unfolding scaleR_scaleR[symmetric] scaleR_right.sum [symmetric] and z_def
-    using *
-    apply (auto simp: sum_negf sum_distrib_left[symmetric])
-    done
+    unfolding scaleR_scaleR[symmetric] scaleR_right.sum [symmetric]
+    using * by (auto simp: z_def sum_negf sum_distrib_left[symmetric])
ultimately show ?thesis
-    apply (rule_tac x="{v\<in>c. u v \<le> 0}" in exI)
-    apply (rule_tac x="{v\<in>c. u v > 0}" in exI, auto)
+    apply (rule_tac x="{v\<in>C. u v \<le> 0}" in exI)
+    apply (rule_tac x="{v\<in>C. u v > 0}" in exI, auto)
done
qed

@@ -2211,19 +2132,16 @@
obtains m p where "m \<subseteq> c" "p \<subseteq> c" "m \<inter> p = {}" "(convex hull m) \<inter> (convex hull p) \<noteq> {}"
proof -
from assms[unfolded affine_dependent_explicit]
-  obtain s u where
-      "finite s" "s \<subseteq> c" "sum u s = 0" "\<exists>v\<in>s. u v \<noteq> 0" "(\<Sum>v\<in>s. u v *\<^sub>R v) = 0"
+  obtain S u where
+      "finite S" "S \<subseteq> c" "sum u S = 0" "\<exists>v\<in>S. u v \<noteq> 0" "(\<Sum>v\<in>S. u v *\<^sub>R v) = 0"
by blast
-  then have *: "finite s" "affine_dependent s" and s: "s \<subseteq> c"
+  then have *: "finite S" "affine_dependent S" and S: "S \<subseteq> c"
unfolding affine_dependent_explicit by auto
-  obtain m p where "m \<inter> p = {}" "m \<union> p = s" "convex hull m \<inter> convex hull p \<noteq> {}"
+  obtain m p where "m \<inter> p = {}" "m \<union> p = S" "convex hull m \<inter> convex hull p \<noteq> {}"
by blast
-  then show ?thesis
-    apply (rule_tac that[of p m])
-    using s
-    apply auto
-    done
+  with S show ?thesis
+    by (force intro: that[of p m])
qed

@@ -2288,10 +2206,7 @@
unfolding mp(2)[unfolded image_Un[symmetric] gh]
by auto
have *: "g \<inter> h = {}"
-        using mp(1)
-        unfolding gh
-        using inj_on_image_Int[OF True gh(3,4)]
-        by auto
+        using gh(1) gh(2) local.mp(1) by blast
have "convex hull (X ` h) \<subseteq> \<Inter>g" "convex hull (X ` g) \<subseteq> \<Inter>h"
by (rule hull_minimal; use X * f in \<open>auto simp: Suc.prems(3) convex_Inter\<close>)+
then show ?thesis
@@ -2305,10 +2220,7 @@
assumes "card f \<ge> DIM('a) + 1" "\<forall>s\<in>f. convex s"
and "\<And>t. \<lbrakk>t\<subseteq>f; card t = DIM('a) + 1\<rbrakk> \<Longrightarrow> \<Inter>t \<noteq> {}"
shows "\<Inter>f \<noteq> {}"
-  apply (rule Helly_induct)
-  using assms
-  apply auto
-  done
+  using Helly_induct assms by blast

subsection \<open>Epigraphs of convex functions\<close>

@@ -2323,14 +2235,7 @@
then show "convex_on S f"
by (auto simp: convex_def convex_on_def epigraph_def)
show "convex S"
-    using L
-    apply (clarsimp simp: convex_def convex_on_def epigraph_def)
-    apply (erule_tac x=x in allE)
-    apply (erule_tac x="f x" in allE, safe)
-    apply (erule_tac x=y in allE)
-    apply (erule_tac x="f y" in allE)
-    apply (auto simp: )
-    done
+    using L by (fastforce simp: convex_def convex_on_def epigraph_def)
next
assume "convex_on S f" "convex S"
then show "convex (epigraph S f)"
@@ -2350,53 +2255,59 @@

subsubsection\<^marker>\<open>tag unimportant\<close> \<open>Use this to derive general bound property of convex function\<close>

+
lemma convex_on:
assumes "convex S"
shows "convex_on S f \<longleftrightarrow>
(\<forall>k u x. (\<forall>i\<in>{1..k::nat}. 0 \<le> u i \<and> x i \<in> S) \<and> sum u {1..k} = 1 \<longrightarrow>
f (sum (\<lambda>i. u i *\<^sub>R x i) {1..k}) \<le> sum (\<lambda>i. u i * f(x i)) {1..k})"
+  (is "?lhs = (\<forall>k u x. ?rhs k u x)")
+proof
+  assume ?lhs
+  then have \<section>: "convex {xy. fst xy \<in> S \<and> f (fst xy) \<le> snd xy}"
+    by (metis assms convex_epigraph epigraph_def)
+  show "\<forall>k u x. ?rhs k u x"
+  proof (intro allI)
+    fix k u x
+    show "?rhs k u x"
+      using \<section>
+      unfolding  convex mem_Collect_eq fst_sum snd_sum
+      apply safe
+      apply (drule_tac x=k in spec)
+      apply (drule_tac x=u in spec)
+      apply (drule_tac x="\<lambda>i. (x i, f (x i))" in spec)
+      apply simp
+      done
+  qed
+next
+  assume "\<forall>k u x. ?rhs k u x"
+  then show ?lhs
+  unfolding convex_epigraph_convex[OF assms] convex epigraph_def Ball_def mem_Collect_eq fst_sum snd_sum
+  using assms[unfolded convex] apply clarsimp
+  apply (rule_tac y="\<Sum>i = 1..k. u i * f (fst (x i))" in order_trans)
+  by (auto simp add: mult_left_mono intro: sum_mono)
+qed

-  unfolding convex_epigraph_convex[OF assms] convex epigraph_def Ball_def mem_Collect_eq
-  unfolding fst_sum snd_sum fst_scaleR snd_scaleR
-  apply safe
-    apply (drule_tac x=k in spec)
-    apply (drule_tac x=u in spec)
-    apply (drule_tac x="\<lambda>i. (x i, f (x i))" in spec)
-    apply simp
-  using assms[unfolded convex] apply simp
-  apply (rule_tac y="\<Sum>i = 1..k. u i * f (fst (x i))" in order_trans, force)
-   apply (rule sum_mono)
-   apply (erule_tac x=i in allE)
-  unfolding real_scaleR_def
-   apply (rule mult_left_mono)
-  using assms[unfolded convex] apply auto
-  done

subsection\<^marker>\<open>tag unimportant\<close> \<open>A bound within a convex hull\<close>

lemma convex_on_convex_hull_bound:
-  assumes "convex_on (convex hull s) f"
-    and "\<forall>x\<in>s. f x \<le> b"
-  shows "\<forall>x\<in> convex hull s. f x \<le> b"
+  assumes "convex_on (convex hull S) f"
+    and "\<forall>x\<in>S. f x \<le> b"
+  shows "\<forall>x\<in> convex hull S. f x \<le> b"
proof
fix x
-  assume "x \<in> convex hull s"
+  assume "x \<in> convex hull S"
then obtain k u v where
-    obt: "\<forall>i\<in>{1..k::nat}. 0 \<le> u i \<and> v i \<in> s" "sum u {1..k} = 1" "(\<Sum>i = 1..k. u i *\<^sub>R v i) = x"
+    u: "\<forall>i\<in>{1..k::nat}. 0 \<le> u i \<and> v i \<in> S" "sum u {1..k} = 1" "(\<Sum>i = 1..k. u i *\<^sub>R v i) = x"
unfolding convex_hull_indexed mem_Collect_eq by auto
have "(\<Sum>i = 1..k. u i * f (v i)) \<le> b"
using sum_mono[of "{1..k}" "\<lambda>i. u i * f (v i)" "\<lambda>i. u i * b"]
-    unfolding sum_distrib_right[symmetric] obt(2) mult_1
-    apply (drule_tac meta_mp)
-    apply (rule mult_left_mono)
-    using assms(2) obt(1)
-    apply auto
-    done
+    unfolding sum_distrib_right[symmetric] u(2) mult_1
+    using assms(2) mult_left_mono u(1) by blast
then show "f x \<le> b"
using assms(1)[unfolded convex_on[OF convex_convex_hull], rule_format, of k u v]
-    unfolding obt(2-3)
-    using obt(1) and hull_subset[unfolded subset_eq, rule_format, of _ s]
-    by auto
+    using hull_inc u by fastforce
qed

lemma inner_sum_Basis[simp]: "i \<in> Basis \<Longrightarrow> (\<Sum>Basis) \<bullet> i = 1"
@@ -2425,22 +2336,29 @@
using assms by (induct set: finite, simp, simp add: finite_set_plus)

lemma box_eq_set_sum_Basis:
-  shows "{x. \<forall>i\<in>Basis. x\<bullet>i \<in> B i} = (\<Sum>i\<in>Basis. image (\<lambda>x. x *\<^sub>R i) (B i))"
-  apply (subst set_sum_alt [OF finite_Basis], safe)
-  apply (fast intro: euclidean_representation [symmetric])
-  apply (subst inner_sum_left)
-apply (rename_tac f)
-  apply (subgoal_tac "(\<Sum>x\<in>Basis. f x \<bullet> i) = f i \<bullet> i")
-  apply (drule (1) bspec)
-  apply clarsimp
-  apply (frule sum.remove [OF finite_Basis])
-  apply (erule trans, simp)
-  apply (rule sum.neutral, clarsimp)
-  apply (frule_tac x=i in bspec, assumption)
-  apply (drule_tac x=x in bspec, assumption, clarsimp)
-  apply (cut_tac u=x and v=i in inner_Basis, assumption+)
-  apply (rule ccontr, simp)
-  done
+  "{x. \<forall>i\<in>Basis. x\<bullet>i \<in> B i} = (\<Sum>i\<in>Basis. (\<lambda>x. x *\<^sub>R i) ` (B i))" (is "?lhs = ?rhs")
+proof -
+  have "\<And>x. \<forall>i\<in>Basis. x \<bullet> i \<in> B i \<Longrightarrow>
+         \<exists>s. x = sum s Basis \<and> (\<forall>i\<in>Basis. s i \<in> (\<lambda>x. x *\<^sub>R i) ` B i)"
+    by (metis (mono_tags, lifting) euclidean_representation image_iff)
+  moreover
+  have "sum f Basis \<bullet> i \<in> B i" if "i \<in> Basis" and f: "\<forall>i\<in>Basis. f i \<in> (\<lambda>x. x *\<^sub>R i) ` B i" for i f
+  proof -
+    have "(\<Sum>x\<in>Basis - {i}. f x \<bullet> i) = 0"
+    proof (rule sum.neutral, intro strip)
+      show "f x \<bullet> i = 0" if "x \<in> Basis - {i}" for x
+        using that f \<open>i \<in> Basis\<close> inner_Basis that by fastforce
+    qed
+    then have "(\<Sum>x\<in>Basis. f x \<bullet> i) = f i \<bullet> i"
+      by (metis (no_types) \<open>i \<in> Basis\<close> add.right_neutral sum.remove [OF finite_Basis])
+    then have "(\<Sum>x\<in>Basis. f x \<bullet> i) \<in> B i"
+      using f that(1) by auto
+    then show ?thesis