126 |
126 |
127 class division_ring = ring_1 + inverse + |
127 class division_ring = ring_1 + inverse + |
128 assumes left_inverse [simp]: "a \<noteq> \<^loc>0 \<Longrightarrow> inverse a \<^loc>* a = \<^loc>1" |
128 assumes left_inverse [simp]: "a \<noteq> \<^loc>0 \<Longrightarrow> inverse a \<^loc>* a = \<^loc>1" |
129 assumes right_inverse [simp]: "a \<noteq> \<^loc>0 \<Longrightarrow> a \<^loc>* inverse a = \<^loc>1" |
129 assumes right_inverse [simp]: "a \<noteq> \<^loc>0 \<Longrightarrow> a \<^loc>* inverse a = \<^loc>1" |
130 |
130 |
|
131 instance division_ring \<subseteq> no_zero_divisors |
|
132 proof |
|
133 fix a b :: 'a |
|
134 assume a: "a \<noteq> 0" and b: "b \<noteq> 0" |
|
135 show "a * b \<noteq> 0" |
|
136 proof |
|
137 assume ab: "a * b = 0" |
|
138 hence "0 = inverse a * (a * b) * inverse b" |
|
139 by simp |
|
140 also have "\<dots> = (inverse a * a) * (b * inverse b)" |
|
141 by (simp only: mult_assoc) |
|
142 also have "\<dots> = 1" |
|
143 using a b by simp |
|
144 finally show False |
|
145 by simp |
|
146 qed |
|
147 qed |
|
148 |
131 class field = comm_ring_1 + inverse + |
149 class field = comm_ring_1 + inverse + |
132 assumes field_left_inverse: "a \<noteq> 0 \<Longrightarrow> inverse a \<^loc>* a = \<^loc>1" |
150 assumes field_inverse: "a \<noteq> 0 \<Longrightarrow> inverse a \<^loc>* a = \<^loc>1" |
133 assumes divide_inverse: "a \<^loc>/ b = a \<^loc>* inverse b" |
151 assumes divide_inverse: "a \<^loc>/ b = a \<^loc>* inverse b" |
134 |
|
135 lemma field_right_inverse: |
|
136 assumes not0: "a \<noteq> 0" |
|
137 shows "a * inverse (a::'a::field) = 1" |
|
138 proof - |
|
139 have "a * inverse a = inverse a * a" by (rule mult_commute) |
|
140 also have "... = 1" using not0 by (rule field_left_inverse) |
|
141 finally show ?thesis . |
|
142 qed |
|
143 |
152 |
144 instance field \<subseteq> division_ring |
153 instance field \<subseteq> division_ring |
145 by (intro_classes, erule field_left_inverse, erule field_right_inverse) |
154 proof |
146 |
155 fix a :: 'a |
147 lemma field_mult_eq_0_iff [simp]: |
156 assume "a \<noteq> 0" |
148 "(a*b = (0::'a::division_ring)) = (a = 0 | b = 0)" |
157 thus "inverse a * a = 1" by (rule field_inverse) |
149 proof cases |
158 thus "a * inverse a = 1" by (simp only: mult_commute) |
150 assume "a=0" thus ?thesis by simp |
159 qed |
151 next |
160 |
152 assume anz [simp]: "a\<noteq>0" |
161 instance field \<subseteq> idom .. |
153 { assume "a * b = 0" |
|
154 hence "inverse a * (a * b) = 0" by simp |
|
155 hence "b = 0" by (simp (no_asm_use) add: mult_assoc [symmetric])} |
|
156 thus ?thesis by force |
|
157 qed |
|
158 |
|
159 instance field \<subseteq> idom |
|
160 by (intro_classes, simp) |
|
161 |
162 |
162 class division_by_zero = zero + inverse + |
163 class division_by_zero = zero + inverse + |
163 assumes inverse_zero [simp]: "inverse \<^loc>0 = \<^loc>0" |
164 assumes inverse_zero [simp]: "inverse \<^loc>0 = \<^loc>0" |
164 |
165 |
165 subsection {* Distribution rules *} |
166 subsection {* Distribution rules *} |
200 assumes mult_right_mono: "a \<sqsubseteq> b \<Longrightarrow> \<^loc>0 \<sqsubseteq> c \<Longrightarrow> a \<^loc>* c \<sqsubseteq> b \<^loc>* c" |
201 assumes mult_right_mono: "a \<sqsubseteq> b \<Longrightarrow> \<^loc>0 \<sqsubseteq> c \<Longrightarrow> a \<^loc>* c \<sqsubseteq> b \<^loc>* c" |
201 |
202 |
202 class pordered_semiring = mult_mono + semiring_0 + pordered_ab_semigroup_add |
203 class pordered_semiring = mult_mono + semiring_0 + pordered_ab_semigroup_add |
203 |
204 |
204 class pordered_cancel_semiring = mult_mono + pordered_ab_semigroup_add |
205 class pordered_cancel_semiring = mult_mono + pordered_ab_semigroup_add |
205 + semiring + comm_monoid_add + pordered_ab_semigroup_add |
206 + semiring + comm_monoid_add + cancel_ab_semigroup_add |
206 + cancel_ab_semigroup_add |
|
207 |
207 |
208 instance pordered_cancel_semiring \<subseteq> semiring_0_cancel .. |
208 instance pordered_cancel_semiring \<subseteq> semiring_0_cancel .. |
209 |
209 |
210 instance pordered_cancel_semiring \<subseteq> pordered_semiring .. |
210 instance pordered_cancel_semiring \<subseteq> pordered_semiring .. |
211 |
211 |