| author | wenzelm | 
| Sat, 20 Jun 2015 20:17:29 +0200 | |
| changeset 60537 | 5398aa5a4df9 | 
| parent 60420 | 884f54e01427 | 
| child 60762 | bf0c76ccee8d | 
| permissions | -rw-r--r-- | 
| 44133 | 1 | (* Title: HOL/Multivariate_Analysis/Linear_Algebra.thy | 
| 2 | Author: Amine Chaieb, University of Cambridge | |
| 3 | *) | |
| 4 | ||
| 60420 | 5 | section \<open>Elementary linear algebra on Euclidean spaces\<close> | 
| 44133 | 6 | |
| 7 | theory Linear_Algebra | |
| 8 | imports | |
| 9 | Euclidean_Space | |
| 10 | "~~/src/HOL/Library/Infinite_Set" | |
| 11 | begin | |
| 12 | ||
| 13 | lemma cond_application_beta: "(if b then f else g) x = (if b then f x else g x)" | |
| 14 | by auto | |
| 15 | ||
| 16 | notation inner (infix "\<bullet>" 70) | |
| 17 | ||
| 53716 | 18 | lemma square_bound_lemma: | 
| 19 | fixes x :: real | |
| 20 | shows "x < (1 + x) * (1 + x)" | |
| 49522 | 21 | proof - | 
| 53406 | 22 | have "(x + 1/2)\<^sup>2 + 3/4 > 0" | 
| 23 | using zero_le_power2[of "x+1/2"] by arith | |
| 24 | then show ?thesis | |
| 25 | by (simp add: field_simps power2_eq_square) | |
| 44133 | 26 | qed | 
| 27 | ||
| 53406 | 28 | lemma square_continuous: | 
| 29 | fixes e :: real | |
| 56444 | 30 | shows "e > 0 \<Longrightarrow> \<exists>d. 0 < d \<and> (\<forall>y. \<bar>y - x\<bar> < d \<longrightarrow> \<bar>y * y - x * x\<bar> < e)" | 
| 60150 
bd773c47ad0b
New material about complex transcendental functions (especially Ln, Arg) and polynomials
 paulson <lp15@cam.ac.uk> parents: 
59865diff
changeset | 31 | using isCont_power[OF continuous_ident, of x, unfolded isCont_def LIM_eq, rule_format, of e 2] | 
| 60303 | 32 | by (force simp add: power2_eq_square) | 
| 44133 | 33 | |
| 60420 | 34 | text\<open>Hence derive more interesting properties of the norm.\<close> | 
| 44133 | 35 | |
| 53406 | 36 | lemma norm_eq_0_dot: "norm x = 0 \<longleftrightarrow> x \<bullet> x = (0::real)" | 
| 44666 | 37 | by simp (* TODO: delete *) | 
| 44133 | 38 | |
| 39 | lemma norm_triangle_sub: | |
| 40 | fixes x y :: "'a::real_normed_vector" | |
| 53406 | 41 | shows "norm x \<le> norm y + norm (x - y)" | 
| 44133 | 42 | using norm_triangle_ineq[of "y" "x - y"] by (simp add: field_simps) | 
| 43 | ||
| 53406 | 44 | lemma norm_le: "norm x \<le> norm y \<longleftrightarrow> x \<bullet> x \<le> y \<bullet> y" | 
| 44133 | 45 | by (simp add: norm_eq_sqrt_inner) | 
| 44666 | 46 | |
| 53406 | 47 | lemma norm_lt: "norm x < norm y \<longleftrightarrow> x \<bullet> x < y \<bullet> y" | 
| 48 | by (simp add: norm_eq_sqrt_inner) | |
| 49 | ||
| 50 | lemma norm_eq: "norm x = norm y \<longleftrightarrow> x \<bullet> x = y \<bullet> y" | |
| 49522 | 51 | apply (subst order_eq_iff) | 
| 52 | apply (auto simp: norm_le) | |
| 53 | done | |
| 44666 | 54 | |
| 53406 | 55 | lemma norm_eq_1: "norm x = 1 \<longleftrightarrow> x \<bullet> x = 1" | 
| 44666 | 56 | by (simp add: norm_eq_sqrt_inner) | 
| 44133 | 57 | |
| 60420 | 58 | text\<open>Squaring equations and inequalities involving norms.\<close> | 
| 44133 | 59 | |
| 53077 | 60 | lemma dot_square_norm: "x \<bullet> x = (norm x)\<^sup>2" | 
| 44666 | 61 | by (simp only: power2_norm_eq_inner) (* TODO: move? *) | 
| 44133 | 62 | |
| 53406 | 63 | lemma norm_eq_square: "norm x = a \<longleftrightarrow> 0 \<le> a \<and> x \<bullet> x = a\<^sup>2" | 
| 44133 | 64 | by (auto simp add: norm_eq_sqrt_inner) | 
| 65 | ||
| 53406 | 66 | lemma norm_le_square: "norm x \<le> a \<longleftrightarrow> 0 \<le> a \<and> x \<bullet> x \<le> a\<^sup>2" | 
| 59865 
8a20dd967385
rationalised and generalised some theorems concerning abs and x^2.
 paulson <lp15@cam.ac.uk> parents: 
59557diff
changeset | 67 | apply (simp add: dot_square_norm abs_le_square_iff[symmetric]) | 
| 44133 | 68 | using norm_ge_zero[of x] | 
| 69 | apply arith | |
| 70 | done | |
| 71 | ||
| 53406 | 72 | lemma norm_ge_square: "norm x \<ge> a \<longleftrightarrow> a \<le> 0 \<or> x \<bullet> x \<ge> a\<^sup>2" | 
| 59865 
8a20dd967385
rationalised and generalised some theorems concerning abs and x^2.
 paulson <lp15@cam.ac.uk> parents: 
59557diff
changeset | 73 | apply (simp add: dot_square_norm abs_le_square_iff[symmetric]) | 
| 44133 | 74 | using norm_ge_zero[of x] | 
| 75 | apply arith | |
| 76 | done | |
| 77 | ||
| 53716 | 78 | lemma norm_lt_square: "norm x < a \<longleftrightarrow> 0 < a \<and> x \<bullet> x < a\<^sup>2" | 
| 44133 | 79 | by (metis not_le norm_ge_square) | 
| 53406 | 80 | |
| 53716 | 81 | lemma norm_gt_square: "norm x > a \<longleftrightarrow> a < 0 \<or> x \<bullet> x > a\<^sup>2" | 
| 44133 | 82 | by (metis norm_le_square not_less) | 
| 83 | ||
| 60420 | 84 | text\<open>Dot product in terms of the norm rather than conversely.\<close> | 
| 44133 | 85 | |
| 53406 | 86 | lemmas inner_simps = inner_add_left inner_add_right inner_diff_right inner_diff_left | 
| 49522 | 87 | inner_scaleR_left inner_scaleR_right | 
| 44133 | 88 | |
| 53077 | 89 | lemma dot_norm: "x \<bullet> y = ((norm (x + y))\<^sup>2 - (norm x)\<^sup>2 - (norm y)\<^sup>2) / 2" | 
| 53406 | 90 | unfolding power2_norm_eq_inner inner_simps inner_commute by auto | 
| 44133 | 91 | |
| 53077 | 92 | lemma dot_norm_neg: "x \<bullet> y = (((norm x)\<^sup>2 + (norm y)\<^sup>2) - (norm (x - y))\<^sup>2) / 2" | 
| 49525 | 93 | unfolding power2_norm_eq_inner inner_simps inner_commute | 
| 94 | by (auto simp add: algebra_simps) | |
| 44133 | 95 | |
| 60420 | 96 | text\<open>Equality of vectors in terms of @{term "op \<bullet>"} products.\<close>
 | 
| 44133 | 97 | |
| 53406 | 98 | lemma vector_eq: "x = y \<longleftrightarrow> x \<bullet> x = x \<bullet> y \<and> y \<bullet> y = x \<bullet> x" | 
| 99 | (is "?lhs \<longleftrightarrow> ?rhs") | |
| 44133 | 100 | proof | 
| 49652 | 101 | assume ?lhs | 
| 102 | then show ?rhs by simp | |
| 44133 | 103 | next | 
| 104 | assume ?rhs | |
| 53406 | 105 | then have "x \<bullet> x - x \<bullet> y = 0 \<and> x \<bullet> y - y \<bullet> y = 0" | 
| 106 | by simp | |
| 107 | then have "x \<bullet> (x - y) = 0 \<and> y \<bullet> (x - y) = 0" | |
| 108 | by (simp add: inner_diff inner_commute) | |
| 109 | then have "(x - y) \<bullet> (x - y) = 0" | |
| 110 | by (simp add: field_simps inner_diff inner_commute) | |
| 111 | then show "x = y" by simp | |
| 44133 | 112 | qed | 
| 113 | ||
| 114 | lemma norm_triangle_half_r: | |
| 53406 | 115 | "norm (y - x1) < e / 2 \<Longrightarrow> norm (y - x2) < e / 2 \<Longrightarrow> norm (x1 - x2) < e" | 
| 116 | using dist_triangle_half_r unfolding dist_norm[symmetric] by auto | |
| 44133 | 117 | |
| 49522 | 118 | lemma norm_triangle_half_l: | 
| 53406 | 119 | assumes "norm (x - y) < e / 2" | 
| 53842 | 120 | and "norm (x' - y) < e / 2" | 
| 44133 | 121 | shows "norm (x - x') < e" | 
| 53406 | 122 | using dist_triangle_half_l[OF assms[unfolded dist_norm[symmetric]]] | 
| 123 | unfolding dist_norm[symmetric] . | |
| 124 | ||
| 125 | lemma norm_triangle_le: "norm x + norm y \<le> e \<Longrightarrow> norm (x + y) \<le> e" | |
| 44666 | 126 | by (rule norm_triangle_ineq [THEN order_trans]) | 
| 44133 | 127 | |
| 53406 | 128 | lemma norm_triangle_lt: "norm x + norm y < e \<Longrightarrow> norm (x + y) < e" | 
| 44666 | 129 | by (rule norm_triangle_ineq [THEN le_less_trans]) | 
| 44133 | 130 | |
| 131 | lemma setsum_clauses: | |
| 132 |   shows "setsum f {} = 0"
 | |
| 49525 | 133 | and "finite S \<Longrightarrow> setsum f (insert x S) = (if x \<in> S then setsum f S else f x + setsum f S)" | 
| 44133 | 134 | by (auto simp add: insert_absorb) | 
| 135 | ||
| 136 | lemma setsum_norm_le: | |
| 137 | fixes f :: "'a \<Rightarrow> 'b::real_normed_vector" | |
| 44176 
eda112e9cdee
remove redundant lemma setsum_norm in favor of norm_setsum;
 huffman parents: 
44170diff
changeset | 138 | assumes fg: "\<forall>x \<in> S. norm (f x) \<le> g x" | 
| 44133 | 139 | shows "norm (setsum f S) \<le> setsum g S" | 
| 49522 | 140 | by (rule order_trans [OF norm_setsum setsum_mono]) (simp add: fg) | 
| 44133 | 141 | |
| 142 | lemma setsum_norm_bound: | |
| 143 | fixes f :: "'a \<Rightarrow> 'b::real_normed_vector" | |
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 144 | assumes K: "\<forall>x \<in> S. norm (f x) \<le> K" | 
| 44133 | 145 | shows "norm (setsum f S) \<le> of_nat (card S) * K" | 
| 44176 
eda112e9cdee
remove redundant lemma setsum_norm in favor of norm_setsum;
 huffman parents: 
44170diff
changeset | 146 | using setsum_norm_le[OF K] setsum_constant[symmetric] | 
| 44133 | 147 | by simp | 
| 148 | ||
| 149 | lemma setsum_group: | |
| 150 | assumes fS: "finite S" and fT: "finite T" and fST: "f ` S \<subseteq> T" | |
| 53939 | 151 |   shows "setsum (\<lambda>y. setsum g {x. x \<in> S \<and> f x = y}) T = setsum g S"
 | 
| 44133 | 152 | apply (subst setsum_image_gen[OF fS, of g f]) | 
| 57418 | 153 | apply (rule setsum.mono_neutral_right[OF fT fST]) | 
| 154 | apply (auto intro: setsum.neutral) | |
| 49522 | 155 | done | 
| 44133 | 156 | |
| 157 | lemma vector_eq_ldot: "(\<forall>x. x \<bullet> y = x \<bullet> z) \<longleftrightarrow> y = z" | |
| 158 | proof | |
| 159 | assume "\<forall>x. x \<bullet> y = x \<bullet> z" | |
| 53406 | 160 | then have "\<forall>x. x \<bullet> (y - z) = 0" | 
| 161 | by (simp add: inner_diff) | |
| 49522 | 162 | then have "(y - z) \<bullet> (y - z) = 0" .. | 
| 49652 | 163 | then show "y = z" by simp | 
| 44133 | 164 | qed simp | 
| 165 | ||
| 166 | lemma vector_eq_rdot: "(\<forall>z. x \<bullet> z = y \<bullet> z) \<longleftrightarrow> x = y" | |
| 167 | proof | |
| 168 | assume "\<forall>z. x \<bullet> z = y \<bullet> z" | |
| 53406 | 169 | then have "\<forall>z. (x - y) \<bullet> z = 0" | 
| 170 | by (simp add: inner_diff) | |
| 49522 | 171 | then have "(x - y) \<bullet> (x - y) = 0" .. | 
| 49652 | 172 | then show "x = y" by simp | 
| 44133 | 173 | qed simp | 
| 174 | ||
| 49522 | 175 | |
| 60420 | 176 | subsection \<open>Orthogonality.\<close> | 
| 44133 | 177 | |
| 178 | context real_inner | |
| 179 | begin | |
| 180 | ||
| 53842 | 181 | definition "orthogonal x y \<longleftrightarrow> x \<bullet> y = 0" | 
| 44133 | 182 | |
| 183 | lemma orthogonal_clauses: | |
| 184 | "orthogonal a 0" | |
| 185 | "orthogonal a x \<Longrightarrow> orthogonal a (c *\<^sub>R x)" | |
| 53842 | 186 | "orthogonal a x \<Longrightarrow> orthogonal a (- x)" | 
| 44133 | 187 | "orthogonal a x \<Longrightarrow> orthogonal a y \<Longrightarrow> orthogonal a (x + y)" | 
| 188 | "orthogonal a x \<Longrightarrow> orthogonal a y \<Longrightarrow> orthogonal a (x - y)" | |
| 189 | "orthogonal 0 a" | |
| 190 | "orthogonal x a \<Longrightarrow> orthogonal (c *\<^sub>R x) a" | |
| 53842 | 191 | "orthogonal x a \<Longrightarrow> orthogonal (- x) a" | 
| 44133 | 192 | "orthogonal x a \<Longrightarrow> orthogonal y a \<Longrightarrow> orthogonal (x + y) a" | 
| 193 | "orthogonal x a \<Longrightarrow> orthogonal y a \<Longrightarrow> orthogonal (x - y) a" | |
| 44666 | 194 | unfolding orthogonal_def inner_add inner_diff by auto | 
| 195 | ||
| 44133 | 196 | end | 
| 197 | ||
| 198 | lemma orthogonal_commute: "orthogonal x y \<longleftrightarrow> orthogonal y x" | |
| 199 | by (simp add: orthogonal_def inner_commute) | |
| 200 | ||
| 49522 | 201 | |
| 60420 | 202 | subsection \<open>Linear functions.\<close> | 
| 49522 | 203 | |
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 204 | lemma linear_iff: | 
| 53716 | 205 | "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)" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 206 | (is "linear f \<longleftrightarrow> ?rhs") | 
| 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 207 | proof | 
| 56444 | 208 | assume "linear f" | 
| 209 | then interpret f: linear f . | |
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 210 | show "?rhs" by (simp add: f.add f.scaleR) | 
| 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 211 | next | 
| 56444 | 212 | assume "?rhs" | 
| 213 | then show "linear f" by unfold_locales simp_all | |
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 214 | qed | 
| 44133 | 215 | |
| 53406 | 216 | lemma linear_compose_cmul: "linear f \<Longrightarrow> linear (\<lambda>x. c *\<^sub>R f x)" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 217 | by (simp add: linear_iff algebra_simps) | 
| 44133 | 218 | |
| 53406 | 219 | lemma linear_compose_neg: "linear f \<Longrightarrow> linear (\<lambda>x. - f x)" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 220 | by (simp add: linear_iff) | 
| 44133 | 221 | |
| 53406 | 222 | lemma linear_compose_add: "linear f \<Longrightarrow> linear g \<Longrightarrow> linear (\<lambda>x. f x + g x)" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 223 | by (simp add: linear_iff algebra_simps) | 
| 44133 | 224 | |
| 53406 | 225 | lemma linear_compose_sub: "linear f \<Longrightarrow> linear g \<Longrightarrow> linear (\<lambda>x. f x - g x)" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 226 | by (simp add: linear_iff algebra_simps) | 
| 44133 | 227 | |
| 53406 | 228 | lemma linear_compose: "linear f \<Longrightarrow> linear g \<Longrightarrow> linear (g \<circ> f)" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 229 | by (simp add: linear_iff) | 
| 44133 | 230 | |
| 53406 | 231 | lemma linear_id: "linear id" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 232 | by (simp add: linear_iff id_def) | 
| 53406 | 233 | |
| 234 | lemma linear_zero: "linear (\<lambda>x. 0)" | |
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 235 | by (simp add: linear_iff) | 
| 44133 | 236 | |
| 237 | lemma linear_compose_setsum: | |
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 238 | assumes lS: "\<forall>a \<in> S. linear (f a)" | 
| 53716 | 239 | shows "linear (\<lambda>x. setsum (\<lambda>a. f a x) S)" | 
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 240 | proof (cases "finite S") | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 241 | case True | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 242 | then show ?thesis | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 243 | using lS by induct (simp_all add: linear_zero linear_compose_add) | 
| 56444 | 244 | next | 
| 245 | case False | |
| 246 | then show ?thesis | |
| 247 | by (simp add: linear_zero) | |
| 248 | qed | |
| 44133 | 249 | |
| 250 | lemma linear_0: "linear f \<Longrightarrow> f 0 = 0" | |
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 251 | unfolding linear_iff | 
| 44133 | 252 | apply clarsimp | 
| 253 | apply (erule allE[where x="0::'a"]) | |
| 254 | apply simp | |
| 255 | done | |
| 256 | ||
| 53406 | 257 | lemma linear_cmul: "linear f \<Longrightarrow> f (c *\<^sub>R x) = c *\<^sub>R f x" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 258 | by (simp add: linear_iff) | 
| 44133 | 259 | |
| 53406 | 260 | lemma linear_neg: "linear f \<Longrightarrow> f (- x) = - f x" | 
| 44133 | 261 | using linear_cmul [where c="-1"] by simp | 
| 262 | ||
| 53716 | 263 | lemma linear_add: "linear f \<Longrightarrow> f (x + y) = f x + f y" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 264 | by (metis linear_iff) | 
| 44133 | 265 | |
| 53716 | 266 | lemma linear_sub: "linear f \<Longrightarrow> f (x - y) = f x - f y" | 
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53939diff
changeset | 267 | using linear_add [of f x "- y"] by (simp add: linear_neg) | 
| 44133 | 268 | |
| 269 | lemma linear_setsum: | |
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 270 | assumes f: "linear f" | 
| 53406 | 271 | shows "f (setsum g S) = setsum (f \<circ> g) S" | 
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 272 | proof (cases "finite S") | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 273 | case True | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 274 | then show ?thesis | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 275 | by induct (simp_all add: linear_0 [OF f] linear_add [OF f]) | 
| 56444 | 276 | next | 
| 277 | case False | |
| 278 | then show ?thesis | |
| 279 | by (simp add: linear_0 [OF f]) | |
| 280 | qed | |
| 44133 | 281 | |
| 282 | lemma linear_setsum_mul: | |
| 53406 | 283 | assumes lin: "linear f" | 
| 44133 | 284 | shows "f (setsum (\<lambda>i. c i *\<^sub>R v i) S) = setsum (\<lambda>i. c i *\<^sub>R f (v i)) S" | 
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 285 | using linear_setsum[OF lin, of "\<lambda>i. c i *\<^sub>R v i" , unfolded o_def] linear_cmul[OF lin] | 
| 49522 | 286 | by simp | 
| 44133 | 287 | |
| 288 | lemma linear_injective_0: | |
| 53406 | 289 | assumes lin: "linear f" | 
| 44133 | 290 | shows "inj f \<longleftrightarrow> (\<forall>x. f x = 0 \<longrightarrow> x = 0)" | 
| 49663 | 291 | proof - | 
| 53406 | 292 | have "inj f \<longleftrightarrow> (\<forall> x y. f x = f y \<longrightarrow> x = y)" | 
| 293 | by (simp add: inj_on_def) | |
| 294 | also have "\<dots> \<longleftrightarrow> (\<forall> x y. f x - f y = 0 \<longrightarrow> x - y = 0)" | |
| 295 | by simp | |
| 44133 | 296 | also have "\<dots> \<longleftrightarrow> (\<forall> x y. f (x - y) = 0 \<longrightarrow> x - y = 0)" | 
| 53406 | 297 | by (simp add: linear_sub[OF lin]) | 
| 298 | also have "\<dots> \<longleftrightarrow> (\<forall> x. f x = 0 \<longrightarrow> x = 0)" | |
| 299 | by auto | |
| 44133 | 300 | finally show ?thesis . | 
| 301 | qed | |
| 302 | ||
| 49522 | 303 | |
| 60420 | 304 | subsection \<open>Bilinear functions.\<close> | 
| 44133 | 305 | |
| 53406 | 306 | definition "bilinear f \<longleftrightarrow> (\<forall>x. linear (\<lambda>y. f x y)) \<and> (\<forall>y. linear (\<lambda>x. f x y))" | 
| 307 | ||
| 308 | lemma bilinear_ladd: "bilinear h \<Longrightarrow> h (x + y) z = h x z + h y z" | |
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 309 | by (simp add: bilinear_def linear_iff) | 
| 49663 | 310 | |
| 53406 | 311 | lemma bilinear_radd: "bilinear h \<Longrightarrow> h x (y + z) = h x y + h x z" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 312 | by (simp add: bilinear_def linear_iff) | 
| 44133 | 313 | |
| 53406 | 314 | lemma bilinear_lmul: "bilinear h \<Longrightarrow> h (c *\<^sub>R x) y = c *\<^sub>R h x y" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 315 | by (simp add: bilinear_def linear_iff) | 
| 44133 | 316 | |
| 53406 | 317 | lemma bilinear_rmul: "bilinear h \<Longrightarrow> h x (c *\<^sub>R y) = c *\<^sub>R h x y" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 318 | by (simp add: bilinear_def linear_iff) | 
| 44133 | 319 | |
| 53406 | 320 | lemma bilinear_lneg: "bilinear h \<Longrightarrow> h (- x) y = - h x y" | 
| 54489 
03ff4d1e6784
eliminiated neg_numeral in favour of - (numeral _)
 haftmann parents: 
54413diff
changeset | 321 | by (drule bilinear_lmul [of _ "- 1"]) simp | 
| 44133 | 322 | |
| 53406 | 323 | lemma bilinear_rneg: "bilinear h \<Longrightarrow> h x (- y) = - h x y" | 
| 54489 
03ff4d1e6784
eliminiated neg_numeral in favour of - (numeral _)
 haftmann parents: 
