tuned proofs;
authorwenzelm
Sun, 06 Apr 2014 19:35:35 +0200
changeset 56444 f944ae8c80a3
parent 56443 ee0f7cfb7bba
child 56446 70a13de8a154
tuned proofs;
src/HOL/Multivariate_Analysis/Linear_Algebra.thy
--- a/src/HOL/Multivariate_Analysis/Linear_Algebra.thy	Sun Apr 06 19:16:34 2014 +0200
+++ b/src/HOL/Multivariate_Analysis/Linear_Algebra.thy	Sun Apr 06 19:35:35 2014 +0200
@@ -27,7 +27,7 @@
 
 lemma square_continuous:
   fixes e :: real
-  shows "e > 0 \<Longrightarrow> \<exists>d. 0 < d \<and> (\<forall>y. abs (y - x) < d \<longrightarrow> abs (y * y - x * x) < e)"
+  shows "e > 0 \<Longrightarrow> \<exists>d. 0 < d \<and> (\<forall>y. \<bar>y - x\<bar> < d \<longrightarrow> \<bar>y * y - x * x\<bar> < e)"
   using isCont_power[OF isCont_ident, of x, unfolded isCont_def LIM_eq, rule_format, of e 2]
   apply (auto simp add: power2_eq_square)
   apply (rule_tac x="s" in exI)
@@ -221,10 +221,12 @@
   "linear f \<longleftrightarrow> (\<forall>x y. f (x + y) = f x + f y) \<and> (\<forall>c x. f (c *\<^sub>R x) = c *\<^sub>R f x)"
   (is "linear f \<longleftrightarrow> ?rhs")
 proof
-  assume "linear f" then interpret f: linear f .
+  assume "linear f"
+  then interpret f: linear f .
   show "?rhs" by (simp add: f.add f.scaleR)
 next
-  assume "?rhs" then show "linear f" by unfold_locales simp_all
+  assume "?rhs"
+  then show "linear f" by unfold_locales simp_all
 qed
 
 lemma linear_compose_cmul: "linear f \<Longrightarrow> linear (\<lambda>x. c *\<^sub>R f x)"
@@ -255,7 +257,11 @@
   case True
   then show ?thesis
     using lS by induct (simp_all add: linear_zero linear_compose_add)
-qed (simp add: linear_zero)
+next
+  case False
+  then show ?thesis
+    by (simp add: linear_zero)
+qed
 
 lemma linear_0: "linear f \<Longrightarrow> f 0 = 0"
   unfolding linear_iff
@@ -283,7 +289,11 @@
   case True
   then show ?thesis
     by induct (simp_all add: linear_0 [OF f] linear_add [OF f])
-qed (simp add: linear_0 [OF f])
+next
+  case False
+  then show ?thesis
+    by (simp add: linear_0 [OF f])
+qed
 
 lemma linear_setsum_mul:
   assumes lin: "linear f"
@@ -401,7 +411,7 @@
 *}
 
 lemma adjoint_works:
-  fixes f:: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space"
+  fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space"
   assumes lf: "linear f"
   shows "x \<bullet> adjoint f y = f x \<bullet> y"
 proof -
@@ -423,21 +433,21 @@
 qed
 
 lemma adjoint_clauses:
-  fixes f:: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space"
+  fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space"
   assumes lf: "linear f"
   shows "x \<bullet> adjoint f y = f x \<bullet> y"
     and "adjoint f y \<bullet> x = y \<bullet> f x"
   by (simp_all add: adjoint_works[OF lf] inner_commute)
 
 lemma adjoint_linear:
-  fixes f:: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space"
+  fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space"
   assumes lf: "linear f"
   shows "linear (adjoint f)"
   by (simp add: lf linear_iff euclidean_eq_iff[where 'a='n] euclidean_eq_iff[where 'a='m]
     adjoint_clauses[OF lf] inner_distrib)
 
 lemma adjoint_adjoint:
