src/HOL/Ring_and_Field.thy
changeset 24748 ee0a0eb6b738
parent 24515 d4dc5dc2db98
child 25062 af5ef0d4d655
equal deleted inserted replaced
24747:6ded9235c2b6 24748:ee0a0eb6b738
   151       by simp
   151       by simp
   152   qed
   152   qed
   153 qed
   153 qed
   154 
   154 
   155 class field = comm_ring_1 + inverse +
   155 class field = comm_ring_1 + inverse +
   156   assumes field_inverse:  "a \<noteq> 0 \<Longrightarrow> inverse a \<^loc>* a = \<^loc>1"
   156   assumes field_inverse:  "a \<noteq> \<^loc>0 \<Longrightarrow> inverse a \<^loc>* a = \<^loc>1"
   157   assumes divide_inverse: "a \<^loc>/ b = a \<^loc>* inverse b"
   157   assumes divide_inverse: "a \<^loc>/ b = a \<^loc>* inverse b"
   158 
   158 
   159 instance field \<subseteq> division_ring
   159 instance field \<subseteq> division_ring
   160 proof
   160 proof
   161   fix a :: 'a
   161   fix a :: 'a
   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