5 License: GPL (GNU GENERAL PUBLIC LICENSE) |
5 License: GPL (GNU GENERAL PUBLIC LICENSE) |
6 *) |
6 *) |
7 |
7 |
8 header {* |
8 header {* |
9 \title{Ring and field structures} |
9 \title{Ring and field structures} |
10 \author{Gertrud Bauer and Markus Wenzel} |
10 \author{Gertrud Bauer, L. C. Paulson and Markus Wenzel} |
11 *} |
11 *} |
12 |
12 |
13 theory Ring_and_Field = Inductive: |
13 theory Ring_and_Field = Inductive: |
14 |
|
15 text{*Lemmas and extension to semirings by L. C. Paulson*} |
|
16 |
14 |
17 subsection {* Abstract algebraic structures *} |
15 subsection {* Abstract algebraic structures *} |
18 |
16 |
19 axclass semiring \<subseteq> zero, one, plus, times |
17 axclass semiring \<subseteq> zero, one, plus, times |
20 add_assoc: "(a + b) + c = a + (b + c)" |
18 add_assoc: "(a + b) + c = a + (b + c)" |
165 lemma mult_left_commute: "a * (b * c) = b * (a * (c::'a::semiring))" |
163 lemma mult_left_commute: "a * (b * c) = b * (a * (c::'a::semiring))" |
166 by (rule mk_left_commute [of "op *", OF mult_assoc mult_commute]) |
164 by (rule mk_left_commute [of "op *", OF mult_assoc mult_commute]) |
167 |
165 |
168 theorems mult_ac = mult_assoc mult_commute mult_left_commute |
166 theorems mult_ac = mult_assoc mult_commute mult_left_commute |
169 |
167 |
170 lemma mult_left_zero [simp]: "0 * a = (0::'a::semiring)" |
168 lemma mult_zero_left [simp]: "0 * a = (0::'a::semiring)" |
171 proof - |
169 proof - |
172 have "0*a + 0*a = 0*a + 0" |
170 have "0*a + 0*a = 0*a + 0" |
173 by (simp add: left_distrib [symmetric]) |
171 by (simp add: left_distrib [symmetric]) |
174 thus ?thesis by (simp only: add_left_cancel) |
172 thus ?thesis by (simp only: add_left_cancel) |
175 qed |
173 qed |
176 |
174 |
177 lemma mult_right_zero [simp]: "a * 0 = (0::'a::semiring)" |
175 lemma mult_zero_right [simp]: "a * 0 = (0::'a::semiring)" |
178 by (simp add: mult_commute) |
176 by (simp add: mult_commute) |
179 |
177 |
180 |
178 |
181 subsection {* Distribution rules *} |
179 subsection {* Distribution rules *} |
182 |
180 |
1331 "(c/a = c/b) = (c = 0 | a = (b::'a::{field,division_by_zero}))" |
1329 "(c/a = c/b) = (c = 0 | a = (b::'a::{field,division_by_zero}))" |
1332 apply (case_tac "c=0", simp) |
1330 apply (case_tac "c=0", simp) |
1333 apply (simp add: divide_inverse_zero field_mult_cancel_left) |
1331 apply (simp add: divide_inverse_zero field_mult_cancel_left) |
1334 done |
1332 done |
1335 |
1333 |
|
1334 subsection {* Division and the Number One *} |
|
1335 |
|
1336 text{*Simplify expressions equated with 1*} |
|
1337 lemma divide_eq_1_iff [simp]: |
|
1338 "(a/b = 1) = (b \<noteq> 0 & a = (b::'a::{field,division_by_zero}))" |
|
1339 apply (case_tac "b=0", simp) |
|
1340 apply (simp add: right_inverse_eq) |
|
1341 done |
|
1342 |
|
1343 |
|
1344 lemma one_eq_divide_iff [simp]: |
|
1345 "(1 = a/b) = (b \<noteq> 0 & a = (b::'a::{field,division_by_zero}))" |
|
1346 by (simp add: eq_commute [of 1]) |
|
1347 |
|
1348 lemma zero_eq_1_divide_iff [simp]: |
|
1349 "((0::'a::{ordered_field,division_by_zero}) = 1/a) = (a = 0)" |
|
1350 apply (case_tac "a=0", simp) |
|
1351 apply (auto simp add: nonzero_eq_divide_eq) |
|
1352 done |
|
1353 |
|
1354 lemma one_divide_eq_0_iff [simp]: |
|
1355 "(1/a = (0::'a::{ordered_field,division_by_zero})) = (a = 0)" |
|
1356 apply (case_tac "a=0", simp) |
|
1357 apply (insert zero_neq_one [THEN not_sym]) |
|
1358 apply (auto simp add: nonzero_divide_eq_eq) |
|
1359 done |
|
1360 |
|
1361 text{*Simplify expressions such as @{text "0 < 1/x"} to @{text "0 < x"}*} |
|
1362 declare zero_less_divide_iff [of "1", simp] |
|
1363 declare divide_less_0_iff [of "1", simp] |
|
1364 declare zero_le_divide_iff [of "1", simp] |
|
1365 declare divide_le_0_iff [of "1", simp] |
|
1366 |
1336 |
1367 |
1337 subsection {* Ordering Rules for Division *} |
1368 subsection {* Ordering Rules for Division *} |
1338 |
1369 |
1339 lemma divide_strict_right_mono: |
1370 lemma divide_strict_right_mono: |
1340 "[|a < b; 0 < c|] ==> a / c < b / (c::'a::ordered_field)" |
1371 "[|a < b; 0 < c|] ==> a / c < b / (c::'a::ordered_field)" |
1410 apply (case_tac "a=0 | b=0", force) |
1441 apply (case_tac "a=0 | b=0", force) |
1411 apply (auto elim: order_less_asym |
1442 apply (auto elim: order_less_asym |
1412 simp add: abs_if mult_less_0_iff linorder_neq_iff |
1443 simp add: abs_if mult_less_0_iff linorder_neq_iff |
1413 minus_mult_left [symmetric] minus_mult_right [symmetric]) |
1444 minus_mult_left [symmetric] minus_mult_right [symmetric]) |
1414 done |
1445 done |
1415 |
|
1416 |
1446 |
1417 lemma abs_mult_self: "abs a * abs a = a * (a::'a::ordered_ring)" |
1447 lemma abs_mult_self: "abs a * abs a = a * (a::'a::ordered_ring)" |
1418 by (simp add: abs_if) |
1448 by (simp add: abs_if) |
1419 |
1449 |
1420 lemma abs_eq_0 [simp]: "(abs a = 0) = (a = (0::'a::ordered_ring))" |
1450 lemma abs_eq_0 [simp]: "(abs a = 0) = (a = (0::'a::ordered_ring))" |
1569 val equation_minus_iff = thm"equation_minus_iff"; |
1599 val equation_minus_iff = thm"equation_minus_iff"; |
1570 val minus_equation_iff = thm"minus_equation_iff"; |
1600 val minus_equation_iff = thm"minus_equation_iff"; |
1571 val mult_1 = thm"mult_1"; |
1601 val mult_1 = thm"mult_1"; |
1572 val mult_1_right = thm"mult_1_right"; |
1602 val mult_1_right = thm"mult_1_right"; |
1573 val mult_left_commute = thm"mult_left_commute"; |
1603 val mult_left_commute = thm"mult_left_commute"; |
1574 val mult_left_zero = thm"mult_left_zero"; |
1604 val mult_zero_left = thm"mult_zero_left"; |
1575 val mult_right_zero = thm"mult_right_zero"; |
1605 val mult_zero_right = thm"mult_zero_right"; |
1576 val left_distrib = thm "left_distrib"; |
1606 val left_distrib = thm "left_distrib"; |
1577 val right_distrib = thm"right_distrib"; |
1607 val right_distrib = thm"right_distrib"; |
1578 val combine_common_factor = thm"combine_common_factor"; |
1608 val combine_common_factor = thm"combine_common_factor"; |
1579 val minus_add_distrib = thm"minus_add_distrib"; |
1609 val minus_add_distrib = thm"minus_add_distrib"; |
1580 val minus_mult_left = thm"minus_mult_left"; |
1610 val minus_mult_left = thm"minus_mult_left"; |