-  fixes f:: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space"
+  fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space"
   assumes lf: "linear f"
   shows "adjoint (adjoint f) = f"
   by (rule adjoint_unique, simp add: adjoint_clauses [OF lf])
@@ -462,7 +472,7 @@
   unfolding subseq_def
   using enumerate_in_set[OF fS] enumerate_mono[of _ _ S] fS by auto
 
-lemma approachable_lt_le: "(\<exists>(d::real)>0. \<forall>x. f x < d \<longrightarrow> P x) \<longleftrightarrow> (\<exists>d>0. \<forall>x. f x \<le> d \<longrightarrow> P x)"
+lemma approachable_lt_le: "(\<exists>(d::real) > 0. \<forall>x. f x < d \<longrightarrow> P x) \<longleftrightarrow> (\<exists>d>0. \<forall>x. f x \<le> d \<longrightarrow> P x)"
   apply auto
   apply (rule_tac x="d/2" in exI)
   apply auto
@@ -476,7 +486,7 @@
     and xy: "x\<^sup>2 \<le> y\<^sup>2 + z\<^sup>2"
   shows "x \<le> y + z"
 proof -
-  have "y\<^sup>2 + z\<^sup>2 \<le> y\<^sup>2 + 2 *y * z + z\<^sup>2"
+  have "y\<^sup>2 + z\<^sup>2 \<le> y\<^sup>2 + 2 * y * z + z\<^sup>2"
     using z y by (simp add: mult_nonneg_nonneg)
   with xy have th: "x\<^sup>2 \<le> (y + z)\<^sup>2"
     by (simp add: power2_eq_square field_simps)
@@ -546,16 +556,16 @@
   apply (metis hull_in T)
   done
 
-lemma hull_redundant_eq: "a \<in> (S hull s) \<longleftrightarrow> (S hull (insert a s) = S hull s)"
+lemma hull_redundant_eq: "a \<in> (S hull s) \<longleftrightarrow> S hull (insert a s) = S hull s"
   unfolding hull_def by blast
 
-lemma hull_redundant: "a \<in> (S hull s) \<Longrightarrow> (S hull (insert a s) = S hull s)"
+lemma hull_redundant: "a \<in> (S hull s) \<Longrightarrow> S hull (insert a s) = S hull s"
   by (metis hull_redundant_eq)
 
 
 subsection {* Archimedean properties and useful consequences *}
 
-lemma real_arch_simple: "\<exists>n. x \<le> real (n::nat)"
+lemma real_arch_simple: "\<exists>n::nat. x \<le> real n"
   unfolding real_of_nat_def by (rule ex_le_of_nat)
 
 lemma real_arch_inv: "0 < e \<longleftrightarrow> (\<exists>n::nat. n \<noteq> 0 \<and> 0 < inverse (real n) \<and> inverse (real n) < e)"
@@ -647,7 +657,7 @@
 lemma real_archimedian_rdiv_eq_0:
   assumes x0: "x \<ge> 0"
     and c: "c \<ge> 0"
-    and xc: "\<forall>(m::nat)>0. real m * x \<le> c"
+    and xc: "\<forall>(m::nat) > 0. real m * x \<le> c"
   shows "x = 0"
 proof (rule ccontr)
   assume "x \<noteq> 0"
@@ -665,7 +675,7 @@
 subsection{* A bit of linear algebra. *}
 
 definition (in real_vector) subspace :: "'a set \<Rightarrow> bool"
-  where "subspace S \<longleftrightarrow> 0 \<in> S \<and> (\<forall>x\<in> S. \<forall>y \<in>S. x + y \<in> S) \<and> (\<forall>c. \<forall>x \<in>S. c *\<^sub>R x \<in>S )"
+  where "subspace S \<longleftrightarrow> 0 \<in> S \<and> (\<forall>x \<in> S. \<forall>y \<in> S. x + y \<in> S) \<and> (\<forall>c. \<forall>x \<in> S. c *\<^sub>R x \<in> S)"
 
 definition (in real_vector) "span S = (subspace hull S)"
 definition (in real_vector) "dependent S \<longleftrightarrow> (\<exists>a \<in> S. a \<in> span (S - {a}))"
