changeset 16775 | c1b87ef4a1c3 |
parent 16568 | e02fe7ae212b |
child 17085 | 5b57f995a179 |
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"; |