54413diff
changeset | 324 | by (drule bilinear_rmul [of _ _ "- 1"]) simp | 
| 44133 | 325 | |
| 53406 | 326 | lemma (in ab_group_add) eq_add_iff: "x = x + y \<longleftrightarrow> y = 0" | 
| 59557 | 327 | using add_left_imp_eq[of x y 0] by auto | 
| 44133 | 328 | |
| 53406 | 329 | lemma bilinear_lzero: | 
| 330 | assumes "bilinear h" | |
| 331 | shows "h 0 x = 0" | |
| 49663 | 332 | using bilinear_ladd [OF assms, of 0 0 x] by (simp add: eq_add_iff field_simps) | 
| 333 | ||
| 53406 | 334 | lemma bilinear_rzero: | 
| 335 | assumes "bilinear h" | |
| 336 | shows "h x 0 = 0" | |
| 49663 | 337 | using bilinear_radd [OF assms, of x 0 0 ] by (simp add: eq_add_iff field_simps) | 
| 44133 | 338 | |
| 53406 | 339 | lemma bilinear_lsub: "bilinear h \<Longrightarrow> h (x - y) z = h x z - h y z" | 
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53939diff
changeset | 340 | using bilinear_ladd [of h x "- y"] by (simp add: bilinear_lneg) | 
| 44133 | 341 | |
| 53406 | 342 | lemma bilinear_rsub: "bilinear h \<Longrightarrow> h z (x - y) = h z x - h z y" | 
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53939diff
changeset | 343 | using bilinear_radd [of h _ x "- y"] by (simp add: bilinear_rneg) | 
| 44133 | 344 | |
| 345 | lemma bilinear_setsum: | |
| 49663 | 346 | assumes bh: "bilinear h" | 
| 347 | and fS: "finite S" | |
| 348 | and fT: "finite T" | |
| 44133 | 349 | shows "h (setsum f S) (setsum g T) = setsum (\<lambda>(i,j). h (f i) (g j)) (S \<times> T) " | 
| 49522 | 350 | proof - | 
| 44133 | 351 | have "h (setsum f S) (setsum g T) = setsum (\<lambda>x. h (f x) (setsum g T)) S" | 
| 352 | apply (rule linear_setsum[unfolded o_def]) | |
| 53406 | 353 | using bh fS | 
| 354 | apply (auto simp add: bilinear_def) | |
| 49522 | 355 | done | 
| 44133 | 356 | also have "\<dots> = setsum (\<lambda>x. setsum (\<lambda>y. h (f x) (g y)) T) S" | 
| 57418 | 357 | apply (rule setsum.cong, simp) | 
| 44133 | 358 | apply (rule linear_setsum[unfolded o_def]) | 
| 49522 | 359 | using bh fT | 
| 360 | apply (auto simp add: bilinear_def) | |
| 361 | done | |
| 53406 | 362 | finally show ?thesis | 
| 57418 | 363 | unfolding setsum.cartesian_product . | 
| 44133 | 364 | qed | 
| 365 | ||
| 49522 | 366 | |
| 60420 | 367 | subsection \<open>Adjoints.\<close> | 
| 44133 | 368 | |
| 369 | definition "adjoint f = (SOME f'. \<forall>x y. f x \<bullet> y = x \<bullet> f' y)" | |
| 370 | ||
| 371 | lemma adjoint_unique: | |
| 372 | assumes "\<forall>x y. inner (f x) y = inner x (g y)" | |
| 373 | shows "adjoint f = g" | |
| 49522 | 374 | unfolding adjoint_def | 
| 44133 | 375 | proof (rule some_equality) | 
| 53406 | 376 | show "\<forall>x y. inner (f x) y = inner x (g y)" | 
| 377 | by (rule assms) | |
| 44133 | 378 | next | 
| 53406 | 379 | fix h | 
| 380 | assume "\<forall>x y. inner (f x) y = inner x (h y)" | |
| 381 | then have "\<forall>x y. inner x (g y) = inner x (h y)" | |
| 382 | using assms by simp | |
| 383 | then have "\<forall>x y. inner x (g y - h y) = 0" | |
| 384 | by (simp add: inner_diff_right) | |
| 385 | then have "\<forall>y. inner (g y - h y) (g y - h y) = 0" | |
| 386 | by simp | |
| 387 | then have "\<forall>y. h y = g y" | |
| 388 | by simp | |
| 49652 | 389 | then show "h = g" by (simp add: ext) | 
| 44133 | 390 | qed | 
| 391 | ||
| 60420 | 392 | text \<open>TODO: The following lemmas about adjoints should hold for any | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 393 | Hilbert space (i.e. complete inner product space). | 
| 54703 | 394 | (see @{url "http://en.wikipedia.org/wiki/Hermitian_adjoint"})
 | 
| 60420 | 395 | \<close> | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 396 | |
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 397 | lemma adjoint_works: | 
| 56444 | 398 | fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 399 | assumes lf: "linear f" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 400 | shows "x \<bullet> adjoint f y = f x \<bullet> y" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 401 | proof - | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 402 | have "\<forall>y. \<exists>w. \<forall>x. f x \<bullet> y = x \<bullet> w" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 403 | proof (intro allI exI) | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 404 | fix y :: "'m" and x | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 405 | let ?w = "(\<Sum>i\<in>Basis. (f i \<bullet> y) *\<^sub>R i) :: 'n" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 406 | have "f x \<bullet> y = f (\<Sum>i\<in>Basis. (x \<bullet> i) *\<^sub>R i) \<bullet> y" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 407 | by (simp add: euclidean_representation) | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 408 | also have "\<dots> = (\<Sum>i\<in>Basis. (x \<bullet> i) *\<^sub>R f i) \<bullet> y" | 
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 409 | unfolding linear_setsum[OF lf] | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 410 | by (simp add: linear_cmul[OF lf]) | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 411 | finally show "f x \<bullet> y = x \<bullet> ?w" | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 412 | by (simp add: inner_setsum_left inner_setsum_right mult.commute) | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 413 | qed | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 414 | then show ?thesis | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 415 | unfolding adjoint_def choice_iff | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 416 | by (intro someI2_ex[where Q="\<lambda>f'. x \<bullet> f' y = f x \<bullet> y"]) auto | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 417 | qed | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 418 | |
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 419 | lemma adjoint_clauses: | 
| 56444 | 420 | fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 421 | assumes lf: "linear f" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 422 | shows "x \<bullet> adjoint f y = f x \<bullet> y" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 423 | and "adjoint f y \<bullet> x = y \<bullet> f x" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 424 | by (simp_all add: adjoint_works[OF lf] inner_commute) | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 425 | |
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 426 | lemma adjoint_linear: | 
| 56444 | 427 | fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 428 | assumes lf: "linear f" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 429 | shows "linear (adjoint f)" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 430 | by (simp add: lf linear_iff euclidean_eq_iff[where 'a='n] euclidean_eq_iff[where 'a='m] | 
| 53939 | 431 | adjoint_clauses[OF lf] inner_distrib) | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 432 | |
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 433 | lemma adjoint_adjoint: | 
| 56444 | 434 | fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 435 | assumes lf: "linear f" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 436 | shows "adjoint (adjoint f) = f" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 437 | by (rule adjoint_unique, simp add: adjoint_clauses [OF lf]) | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 438 | |
| 53406 | 439 | |
| 60420 | 440 | subsection \<open>Interlude: Some properties of real sets\<close> | 
| 44133 | 441 | |
| 53406 | 442 | lemma seq_mono_lemma: | 
| 443 | assumes "\<forall>(n::nat) \<ge> m. (d n :: real) < e n" | |
| 444 | and "\<forall>n \<ge> m. e n \<le> e m" | |
| 44133 | 445 | shows "\<forall>n \<ge> m. d n < e m" | 
| 53406 | 446 | using assms | 
| 447 | apply auto | |
| 44133 | 448 | apply (erule_tac x="n" in allE) | 
| 449 | apply (erule_tac x="n" in allE) | |
| 450 | apply auto | |
| 451 | done | |
| 452 | ||
| 53406 | 453 | lemma infinite_enumerate: | 
| 454 | assumes fS: "infinite S" | |
| 44133 | 455 | shows "\<exists>r. subseq r \<and> (\<forall>n. r n \<in> S)" | 
| 49525 | 456 | unfolding subseq_def | 
| 457 | using enumerate_in_set[OF fS] enumerate_mono[of _ _ S] fS by auto | |
| 44133 | 458 | |
| 56444 | 459 | 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)" | 
| 49522 | 460 | apply auto | 
| 461 | apply (rule_tac x="d/2" in exI) | |
| 462 | apply auto | |
| 463 | done | |
| 44133 | 464 | |
| 465 | lemma triangle_lemma: | |
| 53406 | 466 | fixes x y z :: real | 
| 467 | assumes x: "0 \<le> x" | |
| 468 | and y: "0 \<le> y" | |
| 469 | and z: "0 \<le> z" | |
| 470 | and xy: "x\<^sup>2 \<le> y\<^sup>2 + z\<^sup>2" | |
| 471 | shows "x \<le> y + z" | |
| 49522 | 472 | proof - | 
| 56444 | 473 | have "y\<^sup>2 + z\<^sup>2 \<le> y\<^sup>2 + 2 * y * z + z\<^sup>2" | 
| 56536 | 474 | using z y by simp | 
| 53406 | 475 | with xy have th: "x\<^sup>2 \<le> (y + z)\<^sup>2" | 
| 476 | by (simp add: power2_eq_square field_simps) | |
| 477 | from y z have yz: "y + z \<ge> 0" | |
| 478 | by arith | |
| 44133 | 479 | from power2_le_imp_le[OF th yz] show ?thesis . | 
| 480 | qed | |
| 481 | ||
| 49522 | 482 | |
| 60420 | 483 | subsection \<open>A generic notion of "hull" (convex, affine, conic hull and closure).\<close> | 
| 44133 | 484 | |
| 53406 | 485 | definition hull :: "('a set \<Rightarrow> bool) \<Rightarrow> 'a set \<Rightarrow> 'a set"  (infixl "hull" 75)
 | 
| 486 |   where "S hull s = \<Inter>{t. S t \<and> s \<subseteq> t}"
 | |
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 487 | |
| 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 488 | lemma hull_same: "S s \<Longrightarrow> S hull s = s" | 
| 44133 | 489 | unfolding hull_def by auto | 
| 490 | ||
| 53406 | 491 | lemma hull_in: "(\<And>T. Ball T S \<Longrightarrow> S (\<Inter>T)) \<Longrightarrow> S (S hull s)" | 
| 49522 | 492 | unfolding hull_def Ball_def by auto | 
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 493 | |
| 53406 | 494 | lemma hull_eq: "(\<And>T. Ball T S \<Longrightarrow> S (\<Inter>T)) \<Longrightarrow> (S hull s) = s \<longleftrightarrow> S s" | 
| 49522 | 495 | using hull_same[of S s] hull_in[of S s] by metis | 
| 44133 | 496 | |
| 497 | lemma hull_hull: "S hull (S hull s) = S hull s" | |
| 498 | unfolding hull_def by blast | |
| 499 | ||
| 500 | lemma hull_subset[intro]: "s \<subseteq> (S hull s)" | |
| 501 | unfolding hull_def by blast | |
| 502 | ||
| 53406 | 503 | lemma hull_mono: "s \<subseteq> t \<Longrightarrow> (S hull s) \<subseteq> (S hull t)" | 
| 44133 | 504 | unfolding hull_def by blast | 
| 505 | ||
| 53406 | 506 | lemma hull_antimono: "\<forall>x. S x \<longrightarrow> T x \<Longrightarrow> (T hull s) \<subseteq> (S hull s)" | 
| 44133 | 507 | unfolding hull_def by blast | 
| 508 | ||
| 53406 | 509 | lemma hull_minimal: "s \<subseteq> t \<Longrightarrow> S t \<Longrightarrow> (S hull s) \<subseteq> t" | 
| 44133 | 510 | unfolding hull_def by blast | 
| 511 | ||
| 53406 | 512 | lemma subset_hull: "S t \<Longrightarrow> S hull s \<subseteq> t \<longleftrightarrow> s \<subseteq> t" | 
| 44133 | 513 | unfolding hull_def by blast | 
| 514 | ||
| 53596 | 515 | lemma hull_UNIV: "S hull UNIV = UNIV" | 
| 516 | unfolding hull_def by auto | |
| 517 | ||
| 53406 | 518 | lemma hull_unique: "s \<subseteq> t \<Longrightarrow> S t \<Longrightarrow> (\<And>t'. s \<subseteq> t' \<Longrightarrow> S t' \<Longrightarrow> t \<subseteq> t') \<Longrightarrow> (S hull s = t)" | 
| 49652 | 519 | unfolding hull_def by auto | 
| 44133 | 520 | |
| 521 | lemma hull_induct: "(\<And>x. x\<in> S \<Longrightarrow> P x) \<Longrightarrow> Q {x. P x} \<Longrightarrow> \<forall>x\<in> Q hull S. P x"
 | |
| 522 |   using hull_minimal[of S "{x. P x}" Q]
 | |
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 523 | by (auto simp add: subset_eq) | 
| 44133 | 524 | |
| 49522 | 525 | lemma hull_inc: "x \<in> S \<Longrightarrow> x \<in> P hull S" | 
| 526 | by (metis hull_subset subset_eq) | |
| 44133 | 527 | |
| 528 | lemma hull_union_subset: "(S hull s) \<union> (S hull t) \<subseteq> (S hull (s \<union> t))" | |
| 49522 | 529 | unfolding Un_subset_iff by (metis hull_mono Un_upper1 Un_upper2) | 
| 530 | ||
| 531 | lemma hull_union: | |
| 53406 | 532 | assumes T: "\<And>T. Ball T S \<Longrightarrow> S (\<Inter>T)" | 
| 44133 | 533 | shows "S hull (s \<union> t) = S hull (S hull s \<union> S hull t)" | 
| 49522 | 534 | apply rule | 
| 535 | apply (rule hull_mono) | |
| 536 | unfolding Un_subset_iff | |
| 537 | apply (metis hull_subset Un_upper1 Un_upper2 subset_trans) | |
| 538 | apply (rule hull_minimal) | |
| 539 | apply (metis hull_union_subset) | |
| 540 | apply (metis hull_in T) | |
| 541 | done | |
| 44133 | 542 | |
| 56444 | 543 | lemma hull_redundant_eq: "a \<in> (S hull s) \<longleftrightarrow> S hull (insert a s) = S hull s" | 
| 44133 | 544 | unfolding hull_def by blast | 
| 545 | ||
| 56444 | 546 | lemma hull_redundant: "a \<in> (S hull s) \<Longrightarrow> S hull (insert a s) = S hull s" | 
| 49522 | 547 | by (metis hull_redundant_eq) | 
| 548 | ||
| 44133 | 549 | |
| 60420 | 550 | subsection \<open>Archimedean properties and useful consequences\<close> | 
| 44133 | 551 | |
| 56444 | 552 | lemma real_arch_simple: "\<exists>n::nat. x \<le> real n" | 
| 44666 | 553 | unfolding real_of_nat_def by (rule ex_le_of_nat) | 
| 44133 | 554 | |
| 555 | lemma real_arch_inv: "0 < e \<longleftrightarrow> (\<exists>n::nat. n \<noteq> 0 \<and> 0 < inverse (real n) \<and> inverse (real n) < e)" | |
| 56480 
093ea91498e6
field_simps: better support for negation and division, and power
 hoelzl parents: 
56479diff
changeset | 556 | using reals_Archimedean[of e] less_trans[of 0 "1 / real n" e for n::nat] | 
| 
093ea91498e6
field_simps: better support for negation and division, and power
 hoelzl parents: 
56479diff
changeset | 557 | by (auto simp add: field_simps cong: conj_cong) | 
| 44133 | 558 | |
| 53406 | 559 | lemma real_pow_lbound: "0 \<le> x \<Longrightarrow> 1 + real n * x \<le> (1 + x) ^ n" | 
| 49522 | 560 | proof (induct n) | 
| 561 | case 0 | |
| 562 | then show ?case by simp | |
| 44133 | 563 | next | 
| 564 | case (Suc n) | |
| 53406 | 565 | then have h: "1 + real n * x \<le> (1 + x) ^ n" | 
| 566 | by simp | |
| 567 | from h have p: "1 \<le> (1 + x) ^ n" | |
| 568 | using Suc.prems by simp | |
| 569 | from h have "1 + real n * x + x \<le> (1 + x) ^ n + x" | |
| 570 | by simp | |
| 571 | also have "\<dots> \<le> (1 + x) ^ Suc n" | |
| 572 | apply (subst diff_le_0_iff_le[symmetric]) | |
| 60162 | 573 | using mult_left_mono[OF p Suc.prems] | 
| 44133 | 574 | apply (simp add: field_simps) | 
| 49522 | 575 | done | 
| 53406 | 576 | finally show ?case | 
| 577 | by (simp add: real_of_nat_Suc field_simps) | |
| 44133 | 578 | qed | 
| 579 | ||
| 53406 | 580 | lemma real_arch_pow: | 
| 581 | fixes x :: real | |
| 582 | assumes x: "1 < x" | |
| 583 | shows "\<exists>n. y < x^n" | |
| 49522 | 584 | proof - | 
| 53406 | 585 | from x have x0: "x - 1 > 0" | 
| 586 | by arith | |
| 44666 | 587 | from reals_Archimedean3[OF x0, rule_format, of y] | 
| 53406 | 588 | obtain n :: nat where n: "y < real n * (x - 1)" by metis | 
| 44133 | 589 | from x0 have x00: "x- 1 \<ge> 0" by arith | 
| 590 | from real_pow_lbound[OF x00, of n] n | |
| 591 | have "y < x^n" by auto | |
| 592 | then show ?thesis by metis | |
| 593 | qed | |
| 594 | ||
| 53406 | 595 | lemma real_arch_pow2: | 
| 596 | fixes x :: real | |
| 597 | shows "\<exists>n. x < 2^ n" | |
| 44133 | 598 | using real_arch_pow[of 2 x] by simp | 
| 599 | ||
| 49522 | 600 | lemma real_arch_pow_inv: | 
| 53406 | 601 | fixes x y :: real | 
| 602 | assumes y: "y > 0" | |
| 603 | and x1: "x < 1" | |
| 44133 | 604 | shows "\<exists>n. x^n < y" | 
| 53406 | 605 | proof (cases "x > 0") | 
| 606 | case True | |
| 607 | with x1 have ix: "1 < 1/x" by (simp add: field_simps) | |
| 608 | from real_arch_pow[OF ix, of "1/y"] | |
| 609 | obtain n where n: "1/y < (1/x)^n" by blast | |
| 60420 | 610 | then show ?thesis using y \<open>x > 0\<close> | 
| 56480 
093ea91498e6
field_simps: better support for negation and division, and power
 hoelzl parents: 
56479diff
changeset | 611 | by (auto simp add: field_simps) | 
| 53406 | 612 | next | 
| 613 | case False | |
| 614 | with y x1 show ?thesis | |
| 615 | apply auto | |
| 616 | apply (rule exI[where x=1]) | |
| 617 | apply auto | |
| 618 | done | |
| 44133 | 619 | qed | 
| 620 | ||
| 49522 | 621 | lemma forall_pos_mono: | 
| 53406 | 622 | "(\<And>d e::real. d < e \<Longrightarrow> P d \<Longrightarrow> P e) \<Longrightarrow> | 
| 623 | (\<And>n::nat. n \<noteq> 0 \<Longrightarrow> P (inverse (real n))) \<Longrightarrow> (\<And>e. 0 < e \<Longrightarrow> P e)" | |
| 44133 | 624 | by (metis real_arch_inv) | 
| 625 | ||
| 49522 | 626 | lemma forall_pos_mono_1: | 
| 53406 | 627 | "(\<And>d e::real. d < e \<Longrightarrow> P d \<Longrightarrow> P e) \<Longrightarrow> | 
| 53716 | 628 | (\<And>n. P (inverse (real (Suc n)))) \<Longrightarrow> 0 < e \<Longrightarrow> P e" | 
| 44133 | 629 | apply (rule forall_pos_mono) | 
| 630 | apply auto | |
| 631 | apply (atomize) | |
| 632 | apply (erule_tac x="n - 1" in allE) | |
| 633 | apply auto | |
| 634 | done | |
| 635 | ||
| 49522 | 636 | lemma real_archimedian_rdiv_eq_0: | 
| 53406 | 637 | assumes x0: "x \<ge> 0" | 
| 638 | and c: "c \<ge> 0" | |
| 56444 | 639 | and xc: "\<forall>(m::nat) > 0. real m * x \<le> c" | 
| 44133 | 640 | shows "x = 0" | 
| 53406 | 641 | proof (rule ccontr) | 
| 642 | assume "x \<noteq> 0" | |
| 643 | with x0 have xp: "x > 0" by arith | |
| 644 | from reals_Archimedean3[OF xp, rule_format, of c] | |
| 645 | obtain n :: nat where n: "c < real n * x" | |
| 646 | by blast | |
| 647 | with xc[rule_format, of n] have "n = 0" | |
| 648 | by arith | |
| 649 | with n c show False | |
| 650 | by simp | |
| 44133 | 651 | qed | 
| 652 | ||
| 49522 | 653 | |
| 60420 | 654 | subsection\<open>A bit of linear algebra.\<close> | 
| 44133 | 655 | |
| 49522 | 656 | definition (in real_vector) subspace :: "'a set \<Rightarrow> bool" | 
| 56444 | 657 | 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)" | 
| 44133 | 658 | |
| 659 | definition (in real_vector) "span S = (subspace hull S)" | |
| 53716 | 660 | definition (in real_vector) "dependent S \<longleftrightarrow> (\<exists>a \<in> S. a \<in> span (S - {a}))"
 | 
| 53406 | 661 | abbreviation (in real_vector) "independent s \<equiv> \<not> dependent s" | 
| 44133 | 662 | |
| 60420 | 663 | text \<open>Closure properties of subspaces.\<close> | 
| 44133 | 664 | |
| 53406 | 665 | lemma subspace_UNIV[simp]: "subspace UNIV" | 
| 666 | by (simp add: subspace_def) | |
| 667 | ||
| 668 | lemma (in real_vector) subspace_0: "subspace S \<Longrightarrow> 0 \<in> S" | |
| 669 | by (metis subspace_def) | |
| 670 | ||
| 671 | lemma (in real_vector) subspace_add: "subspace S \<Longrightarrow> x \<in> S \<Longrightarrow> y \<in> S \<Longrightarrow> x + y \<in> S" | |
| 44133 | 672 | by (metis subspace_def) | 
| 673 | ||
| 674 | lemma (in real_vector) subspace_mul: "subspace S \<Longrightarrow> x \<in> S \<Longrightarrow> c *\<^sub>R x \<in> S" | |
| 675 | by (metis subspace_def) | |
| 676 | ||
| 677 | lemma subspace_neg: "subspace S \<Longrightarrow> x \<in> S \<Longrightarrow> - x \<in> S" | |
| 678 | by (metis scaleR_minus1_left subspace_mul) | |
| 679 | ||
| 680 | lemma subspace_sub: "subspace S \<Longrightarrow> x \<in> S \<Longrightarrow> y \<in> S \<Longrightarrow> x - y \<in> S" | |
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53939diff
changeset | 681 | using subspace_add [of S x "- y"] by (simp add: subspace_neg) | 
| 44133 | 682 | |
| 683 | lemma (in real_vector) subspace_setsum: | |
| 53406 | 684 | assumes sA: "subspace A" | 
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 685 | and f: "\<forall>x\<in>B. f x \<in> A" | 
| 44133 | 686 | shows "setsum f B \<in> A" | 
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 687 | proof (cases "finite B") | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 688 | case True | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 689 | then show ?thesis | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 690 | using f by induct (simp_all add: subspace_0 [OF sA] subspace_add [OF sA]) | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 691 | qed (simp add: subspace_0 [OF sA]) | 
| 44133 | 692 | |
| 693 | lemma subspace_linear_image: | |
| 53406 | 694 | assumes lf: "linear f" | 
| 695 | and sS: "subspace S" | |
| 696 | shows "subspace (f ` S)" | |
| 44133 | 697 | using lf sS linear_0[OF lf] | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 698 | unfolding linear_iff subspace_def | 
| 44133 | 699 | apply (auto simp add: image_iff) | 
| 53406 | 700 | apply (rule_tac x="x + y" in bexI) | 
| 701 | apply auto | |
| 702 | apply (rule_tac x="c *\<^sub>R x" in bexI) | |
| 703 | apply auto | |
| 44133 | 704 | done | 
| 705 | ||
| 44521 | 706 | lemma subspace_linear_vimage: "linear f \<Longrightarrow> subspace S \<Longrightarrow> subspace (f -` S)" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 707 | by (auto simp add: subspace_def linear_iff linear_0[of f]) | 
| 44521 | 708 | |
| 53406 | 709 | lemma subspace_linear_preimage: "linear f \<Longrightarrow> subspace S \<Longrightarrow> subspace {x. f x \<in> S}"
 | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 710 | by (auto simp add: subspace_def linear_iff linear_0[of f]) | 
| 44133 | 711 | |
| 712 | lemma subspace_trivial: "subspace {0}"
 | |
