src/HOL/Ring_and_Field.thy
changeset 22987 550709aa8e66
parent 22842 6d2fd4e0f984
child 22990 775e9de3db48
equal deleted inserted replaced
22986:d21d3539f6bb 22987:550709aa8e66
   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