1 (* Title: HOL/Real/HahnBanach/LinearSpace.thy |
1 (* Title: HOL/Real/HahnBanach/LinearSpace.thy |
2 ID: $Id$ |
2 ID: $Id$ |
3 Author: Gertrud Bauer, TU Munich |
3 Author: Gertrud Bauer, TU Munich |
4 *) |
4 *) |
5 |
5 |
|
6 header {* Linear Spaces *}; |
|
7 |
6 theory LinearSpace = Bounds + Aux:; |
8 theory LinearSpace = Bounds + Aux:; |
7 |
9 |
8 |
10 subsection {* Signature *}; |
9 section {* vector spaces *}; |
|
10 |
11 |
11 consts |
12 consts |
12 sum :: "['a, 'a] => 'a" (infixl "[+]" 65) |
13 sum :: "['a, 'a] => 'a" (infixl "[+]" 65) |
13 prod :: "[real, 'a] => 'a" (infixr "[*]" 70) |
14 prod :: "[real, 'a] => 'a" (infixr "[*]" 70) |
14 zero :: 'a ("<0>"); |
15 zero :: 'a ("<0>"); |
15 |
16 |
16 constdefs |
17 constdefs |
17 negate :: "'a => 'a" ("[-] _" [100] 100) |
18 negate :: "'a => 'a" ("[-] _" [100] 100) |
18 "[-] x == (- 1r) [*] x" |
19 "[-] x == (- 1r) [*] x" |
19 diff :: "'a => 'a => 'a" (infixl "[-]" 68) |
20 diff :: "'a => 'a => 'a" (infixl "[-]" 68) |
20 "x [-] y == x [+] [-] y"; |
21 "x [-] y == x [+] [-] y"; |
21 |
22 |
|
23 subsection {* Vector space laws *} |
|
24 (*** |
22 constdefs |
25 constdefs |
23 is_vectorspace :: "'a set => bool" |
26 is_vectorspace :: "'a set => bool" |
24 "is_vectorspace V == <0>:V & |
27 "is_vectorspace V == V ~= {} |
25 (ALL x:V. ALL y:V. ALL z:V. ALL a b. x [+] y: V |
28 & (ALL x: V. ALL a. a [*] x: V) |
26 & a [*] x: V |
29 & (ALL x: V. ALL y: V. x [+] y = y [+] x) |
27 & x [+] y [+] z = x [+] (y [+] z) |
30 & (ALL x: V. ALL y: V. ALL z: V. x [+] y [+] z = x [+] (y [+] z)) |
28 & x [+] y = y [+] x |
31 & (ALL x: V. ALL y: V. x [+] y: V) |
29 & x [-] x = <0> |
32 & (ALL x: V. x [-] x = <0>) |
30 & <0> [+] x = x |
33 & (ALL x: V. <0> [+] x = x) |
31 & a [*] (x [+] y) = a [*] x [+] a [*] y |
34 & (ALL x: V. ALL y: V. ALL a. a [*] (x [+] y) = a [*] x [+] a [*] y) |
32 & (a + b) [*] x = a [*] x [+] b [*] x |
35 & (ALL x: V. ALL a b. (a + b) [*] x = a [*] x [+] b [*] x) |
33 & (a * b) [*] x = a [*] b [*] x |
36 & (ALL x: V. ALL a b. (a * b) [*] x = a [*] b [*] x) |
34 & 1r [*] x = x)"; |
37 & (ALL x: V. 1r [*] x = x)"; |
35 |
38 ***) |
36 |
39 constdefs |
37 subsection {* neg, diff *}; |
40 is_vectorspace :: "'a set => bool" |
38 |
41 "is_vectorspace V == V ~= {} |
39 lemma vs_mult_minus_1: "(- 1r) [*] x = [-] x"; |
42 & (ALL x:V. ALL y:V. ALL z:V. ALL a b. |
40 by (simp add: negate_def); |
43 x [+] y: V |
41 |
44 & a [*] x: V |
42 lemma vs_add_mult_minus_1_eq_diff: "x [+] (- 1r) [*] y = x [-] y"; |
45 & x [+] y [+] z = x [+] (y [+] z) |
43 by (simp add: diff_def negate_def); |
46 & x [+] y = y [+] x |
44 |
47 & x [-] x = <0> |
45 lemma vs_add_minus_eq_diff: "x [+] [-] y = x [-] y"; |
48 & <0> [+] x = x |
46 by (simp add: diff_def); |
49 & a [*] (x [+] y) = a [*] x [+] a [*] y |
|
50 & (a + b) [*] x = a [*] x [+] b [*] x |
|
51 & (a * b) [*] x = a [*] b [*] x |
|
52 & 1r [*] x = x)"; |
47 |
53 |
48 lemma vsI [intro]: |
54 lemma vsI [intro]: |
49 "[| <0>:V; \ |
55 "[| <0>:V; \ |
50 \ ALL x: V. ALL a::real. a [*] x: V; \ |
56 ALL x: V. ALL y: V. x [+] y: V; |
51 \ ALL x: V. ALL y: V. x [+] y = y [+] x; \ |
57 ALL x: V. ALL a. a [*] x: V; |
52 \ ALL x: V. ALL y: V. ALL z: V. x [+] y [+] z = x [+] (y [+] z); \ |
58 ALL x: V. ALL y: V. ALL z: V. x [+] y [+] z = x [+] (y [+] z); |
53 \ ALL x: V. ALL y: V. x [+] y: V; \ |
59 ALL x: V. ALL y: V. x [+] y = y [+] x; |
54 \ ALL x: V. x [-] x = <0>; \ |
60 ALL x: V. x [-] x = <0>; |
55 \ ALL x: V. <0> [+] x = x; \ |
61 ALL x: V. <0> [+] x = x; |
56 \ ALL x: V. ALL y: V. ALL a::real. a [*] (x [+] y) = a [*] x [+] a [*] y; \ |
62 ALL x: V. ALL y: V. ALL a. a [*] (x [+] y) = a [*] x [+] a [*] y; |
57 \ ALL x: V. ALL a::real. ALL b::real. (a + b) [*] x = a [*] x [+] b [*] x; \ |
63 ALL x: V. ALL a b. (a + b) [*] x = a [*] x [+] b [*] x; |
58 \ ALL x: V. ALL a::real. ALL b::real. (a * b) [*] x = a [*] b [*] x; \ |
64 ALL x: V. ALL a b. (a * b) [*] x = a [*] b [*] x; \ |
59 \ ALL x: V. 1r [*] x = x |] ==> is_vectorspace V"; |
65 ALL x: V. 1r [*] x = x |] ==> is_vectorspace V"; |
60 proof (unfold is_vectorspace_def, intro conjI ballI allI); |
66 proof (unfold is_vectorspace_def, intro conjI ballI allI); |
61 fix x y z; assume "x:V" "y:V" "z:V"; |
67 fix x y z; assume "x:V" "y:V" "z:V"; |
62 assume "ALL x: V. ALL y: V. ALL z: V. x [+] y [+] z = x [+] (y [+] z)"; |
68 assume "ALL x: V. ALL y: V. ALL z: V. x [+] y [+] z = x [+] (y [+] z)"; |
63 thus "x [+] y [+] z = x [+] (y [+] z)"; by (elim bspec[elimify]); |
69 thus "x [+] y [+] z = x [+] (y [+] z)"; by (elim bspec[elimify]); |
64 qed force+; |
70 qed force+; |
65 |
71 |
66 lemma zero_in_vs [simp, intro]: "is_vectorspace V ==> <0>:V"; |
|
67 by (unfold is_vectorspace_def) simp; |
|
68 |
|
69 lemma vs_not_empty [intro !!]: "is_vectorspace V ==> (V ~= {})"; |
72 lemma vs_not_empty [intro !!]: "is_vectorspace V ==> (V ~= {})"; |
|
73 by (unfold is_vectorspace_def) simp; |
|
74 |
|
75 lemma vs_add_closed [simp, intro!!]: |
|
76 "[| is_vectorspace V; x: V; y: V|] ==> x [+] y: V"; |
|
77 by (unfold is_vectorspace_def) simp; |
|
78 |
|
79 lemma vs_mult_closed [simp, intro!!]: |
|
80 "[| is_vectorspace V; x: V |] ==> a [*] x: V"; |
|
81 by (unfold is_vectorspace_def) simp; |
|
82 |
|
83 lemma vs_diff_closed [simp, intro!!]: |
|
84 "[| is_vectorspace V; x: V; y: V|] ==> x [-] y: V"; |
|
85 by (unfold diff_def negate_def) simp; |
|
86 |
|
87 lemma vs_neg_closed [simp, intro!!]: |
|
88 "[| is_vectorspace V; x: V |] ==> [-] x: V"; |
|
89 by (unfold negate_def) simp; |
|
90 |
|
91 lemma vs_add_assoc [simp]: |
|
92 "[| is_vectorspace V; x: V; y: V; z: V|] |
|
93 ==> x [+] y [+] z = x [+] (y [+] z)"; |
70 by (unfold is_vectorspace_def) fast; |
94 by (unfold is_vectorspace_def) fast; |
71 |
95 |
72 lemma vs_add_closed [simp, intro!!]: "[| is_vectorspace V; x: V; y: V|] ==> x [+] y: V"; |
96 lemma vs_add_commute [simp]: |
73 by (unfold is_vectorspace_def) simp; |
97 "[| is_vectorspace V; x:V; y:V |] ==> y [+] x = x [+] y"; |
74 |
|
75 lemma vs_mult_closed [simp, intro!!]: "[| is_vectorspace V; x: V |] ==> a [*] x: V"; |
|
76 by (unfold is_vectorspace_def) simp; |
|
77 |
|
78 lemma vs_diff_closed [simp, intro!!]: "[| is_vectorspace V; x: V; y: V|] ==> x [-] y: V"; |
|
79 by (unfold diff_def negate_def) simp; |
|
80 |
|
81 lemma vs_neg_closed [simp, intro!!]: "[| is_vectorspace V; x: V |] ==> [-] x: V"; |
|
82 by (unfold negate_def) simp; |
|
83 |
|
84 lemma vs_add_assoc [simp]: |
|
85 "[| is_vectorspace V; x: V; y: V; z: V|] ==> x [+] y [+] z = x [+] (y [+] z)"; |
|
86 by (unfold is_vectorspace_def) fast; |
|
87 |
|
88 lemma vs_add_commute [simp]: "[| is_vectorspace V; x:V; y:V |] ==> y [+] x = x [+] y"; |
|
89 by (unfold is_vectorspace_def) simp; |
98 by (unfold is_vectorspace_def) simp; |
90 |
99 |
91 lemma vs_add_left_commute [simp]: |
100 lemma vs_add_left_commute [simp]: |
92 "[| is_vectorspace V; x:V; y:V; z:V |] ==> x [+] (y [+] z) = y [+] (x [+] z)"; |
101 "[| is_vectorspace V; x:V; y:V; z:V |] |
|
102 ==> x [+] (y [+] z) = y [+] (x [+] z)"; |
93 proof -; |
103 proof -; |
94 assume "is_vectorspace V" "x:V" "y:V" "z:V"; |
104 assume "is_vectorspace V" "x:V" "y:V" "z:V"; |
95 hence "x [+] (y [+] z) = (x [+] y) [+] z"; by (simp only: vs_add_assoc); |
105 hence "x [+] (y [+] z) = (x [+] y) [+] z"; |
|
106 by (simp only: vs_add_assoc); |
96 also; have "... = (y [+] x) [+] z"; by (simp! only: vs_add_commute); |
107 also; have "... = (y [+] x) [+] z"; by (simp! only: vs_add_commute); |
97 also; have "... = y [+] (x [+] z)"; by (simp! only: vs_add_assoc); |
108 also; have "... = y [+] (x [+] z)"; by (simp! only: vs_add_assoc); |
98 finally; show ?thesis; .; |
109 finally; show ?thesis; .; |
99 qed; |
110 qed; |
100 |
111 |
101 theorems vs_add_ac = vs_add_assoc vs_add_commute vs_add_left_commute; |
112 theorems vs_add_ac = vs_add_assoc vs_add_commute vs_add_left_commute; |
102 |
113 |
103 lemma vs_diff_self [simp]: "[| is_vectorspace V; x:V |] ==> x [-] x = <0>"; |
114 lemma vs_diff_self [simp]: |
104 by (unfold is_vectorspace_def) simp; |
115 "[| is_vectorspace V; x:V |] ==> x [-] x = <0>"; |
105 |
116 by (unfold is_vectorspace_def) simp; |
106 lemma vs_add_zero_left [simp]: "[| is_vectorspace V; x:V |] ==> <0> [+] x = x"; |
117 |
107 by (unfold is_vectorspace_def) simp; |
118 lemma zero_in_vs [simp, intro]: "is_vectorspace V ==> <0>:V"; |
108 |
119 proof -; |
109 lemma vs_add_zero_right [simp]: "[| is_vectorspace V; x:V |] ==> x [+] <0> = x"; |
120 assume "is_vectorspace V"; |
|
121 have "V ~= {}"; ..; |
|
122 hence "EX x. x:V"; by force; |
|
123 thus ?thesis; |
|
124 proof; |
|
125 fix x; assume "x:V"; |
|
126 have "<0> = x [-] x"; by (simp!); |
|
127 also; have "... : V"; by (simp! only: vs_diff_closed); |
|
128 finally; show ?thesis; .; |
|
129 qed; |
|
130 qed; |
|
131 |
|
132 lemma vs_add_zero_left [simp]: |
|
133 "[| is_vectorspace V; x:V |] ==> <0> [+] x = x"; |
|
134 by (unfold is_vectorspace_def) simp; |
|
135 |
|
136 lemma vs_add_zero_right [simp]: |
|
137 "[| is_vectorspace V; x:V |] ==> x [+] <0> = x"; |
110 proof -; |
138 proof -; |
111 assume "is_vectorspace V" "x:V"; |
139 assume "is_vectorspace V" "x:V"; |
112 hence "x [+] <0> = <0> [+] x"; by simp; |
140 hence "x [+] <0> = <0> [+] x"; by simp; |
113 also; have "... = x"; by (simp!); |
141 also; have "... = x"; by (simp!); |
114 finally; show ?thesis; .; |
142 finally; show ?thesis; .; |
115 qed; |
143 qed; |
116 |
144 |
117 lemma vs_add_mult_distrib1: |
145 lemma vs_add_mult_distrib1: |
118 "[| is_vectorspace V; x:V; y:V |] ==> a [*] (x [+] y) = a [*] x [+] a [*] y"; |
146 "[| is_vectorspace V; x:V; y:V |] |
|
147 ==> a [*] (x [+] y) = a [*] x [+] a [*] y"; |
119 by (unfold is_vectorspace_def) simp; |
148 by (unfold is_vectorspace_def) simp; |
120 |
149 |
121 lemma vs_add_mult_distrib2: |
150 lemma vs_add_mult_distrib2: |
122 "[| is_vectorspace V; x:V |] ==> (a + b) [*] x = a [*] x [+] b [*] x"; |
151 "[| is_vectorspace V; x:V |] ==> (a + b) [*] x = a [*] x [+] b [*] x"; |
123 by (unfold is_vectorspace_def) simp; |
152 by (unfold is_vectorspace_def) simp; |
124 |
153 |
125 lemma vs_mult_assoc: "[| is_vectorspace V; x:V |] ==> (a * b) [*] x = a [*] (b [*] x)"; |
154 lemma vs_mult_assoc: |
126 by (unfold is_vectorspace_def) simp; |
155 "[| is_vectorspace V; x:V |] ==> (a * b) [*] x = a [*] (b [*] x)"; |
127 |
156 by (unfold is_vectorspace_def) simp; |
128 lemma vs_mult_assoc2 [simp]: "[| is_vectorspace V; x:V |] ==> a [*] b [*] x = (a * b) [*] x"; |
157 |
|
158 lemma vs_mult_assoc2 [simp]: |
|
159 "[| is_vectorspace V; x:V |] ==> a [*] b [*] x = (a * b) [*] x"; |
129 by (simp only: vs_mult_assoc); |
160 by (simp only: vs_mult_assoc); |
130 |
161 |
131 lemma vs_mult_1 [simp]: "[| is_vectorspace V; x:V |] ==> 1r [*] x = x"; |
162 lemma vs_mult_1 [simp]: |
|
163 "[| is_vectorspace V; x:V |] ==> 1r [*] x = x"; |
132 by (unfold is_vectorspace_def) simp; |
164 by (unfold is_vectorspace_def) simp; |
133 |
165 |
134 lemma vs_diff_mult_distrib1: |
166 lemma vs_diff_mult_distrib1: |
135 "[| is_vectorspace V; x:V; y:V |] ==> a [*] (x [-] y) = a [*] x [-] a [*] y"; |
167 "[| is_vectorspace V; x:V; y:V |] |
|
168 ==> a [*] (x [-] y) = a [*] x [-] a [*] y"; |
136 by (simp add: diff_def negate_def vs_add_mult_distrib1); |
169 by (simp add: diff_def negate_def vs_add_mult_distrib1); |
137 |
170 |
138 lemma vs_minus_eq: "[| is_vectorspace V; x:V |] ==> - b [*] x = [-] (b [*] x)"; |
171 lemma vs_minus_eq: "[| is_vectorspace V; x:V |] |
|
172 ==> - b [*] x = [-] (b [*] x)"; |
139 by (simp add: negate_def); |
173 by (simp add: negate_def); |
140 |
174 |
141 lemma vs_diff_mult_distrib2: |
175 lemma vs_diff_mult_distrib2: |
142 "[| is_vectorspace V; x:V |] ==> (a - b) [*] x = a [*] x [-] (b [*] x)"; |
176 "[| is_vectorspace V; x:V |] |
|
177 ==> (a - b) [*] x = a [*] x [-] (b [*] x)"; |
143 proof -; |
178 proof -; |
144 assume "is_vectorspace V" "x:V"; |
179 assume "is_vectorspace V" "x:V"; |
145 have " (a - b) [*] x = (a + - b ) [*] x"; by (unfold real_diff_def, simp); |
180 have " (a - b) [*] x = (a + - b ) [*] x"; |
146 also; have "... = a [*] x [+] (- b) [*] x"; by (rule vs_add_mult_distrib2); |
181 by (unfold real_diff_def, simp); |
147 also; have "... = a [*] x [+] [-] (b [*] x)"; by (simp! add: vs_minus_eq); |
182 also; have "... = a [*] x [+] (- b) [*] x"; |
|
183 by (rule vs_add_mult_distrib2); |
|
184 also; have "... = a [*] x [+] [-] (b [*] x)"; |
|
185 by (simp! add: vs_minus_eq); |
148 also; have "... = a [*] x [-] (b [*] x)"; by (unfold diff_def, simp); |
186 also; have "... = a [*] x [-] (b [*] x)"; by (unfold diff_def, simp); |
149 finally; show ?thesis; .; |
187 finally; show ?thesis; .; |
150 qed; |
188 qed; |
151 |
189 |
152 lemma vs_mult_zero_left [simp]: "[| is_vectorspace V; x: V|] ==> 0r [*] x = <0>"; |
190 lemma vs_mult_zero_left [simp]: |
|
191 "[| is_vectorspace V; x: V|] ==> 0r [*] x = <0>"; |
153 proof -; |
192 proof -; |
154 assume "is_vectorspace V" "x:V"; |
193 assume "is_vectorspace V" "x:V"; |
155 have "0r [*] x = (1r - 1r) [*] x"; by (simp only: real_diff_self); |
194 have "0r [*] x = (1r - 1r) [*] x"; by (simp only: real_diff_self); |
156 also; have "... = (1r + - 1r) [*] x"; by simp; |
195 also; have "... = (1r + - 1r) [*] x"; by simp; |
157 also; have "... = 1r [*] x [+] (- 1r) [*] x"; by (rule vs_add_mult_distrib2); |
196 also; have "... = 1r [*] x [+] (- 1r) [*] x"; |
|
197 by (rule vs_add_mult_distrib2); |
158 also; have "... = x [+] (- 1r) [*] x"; by (simp!); |
198 also; have "... = x [+] (- 1r) [*] x"; by (simp!); |
159 also; have "... = x [-] x"; by (rule vs_add_mult_minus_1_eq_diff); |
199 also; have "... = x [+] [-] x"; by (fold negate_def) simp; |
|
200 also; have "... = x [-] x"; by (fold diff_def) simp; |
160 also; have "... = <0>"; by (simp!); |
201 also; have "... = <0>"; by (simp!); |
161 finally; show ?thesis; .; |
202 finally; show ?thesis; .; |
162 qed; |
203 qed; |
163 |
204 |
164 lemma vs_mult_zero_right [simp]: "[| is_vectorspace (V:: 'a set) |] ==> a [*] <0> = (<0>::'a)"; |
205 lemma vs_mult_zero_right [simp]: |
|
206 "[| is_vectorspace (V:: 'a set) |] ==> a [*] <0> = (<0>::'a)"; |
165 proof -; |
207 proof -; |
166 assume "is_vectorspace V"; |
208 assume "is_vectorspace V"; |
167 have "a [*] <0> = a [*] (<0> [-] (<0>::'a))"; by (simp!); |
209 have "a [*] <0> = a [*] (<0> [-] (<0>::'a))"; by (simp!); |
168 also; have "... = a [*] <0> [-] a [*] <0>"; |
210 also; have "... = a [*] <0> [-] a [*] <0>"; |
169 by (rule vs_diff_mult_distrib1) (simp!)+; |
211 by (rule vs_diff_mult_distrib1) (simp!)+; |
170 also; have "... = <0>"; by (simp!); |
212 also; have "... = <0>"; by (simp!); |
171 finally; show ?thesis; .; |
213 finally; show ?thesis; .; |
172 qed; |
214 qed; |
173 |
215 |
174 lemma vs_minus_mult_cancel [simp]: "[| is_vectorspace V; x:V |] ==> (- a) [*] [-] x = a [*] x"; |
216 lemma vs_minus_mult_cancel [simp]: |
|
217 "[| is_vectorspace V; x:V |] ==> (- a) [*] [-] x = a [*] x"; |
175 by (unfold negate_def) simp; |
218 by (unfold negate_def) simp; |
176 |
219 |
177 lemma vs_add_minus_left_eq_diff: "[| is_vectorspace V; x:V; y:V |] ==> [-] x [+] y = y [-] x"; |
220 lemma vs_add_minus_left_eq_diff: |
|
221 "[| is_vectorspace V; x:V; y:V |] ==> [-] x [+] y = y [-] x"; |
178 proof -; |
222 proof -; |
179 assume "is_vectorspace V" "x:V" "y:V"; |
223 assume "is_vectorspace V" "x:V" "y:V"; |
180 have "[-] x [+] y = y [+] [-] x"; by (simp! add: vs_add_commute [RS sym, of V "[-] x"]); |
224 have "[-] x [+] y = y [+] [-] x"; |
181 also; have "... = y [-] x"; by (simp! only: vs_add_minus_eq_diff); |
225 by (simp! add: vs_add_commute [RS sym, of V "[-] x"]); |
|
226 also; have "... = y [-] x"; by (unfold diff_def) simp; |
182 finally; show ?thesis; .; |
227 finally; show ?thesis; .; |
183 qed; |
228 qed; |
184 |
229 |
185 lemma vs_add_minus [simp]: "[| is_vectorspace V; x:V|] ==> x [+] [-] x = <0>"; |
230 lemma vs_add_minus [simp]: |
186 by (simp add: vs_add_minus_eq_diff); |
231 "[| is_vectorspace V; x:V|] ==> x [+] [-] x = <0>"; |
187 |
232 by (fold diff_def) simp; |
188 lemma vs_add_minus_left [simp]: "[| is_vectorspace V; x:V |] ==> [-] x [+] x = <0>"; |
233 |
189 by (simp add: vs_add_minus_eq_diff); |
234 lemma vs_add_minus_left [simp]: |
190 |
235 "[| is_vectorspace V; x:V |] ==> [-] x [+] x = <0>"; |
191 lemma vs_minus_minus [simp]: "[| is_vectorspace V; x:V|] ==> [-] [-] x = x"; |
236 by (fold diff_def) simp; |
|
237 |
|
238 lemma vs_minus_minus [simp]: |
|
239 "[| is_vectorspace V; x:V|] ==> [-] [-] x = x"; |
192 by (unfold negate_def) simp; |
240 by (unfold negate_def) simp; |
193 |
241 |
194 lemma vs_minus_zero [simp]: "[| is_vectorspace (V::'a set)|] ==> [-] (<0>::'a) = <0>"; |
242 lemma vs_minus_zero [simp]: |
|
243 "[| is_vectorspace (V::'a set)|] ==> [-] (<0>::'a) = <0>"; |
195 by (unfold negate_def) simp; |
244 by (unfold negate_def) simp; |
196 |
245 |
197 lemma vs_minus_zero_iff [simp]: |
246 lemma vs_minus_zero_iff [simp]: |
198 "[| is_vectorspace V; x:V|] ==> ([-] x = <0>) = (x = <0>)" (concl is "?L = ?R"); |
247 "[| is_vectorspace V; x:V|] ==> ([-] x = <0>) = (x = <0>)" |
|
248 (concl is "?L = ?R"); |
199 proof -; |
249 proof -; |
200 assume vs: "is_vectorspace V" "x:V"; |
250 assume vs: "is_vectorspace V" "x:V"; |
201 show "?L = ?R"; |
251 show "?L = ?R"; |
202 proof; |
252 proof; |
203 assume l: ?L; |
253 assume l: ?L; |
204 have "x = [-] [-] x"; by (rule vs_minus_minus [RS sym]); |
254 have "x = [-] [-] x"; by (rule vs_minus_minus [RS sym]); |
205 also; have "... = [-] <0>"; by (rule l [RS arg_cong] ); |
255 also; have "... = [-] <0>"; by (simp only: l); |
206 also; have "... = <0>"; by (rule vs_minus_zero); |
256 also; have "... = <0>"; by (rule vs_minus_zero); |
207 finally; show ?R; .; |
257 finally; show ?R; .; |
208 next; |
258 next; |
209 assume ?R; |
259 assume ?R; |
210 with vs; show ?L; by simp; |
260 with vs; show ?L; by simp; |
211 qed; |
261 qed; |
212 qed; |
262 qed; |
213 |
263 |
214 lemma vs_add_minus_cancel [simp]: "[| is_vectorspace V; x:V; y:V|] ==> x [+] ([-] x [+] y) = y"; |
264 lemma vs_add_minus_cancel [simp]: |
|
265 "[| is_vectorspace V; x:V; y:V|] ==> x [+] ([-] x [+] y) = y"; |
215 by (simp add: vs_add_assoc [RS sym] del: vs_add_commute); |
266 by (simp add: vs_add_assoc [RS sym] del: vs_add_commute); |
216 |
267 |
217 lemma vs_minus_add_cancel [simp]: "[| is_vectorspace V; x:V; y:V |] ==> [-] x [+] (x [+] y) = y"; |
268 lemma vs_minus_add_cancel [simp]: |
|
269 "[| is_vectorspace V; x:V; y:V |] ==> [-] x [+] (x [+] y) = y"; |
218 by (simp add: vs_add_assoc [RS sym] del: vs_add_commute); |
270 by (simp add: vs_add_assoc [RS sym] del: vs_add_commute); |
219 |
271 |
220 lemma vs_minus_add_distrib [simp]: |
272 lemma vs_minus_add_distrib [simp]: |
221 "[| is_vectorspace V; x:V; y:V|] ==> [-] (x [+] y) = [-] x [+] [-] y"; |
273 "[| is_vectorspace V; x:V; y:V|] |
|
274 ==> [-] (x [+] y) = [-] x [+] [-] y"; |
222 by (unfold negate_def, simp add: vs_add_mult_distrib1); |
275 by (unfold negate_def, simp add: vs_add_mult_distrib1); |
223 |
276 |
224 lemma vs_diff_zero [simp]: "[| is_vectorspace V; x:V |] ==> x [-] <0> = x"; |
277 lemma vs_diff_zero [simp]: |
|
278 "[| is_vectorspace V; x:V |] ==> x [-] <0> = x"; |
225 by (unfold diff_def) simp; |
279 by (unfold diff_def) simp; |
226 |
280 |
227 lemma vs_diff_zero_right [simp]: "[| is_vectorspace V; x:V |] ==> <0> [-] x = [-] x"; |
281 lemma vs_diff_zero_right [simp]: |
|
282 "[| is_vectorspace V; x:V |] ==> <0> [-] x = [-] x"; |
228 by (unfold diff_def) simp; |
283 by (unfold diff_def) simp; |
229 |
284 |
230 lemma vs_add_left_cancel: |
285 lemma vs_add_left_cancel: |
231 "[|is_vectorspace V; x:V; y:V; z:V|] ==> (x [+] y = x [+] z) = (y = z)" |
286 "[| is_vectorspace V; x:V; y:V; z:V|] |
|
287 ==> (x [+] y = x [+] z) = (y = z)" |
232 (concl is "?L = ?R"); |
288 (concl is "?L = ?R"); |
233 proof; |
289 proof; |
234 assume "is_vectorspace V" "x:V" "y:V" "z:V"; |
290 assume "is_vectorspace V" "x:V" "y:V" "z:V"; |
235 assume l: ?L; |
291 assume l: ?L; |
236 have "y = <0> [+] y"; by (simp!); |
292 have "y = <0> [+] y"; by (simp!); |
237 also; have "... = [-] x [+] x [+] y"; by (simp!); |
293 also; have "... = [-] x [+] x [+] y"; by (simp!); |
238 also; have "... = [-] x [+] (x [+] y)"; by (simp! only: vs_add_assoc vs_neg_closed); |
294 also; have "... = [-] x [+] (x [+] y)"; |
|
295 by (simp! only: vs_add_assoc vs_neg_closed); |
239 also; have "... = [-] x [+] (x [+] z)"; by (simp only: l); |
296 also; have "... = [-] x [+] (x [+] z)"; by (simp only: l); |
240 also; have "... = [-] x [+] x [+] z"; by (rule vs_add_assoc [RS sym]) (simp!)+; |
297 also; have "... = [-] x [+] x [+] z"; |
|
298 by (rule vs_add_assoc [RS sym]) (simp!)+; |
241 also; have "... = z"; by (simp!); |
299 also; have "... = z"; by (simp!); |
242 finally; show ?R;.; |
300 finally; show ?R;.; |
243 next; |
301 next; |
244 assume ?R; |
302 assume ?R; |
245 thus ?L; by force; |
303 thus ?L; by force; |
246 qed; |
304 qed; |
247 |
305 |
248 lemma vs_add_right_cancel: |
306 lemma vs_add_right_cancel: |
249 "[| is_vectorspace V; x:V; y:V; z:V |] ==> (y [+] x = z [+] x) = (y = z)"; |
307 "[| is_vectorspace V; x:V; y:V; z:V |] |
|
308 ==> (y [+] x = z [+] x) = (y = z)"; |
250 by (simp only: vs_add_commute vs_add_left_cancel); |
309 by (simp only: vs_add_commute vs_add_left_cancel); |
251 |
310 |
252 lemma vs_add_assoc_cong [tag FIXME simp]: "[| is_vectorspace V; x:V; y:V; x':V; y':V; z:V |] |
311 lemma vs_add_assoc_cong [tag FIXME simp]: |
|
312 "[| is_vectorspace V; x:V; y:V; x':V; y':V; z:V |] |
253 ==> x [+] y = x' [+] y' ==> x [+] (y [+] z) = x' [+] (y' [+] z)"; |
313 ==> x [+] y = x' [+] y' ==> x [+] (y [+] z) = x' [+] (y' [+] z)"; |
254 by (simp del: vs_add_commute vs_add_assoc add: vs_add_assoc [RS sym]); |
314 by (simp del: vs_add_commute vs_add_assoc add: vs_add_assoc [RS sym]); |
255 |
315 |
256 lemma vs_mult_left_commute: |
316 lemma vs_mult_left_commute: |
257 "[| is_vectorspace V; x:V; y:V; z:V |] ==> x [*] y [*] z = y [*] x [*] z"; |
317 "[| is_vectorspace V; x:V; y:V; z:V |] |
|
318 ==> x [*] y [*] z = y [*] x [*] z"; |
258 by (simp add: real_mult_commute); |
319 by (simp add: real_mult_commute); |
259 |
320 |
260 lemma vs_mult_zero_uniq : |
321 lemma vs_mult_zero_uniq : |
261 "[| is_vectorspace V; x:V; a [*] x = <0>; x ~= <0> |] ==> a = 0r"; |
322 "[| is_vectorspace V; x:V; a [*] x = <0>; x ~= <0> |] ==> a = 0r"; |
262 proof (rule classical); |
323 proof (rule classical); |
304 qed; |
382 qed; |
305 next; |
383 next; |
306 assume ?R; |
384 assume ?R; |
307 thus ?L; by simp; |
385 thus ?L; by simp; |
308 qed; |
386 qed; |
|
387 **) |
309 |
388 |
310 lemma vs_eq_diff_eq: |
389 lemma vs_eq_diff_eq: |
311 "[| is_vectorspace V; x:V; y:V; z:V |] ==> (x = z [-] y) = (x [+] y = z)" |
390 "[| is_vectorspace V; x:V; y:V; z:V |] ==> |
|
391 (x = z [-] y) = (x [+] y = z)" |
312 (concl is "?L = ?R" ); |
392 (concl is "?L = ?R" ); |
313 proof -; |
393 proof -; |
314 assume vs: "is_vectorspace V" "x:V" "y:V" "z:V"; |
394 assume vs: "is_vectorspace V" "x:V" "y:V" "z:V"; |
315 show "?L = ?R"; |
395 show "?L = ?R"; |
316 proof; |
396 proof; |
317 assume l: ?L; |
397 assume l: ?L; |
318 have "x [+] y = z [-] y [+] y"; by (simp add: l); |
398 have "x [+] y = z [-] y [+] y"; by (simp add: l); |
319 also; have "... = z [+] [-] y [+] y"; by (simp only: vs_add_minus_eq_diff); |
399 also; have "... = z [+] [-] y [+] y"; by (unfold diff_def) simp; |
320 also; have "... = z [+] ([-] y [+] y)"; by (rule vs_add_assoc) (simp!)+; |
400 also; have "... = z [+] ([-] y [+] y)"; |
321 also; from vs; have "... = z [+] <0>"; by (simp only: vs_add_minus_left); |
401 by (rule vs_add_assoc) (simp!)+; |
|
402 also; from vs; have "... = z [+] <0>"; |
|
403 by (simp only: vs_add_minus_left); |
322 also; from vs; have "... = z"; by (simp only: vs_add_zero_right); |
404 also; from vs; have "... = z"; by (simp only: vs_add_zero_right); |
323 finally; show ?R;.; |
405 finally; show ?R;.; |
324 next; |
406 next; |
325 assume r: ?R; |
407 assume r: ?R; |
326 have "z [-] y = (x [+] y) [-] y"; by (simp only: r); |
408 have "z [-] y = (x [+] y) [-] y"; by (simp only: r); |
327 also; from vs; have "... = x [+] y [+] [-] y"; by (simp only: vs_add_minus_eq_diff); |
409 also; from vs; have "... = x [+] y [+] [-] y"; |
328 also; have "... = x [+] (y [+] [-] y)"; by (rule vs_add_assoc) (simp!)+; |
410 by (unfold diff_def) simp; |
|
411 also; have "... = x [+] (y [+] [-] y)"; |
|
412 by (rule vs_add_assoc) (simp!)+; |
329 also; have "... = x"; by (simp!); |
413 also; have "... = x"; by (simp!); |
330 finally; show ?L; by (rule sym); |
414 finally; show ?L; by (rule sym); |
331 qed; |
415 qed; |
332 qed; |
416 qed; |
333 |
417 |
334 lemma vs_add_minus_eq_minus: "[| is_vectorspace V; x:V; y:V; <0> = x [+] y|] ==> y = [-] x"; |
418 lemma vs_add_minus_eq_minus: |
|
419 "[| is_vectorspace V; x:V; y:V; <0> = x [+] y|] ==> y = [-] x"; |
335 proof -; |
420 proof -; |
336 assume vs: "is_vectorspace V" "x:V" "y:V"; |
421 assume vs: "is_vectorspace V" "x:V" "y:V"; |
337 assume "<0> = x [+] y"; |
422 assume "<0> = x [+] y"; |
338 have "[-] x = [-] x [+] <0>"; by (simp!); |
423 have "[-] x = [-] x [+] <0>"; by (simp!); |
339 also; have "... = [-] x [+] (x [+] y)"; by (simp!); |
424 also; have "... = [-] x [+] (x [+] y)"; by (simp!); |
340 also; have "... = [-] x [+] x [+] y"; by (rule vs_add_assoc [RS sym]) (simp!)+; |
425 also; have "... = [-] x [+] x [+] y"; |
|
426 by (rule vs_add_assoc [RS sym]) (simp!)+; |
341 also; have "... = (x [+] [-] x) [+] y"; by (simp!); |
427 also; have "... = (x [+] [-] x) [+] y"; by (simp!); |
342 also; have "... = y"; by (simp!); |
428 also; have "... = y"; by (simp!); |
343 finally; show ?thesis; by (rule sym); |
429 finally; show ?thesis; by (rule sym); |
344 qed; |
430 qed; |
345 |
431 |
346 lemma vs_add_minus_eq: "[| is_vectorspace V; x:V; y:V; x [-] y = <0> |] ==> x = y"; |
432 lemma vs_add_minus_eq: |
|
433 "[| is_vectorspace V; x:V; y:V; x [-] y = <0> |] ==> x = y"; |
347 proof -; |
434 proof -; |
348 assume "is_vectorspace V" "x:V" "y:V" "x [-] y = <0>"; |
435 assume "is_vectorspace V" "x:V" "y:V" "x [-] y = <0>"; |
349 have "x [+] [-] y = x [-] y"; by (unfold diff_def, simp); |
436 have "x [+] [-] y = x [-] y"; by (unfold diff_def, simp); |
350 also; have "... = <0>"; .; |
437 also; have "... = <0>"; .; |
351 finally; have e: "<0> = x [+] [-] y"; by (rule sym); |
438 finally; have e: "<0> = x [+] [-] y"; by (rule sym); |
352 have "x = [-] [-] x"; by (simp!); |
439 have "x = [-] [-] x"; by (simp!); |
353 also; have "[-] x = [-] y"; by (rule vs_add_minus_eq_minus [RS sym]) (simp! add: e)+; |
440 also; have "[-] x = [-] y"; |
|
441 by (rule vs_add_minus_eq_minus [RS sym]) (simp! add: e)+; |
354 also; have "[-] ... = y"; by (simp!); |
442 also; have "[-] ... = y"; by (simp!); |
355 finally; show "x = y"; .; |
443 finally; show "x = y"; .; |
356 qed; |
444 qed; |
357 |
445 |
358 lemma vs_add_diff_swap: |
446 lemma vs_add_diff_swap: |
359 "[| is_vectorspace V; a:V; b:V; c:V; d:V; a [+] b = c [+] d|] ==> a [-] c = d [-] b"; |
447 "[| is_vectorspace V; a:V; b:V; c:V; d:V; a [+] b = c [+] d|] |
|
448 ==> a [-] c = d [-] b"; |
360 proof -; |
449 proof -; |
361 assume vs: "is_vectorspace V" "a:V" "b:V" "c:V" "d:V" and eq: "a [+] b = c [+] d"; |
450 assume vs: "is_vectorspace V" "a:V" "b:V" "c:V" "d:V" |
362 have "[-] c [+] (a [+] b) = [-] c [+] (c [+] d)"; by (simp! add: vs_add_left_cancel); |
451 and eq: "a [+] b = c [+] d"; |
|
452 have "[-] c [+] (a [+] b) = [-] c [+] (c [+] d)"; |
|
453 by (simp! add: vs_add_left_cancel); |
363 also; have "... = d"; by (rule vs_minus_add_cancel); |
454 also; have "... = d"; by (rule vs_minus_add_cancel); |
364 finally; have eq: "[-] c [+] (a [+] b) = d"; .; |
455 finally; have eq: "[-] c [+] (a [+] b) = d"; .; |
365 from vs; have "a [-] c = ([-] c [+] (a [+] b)) [+] [-] b"; by (simp add: vs_add_ac diff_def); |
456 from vs; have "a [-] c = ([-] c [+] (a [+] b)) [+] [-] b"; |
366 also; from eq; have "... = d [+] [-] b"; by (simp! add: vs_add_right_cancel); |
457 by (simp add: vs_add_ac diff_def); |
|
458 also; from eq; have "... = d [+] [-] b"; |
|
459 by (simp! add: vs_add_right_cancel); |
367 also; have "... = d [-] b"; by (simp add : diff_def); |
460 also; have "... = d [-] b"; by (simp add : diff_def); |
368 finally; show "a [-] c = d [-] b"; .; |
461 finally; show "a [-] c = d [-] b"; .; |
369 qed; |
462 qed; |
370 |
463 |
371 lemma vs_add_cancel_21: |
464 lemma vs_add_cancel_21: |
372 "[| is_vectorspace V; x:V; y:V; z:V; u:V|] ==> (x [+] (y [+] z) = y [+] u) = ((x [+] z) = u)" |
465 "[| is_vectorspace V; x:V; y:V; z:V; u:V|] |
|
466 ==> (x [+] (y [+] z) = y [+] u) = ((x [+] z) = u)" |
373 (concl is "?L = ?R" ); |
467 (concl is "?L = ?R" ); |
374 proof -; |
468 proof -; |
375 assume vs: "is_vectorspace V" "x:V" "y:V""z:V" "u:V"; |
469 assume vs: "is_vectorspace V" "x:V" "y:V""z:V" "u:V"; |
376 show "?L = ?R"; |
470 show "?L = ?R"; |
377 proof; |
471 proof; |
378 assume l: ?L; |
472 assume l: ?L; |
379 have "u = <0> [+] u"; by (simp!); |
473 have "u = <0> [+] u"; by (simp!); |
380 also; have "... = [-] y [+] y [+] u"; by (simp!); |
474 also; have "... = [-] y [+] y [+] u"; by (simp!); |
381 also; have "... = [-] y [+] (y [+] u)"; by (rule vs_add_assoc) (simp!)+; |
475 also; have "... = [-] y [+] (y [+] u)"; |
|
476 by (rule vs_add_assoc) (simp!)+; |
382 also; have "... = [-] y [+] (x [+] (y [+] z))"; by (simp only: l); |
477 also; have "... = [-] y [+] (x [+] (y [+] z))"; by (simp only: l); |
383 also; have "... = [-] y [+] (y [+] (x [+] z))"; by (simp!); |
478 also; have "... = [-] y [+] (y [+] (x [+] z))"; by (simp!); |
384 also; have "... = [-] y [+] y [+] (x [+] z)"; by (rule vs_add_assoc [RS sym]) (simp!)+; |
479 also; have "... = [-] y [+] y [+] (x [+] z)"; |
|
480 by (rule vs_add_assoc [RS sym]) (simp!)+; |
385 also; have "... = (x [+] z)"; by (simp!); |
481 also; have "... = (x [+] z)"; by (simp!); |
386 finally; show ?R; by (rule sym); |
482 finally; show ?R; by (rule sym); |
387 next; |
483 next; |
388 assume r: ?R; |
484 assume r: ?R; |
389 have "x [+] (y [+] z) = y [+] (x [+] z)"; by (simp! only: vs_add_left_commute [of V x]); |
485 have "x [+] (y [+] z) = y [+] (x [+] z)"; |
|
486 by (simp! only: vs_add_left_commute [of V x]); |
390 also; have "... = y [+] u"; by (simp only: r); |
487 also; have "... = y [+] u"; by (simp only: r); |
391 finally; show ?L; .; |
488 finally; show ?L; .; |
392 qed; |
489 qed; |
393 qed; |
490 qed; |
394 |
491 |
395 lemma vs_add_cancel_end: |
492 lemma vs_add_cancel_end: |
396 "[| is_vectorspace V; x:V; y:V; z:V |] ==> (x [+] (y [+] z) = y) = (x = [-] z)" |
493 "[| is_vectorspace V; x:V; y:V; z:V |] |
|
494 ==> (x [+] (y [+] z) = y) = (x = [-] z)" |
397 (concl is "?L = ?R" ); |
495 (concl is "?L = ?R" ); |
398 proof -; |
496 proof -; |
399 assume vs: "is_vectorspace V" "x:V" "y:V" "z:V"; |
497 assume vs: "is_vectorspace V" "x:V" "y:V" "z:V"; |
400 show "?L = ?R"; |
498 show "?L = ?R"; |
401 proof; |
499 proof; |
402 assume l: ?L; |
500 assume l: ?L; |
403 have "<0> = x [+] z"; |
501 have "<0> = x [+] z"; |
404 proof (rule vs_add_left_cancel [RS iffD1]); |
502 proof (rule vs_add_left_cancel [RS iffD1]); |
405 have "y [+] <0> = y"; by (simp! only: vs_add_zero_right); |
503 have "y [+] <0> = y"; by (simp! only: vs_add_zero_right); |
406 also; have "... = x [+] (y [+] z)"; by (simp only: l); |
504 also; have "... = x [+] (y [+] z)"; by (simp only: l); |
407 also; have "... = y [+] (x [+] z)"; by (simp! only: vs_add_left_commute); |
505 also; have "... = y [+] (x [+] z)"; |
|
506 by (simp! only: vs_add_left_commute); |
408 finally; show "y [+] <0> = y [+] (x [+] z)"; .; |
507 finally; show "y [+] <0> = y [+] (x [+] z)"; .; |
409 qed (simp!)+; |
508 qed (simp!)+; |
410 hence "z = [-] x"; by (simp! only: vs_add_minus_eq_minus); |
509 hence "z = [-] x"; by (simp! only: vs_add_minus_eq_minus); |
411 then; show ?R; by (simp!); |
510 then; show ?R; by (simp!); |
412 next; |
511 next; |
413 assume r: ?R; |
512 assume r: ?R; |
414 have "x [+] (y [+] z) = [-] z [+] (y [+] z)"; by (simp only: r); |
513 have "x [+] (y [+] z) = [-] z [+] (y [+] z)"; by (simp only: r); |
415 also; have "... = y [+] ([-] z [+] z)"; by (simp! only: vs_add_left_commute); |
514 also; have "... = y [+] ([-] z [+] z)"; |
|
515 by (simp! only: vs_add_left_commute); |
416 also; have "... = y [+] <0>"; by (simp!); |
516 also; have "... = y [+] <0>"; by (simp!); |
417 also; have "... = y"; by (simp!); |
517 also; have "... = y"; by (simp!); |
418 finally; show ?L; .; |
518 finally; show ?L; .; |
419 qed; |
519 qed; |
420 qed; |
520 qed; |
421 |
521 |
422 lemma it: "[| x = y; x' = y'|] ==> x [+] x' = y [+] y'"; |
522 lemma it: "[| x = y; x' = y'|] ==> x [+] x' = y [+] y'"; |
423 by simp; |
523 by simp; |
424 |
524 |
425 |
|
426 end; |
525 end; |