| 713 | by (simp add: subspace_def) | |
| 714 | ||
| 53406 | 715 | lemma (in real_vector) subspace_inter: "subspace A \<Longrightarrow> subspace B \<Longrightarrow> subspace (A \<inter> B)" | 
| 44133 | 716 | by (simp add: subspace_def) | 
| 717 | ||
| 53406 | 718 | lemma subspace_Times: "subspace A \<Longrightarrow> subspace B \<Longrightarrow> subspace (A \<times> B)" | 
| 44521 | 719 | unfolding subspace_def zero_prod_def by simp | 
| 720 | ||
| 60420 | 721 | text \<open>Properties of span.\<close> | 
| 44521 | 722 | |
| 53406 | 723 | lemma (in real_vector) span_mono: "A \<subseteq> B \<Longrightarrow> span A \<subseteq> span B" | 
| 44133 | 724 | by (metis span_def hull_mono) | 
| 725 | ||
| 53406 | 726 | lemma (in real_vector) subspace_span: "subspace (span S)" | 
| 44133 | 727 | unfolding span_def | 
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 728 | apply (rule hull_in) | 
| 44133 | 729 | apply (simp only: subspace_def Inter_iff Int_iff subset_eq) | 
| 730 | apply auto | |
| 731 | done | |
| 732 | ||
| 733 | lemma (in real_vector) span_clauses: | |
| 53406 | 734 | "a \<in> S \<Longrightarrow> a \<in> span S" | 
| 44133 | 735 | "0 \<in> span S" | 
| 53406 | 736 | "x\<in> span S \<Longrightarrow> y \<in> span S \<Longrightarrow> x + y \<in> span S" | 
| 44133 | 737 | "x \<in> span S \<Longrightarrow> c *\<^sub>R x \<in> span S" | 
| 53406 | 738 | by (metis span_def hull_subset subset_eq) (metis subspace_span subspace_def)+ | 
| 44133 | 739 | |
| 44521 | 740 | lemma span_unique: | 
| 49522 | 741 | "S \<subseteq> T \<Longrightarrow> subspace T \<Longrightarrow> (\<And>T'. S \<subseteq> T' \<Longrightarrow> subspace T' \<Longrightarrow> T \<subseteq> T') \<Longrightarrow> span S = T" | 
| 44521 | 742 | unfolding span_def by (rule hull_unique) | 
| 743 | ||
| 744 | lemma span_minimal: "S \<subseteq> T \<Longrightarrow> subspace T \<Longrightarrow> span S \<subseteq> T" | |
| 745 | unfolding span_def by (rule hull_minimal) | |
| 746 | ||
| 747 | lemma (in real_vector) span_induct: | |
| 49522 | 748 | assumes x: "x \<in> span S" | 
| 749 | and P: "subspace P" | |
| 53406 | 750 | and SP: "\<And>x. x \<in> S \<Longrightarrow> x \<in> P" | 
| 44521 | 751 | shows "x \<in> P" | 
| 49522 | 752 | proof - | 
| 53406 | 753 | from SP have SP': "S \<subseteq> P" | 
| 754 | by (simp add: subset_eq) | |
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 755 | from x hull_minimal[where S=subspace, OF SP' P, unfolded span_def[symmetric]] | 
| 53406 | 756 | show "x \<in> P" | 
| 757 | by (metis subset_eq) | |
| 44133 | 758 | qed | 
| 759 | ||
| 760 | lemma span_empty[simp]: "span {} = {0}"
 | |
| 761 | apply (simp add: span_def) | |
| 762 | apply (rule hull_unique) | |
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 763 | apply (auto simp add: subspace_def) | 
| 44133 | 764 | done | 
| 765 | ||
| 766 | lemma (in real_vector) independent_empty[intro]: "independent {}"
 | |
| 767 | by (simp add: dependent_def) | |
| 768 | ||
| 49522 | 769 | lemma dependent_single[simp]: "dependent {x} \<longleftrightarrow> x = 0"
 | 
| 44133 | 770 | unfolding dependent_def by auto | 
| 771 | ||
| 53406 | 772 | lemma (in real_vector) independent_mono: "independent A \<Longrightarrow> B \<subseteq> A \<Longrightarrow> independent B" | 
| 44133 | 773 | apply (clarsimp simp add: dependent_def span_mono) | 
| 774 |   apply (subgoal_tac "span (B - {a}) \<le> span (A - {a})")
 | |
| 775 | apply force | |
| 776 | apply (rule span_mono) | |
| 777 | apply auto | |
| 778 | done | |
| 779 | ||
| 780 | lemma (in real_vector) span_subspace: "A \<subseteq> B \<Longrightarrow> B \<le> span A \<Longrightarrow> subspace B \<Longrightarrow> span A = B" | |
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 781 | by (metis order_antisym span_def hull_minimal) | 
| 44133 | 782 | |
| 49711 | 783 | lemma (in real_vector) span_induct': | 
| 784 | assumes SP: "\<forall>x \<in> S. P x" | |
| 785 |     and P: "subspace {x. P x}"
 | |
| 786 | shows "\<forall>x \<in> span S. P x" | |
| 44133 | 787 | using span_induct SP P by blast | 
| 788 | ||
| 56444 | 789 | inductive_set (in real_vector) span_induct_alt_help for S :: "'a set" | 
| 53406 | 790 | where | 
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 791 | span_induct_alt_help_0: "0 \<in> span_induct_alt_help S" | 
| 49522 | 792 | | span_induct_alt_help_S: | 
| 53406 | 793 | "x \<in> S \<Longrightarrow> z \<in> span_induct_alt_help S \<Longrightarrow> | 
| 794 | (c *\<^sub>R x + z) \<in> span_induct_alt_help S" | |
| 44133 | 795 | |
| 796 | lemma span_induct_alt': | |
| 53406 | 797 | assumes h0: "h 0" | 
| 798 | and hS: "\<And>c x y. x \<in> S \<Longrightarrow> h y \<Longrightarrow> h (c *\<^sub>R x + y)" | |
| 49522 | 799 | shows "\<forall>x \<in> span S. h x" | 
| 800 | proof - | |
| 53406 | 801 |   {
 | 
| 802 | fix x :: 'a | |
| 803 | assume x: "x \<in> span_induct_alt_help S" | |
| 44133 | 804 | have "h x" | 
| 805 | apply (rule span_induct_alt_help.induct[OF x]) | |
| 806 | apply (rule h0) | |
| 53406 | 807 | apply (rule hS) | 
| 808 | apply assumption | |
| 809 | apply assumption | |
| 810 | done | |
| 811 | } | |
| 44133 | 812 | note th0 = this | 
| 53406 | 813 |   {
 | 
| 814 | fix x | |
| 815 | assume x: "x \<in> span S" | |
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 816 | have "x \<in> span_induct_alt_help S" | 
| 49522 | 817 | proof (rule span_induct[where x=x and S=S]) | 
| 53406 | 818 | show "x \<in> span S" by (rule x) | 
| 49522 | 819 | next | 
| 53406 | 820 | fix x | 
| 821 | assume xS: "x \<in> S" | |
| 822 | from span_induct_alt_help_S[OF xS span_induct_alt_help_0, of 1] | |
| 823 | show "x \<in> span_induct_alt_help S" | |
| 824 | by simp | |
| 49522 | 825 | next | 
| 826 | have "0 \<in> span_induct_alt_help S" by (rule span_induct_alt_help_0) | |
| 827 | moreover | |
| 53406 | 828 |       {
 | 
| 829 | fix x y | |
| 49522 | 830 | assume h: "x \<in> span_induct_alt_help S" "y \<in> span_induct_alt_help S" | 
| 831 | from h have "(x + y) \<in> span_induct_alt_help S" | |
| 832 | apply (induct rule: span_induct_alt_help.induct) | |
| 833 | apply simp | |
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 834 | unfolding add.assoc | 
| 49522 | 835 | apply (rule span_induct_alt_help_S) | 
| 836 | apply assumption | |
| 837 | apply simp | |
| 53406 | 838 | done | 
| 839 | } | |
| 49522 | 840 | moreover | 
| 53406 | 841 |       {
 | 
| 842 | fix c x | |
| 49522 | 843 | assume xt: "x \<in> span_induct_alt_help S" | 
| 844 | then have "(c *\<^sub>R x) \<in> span_induct_alt_help S" | |
| 845 | apply (induct rule: span_induct_alt_help.induct) | |
| 846 | apply (simp add: span_induct_alt_help_0) | |
| 847 | apply (simp add: scaleR_right_distrib) | |
| 848 | apply (rule span_induct_alt_help_S) | |
| 849 | apply assumption | |
| 850 | apply simp | |
| 851 | done } | |
| 53406 | 852 | ultimately show "subspace (span_induct_alt_help S)" | 
| 49522 | 853 | unfolding subspace_def Ball_def by blast | 
| 53406 | 854 | qed | 
| 855 | } | |
| 44133 | 856 | with th0 show ?thesis by blast | 
| 857 | qed | |
| 858 | ||
| 859 | lemma span_induct_alt: | |
| 53406 | 860 | assumes h0: "h 0" | 
| 861 | and hS: "\<And>c x y. x \<in> S \<Longrightarrow> h y \<Longrightarrow> h (c *\<^sub>R x + y)" | |
| 862 | and x: "x \<in> span S" | |
| 44133 | 863 | shows "h x" | 
| 49522 | 864 | using span_induct_alt'[of h S] h0 hS x by blast | 
| 44133 | 865 | |
| 60420 | 866 | text \<open>Individual closure properties.\<close> | 
| 44133 | 867 | |
| 868 | lemma span_span: "span (span A) = span A" | |
| 869 | unfolding span_def hull_hull .. | |
| 870 | ||
| 53406 | 871 | lemma (in real_vector) span_superset: "x \<in> S \<Longrightarrow> x \<in> span S" | 
| 872 | by (metis span_clauses(1)) | |
| 873 | ||
| 874 | lemma (in real_vector) span_0: "0 \<in> span S" | |
| 875 | by (metis subspace_span subspace_0) | |
| 44133 | 876 | |
| 877 | lemma span_inc: "S \<subseteq> span S" | |
| 878 | by (metis subset_eq span_superset) | |
| 879 | ||
| 53406 | 880 | lemma (in real_vector) dependent_0: | 
| 881 | assumes "0 \<in> A" | |
| 882 | shows "dependent A" | |
| 883 | unfolding dependent_def | |
| 884 | using assms span_0 | |
| 60162 | 885 | by auto | 
| 53406 | 886 | |
| 887 | lemma (in real_vector) span_add: "x \<in> span S \<Longrightarrow> y \<in> span S \<Longrightarrow> x + y \<in> span S" | |
| 44133 | 888 | by (metis subspace_add subspace_span) | 
| 889 | ||
| 53406 | 890 | lemma (in real_vector) span_mul: "x \<in> span S \<Longrightarrow> c *\<^sub>R x \<in> span S" | 
| 44133 | 891 | by (metis subspace_span subspace_mul) | 
| 892 | ||
| 53406 | 893 | lemma span_neg: "x \<in> span S \<Longrightarrow> - x \<in> span S" | 
| 44133 | 894 | by (metis subspace_neg subspace_span) | 
| 895 | ||
| 53406 | 896 | lemma span_sub: "x \<in> span S \<Longrightarrow> y \<in> span S \<Longrightarrow> x - y \<in> span S" | 
| 44133 | 897 | by (metis subspace_span subspace_sub) | 
| 898 | ||
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 899 | lemma (in real_vector) span_setsum: "\<forall>x\<in>A. f x \<in> span S \<Longrightarrow> setsum f A \<in> span S" | 
| 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 900 | by (rule subspace_setsum [OF subspace_span]) | 
| 44133 | 901 | |
| 902 | lemma span_add_eq: "x \<in> span S \<Longrightarrow> x + y \<in> span S \<longleftrightarrow> y \<in> span S" | |
| 55775 | 903 | by (metis add_minus_cancel scaleR_minus1_left subspace_def subspace_span) | 
| 44133 | 904 | |
| 60420 | 905 | text \<open>Mapping under linear image.\<close> | 
| 44133 | 906 | |
| 44521 | 907 | lemma span_linear_image: | 
| 908 | assumes lf: "linear f" | |
| 56444 | 909 | shows "span (f ` S) = f ` span S" | 
| 44521 | 910 | proof (rule span_unique) | 
| 911 | show "f ` S \<subseteq> f ` span S" | |
| 912 | by (intro image_mono span_inc) | |
| 913 | show "subspace (f ` span S)" | |
| 914 | using lf subspace_span by (rule subspace_linear_image) | |
| 915 | next | |
| 53406 | 916 | fix T | 
| 917 | assume "f ` S \<subseteq> T" and "subspace T" | |
| 49522 | 918 | then show "f ` span S \<subseteq> T" | 
| 44521 | 919 | unfolding image_subset_iff_subset_vimage | 
| 920 | by (intro span_minimal subspace_linear_vimage lf) | |
| 921 | qed | |
| 922 | ||
| 923 | lemma span_union: "span (A \<union> B) = (\<lambda>(a, b). a + b) ` (span A \<times> span B)" | |
| 924 | proof (rule span_unique) | |
| 925 | show "A \<union> B \<subseteq> (\<lambda>(a, b). a + b) ` (span A \<times> span B)" | |
| 926 | by safe (force intro: span_clauses)+ | |
| 927 | next | |
| 928 | have "linear (\<lambda>(a, b). a + b)" | |
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 929 | by (simp add: linear_iff scaleR_add_right) | 
| 44521 | 930 | moreover have "subspace (span A \<times> span B)" | 
| 931 | by (intro subspace_Times subspace_span) | |
| 932 | ultimately show "subspace ((\<lambda>(a, b). a + b) ` (span A \<times> span B))" | |
| 933 | by (rule subspace_linear_image) | |
| 934 | next | |
| 49711 | 935 | fix T | 
| 936 | assume "A \<union> B \<subseteq> T" and "subspace T" | |
| 49522 | 937 | then show "(\<lambda>(a, b). a + b) ` (span A \<times> span B) \<subseteq> T" | 
| 44521 | 938 | by (auto intro!: subspace_add elim: span_induct) | 
| 44133 | 939 | qed | 
| 940 | ||
| 60420 | 941 | text \<open>The key breakdown property.\<close> | 
| 44133 | 942 | |
| 44521 | 943 | lemma span_singleton: "span {x} = range (\<lambda>k. k *\<^sub>R x)"
 | 
| 944 | proof (rule span_unique) | |
| 945 |   show "{x} \<subseteq> range (\<lambda>k. k *\<^sub>R x)"
 | |
| 946 | by (fast intro: scaleR_one [symmetric]) | |
| 947 | show "subspace (range (\<lambda>k. k *\<^sub>R x))" | |
| 948 | unfolding subspace_def | |
| 949 | by (auto intro: scaleR_add_left [symmetric]) | |
| 53406 | 950 | next | 
| 951 | fix T | |
| 952 |   assume "{x} \<subseteq> T" and "subspace T"
 | |
| 953 | then show "range (\<lambda>k. k *\<^sub>R x) \<subseteq> T" | |
| 44521 | 954 | unfolding subspace_def by auto | 
| 955 | qed | |
| 956 | ||
| 49522 | 957 | lemma span_insert: "span (insert a S) = {x. \<exists>k. (x - k *\<^sub>R a) \<in> span S}"
 | 
| 44521 | 958 | proof - | 
| 959 |   have "span ({a} \<union> S) = {x. \<exists>k. (x - k *\<^sub>R a) \<in> span S}"
 | |
| 960 | unfolding span_union span_singleton | |
| 961 | apply safe | |
| 962 | apply (rule_tac x=k in exI, simp) | |
| 963 | apply (erule rev_image_eqI [OF SigmaI [OF rangeI]]) | |
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53939diff
changeset | 964 | apply auto | 
| 44521 | 965 | done | 
| 49522 | 966 | then show ?thesis by simp | 
| 44521 | 967 | qed | 
| 968 | ||
| 44133 | 969 | lemma span_breakdown: | 
| 53406 | 970 | assumes bS: "b \<in> S" | 
| 971 | and aS: "a \<in> span S" | |
| 44521 | 972 |   shows "\<exists>k. a - k *\<^sub>R b \<in> span (S - {b})"
 | 
| 973 |   using assms span_insert [of b "S - {b}"]
 | |
| 974 | by (simp add: insert_absorb) | |
| 44133 | 975 | |
| 53406 | 976 | lemma span_breakdown_eq: "x \<in> span (insert a S) \<longleftrightarrow> (\<exists>k. x - k *\<^sub>R a \<in> span S)" | 
| 44521 | 977 | by (simp add: span_insert) | 
| 44133 | 978 | |
| 60420 | 979 | text \<open>Hence some "reversal" results.\<close> | 
| 44133 | 980 | |
| 981 | lemma in_span_insert: | |
| 49711 | 982 | assumes a: "a \<in> span (insert b S)" | 
| 983 | and na: "a \<notin> span S" | |
| 44133 | 984 | shows "b \<in> span (insert a S)" | 
| 49663 | 985 | proof - | 
| 55910 | 986 | from a obtain k where k: "a - k *\<^sub>R b \<in> span S" | 
| 987 | unfolding span_insert by fast | |
| 53406 | 988 | show ?thesis | 
| 989 | proof (cases "k = 0") | |
| 990 | case True | |
| 55910 | 991 | with k have "a \<in> span S" by simp | 
| 992 | with na show ?thesis by simp | |
| 53406 | 993 | next | 
| 994 | case False | |
| 55910 | 995 | from k have "(- inverse k) *\<^sub>R (a - k *\<^sub>R b) \<in> span S" | 
| 44133 | 996 | by (rule span_mul) | 
| 55910 | 997 | then have "b - inverse k *\<^sub>R a \<in> span S" | 
| 60420 | 998 | using \<open>k \<noteq> 0\<close> by (simp add: scaleR_diff_right) | 
| 55910 | 999 | then show ?thesis | 
| 1000 | unfolding span_insert by fast | |
| 53406 | 1001 | qed | 
| 44133 | 1002 | qed | 
| 1003 | ||
| 1004 | lemma in_span_delete: | |
| 1005 | assumes a: "a \<in> span S" | |
| 53716 | 1006 |     and na: "a \<notin> span (S - {b})"
 | 
| 44133 | 1007 |   shows "b \<in> span (insert a (S - {b}))"
 | 
| 1008 | apply (rule in_span_insert) | |
| 1009 | apply (rule set_rev_mp) | |
| 1010 | apply (rule a) | |
| 1011 | apply (rule span_mono) | |
| 1012 | apply blast | |
| 1013 | apply (rule na) | |
| 1014 | done | |
| 1015 | ||
| 60420 | 1016 | text \<open>Transitivity property.\<close> | 
| 44133 | 1017 | |
| 44521 | 1018 | lemma span_redundant: "x \<in> span S \<Longrightarrow> span (insert x S) = span S" | 
| 1019 | unfolding span_def by (rule hull_redundant) | |
| 1020 | ||
| 44133 | 1021 | lemma span_trans: | 
| 53406 | 1022 | assumes x: "x \<in> span S" | 
| 1023 | and y: "y \<in> span (insert x S)" | |
| 44133 | 1024 | shows "y \<in> span S" | 
| 44521 | 1025 | using assms by (simp only: span_redundant) | 
| 44133 | 1026 | |
| 1027 | lemma span_insert_0[simp]: "span (insert 0 S) = span S" | |
| 44521 | 1028 | by (simp only: span_redundant span_0) | 
| 44133 | 1029 | |
| 60420 | 1030 | text \<open>An explicit expansion is sometimes needed.\<close> | 
| 44133 | 1031 | |
| 1032 | lemma span_explicit: | |
| 1033 |   "span P = {y. \<exists>S u. finite S \<and> S \<subseteq> P \<and> setsum (\<lambda>v. u v *\<^sub>R v) S = y}"
 | |
| 1034 |   (is "_ = ?E" is "_ = {y. ?h y}" is "_ = {y. \<exists>S u. ?Q S u y}")
 | |
| 49663 | 1035 | proof - | 
| 53406 | 1036 |   {
 | 
| 1037 | fix x | |
| 55910 | 1038 | assume "?h x" | 
| 1039 | then obtain S u where "finite S" and "S \<subseteq> P" and "setsum (\<lambda>v. u v *\<^sub>R v) S = x" | |
| 44133 | 1040 | by blast | 
| 55910 | 1041 | then have "x \<in> span P" | 
| 1042 | by (auto intro: span_setsum span_mul span_superset) | |
| 53406 | 1043 | } | 
| 44133 | 1044 | moreover | 
| 55910 | 1045 | have "\<forall>x \<in> span P. ?h x" | 
| 49522 | 1046 | proof (rule span_induct_alt') | 
| 55910 | 1047 | show "?h 0" | 
| 1048 |       by (rule exI[where x="{}"], simp)
 | |
| 44133 | 1049 | next | 
| 1050 | fix c x y | |
| 53406 | 1051 | assume x: "x \<in> P" | 
| 55910 | 1052 | assume hy: "?h y" | 
| 44133 | 1053 | from hy obtain S u where fS: "finite S" and SP: "S\<subseteq>P" | 
| 1054 | and u: "setsum (\<lambda>v. u v *\<^sub>R v) S = y" by blast | |
| 1055 | let ?S = "insert x S" | |
| 49522 | 1056 | let ?u = "\<lambda>y. if y = x then (if x \<in> S then u y + c else c) else u y" | 
| 53406 | 1057 | from fS SP x have th0: "finite (insert x S)" "insert x S \<subseteq> P" | 
| 1058 | by blast+ | |
| 1059 | have "?Q ?S ?u (c*\<^sub>R x + y)" | |
| 1060 | proof cases | |
| 1061 | assume xS: "x \<in> S" | |
| 55910 | 1062 |       have "setsum (\<lambda>v. ?u v *\<^sub>R v) ?S = (\<Sum>v\<in>S - {x}. u v *\<^sub>R v) + (u x + c) *\<^sub>R x"
 | 
| 1063 | using xS by (simp add: setsum.remove [OF fS xS] insert_absorb) | |
| 44133 | 1064 | also have "\<dots> = (\<Sum>v\<in>S. u v *\<^sub>R v) + c *\<^sub>R x" | 
| 55910 | 1065 | by (simp add: setsum.remove [OF fS xS] algebra_simps) | 
| 44133 | 1066 | also have "\<dots> = c*\<^sub>R x + y" | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 1067 | by (simp add: add.commute u) | 
| 44133 | 1068 | finally have "setsum (\<lambda>v. ?u v *\<^sub>R v) ?S = c*\<^sub>R x + y" . | 
| 53406 | 1069 | then show ?thesis using th0 by blast | 
| 1070 | next | |
| 1071 | assume xS: "x \<notin> S" | |
| 49522 | 1072 | have th00: "(\<Sum>v\<in>S. (if v = x then c else u v) *\<^sub>R v) = y" | 
| 1073 | unfolding u[symmetric] | |
| 57418 | 1074 | apply (rule setsum.cong) | 
| 53406 | 1075 | using xS | 
| 1076 | apply auto | |
| 49522 | 1077 | done | 
| 53406 | 1078 | show ?thesis using fS xS th0 | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 1079 | by (simp add: th00 add.commute cong del: if_weak_cong) | 
| 53406 | 1080 | qed | 
| 55910 | 1081 | then show "?h (c*\<^sub>R x + y)" | 
| 1082 | by fast | |
| 44133 | 1083 | qed | 
| 1084 | ultimately show ?thesis by blast | |
| 1085 | qed | |
| 1086 | ||
| 1087 | lemma dependent_explicit: | |
| 49522 | 1088 | "dependent P \<longleftrightarrow> (\<exists>S u. finite S \<and> S \<subseteq> P \<and> (\<exists>v\<in>S. u v \<noteq> 0 \<and> setsum (\<lambda>v. u v *\<^sub>R v) S = 0))" | 
| 1089 | (is "?lhs = ?rhs") | |
| 1090 | proof - | |
| 53406 | 1091 |   {
 | 
| 1092 | assume dP: "dependent P" | |
| 44133 | 1093 | then obtain a S u where aP: "a \<in> P" and fS: "finite S" | 
| 1094 |       and SP: "S \<subseteq> P - {a}" and ua: "setsum (\<lambda>v. u v *\<^sub>R v) S = a"
 | |
| 1095 | unfolding dependent_def span_explicit by blast | |
| 1096 | let ?S = "insert a S" | |
| 1097 | let ?u = "\<lambda>y. if y = a then - 1 else u y" | |
| 1098 | let ?v = a | |
| 53406 | 1099 | from aP SP have aS: "a \<notin> S" | 
| 1100 | by blast | |
| 1101 | from fS SP aP have th0: "finite ?S" "?S \<subseteq> P" "?v \<in> ?S" "?u ?v \<noteq> 0" | |
| 1102 | by auto | |
| 44133 | 1103 | have s0: "setsum (\<lambda>v. ?u v *\<^sub>R v) ?S = 0" | 
| 1104 | using fS aS | |
| 55910 | 1105 | apply simp | 
| 44133 | 1106 | apply (subst (2) ua[symmetric]) | 
| 57418 | 1107 | apply (rule setsum.cong) | 
| 49522 | 1108 | apply auto | 
| 1109 | done | |
| 55910 | 1110 | with th0 have ?rhs by fast | 
| 49522 | 1111 | } | 
| 44133 | 1112 | moreover | 
| 53406 | 1113 |   {
 | 
| 1114 | fix S u v | |
| 49522 | 1115 | assume fS: "finite S" | 
| 53406 | 1116 | and SP: "S \<subseteq> P" | 
| 1117 | and vS: "v \<in> S" | |
| 1118 | and uv: "u v \<noteq> 0" | |
| 49522 | 1119 | and u: "setsum (\<lambda>v. u v *\<^sub>R v) S = 0" | 
| 44133 | 1120 | let ?a = v | 
| 1121 |     let ?S = "S - {v}"
 | |
| 1122 | let ?u = "\<lambda>i. (- u i) / u v" | |
| 53406 | 1123 | have th0: "?a \<in> P" "finite ?S" "?S \<subseteq> P" | 
| 1124 | using fS SP vS by auto | |
| 1125 | have "setsum (\<lambda>v. ?u v *\<^sub>R v) ?S = | |
| 1126 | setsum (\<lambda>v. (- (inverse (u ?a))) *\<^sub>R (u v *\<^sub>R v)) S - ?u v *\<^sub>R v" | |
| 56480 
093ea91498e6
field_simps: better support for negation and division, and power
 hoelzl parents: 
56479diff
changeset | 1127 | using fS vS uv by (simp add: setsum_diff1 field_simps) | 
| 53406 | 1128 | also have "\<dots> = ?a" | 
| 56479 
91958d4b30f7
revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
 hoelzl parents: 
56444diff
changeset | 1129 | unfolding scaleR_right.setsum [symmetric] u using uv by simp | 
| 53406 | 1130 | finally have "setsum (\<lambda>v. ?u v *\<^sub>R v) ?S = ?a" . | 
| 44133 | 1131 | with th0 have ?lhs | 
| 1132 | unfolding dependent_def span_explicit | |
| 1133 | apply - | |
| 1134 | apply (rule bexI[where x= "?a"]) | |
| 1135 | apply (simp_all del: scaleR_minus_left) | |
| 1136 | apply (rule exI[where x= "?S"]) | |
| 49522 | 1137 | apply (auto simp del: scaleR_minus_left) | 
| 1138 | done | |
| 1139 | } | |
| 44133 | 1140 | ultimately show ?thesis by blast | 
| 1141 | qed | |
| 1142 | ||
| 1143 | ||
| 1144 | lemma span_finite: | |
| 1145 | assumes fS: "finite S" | |
| 1146 |   shows "span S = {y. \<exists>u. setsum (\<lambda>v. u v *\<^sub>R v) S = y}"
 | |
| 1147 | (is "_ = ?rhs") | |
| 49522 | 1148 | proof - | 
| 53406 | 1149 |   {
 | 
| 1150 | fix y | |
| 49711 | 1151 | assume y: "y \<in> span S" | 
| 53406 | 1152 | from y obtain S' u where fS': "finite S'" | 
| 1153 | and SS': "S' \<subseteq> S" | |
| 1154 | and u: "setsum (\<lambda>v. u v *\<^sub>R v) S' = y" | |
| 1155 | unfolding span_explicit by blast | |
| 44133 | 1156 | let ?u = "\<lambda>x. if x \<in> S' then u x else 0" | 
| 1157 | have "setsum (\<lambda>v. ?u v *\<^sub>R v) S = setsum (\<lambda>v. u v *\<^sub>R v) S'" | |
| 57418 | 1158 | using SS' fS by (auto intro!: setsum.mono_neutral_cong_right) | 
| 49522 | 1159 | then have "setsum (\<lambda>v. ?u v *\<^sub>R v) S = y" by (metis u) | 
| 53406 | 1160 | then have "y \<in> ?rhs" by auto | 
| 1161 | } | |
| 44133 | 1162 | moreover | 
| 53406 | 1163 |   {
 | 
| 1164 | fix y u | |
| 49522 | 1165 | assume u: "setsum (\<lambda>v. u v *\<^sub>R v) S = y" | 
| 53406 | 1166 | then have "y \<in> span S" using fS unfolding span_explicit by auto | 
| 1167 | } | |
| 44133 | 1168 | ultimately show ?thesis by blast | 
| 1169 | qed | |
| 1170 | ||
| 60420 | 1171 | text \<open>This is useful for building a basis step-by-step.\<close> | 
| 44133 | 1172 | |
| 1173 | lemma independent_insert: | |
| 53406 | 1174 | "independent (insert a S) \<longleftrightarrow> | 
| 1175 | (if a \<in> S then independent S else independent S \<and> a \<notin> span S)" | |
| 1176 | (is "?lhs \<longleftrightarrow> ?rhs") | |
| 1177 | proof (cases "a \<in> S") | |
| 1178 | case True | |
| 1179 | then show ?thesis | |
| 1180 | using insert_absorb[OF True] by simp | |
| 1181 | next | |
| 1182 | case False | |
| 1183 | show ?thesis | |
| 1184 | proof | |
| 1185 | assume i: ?lhs | |
| 1186 | then show ?rhs | |
| 1187 | using False | |
| 1188 | apply simp | |
| 1189 | apply (rule conjI) | |
| 1190 | apply (rule independent_mono) | |
| 1191 | apply assumption | |
| 1192 | apply blast | |
| 1193 | apply (simp add: dependent_def) | |
| 1194 | done | |
| 1195 | next | |
| 1196 | assume i: ?rhs | |
| 1197 | show ?lhs | |
| 1198 | using i False | |
| 1199 | apply (auto simp add: dependent_def) | |
| 55775 | 1200 | by (metis in_span_insert insert_Diff insert_Diff_if insert_iff) | 
| 53406 | 1201 | qed | 
| 44133 | 1202 | qed | 
| 1203 | ||
| 60420 | 1204 | text \<open>The degenerate case of the Exchange Lemma.\<close> | 
| 44133 | 1205 | |
| 1206 | lemma spanning_subset_independent: | |
| 49711 | 1207 | assumes BA: "B \<subseteq> A" | 
| 1208 | and iA: "independent A" | |
| 49522 | 1209 | and AsB: "A \<subseteq> span B" | 
| 44133 | 1210 | shows "A = B" | 
| 1211 | proof | |
| 49663 | 1212 | show "B \<subseteq> A" by (rule BA) | 
| 1213 | ||
| 44133 | 1214 | from span_mono[OF BA] span_mono[OF AsB] | 
| 1215 | have sAB: "span A = span B" unfolding span_span by blast | |
| 1216 | ||
| 53406 | 1217 |   {
 | 
| 1218 | fix x | |
| 1219 | assume x: "x \<in> A" | |
| 44133 | 1220 |     from iA have th0: "x \<notin> span (A - {x})"
 | 
| 1221 | unfolding dependent_def using x by blast | |
| 53406 | 1222 | from x have xsA: "x \<in> span A" | 
| 1223 | by (blast intro: span_superset) | |
| 44133 | 1224 |     have "A - {x} \<subseteq> A" by blast
 | 
| 53406 | 1225 |     then have th1: "span (A - {x}) \<subseteq> span A"
 | 
| 1226 | by (metis span_mono) | |
| 1227 |     {
 | |
| 1228 | assume xB: "x \<notin> B" | |
| 1229 |       from xB BA have "B \<subseteq> A - {x}"
 | |
| 1230 | by blast | |
| 1231 |       then have "span B \<subseteq> span (A - {x})"
 | |
| 1232 | by (metis span_mono) | |
| 1233 | with th1 th0 sAB have "x \<notin> span A" | |
| 1234 | by blast | |
| 1235 | with x have False | |
| 1236 | by (metis span_superset) | |
| 1237 | } | |
| 1238 | then have "x \<in> B" by blast | |
| 1239 | } | |
| 44133 | 1240 | then show "A \<subseteq> B" by blast | 
| 1241 | qed | |
| 1242 | ||
| 60420 | 1243 | text \<open>The general case of the Exchange Lemma, the key to what follows.\<close> | 
| 44133 | 1244 | |
| 1245 | lemma exchange_lemma: | |
| 49711 | 1246 | assumes f:"finite t" | 
| 1247 | and i: "independent s" | |
| 1248 | and sp: "s \<subseteq> span t" | |
| 53406 | 1249 | shows "\<exists>t'. card t' = card t \<and> finite t' \<and> s \<subseteq> t' \<and> t' \<subseteq> s \<union> t \<and> s \<subseteq> span t'" | 
| 49663 | 1250 | using f i sp | 
| 49522 | 1251 | proof (induct "card (t - s)" arbitrary: s t rule: less_induct) | 
| 44133 | 1252 | case less | 
| 60420 | 1253 | note ft = \<open>finite t\<close> and s = \<open>independent s\<close> and sp = \<open>s \<subseteq> span t\<close> | 
| 53406 | 1254 | let ?P = "\<lambda>t'. card t' = card t \<and> finite t' \<and> s \<subseteq> t' \<and> t' \<subseteq> s \<union> t \<and> s \<subseteq> span t'" | 
| 44133 | 1255 | let ?ths = "\<exists>t'. ?P t'" | 
| 53406 | 1256 |   {
 | 
| 55775 | 1257 | assume "s \<subseteq> t" | 
| 1258 | then have ?ths | |
| 1259 | by (metis ft Un_commute sp sup_ge1) | |
| 53406 | 1260 | } | 
| 44133 | 1261 | moreover | 
| 53406 | 1262 |   {
 | 
| 1263 | assume st: "t \<subseteq> s" | |
| 1264 | from spanning_subset_independent[OF st s sp] st ft span_mono[OF st] | |
| 1265 | have ?ths | |
| 55775 | 1266 | by (metis Un_absorb sp) | 
| 53406 | 1267 | } | 
| 44133 | 1268 | moreover | 
| 53406 | 1269 |   {
 | 
| 1270 | assume st: "\<not> s \<subseteq> t" "\<not> t \<subseteq> s" | |
| 1271 | from st(2) obtain b where b: "b \<in> t" "b \<notin> s" | |
| 1272 | by blast | |
| 1273 |     from b have "t - {b} - s \<subset> t - s"
 | |
| 1274 | by blast | |
| 1275 |     then have cardlt: "card (t - {b} - s) < card (t - s)"
 | |
| 1276 | using ft by (auto intro: psubset_card_mono) | |
| 1277 | from b ft have ct0: "card t \<noteq> 0" | |
| 1278 | by auto | |
| 1279 | have ?ths | |
| 1280 | proof cases | |
| 53716 | 1281 |       assume stb: "s \<subseteq> span (t - {b})"
 | 
| 1282 |       from ft have ftb: "finite (t - {b})"
 | |
| 53406 | 1283 | by auto | 
| 44133 | 1284 | from less(1)[OF cardlt ftb s stb] | 
| 53716 | 1285 |       obtain u where u: "card u = card (t - {b})" "s \<subseteq> u" "u \<subseteq> s \<union> (t - {b})" "s \<subseteq> span u"
 | 
| 49522 | 1286 | and fu: "finite u" by blast | 
| 44133 | 1287 | let ?w = "insert b u" | 
| 53406 | 1288 | have th0: "s \<subseteq> insert b u" | 
| 1289 | using u by blast | |
| 1290 | from u(3) b have "u \<subseteq> s \<union> t" | |
| 1291 | by blast | |
| 1292 | then have th1: "insert b u \<subseteq> s \<union> t" | |
| 1293 | using u b by blast | |
| 1294 | have bu: "b \<notin> u" | |
| 1295 | using b u by blast | |
| 1296 | from u(1) ft b have "card u = (card t - 1)" | |
| 1297 | by auto | |
| 49522 | 1298 | then have th2: "card (insert b u) = card t" | 
| 44133 | 1299 | using card_insert_disjoint[OF fu bu] ct0 by auto | 
| 1300 | from u(4) have "s \<subseteq> span u" . | |
| 53406 | 1301 | also have "\<dots> \<subseteq> span (insert b u)" | 
| 1302 | by (rule span_mono) blast | |
| 44133 | 1303 | finally have th3: "s \<subseteq> span (insert b u)" . | 
| 53406 | 1304 | from th0 th1 th2 th3 fu have th: "?P ?w" | 
| 1305 | by blast | |
| 1306 | from th show ?thesis by blast | |
| 1307 | next | |
| 53716 | 1308 |       assume stb: "\<not> s \<subseteq> span (t - {b})"
 | 
| 53406 | 1309 |       from stb obtain a where a: "a \<in> s" "a \<notin> span (t - {b})"
 | 
| 1310 | by blast | |
| 1311 | have ab: "a \<noteq> b" | |
| 1312 | using a b by blast | |
| 1313 | have at: "a \<notin> t" | |
| 1314 |         using a ab span_superset[of a "t- {b}"] by auto
 | |
| 44133 | 1315 |       have mlt: "card ((insert a (t - {b})) - s) < card (t - s)"
 | 
| 1316 | using cardlt ft a b by auto | |
| 53406 | 1317 |       have ft': "finite (insert a (t - {b}))"
 | 
| 1318 | using ft by auto | |
| 1319 |       {
 | |
| 1320 | fix x | |
| 1321 | assume xs: "x \<in> s" | |
| 1322 |         have t: "t \<subseteq> insert b (insert a (t - {b}))"
 | |
| 1323 | using b by auto | |
| 1324 | from b(1) have "b \<in> span t" | |
| 1325 | by (simp add: span_superset) | |
| 1326 |         have bs: "b \<in> span (insert a (t - {b}))"
 | |
| 1327 | apply (rule in_span_delete) | |
| 1328 | using a sp unfolding subset_eq | |
| 1329 | apply auto | |
| 1330 | done | |
| 1331 | from xs sp have "x \<in> span t" | |
| 1332 | by blast | |
| 1333 |         with span_mono[OF t] have x: "x \<in> span (insert b (insert a (t - {b})))" ..
 | |
| 1334 |         from span_trans[OF bs x] have "x \<in> span (insert a (t - {b}))" .
 | |
| 1335 | } | |
| 1336 |       then have sp': "s \<subseteq> span (insert a (t - {b}))"
 | |
| 1337 | by blast | |
| 1338 | from less(1)[OF mlt ft' s sp'] obtain u where u: | |
| 53716 | 1339 |         "card u = card (insert a (t - {b}))"
 | 
| 1340 |         "finite u" "s \<subseteq> u" "u \<subseteq> s \<union> insert a (t - {b})"
 | |
| 53406 | 1341 | "s \<subseteq> span u" by blast | 
| 1342 | from u a b ft at ct0 have "?P u" | |
| 1343 | by auto | |
| 1344 | then show ?thesis by blast | |
| 1345 | qed | |
| 44133 | 1346 | } | 
| 49522 | 1347 | ultimately show ?ths by blast | 
| 44133 | 1348 | qed | 
| 1349 | ||
| 60420 | 1350 | text \<open>This implies corresponding size bounds.\<close> | 
| 44133 | 1351 | |
| 1352 | lemma independent_span_bound: | |
| 53406 | 1353 | assumes f: "finite t" | 
| 1354 | and i: "independent s" | |
| 1355 | and sp: "s \<subseteq> span t" | |
| 44133 | 1356 | shows "finite s \<and> card s \<le> card t" | 
| 1357 | by (metis exchange_lemma[OF f i sp] finite_subset card_mono) | |
| 1358 | ||
| 1359 | lemma finite_Atleast_Atmost_nat[simp]: "finite {f x |x. x\<in> (UNIV::'a::finite set)}"
 | |
| 49522 | 1360 | proof - | 
| 53406 | 1361 |   have eq: "{f x |x. x\<in> UNIV} = f ` UNIV"
 | 
| 1362 | by auto | |
| 44133 | 1363 | show ?thesis unfolding eq | 
| 1364 | apply (rule finite_imageI) | |
| 1365 | apply (rule finite) | |
| 1366 | done | |
| 1367 | qed | |
| 1368 | ||
| 53406 | 1369 | |
| 60420 | 1370 | subsection \<open>Euclidean Spaces as Typeclass\<close> | 
| 44133 | 1371 | |
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1372 | lemma independent_Basis: "independent Basis" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1373 | unfolding dependent_def | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1374 | apply (subst span_finite) | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1375 | apply simp | 
| 44133 | 1376 | apply clarify | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1377 | apply (drule_tac f="inner a" in arg_cong) | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1378 | apply (simp add: inner_Basis inner_setsum_right eq_commute) | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1379 | done | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1380 | |
| 53939 | 1381 | lemma span_Basis [simp]: "span Basis = UNIV" | 
| 1382 | unfolding span_finite [OF finite_Basis] | |
| 1383 | by (fast intro: euclidean_representation) | |
| 44133 | 1384 | |
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1385 | lemma in_span_Basis: "x \<in> span Basis" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1386 | unfolding span_Basis .. | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1387 | |
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1388 | lemma Basis_le_norm: "b \<in> Basis \<Longrightarrow> \<bar>x \<bullet> b\<bar> \<le> norm x" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1389 | by (rule order_trans [OF Cauchy_Schwarz_ineq2]) simp | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1390 | |
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1391 | lemma norm_bound_Basis_le: "b \<in> Basis \<Longrightarrow> norm x \<le> e \<Longrightarrow> \<bar>x \<bullet> b\<bar> \<le> e" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1392 | by (metis Basis_le_norm order_trans) | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1393 | |
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1394 | lemma norm_bound_Basis_lt: "b \<in> Basis \<Longrightarrow> norm x < e \<Longrightarrow> \<bar>x \<bullet> b\<bar> < e" | 
| 53595 | 1395 | by (metis Basis_le_norm le_less_trans) | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1396 | |
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1397 | lemma norm_le_l1: "norm x \<le> (\<Sum>b\<in>Basis. \<bar>x \<bullet> b\<bar>)" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1398 | apply (subst euclidean_representation[of x, symmetric]) | 
| 44176 
eda112e9cdee
remove redundant lemma setsum_norm in favor of norm_setsum;
 huffman parents: 
44170diff
changeset | 1399 | apply (rule order_trans[OF norm_setsum]) | 
| 49522 | 1400 | apply (auto intro!: setsum_mono) | 
| 1401 | done | |
| 44133 | 1402 | |
| 1403 | lemma setsum_norm_allsubsets_bound: | |
| 56444 | 1404 | fixes f :: "'a \<Rightarrow> 'n::euclidean_space" | 
| 53406 | 1405 | assumes fP: "finite P" | 
| 1406 | and fPs: "\<And>Q. Q \<subseteq> P \<Longrightarrow> norm (setsum f Q) \<le> e" | |
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1407 |   shows "(\<Sum>x\<in>P. norm (f x)) \<le> 2 * real DIM('n) * e"
 | 
| 49522 | 1408 | proof - | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1409 | have "(\<Sum>x\<in>P. norm (f x)) \<le> (\<Sum>x\<in>P. \<Sum>b\<in>Basis. \<bar>f x \<bullet> b\<bar>)" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1410 | by (rule setsum_mono) (rule norm_le_l1) | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1411 | also have "(\<Sum>x\<in>P. \<Sum>b\<in>Basis. \<bar>f x \<bullet> b\<bar>) = (\<Sum>b\<in>Basis. \<Sum>x\<in>P. \<bar>f x \<bullet> b\<bar>)" | 
| 57418 | 1412 | by (rule setsum.commute) | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1413 | also have "\<dots> \<le> of_nat (card (Basis :: 'n set)) * (2 * e)" | 
| 49522 | 1414 | proof (rule setsum_bounded) | 
| 53406 | 1415 | fix i :: 'n | 
| 1416 | assume i: "i \<in> Basis" | |
| 1417 | have "norm (\<Sum>x\<in>P. \<bar>f x \<bullet> i\<bar>) \<le> | |
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1418 |       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)"
 | 
| 57418 | 1419 | by (simp add: abs_real_def setsum.If_cases[OF fP] setsum_negf norm_triangle_ineq4 inner_setsum_left | 
| 56444 | 1420 | del: real_norm_def) | 
| 53406 | 1421 | also have "\<dots> \<le> e + e" | 
| 1422 | unfolding real_norm_def | |
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1423 | by (intro add_mono norm_bound_Basis_le i fPs) auto | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1424 | finally show "(\<Sum>x\<in>P. \<bar>f x \<bullet> i\<bar>) \<le> 2*e" by simp | 
| 44133 | 1425 | qed | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1426 |   also have "\<dots> = 2 * real DIM('n) * e"
 | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1427 | by (simp add: real_of_nat_def) | 
| 44133 | 1428 | finally show ?thesis . | 
| 1429 | qed | |
| 1430 | ||
| 53406 | 1431 | |
| 60420 | 1432 | subsection \<open>Linearity and Bilinearity continued\<close> | 
| 44133 | 1433 | |
| 1434 | lemma linear_bounded: | |
| 56444 | 1435 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector" | 
| 44133 | 1436 | assumes lf: "linear f" | 
| 1437 | shows "\<exists>B. \<forall>x. norm (f x) \<le> B * norm x" | |
| 53939 | 1438 | proof | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1439 | let ?B = "\<Sum>b\<in>Basis. norm (f b)" | 
| 53939 | 1440 | show "\<forall>x. norm (f x) \<le> ?B * norm x" | 
| 1441 | proof | |
| 53406 | 1442 | fix x :: 'a | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1443 | let ?g = "\<lambda>b. (x \<bullet> b) *\<^sub>R f b" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1444 | have "norm (f x) = norm (f (\<Sum>b\<in>Basis. (x \<bullet> b) *\<^sub>R b))" | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1445 | unfolding euclidean_representation .. | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1446 | also have "\<dots> = norm (setsum ?g Basis)" | 
| 53939 | 1447 | by (simp add: linear_setsum [OF lf] linear_cmul [OF lf]) | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1448 | finally have th0: "norm (f x) = norm (setsum ?g Basis)" . | 
| 53939 | 1449 | have th: "\<forall>b\<in>Basis. norm (?g b) \<le> norm (f b) * norm x" | 
| 1450 | proof | |
| 53406 | 1451 | fix i :: 'a | 
| 1452 | assume i: "i \<in> Basis" | |
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1453 | from Basis_le_norm[OF i, of x] | 
| 53939 | 1454 | show "norm (?g i) \<le> norm (f i) * norm x" | 
| 49663 | 1455 | unfolding norm_scaleR | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 1456 | apply (subst mult.commute) | 
| 49663 | 1457 | apply (rule mult_mono) | 
| 1458 | apply (auto simp add: field_simps) | |
| 53406 | 1459 | done | 
| 53939 | 1460 | qed | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1461 | from setsum_norm_le[of _ ?g, OF th] | 
| 53939 | 1462 | show "norm (f x) \<le> ?B * norm x" | 
| 53406 | 1463 | unfolding th0 setsum_left_distrib by metis | 
| 53939 | 1464 | qed | 
| 44133 | 1465 | qed | 
| 1466 | ||
| 1467 | lemma linear_conv_bounded_linear: | |
| 1468 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector" | |
| 1469 | shows "linear f \<longleftrightarrow> bounded_linear f" | |
| 1470 | proof | |
| 1471 | assume "linear f" | |
| 53939 | 1472 | then interpret f: linear f . | 
| 44133 | 1473 | show "bounded_linear f" | 
| 1474 | proof | |
| 1475 | have "\<exists>B. \<forall>x. norm (f x) \<le> B * norm x" | |
| 60420 | 1476 | using \<open>linear f\<close> by (rule linear_bounded) | 
| 49522 | 1477 | then show "\<exists>K. \<forall>x. norm (f x) \<le> norm x * K" | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 1478 | by (simp add: mult.commute) | 
| 44133 | 1479 | qed | 
| 1480 | next | |
| 1481 | assume "bounded_linear f" | |
| 1482 | then interpret f: bounded_linear f . | |
| 53939 | 1483 | show "linear f" .. | 
| 1484 | qed | |
| 1485 | ||
| 1486 | lemma linear_bounded_pos: | |
| 56444 | 1487 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector" | 
| 53939 | 1488 | assumes lf: "linear f" | 
| 1489 | shows "\<exists>B > 0. \<forall>x. norm (f x) \<le> B * norm x" | |
| 1490 | proof - | |
| 1491 | have "\<exists>B > 0. \<forall>x. norm (f x) \<le> norm x * B" | |
| 1492 | using lf unfolding linear_conv_bounded_linear | |
| 1493 | by (rule bounded_linear.pos_bounded) | |
| 1494 | then show ?thesis | |
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57418diff
changeset | 1495 | by (simp only: mult.commute) | 
| 44133 | 1496 | qed | 
| 1497 | ||
| 49522 | 1498 | lemma bounded_linearI': | 
| 56444 | 1499 | fixes f ::"'a::euclidean_space \<Rightarrow> 'b::real_normed_vector" | 
| 53406 | 1500 | assumes "\<And>x y. f (x + y) = f x + f y" | 
| 1501 | and "\<And>c x. f (c *\<^sub>R x) = c *\<^sub>R f x" | |
| 49522 | 1502 | shows "bounded_linear f" | 
| 53406 | 1503 | unfolding linear_conv_bounded_linear[symmetric] | 
| 49522 | 1504 | by (rule linearI[OF assms]) | 
| 44133 | 1505 | |
| 1506 | lemma bilinear_bounded: | |
| 56444 | 1507 | fixes h :: "'m::euclidean_space \<Rightarrow> 'n::euclidean_space \<Rightarrow> 'k::real_normed_vector" | 
| 44133 | 1508 | assumes bh: "bilinear h" | 
| 1509 | shows "\<exists>B. \<forall>x y. norm (h x y) \<le> B * norm x * norm y" | |
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1510 | proof (clarify intro!: exI[of _ "\<Sum>i\<in>Basis. \<Sum>j\<in>Basis. norm (h i j)"]) | 
| 53406 | 1511 | fix x :: 'm | 
| 1512 | fix y :: 'n | |
| 1513 | have "norm (h x y) = norm (h (setsum (\<lambda>i. (x \<bullet> i) *\<^sub>R i) Basis) (setsum (\<lambda>i. (y \<bullet> i) *\<^sub>R i) Basis))" | |
| 1514 | apply (subst euclidean_representation[where 'a='m]) | |
| 1515 | apply (subst euclidean_representation[where 'a='n]) | |
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1516 | apply rule | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1517 | done | 
| 53406 | 1518 | also have "\<dots> = norm (setsum (\<lambda> (i,j). h ((x \<bullet> i) *\<^sub>R i) ((y \<bullet> j) *\<^sub>R j)) (Basis \<times> Basis))" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1519 | unfolding bilinear_setsum[OF bh finite_Basis finite_Basis] .. | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1520 | finally have th: "norm (h x y) = \<dots>" . | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1521 | show "norm (h x y) \<le> (\<Sum>i\<in>Basis. \<Sum>j\<in>Basis. norm (h i j)) * norm x * norm y" | 
| 57418 | 1522 | apply (auto simp add: setsum_left_distrib th setsum.cartesian_product) | 
| 53406 | 1523 | apply (rule setsum_norm_le) | 
| 1524 | apply simp | |
| 1525 | apply (auto simp add: bilinear_rmul[OF bh] bilinear_lmul[OF bh] | |
| 1526 | field_simps simp del: scaleR_scaleR) | |
| 1527 | apply (rule mult_mono) | |
| 1528 | apply (auto simp add: zero_le_mult_iff Basis_le_norm) | |
| 1529 | apply (rule mult_mono) | |
| 1530 | apply (auto simp add: zero_le_mult_iff Basis_le_norm) | |
| 1531 | done | |
| 44133 | 1532 | qed | 
| 1533 | ||
| 1534 | lemma bilinear_conv_bounded_bilinear: | |
| 1535 | fixes h :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space \<Rightarrow> 'c::real_normed_vector" | |
| 1536 | shows "bilinear h \<longleftrightarrow> bounded_bilinear h" | |
| 1537 | proof | |
| 1538 | assume "bilinear h" | |
| 1539 | show "bounded_bilinear h" | |
| 1540 | proof | |
| 53406 | 1541 | fix x y z | 
| 1542 | show "h (x + y) z = h x z + h y z" | |
| 60420 | 1543 | using \<open>bilinear h\<close> unfolding bilinear_def linear_iff by simp | 
| 44133 | 1544 | next | 
| 53406 | 1545 | fix x y z | 
| 1546 | show "h x (y + z) = h x y + h x z" | |
| 60420 | 1547 | using \<open>bilinear h\<close> unfolding bilinear_def linear_iff by simp | 
| 44133 | 1548 | next | 
| 53406 | 1549 | fix r x y | 
| 1550 | show "h (scaleR r x) y = scaleR r (h x y)" | |
| 60420 | 1551 | using \<open>bilinear h\<close> unfolding bilinear_def linear_iff | 
| 44133 | 1552 | by simp | 
| 1553 | next | |
| 53406 | 1554 | fix r x y | 
| 1555 | show "h x (scaleR r y) = scaleR r (h x y)" | |
| 60420 | 1556 | using \<open>bilinear h\<close> unfolding bilinear_def linear_iff | 
| 44133 | 1557 | by simp | 
| 1558 | next | |
| 1559 | have "\<exists>B. \<forall>x y. norm (h x y) \<le> B * norm x * norm y" | |
| 60420 | 1560 | using \<open>bilinear h\<close> by (rule bilinear_bounded) | 
| 49522 | 1561 | then show "\<exists>K. \<forall>x y. norm (h x y) \<le> norm x * norm y * K" | 
| 57514 
bdc2c6b40bf2
prefer ac_simps collections over separate name bindings for add and mult
 haftmann parents: 
57512diff
changeset | 1562 | by (simp add: ac_simps) | 
| 44133 | 1563 | qed | 
| 1564 | next | |
| 1565 | assume "bounded_bilinear h" | |
| 1566 | then interpret h: bounded_bilinear h . | |
| 1567 | show "bilinear h" | |
| 1568 | unfolding bilinear_def linear_conv_bounded_linear | |
| 49522 | 1569 | using h.bounded_linear_left h.bounded_linear_right by simp | 
| 44133 | 1570 | qed | 
| 1571 | ||
| 53939 | 1572 | lemma bilinear_bounded_pos: | 
| 56444 | 1573 | fixes h :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space \<Rightarrow> 'c::real_normed_vector" | 
| 53939 | 1574 | assumes bh: "bilinear h" | 
| 1575 | shows "\<exists>B > 0. \<forall>x y. norm (h x y) \<le> B * norm x * norm y" | |
| 1576 | proof - | |
| 1577 | have "\<exists>B > 0. \<forall>x y. norm (h x y) \<le> norm x * norm y * B" | |
| 1578 | using bh [unfolded bilinear_conv_bounded_bilinear] | |
| 1579 | by (rule bounded_bilinear.pos_bounded) | |
| 1580 | then show ?thesis | |
| 57514 
bdc2c6b40bf2
prefer ac_simps collections over separate name bindings for add and mult
 haftmann parents: 
57512diff
changeset | 1581 | by (simp only: ac_simps) | 
| 53939 | 1582 | qed | 
| 1583 | ||
| 49522 | 1584 | |
| 60420 | 1585 | subsection \<open>We continue.\<close> | 
| 44133 | 1586 | |
| 1587 | lemma independent_bound: | |
| 53716 | 1588 | fixes S :: "'a::euclidean_space set" | 
| 1589 |   shows "independent S \<Longrightarrow> finite S \<and> card S \<le> DIM('a)"
 | |
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1590 | using independent_span_bound[OF finite_Basis, of S] by auto | 
| 44133 | 1591 | |
| 60303 | 1592 | corollary | 
| 1593 | fixes S :: "'a::euclidean_space set" | |
| 1594 | assumes "independent S" | |
| 1595 |   shows independent_imp_finite: "finite S" and independent_card_le:"card S \<le> DIM('a)"
 | |
| 1596 | using assms independent_bound by auto | |
| 1597 | ||
| 49663 | 1598 | lemma dependent_biggerset: | 
| 56444 | 1599 | fixes S :: "'a::euclidean_space set" | 
| 1600 |   shows "(finite S \<Longrightarrow> card S > DIM('a)) \<Longrightarrow> dependent S"
 | |
| 44133 | 1601 | by (metis independent_bound not_less) | 
| 1602 | ||
| 60420 | 1603 | text \<open>Hence we can create a maximal independent subset.\<close> | 
| 44133 | 1604 | |
| 1605 | lemma maximal_independent_subset_extend: | |
| 53406 | 1606 | fixes S :: "'a::euclidean_space set" | 
| 1607 | assumes sv: "S \<subseteq> V" | |
| 49663 | 1608 | and iS: "independent S" | 
| 44133 | 1609 | shows "\<exists>B. S \<subseteq> B \<and> B \<subseteq> V \<and> independent B \<and> V \<subseteq> span B" | 
| 1610 | using sv iS | |
| 49522 | 1611 | proof (induct "DIM('a) - card S" arbitrary: S rule: less_induct)
 | 
| 44133 | 1612 | case less | 
| 60420 | 1613 | note sv = \<open>S \<subseteq> V\<close> and i = \<open>independent S\<close> | 
| 44133 | 1614 | let ?P = "\<lambda>B. S \<subseteq> B \<and> B \<subseteq> V \<and> independent B \<and> V \<subseteq> span B" | 
| 1615 | let ?ths = "\<exists>x. ?P x" | |
| 1616 |   let ?d = "DIM('a)"
 | |
| 53406 | 1617 | show ?ths | 
| 1618 | proof (cases "V \<subseteq> span S") | |
| 1619 | case True | |
| 1620 | then show ?thesis | |
| 1621 | using sv i by blast | |
| 1622 | next | |
| 1623 | case False | |
| 1624 | then obtain a where a: "a \<in> V" "a \<notin> span S" | |
| 1625 | by blast | |
| 1626 | from a have aS: "a \<notin> S" | |
| 1627 | by (auto simp add: span_superset) | |
| 1628 | have th0: "insert a S \<subseteq> V" | |
| 1629 | using a sv by blast | |
| 44133 | 1630 | from independent_insert[of a S] i a | 
| 53406 | 1631 | have th1: "independent (insert a S)" | 
| 1632 | by auto | |
| 44133 | 1633 | have mlt: "?d - card (insert a S) < ?d - card S" | 
| 49522 | 1634 | using aS a independent_bound[OF th1] by auto | 
| 44133 | 1635 | |
| 1636 | from less(1)[OF mlt th0 th1] | |
| 1637 | obtain B where B: "insert a S \<subseteq> B" "B \<subseteq> V" "independent B" " V \<subseteq> span B" | |
| 1638 | by blast | |
| 1639 | from B have "?P B" by auto | |
| 53406 | 1640 | then show ?thesis by blast | 
| 1641 | qed | |
| 44133 | 1642 | qed | 
| 1643 | ||
| 1644 | lemma maximal_independent_subset: | |
| 1645 |   "\<exists>(B:: ('a::euclidean_space) set). B\<subseteq> V \<and> independent B \<and> V \<subseteq> span B"
 | |
| 49522 | 1646 |   by (metis maximal_independent_subset_extend[of "{}:: ('a::euclidean_space) set"]
 | 
| 1647 | empty_subsetI independent_empty) | |
| 44133 | 1648 | |
| 1649 | ||
| 60420 | 1650 | text \<open>Notion of dimension.\<close> | 
| 44133 | 1651 | |
| 53406 | 1652 | definition "dim V = (SOME n. \<exists>B. B \<subseteq> V \<and> independent B \<and> V \<subseteq> span B \<and> card B = n)" | 
| 44133 | 1653 | |
| 49522 | 1654 | lemma basis_exists: | 
| 1655 |   "\<exists>B. (B :: ('a::euclidean_space) set) \<subseteq> V \<and> independent B \<and> V \<subseteq> span B \<and> (card B = dim V)"
 | |
| 1656 | unfolding dim_def some_eq_ex[of "\<lambda>n. \<exists>B. B \<subseteq> V \<and> independent B \<and> V \<subseteq> span B \<and> (card B = n)"] | |
| 1657 | using maximal_independent_subset[of V] independent_bound | |
| 1658 | by auto | |
| 44133 | 1659 | |
| 60307 
75e1aa7a450e
Convex hulls: theorems about interior, etc. And a few simple lemmas.
 paulson <lp15@cam.ac.uk> parents: 
60303diff
changeset | 1660 | corollary dim_le_card: | 
| 
75e1aa7a450e
Convex hulls: theorems about interior, etc. And a few simple lemmas.
 paulson <lp15@cam.ac.uk> parents: 
60303diff
changeset | 1661 | fixes s :: "'a::euclidean_space set" | 
| 
75e1aa7a450e
Convex hulls: theorems about interior, etc. And a few simple lemmas.
 paulson <lp15@cam.ac.uk> parents: 
60303diff
changeset | 1662 | shows "finite s \<Longrightarrow> dim s \<le> card s" | 
| 
75e1aa7a450e
Convex hulls: theorems about interior, etc. And a few simple lemmas.
 paulson <lp15@cam.ac.uk> parents: 
60303diff
changeset | 1663 | by (metis basis_exists card_mono) | 
| 
75e1aa7a450e
Convex hulls: theorems about interior, etc. And a few simple lemmas.
 paulson <lp15@cam.ac.uk> parents: 
60303diff
changeset | 1664 | |
| 60420 | 1665 | text \<open>Consequences of independence or spanning for cardinality.\<close> | 
| 44133 | 1666 | |
| 53406 | 1667 | lemma independent_card_le_dim: | 
| 1668 | fixes B :: "'a::euclidean_space set" | |
| 1669 | assumes "B \<subseteq> V" | |
| 1670 | and "independent B" | |
| 49522 | 1671 | shows "card B \<le> dim V" | 
| 44133 | 1672 | proof - | 
| 60420 | 1673 | from basis_exists[of V] \<open>B \<subseteq> V\<close> | 
| 53406 | 1674 | obtain B' where "independent B'" | 
| 1675 | and "B \<subseteq> span B'" | |
| 1676 | and "card B' = dim V" | |
| 1677 | by blast | |
| 60420 | 1678 | with independent_span_bound[OF _ \<open>independent B\<close> \<open>B \<subseteq> span B'\<close>] independent_bound[of B'] | 
| 44133 | 1679 | show ?thesis by auto | 
| 1680 | qed | |
| 1681 | ||
| 49522 | 1682 | lemma span_card_ge_dim: | 
| 53406 | 1683 | fixes B :: "'a::euclidean_space set" | 
| 1684 | shows "B \<subseteq> V \<Longrightarrow> V \<subseteq> span B \<Longrightarrow> finite B \<Longrightarrow> dim V \<le> card B" | |
| 44133 | 1685 | by (metis basis_exists[of V] independent_span_bound subset_trans) | 
| 1686 | ||
| 1687 | lemma basis_card_eq_dim: | |
| 53406 | 1688 | fixes V :: "'a::euclidean_space set" | 
| 1689 | shows "B \<subseteq> V \<Longrightarrow> V \<subseteq> span B \<Longrightarrow> independent B \<Longrightarrow> finite B \<and> card B = dim V" | |
| 44133 | 1690 | by (metis order_eq_iff independent_card_le_dim span_card_ge_dim independent_bound) | 
| 1691 | ||
| 53406 | 1692 | lemma dim_unique: | 
| 1693 | fixes B :: "'a::euclidean_space set" | |
| 1694 | shows "B \<subseteq> V \<Longrightarrow> V \<subseteq> span B \<Longrightarrow> independent B \<Longrightarrow> card B = n \<Longrightarrow> dim V = n" | |
| 44133 | 1695 | by (metis basis_card_eq_dim) | 
| 1696 | ||
| 60420 | 1697 | text \<open>More lemmas about dimension.\<close> | 
| 44133 | 1698 | |
| 53406 | 1699 | lemma dim_UNIV: "dim (UNIV :: 'a::euclidean_space set) = DIM('a)"
 | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1700 | using independent_Basis | 
| 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 1701 | by (intro dim_unique[of Basis]) auto | 
| 44133 | 1702 | |
| 1703 | lemma dim_subset: | |
| 53406 | 1704 | fixes S :: "'a::euclidean_space set" | 
| 1705 | shows "S \<subseteq> T \<Longrightarrow> dim S \<le> dim T" | |
| 44133 | 1706 | using basis_exists[of T] basis_exists[of S] | 
| 1707 | by (metis independent_card_le_dim subset_trans) | |
| 1708 | ||
| 53406 | 1709 | lemma dim_subset_UNIV: | 
| 1710 | fixes S :: "'a::euclidean_space set" | |
| 1711 |   shows "dim S \<le> DIM('a)"
 | |
| 44133 | 1712 | by (metis dim_subset subset_UNIV dim_UNIV) | 
| 1713 | ||
| 60420 | 1714 | text \<open>Converses to those.\<close> | 
| 44133 | 1715 | |
| 1716 | lemma card_ge_dim_independent: | |
| 53406 | 1717 | fixes B :: "'a::euclidean_space set" | 
| 1718 | assumes BV: "B \<subseteq> V" | |
| 1719 | and iB: "independent B" | |
| 1720 | and dVB: "dim V \<le> card B" | |
| 44133 | 1721 | shows "V \<subseteq> span B" | 
| 53406 | 1722 | proof | 
| 1723 | fix a | |
| 1724 | assume aV: "a \<in> V" | |
| 1725 |   {
 | |
| 1726 | assume aB: "a \<notin> span B" | |
| 1727 | then have iaB: "independent (insert a B)" | |
| 1728 | using iB aV BV by (simp add: independent_insert) | |
| 1729 | from aV BV have th0: "insert a B \<subseteq> V" | |
| 1730 | by blast | |
| 1731 | from aB have "a \<notin>B" | |
| 1732 | by (auto simp add: span_superset) | |
| 1733 | with independent_card_le_dim[OF th0 iaB] dVB independent_bound[OF iB] | |
| 1734 | have False by auto | |
| 1735 | } | |
| 1736 | then show "a \<in> span B" by blast | |
| 44133 | 1737 | qed | 
| 1738 | ||
| 1739 | lemma card_le_dim_spanning: | |
| 49663 | 1740 |   assumes BV: "(B:: ('a::euclidean_space) set) \<subseteq> V"
 | 
| 1741 | and VB: "V \<subseteq> span B" | |
| 1742 | and fB: "finite B" | |
| 1743 | and dVB: "dim V \<ge> card B" | |
| 44133 | 1744 | shows "independent B" | 
| 49522 | 1745 | proof - | 
| 53406 | 1746 |   {
 | 
| 1747 | fix a | |
| 53716 | 1748 |     assume a: "a \<in> B" "a \<in> span (B - {a})"
 | 
| 53406 | 1749 | from a fB have c0: "card B \<noteq> 0" | 
| 1750 | by auto | |
| 53716 | 1751 |     from a fB have cb: "card (B - {a}) = card B - 1"
 | 
| 53406 | 1752 | by auto | 
| 53716 | 1753 |     from BV a have th0: "B - {a} \<subseteq> V"
 | 
| 53406 | 1754 | by blast | 
| 1755 |     {
 | |
| 1756 | fix x | |
| 1757 | assume x: "x \<in> V" | |
| 53716 | 1758 |       from a have eq: "insert a (B - {a}) = B"
 | 
| 53406 | 1759 | by blast | 
| 1760 | from x VB have x': "x \<in> span B" | |
| 1761 | by blast | |
| 44133 | 1762 | from span_trans[OF a(2), unfolded eq, OF x'] | 
| 53716 | 1763 |       have "x \<in> span (B - {a})" .
 | 
| 53406 | 1764 | } | 
| 53716 | 1765 |     then have th1: "V \<subseteq> span (B - {a})"
 | 
| 53406 | 1766 | by blast | 
| 53716 | 1767 |     have th2: "finite (B - {a})"
 | 
| 53406 | 1768 | using fB by auto | 
| 44133 | 1769 | from span_card_ge_dim[OF th0 th1 th2] | 
| 53716 | 1770 |     have c: "dim V \<le> card (B - {a})" .
 | 
| 53406 | 1771 | from c c0 dVB cb have False by simp | 
| 1772 | } | |
| 1773 | then show ?thesis | |
| 1774 | unfolding dependent_def by blast | |
| 44133 | 1775 | qed | 
| 1776 | ||
| 53406 | 1777 | lemma card_eq_dim: | 
| 1778 | fixes B :: "'a::euclidean_space set" | |
| 1779 | shows "B \<subseteq> V \<Longrightarrow> card B = dim V \<Longrightarrow> finite B \<Longrightarrow> independent B \<longleftrightarrow> V \<subseteq> span B" | |
| 49522 | 1780 | by (metis order_eq_iff card_le_dim_spanning card_ge_dim_independent) | 
| 44133 | 1781 | |
| 60420 | 1782 | text \<open>More general size bound lemmas.\<close> | 
| 44133 | 1783 | |
| 1784 | lemma independent_bound_general: | |
| 53406 | 1785 | fixes S :: "'a::euclidean_space set" | 
| 1786 | shows "independent S \<Longrightarrow> finite S \<and> card S \<le> dim S" | |
| 44133 | 1787 | by (metis independent_card_le_dim independent_bound subset_refl) | 
| 1788 | ||
| 49522 | 1789 | lemma dependent_biggerset_general: | 
| 53406 | 1790 | fixes S :: "'a::euclidean_space set" | 
| 1791 | shows "(finite S \<Longrightarrow> card S > dim S) \<Longrightarrow> dependent S" | |
| 44133 | 1792 | using independent_bound_general[of S] by (metis linorder_not_le) | 
| 1793 | ||
| 60303 | 1794 | lemma dim_span [simp]: | 
| 53406 | 1795 | fixes S :: "'a::euclidean_space set" | 
| 1796 | shows "dim (span S) = dim S" | |
| 49522 | 1797 | proof - | 
| 44133 | 1798 | have th0: "dim S \<le> dim (span S)" | 
| 1799 | by (auto simp add: subset_eq intro: dim_subset span_superset) | |
| 1800 | from basis_exists[of S] | |
| 53406 | 1801 | obtain B where B: "B \<subseteq> S" "independent B" "S \<subseteq> span B" "card B = dim S" | 
| 1802 | by blast | |
| 1803 | from B have fB: "finite B" "card B = dim S" | |
| 1804 | using independent_bound by blast+ | |
| 1805 | have bSS: "B \<subseteq> span S" | |
| 1806 | using B(1) by (metis subset_eq span_inc) | |
| 1807 | have sssB: "span S \<subseteq> span B" | |
| 1808 | using span_mono[OF B(3)] by (simp add: span_span) | |
| 44133 | 1809 | from span_card_ge_dim[OF bSS sssB fB(1)] th0 show ?thesis | 
| 49522 | 1810 | using fB(2) by arith | 
| 44133 | 1811 | qed | 
| 1812 | ||
| 53406 | 1813 | lemma subset_le_dim: | 
| 1814 | fixes S :: "'a::euclidean_space set" | |
| 1815 | shows "S \<subseteq> span T \<Longrightarrow> dim S \<le> dim T" | |
| 44133 | 1816 | by (metis dim_span dim_subset) | 
| 1817 | ||
| 53406 | 1818 | lemma span_eq_dim: | 
| 56444 | 1819 | fixes S :: "'a::euclidean_space set" | 
| 53406 | 1820 | shows "span S = span T \<Longrightarrow> dim S = dim T" | 
| 44133 | 1821 | by (metis dim_span) | 
| 1822 | ||
| 1823 | lemma spans_image: | |
| 49663 | 1824 | assumes lf: "linear f" | 
| 1825 | and VB: "V \<subseteq> span B" | |
| 44133 | 1826 | shows "f ` V \<subseteq> span (f ` B)" | 
| 49522 | 1827 | unfolding span_linear_image[OF lf] by (metis VB image_mono) | 
| 44133 | 1828 | |
| 1829 | lemma dim_image_le: | |
| 1830 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space" | |
| 49663 | 1831 | assumes lf: "linear f" | 
| 1832 | shows "dim (f ` S) \<le> dim (S)" | |
| 49522 | 1833 | proof - | 
| 44133 | 1834 | from basis_exists[of S] obtain B where | 
| 1835 | B: "B \<subseteq> S" "independent B" "S \<subseteq> span B" "card B = dim S" by blast | |
| 53406 | 1836 | from B have fB: "finite B" "card B = dim S" | 
| 1837 | using independent_bound by blast+ | |
| 44133 | 1838 | have "dim (f ` S) \<le> card (f ` B)" | 
| 1839 | apply (rule span_card_ge_dim) | |
| 53406 | 1840 | using lf B fB | 
| 1841 | apply (auto simp add: span_linear_image spans_image subset_image_iff) | |
| 49522 | 1842 | done | 
| 53406 | 1843 | also have "\<dots> \<le> dim S" | 
| 1844 | using card_image_le[OF fB(1)] fB by simp | |
| 44133 | 1845 | finally show ?thesis . | 
| 1846 | qed | |
| 1847 | ||
| 60420 | 1848 | text \<open>Relation between bases and injectivity/surjectivity of map.\<close> | 
| 44133 | 1849 | |
| 1850 | lemma spanning_surjective_image: | |
| 1851 | assumes us: "UNIV \<subseteq> span S" | |
| 53406 | 1852 | and lf: "linear f" | 
| 1853 | and sf: "surj f" | |
| 44133 | 1854 | shows "UNIV \<subseteq> span (f ` S)" | 
| 49663 | 1855 | proof - | 
| 53406 | 1856 | have "UNIV \<subseteq> f ` UNIV" | 
| 1857 | using sf by (auto simp add: surj_def) | |
| 1858 | also have " \<dots> \<subseteq> span (f ` S)" | |
| 1859 | using spans_image[OF lf us] . | |
| 1860 | finally show ?thesis . | |
| 44133 | 1861 | qed | 
| 1862 | ||
| 1863 | lemma independent_injective_image: | |
| 49663 | 1864 | assumes iS: "independent S" | 
| 1865 | and lf: "linear f" | |
| 1866 | and fi: "inj f" | |
| 44133 | 1867 | shows "independent (f ` S)" | 
| 49663 | 1868 | proof - | 
| 53406 | 1869 |   {
 | 
| 1870 | fix a | |
| 49663 | 1871 |     assume a: "a \<in> S" "f a \<in> span (f ` S - {f a})"
 | 
| 53406 | 1872 |     have eq: "f ` S - {f a} = f ` (S - {a})"
 | 
| 1873 | using fi by (auto simp add: inj_on_def) | |
| 53716 | 1874 |     from a have "f a \<in> f ` span (S - {a})"
 | 
| 53406 | 1875 |       unfolding eq span_linear_image[OF lf, of "S - {a}"] by blast
 | 
| 53716 | 1876 |     then have "a \<in> span (S - {a})"
 | 
| 53406 | 1877 | using fi by (auto simp add: inj_on_def) | 
| 1878 | with a(1) iS have False | |
| 1879 | by (simp add: dependent_def) | |
| 1880 | } | |
| 1881 | then show ?thesis | |
| 1882 | unfolding dependent_def by blast | |
| 44133 | 1883 | qed | 
| 1884 | ||
| 60420 | 1885 | text \<open>Picking an orthogonal replacement for a spanning set.\<close> | 
| 44133 | 1886 | |
| 53406 | 1887 | (* FIXME : Move to some general theory ?*) | 
| 44133 | 1888 | definition "pairwise R S \<longleftrightarrow> (\<forall>x \<in> S. \<forall>y\<in> S. x\<noteq>y \<longrightarrow> R x y)" | 
| 1889 | ||
| 53406 | 1890 | lemma vector_sub_project_orthogonal: | 
| 1891 | fixes b x :: "'a::euclidean_space" | |
| 1892 | shows "b \<bullet> (x - ((b \<bullet> x) / (b \<bullet> b)) *\<^sub>R b) = 0" | |
| 44133 | 1893 | unfolding inner_simps by auto | 
| 1894 | ||
| 44528 | 1895 | lemma pairwise_orthogonal_insert: | 
| 1896 | assumes "pairwise orthogonal S" | |
| 49522 | 1897 | and "\<And>y. y \<in> S \<Longrightarrow> orthogonal x y" | 
| 44528 | 1898 | shows "pairwise orthogonal (insert x S)" | 
| 1899 | using assms unfolding pairwise_def | |
| 1900 | by (auto simp add: orthogonal_commute) | |
| 1901 | ||
| 44133 | 1902 | lemma basis_orthogonal: | 
| 53406 | 1903 | fixes B :: "'a::real_inner set" | 
| 44133 | 1904 | assumes fB: "finite B" | 
| 1905 | shows "\<exists>C. finite C \<and> card C \<le> card B \<and> span C = span B \<and> pairwise orthogonal C" | |
| 1906 | (is " \<exists>C. ?P B C") | |
| 49522 | 1907 | using fB | 
| 1908 | proof (induct rule: finite_induct) | |
| 1909 | case empty | |
| 53406 | 1910 | then show ?case | 
| 1911 |     apply (rule exI[where x="{}"])
 | |
| 1912 | apply (auto simp add: pairwise_def) | |
| 1913 | done | |
| 44133 | 1914 | next | 
| 49522 | 1915 | case (insert a B) | 
| 60420 | 1916 | note fB = \<open>finite B\<close> and aB = \<open>a \<notin> B\<close> | 
| 1917 | from \<open>\<exists>C. finite C \<and> card C \<le> card B \<and> span C = span B \<and> pairwise orthogonal C\<close> | |
| 44133 | 1918 | obtain C where C: "finite C" "card C \<le> card B" | 
| 1919 | "span C = span B" "pairwise orthogonal C" by blast | |
| 1920 | let ?a = "a - setsum (\<lambda>x. (x \<bullet> a / (x \<bullet> x)) *\<^sub>R x) C" | |
| 1921 | let ?C = "insert ?a C" | |
| 53406 | 1922 | from C(1) have fC: "finite ?C" | 
| 1923 | by simp | |
| 49522 | 1924 | from fB aB C(1,2) have cC: "card ?C \<le> card (insert a B)" | 
| 1925 | by (simp add: card_insert_if) | |
| 53406 | 1926 |   {
 | 
| 1927 | fix x k | |
| 49522 | 1928 | have th0: "\<And>(a::'a) b c. a - (b - c) = c + (a - b)" | 
| 1929 | by (simp add: field_simps) | |
| 44133 | 1930 | have "x - k *\<^sub>R (a - (\<Sum>x\<in>C. (x \<bullet> a / (x \<bullet> x)) *\<^sub>R x)) \<in> span C \<longleftrightarrow> x - k *\<^sub>R a \<in> span C" | 
| 1931 | apply (simp only: scaleR_right_diff_distrib th0) | |
| 1932 | apply (rule span_add_eq) | |
| 1933 | apply (rule span_mul) | |
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 1934 | apply (rule span_setsum) | 
| 44133 | 1935 | apply clarify | 
| 1936 | apply (rule span_mul) | |
| 49522 | 1937 | apply (rule span_superset) | 
| 1938 | apply assumption | |
| 53406 | 1939 | done | 
| 1940 | } | |
| 44133 | 1941 | then have SC: "span ?C = span (insert a B)" | 
| 1942 | unfolding set_eq_iff span_breakdown_eq C(3)[symmetric] by auto | |
| 53406 | 1943 |   {
 | 
| 1944 | fix y | |
| 1945 | assume yC: "y \<in> C" | |
| 1946 |     then have Cy: "C = insert y (C - {y})"
 | |
| 1947 | by blast | |
| 1948 |     have fth: "finite (C - {y})"
 | |
| 1949 | using C by simp | |
| 44528 | 1950 | have "orthogonal ?a y" | 
| 1951 | unfolding orthogonal_def | |
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53939diff
changeset | 1952 | unfolding inner_diff inner_setsum_left right_minus_eq | 
| 60420 | 1953 | unfolding setsum.remove [OF \<open>finite C\<close> \<open>y \<in> C\<close>] | 
| 44528 | 1954 | apply (clarsimp simp add: inner_commute[of y a]) | 
| 57418 | 1955 | apply (rule setsum.neutral) | 
| 44528 | 1956 | apply clarsimp | 
| 1957 | apply (rule C(4)[unfolded pairwise_def orthogonal_def, rule_format]) | |
| 60420 | 1958 | using \<open>y \<in> C\<close> by auto | 
| 53406 | 1959 | } | 
| 60420 | 1960 | with \<open>pairwise orthogonal C\<close> have CPO: "pairwise orthogonal ?C" | 
| 44528 | 1961 | by (rule pairwise_orthogonal_insert) | 
| 53406 | 1962 | from fC cC SC CPO have "?P (insert a B) ?C" | 
| 1963 | by blast | |
| 44133 | 1964 | then show ?case by blast | 
| 1965 | qed | |
| 1966 | ||
| 1967 | lemma orthogonal_basis_exists: | |
| 1968 |   fixes V :: "('a::euclidean_space) set"
 | |
| 1969 | shows "\<exists>B. independent B \<and> B \<subseteq> span V \<and> V \<subseteq> span B \<and> (card B = dim V) \<and> pairwise orthogonal B" | |
| 49663 | 1970 | proof - | 
| 49522 | 1971 | from basis_exists[of V] obtain B where | 
| 53406 | 1972 | B: "B \<subseteq> V" "independent B" "V \<subseteq> span B" "card B = dim V" | 
| 1973 | by blast | |
| 1974 | from B have fB: "finite B" "card B = dim V" | |
| 1975 | using independent_bound by auto | |
| 44133 | 1976 | from basis_orthogonal[OF fB(1)] obtain C where | 
| 53406 | 1977 | C: "finite C" "card C \<le> card B" "span C = span B" "pairwise orthogonal C" | 
| 1978 | by blast | |
| 1979 | from C B have CSV: "C \<subseteq> span V" | |
| 1980 | by (metis span_inc span_mono subset_trans) | |
| 1981 | from span_mono[OF B(3)] C have SVC: "span V \<subseteq> span C" | |
| 1982 | by (simp add: span_span) | |
| 44133 | 1983 | from card_le_dim_spanning[OF CSV SVC C(1)] C(2,3) fB | 
| 53406 | 1984 | have iC: "independent C" | 
| 44133 | 1985 | by (simp add: dim_span) | 
| 53406 | 1986 | from C fB have "card C \<le> dim V" | 
| 1987 | by simp | |
| 1988 | moreover have "dim V \<le> card C" | |
| 1989 | using span_card_ge_dim[OF CSV SVC C(1)] | |
| 1990 | by (simp add: dim_span) | |
| 1991 | ultimately have CdV: "card C = dim V" | |
| 1992 | using C(1) by simp | |
| 1993 | from C B CSV CdV iC show ?thesis | |
| 1994 | by auto | |
| 44133 | 1995 | qed | 
| 1996 | ||
| 1997 | lemma span_eq: "span S = span T \<longleftrightarrow> S \<subseteq> span T \<and> T \<subseteq> span S" | |
| 1998 | using span_inc[unfolded subset_eq] using span_mono[of T "span S"] span_mono[of S "span T"] | |
| 49522 | 1999 | by (auto simp add: span_span) | 
| 44133 | 2000 | |
| 60420 | 2001 | text \<open>Low-dimensional subset is in a hyperplane (weak orthogonal complement).\<close> | 
| 44133 | 2002 | |
| 49522 | 2003 | lemma span_not_univ_orthogonal: | 
| 53406 | 2004 | fixes S :: "'a::euclidean_space set" | 
| 44133 | 2005 | assumes sU: "span S \<noteq> UNIV" | 
| 56444 | 2006 | shows "\<exists>a::'a. a \<noteq> 0 \<and> (\<forall>x \<in> span S. a \<bullet> x = 0)" | 
| 49522 | 2007 | proof - | 
| 53406 | 2008 | from sU obtain a where a: "a \<notin> span S" | 
| 2009 | by blast | |
| 44133 | 2010 | from orthogonal_basis_exists obtain B where | 
| 2011 | B: "independent B" "B \<subseteq> span S" "S \<subseteq> span B" "card B = dim S" "pairwise orthogonal B" | |
| 2012 | by blast | |
| 53406 | 2013 | from B have fB: "finite B" "card B = dim S" | 
| 2014 | using independent_bound by auto | |
| 44133 | 2015 | from span_mono[OF B(2)] span_mono[OF B(3)] | 
| 53406 | 2016 | have sSB: "span S = span B" | 
| 2017 | by (simp add: span_span) | |
| 44133 | 2018 | let ?a = "a - setsum (\<lambda>b. (a \<bullet> b / (b \<bullet> b)) *\<^sub>R b) B" | 
| 2019 | have "setsum (\<lambda>b. (a \<bullet> b / (b \<bullet> b)) *\<^sub>R b) B \<in> span S" | |
| 2020 | unfolding sSB | |
| 56196 
32b7eafc5a52
remove unnecessary finiteness assumptions from lemmas about setsum
 huffman parents: 
56166diff
changeset | 2021 | apply (rule span_setsum) | 
| 44133 | 2022 | apply clarsimp | 
| 2023 | apply (rule span_mul) | |
| 49522 | 2024 | apply (rule span_superset) | 
| 2025 | apply assumption | |
| 2026 | done | |
| 53406 | 2027 | with a have a0:"?a \<noteq> 0" | 
| 2028 | by auto | |
| 44133 | 2029 | have "\<forall>x\<in>span B. ?a \<bullet> x = 0" | 
| 49522 | 2030 | proof (rule span_induct') | 
| 2031 |     show "subspace {x. ?a \<bullet> x = 0}"
 | |
| 2032 | by (auto simp add: subspace_def inner_add) | |
| 2033 | next | |
| 53406 | 2034 |     {
 | 
| 2035 | fix x | |
| 2036 | assume x: "x \<in> B" | |
| 2037 |       from x have B': "B = insert x (B - {x})"
 | |
| 2038 | by blast | |
| 2039 |       have fth: "finite (B - {x})"
 | |
| 2040 | using fB by simp | |
| 44133 | 2041 | have "?a \<bullet> x = 0" | 
| 53406 | 2042 | apply (subst B') | 
| 2043 | using fB fth | |
| 44133 | 2044 | unfolding setsum_clauses(2)[OF fth] | 
| 2045 | apply simp unfolding inner_simps | |
| 44527 
bf8014b4f933
remove dot_lsum and dot_rsum in favor of inner_setsum_{left,right}
 huffman parents: 
44521diff
changeset | 2046 | apply (clarsimp simp add: inner_add inner_setsum_left) | 
| 57418 | 2047 | apply (rule setsum.neutral, rule ballI) | 
| 44133 | 2048 | unfolding inner_commute | 
| 49711 | 2049 | apply (auto simp add: x field_simps | 
| 2050 | intro: B(5)[unfolded pairwise_def orthogonal_def, rule_format]) | |
| 53406 | 2051 | done | 
| 2052 | } | |
| 2053 | then show "\<forall>x \<in> B. ?a \<bullet> x = 0" | |
| 2054 | by blast | |
| 44133 | 2055 | qed | 
| 53406 | 2056 | with a0 show ?thesis | 
| 2057 | unfolding sSB by (auto intro: exI[where x="?a"]) | |
| 44133 | 2058 | qed | 
| 2059 | ||
| 2060 | lemma span_not_univ_subset_hyperplane: | |
| 53406 | 2061 | fixes S :: "'a::euclidean_space set" | 
| 2062 | assumes SU: "span S \<noteq> UNIV" | |
| 44133 | 2063 |   shows "\<exists> a. a \<noteq>0 \<and> span S \<subseteq> {x. a \<bullet> x = 0}"
 | 
| 2064 | using span_not_univ_orthogonal[OF SU] by auto | |
| 2065 | ||
| 49663 | 2066 | lemma lowdim_subset_hyperplane: | 
| 53406 | 2067 | fixes S :: "'a::euclidean_space set" | 
| 44133 | 2068 |   assumes d: "dim S < DIM('a)"
 | 
| 56444 | 2069 |   shows "\<exists>a::'a. a \<noteq> 0 \<and> span S \<subseteq> {x. a \<bullet> x = 0}"
 | 
| 49522 | 2070 | proof - | 
| 53406 | 2071 |   {
 | 
| 2072 | assume "span S = UNIV" | |
| 2073 |     then have "dim (span S) = dim (UNIV :: ('a) set)"
 | |
| 2074 | by simp | |
| 2075 |     then have "dim S = DIM('a)"
 | |
| 2076 | by (simp add: dim_span dim_UNIV) | |
| 2077 | with d have False by arith | |
| 2078 | } | |
| 2079 | then have th: "span S \<noteq> UNIV" | |
| 2080 | by blast | |
| 44133 | 2081 | from span_not_univ_subset_hyperplane[OF th] show ?thesis . | 
| 2082 | qed | |
| 2083 | ||
| 60420 | 2084 | text \<open>We can extend a linear basis-basis injection to the whole set.\<close> | 
| 44133 | 2085 | |
| 2086 | lemma linear_indep_image_lemma: | |
| 49663 | 2087 | assumes lf: "linear f" | 
| 2088 | and fB: "finite B" | |
| 49522 | 2089 | and ifB: "independent (f ` B)" | 
| 49663 | 2090 | and fi: "inj_on f B" | 
| 2091 | and xsB: "x \<in> span B" | |
| 49522 | 2092 | and fx: "f x = 0" | 
| 44133 | 2093 | shows "x = 0" | 
| 2094 | using fB ifB fi xsB fx | |
| 49522 | 2095 | proof (induct arbitrary: x rule: finite_induct[OF fB]) | 
| 49663 | 2096 | case 1 | 
| 2097 | then show ?case by auto | |
| 44133 | 2098 | next | 
| 2099 | case (2 a b x) | |
| 2100 | have fb: "finite b" using "2.prems" by simp | |
| 2101 | have th0: "f ` b \<subseteq> f ` (insert a b)" | |
| 53406 | 2102 | apply (rule image_mono) | 
| 2103 | apply blast | |
| 2104 | done | |
| 44133 | 2105 | from independent_mono[ OF "2.prems"(2) th0] | 
| 2106 | have ifb: "independent (f ` b)" . | |
| 2107 | have fib: "inj_on f b" | |
| 2108 | apply (rule subset_inj_on [OF "2.prems"(3)]) | |
| 49522 | 2109 | apply blast | 
| 2110 | done | |
| 44133 | 2111 | from span_breakdown[of a "insert a b", simplified, OF "2.prems"(4)] | 
| 53406 | 2112 |   obtain k where k: "x - k*\<^sub>R a \<in> span (b - {a})"
 | 
| 2113 | by blast | |
| 44133 | 2114 | have "f (x - k*\<^sub>R a) \<in> span (f ` b)" | 
| 2115 | unfolding span_linear_image[OF lf] | |
| 2116 | apply (rule imageI) | |
| 53716 | 2117 |     using k span_mono[of "b - {a}" b]
 | 
| 53406 | 2118 | apply blast | 
| 49522 | 2119 | done | 
| 2120 | then have "f x - k*\<^sub>R f a \<in> span (f ` b)" | |
| 44133 | 2121 | by (simp add: linear_sub[OF lf] linear_cmul[OF lf]) | 
| 49522 | 2122 | then have th: "-k *\<^sub>R f a \<in> span (f ` b)" | 
| 44133 | 2123 | using "2.prems"(5) by simp | 
| 53406 | 2124 | have xsb: "x \<in> span b" | 
| 2125 | proof (cases "k = 0") | |
| 2126 | case True | |
| 53716 | 2127 |     with k have "x \<in> span (b - {a})" by simp
 | 
| 2128 |     then show ?thesis using span_mono[of "b - {a}" b]
 | |
| 53406 | 2129 | by blast | 
| 2130 | next | |
| 2131 | case False | |
| 2132 | with span_mul[OF th, of "- 1/ k"] | |
| 44133 | 2133 | have th1: "f a \<in> span (f ` b)" | 
| 56479 
91958d4b30f7
revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
 hoelzl parents: 
56444diff
changeset | 2134 | by auto | 
| 44133 | 2135 |     from inj_on_image_set_diff[OF "2.prems"(3), of "insert a b " "{a}", symmetric]
 | 
| 2136 |     have tha: "f ` insert a b - f ` {a} = f ` (insert a b - {a})" by blast
 | |
| 2137 | from "2.prems"(2) [unfolded dependent_def bex_simps(8), rule_format, of "f a"] | |
| 2138 | have "f a \<notin> span (f ` b)" using tha | |
| 2139 | using "2.hyps"(2) | |
| 2140 | "2.prems"(3) by auto | |
| 2141 | with th1 have False by blast | |
| 53406 | 2142 | then show ?thesis by blast | 
| 2143 | qed | |
| 2144 | from "2.hyps"(3)[OF fb ifb fib xsb "2.prems"(5)] show "x = 0" . | |
| 44133 | 2145 | qed | 
| 2146 | ||
| 60420 | 2147 | text \<open>We can extend a linear mapping from basis.\<close> | 
| 44133 | 2148 | |
| 2149 | lemma linear_independent_extend_lemma: | |
| 2150 | fixes f :: "'a::real_vector \<Rightarrow> 'b::real_vector" | |
| 53406 | 2151 | assumes fi: "finite B" | 
| 2152 | and ib: "independent B" | |
| 2153 | shows "\<exists>g. | |
| 2154 | (\<forall>x\<in> span B. \<forall>y\<in> span B. g (x + y) = g x + g y) \<and> | |
| 2155 | (\<forall>x\<in> span B. \<forall>c. g (c*\<^sub>R x) = c *\<^sub>R g x) \<and> | |
| 2156 | (\<forall>x\<in> B. g x = f x)" | |
| 49663 | 2157 | using ib fi | 
| 49522 | 2158 | proof (induct rule: finite_induct[OF fi]) | 
| 49663 | 2159 | case 1 | 
| 2160 | then show ?case by auto | |
| 44133 | 2161 | next | 
| 2162 | case (2 a b) | |
| 2163 | from "2.prems" "2.hyps" have ibf: "independent b" "finite b" | |
| 2164 | by (simp_all add: independent_insert) | |
| 2165 | from "2.hyps"(3)[OF ibf] obtain g where | |
| 2166 | g: "\<forall>x\<in>span b. \<forall>y\<in>span b. g (x + y) = g x + g y" | |
| 2167 | "\<forall>x\<in>span b. \<forall>c. g (c *\<^sub>R x) = c *\<^sub>R g x" "\<forall>x\<in>b. g x = f x" by blast | |
| 2168 | let ?h = "\<lambda>z. SOME k. (z - k *\<^sub>R a) \<in> span b" | |
| 53406 | 2169 |   {
 | 
| 2170 | fix z | |
| 2171 | assume z: "z \<in> span (insert a b)" | |
| 44133 | 2172 | have th0: "z - ?h z *\<^sub>R a \<in> span b" | 
| 2173 | apply (rule someI_ex) | |
| 2174 | unfolding span_breakdown_eq[symmetric] | |
| 53406 | 2175 | apply (rule z) | 
| 2176 | done | |
| 2177 |     {
 | |
| 2178 | fix k | |
| 2179 | assume k: "z - k *\<^sub>R a \<in> span b" | |
| 44133 | 2180 | have eq: "z - ?h z *\<^sub>R a - (z - k*\<^sub>R a) = (k - ?h z) *\<^sub>R a" | 
| 2181 | by (simp add: field_simps scaleR_left_distrib [symmetric]) | |
| 53406 | 2182 | from span_sub[OF th0 k] have khz: "(k - ?h z) *\<^sub>R a \<in> span b" | 
| 2183 | by (simp add: eq) | |
| 2184 |       {
 | |
| 2185 | assume "k \<noteq> ?h z" | |
| 2186 | then have k0: "k - ?h z \<noteq> 0" by simp | |
| 44133 | 2187 | from k0 span_mul[OF khz, of "1 /(k - ?h z)"] | 
| 2188 | have "a \<in> span b" by simp | |
| 2189 | with "2.prems"(1) "2.hyps"(2) have False | |
| 53406 | 2190 | by (auto simp add: dependent_def) | 
| 2191 | } | |
| 2192 | then have "k = ?h z" by blast | |
| 2193 | } | |
| 2194 | with th0 have "z - ?h z *\<^sub>R a \<in> span b \<and> (\<forall>k. z - k *\<^sub>R a \<in> span b \<longrightarrow> k = ?h z)" | |
| 2195 | by blast | |
| 2196 | } | |
| 44133 | 2197 | note h = this | 
| 2198 | let ?g = "\<lambda>z. ?h z *\<^sub>R f a + g (z - ?h z *\<^sub>R a)" | |
| 53406 | 2199 |   {
 | 
| 2200 | fix x y | |
| 2201 | assume x: "x \<in> span (insert a b)" | |
| 2202 | and y: "y \<in> span (insert a b)" | |
| 44133 | 2203 | have tha: "\<And>(x::'a) y a k l. (x + y) - (k + l) *\<^sub>R a = (x - k *\<^sub>R a) + (y - l *\<^sub>R a)" | 
| 2204 | by (simp add: algebra_simps) | |
| 2205 | have addh: "?h (x + y) = ?h x + ?h y" | |
| 2206 | apply (rule conjunct2[OF h, rule_format, symmetric]) | |
| 2207 | apply (rule span_add[OF x y]) | |
| 2208 | unfolding tha | |
| 53406 | 2209 | apply (metis span_add x y conjunct1[OF h, rule_format]) | 
| 2210 | done | |
| 44133 | 2211 | have "?g (x + y) = ?g x + ?g y" | 
| 2212 | unfolding addh tha | |
| 2213 | g(1)[rule_format,OF conjunct1[OF h, OF x] conjunct1[OF h, OF y]] | |
| 2214 | by (simp add: scaleR_left_distrib)} | |
| 2215 | moreover | |
| 53406 | 2216 |   {
 | 
| 2217 | fix x :: "'a" | |
| 2218 | fix c :: real | |
| 49522 | 2219 | assume x: "x \<in> span (insert a b)" | 
| 44133 | 2220 | have tha: "\<And>(x::'a) c k a. c *\<^sub>R x - (c * k) *\<^sub>R a = c *\<^sub>R (x - k *\<^sub>R a)" | 
| 2221 | by (simp add: algebra_simps) | |
| 2222 | have hc: "?h (c *\<^sub>R x) = c * ?h x" | |
| 2223 | apply (rule conjunct2[OF h, rule_format, symmetric]) | |
| 2224 | apply (metis span_mul x) | |
| 49522 | 2225 | apply (metis tha span_mul x conjunct1[OF h]) | 
| 2226 | done | |
| 44133 | 2227 | have "?g (c *\<^sub>R x) = c*\<^sub>R ?g x" | 
| 2228 | unfolding hc tha g(2)[rule_format, OF conjunct1[OF h, OF x]] | |
| 53406 | 2229 | by (simp add: algebra_simps) | 
| 2230 | } | |
| 44133 | 2231 | moreover | 
| 53406 | 2232 |   {
 | 
| 2233 | fix x | |
| 2234 | assume x: "x \<in> insert a b" | |
| 2235 |     {
 | |
| 2236 | assume xa: "x = a" | |
| 44133 | 2237 | have ha1: "1 = ?h a" | 
| 2238 | apply (rule conjunct2[OF h, rule_format]) | |
| 2239 | apply (metis span_superset insertI1) | |
| 2240 | using conjunct1[OF h, OF span_superset, OF insertI1] | |
| 49522 | 2241 | apply (auto simp add: span_0) | 
| 2242 | done | |
| 44133 | 2243 | from xa ha1[symmetric] have "?g x = f x" | 
| 2244 | apply simp | |
| 2245 | using g(2)[rule_format, OF span_0, of 0] | |
| 49522 | 2246 | apply simp | 
| 53406 | 2247 | done | 
| 2248 | } | |
| 44133 | 2249 | moreover | 
| 53406 | 2250 |     {
 | 
| 2251 | assume xb: "x \<in> b" | |
| 44133 | 2252 | have h0: "0 = ?h x" | 
| 2253 | apply (rule conjunct2[OF h, rule_format]) | |
| 2254 | apply (metis span_superset x) | |
| 2255 | apply simp | |
| 2256 | apply (metis span_superset xb) | |
| 2257 | done | |
| 2258 | have "?g x = f x" | |
| 53406 | 2259 | by (simp add: h0[symmetric] g(3)[rule_format, OF xb]) | 
| 2260 | } | |
| 2261 | ultimately have "?g x = f x" | |
| 2262 | using x by blast | |
| 2263 | } | |
| 49663 | 2264 | ultimately show ?case | 
| 2265 | apply - | |
| 2266 | apply (rule exI[where x="?g"]) | |
| 2267 | apply blast | |
| 2268 | done | |
| 44133 | 2269 | qed | 
| 2270 | ||
| 2271 | lemma linear_independent_extend: | |
| 53406 | 2272 | fixes B :: "'a::euclidean_space set" | 
| 2273 | assumes iB: "independent B" | |
| 44133 | 2274 | shows "\<exists>g. linear g \<and> (\<forall>x\<in>B. g x = f x)" | 
| 49522 | 2275 | proof - | 
| 44133 | 2276 | from maximal_independent_subset_extend[of B UNIV] iB | 
| 53406 | 2277 | obtain C where C: "B \<subseteq> C" "independent C" "\<And>x. x \<in> span C" | 
| 2278 | by auto | |
| 44133 | 2279 | |
| 2280 | from C(2) independent_bound[of C] linear_independent_extend_lemma[of C f] | |
| 53406 | 2281 | obtain g where g: | 
| 2282 | "(\<forall>x\<in> span C. \<forall>y\<in> span C. g (x + y) = g x + g y) \<and> | |
| 2283 | (\<forall>x\<in> span C. \<forall>c. g (c*\<^sub>R x) = c *\<^sub>R g x) \<and> | |
| 2284 | (\<forall>x\<in> C. g x = f x)" by blast | |
| 2285 | from g show ?thesis | |
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 2286 | unfolding linear_iff | 
| 53406 | 2287 | using C | 
| 49663 | 2288 | apply clarsimp | 
| 2289 | apply blast | |
| 2290 | done | |
| 44133 | 2291 | qed | 
| 2292 | ||
| 60420 | 2293 | text \<open>Can construct an isomorphism between spaces of same dimension.\<close> | 
| 44133 | 2294 | |
| 2295 | lemma subspace_isomorphism: | |
| 53406 | 2296 | fixes S :: "'a::euclidean_space set" | 
| 2297 | and T :: "'b::euclidean_space set" | |
| 2298 | assumes s: "subspace S" | |
| 2299 | and t: "subspace T" | |
| 49522 | 2300 | and d: "dim S = dim T" | 
| 44133 | 2301 | shows "\<exists>f. linear f \<and> f ` S = T \<and> inj_on f S" | 
| 49522 | 2302 | proof - | 
| 53406 | 2303 | from basis_exists[of S] independent_bound | 
| 2304 | obtain B where B: "B \<subseteq> S" "independent B" "S \<subseteq> span B" "card B = dim S" and fB: "finite B" | |
| 2305 | by blast | |
| 2306 | from basis_exists[of T] independent_bound | |
| 2307 | obtain C where C: "C \<subseteq> T" "independent C" "T \<subseteq> span C" "card C = dim T" and fC: "finite C" | |
| 2308 | by blast | |
| 2309 | from B(4) C(4) card_le_inj[of B C] d | |
| 60420 | 2310 | obtain f where f: "f ` B \<subseteq> C" "inj_on f B" using \<open>finite B\<close> \<open>finite C\<close> | 
| 53406 | 2311 | by auto | 
| 2312 | from linear_independent_extend[OF B(2)] | |
| 2313 | obtain g where g: "linear g" "\<forall>x\<in> B. g x = f x" | |
| 2314 | by blast | |
| 2315 | from inj_on_iff_eq_card[OF fB, of f] f(2) have "card (f ` B) = card B" | |
| 44133 | 2316 | by simp | 
| 53406 | 2317 | with B(4) C(4) have ceq: "card (f ` B) = card C" | 
| 2318 | using d by simp | |
| 2319 | have "g ` B = f ` B" | |
| 2320 | using g(2) by (auto simp add: image_iff) | |
| 44133 | 2321 | also have "\<dots> = C" using card_subset_eq[OF fC f(1) ceq] . | 
| 2322 | finally have gBC: "g ` B = C" . | |
| 53406 | 2323 | have gi: "inj_on g B" | 
| 2324 | using f(2) g(2) by (auto simp add: inj_on_def) | |
| 44133 | 2325 | note g0 = linear_indep_image_lemma[OF g(1) fB, unfolded gBC, OF C(2) gi] | 
| 53406 | 2326 |   {
 | 
| 2327 | fix x y | |
| 2328 | assume x: "x \<in> S" and y: "y \<in> S" and gxy: "g x = g y" | |
| 2329 | from B(3) x y have x': "x \<in> span B" and y': "y \<in> span B" | |
| 2330 | by blast+ | |
| 2331 | from gxy have th0: "g (x - y) = 0" | |
| 2332 | by (simp add: linear_sub[OF g(1)]) | |
| 2333 | have th1: "x - y \<in> span B" | |
| 2334 | using x' y' by (metis span_sub) | |
| 2335 | have "x = y" | |
| 2336 | using g0[OF th1 th0] by simp | |
| 2337 | } | |
| 44133 | 2338 | then have giS: "inj_on g S" | 
| 2339 | unfolding inj_on_def by blast | |
| 53406 | 2340 | from span_subspace[OF B(1,3) s] have "g ` S = span (g ` B)" | 
| 2341 | by (simp add: span_linear_image[OF g(1)]) | |
| 44133 | 2342 | also have "\<dots> = span C" unfolding gBC .. | 
| 2343 | also have "\<dots> = T" using span_subspace[OF C(1,3) t] . | |
| 2344 | finally have gS: "g ` S = T" . | |
| 53406 | 2345 | from g(1) gS giS show ?thesis | 
| 2346 | by blast | |
| 44133 | 2347 | qed | 
| 2348 | ||
| 60420 | 2349 | text \<open>Linear functions are equal on a subspace if they are on a spanning set.\<close> | 
| 44133 | 2350 | |
| 2351 | lemma subspace_kernel: | |
| 2352 | assumes lf: "linear f" | |
| 2353 |   shows "subspace {x. f x = 0}"
 | |
| 49522 | 2354 | apply (simp add: subspace_def) | 
| 2355 | apply (simp add: linear_add[OF lf] linear_cmul[OF lf] linear_0[OF lf]) | |
| 2356 | done | |
| 44133 | 2357 | |
| 2358 | lemma linear_eq_0_span: | |
| 2359 | assumes lf: "linear f" and f0: "\<forall>x\<in>B. f x = 0" | |
| 2360 | shows "\<forall>x \<in> span B. f x = 0" | |
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 2361 | using f0 subspace_kernel[OF lf] | 
| 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 2362 | by (rule span_induct') | 
| 44133 | 2363 | |
| 2364 | lemma linear_eq_0: | |
| 49663 | 2365 | assumes lf: "linear f" | 
| 2366 | and SB: "S \<subseteq> span B" | |
| 2367 | and f0: "\<forall>x\<in>B. f x = 0" | |
| 44133 | 2368 | shows "\<forall>x \<in> S. f x = 0" | 
| 2369 | by (metis linear_eq_0_span[OF lf] subset_eq SB f0) | |
| 2370 | ||
| 2371 | lemma linear_eq: | |
| 49663 | 2372 | assumes lf: "linear f" | 
| 2373 | and lg: "linear g" | |
| 2374 | and S: "S \<subseteq> span B" | |
| 49522 | 2375 | and fg: "\<forall> x\<in> B. f x = g x" | 
| 44133 | 2376 | shows "\<forall>x\<in> S. f x = g x" | 
| 49663 | 2377 | proof - | 
| 44133 | 2378 | let ?h = "\<lambda>x. f x - g x" | 
| 2379 | from fg have fg': "\<forall>x\<in> B. ?h x = 0" by simp | |
| 2380 | from linear_eq_0[OF linear_compose_sub[OF lf lg] S fg'] | |
| 2381 | show ?thesis by simp | |
| 2382 | qed | |
| 2383 | ||
| 2384 | lemma linear_eq_stdbasis: | |
| 56444 | 2385 | fixes f :: "'a::euclidean_space \<Rightarrow> _" | 
| 2386 | assumes lf: "linear f" | |
| 49663 | 2387 | and lg: "linear g" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2388 | and fg: "\<forall>b\<in>Basis. f b = g b" | 
| 44133 | 2389 | shows "f = g" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2390 | using linear_eq[OF lf lg, of _ Basis] fg by auto | 
| 44133 | 2391 | |
| 60420 | 2392 | text \<open>Similar results for bilinear functions.\<close> | 
| 44133 | 2393 | |
| 2394 | lemma bilinear_eq: | |
| 2395 | assumes bf: "bilinear f" | |
| 49522 | 2396 | and bg: "bilinear g" | 
| 53406 | 2397 | and SB: "S \<subseteq> span B" | 
| 2398 | and TC: "T \<subseteq> span C" | |
| 49522 | 2399 | and fg: "\<forall>x\<in> B. \<forall>y\<in> C. f x y = g x y" | 
| 44133 | 2400 | shows "\<forall>x\<in>S. \<forall>y\<in>T. f x y = g x y " | 
| 49663 | 2401 | proof - | 
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 2402 |   let ?P = "{x. \<forall>y\<in> span C. f x y = g x y}"
 | 
| 44133 | 2403 | from bf bg have sp: "subspace ?P" | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 2404 | unfolding bilinear_def linear_iff subspace_def bf bg | 
| 49663 | 2405 | by (auto simp add: span_0 bilinear_lzero[OF bf] bilinear_lzero[OF bg] span_add Ball_def | 
| 2406 | intro: bilinear_ladd[OF bf]) | |
| 44133 | 2407 | |
| 2408 | have "\<forall>x \<in> span B. \<forall>y\<in> span C. f x y = g x y" | |
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 2409 | apply (rule span_induct' [OF _ sp]) | 
| 44133 | 2410 | apply (rule ballI) | 
| 44170 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 2411 | apply (rule span_induct') | 
| 
510ac30f44c0
make Multivariate_Analysis work with separate set type
 huffman parents: 
44166diff
changeset | 2412 | apply (simp add: fg) | 
| 44133 | 2413 | apply (auto simp add: subspace_def) | 
| 53600 
8fda7ad57466
make 'linear' into a sublocale of 'bounded_linear';
 huffman parents: 
53596diff
changeset | 2414 | using bf bg unfolding bilinear_def linear_iff | 
| 49522 | 2415 | apply (auto simp add: span_0 bilinear_rzero[OF bf] bilinear_rzero[OF bg] span_add Ball_def | 
| 49663 | 2416 | intro: bilinear_ladd[OF bf]) | 
| 49522 | 2417 | done | 
| 53406 | 2418 | then show ?thesis | 
| 2419 | using SB TC by auto | |
| 44133 | 2420 | qed | 
| 2421 | ||
| 49522 | 2422 | lemma bilinear_eq_stdbasis: | 
| 53406 | 2423 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space \<Rightarrow> _" | 
| 44133 | 2424 | assumes bf: "bilinear f" | 
| 49522 | 2425 | and bg: "bilinear g" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2426 | and fg: "\<forall>i\<in>Basis. \<forall>j\<in>Basis. f i j = g i j" | 
| 44133 | 2427 | shows "f = g" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2428 | using bilinear_eq[OF bf bg equalityD2[OF span_Basis] equalityD2[OF span_Basis] fg] by blast | 
| 44133 | 2429 | |
| 60420 | 2430 | text \<open>Detailed theorems about left and right invertibility in general case.\<close> | 
| 44133 | 2431 | |
| 49522 | 2432 | lemma linear_injective_left_inverse: | 
| 56444 | 2433 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space" | 
| 2434 | assumes lf: "linear f" | |
| 2435 | and fi: "inj f" | |
| 2436 | shows "\<exists>g. linear g \<and> g \<circ> f = id" | |
| 49522 | 2437 | proof - | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2438 | from linear_independent_extend[OF independent_injective_image, OF independent_Basis, OF lf fi] | 
| 56444 | 2439 | obtain h :: "'b \<Rightarrow> 'a" where h: "linear h" "\<forall>x \<in> f ` Basis. h x = inv f x" | 
| 53406 | 2440 | by blast | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2441 | from h(2) have th: "\<forall>i\<in>Basis. (h \<circ> f) i = id i" | 
| 44133 | 2442 | using inv_o_cancel[OF fi, unfolded fun_eq_iff id_def o_def] | 
| 2443 | by auto | |
| 2444 | from linear_eq_stdbasis[OF linear_compose[OF lf h(1)] linear_id th] | |
| 56444 | 2445 | have "h \<circ> f = id" . | 
| 53406 | 2446 | then show ?thesis | 
| 2447 | using h(1) by blast | |
| 44133 | 2448 | qed | 
| 2449 | ||
| 49522 | 2450 | lemma linear_surjective_right_inverse: | 
| 53406 | 2451 | fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space" | 
| 2452 | assumes lf: "linear f" | |
| 2453 | and sf: "surj f" | |
| 56444 | 2454 | shows "\<exists>g. linear g \<and> f \<circ> g = id" | 
| 49522 | 2455 | proof - | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2456 | from linear_independent_extend[OF independent_Basis[where 'a='b],of "inv f"] | 
| 56444 | 2457 | obtain h :: "'b \<Rightarrow> 'a" where h: "linear h" "\<forall>x\<in>Basis. h x = inv f x" | 
| 53406 | 2458 | by blast | 
| 56444 | 2459 | from h(2) have th: "\<forall>i\<in>Basis. (f \<circ> h) i = id i" | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2460 | using sf by (auto simp add: surj_iff_all) | 
| 44133 | 2461 | from linear_eq_stdbasis[OF linear_compose[OF h(1) lf] linear_id th] | 
| 56444 | 2462 | have "f \<circ> h = id" . | 
| 53406 | 2463 | then show ?thesis | 
| 2464 | using h(1) by blast | |
| 44133 | 2465 | qed | 
| 2466 | ||
| 60420 | 2467 | text \<open>An injective map @{typ "'a::euclidean_space \<Rightarrow> 'b::euclidean_space"} is also surjective.\<close>
 | 
| 44133 | 2468 | |
| 49522 | 2469 | lemma linear_injective_imp_surjective: | 
| 56444 | 2470 | fixes f :: "'a::euclidean_space \<Rightarrow> 'a::euclidean_space" | 
| 53406 | 2471 | assumes lf: "linear f" | 
| 2472 | and fi: "inj f" | |
| 44133 | 2473 | shows "surj f" | 
| 49522 | 2474 | proof - | 
| 44133 | 2475 | let ?U = "UNIV :: 'a set" | 
| 2476 | from basis_exists[of ?U] obtain B | |
| 2477 | where B: "B \<subseteq> ?U" "independent B" "?U \<subseteq> span B" "card B = dim ?U" | |
| 2478 | by blast | |
| 53406 | 2479 | from B(4) have d: "dim ?U = card B" | 
| 2480 | by simp | |
| 44133 | 2481 | have th: "?U \<subseteq> span (f ` B)" | 
| 2482 | apply (rule card_ge_dim_independent) | |
| 2483 | apply blast | |
| 2484 | apply (rule independent_injective_image[OF B(2) lf fi]) | |
| 2485 | apply (rule order_eq_refl) | |
| 2486 | apply (rule sym) | |
| 2487 | unfolding d | |
| 2488 | apply (rule card_image) | |
| 2489 | apply (rule subset_inj_on[OF fi]) | |
| 49522 | 2490 | apply blast | 
| 2491 | done | |
| 44133 | 2492 | from th show ?thesis | 
| 2493 | unfolding span_linear_image[OF lf] surj_def | |
| 2494 | using B(3) by blast | |
| 2495 | qed | |
| 2496 | ||
| 60420 | 2497 | text \<open>And vice versa.\<close> | 
| 44133 | 2498 | |
| 2499 | lemma surjective_iff_injective_gen: | |
| 49663 | 2500 | assumes fS: "finite S" | 
| 2501 | and fT: "finite T" | |
| 2502 | and c: "card S = card T" | |
| 49522 | 2503 | and ST: "f ` S \<subseteq> T" | 
| 53406 | 2504 | shows "(\<forall>y \<in> T. \<exists>x \<in> S. f x = y) \<longleftrightarrow> inj_on f S" | 
| 2505 | (is "?lhs \<longleftrightarrow> ?rhs") | |
| 2506 | proof | |
| 2507 | assume h: "?lhs" | |
| 2508 |   {
 | |
| 2509 | fix x y | |
| 2510 | assume x: "x \<in> S" | |
| 2511 | assume y: "y \<in> S" | |
| 2512 | assume f: "f x = f y" | |
| 2513 | from x fS have S0: "card S \<noteq> 0" | |
| 2514 | by auto | |
| 2515 | have "x = y" | |
| 2516 | proof (rule ccontr) | |
| 53716 | 2517 | assume xy: "\<not> ?thesis" | 
| 53406 | 2518 |       have th: "card S \<le> card (f ` (S - {y}))"
 | 
| 2519 | unfolding c | |
| 2520 | apply (rule card_mono) | |
| 2521 | apply (rule finite_imageI) | |
| 2522 | using fS apply simp | |
| 2523 | using h xy x y f unfolding subset_eq image_iff | |
| 2524 | apply auto | |
| 2525 | apply (case_tac "xa = f x") | |
| 2526 | apply (rule bexI[where x=x]) | |
| 2527 | apply auto | |
| 2528 | done | |
| 53716 | 2529 |       also have " \<dots> \<le> card (S - {y})"
 | 
| 53406 | 2530 | apply (rule card_image_le) | 
| 2531 | using fS by simp | |
| 2532 | also have "\<dots> \<le> card S - 1" using y fS by simp | |
| 2533 | finally show False using S0 by arith | |
| 2534 | qed | |
| 2535 | } | |
| 2536 | then show ?rhs | |
| 2537 | unfolding inj_on_def by blast | |
| 2538 | next | |
| 2539 | assume h: ?rhs | |
| 2540 | have "f ` S = T" | |
| 2541 | apply (rule card_subset_eq[OF fT ST]) | |
| 2542 | unfolding card_image[OF h] | |
| 2543 | apply (rule c) | |
| 2544 | done | |
| 2545 | then show ?lhs by blast | |
| 44133 | 2546 | qed | 
| 2547 | ||
| 49522 | 2548 | lemma linear_surjective_imp_injective: | 
| 53406 | 2549 | fixes f :: "'a::euclidean_space \<Rightarrow> 'a::euclidean_space" | 
| 2550 | assumes lf: "linear f" | |
| 2551 | and sf: "surj f" | |
| 44133 | 2552 | shows "inj f" | 
| 49522 | 2553 | proof - | 
| 44133 | 2554 | let ?U = "UNIV :: 'a set" | 
| 2555 | from basis_exists[of ?U] obtain B | |
| 2556 | where B: "B \<subseteq> ?U" "independent B" "?U \<subseteq> span B" and d: "card B = dim ?U" | |
| 2557 | by blast | |
| 53406 | 2558 |   {
 | 
| 2559 | fix x | |
| 2560 | assume x: "x \<in> span B" | |
| 2561 | assume fx: "f x = 0" | |
| 2562 | from B(2) have fB: "finite B" | |
| 2563 | using independent_bound by auto | |
| 44133 | 2564 | have fBi: "independent (f ` B)" | 
| 2565 | apply (rule card_le_dim_spanning[of "f ` B" ?U]) | |
| 2566 | apply blast | |
| 2567 | using sf B(3) | |
| 2568 | unfolding span_linear_image[OF lf] surj_def subset_eq image_iff | |
| 2569 | apply blast | |
| 2570 | using fB apply blast | |
| 2571 | unfolding d[symmetric] | |
| 2572 | apply (rule card_image_le) | |
| 2573 | apply (rule fB) | |
| 2574 | done | |
| 2575 | have th0: "dim ?U \<le> card (f ` B)" | |
| 2576 | apply (rule span_card_ge_dim) | |
| 2577 | apply blast | |
| 2578 | unfolding span_linear_image[OF lf] | |
| 2579 | apply (rule subset_trans[where B = "f ` UNIV"]) | |
| 53406 | 2580 | using sf unfolding surj_def | 
| 2581 | apply blast | |
| 44133 | 2582 | apply (rule image_mono) | 
| 2583 | apply (rule B(3)) | |
| 2584 | apply (metis finite_imageI fB) | |
| 2585 | done | |
| 2586 | moreover have "card (f ` B) \<le> card B" | |
| 2587 | by (rule card_image_le, rule fB) | |
| 53406 | 2588 | ultimately have th1: "card B = card (f ` B)" | 
| 2589 | unfolding d by arith | |
| 44133 | 2590 | have fiB: "inj_on f B" | 
| 49522 | 2591 | unfolding surjective_iff_injective_gen[OF fB finite_imageI[OF fB] th1 subset_refl, symmetric] | 
| 2592 | by blast | |
| 44133 | 2593 | from linear_indep_image_lemma[OF lf fB fBi fiB x] fx | 
| 53406 | 2594 | have "x = 0" by blast | 
| 2595 | } | |
| 2596 | then show ?thesis | |
| 2597 | unfolding linear_injective_0[OF lf] | |
| 2598 | using B(3) | |
| 2599 | by blast | |
| 44133 | 2600 | qed | 
| 2601 | ||
| 60420 | 2602 | text \<open>Hence either is enough for isomorphism.\<close> | 
| 44133 | 2603 | |
| 2604 | lemma left_right_inverse_eq: | |
| 53406 | 2605 | assumes fg: "f \<circ> g = id" | 
| 2606 | and gh: "g \<circ> h = id" | |
| 44133 | 2607 | shows "f = h" | 
| 49522 | 2608 | proof - | 
| 53406 | 2609 | have "f = f \<circ> (g \<circ> h)" | 
| 2610 | unfolding gh by simp | |
| 2611 | also have "\<dots> = (f \<circ> g) \<circ> h" | |
| 2612 | by (simp add: o_assoc) | |
| 2613 | finally show "f = h" | |
| 2614 | unfolding fg by simp | |
| 44133 | 2615 | qed | 
| 2616 | ||
| 2617 | lemma isomorphism_expand: | |
| 53406 | 2618 | "f \<circ> g = id \<and> g \<circ> f = id \<longleftrightarrow> (\<forall>x. f (g x) = x) \<and> (\<forall>x. g (f x) = x)" | 
| 44133 | 2619 | by (simp add: fun_eq_iff o_def id_def) | 
| 2620 | ||
| 49522 | 2621 | lemma linear_injective_isomorphism: | 
| 56444 | 2622 | fixes f :: "'a::euclidean_space \<Rightarrow> 'a::euclidean_space" | 
| 53406 | 2623 | assumes lf: "linear f" | 
| 2624 | and fi: "inj f" | |
| 44133 | 2625 | shows "\<exists>f'. linear f' \<and> (\<forall>x. f' (f x) = x) \<and> (\<forall>x. f (f' x) = x)" | 
| 49522 | 2626 | unfolding isomorphism_expand[symmetric] | 
| 2627 | using linear_surjective_right_inverse[OF lf linear_injective_imp_surjective[OF lf fi]] | |
| 2628 | linear_injective_left_inverse[OF lf fi] | |
| 2629 | by (metis left_right_inverse_eq) | |
| 44133 | 2630 | |
| 53406 | 2631 | lemma linear_surjective_isomorphism: | 
| 2632 | fixes f :: "'a::euclidean_space \<Rightarrow> 'a::euclidean_space" | |
| 2633 | assumes lf: "linear f" | |
| 2634 | and sf: "surj f" | |
| 44133 | 2635 | shows "\<exists>f'. linear f' \<and> (\<forall>x. f' (f x) = x) \<and> (\<forall>x. f (f' x) = x)" | 
| 49522 | 2636 | unfolding isomorphism_expand[symmetric] | 
| 2637 | using linear_surjective_right_inverse[OF lf sf] | |
| 2638 | linear_injective_left_inverse[OF lf linear_surjective_imp_injective[OF lf sf]] | |
| 2639 | by (metis left_right_inverse_eq) | |
| 44133 | 2640 | |
| 60420 | 2641 | text \<open>Left and right inverses are the same for | 
| 2642 |   @{typ "'a::euclidean_space \<Rightarrow> 'a::euclidean_space"}.\<close>
 | |
| 44133 | 2643 | |
| 49522 | 2644 | lemma linear_inverse_left: | 
| 53406 | 2645 | fixes f :: "'a::euclidean_space \<Rightarrow> 'a::euclidean_space" | 
| 2646 | assumes lf: "linear f" | |
| 2647 | and lf': "linear f'" | |
| 2648 | shows "f \<circ> f' = id \<longleftrightarrow> f' \<circ> f = id" | |
| 49522 | 2649 | proof - | 
| 53406 | 2650 |   {
 | 
| 2651 | fix f f':: "'a \<Rightarrow> 'a" | |
| 2652 | assume lf: "linear f" "linear f'" | |
| 2653 | assume f: "f \<circ> f' = id" | |
| 44133 | 2654 | from f have sf: "surj f" | 
| 2655 | apply (auto simp add: o_def id_def surj_def) | |
| 49522 | 2656 | apply metis | 
| 2657 | done | |
| 44133 | 2658 | from linear_surjective_isomorphism[OF lf(1) sf] lf f | 
| 53406 | 2659 | have "f' \<circ> f = id" | 
| 2660 | unfolding fun_eq_iff o_def id_def by metis | |
| 2661 | } | |
| 2662 | then show ?thesis | |
| 2663 | using lf lf' by metis | |
| 44133 | 2664 | qed | 
| 2665 | ||
| 60420 | 2666 | text \<open>Moreover, a one-sided inverse is automatically linear.\<close> | 
| 44133 | 2667 | |
| 49522 | 2668 | lemma left_inverse_linear: | 
| 53406 | 2669 | fixes f :: "'a::euclidean_space \<Rightarrow> 'a::euclidean_space" | 
| 2670 | assumes lf: "linear f" | |
| 2671 | and gf: "g \<circ> f = id" | |
| 44133 | 2672 | shows "linear g" | 
| 49522 | 2673 | proof - | 
| 2674 | from gf have fi: "inj f" | |
| 2675 | apply (auto simp add: inj_on_def o_def id_def fun_eq_iff) | |
| 2676 | apply metis | |
| 2677 | done | |
| 44133 | 2678 | from linear_injective_isomorphism[OF lf fi] | 
| 53406 | 2679 | obtain h :: "'a \<Rightarrow> 'a" where h: "linear h" "\<forall>x. h (f x) = x" "\<forall>x. f (h x) = x" | 
| 2680 | by blast | |
| 49522 | 2681 | have "h = g" | 
| 2682 | apply (rule ext) using gf h(2,3) | |
| 44133 | 2683 | apply (simp add: o_def id_def fun_eq_iff) | 
| 49522 | 2684 | apply metis | 
| 2685 | done | |
| 44133 | 2686 | with h(1) show ?thesis by blast | 
| 2687 | qed | |
| 2688 | ||
| 49522 | 2689 | |
| 60420 | 2690 | subsection \<open>Infinity norm\<close> | 
| 44133 | 2691 | |
| 56444 | 2692 | definition "infnorm (x::'a::euclidean_space) = Sup {\<bar>x \<bullet> b\<bar> |b. b \<in> Basis}"
 | 
| 44133 | 2693 | |
| 2694 | lemma infnorm_set_image: | |
| 53716 | 2695 | fixes x :: "'a::euclidean_space" | 
| 56444 | 2696 |   shows "{\<bar>x \<bullet> i\<bar> |i. i \<in> Basis} = (\<lambda>i. \<bar>x \<bullet> i\<bar>) ` Basis"
 | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2697 | by blast | 
| 44133 | 2698 | |
| 53716 | 2699 | lemma infnorm_Max: | 
| 2700 | fixes x :: "'a::euclidean_space" | |
| 56444 | 2701 | shows "infnorm x = Max ((\<lambda>i. \<bar>x \<bullet> i\<bar>) ` Basis)" | 
| 56166 | 2702 | by (simp add: infnorm_def infnorm_set_image cSup_eq_Max del: Sup_image_eq) | 
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2703 | |
| 44133 | 2704 | lemma infnorm_set_lemma: | 
| 53716 | 2705 | fixes x :: "'a::euclidean_space" | 
| 56444 | 2706 |   shows "finite {\<bar>x \<bullet> i\<bar> |i. i \<in> Basis}"
 | 
| 2707 |     and "{\<bar>x \<bullet> i\<bar> |i. i \<in> Basis} \<noteq> {}"
 | |
| 44133 | 2708 | unfolding infnorm_set_image | 
| 2709 | by auto | |
| 2710 | ||
| 53406 | 2711 | lemma infnorm_pos_le: | 
| 2712 | fixes x :: "'a::euclidean_space" | |
| 2713 | shows "0 \<le> infnorm x" | |
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2714 | by (simp add: infnorm_Max Max_ge_iff ex_in_conv) | 
| 44133 | 2715 | |
| 53406 | 2716 | lemma infnorm_triangle: | 
| 2717 | fixes x :: "'a::euclidean_space" | |
| 2718 | shows "infnorm (x + y) \<le> infnorm x + infnorm y" | |
| 49522 | 2719 | proof - | 
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2720 | have *: "\<And>a b c d :: real. \<bar>a\<bar> \<le> c \<Longrightarrow> \<bar>b\<bar> \<le> d \<Longrightarrow> \<bar>a + b\<bar> \<le> c + d" | 
| 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2721 | by simp | 
| 44133 | 2722 | show ?thesis | 
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2723 | by (auto simp: infnorm_Max inner_add_left intro!: *) | 
| 44133 | 2724 | qed | 
| 2725 | ||
| 53406 | 2726 | lemma infnorm_eq_0: | 
| 2727 | fixes x :: "'a::euclidean_space" | |
| 2728 | shows "infnorm x = 0 \<longleftrightarrow> x = 0" | |
| 49522 | 2729 | proof - | 
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2730 | have "infnorm x \<le> 0 \<longleftrightarrow> x = 0" | 
| 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2731 | unfolding infnorm_Max by (simp add: euclidean_all_zero_iff) | 
| 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2732 | then show ?thesis | 
| 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2733 | using infnorm_pos_le[of x] by simp | 
| 44133 | 2734 | qed | 
| 2735 | ||
| 2736 | lemma infnorm_0: "infnorm 0 = 0" | |
| 2737 | by (simp add: infnorm_eq_0) | |
| 2738 | ||
| 2739 | lemma infnorm_neg: "infnorm (- x) = infnorm x" | |
| 2740 | unfolding infnorm_def | |
| 2741 | apply (rule cong[of "Sup" "Sup"]) | |
| 49522 | 2742 | apply blast | 
| 2743 | apply auto | |
| 2744 | done | |
| 44133 | 2745 | |
| 2746 | lemma infnorm_sub: "infnorm (x - y) = infnorm (y - x)" | |
| 49522 | 2747 | proof - | 
| 44133 | 2748 | have "y - x = - (x - y)" by simp | 
| 53406 | 2749 | then show ?thesis | 
| 2750 | by (metis infnorm_neg) | |
| 44133 | 2751 | qed | 
| 2752 | ||
| 53406 | 2753 | lemma real_abs_sub_infnorm: "\<bar>infnorm x - infnorm y\<bar> \<le> infnorm (x - y)" | 
| 49522 | 2754 | proof - | 
| 56444 | 2755 | have th: "\<And>(nx::real) n ny. nx \<le> n + ny \<Longrightarrow> ny \<le> n + nx \<Longrightarrow> \<bar>nx - ny\<bar> \<le> n" | 
| 44133 | 2756 | by arith | 
| 2757 | from infnorm_triangle[of "x - y" " y"] infnorm_triangle[of "x - y" "-x"] | |
| 2758 | have ths: "infnorm x \<le> infnorm (x - y) + infnorm y" | |
| 2759 | "infnorm y \<le> infnorm (x - y) + infnorm x" | |
| 44454 | 2760 | by (simp_all add: field_simps infnorm_neg) | 
| 53406 | 2761 | from th[OF ths] show ?thesis . | 
| 44133 | 2762 | qed | 
| 2763 | ||
| 53406 | 2764 | lemma real_abs_infnorm: "\<bar>infnorm x\<bar> = infnorm x" | 
| 44133 | 2765 | using infnorm_pos_le[of x] by arith | 
| 2766 | ||
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2767 | lemma Basis_le_infnorm: | 
| 53406 | 2768 | fixes x :: "'a::euclidean_space" | 
| 2769 | shows "b \<in> Basis \<Longrightarrow> \<bar>x \<bullet> b\<bar> \<le> infnorm x" | |
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2770 | by (simp add: infnorm_Max) | 
| 44133 | 2771 | |
| 56444 | 2772 | lemma infnorm_mul: "infnorm (a *\<^sub>R x) = \<bar>a\<bar> * infnorm x" | 
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2773 | unfolding infnorm_Max | 
| 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2774 | proof (safe intro!: Max_eqI) | 
| 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2775 | let ?B = "(\<lambda>i. \<bar>x \<bullet> i\<bar>) ` Basis" | 
| 53406 | 2776 |   {
 | 
| 2777 | fix b :: 'a | |
| 2778 | assume "b \<in> Basis" | |
| 2779 | then show "\<bar>a *\<^sub>R x \<bullet> b\<bar> \<le> \<bar>a\<bar> * Max ?B" | |
| 2780 | by (simp add: abs_mult mult_left_mono) | |
| 2781 | next | |
| 2782 | from Max_in[of ?B] obtain b where "b \<in> Basis" "Max ?B = \<bar>x \<bullet> b\<bar>" | |
| 2783 | by (auto simp del: Max_in) | |
| 2784 | then show "\<bar>a\<bar> * Max ((\<lambda>i. \<bar>x \<bullet> i\<bar>) ` Basis) \<in> (\<lambda>i. \<bar>a *\<^sub>R x \<bullet> i\<bar>) ` Basis" | |
| 2785 | by (intro image_eqI[where x=b]) (auto simp: abs_mult) | |
| 2786 | } | |
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2787 | qed simp | 
| 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2788 | |
| 53406 | 2789 | lemma infnorm_mul_lemma: "infnorm (a *\<^sub>R x) \<le> \<bar>a\<bar> * infnorm x" | 
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2790 | unfolding infnorm_mul .. | 
| 44133 | 2791 | |
| 2792 | lemma infnorm_pos_lt: "infnorm x > 0 \<longleftrightarrow> x \<noteq> 0" | |
| 2793 | using infnorm_pos_le[of x] infnorm_eq_0[of x] by arith | |
| 2794 | ||
| 60420 | 2795 | text \<open>Prove that it differs only up to a bound from Euclidean norm.\<close> | 
| 44133 | 2796 | |
| 2797 | lemma infnorm_le_norm: "infnorm x \<le> norm x" | |
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2798 | by (simp add: Basis_le_norm infnorm_Max) | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2799 | |
| 54776 
db890d9fc5c2
ordered_euclidean_space compatible with more standard pointwise ordering on products; conditionally complete lattice with product order
 immler parents: 
54703diff
changeset | 2800 | lemma (in euclidean_space) euclidean_inner: "inner x y = (\<Sum>b\<in>Basis. (x \<bullet> b) * (y \<bullet> b))" | 
| 57418 | 2801 | by (subst (1 2) euclidean_representation [symmetric]) | 
| 2802 | (simp add: inner_setsum_right inner_Basis ac_simps) | |
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2803 | |
| 53716 | 2804 | lemma norm_le_infnorm: | 
| 2805 | fixes x :: "'a::euclidean_space" | |
| 2806 |   shows "norm x \<le> sqrt DIM('a) * infnorm x"
 | |
| 49522 | 2807 | proof - | 
| 44133 | 2808 |   let ?d = "DIM('a)"
 | 
| 53406 | 2809 | have "real ?d \<ge> 0" | 
| 2810 | by simp | |
| 53077 | 2811 | then have d2: "(sqrt (real ?d))\<^sup>2 = real ?d" | 
| 44133 | 2812 | by (auto intro: real_sqrt_pow2) | 
| 2813 | have th: "sqrt (real ?d) * infnorm x \<ge> 0" | |
| 2814 | by (simp add: zero_le_mult_iff infnorm_pos_le) | |
| 53077 | 2815 | have th1: "x \<bullet> x \<le> (sqrt (real ?d) * infnorm x)\<^sup>2" | 
| 44133 | 2816 | unfolding power_mult_distrib d2 | 
| 50526 
899c9c4e4a4c
Remove the indexed basis from the definition of euclidean spaces and only use the set of Basis vectors
 hoelzl parents: 
50105diff
changeset | 2817 | unfolding real_of_nat_def | 
| 53716 | 2818 | apply (subst euclidean_inner) | 
| 44133 | 2819 | apply (subst power2_abs[symmetric]) | 
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
51478diff
changeset | 2820 | apply (rule order_trans[OF setsum_bounded[where K="\<bar>infnorm x\<bar>\<^sup>2"]]) | 
| 49663 | 2821 | apply (auto simp add: power2_eq_square[symmetric]) | 
| 44133 | 2822 | apply (subst power2_abs[symmetric]) | 
| 2823 | apply (rule power_mono) | |
| 51475 
ebf9d4fd00ba
introduct the conditional_complete_lattice type class; generalize theorems about real Sup and Inf to it
 hoelzl parents: 
50526diff
changeset | 2824 | apply (auto simp: infnorm_Max) | 
| 49522 | 2825 | done | 
| 44133 | 2826 | from real_le_lsqrt[OF inner_ge_zero th th1] | 
| 53406 | 2827 | show ?thesis | 
| 2828 | unfolding norm_eq_sqrt_inner id_def . | |
| 44133 | 2829 | qed | 
| 2830 | ||
| 44646 | 2831 | lemma tendsto_infnorm [tendsto_intros]: | 
| 49522 | 2832 | assumes "(f ---> a) F" | 
| 2833 | shows "((\<lambda>x. infnorm (f x)) ---> infnorm a) F" | |
| 44646 | 2834 | proof (rule tendsto_compose [OF LIM_I assms]) | 
| 53406 | 2835 | fix r :: real | 
| 2836 | assume "r > 0" | |
| 49522 | 2837 | then show "\<exists>s>0. \<forall>x. x \<noteq> a \<and> norm (x - a) < s \<longrightarrow> norm (infnorm x - infnorm a) < r" | 
| 44646 | 2838 | by (metis real_norm_def le_less_trans real_abs_sub_infnorm infnorm_le_norm) | 
| 2839 | qed | |
| 2840 | ||
| 60420 | 2841 | text \<open>Equality in Cauchy-Schwarz and triangle inequalities.\<close> | 
| 44133 | 2842 | |
| 53406 | 2843 | lemma norm_cauchy_schwarz_eq: "x \<bullet> y = norm x * norm y \<longleftrightarrow> norm x *\<^sub>R y = norm y *\<^sub>R x" | 
| 2844 | (is "?lhs \<longleftrightarrow> ?rhs") | |
| 49522 | 2845 | proof - | 
| 53406 | 2846 |   {
 | 
| 2847 | assume h: "x = 0" | |
| 2848 | then have ?thesis by simp | |
| 2849 | } | |
| 44133 | 2850 | moreover | 
| 53406 | 2851 |   {
 | 
| 2852 | assume h: "y = 0" | |
| 2853 | then have ?thesis by simp | |
| 2854 | } | |
| 44133 | 2855 | moreover | 
| 53406 | 2856 |   {
 | 
| 2857 | assume x: "x \<noteq> 0" and y: "y \<noteq> 0" | |
| 44133 | 2858 | from inner_eq_zero_iff[of "norm y *\<^sub>R x - norm x *\<^sub>R y"] | 
| 49522 | 2859 | have "?rhs \<longleftrightarrow> | 
| 2860 | (norm y * (norm y * norm x * norm x - norm x * (x \<bullet> y)) - | |
| 2861 | norm x * (norm y * (y \<bullet> x) - norm x * norm y * norm y) = 0)" | |
| 44133 | 2862 | using x y | 
| 2863 | unfolding inner_simps | |
| 54230 
b1d955791529
more simplification rules on unary and binary minus
 haftmann parents: 
53939diff
changeset | 2864 | unfolding power2_norm_eq_inner[symmetric] power2_eq_square right_minus_eq | 
| 49522 | 2865 | apply (simp add: inner_commute) | 
| 2866 | apply (simp add: field_simps) | |
| 2867 | apply metis | |
| 2868 | done | |
| 44133 | 2869 | also have "\<dots> \<longleftrightarrow> (2 * norm x * norm y * (norm x * norm y - x \<bullet> y) = 0)" using x y | 
| 2870 | by (simp add: field_simps inner_commute) | |
| 2871 | also have "\<dots> \<longleftrightarrow> ?lhs" using x y | |
| 2872 | apply simp | |
| 49522 | 2873 | apply metis | 
| 2874 | done | |
| 53406 | 2875 | finally have ?thesis by blast | 
| 2876 | } | |
| 44133 | 2877 | ultimately show ?thesis by blast | 
| 2878 | qed | |
| 2879 | ||
| 2880 | lemma norm_cauchy_schwarz_abs_eq: | |
| 56444 | 2881 | "\<bar>x \<bullet> y\<bar> = norm x * norm y \<longleftrightarrow> | 
| 53716 | 2882 | norm x *\<^sub>R y = norm y *\<^sub>R x \<or> norm x *\<^sub>R y = - norm y *\<^sub>R x" | 
| 53406 | 2883 | (is "?lhs \<longleftrightarrow> ?rhs") | 
| 49522 | 2884 | proof - | 
| 56444 | 2885 | have th: "\<And>(x::real) a. a \<ge> 0 \<Longrightarrow> \<bar>x\<bar> = a \<longleftrightarrow> x = a \<or> x = - a" | 
| 53406 | 2886 | by arith | 
| 44133 | 2887 | have "?rhs \<longleftrightarrow> norm x *\<^sub>R y = norm y *\<^sub>R x \<or> norm (- x) *\<^sub>R y = norm y *\<^sub>R (- x)" | 
| 2888 | by simp | |
| 53406 | 2889 | also have "\<dots> \<longleftrightarrow>(x \<bullet> y = norm x * norm y \<or> (- x) \<bullet> y = norm x * norm y)" | 
| 44133 | 2890 | unfolding norm_cauchy_schwarz_eq[symmetric] | 
| 2891 | unfolding norm_minus_cancel norm_scaleR .. | |
| 2892 | also have "\<dots> \<longleftrightarrow> ?lhs" | |
| 53406 | 2893 | unfolding th[OF mult_nonneg_nonneg, OF norm_ge_zero[of x] norm_ge_zero[of y]] inner_simps | 
| 2894 | by auto | |
| 44133 | 2895 | finally show ?thesis .. | 
| 2896 | qed | |
| 2897 | ||
| 2898 | lemma norm_triangle_eq: | |
| 2899 | fixes x y :: "'a::real_inner" | |
| 53406 | 2900 | shows "norm (x + y) = norm x + norm y \<longleftrightarrow> norm x *\<^sub>R y = norm y *\<^sub>R x" | 
| 49522 | 2901 | proof - | 
| 53406 | 2902 |   {
 | 
| 2903 | assume x: "x = 0 \<or> y = 0" | |
| 2904 | then have ?thesis | |
| 2905 | by (cases "x = 0") simp_all | |
| 2906 | } | |
| 44133 | 2907 | moreover | 
| 53406 | 2908 |   {
 | 
| 2909 | assume x: "x \<noteq> 0" and y: "y \<noteq> 0" | |
| 49522 | 2910 | then have "norm x \<noteq> 0" "norm y \<noteq> 0" | 
| 44133 | 2911 | by simp_all | 
| 49522 | 2912 | then have n: "norm x > 0" "norm y > 0" | 
| 2913 | using norm_ge_zero[of x] norm_ge_zero[of y] by arith+ | |
| 53406 | 2914 | have th: "\<And>(a::real) b c. a + b + c \<noteq> 0 \<Longrightarrow> a = b + c \<longleftrightarrow> a\<^sup>2 = (b + c)\<^sup>2" | 
| 49522 | 2915 | by algebra | 
| 53077 | 2916 | have "norm (x + y) = norm x + norm y \<longleftrightarrow> (norm (x + y))\<^sup>2 = (norm x + norm y)\<^sup>2" | 
| 53406 | 2917 | apply (rule th) | 
| 2918 | using n norm_ge_zero[of "x + y"] | |
| 49522 | 2919 | apply arith | 
| 2920 | done | |
| 44133 | 2921 | also have "\<dots> \<longleftrightarrow> norm x *\<^sub>R y = norm y *\<^sub>R x" | 
| 2922 | unfolding norm_cauchy_schwarz_eq[symmetric] | |
| 2923 | unfolding power2_norm_eq_inner inner_simps | |
| 2924 | by (simp add: power2_norm_eq_inner[symmetric] power2_eq_square inner_commute field_simps) | |
| 53406 | 2925 | finally have ?thesis . | 
| 2926 | } | |
| 44133 | 2927 | ultimately show ?thesis by blast | 
| 2928 | qed | |
| 2929 | ||
| 49522 | 2930 | |
| 60420 | 2931 | subsection \<open>Collinearity\<close> | 
| 44133 | 2932 | |
| 49522 | 2933 | definition collinear :: "'a::real_vector set \<Rightarrow> bool" | 
| 2934 | where "collinear S \<longleftrightarrow> (\<exists>u. \<forall>x \<in> S. \<forall> y \<in> S. \<exists>c. x - y = c *\<^sub>R u)" | |
| 44133 | 2935 | |
| 53406 | 2936 | lemma collinear_empty: "collinear {}"
 | 
| 2937 | by (simp add: collinear_def) | |
| 44133 | 2938 | |
| 2939 | lemma collinear_sing: "collinear {x}"
 | |
| 2940 | by (simp add: collinear_def) | |
| 2941 | ||
| 2942 | lemma collinear_2: "collinear {x, y}"
 | |
| 2943 | apply (simp add: collinear_def) | |
| 2944 | apply (rule exI[where x="x - y"]) | |
| 2945 | apply auto | |
| 2946 | apply (rule exI[where x=1], simp) | |
| 2947 | apply (rule exI[where x="- 1"], simp) | |
| 2948 | done | |
| 2949 | ||
| 56444 | 2950 | lemma collinear_lemma: "collinear {0, x, y} \<longleftrightarrow> x = 0 \<or> y = 0 \<or> (\<exists>c. y = c *\<^sub>R x)"
 | 
| 53406 | 2951 | (is "?lhs \<longleftrightarrow> ?rhs") | 
| 49522 | 2952 | proof - | 
| 53406 | 2953 |   {
 | 
| 2954 | assume "x = 0 \<or> y = 0" | |
| 2955 | then have ?thesis | |
| 2956 | by (cases "x = 0") (simp_all add: collinear_2 insert_commute) | |
| 2957 | } | |
| 44133 | 2958 | moreover | 
| 53406 | 2959 |   {
 | 
| 2960 | assume x: "x \<noteq> 0" and y: "y \<noteq> 0" | |
| 2961 | have ?thesis | |
| 2962 | proof | |
| 2963 | assume h: "?lhs" | |
| 49522 | 2964 |       then obtain u where u: "\<forall> x\<in> {0,x,y}. \<forall>y\<in> {0,x,y}. \<exists>c. x - y = c *\<^sub>R u"
 | 
| 2965 | unfolding collinear_def by blast | |
| 44133 | 2966 | from u[rule_format, of x 0] u[rule_format, of y 0] | 
| 2967 | obtain cx and cy where | |
| 2968 | cx: "x = cx *\<^sub>R u" and cy: "y = cy *\<^sub>R u" | |
| 2969 | by auto | |
| 2970 | from cx x have cx0: "cx \<noteq> 0" by auto | |
| 2971 | from cy y have cy0: "cy \<noteq> 0" by auto | |
| 2972 | let ?d = "cy / cx" | |
| 2973 | from cx cy cx0 have "y = ?d *\<^sub>R x" | |
| 2974 | by simp | |
| 53406 | 2975 | then show ?rhs using x y by blast | 
| 2976 | next | |
| 2977 | assume h: "?rhs" | |
| 2978 | then obtain c where c: "y = c *\<^sub>R x" | |
| 2979 | using x y by blast | |
| 2980 | show ?lhs | |
| 2981 | unfolding collinear_def c | |
| 44133 | 2982 | apply (rule exI[where x=x]) | 
| 2983 | apply auto | |
| 2984 | apply (rule exI[where x="- 1"], simp) | |
| 2985 | apply (rule exI[where x= "-c"], simp) | |
| 2986 | apply (rule exI[where x=1], simp) | |
| 2987 | apply (rule exI[where x="1 - c"], simp add: scaleR_left_diff_distrib) | |
| 2988 | apply (rule exI[where x="c - 1"], simp add: scaleR_left_diff_distrib) | |
| 53406 | 2989 | done | 
| 2990 | qed | |
| 2991 | } | |
| 44133 | 2992 | ultimately show ?thesis by blast | 
| 2993 | qed | |
| 2994 | ||
| 56444 | 2995 | lemma norm_cauchy_schwarz_equal: "\<bar>x \<bullet> y\<bar> = norm x * norm y \<longleftrightarrow> collinear {0, x, y}"
 | 
| 49522 | 2996 | unfolding norm_cauchy_schwarz_abs_eq | 
| 2997 | apply (cases "x=0", simp_all add: collinear_2) | |
| 2998 | apply (cases "y=0", simp_all add: collinear_2 insert_commute) | |
| 2999 | unfolding collinear_lemma | |
| 3000 | apply simp | |
| 3001 | apply (subgoal_tac "norm x \<noteq> 0") | |
| 3002 | apply (subgoal_tac "norm y \<noteq> 0") | |
| 3003 | apply (rule iffI) | |
| 3004 | apply (cases "norm x *\<^sub>R y = norm y *\<^sub>R x") | |
| 3005 | apply (rule exI[where x="(1/norm x) * norm y"]) | |
| 3006 | apply (drule sym) | |
| 3007 | unfolding scaleR_scaleR[symmetric] | |
| 3008 | apply (simp add: field_simps) | |
| 3009 | apply (rule exI[where x="(1/norm x) * - norm y"]) | |
| 3010 | apply clarify | |
| 3011 | apply (drule sym) | |
| 3012 | unfolding scaleR_scaleR[symmetric] | |
| 3013 | apply (simp add: field_simps) | |
| 3014 | apply (erule exE) | |
| 3015 | apply (erule ssubst) | |
| 3016 | unfolding scaleR_scaleR | |
| 3017 | unfolding norm_scaleR | |
| 3018 | apply (subgoal_tac "norm x * c = \<bar>c\<bar> * norm x \<or> norm x * c = - \<bar>c\<bar> * norm x") | |
| 55775 | 3019 | apply (auto simp add: field_simps) | 
| 49522 | 3020 | done | 
| 3021 | ||
| 54776 
db890d9fc5c2
ordered_euclidean_space compatible with more standard pointwise ordering on products; conditionally complete lattice with product order
 immler parents: 
54703diff
changeset | 3022 | end |