src/HOL/Ring_and_Field.thy
changeset 23413 5caa2710dd5b
parent 23406 167b53019d6f
child 23477 f4b83f03cac9
equal deleted inserted replaced
23412:aed08cd6adae 23413:5caa2710dd5b
   975   by (simp add: divide_inverse mult_commute)
   975   by (simp add: divide_inverse mult_commute)
   976 
   976 
   977 
   977 
   978 subsection {* Calculations with fractions *}
   978 subsection {* Calculations with fractions *}
   979 
   979 
   980 lemma nonzero_mult_divide_cancel_left:
   980 text{* There is a whole bunch of simp-rules just for class @{text
       
   981 field} but none for class @{text field} and @{text nonzero_divides}
       
   982 because the latter are covered by a simproc. *}
       
   983 
       
   984 lemma nonzero_mult_divide_mult_cancel_left[simp]:
   981   assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" 
   985   assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" 
   982     shows "(c*a)/(c*b) = a/(b::'a::field)"
   986     shows "(c*a)/(c*b) = a/(b::'a::field)"
   983 proof -
   987 proof -
   984   have "(c*a)/(c*b) = c * a * (inverse b * inverse c)"
   988   have "(c*a)/(c*b) = c * a * (inverse b * inverse c)"
   985     by (simp add: field_mult_eq_0_iff divide_inverse 
   989     by (simp add: field_mult_eq_0_iff divide_inverse 
   990     by simp
   994     by simp
   991     finally show ?thesis 
   995     finally show ?thesis 
   992     by (simp add: divide_inverse)
   996     by (simp add: divide_inverse)
   993 qed
   997 qed
   994 
   998 
   995 lemma mult_divide_cancel_left:
   999 lemma mult_divide_mult_cancel_left:
   996      "c\<noteq>0 ==> (c*a) / (c*b) = a / (b::'a::{field,division_by_zero})"
  1000      "c\<noteq>0 ==> (c*a) / (c*b) = a / (b::'a::{field,division_by_zero})"
   997 apply (cases "b = 0")
  1001 apply (cases "b = 0")
   998 apply (simp_all add: nonzero_mult_divide_cancel_left)
  1002 apply (simp_all add: nonzero_mult_divide_mult_cancel_left)
   999 done
  1003 done
  1000 
  1004 
  1001 lemma nonzero_mult_divide_cancel_right:
  1005 lemma nonzero_mult_divide_mult_cancel_right:
  1002      "[|b\<noteq>0; c\<noteq>0|] ==> (a*c) / (b*c) = a/(b::'a::field)"
  1006      "[|b\<noteq>0; c\<noteq>0|] ==> (a*c) / (b*c) = a/(b::'a::field)"
  1003 by (simp add: mult_commute [of _ c] nonzero_mult_divide_cancel_left) 
  1007 by (simp add: mult_commute [of _ c] nonzero_mult_divide_mult_cancel_left) 
  1004 
  1008 
  1005 lemma mult_divide_cancel_right:
  1009 lemma mult_divide_mult_cancel_right:
  1006      "c\<noteq>0 ==> (a*c) / (b*c) = a / (b::'a::{field,division_by_zero})"
  1010      "c\<noteq>0 ==> (a*c) / (b*c) = a / (b::'a::{field,division_by_zero})"
  1007 apply (cases "b = 0")
  1011 apply (cases "b = 0")
  1008 apply (simp_all add: nonzero_mult_divide_cancel_right)
  1012 apply (simp_all add: nonzero_mult_divide_mult_cancel_right)
  1009 done
  1013 done
       
  1014 
  1010 lemma divide_1 [simp]: "a/1 = (a::'a::field)"
  1015 lemma divide_1 [simp]: "a/1 = (a::'a::field)"
  1011   by (simp add: divide_inverse)
  1016   by (simp add: divide_inverse)
  1012 
  1017 
  1013 lemma times_divide_eq_right: "a * (b/c) = (a*b) / (c::'a::field)"
  1018 lemma times_divide_eq_right: "a * (b/c) = (a*b) / (c::'a::field)"
  1014 by (simp add: divide_inverse mult_assoc)
  1019 by (simp add: divide_inverse mult_assoc)
  1030   apply (erule ssubst)
  1035   apply (erule ssubst)
  1031   apply (subgoal_tac "w / z = (w * y) / (y * z)")
  1036   apply (subgoal_tac "w / z = (w * y) / (y * z)")
  1032   apply (erule ssubst)
  1037   apply (erule ssubst)
  1033   apply (rule add_divide_distrib [THEN sym])
  1038   apply (rule add_divide_distrib [THEN sym])
  1034   apply (subst mult_commute)
  1039   apply (subst mult_commute)
  1035   apply (erule nonzero_mult_divide_cancel_left [THEN sym])
  1040   apply (erule nonzero_mult_divide_mult_cancel_left [THEN sym])
  1036   apply assumption
  1041   apply assumption
  1037   apply (erule nonzero_mult_divide_cancel_right [THEN sym])
  1042   apply (erule nonzero_mult_divide_mult_cancel_right [THEN sym])
  1038   apply assumption
  1043   apply assumption
  1039 done
  1044 done
  1040 
  1045 
  1041 
  1046 
  1042 lemma nonzero_mult_divide_cancel_right':
       
  1043   "b \<noteq> 0 \<Longrightarrow> a * b / b = (a::'a::field)"
       
  1044 proof -
       
  1045   assume b: "b \<noteq> 0"
       
  1046   have "a * b / b = a * (b / b)" by (simp add: times_divide_eq_right)
       
  1047   also have "\<dots> = a" by (simp add: divide_self b)
       
  1048   finally show "a * b / b = a" .
       
  1049 qed
       
  1050 
       
  1051 lemma nonzero_mult_divide_cancel_left':
       
  1052   "a \<noteq> 0 \<Longrightarrow> a * b / a = (b::'a::field)"
       
  1053 proof -
       
  1054   assume b: "a \<noteq> 0"
       
  1055   have "a * b / a = b * a / a" by (simp add: mult_commute)
       
  1056   also have "\<dots> = b * (a / a)" by (simp add: times_divide_eq_right)
       
  1057   also have "\<dots> = b" by (simp add: divide_self b)
       
  1058   finally show "a * b / a = b" .
       
  1059 qed
       
  1060 
       
  1061 subsubsection{*Special Cancellation Simprules for Division*}
  1047 subsubsection{*Special Cancellation Simprules for Division*}
  1062 
  1048 
  1063 (* FIXME need not be a simp-rule once "divide_cancel_factor" has been fixed *)
  1049 lemma mult_divide_mult_cancel_left_if[simp]:
  1064 lemma mult_divide_cancel_left_if[simp]:
       
  1065   fixes c :: "'a :: {field,division_by_zero}"
  1050   fixes c :: "'a :: {field,division_by_zero}"
  1066   shows "(c*a) / (c*b) = (if c=0 then 0 else a/b)"
  1051   shows "(c*a) / (c*b) = (if c=0 then 0 else a/b)"
  1067 by (simp add: mult_divide_cancel_left)
  1052 by (simp add: mult_divide_mult_cancel_left)
       
  1053 
       
  1054 lemma nonzero_mult_divide_cancel_right[simp]:
       
  1055   "b \<noteq> 0 \<Longrightarrow> a * b / b = (a::'a::field)"
       
  1056 using nonzero_mult_divide_mult_cancel_right[of 1 b a] by simp
       
  1057 
       
  1058 lemma nonzero_mult_divide_cancel_left[simp]:
       
  1059   "a \<noteq> 0 \<Longrightarrow> a * b / a = (b::'a::field)"
       
  1060 using nonzero_mult_divide_mult_cancel_left[of 1 a b] by simp
       
  1061 
       
  1062 
       
  1063 lemma nonzero_divide_mult_cancel_right[simp]:
       
  1064   "\<lbrakk> a\<noteq>0; b\<noteq>0 \<rbrakk> \<Longrightarrow> b / (a * b) = 1/(a::'a::field)"
       
  1065 using nonzero_mult_divide_mult_cancel_right[of a b 1] by simp
       
  1066 
       
  1067 lemma nonzero_divide_mult_cancel_left[simp]:
       
  1068   "\<lbrakk> a\<noteq>0; b\<noteq>0 \<rbrakk> \<Longrightarrow> a / (a * b) = 1/(b::'a::field)"
       
  1069 using nonzero_mult_divide_mult_cancel_left[of b a 1] by simp
       
  1070 
       
  1071 
       
  1072 lemma nonzero_mult_divide_mult_cancel_left2[simp]:
       
  1073      "[|b\<noteq>0; c\<noteq>0|] ==> (c*a) / (b*c) = a/(b::'a::field)"
       
  1074 using nonzero_mult_divide_mult_cancel_left[of b c a] by(simp add:mult_ac)
       
  1075 
       
  1076 lemma nonzero_mult_divide_mult_cancel_right2[simp]:
       
  1077      "[|b\<noteq>0; c\<noteq>0|] ==> (a*c) / (c*b) = a/(b::'a::field)"
       
  1078 using nonzero_mult_divide_mult_cancel_right[of b c a] by(simp add:mult_ac)
       
  1079 
  1068 
  1080 
  1069 (* Not needed anymore because now subsumed by simproc "divide_cancel_factor"
  1081 (* Not needed anymore because now subsumed by simproc "divide_cancel_factor"
  1070 lemma mult_divide_cancel_right_if:
  1082 lemma mult_divide_cancel_right_if:
  1071   fixes c :: "'a :: {field,division_by_zero}"
  1083   fixes c :: "'a :: {field,division_by_zero}"
  1072   shows "(a*c) / (b*c) = (if c=0 then 0 else a/b)"
  1084   shows "(a*c) / (b*c) = (if c=0 then 0 else a/b)"
  1110 lemma times_divide_self_left [simp]: 
  1122 lemma times_divide_self_left [simp]: 
  1111   fixes a :: "'a :: {field,division_by_zero}"
  1123   fixes a :: "'a :: {field,division_by_zero}"
  1112   shows "(b/a) * a = (if a=0 then 0 else b)"
  1124   shows "(b/a) * a = (if a=0 then 0 else b)"
  1113 by (simp add: times_divide_eq_left)
  1125 by (simp add: times_divide_eq_left)
  1114 *)
  1126 *)
       
  1127 
  1115 
  1128 
  1116 subsection {* Division and Unary Minus *}
  1129 subsection {* Division and Unary Minus *}
  1117 
  1130 
  1118 lemma nonzero_minus_divide_left: "b \<noteq> 0 ==> - (a/b) = (-a) / (b::'a::field)"
  1131 lemma nonzero_minus_divide_left: "b \<noteq> 0 ==> - (a/b) = (-a) / (b::'a::field)"
  1119 by (simp add: divide_inverse minus_mult_left)
  1132 by (simp add: divide_inverse minus_mult_left)