@@ -797,7 +807,7 @@
   shows "\<forall>x \<in> span S. P x"
   using span_induct SP P by blast
 
-inductive_set (in real_vector) span_induct_alt_help for S:: "'a set"
+inductive_set (in real_vector) span_induct_alt_help for S :: "'a set"
 where
   span_induct_alt_help_0: "0 \<in> span_induct_alt_help S"
 | span_induct_alt_help_S:
@@ -919,7 +929,7 @@
 
 lemma span_linear_image:
   assumes lf: "linear f"
-  shows "span (f ` S) = f ` (span S)"
+  shows "span (f ` S) = f ` span S"
 proof (rule span_unique)
   show "f ` S \<subseteq> f ` span S"
     by (intro image_mono span_inc)
@@ -1414,7 +1424,7 @@
   done
 
 lemma setsum_norm_allsubsets_bound:
-  fixes f:: "'a \<Rightarrow> 'n::euclidean_space"
+  fixes f :: "'a \<Rightarrow> 'n::euclidean_space"
   assumes fP: "finite P"
     and fPs: "\<And>Q. Q \<subseteq> P \<Longrightarrow> norm (setsum f Q) \<le> e"
   shows "(\<Sum>x\<in>P. norm (f x)) \<le> 2 * real DIM('n) * e"
@@ -1429,7 +1439,8 @@
     assume i: "i \<in> Basis"
     have "norm (\<Sum>x\<in>P. \<bar>f x \<bullet> i\<bar>) \<le>
       norm ((\<Sum>x\<in>P \<inter> - {x. f x \<bullet> i < 0}. f x) \<bullet> i) + norm ((\<Sum>x\<in>P \<inter> {x. f x \<bullet> i < 0}. f x) \<bullet> i)"
-      by (simp add: abs_real_def setsum_cases[OF fP] setsum_negf norm_triangle_ineq4 inner_setsum_left del: real_norm_def)
+      by (simp add: abs_real_def setsum_cases[OF fP] setsum_negf norm_triangle_ineq4 inner_setsum_left
+        del: real_norm_def)
     also have "\<dots> \<le> e + e"
       unfolding real_norm_def
       by (intro add_mono norm_bound_Basis_le i fPs) auto
@@ -1444,7 +1455,7 @@
 subsection {* Linearity and Bilinearity continued *}
 
 lemma linear_bounded:
-  fixes f:: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector"
+  fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector"
   assumes lf: "linear f"
   shows "\<exists>B. \<forall>x. norm (f x) \<le> B * norm x"
 proof
@@ -1496,7 +1507,7 @@
 qed
 
 lemma linear_bounded_pos:
-  fixes f:: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector"
+  fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector"
   assumes lf: "linear f"
   shows "\<exists>B > 0. \<forall>x. norm (f x) \<le> B * norm x"
 proof -
@@ -1508,7 +1519,7 @@
 qed
 
 lemma bounded_linearI':
-  fixes f::"'a::euclidean_space \<Rightarrow> 'b::real_normed_vector"
+  fixes f ::"'a::euclidean_space \<Rightarrow> 'b::real_normed_vector"
   assumes "\<And>x y. f (x + y) = f x + f y"
     and "\<And>c x. f (c *\<^sub>R x) = c *\<^sub>R f x"
   shows "bounded_linear f"
@@ -1516,7 +1527,7 @@
   by (rule linearI[OF assms])
 
 lemma bilinear_bounded:
-  fixes h:: "'m::euclidean_space \<Rightarrow> 'n::euclidean_space \<Rightarrow> 'k::real_normed_vector"
+  fixes h :: "'m::euclidean_space \<Rightarrow> 'n::euclidean_space \<Rightarrow> 'k::real_normed_vector"
   assumes bh: "bilinear h"
   shows "\<exists>B. \<forall>x y. norm (h x y) \<le> B * norm x * norm y"
 proof (clarify intro!: exI[of _ "\<Sum>i\<in>Basis. \<Sum>j\<in>Basis. norm (h i j)"])
