author | berghofe |
Tue, 25 Mar 2003 09:48:38 +0100 | |
changeset 13877 | a6b825ee48d9 |
parent 13483 | 0e6adce08fb0 |
child 14260 | 3862336cd4bd |
permissions | -rw-r--r-- |
10479 | 1 |
(* Title: HOL/Library/Ring_and_Field.thy |
2 |
ID: $Id$ |
|
10502 | 3 |
Author: Gertrud Bauer and Markus Wenzel, TU Muenchen |
11780 | 4 |
License: GPL (GNU GENERAL PUBLIC LICENSE) |
10479 | 5 |
*) |
6 |
||
7 |
header {* |
|
10484 | 8 |
\title{Ring and field structures} |
10502 | 9 |
\author{Gertrud Bauer and Markus Wenzel} |
10479 | 10 |
*} |
11 |
||
13476
600f1c93124f
mk_left_commute: proper instantiation avoids expensive unification;
wenzelm
parents:
13438
diff
changeset
|
12 |
theory Ring_and_Field = Main: |
10479 | 13 |
|
10492 | 14 |
subsection {* Abstract algebraic structures *} |
10479 | 15 |
|
11914 | 16 |
axclass ring \<subseteq> zero, one, plus, minus, times |
10479 | 17 |
add_assoc: "(a + b) + c = a + (b + c)" |
18 |
add_commute: "a + b = b + a" |
|
10610 | 19 |
left_zero [simp]: "0 + a = a" |
20 |
left_minus [simp]: "- a + a = 0" |
|
10620 | 21 |
diff_minus: "a - b = a + (-b)" |
10479 | 22 |
|
23 |
mult_assoc: "(a * b) * c = a * (b * c)" |
|
24 |
mult_commute: "a * b = b * a" |
|
11914 | 25 |
left_one [simp]: "1 * a = a" |
10479 | 26 |
|
27 |
left_distrib: "(a + b) * c = a * c + b * c" |
|
28 |
||
11099 | 29 |
axclass ordered_ring \<subseteq> ring, linorder |
10492 | 30 |
add_left_mono: "a \<le> b ==> c + a \<le> c + b" |
31 |
mult_strict_left_mono: "a < b ==> 0 < c ==> c * a < c * b" |
|
32 |
abs_if: "\<bar>a\<bar> = (if a < 0 then -a else a)" |
|
10479 | 33 |
|
11099 | 34 |
axclass field \<subseteq> ring, inverse |
11914 | 35 |
left_inverse [simp]: "a \<noteq> 0 ==> inverse a * a = 1" |
10620 | 36 |
divide_inverse: "b \<noteq> 0 ==> a / b = a * inverse b" |
10479 | 37 |
|
11099 | 38 |
axclass ordered_field \<subseteq> ordered_ring, field |
10488 | 39 |
|
11099 | 40 |
axclass division_by_zero \<subseteq> zero, inverse |
10620 | 41 |
inverse_zero: "inverse 0 = 0" |
42 |
divide_zero: "a / 0 = 0" |
|
43 |
||
10610 | 44 |
|
45 |
||
46 |
subsection {* Derived rules *} |
|
47 |
||
48 |
subsubsection {* Derived rules for addition *} |
|
49 |
||
13476
600f1c93124f
mk_left_commute: proper instantiation avoids expensive unification;
wenzelm
parents:
13438
diff
changeset
|
50 |
lemma right_zero [simp]: "a + 0 = (a::'a::ring)" |
10610 | 51 |
proof - |
52 |
have "a + 0 = 0 + a" by (simp only: add_commute) |
|
10622 | 53 |
also have "... = a" by simp |
10610 | 54 |
finally show ?thesis . |
55 |
qed |
|
56 |
||
57 |
lemma add_left_commute: "a + (b + c) = b + (a + (c::'a::ring))" |
|
13476
600f1c93124f
mk_left_commute: proper instantiation avoids expensive unification;
wenzelm
parents:
13438
diff
changeset
|
58 |
by (rule mk_left_commute [of "op +", OF add_assoc add_commute]) |
10544 | 59 |
|
10610 | 60 |
theorems ring_add_ac = add_assoc add_commute add_left_commute |
61 |
||
13476
600f1c93124f
mk_left_commute: proper instantiation avoids expensive unification;
wenzelm
parents:
13438
diff
changeset
|
62 |
lemma right_minus [simp]: "a + -(a::'a::ring) = 0" |
10610 | 63 |
proof - |
64 |
have "a + -a = -a + a" by (simp add: ring_add_ac) |
|
10622 | 65 |
also have "... = 0" by simp |
10610 | 66 |
finally show ?thesis . |
67 |
qed |
|
68 |
||
10620 | 69 |
lemma right_minus_eq: "(a - b = 0) = (a = (b::'a::ring))" |
13476
600f1c93124f
mk_left_commute: proper instantiation avoids expensive unification;
wenzelm
parents:
13438
diff
changeset
|
70 |
proof |
10620 | 71 |
have "a = a - b + b" by (simp add: diff_minus ring_add_ac) |
10610 | 72 |
also assume "a - b = 0" |
73 |
finally show "a = b" by simp |
|
10620 | 74 |
next |
75 |
assume "a = b" |
|
76 |
thus "a - b = 0" by (simp add: diff_minus) |
|
77 |
qed |
|
10610 | 78 |
|
79 |
lemma diff_self [simp]: "a - (a::'a::ring) = 0" |
|
10620 | 80 |
by (simp add: diff_minus) |
10610 | 81 |
|
82 |
||
83 |
subsubsection {* Derived rules for multiplication *} |
|
10544 | 84 |
|
11914 | 85 |
lemma right_one [simp]: "a = a * (1::'a::field)" |
10610 | 86 |
proof - |
11914 | 87 |
have "a = 1 * a" by simp |
88 |
also have "... = a * 1" by (simp add: mult_commute) |
|
10610 | 89 |
finally show ?thesis . |
90 |
qed |
|
91 |
||
92 |
lemma mult_left_commute: "a * (b * c) = b * (a * (c::'a::ring))" |
|
13483 | 93 |
by (rule mk_left_commute [of "op *", OF mult_assoc mult_commute]) |
10610 | 94 |
|
95 |
theorems ring_mult_ac = mult_assoc mult_commute mult_left_commute |
|
96 |
||
13476
600f1c93124f
mk_left_commute: proper instantiation avoids expensive unification;
wenzelm
parents:
13438
diff
changeset
|
97 |
lemma right_inverse [simp]: "a \<noteq> 0 ==> a * inverse (a::'a::field) = 1" |
10610 | 98 |
proof - |
99 |
have "a * inverse a = inverse a * a" by (simp add: ring_mult_ac) |
|
100 |
also assume "a \<noteq> 0" |
|
11914 | 101 |
hence "inverse a * a = 1" by simp |
10610 | 102 |
finally show ?thesis . |
103 |
qed |
|
10492 | 104 |
|
11914 | 105 |
lemma right_inverse_eq: "b \<noteq> 0 ==> (a / b = 1) = (a = (b::'a::field))" |
13476
600f1c93124f
mk_left_commute: proper instantiation avoids expensive unification;
wenzelm
parents:
13438
diff
changeset
|
106 |
proof |
10620 | 107 |
assume neq: "b \<noteq> 0" |
108 |
{ |
|
109 |
hence "a = (a / b) * b" by (simp add: divide_inverse ring_mult_ac) |
|
11914 | 110 |
also assume "a / b = 1" |
10620 | 111 |
finally show "a = b" by simp |
112 |
next |
|
113 |
assume "a = b" |
|
11914 | 114 |
with neq show "a / b = 1" by (simp add: divide_inverse) |
10620 | 115 |
} |
116 |
qed |
|
10610 | 117 |
|
11914 | 118 |
lemma divide_self [simp]: "a \<noteq> 0 ==> a / (a::'a::field) = 1" |
10620 | 119 |
by (simp add: divide_inverse) |
10610 | 120 |
|
121 |
||
122 |
subsubsection {* Distribution rules *} |
|
123 |
||
124 |
lemma right_distrib: "a * (b + c) = a * b + a * (c::'a::ring)" |
|
125 |
proof - |
|
126 |
have "a * (b + c) = (b + c) * a" by (simp add: ring_mult_ac) |
|
10622 | 127 |
also have "... = b * a + c * a" by (simp only: left_distrib) |
128 |
also have "... = a * b + a * c" by (simp add: ring_mult_ac) |
|
10620 | 129 |
finally show ?thesis . |
10610 | 130 |
qed |
131 |
||
132 |
theorems ring_distrib = right_distrib left_distrib |
|
133 |
||
10484 | 134 |
end |