209 (by ordered rewriting). As a result it decides ring equalities but |
209 (by ordered rewriting). As a result it decides ring equalities but |
210 also helps with inequalities. *} |
210 also helps with inequalities. *} |
211 lemmas ring_simps = group_simps ring_distribs |
211 lemmas ring_simps = group_simps ring_distribs |
212 |
212 |
213 class mult_mono = times + zero + ord + |
213 class mult_mono = times + zero + ord + |
214 assumes mult_left_mono: "a \<sqsubseteq> b \<Longrightarrow> \<^loc>0 \<sqsubseteq> c \<Longrightarrow> c \<^loc>* a \<sqsubseteq> c \<^loc>* b" |
214 assumes mult_left_mono: "a \<^loc>\<le> b \<Longrightarrow> \<^loc>0 \<^loc>\<le> c \<Longrightarrow> c \<^loc>* a \<^loc>\<le> c \<^loc>* b" |
215 assumes mult_right_mono: "a \<sqsubseteq> b \<Longrightarrow> \<^loc>0 \<sqsubseteq> c \<Longrightarrow> a \<^loc>* c \<sqsubseteq> b \<^loc>* c" |
215 assumes mult_right_mono: "a \<^loc>\<le> b \<Longrightarrow> \<^loc>0 \<^loc>\<le> c \<Longrightarrow> a \<^loc>* c \<^loc>\<le> b \<^loc>* c" |
216 |
216 |
217 class pordered_semiring = mult_mono + semiring_0 + pordered_ab_semigroup_add |
217 class pordered_semiring = mult_mono + semiring_0 + pordered_ab_semigroup_add |
218 |
218 |
219 class pordered_cancel_semiring = mult_mono + pordered_ab_semigroup_add |
219 class pordered_cancel_semiring = mult_mono + pordered_ab_semigroup_add |
220 + semiring + comm_monoid_add + cancel_ab_semigroup_add |
220 + semiring + comm_monoid_add + cancel_ab_semigroup_add |
226 class ordered_semiring = semiring + comm_monoid_add + ordered_cancel_ab_semigroup_add + mult_mono |
226 class ordered_semiring = semiring + comm_monoid_add + ordered_cancel_ab_semigroup_add + mult_mono |
227 |
227 |
228 instance ordered_semiring \<subseteq> pordered_cancel_semiring .. |
228 instance ordered_semiring \<subseteq> pordered_cancel_semiring .. |
229 |
229 |
230 class ordered_semiring_strict = semiring + comm_monoid_add + ordered_cancel_ab_semigroup_add + |
230 class ordered_semiring_strict = semiring + comm_monoid_add + ordered_cancel_ab_semigroup_add + |
231 assumes mult_strict_left_mono: "a \<sqsubset> b \<Longrightarrow> \<^loc>0 \<sqsubset> c \<Longrightarrow> c \<^loc>* a \<sqsubset> c \<^loc>* b" |
231 assumes mult_strict_left_mono: "a \<^loc>< b \<Longrightarrow> \<^loc>0 \<^loc>< c \<Longrightarrow> c \<^loc>* a \<^loc>< c \<^loc>* b" |
232 assumes mult_strict_right_mono: "a \<sqsubset> b \<Longrightarrow> \<^loc>0 \<sqsubset> c \<Longrightarrow> a \<^loc>* c \<sqsubset> b \<^loc>* c" |
232 assumes mult_strict_right_mono: "a \<^loc>< b \<Longrightarrow> \<^loc>0 \<^loc>< c \<Longrightarrow> a \<^loc>* c \<^loc>< b \<^loc>* c" |
233 |
233 |
234 instance ordered_semiring_strict \<subseteq> semiring_0_cancel .. |
234 instance ordered_semiring_strict \<subseteq> semiring_0_cancel .. |
235 |
235 |
236 instance ordered_semiring_strict \<subseteq> ordered_semiring |
236 instance ordered_semiring_strict \<subseteq> ordered_semiring |
237 proof |
237 proof |
244 unfolding order_le_less |
244 unfolding order_le_less |
245 using mult_strict_right_mono by auto |
245 using mult_strict_right_mono by auto |
246 qed |
246 qed |
247 |
247 |
248 class mult_mono1 = times + zero + ord + |
248 class mult_mono1 = times + zero + ord + |
249 assumes mult_mono: "a \<sqsubseteq> b \<Longrightarrow> \<^loc>0 \<sqsubseteq> c \<Longrightarrow> c \<^loc>* a \<sqsubseteq> c \<^loc>* b" |
249 assumes mult_mono: "a \<^loc>\<le> b \<Longrightarrow> \<^loc>0 \<^loc>\<le> c \<Longrightarrow> c \<^loc>* a \<^loc>\<le> c \<^loc>* b" |
250 |
250 |
251 class pordered_comm_semiring = comm_semiring_0 |
251 class pordered_comm_semiring = comm_semiring_0 |
252 + pordered_ab_semigroup_add + mult_mono1 |
252 + pordered_ab_semigroup_add + mult_mono1 |
253 |
253 |
254 class pordered_cancel_comm_semiring = comm_semiring_0_cancel |
254 class pordered_cancel_comm_semiring = comm_semiring_0_cancel |
255 + pordered_ab_semigroup_add + mult_mono1 |
255 + pordered_ab_semigroup_add + mult_mono1 |
256 |
256 |
257 instance pordered_cancel_comm_semiring \<subseteq> pordered_comm_semiring .. |
257 instance pordered_cancel_comm_semiring \<subseteq> pordered_comm_semiring .. |
258 |
258 |
259 class ordered_comm_semiring_strict = comm_semiring_0 + ordered_cancel_ab_semigroup_add + |
259 class ordered_comm_semiring_strict = comm_semiring_0 + ordered_cancel_ab_semigroup_add + |
260 assumes mult_strict_mono: "a \<sqsubset> b \<Longrightarrow> \<^loc>0 \<sqsubset> c \<Longrightarrow> c \<^loc>* a \<sqsubset> c \<^loc>* b" |
260 assumes mult_strict_mono: "a \<^loc>< b \<Longrightarrow> \<^loc>0 \<^loc>< c \<Longrightarrow> c \<^loc>* a \<^loc>< c \<^loc>* b" |
261 |
261 |
262 instance pordered_comm_semiring \<subseteq> pordered_semiring |
262 instance pordered_comm_semiring \<subseteq> pordered_semiring |
263 proof |
263 proof |
264 fix a b c :: 'a |
264 fix a b c :: 'a |
265 assume "a \<le> b" "0 \<le> c" |
265 assume "a \<le> b" "0 \<le> c" |
295 instance lordered_ring \<subseteq> lordered_ab_group_meet .. |
295 instance lordered_ring \<subseteq> lordered_ab_group_meet .. |
296 |
296 |
297 instance lordered_ring \<subseteq> lordered_ab_group_join .. |
297 instance lordered_ring \<subseteq> lordered_ab_group_join .. |
298 |
298 |
299 class abs_if = minus + ord + zero + abs + |
299 class abs_if = minus + ord + zero + abs + |
300 assumes abs_if: "abs a = (if a \<sqsubset> 0 then (uminus a) else a)" |
300 assumes abs_if: "abs a = (if a \<^loc>< \<^loc>0 then (uminus a) else a)" |
301 |
301 |
302 class sgn_if = sgn + zero + one + minus + ord + |
302 class sgn_if = sgn + zero + one + minus + ord + |
303 assumes sgn_if: "sgn x = (if x = 0 then 0 else if 0 \<sqsubset> x then 1 else uminus 1)" |
303 assumes sgn_if: "sgn x = (if x = \<^loc>0 then \<^loc>0 else if \<^loc>0 \<^loc>< x then \<^loc>1 else uminus \<^loc>1)" |
304 |
304 |
305 (* The "strict" suffix can be seen as describing the combination of ordered_ring and no_zero_divisors. |
305 (* The "strict" suffix can be seen as describing the combination of ordered_ring and no_zero_divisors. |
306 Basically, ordered_ring + no_zero_divisors = ordered_ring_strict. |
306 Basically, ordered_ring + no_zero_divisors = ordered_ring_strict. |
307 *) |
307 *) |
308 class ordered_ring = ring + ordered_semiring + lordered_ab_group + abs_if |
308 class ordered_ring = ring + ordered_semiring + lordered_ab_group + abs_if |
325 |
325 |
326 instance pordered_comm_ring \<subseteq> pordered_cancel_comm_semiring .. |
326 instance pordered_comm_ring \<subseteq> pordered_cancel_comm_semiring .. |
327 |
327 |
328 class ordered_semidom = comm_semiring_1_cancel + ordered_comm_semiring_strict + |
328 class ordered_semidom = comm_semiring_1_cancel + ordered_comm_semiring_strict + |
329 (*previously ordered_semiring*) |
329 (*previously ordered_semiring*) |
330 assumes zero_less_one [simp]: "\<^loc>0 \<sqsubset> \<^loc>1" |
330 assumes zero_less_one [simp]: "\<^loc>0 \<^loc>< \<^loc>1" |
331 |
331 |
332 lemma pos_add_strict: |
332 lemma pos_add_strict: |
333 fixes a b c :: "'a\<Colon>ordered_semidom" |
333 fixes a b c :: "'a\<Colon>ordered_semidom" |
334 shows "0 < a \<Longrightarrow> b < c \<Longrightarrow> b < a + c" |
334 shows "0 < a \<Longrightarrow> b < c \<Longrightarrow> b < a + c" |
335 using add_strict_mono [of 0 a b c] by simp |
335 using add_strict_mono [of 0 a b c] by simp |