src/HOL/Ring_and_Field.thy
changeset 16775 c1b87ef4a1c3
parent 16568 e02fe7ae212b
child 17085 5b57f995a179
equal deleted inserted replaced
16774:515b6020cf5d 16775:c1b87ef4a1c3
     1 (*  Title:   HOL/Ring_and_Field.thy
     1 (*  Title:   HOL/Ring_and_Field.thy
     2     ID:      $Id$
     2     ID:      $Id$
     3     Author:  Gertrud Bauer, Steven Obua, Lawrence C Paulson and Markus Wenzel
     3     Author:  Gertrud Bauer, Steven Obua, Lawrence C Paulson, and Markus Wenzel,
       
     4              with contributions by Jeremy Avigad
     4 *)
     5 *)
     5 
     6 
     6 header {* (Ordered) Rings and Fields *}
     7 header {* (Ordered) Rings and Fields *}
     7 
     8 
     8 theory Ring_and_Field
     9 theory Ring_and_Field
   328 apply (simp_all add: minus_mult_right [symmetric]) 
   329 apply (simp_all add: minus_mult_right [symmetric]) 
   329 done
   330 done
   330 
   331 
   331 subsection{* Products of Signs *}
   332 subsection{* Products of Signs *}
   332 
   333 
   333 lemma mult_pos: "[| (0::'a::ordered_semiring_strict) < a; 0 < b |] ==> 0 < a*b"
   334 lemma mult_pos_pos: "[| (0::'a::ordered_semiring_strict) < a; 0 < b |] ==> 0 < a*b"
   334 by (drule mult_strict_left_mono [of 0 b], auto)
   335 by (drule mult_strict_left_mono [of 0 b], auto)
   335 
   336 
   336 lemma mult_pos_le: "[| (0::'a::pordered_cancel_semiring) \<le> a; 0 \<le> b |] ==> 0 \<le> a*b"
   337 lemma mult_nonneg_nonneg: "[| (0::'a::pordered_cancel_semiring) \<le> a; 0 \<le> b |] ==> 0 \<le> a*b"
   337 by (drule mult_left_mono [of 0 b], auto)
   338 by (drule mult_left_mono [of 0 b], auto)
   338 
   339 
   339 lemma mult_pos_neg: "[| (0::'a::ordered_semiring_strict) < a; b < 0 |] ==> a*b < 0"
   340 lemma mult_pos_neg: "[| (0::'a::ordered_semiring_strict) < a; b < 0 |] ==> a*b < 0"
   340 by (drule mult_strict_left_mono [of b 0], auto)
   341 by (drule mult_strict_left_mono [of b 0], auto)
   341 
   342 
   342 lemma mult_pos_neg_le: "[| (0::'a::pordered_cancel_semiring) \<le> a; b \<le> 0 |] ==> a*b \<le> 0"
   343 lemma mult_nonneg_nonpos: "[| (0::'a::pordered_cancel_semiring) \<le> a; b \<le> 0 |] ==> a*b \<le> 0"
   343 by (drule mult_left_mono [of b 0], auto)
   344 by (drule mult_left_mono [of b 0], auto)
   344 
   345 
   345 lemma mult_pos_neg2: "[| (0::'a::ordered_semiring_strict) < a; b < 0 |] ==> b*a < 0" 
   346 lemma mult_pos_neg2: "[| (0::'a::ordered_semiring_strict) < a; b < 0 |] ==> b*a < 0" 
   346 by (drule mult_strict_right_mono[of b 0], auto)
   347 by (drule mult_strict_right_mono[of b 0], auto)
   347 
   348 
   348 lemma mult_pos_neg2_le: "[| (0::'a::pordered_cancel_semiring) \<le> a; b \<le> 0 |] ==> b*a \<le> 0" 
   349 lemma mult_nonneg_nonpos2: "[| (0::'a::pordered_cancel_semiring) \<le> a; b \<le> 0 |] ==> b*a \<le> 0" 
   349 by (drule mult_right_mono[of b 0], auto)
   350 by (drule mult_right_mono[of b 0], auto)
   350 
   351 
   351 lemma mult_neg: "[| a < (0::'a::ordered_ring_strict); b < 0 |] ==> 0 < a*b"
   352 lemma mult_neg_neg: "[| a < (0::'a::ordered_ring_strict); b < 0 |] ==> 0 < a*b"
   352 by (drule mult_strict_right_mono_neg, auto)
   353 by (drule mult_strict_right_mono_neg, auto)
   353 
   354 
   354 lemma mult_neg_le: "[| a \<le> (0::'a::pordered_ring); b \<le> 0 |] ==> 0 \<le> a*b"
   355 lemma mult_nonpos_nonpos: "[| a \<le> (0::'a::pordered_ring); b \<le> 0 |] ==> 0 \<le> a*b"
   355 by (drule mult_right_mono_neg[of a 0 b ], auto)
   356 by (drule mult_right_mono_neg[of a 0 b ], auto)
   356 
   357 
   357 lemma zero_less_mult_pos:
   358 lemma zero_less_mult_pos:
   358      "[| 0 < a*b; 0 < a|] ==> 0 < (b::'a::ordered_semiring_strict)"
   359      "[| 0 < a*b; 0 < a|] ==> 0 < (b::'a::ordered_semiring_strict)"
   359 apply (case_tac "b\<le>0") 
   360 apply (case_tac "b\<le>0") 
   370  apply (auto dest: order_less_not_sym)
   371  apply (auto dest: order_less_not_sym)
   371 done
   372 done
   372 
   373 
   373 lemma zero_less_mult_iff:
   374 lemma zero_less_mult_iff:
   374      "((0::'a::ordered_ring_strict) < a*b) = (0 < a & 0 < b | a < 0 & b < 0)"
   375      "((0::'a::ordered_ring_strict) < a*b) = (0 < a & 0 < b | a < 0 & b < 0)"
   375 apply (auto simp add: order_le_less linorder_not_less mult_pos mult_neg)
   376 apply (auto simp add: order_le_less linorder_not_less mult_pos_pos 
       
   377   mult_neg_neg)
   376 apply (blast dest: zero_less_mult_pos) 
   378 apply (blast dest: zero_less_mult_pos) 
   377 apply (blast dest: zero_less_mult_pos2)
   379 apply (blast dest: zero_less_mult_pos2)
   378 done
   380 done
   379 
   381 
   380 text{*A field has no "zero divisors", and this theorem holds without the
   382 text{*A field has no "zero divisors", and this theorem holds without the
   401 apply (insert zero_le_mult_iff [of "-a" b]) 
   403 apply (insert zero_le_mult_iff [of "-a" b]) 
   402 apply (force simp add: minus_mult_left[symmetric]) 
   404 apply (force simp add: minus_mult_left[symmetric]) 
   403 done
   405 done
   404 
   406 
   405 lemma split_mult_pos_le: "(0 \<le> a & 0 \<le> b) | (a \<le> 0 & b \<le> 0) \<Longrightarrow> 0 \<le> a * (b::_::pordered_ring)"
   407 lemma split_mult_pos_le: "(0 \<le> a & 0 \<le> b) | (a \<le> 0 & b \<le> 0) \<Longrightarrow> 0 \<le> a * (b::_::pordered_ring)"
   406 by (auto simp add: mult_pos_le mult_neg_le)
   408 by (auto simp add: mult_nonneg_nonneg mult_nonpos_nonpos)
   407 
   409 
   408 lemma split_mult_neg_le: "(0 \<le> a & b \<le> 0) | (a \<le> 0 & 0 \<le> b) \<Longrightarrow> a * b \<le> (0::_::pordered_cancel_semiring)" 
   410 lemma split_mult_neg_le: "(0 \<le> a & b \<le> 0) | (a \<le> 0 & 0 \<le> b) \<Longrightarrow> a * b \<le> (0::_::pordered_cancel_semiring)" 
   409 by (auto simp add: mult_pos_neg_le mult_pos_neg2_le)
   411 by (auto simp add: mult_nonneg_nonpos mult_nonneg_nonpos2)
   410 
   412 
   411 lemma zero_le_square: "(0::'a::ordered_ring_strict) \<le> a*a"
   413 lemma zero_le_square: "(0::'a::ordered_ring_strict) \<le> a*a"
   412 by (simp add: zero_le_mult_iff linorder_linear) 
   414 by (simp add: zero_le_mult_iff linorder_linear) 
   413 
   415 
   414 text{*Proving axiom @{text zero_less_one} makes all @{text ordered_semidom}
   416 text{*Proving axiom @{text zero_less_one} makes all @{text ordered_semidom}
   442 
   444 
   443 text{*Strict monotonicity in both arguments*}
   445 text{*Strict monotonicity in both arguments*}
   444 lemma mult_strict_mono:
   446 lemma mult_strict_mono:
   445      "[|a<b; c<d; 0<b; 0\<le>c|] ==> a * c < b * (d::'a::ordered_semiring_strict)"
   447      "[|a<b; c<d; 0<b; 0\<le>c|] ==> a * c < b * (d::'a::ordered_semiring_strict)"
   446 apply (case_tac "c=0")
   448 apply (case_tac "c=0")
   447  apply (simp add: mult_pos) 
   449  apply (simp add: mult_pos_pos) 
   448 apply (erule mult_strict_right_mono [THEN order_less_trans])
   450 apply (erule mult_strict_right_mono [THEN order_less_trans])
   449  apply (force simp add: order_le_less) 
   451  apply (force simp add: order_le_less) 
   450 apply (erule mult_strict_left_mono, assumption)
   452 apply (erule mult_strict_left_mono, assumption)
   451 done
   453 done
   452 
   454 
   465 done
   467 done
   466 
   468 
   467 lemma less_1_mult: "[| 1 < m; 1 < n |] ==> 1 < m*(n::'a::ordered_semidom)"
   469 lemma less_1_mult: "[| 1 < m; 1 < n |] ==> 1 < m*(n::'a::ordered_semidom)"
   468 apply (insert mult_strict_mono [of 1 m 1 n]) 
   470 apply (insert mult_strict_mono [of 1 m 1 n]) 
   469 apply (simp add:  order_less_trans [OF zero_less_one]) 
   471 apply (simp add:  order_less_trans [OF zero_less_one]) 
       
   472 done
       
   473 
       
   474 lemma mult_less_le_imp_less: "(a::'a::ordered_semiring_strict) < b ==>
       
   475     c <= d ==> 0 <= a ==> 0 < c ==> a * c < b * d"
       
   476   apply (subgoal_tac "a * c < b * c")
       
   477   apply (erule order_less_le_trans)
       
   478   apply (erule mult_left_mono)
       
   479   apply simp
       
   480   apply (erule mult_strict_right_mono)
       
   481   apply assumption
       
   482 done
       
   483 
       
   484 lemma mult_le_less_imp_less: "(a::'a::ordered_semiring_strict) <= b ==>
       
   485     c < d ==> 0 < a ==> 0 <= c ==> a * c < b * d"
       
   486   apply (subgoal_tac "a * c <= b * c")
       
   487   apply (erule order_le_less_trans)
       
   488   apply (erule mult_strict_left_mono)
       
   489   apply simp
       
   490   apply (erule mult_right_mono)
       
   491   apply simp
   470 done
   492 done
   471 
   493 
   472 subsection{*Cancellation Laws for Relationships With a Common Factor*}
   494 subsection{*Cancellation Laws for Relationships With a Common Factor*}
   473 
   495 
   474 text{*Cancellation laws for @{term "c*a < c*b"} and @{term "a*c < b*c"},
   496 text{*Cancellation laws for @{term "c*a < c*b"} and @{term "a*c < b*c"},
   772   thus ?thesis 
   794   thus ?thesis 
   773     by (simp only: field_mult_cancel_left, simp)
   795     by (simp only: field_mult_cancel_left, simp)
   774 qed
   796 qed
   775 
   797 
   776 lemma inverse_minus_eq [simp]:
   798 lemma inverse_minus_eq [simp]:
   777    "inverse(-a) = -inverse(a::'a::{field,division_by_zero})";
   799    "inverse(-a) = -inverse(a::'a::{field,division_by_zero})"
   778 proof cases
   800 proof cases
   779   assume "a=0" thus ?thesis by (simp add: inverse_zero)
   801   assume "a=0" thus ?thesis by (simp add: inverse_zero)
   780 next
   802 next
   781   assume "a\<noteq>0" 
   803   assume "a\<noteq>0" 
   782   thus ?thesis by (simp add: nonzero_inverse_minus_eq)
   804   thus ?thesis by (simp add: nonzero_inverse_minus_eq)
   880 
   902 
   881 lemma inverse_divide [simp]:
   903 lemma inverse_divide [simp]:
   882       "inverse (a/b) = b / (a::'a::{field,division_by_zero})"
   904       "inverse (a/b) = b / (a::'a::{field,division_by_zero})"
   883   by (simp add: divide_inverse mult_commute)
   905   by (simp add: divide_inverse mult_commute)
   884 
   906 
       
   907 subsection {* Calculations with fractions *}
       
   908 
   885 lemma nonzero_mult_divide_cancel_left:
   909 lemma nonzero_mult_divide_cancel_left:
   886   assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" 
   910   assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" 
   887     shows "(c*a)/(c*b) = a/(b::'a::field)"
   911     shows "(c*a)/(c*b) = a/(b::'a::field)"
   888 proof -
   912 proof -
   889   have "(c*a)/(c*b) = c * a * (inverse b * inverse c)"
   913   have "(c*a)/(c*b) = c * a * (inverse b * inverse c)"
   934 
   958 
   935 lemma divide_divide_eq_left [simp]:
   959 lemma divide_divide_eq_left [simp]:
   936      "(a / b) / (c::'a::{field,division_by_zero}) = a / (b*c)"
   960      "(a / b) / (c::'a::{field,division_by_zero}) = a / (b*c)"
   937 by (simp add: divide_inverse mult_assoc)
   961 by (simp add: divide_inverse mult_assoc)
   938 
   962 
       
   963 lemma add_frac_eq: "(y::'a::field) ~= 0 ==> z ~= 0 ==>
       
   964     x / y + w / z = (x * z + w * y) / (y * z)"
       
   965   apply (subgoal_tac "x / y = (x * z) / (y * z)")
       
   966   apply (erule ssubst)
       
   967   apply (subgoal_tac "w / z = (w * y) / (y * z)")
       
   968   apply (erule ssubst)
       
   969   apply (rule add_divide_distrib [THEN sym])
       
   970   apply (subst mult_commute)
       
   971   apply (erule nonzero_mult_divide_cancel_left [THEN sym])
       
   972   apply assumption
       
   973   apply (erule nonzero_mult_divide_cancel_right [THEN sym])
       
   974   apply assumption
       
   975 done
   939 
   976 
   940 subsubsection{*Special Cancellation Simprules for Division*}
   977 subsubsection{*Special Cancellation Simprules for Division*}
   941 
   978 
   942 lemma mult_divide_cancel_left_if [simp]:
   979 lemma mult_divide_cancel_left_if [simp]:
   943   fixes c :: "'a :: {field,division_by_zero}"
   980   fixes c :: "'a :: {field,division_by_zero}"
  1023 done
  1060 done
  1024 
  1061 
  1025 lemma diff_divide_distrib: "(a-b)/(c::'a::field) = a/c - b/c"
  1062 lemma diff_divide_distrib: "(a-b)/(c::'a::field) = a/c - b/c"
  1026 by (simp add: diff_minus add_divide_distrib) 
  1063 by (simp add: diff_minus add_divide_distrib) 
  1027 
  1064 
       
  1065 lemma diff_frac_eq: "(y::'a::field) ~= 0 ==> z ~= 0 ==>
       
  1066     x / y - w / z = (x * z - w * y) / (y * z)"
       
  1067   apply (subst diff_def)+
       
  1068   apply (subst minus_divide_left)
       
  1069   apply (subst add_frac_eq)
       
  1070   apply simp_all
       
  1071 done
  1028 
  1072 
  1029 subsection {* Ordered Fields *}
  1073 subsection {* Ordered Fields *}
  1030 
  1074 
  1031 lemma positive_imp_inverse_positive: 
  1075 lemma positive_imp_inverse_positive: 
  1032       assumes a_gt_0: "0 < a"  shows "0 < inverse (a::'a::ordered_field)"
  1076       assumes a_gt_0: "0 < a"  shows "0 < inverse (a::'a::ordered_field)"
  1222 
  1266 
  1223 lemma inverse_le_1_iff:
  1267 lemma inverse_le_1_iff:
  1224    "(inverse x \<le> 1) = (x \<le> 0 | 1 \<le> (x::'a::{ordered_field,division_by_zero}))"
  1268    "(inverse x \<le> 1) = (x \<le> 0 | 1 \<le> (x::'a::{ordered_field,division_by_zero}))"
  1225 by (simp add: linorder_not_less [symmetric] one_less_inverse_iff) 
  1269 by (simp add: linorder_not_less [symmetric] one_less_inverse_iff) 
  1226 
  1270 
  1227 
       
  1228 subsection{*Division and Signs*}
       
  1229 
       
  1230 lemma zero_less_divide_iff:
       
  1231      "((0::'a::{ordered_field,division_by_zero}) < a/b) = (0 < a & 0 < b | a < 0 & b < 0)"
       
  1232 by (simp add: divide_inverse zero_less_mult_iff)
       
  1233 
       
  1234 lemma divide_less_0_iff:
       
  1235      "(a/b < (0::'a::{ordered_field,division_by_zero})) = 
       
  1236       (0 < a & b < 0 | a < 0 & 0 < b)"
       
  1237 by (simp add: divide_inverse mult_less_0_iff)
       
  1238 
       
  1239 lemma zero_le_divide_iff:
       
  1240      "((0::'a::{ordered_field,division_by_zero}) \<le> a/b) =
       
  1241       (0 \<le> a & 0 \<le> b | a \<le> 0 & b \<le> 0)"
       
  1242 by (simp add: divide_inverse zero_le_mult_iff)
       
  1243 
       
  1244 lemma divide_le_0_iff:
       
  1245      "(a/b \<le> (0::'a::{ordered_field,division_by_zero})) =
       
  1246       (0 \<le> a & b \<le> 0 | a \<le> 0 & 0 \<le> b)"
       
  1247 by (simp add: divide_inverse mult_le_0_iff)
       
  1248 
       
  1249 lemma divide_eq_0_iff [simp]:
       
  1250      "(a/b = 0) = (a=0 | b=(0::'a::{field,division_by_zero}))"
       
  1251 by (simp add: divide_inverse field_mult_eq_0_iff)
       
  1252 
       
  1253 
       
  1254 subsection{*Simplification of Inequalities Involving Literal Divisors*}
  1271 subsection{*Simplification of Inequalities Involving Literal Divisors*}
  1255 
  1272 
  1256 lemma pos_le_divide_eq: "0 < (c::'a::ordered_field) ==> (a \<le> b/c) = (a*c \<le> b)"
  1273 lemma pos_le_divide_eq: "0 < (c::'a::ordered_field) ==> (a \<le> b/c) = (a*c \<le> b)"
  1257 proof -
  1274 proof -
  1258   assume less: "0<c"
  1275   assume less: "0<c"
  1260     by (simp add: mult_le_cancel_right order_less_not_sym [OF less])
  1277     by (simp add: mult_le_cancel_right order_less_not_sym [OF less])
  1261   also have "... = (a*c \<le> b)"
  1278   also have "... = (a*c \<le> b)"
  1262     by (simp add: order_less_imp_not_eq2 [OF less] divide_inverse mult_assoc) 
  1279     by (simp add: order_less_imp_not_eq2 [OF less] divide_inverse mult_assoc) 
  1263   finally show ?thesis .
  1280   finally show ?thesis .
  1264 qed
  1281 qed
  1265 
       
  1266 
  1282 
  1267 lemma neg_le_divide_eq: "c < (0::'a::ordered_field) ==> (a \<le> b/c) = (b \<le> a*c)"
  1283 lemma neg_le_divide_eq: "c < (0::'a::ordered_field) ==> (a \<le> b/c) = (b \<le> a*c)"
  1268 proof -
  1284 proof -
  1269   assume less: "c<0"
  1285   assume less: "c<0"
  1270   hence "(a \<le> b/c) = ((b/c)*c \<le> a*c)"
  1286   hence "(a \<le> b/c) = ((b/c)*c \<le> a*c)"
  1310              else 0 \<le> (a::'a::{ordered_field,division_by_zero}))"
  1326              else 0 \<le> (a::'a::{ordered_field,division_by_zero}))"
  1311 apply (case_tac "c=0", simp) 
  1327 apply (case_tac "c=0", simp) 
  1312 apply (force simp add: pos_divide_le_eq neg_divide_le_eq linorder_neq_iff) 
  1328 apply (force simp add: pos_divide_le_eq neg_divide_le_eq linorder_neq_iff) 
  1313 done
  1329 done
  1314 
  1330 
  1315 
       
  1316 lemma pos_less_divide_eq:
  1331 lemma pos_less_divide_eq:
  1317      "0 < (c::'a::ordered_field) ==> (a < b/c) = (a*c < b)"
  1332      "0 < (c::'a::ordered_field) ==> (a < b/c) = (a*c < b)"
  1318 proof -
  1333 proof -
  1319   assume less: "0<c"
  1334   assume less: "0<c"
  1320   hence "(a < b/c) = (a*c < (b/c)*c)"
  1335   hence "(a < b/c) = (a*c < (b/c)*c)"
  1401 
  1416 
  1402 lemma divide_eq_eq:
  1417 lemma divide_eq_eq:
  1403   "(b/c = (a::'a::{field,division_by_zero})) = (if c\<noteq>0 then b = a*c else a=0)"
  1418   "(b/c = (a::'a::{field,division_by_zero})) = (if c\<noteq>0 then b = a*c else a=0)"
  1404 by (force simp add: nonzero_divide_eq_eq) 
  1419 by (force simp add: nonzero_divide_eq_eq) 
  1405 
  1420 
       
  1421 lemma divide_eq_imp: "(c::'a::{division_by_zero,field}) ~= 0 ==>
       
  1422     b = a * c ==> b / c = a"
       
  1423   by (subst divide_eq_eq, simp)
       
  1424 
       
  1425 lemma eq_divide_imp: "(c::'a::{division_by_zero,field}) ~= 0 ==>
       
  1426     a * c = b ==> a = b / c"
       
  1427   by (subst eq_divide_eq, simp)
       
  1428 
       
  1429 lemma frac_eq_eq: "(y::'a::field) ~= 0 ==> z ~= 0 ==>
       
  1430     (x / y = w / z) = (x * z = w * y)"
       
  1431   apply (subst nonzero_eq_divide_eq)
       
  1432   apply assumption
       
  1433   apply (subst times_divide_eq_left)
       
  1434   apply (erule nonzero_divide_eq_eq) 
       
  1435 done
       
  1436 
       
  1437 subsection{*Division and Signs*}
       
  1438 
       
  1439 lemma zero_less_divide_iff:
       
  1440      "((0::'a::{ordered_field,division_by_zero}) < a/b) = (0 < a & 0 < b | a < 0 & b < 0)"
       
  1441 by (simp add: divide_inverse zero_less_mult_iff)
       
  1442 
       
  1443 lemma divide_less_0_iff:
       
  1444      "(a/b < (0::'a::{ordered_field,division_by_zero})) = 
       
  1445       (0 < a & b < 0 | a < 0 & 0 < b)"
       
  1446 by (simp add: divide_inverse mult_less_0_iff)
       
  1447 
       
  1448 lemma zero_le_divide_iff:
       
  1449      "((0::'a::{ordered_field,division_by_zero}) \<le> a/b) =
       
  1450       (0 \<le> a & 0 \<le> b | a \<le> 0 & b \<le> 0)"
       
  1451 by (simp add: divide_inverse zero_le_mult_iff)
       
  1452 
       
  1453 lemma divide_le_0_iff:
       
  1454      "(a/b \<le> (0::'a::{ordered_field,division_by_zero})) =
       
  1455       (0 \<le> a & b \<le> 0 | a \<le> 0 & 0 \<le> b)"
       
  1456 by (simp add: divide_inverse mult_le_0_iff)
       
  1457 
       
  1458 lemma divide_eq_0_iff [simp]:
       
  1459      "(a/b = 0) = (a=0 | b=(0::'a::{field,division_by_zero}))"
       
  1460 by (simp add: divide_inverse field_mult_eq_0_iff)
       
  1461 
       
  1462 lemma divide_pos_pos: "0 < (x::'a::ordered_field) ==> 
       
  1463     0 < y ==> 0 < x / y"
       
  1464   apply (subst pos_less_divide_eq)
       
  1465   apply assumption
       
  1466   apply simp
       
  1467 done
       
  1468 
       
  1469 lemma divide_nonneg_pos: "0 <= (x::'a::ordered_field) ==> 0 < y ==> 
       
  1470     0 <= x / y"
       
  1471   apply (subst pos_le_divide_eq)
       
  1472   apply assumption
       
  1473   apply simp
       
  1474 done
       
  1475 
       
  1476 lemma divide_neg_pos: "(x::'a::ordered_field) < 0 ==> 0 < y ==> x / y < 0"
       
  1477   apply (subst pos_divide_less_eq)
       
  1478   apply assumption
       
  1479   apply simp
       
  1480 done
       
  1481 
       
  1482 lemma divide_nonpos_pos: "(x::'a::ordered_field) <= 0 ==> 
       
  1483     0 < y ==> x / y <= 0"
       
  1484   apply (subst pos_divide_le_eq)
       
  1485   apply assumption
       
  1486   apply simp
       
  1487 done
       
  1488 
       
  1489 lemma divide_pos_neg: "0 < (x::'a::ordered_field) ==> y < 0 ==> x / y < 0"
       
  1490   apply (subst neg_divide_less_eq)
       
  1491   apply assumption
       
  1492   apply simp
       
  1493 done
       
  1494 
       
  1495 lemma divide_nonneg_neg: "0 <= (x::'a::ordered_field) ==> 
       
  1496     y < 0 ==> x / y <= 0"
       
  1497   apply (subst neg_divide_le_eq)
       
  1498   apply assumption
       
  1499   apply simp
       
  1500 done
       
  1501 
       
  1502 lemma divide_neg_neg: "(x::'a::ordered_field) < 0 ==> y < 0 ==> 0 < x / y"
       
  1503   apply (subst neg_less_divide_eq)
       
  1504   apply assumption
       
  1505   apply simp
       
  1506 done
       
  1507 
       
  1508 lemma divide_nonpos_neg: "(x::'a::ordered_field) <= 0 ==> y < 0 ==> 
       
  1509     0 <= x / y"
       
  1510   apply (subst neg_le_divide_eq)
       
  1511   apply assumption
       
  1512   apply simp
       
  1513 done
  1406 
  1514 
  1407 subsection{*Cancellation Laws for Division*}
  1515 subsection{*Cancellation Laws for Division*}
  1408 
  1516 
  1409 lemma divide_cancel_right [simp]:
  1517 lemma divide_cancel_right [simp]:
  1410      "(a/c = b/c) = (c = 0 | a = (b::'a::{field,division_by_zero}))"
  1518      "(a/c = b/c) = (c = 0 | a = (b::'a::{field,division_by_zero}))"
  1425      "(a/b = 1) = (b \<noteq> 0 & a = (b::'a::{field,division_by_zero}))"
  1533      "(a/b = 1) = (b \<noteq> 0 & a = (b::'a::{field,division_by_zero}))"
  1426 apply (case_tac "b=0", simp) 
  1534 apply (case_tac "b=0", simp) 
  1427 apply (simp add: right_inverse_eq) 
  1535 apply (simp add: right_inverse_eq) 
  1428 done
  1536 done
  1429 
  1537 
  1430 
       
  1431 lemma one_eq_divide_iff [simp]:
  1538 lemma one_eq_divide_iff [simp]:
  1432      "(1 = a/b) = (b \<noteq> 0 & a = (b::'a::{field,division_by_zero}))"
  1539      "(1 = a/b) = (b \<noteq> 0 & a = (b::'a::{field,division_by_zero}))"
  1433 by (simp add: eq_commute [of 1])  
  1540 by (simp add: eq_commute [of 1])  
  1434 
  1541 
  1435 lemma zero_eq_1_divide_iff [simp]:
  1542 lemma zero_eq_1_divide_iff [simp]:
  1449 declare zero_less_divide_iff [of "1", simp]
  1556 declare zero_less_divide_iff [of "1", simp]
  1450 declare divide_less_0_iff [of "1", simp]
  1557 declare divide_less_0_iff [of "1", simp]
  1451 declare zero_le_divide_iff [of "1", simp]
  1558 declare zero_le_divide_iff [of "1", simp]
  1452 declare divide_le_0_iff [of "1", simp]
  1559 declare divide_le_0_iff [of "1", simp]
  1453 
  1560 
  1454 
       
  1455 subsection {* Ordering Rules for Division *}
  1561 subsection {* Ordering Rules for Division *}
  1456 
  1562 
  1457 lemma divide_strict_right_mono:
  1563 lemma divide_strict_right_mono:
  1458      "[|a < b; 0 < c|] ==> a / c < b / (c::'a::ordered_field)"
  1564      "[|a < b; 0 < c|] ==> a / c < b / (c::'a::ordered_field)"
  1459 by (simp add: order_less_imp_not_eq2 divide_inverse mult_strict_right_mono 
  1565 by (simp add: order_less_imp_not_eq2 divide_inverse mult_strict_right_mono 
  1461 
  1567 
  1462 lemma divide_right_mono:
  1568 lemma divide_right_mono:
  1463      "[|a \<le> b; 0 \<le> c|] ==> a/c \<le> b/(c::'a::{ordered_field,division_by_zero})"
  1569      "[|a \<le> b; 0 \<le> c|] ==> a/c \<le> b/(c::'a::{ordered_field,division_by_zero})"
  1464   by (force simp add: divide_strict_right_mono order_le_less) 
  1570   by (force simp add: divide_strict_right_mono order_le_less) 
  1465 
  1571 
       
  1572 lemma divide_right_mono_neg: "(a::'a::{division_by_zero,ordered_field}) <= b 
       
  1573     ==> c <= 0 ==> b / c <= a / c"
       
  1574   apply (drule divide_right_mono [of _ _ "- c"])
       
  1575   apply auto
       
  1576 done
       
  1577 
       
  1578 lemma divide_strict_right_mono_neg:
       
  1579      "[|b < a; c < 0|] ==> a / c < b / (c::'a::ordered_field)"
       
  1580 apply (drule divide_strict_right_mono [of _ _ "-c"], simp) 
       
  1581 apply (simp add: order_less_imp_not_eq nonzero_minus_divide_right [symmetric]) 
       
  1582 done
  1466 
  1583 
  1467 text{*The last premise ensures that @{term a} and @{term b} 
  1584 text{*The last premise ensures that @{term a} and @{term b} 
  1468       have the same sign*}
  1585       have the same sign*}
  1469 lemma divide_strict_left_mono:
  1586 lemma divide_strict_left_mono:
  1470        "[|b < a; 0 < c; 0 < a*b|] ==> c / a < c / (b::'a::ordered_field)"
  1587        "[|b < a; 0 < c; 0 < a*b|] ==> c / a < c / (b::'a::ordered_field)"
  1479    apply (force simp add: zero_less_mult_iff order_less_imp_not_eq) 
  1596    apply (force simp add: zero_less_mult_iff order_less_imp_not_eq) 
  1480   apply (case_tac "c=0", simp add: divide_inverse)
  1597   apply (case_tac "c=0", simp add: divide_inverse)
  1481   apply (force simp add: divide_strict_left_mono order_le_less) 
  1598   apply (force simp add: divide_strict_left_mono order_le_less) 
  1482   done
  1599   done
  1483 
  1600 
       
  1601 lemma divide_left_mono_neg: "(a::'a::{division_by_zero,ordered_field}) <= b 
       
  1602     ==> c <= 0 ==> 0 < a * b ==> c / a <= c / b"
       
  1603   apply (drule divide_left_mono [of _ _ "- c"])
       
  1604   apply (auto simp add: mult_commute)
       
  1605 done
       
  1606 
  1484 lemma divide_strict_left_mono_neg:
  1607 lemma divide_strict_left_mono_neg:
  1485      "[|a < b; c < 0; 0 < a*b|] ==> c / a < c / (b::'a::ordered_field)"
  1608      "[|a < b; c < 0; 0 < a*b|] ==> c / a < c / (b::'a::ordered_field)"
  1486   apply (subgoal_tac "a \<noteq> 0 & b \<noteq> 0") 
  1609   apply (subgoal_tac "a \<noteq> 0 & b \<noteq> 0") 
  1487    prefer 2 
  1610    prefer 2 
  1488    apply (force simp add: zero_less_mult_iff order_less_imp_not_eq) 
  1611    apply (force simp add: zero_less_mult_iff order_less_imp_not_eq) 
  1489   apply (drule divide_strict_left_mono [of _ _ "-c"]) 
  1612   apply (drule divide_strict_left_mono [of _ _ "-c"]) 
  1490    apply (simp_all add: mult_commute nonzero_minus_divide_left [symmetric]) 
  1613    apply (simp_all add: mult_commute nonzero_minus_divide_left [symmetric]) 
  1491   done
  1614   done
  1492 
  1615 
  1493 lemma divide_strict_right_mono_neg:
  1616 text{*Simplify quotients that are compared with the value 1.*}
  1494      "[|b < a; c < 0|] ==> a / c < b / (c::'a::ordered_field)"
  1617 
  1495 apply (drule divide_strict_right_mono [of _ _ "-c"], simp) 
  1618 lemma le_divide_eq_1:
  1496 apply (simp add: order_less_imp_not_eq nonzero_minus_divide_right [symmetric]) 
  1619   fixes a :: "'a :: {ordered_field,division_by_zero}"
  1497 done
  1620   shows "(1 \<le> b / a) = ((0 < a & a \<le> b) | (a < 0 & b \<le> a))"
  1498 
  1621 by (auto simp add: le_divide_eq)
  1499 
  1622 
  1500 subsection {* Ordered Fields are Dense *}
  1623 lemma divide_le_eq_1:
  1501 
  1624   fixes a :: "'a :: {ordered_field,division_by_zero}"
  1502 lemma less_add_one: "a < (a+1::'a::ordered_semidom)"
  1625   shows "(b / a \<le> 1) = ((0 < a & b \<le> a) | (a < 0 & a \<le> b) | a=0)"
  1503 proof -
  1626 by (auto simp add: divide_le_eq)
  1504   have "a+0 < (a+1::'a::ordered_semidom)"
  1627 
  1505     by (blast intro: zero_less_one add_strict_left_mono) 
  1628 lemma less_divide_eq_1:
  1506   thus ?thesis by simp
  1629   fixes a :: "'a :: {ordered_field,division_by_zero}"
  1507 qed
  1630   shows "(1 < b / a) = ((0 < a & a < b) | (a < 0 & b < a))"
  1508 
  1631 by (auto simp add: less_divide_eq)
  1509 lemma zero_less_two: "0 < (1+1::'a::ordered_semidom)"
  1632 
  1510   by (blast intro: order_less_trans zero_less_one less_add_one) 
  1633 lemma divide_less_eq_1:
  1511 
  1634   fixes a :: "'a :: {ordered_field,division_by_zero}"
  1512 lemma less_half_sum: "a < b ==> a < (a+b) / (1+1::'a::ordered_field)"
  1635   shows "(b / a < 1) = ((0 < a & b < a) | (a < 0 & a < b) | a=0)"
  1513 by (simp add: zero_less_two pos_less_divide_eq right_distrib) 
  1636 by (auto simp add: divide_less_eq)
  1514 
  1637 
  1515 lemma gt_half_sum: "a < b ==> (a+b)/(1+1::'a::ordered_field) < b"
  1638 subsection{*Conditional Simplification Rules: No Case Splits*}
  1516 by (simp add: zero_less_two pos_divide_less_eq right_distrib) 
  1639 
  1517 
  1640 lemma le_divide_eq_1_pos [simp]:
  1518 lemma dense: "a < b ==> \<exists>r::'a::ordered_field. a < r & r < b"
  1641   fixes a :: "'a :: {ordered_field,division_by_zero}"
  1519 by (blast intro!: less_half_sum gt_half_sum)
  1642   shows "0 < a \<Longrightarrow> (1 \<le> b / a) = (a \<le> b)"
  1520 
  1643 by (auto simp add: le_divide_eq)
       
  1644 
       
  1645 lemma le_divide_eq_1_neg [simp]:
       
  1646   fixes a :: "'a :: {ordered_field,division_by_zero}"
       
  1647   shows "a < 0 \<Longrightarrow> (1 \<le> b / a) = (b \<le> a)"
       
  1648 by (auto simp add: le_divide_eq)
       
  1649 
       
  1650 lemma divide_le_eq_1_pos [simp]:
       
  1651   fixes a :: "'a :: {ordered_field,division_by_zero}"
       
  1652   shows "0 < a \<Longrightarrow> (b / a \<le> 1) = (b \<le> a)"
       
  1653 by (auto simp add: divide_le_eq)
       
  1654 
       
  1655 lemma divide_le_eq_1_neg [simp]:
       
  1656   fixes a :: "'a :: {ordered_field,division_by_zero}"
       
  1657   shows "a < 0 \<Longrightarrow> (b / a \<le> 1) = (a \<le> b)"
       
  1658 by (auto simp add: divide_le_eq)
       
  1659 
       
  1660 lemma less_divide_eq_1_pos [simp]:
       
  1661   fixes a :: "'a :: {ordered_field,division_by_zero}"
       
  1662   shows "0 < a \<Longrightarrow> (1 < b / a) = (a < b)"
       
  1663 by (auto simp add: less_divide_eq)
       
  1664 
       
  1665 lemma less_divide_eq_1_neg [simp]:
       
  1666   fixes a :: "'a :: {ordered_field,division_by_zero}"
       
  1667   shows "a < 0 \<Longrightarrow> (1 < b / a) = (b < a)"
       
  1668 by (auto simp add: less_divide_eq)
       
  1669 
       
  1670 lemma divide_less_eq_1_pos [simp]:
       
  1671   fixes a :: "'a :: {ordered_field,division_by_zero}"
       
  1672   shows "0 < a \<Longrightarrow> (b / a < 1) = (b < a)"
       
  1673 by (auto simp add: divide_less_eq)
       
  1674 
       
  1675 lemma eq_divide_eq_1 [simp]:
       
  1676   fixes a :: "'a :: {ordered_field,division_by_zero}"
       
  1677   shows "(1 = b / a) = ((a \<noteq> 0 & a = b))"
       
  1678 by (auto simp add: eq_divide_eq)
       
  1679 
       
  1680 lemma divide_eq_eq_1 [simp]:
       
  1681   fixes a :: "'a :: {ordered_field,division_by_zero}"
       
  1682   shows "(b / a = 1) = ((a \<noteq> 0 & a = b))"
       
  1683 by (auto simp add: divide_eq_eq)
       
  1684 
       
  1685 subsection {* Reasoning about inequalities with division *}
       
  1686 
       
  1687 lemma mult_right_le_one_le: "0 <= (x::'a::ordered_idom) ==> 0 <= y ==> y <= 1
       
  1688     ==> x * y <= x"
       
  1689   by (auto simp add: mult_compare_simps);
       
  1690 
       
  1691 lemma mult_left_le_one_le: "0 <= (x::'a::ordered_idom) ==> 0 <= y ==> y <= 1
       
  1692     ==> y * x <= x"
       
  1693   by (auto simp add: mult_compare_simps);
       
  1694 
       
  1695 lemma mult_imp_div_pos_le: "0 < (y::'a::ordered_field) ==> x <= z * y ==>
       
  1696     x / y <= z";
       
  1697   by (subst pos_divide_le_eq, assumption+);
       
  1698 
       
  1699 lemma mult_imp_le_div_pos: "0 < (y::'a::ordered_field) ==> z * y <= x ==>
       
  1700     z <= x / y";
       
  1701   by (subst pos_le_divide_eq, assumption+)
       
  1702 
       
  1703 lemma mult_imp_div_pos_less: "0 < (y::'a::ordered_field) ==> x < z * y ==>
       
  1704     x / y < z"
       
  1705   by (subst pos_divide_less_eq, assumption+)
       
  1706 
       
  1707 lemma mult_imp_less_div_pos: "0 < (y::'a::ordered_field) ==> z * y < x ==>
       
  1708     z < x / y"
       
  1709   by (subst pos_less_divide_eq, assumption+)
       
  1710 
       
  1711 lemma frac_le: "(0::'a::ordered_field) <= x ==> 
       
  1712     x <= y ==> 0 < w ==> w <= z  ==> x / z <= y / w"
       
  1713   apply (rule mult_imp_div_pos_le)
       
  1714   apply simp;
       
  1715   apply (subst times_divide_eq_left);
       
  1716   apply (rule mult_imp_le_div_pos, assumption)
       
  1717   apply (rule mult_mono)
       
  1718   apply simp_all
       
  1719 done
       
  1720 
       
  1721 lemma frac_less: "(0::'a::ordered_field) <= x ==> 
       
  1722     x < y ==> 0 < w ==> w <= z  ==> x / z < y / w"
       
  1723   apply (rule mult_imp_div_pos_less)
       
  1724   apply simp;
       
  1725   apply (subst times_divide_eq_left);
       
  1726   apply (rule mult_imp_less_div_pos, assumption)
       
  1727   apply (erule mult_less_le_imp_less)
       
  1728   apply simp_all
       
  1729 done
       
  1730 
       
  1731 lemma frac_less2: "(0::'a::ordered_field) < x ==> 
       
  1732     x <= y ==> 0 < w ==> w < z  ==> x / z < y / w"
       
  1733   apply (rule mult_imp_div_pos_less)
       
  1734   apply simp_all
       
  1735   apply (subst times_divide_eq_left);
       
  1736   apply (rule mult_imp_less_div_pos, assumption)
       
  1737   apply (erule mult_le_less_imp_less)
       
  1738   apply simp_all
       
  1739 done
  1521 
  1740 
  1522 lemmas times_divide_eq = times_divide_eq_right times_divide_eq_left
  1741 lemmas times_divide_eq = times_divide_eq_right times_divide_eq_left
  1523 
  1742 
  1524 text{*It's not obvious whether these should be simprules or not. 
  1743 text{*It's not obvious whether these should be simprules or not. 
  1525   Their effect is to gather terms into one big fraction, like
  1744   Their effect is to gather terms into one big fraction, like
  1526   a*b*c / x*y*z. The rationale for that is unclear, but many proofs 
  1745   a*b*c / x*y*z. The rationale for that is unclear, but many proofs 
  1527   seem to need them.*}
  1746   seem to need them.*}
  1528 
  1747 
  1529 declare times_divide_eq [simp]
  1748 declare times_divide_eq [simp]
       
  1749 
       
  1750 subsection {* Ordered Fields are Dense *}
       
  1751 
       
  1752 lemma less_add_one: "a < (a+1::'a::ordered_semidom)"
       
  1753 proof -
       
  1754   have "a+0 < (a+1::'a::ordered_semidom)"
       
  1755     by (blast intro: zero_less_one add_strict_left_mono) 
       
  1756   thus ?thesis by simp
       
  1757 qed
       
  1758 
       
  1759 lemma zero_less_two: "0 < (1+1::'a::ordered_semidom)"
       
  1760   by (blast intro: order_less_trans zero_less_one less_add_one) 
       
  1761 
       
  1762 lemma less_half_sum: "a < b ==> a < (a+b) / (1+1::'a::ordered_field)"
       
  1763 by (simp add: zero_less_two pos_less_divide_eq right_distrib) 
       
  1764 
       
  1765 lemma gt_half_sum: "a < b ==> (a+b)/(1+1::'a::ordered_field) < b"
       
  1766 by (simp add: zero_less_two pos_divide_less_eq right_distrib) 
       
  1767 
       
  1768 lemma dense: "a < b ==> \<exists>r::'a::ordered_field. a < r & r < b"
       
  1769 by (blast intro!: less_half_sum gt_half_sum)
  1530 
  1770 
  1531 
  1771 
  1532 subsection {* Absolute Value *}
  1772 subsection {* Absolute Value *}
  1533 
  1773 
  1534 lemma abs_one [simp]: "abs 1 = (1::'a::ordered_idom)"
  1774 lemma abs_one [simp]: "abs 1 = (1::'a::ordered_idom)"
  1554   note addm2 = add_mono[of _ "0::'a" _ "0::'a", simplified]
  1794   note addm2 = add_mono[of _ "0::'a" _ "0::'a", simplified]
  1555   have xy: "- ?x <= ?y"
  1795   have xy: "- ?x <= ?y"
  1556     apply (simp)
  1796     apply (simp)
  1557     apply (rule_tac y="0::'a" in order_trans)
  1797     apply (rule_tac y="0::'a" in order_trans)
  1558     apply (rule addm2)
  1798     apply (rule addm2)
  1559     apply (simp_all add: mult_pos_le mult_neg_le)
  1799     apply (simp_all add: mult_nonneg_nonneg mult_nonpos_nonpos)
  1560     apply (rule addm)
  1800     apply (rule addm)
  1561     apply (simp_all add: mult_pos_le mult_neg_le)
  1801     apply (simp_all add: mult_nonneg_nonneg mult_nonpos_nonpos)
  1562     done
  1802     done
  1563   have yx: "?y <= ?x"
  1803   have yx: "?y <= ?x"
  1564     apply (simp add:diff_def)
  1804     apply (simp add:diff_def)
  1565     apply (rule_tac y=0 in order_trans)
  1805     apply (rule_tac y=0 in order_trans)
  1566     apply (rule addm2, (simp add: mult_pos_neg_le mult_pos_neg2_le)+)
  1806     apply (rule addm2, (simp add: mult_nonneg_nonpos mult_nonneg_nonpos2)+)
  1567     apply (rule addm, (simp add: mult_pos_neg_le mult_pos_neg2_le)+)
  1807     apply (rule addm, (simp add: mult_nonneg_nonpos mult_nonneg_nonpos2)+)
  1568     done
  1808     done
  1569   have i1: "a*b <= abs a * abs b" by (simp only: a b yx)
  1809   have i1: "a*b <= abs a * abs b" by (simp only: a b yx)
  1570   have i2: "- (abs a * abs b) <= a*b" by (simp only: a b xy)
  1810   have i2: "- (abs a * abs b) <= a*b" by (simp only: a b xy)
  1571   show ?thesis
  1811   show ?thesis
  1572     apply (rule abs_leI)
  1812     apply (rule abs_leI)
  1598       apply (insert prems)
  1838       apply (insert prems)
  1599       apply (auto simp add: 
  1839       apply (auto simp add: 
  1600 	ring_eq_simps 
  1840 	ring_eq_simps 
  1601 	iff2imp[OF zero_le_iff_zero_nprt] iff2imp[OF le_zero_iff_zero_pprt]
  1841 	iff2imp[OF zero_le_iff_zero_nprt] iff2imp[OF le_zero_iff_zero_pprt]
  1602 	iff2imp[OF le_zero_iff_pprt_id] iff2imp[OF zero_le_iff_nprt_id])
  1842 	iff2imp[OF le_zero_iff_pprt_id] iff2imp[OF zero_le_iff_nprt_id])
  1603 	apply(drule (1) mult_pos_neg_le[of a b], simp)
  1843 	apply(drule (1) mult_nonneg_nonpos[of a b], simp)
  1604 	apply(drule (1) mult_pos_neg2_le[of b a], simp)
  1844 	apply(drule (1) mult_nonneg_nonpos2[of b a], simp)
  1605       done
  1845       done
  1606   next
  1846   next
  1607     assume "~(0 <= a*b)"
  1847     assume "~(0 <= a*b)"
  1608     with s have "a*b <= 0" by simp
  1848     with s have "a*b <= 0" by simp
  1609     then show ?thesis
  1849     then show ?thesis
  1610       apply (simp_all add: mulprts abs_prts)
  1850       apply (simp_all add: mulprts abs_prts)
  1611       apply (insert prems)
  1851       apply (insert prems)
  1612       apply (auto simp add: ring_eq_simps)
  1852       apply (auto simp add: ring_eq_simps)
  1613       apply(drule (1) mult_pos_le[of a b],simp)
  1853       apply(drule (1) mult_nonneg_nonneg[of a b],simp)
  1614       apply(drule (1) mult_neg_le[of a b],simp)
  1854       apply(drule (1) mult_nonpos_nonpos[of a b],simp)
  1615       done
  1855       done
  1616   qed
  1856   qed
  1617 qed
  1857 qed
  1618 
  1858 
  1619 lemma abs_mult: "abs (a * b) = abs a * abs (b::'a::ordered_idom)" 
  1859 lemma abs_mult: "abs (a * b) = abs a * abs (b::'a::ordered_idom)" 
  1664 lemma abs_less_iff: "(abs a < b) = (a < b & -a < (b::'a::ordered_idom))" 
  1904 lemma abs_less_iff: "(abs a < b) = (a < b & -a < (b::'a::ordered_idom))" 
  1665 apply (simp add: order_less_le abs_le_iff)  
  1905 apply (simp add: order_less_le abs_le_iff)  
  1666 apply (auto simp add: abs_if minus_le_self_iff eq_minus_self_iff)
  1906 apply (auto simp add: abs_if minus_le_self_iff eq_minus_self_iff)
  1667 apply (simp add: le_minus_self_iff linorder_neq_iff) 
  1907 apply (simp add: le_minus_self_iff linorder_neq_iff) 
  1668 done
  1908 done
       
  1909 
       
  1910 lemma abs_mult_pos: "(0::'a::ordered_idom) <= x ==> 
       
  1911     (abs y) * x = abs (y * x)";
       
  1912   apply (subst abs_mult);
       
  1913   apply simp;
       
  1914 done;
       
  1915 
       
  1916 lemma abs_div_pos: "(0::'a::{division_by_zero,ordered_field}) < y ==> 
       
  1917     abs x / y = abs (x / y)";
       
  1918   apply (subst abs_divide);
       
  1919   apply (simp add: order_less_imp_le);
       
  1920 done;
       
  1921 
       
  1922 subsection {* Miscellaneous *}
  1669 
  1923 
  1670 lemma linprog_dual_estimate:
  1924 lemma linprog_dual_estimate:
  1671   assumes
  1925   assumes
  1672   "A * x \<le> (b::'a::lordered_ring)"
  1926   "A * x \<le> (b::'a::lordered_ring)"
  1673   "0 \<le> y"
  1927   "0 \<le> y"
  1710     done    
  1964     done    
  1711   from 6 7 8 9 12 13 r have 14:" abs((y * (A - A') + (y * A' - c') + (c'-c)) * x) <=(abs y * \<delta>A + abs (y*A'-c') + \<delta>c) * r"     
  1965   from 6 7 8 9 12 13 r have 14:" abs((y * (A - A') + (y * A' - c') + (c'-c)) * x) <=(abs y * \<delta>A + abs (y*A'-c') + \<delta>c) * r"     
  1712     by (simp)
  1966     by (simp)
  1713   show ?thesis 
  1967   show ?thesis 
  1714     apply (rule_tac le_add_right_mono[of _ _ "abs((y * (A - A') + (y * A' - c') + (c'-c)) * x)"])
  1968     apply (rule_tac le_add_right_mono[of _ _ "abs((y * (A - A') + (y * A' - c') + (c'-c)) * x)"])
  1715     apply (simp_all only: 5 14[simplified abs_of_ge_0[of y, simplified prems]])
  1969     apply (simp_all only: 5 14[simplified abs_of_nonneg[of y, simplified prems]])
  1716     done
  1970     done
  1717 qed
  1971 qed
  1718 
  1972 
  1719 lemma le_ge_imp_abs_diff_1:
  1973 lemma le_ge_imp_abs_diff_1:
  1720   assumes
  1974   assumes
  1725   have "0 <= A - A1"    
  1979   have "0 <= A - A1"    
  1726   proof -
  1980   proof -
  1727     have 1: "A - A1 = A + (- A1)" by simp
  1981     have 1: "A - A1 = A + (- A1)" by simp
  1728     show ?thesis by (simp only: 1 add_right_mono[of A1 A "-A1", simplified, simplified prems])
  1982     show ?thesis by (simp only: 1 add_right_mono[of A1 A "-A1", simplified, simplified prems])
  1729   qed
  1983   qed
  1730   then have "abs (A-A1) = A-A1" by (rule abs_of_ge_0)
  1984   then have "abs (A-A1) = A-A1" by (rule abs_of_nonneg)
  1731   with prems show "abs (A-A1) <= (A2-A1)" by simp
  1985   with prems show "abs (A-A1) <= (A2-A1)" by simp
  1732 qed
  1986 qed
  1733 
  1987 
  1734 lemma mult_le_prts:
  1988 lemma mult_le_prts:
  1735   assumes
  1989   assumes
  1854 val mult_right_less_imp_less = thm "mult_right_less_imp_less";
  2108 val mult_right_less_imp_less = thm "mult_right_less_imp_less";
  1855 val mult_strict_left_mono_neg = thm "mult_strict_left_mono_neg";
  2109 val mult_strict_left_mono_neg = thm "mult_strict_left_mono_neg";
  1856 val mult_left_mono_neg = thm "mult_left_mono_neg";
  2110 val mult_left_mono_neg = thm "mult_left_mono_neg";
  1857 val mult_strict_right_mono_neg = thm "mult_strict_right_mono_neg";
  2111 val mult_strict_right_mono_neg = thm "mult_strict_right_mono_neg";
  1858 val mult_right_mono_neg = thm "mult_right_mono_neg";
  2112 val mult_right_mono_neg = thm "mult_right_mono_neg";
       
  2113 (*
  1859 val mult_pos = thm "mult_pos";
  2114 val mult_pos = thm "mult_pos";
  1860 val mult_pos_le = thm "mult_pos_le";
  2115 val mult_pos_le = thm "mult_pos_le";
  1861 val mult_pos_neg = thm "mult_pos_neg";
  2116 val mult_pos_neg = thm "mult_pos_neg";
  1862 val mult_pos_neg_le = thm "mult_pos_neg_le";
  2117 val mult_pos_neg_le = thm "mult_pos_neg_le";
  1863 val mult_pos_neg2 = thm "mult_pos_neg2";
  2118 val mult_pos_neg2 = thm "mult_pos_neg2";
  1864 val mult_pos_neg2_le = thm "mult_pos_neg2_le";
  2119 val mult_pos_neg2_le = thm "mult_pos_neg2_le";
  1865 val mult_neg = thm "mult_neg";
  2120 val mult_neg = thm "mult_neg";
  1866 val mult_neg_le = thm "mult_neg_le";
  2121 val mult_neg_le = thm "mult_neg_le";
       
  2122 *)
  1867 val zero_less_mult_pos = thm "zero_less_mult_pos";
  2123 val zero_less_mult_pos = thm "zero_less_mult_pos";
  1868 val zero_less_mult_pos2 = thm "zero_less_mult_pos2";
  2124 val zero_less_mult_pos2 = thm "zero_less_mult_pos2";
  1869 val zero_less_mult_iff = thm "zero_less_mult_iff";
  2125 val zero_less_mult_iff = thm "zero_less_mult_iff";
  1870 val mult_eq_0_iff = thm "mult_eq_0_iff";
  2126 val mult_eq_0_iff = thm "mult_eq_0_iff";
  1871 val zero_le_mult_iff = thm "zero_le_mult_iff";
  2127 val zero_le_mult_iff = thm "zero_le_mult_iff";