src/HOL/Ring_and_Field.thy
changeset 25152 bfde2f8c0f63
parent 25078 a1ddc5206cb1
child 25186 f4d1ebffd025
equal deleted inserted replaced
25151:9374a0df240c 25152:bfde2f8c0f63
    24 *}
    24 *}
    25 
    25 
    26 class semiring = ab_semigroup_add + semigroup_mult +
    26 class semiring = ab_semigroup_add + semigroup_mult +
    27   assumes left_distrib: "(a + b) * c = a * c + b * c"
    27   assumes left_distrib: "(a + b) * c = a * c + b * c"
    28   assumes right_distrib: "a * (b + c) = a * b + a * c"
    28   assumes right_distrib: "a * (b + c) = a * b + a * c"
       
    29 begin
       
    30 
       
    31 text{*For the @{text combine_numerals} simproc*}
       
    32 lemma combine_common_factor:
       
    33   "a * e + (b * e + c) = (a + b) * e + c"
       
    34   by (simp add: left_distrib add_ac)
       
    35 
       
    36 end
    29 
    37 
    30 class mult_zero = times + zero +
    38 class mult_zero = times + zero +
    31   assumes mult_zero_left [simp]: "0 * a = 0"
    39   assumes mult_zero_left [simp]: "0 * a = 0"
    32   assumes mult_zero_right [simp]: "a * 0 = 0"
    40   assumes mult_zero_right [simp]: "a * 0 = 0"
    33 
    41 
    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 
   150     finally show False
   242     finally show False
   151       by simp
   243       by simp
   152   qed
   244   qed
   153 qed
   245 qed
   154 
   246 
       
   247 interpretation division_ring \<subseteq> ring_1_no_zero_divisors
       
   248 proof unfold_locales
       
   249   fix a b :: 'a
       
   250   assume a: "a \<noteq> zero" and b: "b \<noteq> zero"
       
   251   show "times a b \<noteq> zero"
       
   252   proof
       
   253     assume ab: "times a b = zero"
       
   254     hence "zero = times (times (inverse a) (times a b)) (inverse b)"
       
   255       by simp
       
   256     also have "\<dots> = times (times (inverse a) a) (times b (inverse b))"
       
   257       by (simp only: mult_assoc)
       
   258     also have "\<dots> = one"
       
   259       using a b by simp
       
   260     finally show False
       
   261       by simp
       
   262   qed
       
   263 qed
       
   264 
   155 class field = comm_ring_1 + inverse +
   265 class field = comm_ring_1 + inverse +
   156   assumes field_inverse:  "a \<noteq> 0 \<Longrightarrow> inverse a * a = 1"
   266   assumes field_inverse:  "a \<noteq> 0 \<Longrightarrow> inverse a * a = 1"
   157   assumes divide_inverse: "a / b = a * inverse b"
   267   assumes divide_inverse: "a / b = a * inverse b"
   158 
   268 
   159 instance field \<subseteq> division_ring
   269 instance field \<subseteq> division_ring
   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 
   219 class pordered_cancel_semiring = mult_mono + pordered_ab_semigroup_add
   296 class pordered_cancel_semiring = mult_mono + pordered_ab_semigroup_add
   220   + semiring + comm_monoid_add + cancel_ab_semigroup_add
   297   + semiring + comm_monoid_add + cancel_ab_semigroup_add
   221 
   298 
   222 instance pordered_cancel_semiring \<subseteq> semiring_0_cancel ..
   299 instance pordered_cancel_semiring \<subseteq> semiring_0_cancel ..
   223 
   300 
   224 instance pordered_cancel_semiring \<subseteq> pordered_semiring .. 
   301 interpretation pordered_cancel_semiring \<subseteq> semiring_0_cancel by unfold_locales
       
   302 
       
   303 subclass (in pordered_cancel_semiring) pordered_semiring by unfold_locales
   225 
   304 
   226 class ordered_semiring = semiring + comm_monoid_add + ordered_cancel_ab_semigroup_add + mult_mono
   305 class ordered_semiring = semiring + comm_monoid_add + ordered_cancel_ab_semigroup_add + mult_mono
   227 
   306 
   228 instance ordered_semiring \<subseteq> pordered_cancel_semiring ..
   307 instance ordered_semiring \<subseteq> pordered_cancel_semiring ..
       
   308 
       
   309 interpretation ordered_semiring \<subseteq> pordered_cancel_semiring by unfold_locales
   229 
   310 
   230 class ordered_semiring_strict = semiring + comm_monoid_add + ordered_cancel_ab_semigroup_add +
   311 class ordered_semiring_strict = semiring + comm_monoid_add + ordered_cancel_ab_semigroup_add +
   231   assumes mult_strict_left_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b"
   312   assumes mult_strict_left_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b"
   232   assumes mult_strict_right_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> a * c < b * c"
   313   assumes mult_strict_right_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> a * c < b * c"
   233 
   314 
   234 instance ordered_semiring_strict \<subseteq> semiring_0_cancel ..
   315 instance ordered_semiring_strict \<subseteq> semiring_0_cancel ..
       
   316 
       
   317 interpretation ordered_semiring_strict \<subseteq> semiring_0_cancel by unfold_locales
   235 
   318 
   236 instance ordered_semiring_strict \<subseteq> ordered_semiring
   319 instance ordered_semiring_strict \<subseteq> ordered_semiring
   237 proof
   320 proof
   238   fix a b c :: 'a
   321   fix a b c :: 'a
   239   assume A: "a \<le> b" "0 \<le> c"
   322   assume A: "a \<le> b" "0 \<le> c"
   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