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) |