@@ -1582,7 +1593,7 @@
 qed
 
 lemma bilinear_bounded_pos:
-  fixes h:: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space \<Rightarrow> 'c::real_normed_vector"
+  fixes h :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space \<Rightarrow> 'c::real_normed_vector"
   assumes bh: "bilinear h"
   shows "\<exists>B > 0. \<forall>x y. norm (h x y) \<le> B * norm x * norm y"
 proof -
@@ -1602,7 +1613,8 @@
   using independent_span_bound[OF finite_Basis, of S] by auto
 
 lemma dependent_biggerset:
-  "(finite (S::('a::euclidean_space) set) \<Longrightarrow> card S > DIM('a)) \<Longrightarrow> dependent S"
+  fixes S :: "'a::euclidean_space set"
+  shows "(finite S \<Longrightarrow> card S > DIM('a)) \<Longrightarrow> dependent S"
   by (metis independent_bound not_less)
 
 text {* Hence we can create a maximal independent subset. *}
@@ -1816,7 +1828,7 @@
   by (metis dim_span dim_subset)
 
 lemma span_eq_dim:
-  fixes S:: "'a::euclidean_space set"
+  fixes S :: "'a::euclidean_space set"
   shows "span S = span T \<Longrightarrow> dim S = dim T"
   by (metis dim_span)
 
@@ -2003,7 +2015,7 @@
 lemma span_not_univ_orthogonal:
   fixes S :: "'a::euclidean_space set"
   assumes sU: "span S \<noteq> UNIV"
-  shows "\<exists>(a::'a). a \<noteq>0 \<and> (\<forall>x \<in> span S. a \<bullet> x = 0)"
+  shows "\<exists>a::'a. a \<noteq> 0 \<and> (\<forall>x \<in> span S. a \<bullet> x = 0)"
 proof -
   from sU obtain a where a: "a \<notin> span S"
     by blast
@@ -2066,7 +2078,7 @@
 lemma lowdim_subset_hyperplane:
   fixes S :: "'a::euclidean_space set"
   assumes d: "dim S < DIM('a)"
