7 |
7 |
8 theory RealVector |
8 theory RealVector |
9 imports RealPow |
9 imports RealPow |
10 begin |
10 begin |
11 |
11 |
12 subsection {* Group homomorphisms *} |
|
13 |
|
14 locale group_hom = |
|
15 ab_group_add |
|
16 mA (infixl "-\<^sub>A" 65) |
|
17 uA ("-\<^sub>A _" [81] 80) |
|
18 zA ("0\<^sub>A") |
|
19 pA (infixl "+\<^sub>A" 65) + |
|
20 ab_group_add |
|
21 mB (infixl "-\<^sub>B" 65) |
|
22 uB ("-\<^sub>B _" [81] 80) |
|
23 zB ("0\<^sub>B") |
|
24 pB (infixl "+\<^sub>B" 65) + |
|
25 fixes f :: "'a \<Rightarrow> 'b" |
|
26 assumes plus: "f (x +\<^sub>A y) = f x +\<^sub>B f y" |
|
27 begin |
|
28 |
|
29 lemma zero: "f 0\<^sub>A = 0\<^sub>B" |
|
30 proof - |
|
31 have "f 0\<^sub>A +\<^sub>B f 0\<^sub>A = f (0\<^sub>A +\<^sub>A 0\<^sub>A)" by (rule plus [symmetric]) |
|
32 also have "f (0\<^sub>A +\<^sub>A 0\<^sub>A) = 0\<^sub>B +\<^sub>B f 0\<^sub>A" by simp |
|
33 finally show "f 0\<^sub>A = 0\<^sub>B" by (rule pB.add_right_imp_eq) |
|
34 qed |
|
35 |
|
36 lemma uminus: "f (-\<^sub>A x) = -\<^sub>B f x" |
|
37 proof - |
|
38 have "f (-\<^sub>A x) +\<^sub>B f x = f (-\<^sub>A x +\<^sub>A x)" by (rule plus [symmetric]) |
|
39 also have "\<dots> = -\<^sub>B f x +\<^sub>B f x" by (simp add: zero) |
|
40 finally show "f (-\<^sub>A x) = -\<^sub>B f x" by (rule pB.add_right_imp_eq) |
|
41 qed |
|
42 |
|
43 lemma diff: "f (x -\<^sub>A y) = f x -\<^sub>B f y" |
|
44 by (simp add: mA_uA_zA_pA.diff_minus mB_uB_zB_pB.diff_minus plus uminus) |
|
45 |
|
46 text {* TODO: |
|
47 Locale-ize definition of setsum, so we can prove a lemma for it *} |
|
48 |
|
49 end |
|
50 |
|
51 subsection {* Vector spaces *} |
|
52 |
|
53 locale vector_space = |
|
54 field |
|
55 inverse |
|
56 divide (infixl "'/\<^sub>F" 70) |
|
57 one ("1\<^sub>F") |
|
58 times (infixl "*\<^sub>F" 70) |
|
59 mF (infixl "-\<^sub>F" 65) |
|
60 uF ("-\<^sub>F _" [81] 80) |
|
61 zF ("0\<^sub>F") |
|
62 pF (infixl "+\<^sub>F" 65) + |
|
63 ab_group_add |
|
64 mV (infixl "-\<^sub>V" 65) |
|
65 uV ("-\<^sub>V _" [81] 80) |
|
66 zV ("0\<^sub>V") |
|
67 pV (infixl "+\<^sub>V" 65) + |
|
68 fixes scale :: "'a \<Rightarrow> 'b \<Rightarrow> 'b" (infixr "%*" 75) |
|
69 assumes scale_right_distrib: "scale a (x +\<^sub>V y) = scale a x +\<^sub>V scale a y" |
|
70 and scale_left_distrib: "scale (a +\<^sub>F b) x = scale a x +\<^sub>V scale b x" |
|
71 and scale_scale [simp]: "scale a (scale b x) = scale (a *\<^sub>F b) x" |
|
72 and scale_one [simp]: "scale 1\<^sub>F x = x" |
|
73 begin |
|
74 |
|
75 lemma scale_left_commute: |
|
76 "scale a (scale b x) = scale b (scale a x)" |
|
77 by (simp add: mult_commute) |
|
78 |
|
79 lemma scale_zero_left [simp]: "scale 0\<^sub>F x = 0\<^sub>V" |
|
80 and scale_minus_left [simp]: "scale (-\<^sub>F a) x = -\<^sub>V (scale a x)" |
|
81 and scale_left_diff_distrib: "scale (a -\<^sub>F b) x = scale a x -\<^sub>V scale b x" |
|
82 proof - |
|
83 interpret s: group_hom |
|
84 [mF uF zF pF mV uV zV pV "\<lambda>a. scale a x"] |
|
85 by unfold_locales (rule scale_left_distrib) |
|
86 show "scale 0\<^sub>F x = 0\<^sub>V" by (rule s.zero) |
|
87 show "scale (-\<^sub>F a) x = -\<^sub>V (scale a x)" by (rule s.uminus) |
|
88 show "scale (a -\<^sub>F b) x = scale a x -\<^sub>V scale b x" by (rule s.diff) |
|
89 qed |
|
90 |
|
91 lemma scale_zero_right [simp]: "scale a 0\<^sub>V = 0\<^sub>V" |
|
92 and scale_minus_right [simp]: "scale a (-\<^sub>V x) = -\<^sub>V (scale a x)" |
|
93 and scale_right_diff_distrib: "scale a (x -\<^sub>V y) = scale a x -\<^sub>V scale a y" |
|
94 proof - |
|
95 interpret s: group_hom |
|
96 [mV uV zV pV mV uV zV pV "\<lambda>x. scale a x"] |
|
97 by unfold_locales (rule scale_right_distrib) |
|
98 show "scale a 0\<^sub>V = 0\<^sub>V" by (rule s.zero) |
|
99 show "scale a (-\<^sub>V x) = -\<^sub>V (scale a x)" by (rule s.uminus) |
|
100 show "scale a (x -\<^sub>V y) = scale a x -\<^sub>V scale a y" by (rule s.diff) |
|
101 qed |
|
102 |
|
103 lemma scale_eq_0_iff [simp]: |
|
104 "scale a x = 0\<^sub>V \<longleftrightarrow> a = 0\<^sub>F \<or> x = 0\<^sub>V" |
|
105 proof cases |
|
106 assume "a = 0\<^sub>F" thus ?thesis by simp |
|
107 next |
|
108 assume anz [simp]: "a \<noteq> 0\<^sub>F" |
|
109 { assume "scale a x = 0\<^sub>V" |
|
110 hence "scale (inverse a) (scale a x) = 0\<^sub>V" by simp |
|
111 hence "x = 0\<^sub>V" by simp } |
|
112 thus ?thesis by force |
|
113 qed |
|
114 |
|
115 lemma scale_left_imp_eq: |
|
116 "\<lbrakk>a \<noteq> 0\<^sub>F; scale a x = scale a y\<rbrakk> \<Longrightarrow> x = y" |
|
117 proof - |
|
118 assume nonzero: "a \<noteq> 0\<^sub>F" |
|
119 assume "scale a x = scale a y" |
|
120 hence "scale a (x -\<^sub>V y) = 0\<^sub>V" |
|
121 by (simp add: scale_right_diff_distrib) |
|
122 hence "x -\<^sub>V y = 0\<^sub>V" by (simp add: nonzero) |
|
123 thus "x = y" by (simp only: mV_uV_zV_pV.right_minus_eq) |
|
124 qed |
|
125 |
|
126 lemma scale_right_imp_eq: |
|
127 "\<lbrakk>x \<noteq> 0\<^sub>V; scale a x = scale b x\<rbrakk> \<Longrightarrow> a = b" |
|
128 proof - |
|
129 assume nonzero: "x \<noteq> 0\<^sub>V" |
|
130 assume "scale a x = scale b x" |
|
131 hence "scale (a -\<^sub>F b) x = 0\<^sub>V" |
|
132 by (simp add: scale_left_diff_distrib) |
|
133 hence "a -\<^sub>F b = 0\<^sub>F" by (simp add: nonzero) |
|
134 thus "a = b" by (simp only: mF_uF_zF_pF.right_minus_eq) |
|
135 qed |
|
136 |
|
137 lemma scale_cancel_left: |
|
138 "scale a x = scale a y \<longleftrightarrow> x = y \<or> a = 0\<^sub>F" |
|
139 by (auto intro: scale_left_imp_eq) |
|
140 |
|
141 lemma scale_cancel_right: |
|
142 "scale a x = scale b x \<longleftrightarrow> a = b \<or> x = 0\<^sub>V" |
|
143 by (auto intro: scale_right_imp_eq) |
|
144 |
|
145 end |
|
146 |
|
147 (* TODO: locale additive is superseded by group_hom; remove *) |
|
148 subsection {* Locale for additive functions *} |
12 subsection {* Locale for additive functions *} |
149 |
13 |
150 locale additive = |
14 locale additive = |
151 fixes f :: "'a::ab_group_add \<Rightarrow> 'b::ab_group_add" |
15 fixes f :: "'a::ab_group_add \<Rightarrow> 'b::ab_group_add" |
152 assumes add: "f (x + y) = f x + f y" |
16 assumes add: "f (x + y) = f x + f y" |
177 apply (simp add: zero) |
41 apply (simp add: zero) |
178 done |
42 done |
179 |
43 |
180 end |
44 end |
181 |
45 |
|
46 subsection {* Vector spaces *} |
|
47 |
|
48 locale vector_space = |
|
49 fixes scale :: "'a::field \<Rightarrow> 'b::ab_group_add \<Rightarrow> 'b" |
|
50 assumes scale_right_distrib: "scale a (x + y) = scale a x + scale a y" |
|
51 and scale_left_distrib: "scale (a + b) x = scale a x + scale b x" |
|
52 and scale_scale [simp]: "scale a (scale b x) = scale (a * b) x" |
|
53 and scale_one [simp]: "scale 1 x = x" |
|
54 begin |
|
55 |
|
56 lemma scale_left_commute: |
|
57 "scale a (scale b x) = scale b (scale a x)" |
|
58 by (simp add: mult_commute) |
|
59 |
|
60 lemma scale_zero_left [simp]: "scale 0 x = 0" |
|
61 and scale_minus_left [simp]: "scale (- a) x = - (scale a x)" |
|
62 and scale_left_diff_distrib: "scale (a - b) x = scale a x - scale b x" |
|
63 proof - |
|
64 interpret s: additive ["\<lambda>a. scale a x"] |
|
65 by unfold_locales (rule scale_left_distrib) |
|
66 show "scale 0 x = 0" by (rule s.zero) |
|
67 show "scale (- a) x = - (scale a x)" by (rule s.minus) |
|
68 show "scale (a - b) x = scale a x - scale b x" by (rule s.diff) |
|
69 qed |
|
70 |
|
71 lemma scale_zero_right [simp]: "scale a 0 = 0" |
|
72 and scale_minus_right [simp]: "scale a (- x) = - (scale a x)" |
|
73 and scale_right_diff_distrib: "scale a (x - y) = scale a x - scale a y" |
|
74 proof - |
|
75 interpret s: additive ["\<lambda>x. scale a x"] |
|
76 by unfold_locales (rule scale_right_distrib) |
|
77 show "scale a 0 = 0" by (rule s.zero) |
|
78 show "scale a (- x) = - (scale a x)" by (rule s.minus) |
|
79 show "scale a (x - y) = scale a x - scale a y" by (rule s.diff) |
|
80 qed |
|
81 |
|
82 lemma scale_eq_0_iff [simp]: |
|
83 "scale a x = 0 \<longleftrightarrow> a = 0 \<or> x = 0" |
|
84 proof cases |
|
85 assume "a = 0" thus ?thesis by simp |
|
86 next |
|
87 assume anz [simp]: "a \<noteq> 0" |
|
88 { assume "scale a x = 0" |
|
89 hence "scale (inverse a) (scale a x) = 0" by simp |
|
90 hence "x = 0" by simp } |
|
91 thus ?thesis by force |
|
92 qed |
|
93 |
|
94 lemma scale_left_imp_eq: |
|
95 "\<lbrakk>a \<noteq> 0; scale a x = scale a y\<rbrakk> \<Longrightarrow> x = y" |
|
96 proof - |
|
97 assume nonzero: "a \<noteq> 0" |
|
98 assume "scale a x = scale a y" |
|
99 hence "scale a (x - y) = 0" |
|
100 by (simp add: scale_right_diff_distrib) |
|
101 hence "x - y = 0" by (simp add: nonzero) |
|
102 thus "x = y" by (simp only: right_minus_eq) |
|
103 qed |
|
104 |
|
105 lemma scale_right_imp_eq: |
|
106 "\<lbrakk>x \<noteq> 0; scale a x = scale b x\<rbrakk> \<Longrightarrow> a = b" |
|
107 proof - |
|
108 assume nonzero: "x \<noteq> 0" |
|
109 assume "scale a x = scale b x" |
|
110 hence "scale (a - b) x = 0" |
|
111 by (simp add: scale_left_diff_distrib) |
|
112 hence "a - b = 0" by (simp add: nonzero) |
|
113 thus "a = b" by (simp only: right_minus_eq) |
|
114 qed |
|
115 |
|
116 lemma scale_cancel_left: |
|
117 "scale a x = scale a y \<longleftrightarrow> x = y \<or> a = 0" |
|
118 by (auto intro: scale_left_imp_eq) |
|
119 |
|
120 lemma scale_cancel_right: |
|
121 "scale a x = scale b x \<longleftrightarrow> a = b \<or> x = 0" |
|
122 by (auto intro: scale_right_imp_eq) |
|
123 |
|
124 end |
|
125 |
182 subsection {* Real vector spaces *} |
126 subsection {* Real vector spaces *} |
183 |
127 |
184 class scaleR = type + |
128 class scaleR = type + |
185 fixes scaleR :: "real \<Rightarrow> 'a \<Rightarrow> 'a" (infixr "*\<^sub>R" 75) |
129 fixes scaleR :: "real \<Rightarrow> 'a \<Rightarrow> 'a" (infixr "*\<^sub>R" 75) |
186 begin |
130 begin |
206 assumes scaleR_right_distrib: "scaleR a (x + y) = scaleR a x + scaleR a y" |
150 assumes scaleR_right_distrib: "scaleR a (x + y) = scaleR a x + scaleR a y" |
207 and scaleR_left_distrib: "scaleR (a + b) x = scaleR a x + scaleR b x" |
151 and scaleR_left_distrib: "scaleR (a + b) x = scaleR a x + scaleR b x" |
208 and scaleR_scaleR [simp]: "scaleR a (scaleR b x) = scaleR (a * b) x" |
152 and scaleR_scaleR [simp]: "scaleR a (scaleR b x) = scaleR (a * b) x" |
209 and scaleR_one [simp]: "scaleR 1 x = x" |
153 and scaleR_one [simp]: "scaleR 1 x = x" |
210 |
154 |
211 interpretation real_vector: vector_space |
155 interpretation real_vector: |
212 [inverse divide "1" times minus uminus "0" plus |
156 vector_space ["scaleR :: real \<Rightarrow> 'a \<Rightarrow> 'a::real_vector"] |
213 minus uminus "0" plus "scaleR::real \<Rightarrow> 'a \<Rightarrow> 'a::real_vector"] |
|
214 apply unfold_locales |
157 apply unfold_locales |
215 apply (rule scaleR_right_distrib) |
158 apply (rule scaleR_right_distrib) |
216 apply (rule scaleR_left_distrib) |
159 apply (rule scaleR_left_distrib) |
217 apply (rule scaleR_scaleR) |
160 apply (rule scaleR_scaleR) |
218 apply (rule scaleR_one) |
161 apply (rule scaleR_one) |