40 fix a :: 'a |
48 fix a :: 'a |
41 have "0 * a + 0 * a = 0 * a + 0" |
49 have "0 * a + 0 * a = 0 * a + 0" |
42 by (simp add: left_distrib [symmetric]) |
50 by (simp add: left_distrib [symmetric]) |
43 thus "0 * a = 0" |
51 thus "0 * a = 0" |
44 by (simp only: add_left_cancel) |
52 by (simp only: add_left_cancel) |
45 |
53 next |
|
54 fix a :: 'a |
46 have "a * 0 + a * 0 = a * 0 + 0" |
55 have "a * 0 + a * 0 = a * 0 + 0" |
47 by (simp add: right_distrib [symmetric]) |
56 by (simp add: right_distrib [symmetric]) |
48 thus "a * 0 = 0" |
57 thus "a * 0 = 0" |
49 by (simp only: add_left_cancel) |
58 by (simp only: add_left_cancel) |
50 qed |
59 qed |
51 |
60 |
|
61 interpretation semiring_0_cancel \<subseteq> semiring_0 |
|
62 proof unfold_locales |
|
63 fix a :: 'a |
|
64 have "plus (times zero a) (times zero a) = plus (times zero a) zero" |
|
65 by (simp add: left_distrib [symmetric]) |
|
66 thus "times zero a = zero" |
|
67 by (simp only: add_left_cancel) |
|
68 next |
|
69 fix a :: 'a |
|
70 have "plus (times a zero) (times a zero) = plus (times a zero) zero" |
|
71 by (simp add: right_distrib [symmetric]) |
|
72 thus "times a zero = zero" |
|
73 by (simp only: add_left_cancel) |
|
74 qed |
|
75 |
52 class comm_semiring = ab_semigroup_add + ab_semigroup_mult + |
76 class comm_semiring = ab_semigroup_add + ab_semigroup_mult + |
53 assumes distrib: "(a + b) * c = a * c + b * c" |
77 assumes distrib: "(a + b) * c = a * c + b * c" |
54 |
78 begin |
55 instance comm_semiring \<subseteq> semiring |
79 |
56 proof |
80 subclass semiring |
|
81 proof unfold_locales |
57 fix a b c :: 'a |
82 fix a b c :: 'a |
58 show "(a + b) * c = a * c + b * c" by (simp add: distrib) |
83 show "(a + b) * c = a * c + b * c" by (simp add: distrib) |
59 have "a * (b + c) = (b + c) * a" by (simp add: mult_ac) |
84 have "a * (b + c) = (b + c) * a" by (simp add: mult_ac) |
60 also have "... = b * a + c * a" by (simp only: distrib) |
85 also have "... = b * a + c * a" by (simp only: distrib) |
61 also have "... = a * b + a * c" by (simp add: mult_ac) |
86 also have "... = a * b + a * c" by (simp add: mult_ac) |
62 finally show "a * (b + c) = a * b + a * c" by blast |
87 finally show "a * (b + c) = a * b + a * c" by blast |
63 qed |
88 qed |
64 |
89 |
|
90 end |
|
91 |
65 class comm_semiring_0 = comm_semiring + comm_monoid_add + mult_zero |
92 class comm_semiring_0 = comm_semiring + comm_monoid_add + mult_zero |
66 |
93 begin |
67 instance comm_semiring_0 \<subseteq> semiring_0 .. |
94 |
|
95 subclass semiring_0 by unfold_locales |
|
96 |
|
97 end |
68 |
98 |
69 class comm_semiring_0_cancel = comm_semiring + comm_monoid_add + cancel_ab_semigroup_add |
99 class comm_semiring_0_cancel = comm_semiring + comm_monoid_add + cancel_ab_semigroup_add |
70 |
100 |
71 instance comm_semiring_0_cancel \<subseteq> semiring_0_cancel .. |
101 instance comm_semiring_0_cancel \<subseteq> semiring_0_cancel .. |
72 |
102 |
73 instance comm_semiring_0_cancel \<subseteq> comm_semiring_0 .. |
103 interpretation comm_semiring_0_cancel \<subseteq> semiring_0_cancel by unfold_locales |
74 |
104 |
75 class zero_neq_one = zero + one + |
105 class zero_neq_one = zero + one + |
76 assumes zero_neq_one [simp]: "0 \<noteq> 1" |
106 assumes zero_neq_one [simp]: "0 \<noteq> 1" |
77 |
107 |
78 class semiring_1 = zero_neq_one + semiring_0 + monoid_mult |
108 class semiring_1 = zero_neq_one + semiring_0 + monoid_mult |
79 |
109 |
80 class comm_semiring_1 = zero_neq_one + comm_semiring_0 + comm_monoid_mult |
110 class comm_semiring_1 = zero_neq_one + comm_semiring_0 + comm_monoid_mult |
81 (*previously almost_semiring*) |
111 (*previously almost_semiring*) |
82 |
112 begin |
83 instance comm_semiring_1 \<subseteq> semiring_1 .. |
113 |
|
114 subclass semiring_1 by unfold_locales |
|
115 |
|
116 end |
84 |
117 |
85 class no_zero_divisors = zero + times + |
118 class no_zero_divisors = zero + times + |
86 assumes no_zero_divisors: "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> a * b \<noteq> 0" |
119 assumes no_zero_divisors: "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> a * b \<noteq> 0" |
87 |
120 |
88 class semiring_1_cancel = semiring + comm_monoid_add + zero_neq_one |
121 class semiring_1_cancel = semiring + comm_monoid_add + zero_neq_one |
89 + cancel_ab_semigroup_add + monoid_mult |
122 + cancel_ab_semigroup_add + monoid_mult |
90 |
123 |
91 instance semiring_1_cancel \<subseteq> semiring_0_cancel .. |
124 instance semiring_1_cancel \<subseteq> semiring_0_cancel .. |
92 |
125 |
93 instance semiring_1_cancel \<subseteq> semiring_1 .. |
126 interpretation semiring_1_cancel \<subseteq> semiring_0_cancel by unfold_locales |
|
127 |
|
128 subclass (in semiring_1_cancel) semiring_1 by unfold_locales |
94 |
129 |
95 class comm_semiring_1_cancel = comm_semiring + comm_monoid_add + comm_monoid_mult |
130 class comm_semiring_1_cancel = comm_semiring + comm_monoid_add + comm_monoid_mult |
96 + zero_neq_one + cancel_ab_semigroup_add |
131 + zero_neq_one + cancel_ab_semigroup_add |
97 |
132 |
98 instance comm_semiring_1_cancel \<subseteq> semiring_1_cancel .. |
133 instance comm_semiring_1_cancel \<subseteq> semiring_1_cancel .. |
99 |
134 |
100 instance comm_semiring_1_cancel \<subseteq> comm_semiring_0_cancel .. |
135 interpretation comm_semiring_1_cancel \<subseteq> semiring_1_cancel by unfold_locales |
|
136 |
|
137 subclass (in comm_semiring_1_cancel) comm_semiring_0_cancel by unfold_locales |
101 |
138 |
102 instance comm_semiring_1_cancel \<subseteq> comm_semiring_1 .. |
139 instance comm_semiring_1_cancel \<subseteq> comm_semiring_1 .. |
103 |
140 |
|
141 interpretation comm_semiring_1_cancel \<subseteq> comm_semiring_1 by unfold_locales |
|
142 |
104 class ring = semiring + ab_group_add |
143 class ring = semiring + ab_group_add |
105 |
144 |
106 instance ring \<subseteq> semiring_0_cancel .. |
145 instance ring \<subseteq> semiring_0_cancel .. |
107 |
146 |
|
147 interpretation ring \<subseteq> semiring_0_cancel by unfold_locales |
|
148 |
|
149 context ring |
|
150 begin |
|
151 |
|
152 text {* Distribution rules *} |
|
153 |
|
154 lemma minus_mult_left: "- (a * b) = - a * b" |
|
155 by (rule equals_zero_I) (simp add: left_distrib [symmetric]) |
|
156 |
|
157 lemma minus_mult_right: "- (a * b) = a * - b" |
|
158 by (rule equals_zero_I) (simp add: right_distrib [symmetric]) |
|
159 |
|
160 lemma minus_mult_minus [simp]: "- a * - b = a * b" |
|
161 by (simp add: minus_mult_left [symmetric] minus_mult_right [symmetric]) |
|
162 |
|
163 lemma minus_mult_commute: "- a * b = a * - b" |
|
164 by (simp add: minus_mult_left [symmetric] minus_mult_right [symmetric]) |
|
165 |
|
166 lemma right_diff_distrib: "a * (b - c) = a * b - a * c" |
|
167 by (simp add: right_distrib diff_minus |
|
168 minus_mult_left [symmetric] minus_mult_right [symmetric]) |
|
169 |
|
170 lemma left_diff_distrib: "(a - b) * c = a * c - b * c" |
|
171 by (simp add: left_distrib diff_minus |
|
172 minus_mult_left [symmetric] minus_mult_right [symmetric]) |
|
173 |
|
174 lemmas ring_distribs = |
|
175 right_distrib left_distrib left_diff_distrib right_diff_distrib |
|
176 |
|
177 end |
|
178 |
|
179 lemmas ring_distribs = |
|
180 right_distrib left_distrib left_diff_distrib right_diff_distrib |
|
181 |
|
182 text{*This list of rewrites simplifies ring terms by multiplying |
|
183 everything out and bringing sums and products into a canonical form |
|
184 (by ordered rewriting). As a result it decides ring equalities but |
|
185 also helps with inequalities. *} |
|
186 lemmas ring_simps = group_simps ring_distribs |
|
187 |
108 class comm_ring = comm_semiring + ab_group_add |
188 class comm_ring = comm_semiring + ab_group_add |
109 |
189 |
110 instance comm_ring \<subseteq> ring .. |
190 instance comm_ring \<subseteq> ring .. |
111 |
191 |
112 instance comm_ring \<subseteq> comm_semiring_0_cancel .. |
192 interpretation comm_ring \<subseteq> ring by unfold_locales |
|
193 |
|
194 instance comm_ring \<subseteq> comm_semiring_0 .. |
|
195 |
|
196 interpretation comm_ring \<subseteq> comm_semiring_0 by unfold_locales |
113 |
197 |
114 class ring_1 = ring + zero_neq_one + monoid_mult |
198 class ring_1 = ring + zero_neq_one + monoid_mult |
115 |
199 |
116 instance ring_1 \<subseteq> semiring_1_cancel .. |
200 instance ring_1 \<subseteq> semiring_1_cancel .. |
|
201 |
|
202 interpretation ring_1 \<subseteq> semiring_1_cancel by unfold_locales |
117 |
203 |
118 class comm_ring_1 = comm_ring + zero_neq_one + comm_monoid_mult |
204 class comm_ring_1 = comm_ring + zero_neq_one + comm_monoid_mult |
119 (*previously ring*) |
205 (*previously ring*) |
120 |
206 |
121 instance comm_ring_1 \<subseteq> ring_1 .. |
207 instance comm_ring_1 \<subseteq> ring_1 .. |
122 |
208 |
|
209 interpretation comm_ring_1 \<subseteq> ring_1 by unfold_locales |
|
210 |
123 instance comm_ring_1 \<subseteq> comm_semiring_1_cancel .. |
211 instance comm_ring_1 \<subseteq> comm_semiring_1_cancel .. |
124 |
212 |
|
213 interpretation comm_ring_1 \<subseteq> comm_semiring_1_cancel by unfold_locales |
|
214 |
125 class ring_no_zero_divisors = ring + no_zero_divisors |
215 class ring_no_zero_divisors = ring + no_zero_divisors |
126 |
216 |
127 class ring_1_no_zero_divisors = ring_1 + ring_no_zero_divisors |
217 class ring_1_no_zero_divisors = ring_1 + ring_no_zero_divisors |
128 |
218 |
129 class idom = comm_ring_1 + no_zero_divisors |
219 class idom = comm_ring_1 + no_zero_divisors |
130 |
220 |
131 instance idom \<subseteq> ring_1_no_zero_divisors .. |
221 instance idom \<subseteq> ring_1_no_zero_divisors .. |
|
222 |
|
223 interpretation idom \<subseteq> ring_1_no_zero_divisors by unfold_locales |
132 |
224 |
133 class division_ring = ring_1 + inverse + |
225 class division_ring = ring_1 + inverse + |
134 assumes left_inverse [simp]: "a \<noteq> 0 \<Longrightarrow> inverse a * a = 1" |
226 assumes left_inverse [simp]: "a \<noteq> 0 \<Longrightarrow> inverse a * a = 1" |
135 assumes right_inverse [simp]: "a \<noteq> 0 \<Longrightarrow> a * inverse a = 1" |
227 assumes right_inverse [simp]: "a \<noteq> 0 \<Longrightarrow> a * inverse a = 1" |
136 |
228 |
162 assume "a \<noteq> 0" |
272 assume "a \<noteq> 0" |
163 thus "inverse a * a = 1" by (rule field_inverse) |
273 thus "inverse a * a = 1" by (rule field_inverse) |
164 thus "a * inverse a = 1" by (simp only: mult_commute) |
274 thus "a * inverse a = 1" by (simp only: mult_commute) |
165 qed |
275 qed |
166 |
276 |
167 instance field \<subseteq> idom .. |
277 interpretation field \<subseteq> division_ring |
|
278 proof unfold_locales |
|
279 fix a :: 'a |
|
280 assume "a \<noteq> zero" |
|
281 thus "times (inverse a) a = one" by (rule field_inverse) |
|
282 thus "times a (inverse a) = one" by (simp only: mult_commute) |
|
283 qed |
|
284 |
|
285 subclass (in field) idom by unfold_locales |
168 |
286 |
169 class division_by_zero = zero + inverse + |
287 class division_by_zero = zero + inverse + |
170 assumes inverse_zero [simp]: "inverse 0 = 0" |
288 assumes inverse_zero [simp]: "inverse 0 = 0" |
171 |
|
172 |
|
173 subsection {* Distribution rules *} |
|
174 |
|
175 text{*For the @{text combine_numerals} simproc*} |
|
176 lemma combine_common_factor: |
|
177 "a*e + (b*e + c) = (a+b)*e + (c::'a::semiring)" |
|
178 by (simp add: left_distrib add_ac) |
|
179 |
|
180 lemma minus_mult_left: "- (a * b) = (-a) * (b::'a::ring)" |
|
181 apply (rule equals_zero_I) |
|
182 apply (simp add: left_distrib [symmetric]) |
|
183 done |
|
184 |
|
185 lemma minus_mult_right: "- (a * b) = a * -(b::'a::ring)" |
|
186 apply (rule equals_zero_I) |
|
187 apply (simp add: right_distrib [symmetric]) |
|
188 done |
|
189 |
|
190 lemma minus_mult_minus [simp]: "(- a) * (- b) = a * (b::'a::ring)" |
|
191 by (simp add: minus_mult_left [symmetric] minus_mult_right [symmetric]) |
|
192 |
|
193 lemma minus_mult_commute: "(- a) * b = a * (- b::'a::ring)" |
|
194 by (simp add: minus_mult_left [symmetric] minus_mult_right [symmetric]) |
|
195 |
|
196 lemma right_diff_distrib: "a * (b - c) = a * b - a * (c::'a::ring)" |
|
197 by (simp add: right_distrib diff_minus |
|
198 minus_mult_left [symmetric] minus_mult_right [symmetric]) |
|
199 |
|
200 lemma left_diff_distrib: "(a - b) * c = a * c - b * (c::'a::ring)" |
|
201 by (simp add: left_distrib diff_minus |
|
202 minus_mult_left [symmetric] minus_mult_right [symmetric]) |
|
203 |
|
204 lemmas ring_distribs = |
|
205 right_distrib left_distrib left_diff_distrib right_diff_distrib |
|
206 |
|
207 text{*This list of rewrites simplifies ring terms by multiplying |
|
208 everything out and bringing sums and products into a canonical form |
|
209 (by ordered rewriting). As a result it decides ring equalities but |
|
210 also helps with inequalities. *} |
|
211 lemmas ring_simps = group_simps ring_distribs |
|
212 |
289 |
213 class mult_mono = times + zero + ord + |
290 class mult_mono = times + zero + ord + |
214 assumes mult_left_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> c * a \<le> c * b" |
291 assumes mult_left_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> c * a \<le> c * b" |
215 assumes mult_right_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> a * c \<le> b * c" |
292 assumes mult_right_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> a * c \<le> b * c" |
216 |
293 |
243 from A show "a * c \<le> b * c" |
326 from A show "a * c \<le> b * c" |
244 unfolding order_le_less |
327 unfolding order_le_less |
245 using mult_strict_right_mono by auto |
328 using mult_strict_right_mono by auto |
246 qed |
329 qed |
247 |
330 |
|
331 interpretation ordered_semiring_strict \<subseteq> ordered_semiring |
|
332 proof unfold_locales |
|
333 fix a b c :: 'a |
|
334 assume A: "less_eq a b" "less_eq zero c" |
|
335 from A show "less_eq (times c a) (times c b)" |
|
336 unfolding le_less |
|
337 using mult_strict_left_mono by (cases "c = zero") auto |
|
338 from A show "less_eq (times a c) (times b c)" |
|
339 unfolding le_less |
|
340 using mult_strict_right_mono by (cases "c = zero") auto |
|
341 qed |
|
342 |
248 class mult_mono1 = times + zero + ord + |
343 class mult_mono1 = times + zero + ord + |
249 assumes mult_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> c * a \<le> c * b" |
344 assumes mult_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> c * a \<le> c * b" |
250 |
345 |
251 class pordered_comm_semiring = comm_semiring_0 |
346 class pordered_comm_semiring = comm_semiring_0 |
252 + pordered_ab_semigroup_add + mult_mono1 |
347 + pordered_ab_semigroup_add + mult_mono1 |
253 |
348 |
254 class pordered_cancel_comm_semiring = comm_semiring_0_cancel |
349 class pordered_cancel_comm_semiring = comm_semiring_0_cancel |
255 + pordered_ab_semigroup_add + mult_mono1 |
350 + pordered_ab_semigroup_add + mult_mono1 |
256 |
351 |
|
352 -- {*FIXME: continue localization here*} |
|
353 |
257 instance pordered_cancel_comm_semiring \<subseteq> pordered_comm_semiring .. |
354 instance pordered_cancel_comm_semiring \<subseteq> pordered_comm_semiring .. |
258 |
355 |
259 class ordered_comm_semiring_strict = comm_semiring_0 + ordered_cancel_ab_semigroup_add + |
356 class ordered_comm_semiring_strict = comm_semiring_0 + ordered_cancel_ab_semigroup_add + |
260 assumes mult_strict_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b" |
357 assumes mult_strict_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b" |
261 |
358 |