-  shows "\<exists>(a::'a). a  \<noteq> 0 \<and> span S \<subseteq> {x. a \<bullet> x = 0}"
+  shows "\<exists>a::'a. a \<noteq> 0 \<and> span S \<subseteq> {x. a \<bullet> x = 0}"
 proof -
   {
     assume "span S = UNIV"
@@ -2382,7 +2394,8 @@
 qed
 
 lemma linear_eq_stdbasis:
-  assumes lf: "linear (f::'a::euclidean_space \<Rightarrow> _)"
+  fixes f :: "'a::euclidean_space \<Rightarrow> _"
+  assumes lf: "linear f"
     and lg: "linear g"
     and fg: "\<forall>b\<in>Basis. f b = g b"
   shows "f = g"
@@ -2429,18 +2442,19 @@
 text {* Detailed theorems about left and right invertibility in general case. *}
 
 lemma linear_injective_left_inverse:
-  fixes f::"'a::euclidean_space \<Rightarrow> 'b::euclidean_space"
-  assumes lf: "linear f" and fi: "inj f"
-  shows "\<exists>g. linear g \<and> g o f = id"
+  fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space"
+  assumes lf: "linear f"
+    and fi: "inj f"
+  shows "\<exists>g. linear g \<and> g \<circ> f = id"
 proof -
   from linear_independent_extend[OF independent_injective_image, OF independent_Basis, OF lf fi]
-  obtain h:: "'b \<Rightarrow> 'a" where h: "linear h" "\<forall>x \<in> f ` Basis. h x = inv f x"
+  obtain h :: "'b \<Rightarrow> 'a" where h: "linear h" "\<forall>x \<in> f ` Basis. h x = inv f x"
     by blast
   from h(2) have th: "\<forall>i\<in>Basis. (h \<circ> f) i = id i"
     using inv_o_cancel[OF fi, unfolded fun_eq_iff id_def o_def]
     by auto
   from linear_eq_stdbasis[OF linear_compose[OF lf h(1)] linear_id th]
-  have "h o f = id" .
+  have "h \<circ> f = id" .
   then show ?thesis
     using h(1) by blast
 qed
@@ -2449,15 +2463,15 @@
   fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space"
   assumes lf: "linear f"
     and sf: "surj f"
-  shows "\<exists>g. linear g \<and> f o g = id"
+  shows "\<exists>g. linear g \<and> f \<circ> g = id"
 proof -
   from linear_independent_extend[OF independent_Basis[where 'a='b],of "inv f"]
-  obtain h:: "'b \<Rightarrow> 'a" where h: "linear h" "\<forall>x\<in>Basis. h x = inv f x"
+  obtain h :: "'b \<Rightarrow> 'a" where h: "linear h" "\<forall>x\<in>Basis. h x = inv f x"
     by blast
-  from h(2) have th: "\<forall>i\<in>Basis. (f o h) i = id i"
+  from h(2) have th: "\<forall>i\<in>Basis. (f \<circ> h) i = id i"
     using sf by (auto simp add: surj_iff_all)
   from linear_eq_stdbasis[OF linear_compose[OF h(1) lf] linear_id th]
-  have "f o h = id" .
+  have "f \<circ> h = id" .
   then show ?thesis
     using h(1) by blast
 qed
@@ -2465,7 +2479,7 @@
 text {* An injective map @{typ "'a::euclidean_space \<Rightarrow> 'b::euclidean_space"} is also surjective. *}
 
 lemma linear_injective_imp_surjective:
-  fixes f::"'a::euclidean_space \<Rightarrow> 'a::euclidean_space"
+  fixes f :: "'a::euclidean_space \<Rightarrow> 'a::euclidean_space"
   assumes lf: "linear f"
     and fi: "inj f"
   shows "surj f"
@@ -2617,7 +2631,7 @@
   by (simp add: fun_eq_iff o_def id_def)
 
 lemma linear_injective_isomorphism:
-  fixes f::"'a::euclidean_space \<Rightarrow> 'a::euclidean_space"
+  fixes f :: "'a::euclidean_space \<Rightarrow> 'a::euclidean_space"
   assumes lf: "linear f"
     and fi: "inj f"
   shows "\<exists>f'. linear f' \<and> (\<forall>x. f' (f x) = x) \<and> (\<forall>x. f (f' x) = x)"
@@ -2687,22 +2701,22 @@
 
 subsection {* Infinity norm *}
 
-definition "infnorm (x::'a::euclidean_space) = Sup {abs (x \<bullet> b) |b. b \<in> Basis}"
+definition "infnorm (x::'a::euclidean_space) = Sup {\<bar>x \<bullet> b\<bar> |b. b \<in> Basis}"
 
 lemma infnorm_set_image:
   fixes x :: "'a::euclidean_space"
-  shows "{abs (x \<bullet> i) |i. i \<in> Basis} = (\<lambda>i. abs (x \<bullet> i)) ` Basis"
+  shows "{\<bar>x \<bullet> i\<bar> |i. i \<in> Basis} = (\<lambda>i. \<bar>x \<bullet> i\<bar>) ` Basis"
   by blast
 
 lemma infnorm_Max:
   fixes x :: "'a::euclidean_space"
-  shows "infnorm x = Max ((\<lambda>i. abs (x \<bullet> i)) ` Basis)"
+  shows "infnorm x = Max ((\<lambda>i. \<bar>x \<bullet> i\<bar>) ` Basis)"
   by (simp add: infnorm_def infnorm_set_image cSup_eq_Max del: Sup_image_eq)
 
 lemma infnorm_set_lemma:
   fixes x :: "'a::euclidean_space"
-  shows "finite {abs (x \<bullet> i) |i. i \<in> Basis}"
-    and "{abs (x \<bullet> i) |i. i \<in> Basis} \<noteq> {}"
+  shows "finite {\<bar>x \<bullet> i\<bar> |i. i \<in> Basis}"
+    and "{\<bar>x \<bullet> i\<bar> |i. i \<in> Basis} \<noteq> {}"
   unfolding infnorm_set_image
   by auto
 
@@ -2750,7 +2764,7 @@
 
 lemma real_abs_sub_infnorm: "\<bar>infnorm x - infnorm y\<bar> \<le> infnorm (x - y)"
 proof -
-  have th: "\<And>(nx::real) n ny. nx \<le> n + ny \<Longrightarrow> ny <= n + nx \<Longrightarrow> \<bar>nx - ny\<bar> \<le> n"
+  have th: "\<And>(nx::real) n ny. nx \<le> n + ny \<Longrightarrow> ny \<le> n + nx \<Longrightarrow> \<bar>nx - ny\<bar> \<le> n"
     by arith
   from infnorm_triangle[of "x - y" " y"] infnorm_triangle[of "x - y" "-x"]
   have ths: "infnorm x \<le> infnorm (x - y) + infnorm y"
@@ -2767,7 +2781,7 @@
   shows "b \<in> Basis \<Longrightarrow> \<bar>x \<bullet> b\<bar> \<le> infnorm x"
   by (simp add: infnorm_Max)
 
-lemma infnorm_mul: "infnorm (a *\<^sub>R x) = abs a * infnorm x"
+lemma infnorm_mul: "infnorm (a *\<^sub>R x) = \<bar>a\<bar> * infnorm x"
   unfolding infnorm_Max
 proof (safe intro!: Max_eqI)
   let ?B = "(\<lambda>i. \<bar>x \<bullet> i\<bar>) ` Basis"
@@ -2876,11 +2890,11 @@
 qed
 
 lemma norm_cauchy_schwarz_abs_eq:
-  "abs (x \<bullet> y) = norm x * norm y \<longleftrightarrow>
+  "\<bar>x \<bullet> y\<bar> = norm x * norm y \<longleftrightarrow>
     norm x *\<^sub>R y = norm y *\<^sub>R x \<or> norm x *\<^sub>R y = - norm y *\<^sub>R x"
   (is "?lhs \<longleftrightarrow> ?rhs")
 proof -
-  have th: "\<And>(x::real) a. a \<ge> 0 \<Longrightarrow> abs x = a \<longleftrightarrow> x = a \<or> x = - a"
+  have th: "\<And>(x::real) a. a \<ge> 0 \<Longrightarrow> \<bar>x\<bar> = a \<longleftrightarrow> x = a \<or> x = - a"
     by arith
   have "?rhs \<longleftrightarrow> norm x *\<^sub>R y = norm y *\<^sub>R x \<or> norm (- x) *\<^sub>R y = norm y *\<^sub>R (- x)"
     by simp
@@ -2945,7 +2959,7 @@
   apply (rule exI[where x="- 1"], simp)
   done
 
-lemma collinear_lemma: "collinear {0,x,y} \<longleftrightarrow> x = 0 \<or> y = 0 \<or> (\<exists>c. y = c *\<^sub>R x)"
+lemma collinear_lemma: "collinear {0, x, y} \<longleftrightarrow> x = 0 \<or> y = 0 \<or> (\<exists>c. y = c *\<^sub>R x)"
   (is "?lhs \<longleftrightarrow> ?rhs")
 proof -
   {
@@ -2990,7 +3004,7 @@
   ultimately show ?thesis by blast
 qed
 
-lemma norm_cauchy_schwarz_equal: "abs (x \<bullet> y) = norm x * norm y \<longleftrightarrow> collinear {0, x, y}"
+lemma norm_cauchy_schwarz_equal: "\<bar>x \<bullet> y\<bar> = norm x * norm y \<longleftrightarrow> collinear {0, x, y}"
   unfolding norm_cauchy_schwarz_abs_eq
   apply (cases "x=0", simp_all add: collinear_2)
   apply (cases "y=0", simp_all add: collinear_2 insert_commute)