src/HOL/Ring_and_Field.thy
changeset 14365 3d4df8c166ae
parent 14353 79f9fbef9106
child 14368 2763da611ad9
equal deleted inserted replaced
14364:fc62df0bf353 14365:3d4df8c166ae
   206 apply (rule equals_zero_I)
   206 apply (rule equals_zero_I)
   207 apply (simp add: right_distrib [symmetric]) 
   207 apply (simp add: right_distrib [symmetric]) 
   208 done
   208 done
   209 
   209 
   210 lemma minus_mult_minus [simp]: "(- a) * (- b) = a * (b::'a::ring)"
   210 lemma minus_mult_minus [simp]: "(- a) * (- b) = a * (b::'a::ring)"
       
   211   by (simp add: minus_mult_left [symmetric] minus_mult_right [symmetric])
       
   212 
       
   213 lemma minus_mult_commute: "(- a) * b = a * (- b::'a::ring)"
   211   by (simp add: minus_mult_left [symmetric] minus_mult_right [symmetric])
   214   by (simp add: minus_mult_left [symmetric] minus_mult_right [symmetric])
   212 
   215 
   213 lemma right_diff_distrib: "a * (b - c) = a * b - a * (c::'a::ring)"
   216 lemma right_diff_distrib: "a * (b - c) = a * b - a * (c::'a::ring)"
   214 by (simp add: right_distrib diff_minus 
   217 by (simp add: right_distrib diff_minus 
   215               minus_mult_left [symmetric] minus_mult_right [symmetric]) 
   218               minus_mult_left [symmetric] minus_mult_right [symmetric]) 
   886       ==> inverse a + inverse b = (a+b) * inverse a * inverse (b::'a::field)"
   889       ==> inverse a + inverse b = (a+b) * inverse a * inverse (b::'a::field)"
   887 apply (simp add: left_distrib mult_assoc)
   890 apply (simp add: left_distrib mult_assoc)
   888 apply (simp add: mult_commute [of "inverse a"]) 
   891 apply (simp add: mult_commute [of "inverse a"]) 
   889 apply (simp add: mult_assoc [symmetric] add_commute)
   892 apply (simp add: mult_assoc [symmetric] add_commute)
   890 done
   893 done
       
   894 
       
   895 lemma inverse_divide [simp]:
       
   896       "inverse (a/b) = b / (a::'a::{field,division_by_zero})"
       
   897   by (simp add: divide_inverse_zero mult_commute)
   891 
   898 
   892 lemma nonzero_mult_divide_cancel_left:
   899 lemma nonzero_mult_divide_cancel_left:
   893   assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" 
   900   assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" 
   894     shows "(c*a)/(c*b) = a/(b::'a::field)"
   901     shows "(c*a)/(c*b) = a/(b::'a::field)"
   895 proof -
   902 proof -
  1137      "[|a < 0; b < 0|] 
  1144      "[|a < 0; b < 0|] 
  1138       ==> (inverse a \<le> inverse b) = (b \<le> (a::'a::ordered_field))"
  1145       ==> (inverse a \<le> inverse b) = (b \<le> (a::'a::ordered_field))"
  1139 by (blast intro: le_imp_inverse_le_neg dest: inverse_le_imp_le_neg) 
  1146 by (blast intro: le_imp_inverse_le_neg dest: inverse_le_imp_le_neg) 
  1140 
  1147 
  1141 
  1148 
       
  1149 subsection{*Inverses and the Number One*}
       
  1150 
       
  1151 lemma one_less_inverse_iff:
       
  1152     "(1 < inverse x) = (0 < x & x < (1::'a::{ordered_field,division_by_zero}))"proof cases
       
  1153   assume "0 < x"
       
  1154     with inverse_less_iff_less [OF zero_less_one, of x]
       
  1155     show ?thesis by simp
       
  1156 next
       
  1157   assume notless: "~ (0 < x)"
       
  1158   have "~ (1 < inverse x)"
       
  1159   proof
       
  1160     assume "1 < inverse x"
       
  1161     also with notless have "... \<le> 0" by (simp add: linorder_not_less)
       
  1162     also have "... < 1" by (rule zero_less_one) 
       
  1163     finally show False by auto
       
  1164   qed
       
  1165   with notless show ?thesis by simp
       
  1166 qed
       
  1167 
       
  1168 lemma inverse_eq_1_iff [simp]:
       
  1169     "(inverse x = 1) = (x = (1::'a::{field,division_by_zero}))"
       
  1170 by (insert inverse_eq_iff_eq [of x 1], simp) 
       
  1171 
       
  1172 lemma one_le_inverse_iff:
       
  1173    "(1 \<le> inverse x) = (0 < x & x \<le> (1::'a::{ordered_field,division_by_zero}))"
       
  1174 by (force simp add: order_le_less one_less_inverse_iff zero_less_one 
       
  1175                     eq_commute [of 1]) 
       
  1176 
       
  1177 lemma inverse_less_1_iff:
       
  1178    "(inverse x < 1) = (x \<le> 0 | 1 < (x::'a::{ordered_field,division_by_zero}))"
       
  1179 by (simp add: linorder_not_le [symmetric] one_le_inverse_iff) 
       
  1180 
       
  1181 lemma inverse_le_1_iff:
       
  1182    "(inverse x \<le> 1) = (x \<le> 0 | 1 \<le> (x::'a::{ordered_field,division_by_zero}))"
       
  1183 by (simp add: linorder_not_less [symmetric] one_less_inverse_iff) 
       
  1184 
       
  1185 
  1142 subsection{*Division and Signs*}
  1186 subsection{*Division and Signs*}
  1143 
  1187 
  1144 lemma zero_less_divide_iff:
  1188 lemma zero_less_divide_iff:
  1145      "((0::'a::{ordered_field,division_by_zero}) < a/b) = (0 < a & 0 < b | a < 0 & b < 0)"
  1189      "((0::'a::{ordered_field,division_by_zero}) < a/b) = (0 < a & 0 < b | a < 0 & b < 0)"
  1146 by (simp add: divide_inverse_zero zero_less_mult_iff)
  1190 by (simp add: divide_inverse_zero zero_less_mult_iff)
  1410 done
  1454 done
  1411 
  1455 
  1412 
  1456 
  1413 subsection {* Ordered Fields are Dense *}
  1457 subsection {* Ordered Fields are Dense *}
  1414 
  1458 
  1415 lemma zero_less_two: "0 < (1+1::'a::ordered_field)"
  1459 lemma less_add_one: "a < (a+1::'a::ordered_semiring)"
  1416 proof -
  1460 proof -
  1417   have "0 + 0 <  (1+1::'a::ordered_field)"
  1461   have "a+0 < (a+1::'a::ordered_semiring)"
  1418     by (blast intro: zero_less_one add_strict_mono) 
  1462     by (blast intro: zero_less_one add_strict_left_mono) 
  1419   thus ?thesis by simp
  1463   thus ?thesis by simp
  1420 qed
  1464 qed
       
  1465 
       
  1466 lemma zero_less_two: "0 < (1+1::'a::ordered_semiring)"
       
  1467   by (blast intro: order_less_trans zero_less_one less_add_one) 
  1421 
  1468 
  1422 lemma less_half_sum: "a < b ==> a < (a+b) / (1+1::'a::ordered_field)"
  1469 lemma less_half_sum: "a < b ==> a < (a+b) / (1+1::'a::ordered_field)"
  1423 by (simp add: zero_less_two pos_less_divide_eq right_distrib) 
  1470 by (simp add: zero_less_two pos_less_divide_eq right_distrib) 
  1424 
  1471 
  1425 lemma gt_half_sum: "a < b ==> (a+b)/(1+1::'a::ordered_field) < b"
  1472 lemma gt_half_sum: "a < b ==> (a+b)/(1+1::'a::ordered_field) < b"
  1608 val combine_common_factor = thm"combine_common_factor";
  1655 val combine_common_factor = thm"combine_common_factor";
  1609 val minus_add_distrib = thm"minus_add_distrib";
  1656 val minus_add_distrib = thm"minus_add_distrib";
  1610 val minus_mult_left = thm"minus_mult_left";
  1657 val minus_mult_left = thm"minus_mult_left";
  1611 val minus_mult_right = thm"minus_mult_right";
  1658 val minus_mult_right = thm"minus_mult_right";
  1612 val minus_mult_minus = thm"minus_mult_minus";
  1659 val minus_mult_minus = thm"minus_mult_minus";
       
  1660 val minus_mult_commute = thm"minus_mult_commute";
  1613 val right_diff_distrib = thm"right_diff_distrib";
  1661 val right_diff_distrib = thm"right_diff_distrib";
  1614 val left_diff_distrib = thm"left_diff_distrib";
  1662 val left_diff_distrib = thm"left_diff_distrib";
  1615 val minus_diff_eq = thm"minus_diff_eq";
  1663 val minus_diff_eq = thm"minus_diff_eq";
  1616 val add_left_mono = thm"add_left_mono";
  1664 val add_left_mono = thm"add_left_mono";
  1617 val add_right_mono = thm"add_right_mono";
  1665 val add_right_mono = thm"add_right_mono";
  1698 val right_inverse = thm"right_inverse";
  1746 val right_inverse = thm"right_inverse";
  1699 val right_inverse_eq = thm"right_inverse_eq";
  1747 val right_inverse_eq = thm"right_inverse_eq";
  1700 val nonzero_inverse_eq_divide = thm"nonzero_inverse_eq_divide";
  1748 val nonzero_inverse_eq_divide = thm"nonzero_inverse_eq_divide";
  1701 val divide_self = thm"divide_self";
  1749 val divide_self = thm"divide_self";
  1702 val divide_inverse_zero = thm"divide_inverse_zero";
  1750 val divide_inverse_zero = thm"divide_inverse_zero";
       
  1751 val inverse_divide = thm"inverse_divide";
  1703 val divide_zero_left = thm"divide_zero_left";
  1752 val divide_zero_left = thm"divide_zero_left";
  1704 val inverse_eq_divide = thm"inverse_eq_divide";
  1753 val inverse_eq_divide = thm"inverse_eq_divide";
  1705 val nonzero_add_divide_distrib = thm"nonzero_add_divide_distrib";
  1754 val nonzero_add_divide_distrib = thm"nonzero_add_divide_distrib";
  1706 val add_divide_distrib = thm"add_divide_distrib";
  1755 val add_divide_distrib = thm"add_divide_distrib";
  1707 val field_mult_eq_0_iff = thm"field_mult_eq_0_iff";
  1756 val field_mult_eq_0_iff = thm"field_mult_eq_0_iff";