250 lemma inverse_add: |
250 lemma inverse_add: |
251 "[| a \<noteq> 0; b \<noteq> 0 |] |
251 "[| a \<noteq> 0; b \<noteq> 0 |] |
252 ==> inverse a + inverse b = (a + b) * inverse a * inverse b" |
252 ==> inverse a + inverse b = (a + b) * inverse a * inverse b" |
253 by (simp add: division_ring_inverse_add mult_ac) |
253 by (simp add: division_ring_inverse_add mult_ac) |
254 |
254 |
255 lemma nonzero_mult_divide_mult_cancel_left [simp, no_atp]: |
255 lemma nonzero_mult_divide_mult_cancel_left [simp]: |
256 assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" shows "(c*a)/(c*b) = a/b" |
256 assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" shows "(c*a)/(c*b) = a/b" |
257 proof - |
257 proof - |
258 have "(c*a)/(c*b) = c * a * (inverse b * inverse c)" |
258 have "(c*a)/(c*b) = c * a * (inverse b * inverse c)" |
259 by (simp add: divide_inverse nonzero_inverse_mult_distrib) |
259 by (simp add: divide_inverse nonzero_inverse_mult_distrib) |
260 also have "... = a * inverse b * (inverse c * c)" |
260 also have "... = a * inverse b * (inverse c * c)" |
261 by (simp only: mult_ac) |
261 by (simp only: mult_ac) |
262 also have "... = a * inverse b" by simp |
262 also have "... = a * inverse b" by simp |
263 finally show ?thesis by (simp add: divide_inverse) |
263 finally show ?thesis by (simp add: divide_inverse) |
264 qed |
264 qed |
265 |
265 |
266 lemma nonzero_mult_divide_mult_cancel_right [simp, no_atp]: |
266 lemma nonzero_mult_divide_mult_cancel_right [simp]: |
267 "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (a * c) / (b * c) = a / b" |
267 "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (a * c) / (b * c) = a / b" |
268 by (simp add: mult_commute [of _ c]) |
268 by (simp add: mult_commute [of _ c]) |
269 |
269 |
270 lemma times_divide_eq_left [simp]: "(b / c) * a = (b * a) / c" |
270 lemma times_divide_eq_left [simp]: "(b / c) * a = (b * a) / c" |
271 by (simp add: divide_inverse mult_ac) |
271 by (simp add: divide_inverse mult_ac) |
289 by (simp only: mult_commute) |
289 by (simp only: mult_commute) |
290 qed |
290 qed |
291 |
291 |
292 text{*Special Cancellation Simprules for Division*} |
292 text{*Special Cancellation Simprules for Division*} |
293 |
293 |
294 lemma nonzero_mult_divide_cancel_right [simp, no_atp]: |
294 lemma nonzero_mult_divide_cancel_right [simp]: |
295 "b \<noteq> 0 \<Longrightarrow> a * b / b = a" |
295 "b \<noteq> 0 \<Longrightarrow> a * b / b = a" |
296 using nonzero_mult_divide_mult_cancel_right [of 1 b a] by simp |
296 using nonzero_mult_divide_mult_cancel_right [of 1 b a] by simp |
297 |
297 |
298 lemma nonzero_mult_divide_cancel_left [simp, no_atp]: |
298 lemma nonzero_mult_divide_cancel_left [simp]: |
299 "a \<noteq> 0 \<Longrightarrow> a * b / a = b" |
299 "a \<noteq> 0 \<Longrightarrow> a * b / a = b" |
300 using nonzero_mult_divide_mult_cancel_left [of 1 a b] by simp |
300 using nonzero_mult_divide_mult_cancel_left [of 1 a b] by simp |
301 |
301 |
302 lemma nonzero_divide_mult_cancel_right [simp, no_atp]: |
302 lemma nonzero_divide_mult_cancel_right [simp]: |
303 "\<lbrakk>a \<noteq> 0; b \<noteq> 0\<rbrakk> \<Longrightarrow> b / (a * b) = 1 / a" |
303 "\<lbrakk>a \<noteq> 0; b \<noteq> 0\<rbrakk> \<Longrightarrow> b / (a * b) = 1 / a" |
304 using nonzero_mult_divide_mult_cancel_right [of a b 1] by simp |
304 using nonzero_mult_divide_mult_cancel_right [of a b 1] by simp |
305 |
305 |
306 lemma nonzero_divide_mult_cancel_left [simp, no_atp]: |
306 lemma nonzero_divide_mult_cancel_left [simp]: |
307 "\<lbrakk>a \<noteq> 0; b \<noteq> 0\<rbrakk> \<Longrightarrow> a / (a * b) = 1 / b" |
307 "\<lbrakk>a \<noteq> 0; b \<noteq> 0\<rbrakk> \<Longrightarrow> a / (a * b) = 1 / b" |
308 using nonzero_mult_divide_mult_cancel_left [of b a 1] by simp |
308 using nonzero_mult_divide_mult_cancel_left [of b a 1] by simp |
309 |
309 |
310 lemma nonzero_mult_divide_mult_cancel_left2 [simp, no_atp]: |
310 lemma nonzero_mult_divide_mult_cancel_left2 [simp]: |
311 "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (c * a) / (b * c) = a / b" |
311 "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (c * a) / (b * c) = a / b" |
312 using nonzero_mult_divide_mult_cancel_left [of b c a] by (simp add: mult_ac) |
312 using nonzero_mult_divide_mult_cancel_left [of b c a] by (simp add: mult_ac) |
313 |
313 |
314 lemma nonzero_mult_divide_mult_cancel_right2 [simp, no_atp]: |
314 lemma nonzero_mult_divide_mult_cancel_right2 [simp]: |
315 "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (a * c) / (c * b) = a / b" |
315 "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (a * c) / (c * b) = a / b" |
316 using nonzero_mult_divide_mult_cancel_right [of b c a] by (simp add: mult_ac) |
316 using nonzero_mult_divide_mult_cancel_right [of b c a] by (simp add: mult_ac) |
317 |
317 |
318 lemma add_divide_eq_iff [field_simps]: |
318 lemma add_divide_eq_iff [field_simps]: |
319 "z \<noteq> 0 \<Longrightarrow> x + y / z = (z * x + y) / z" |
319 "z \<noteq> 0 \<Longrightarrow> x + y / z = (z * x + y) / z" |
381 "c \<noteq> 0 \<Longrightarrow> (a * c) / (b * c) = a / b" |
381 "c \<noteq> 0 \<Longrightarrow> (a * c) / (b * c) = a / b" |
382 apply (cases "b = 0") |
382 apply (cases "b = 0") |
383 apply simp_all |
383 apply simp_all |
384 done |
384 done |
385 |
385 |
386 lemma divide_divide_eq_right [simp, no_atp]: |
386 lemma divide_divide_eq_right [simp]: |
387 "a / (b / c) = (a * c) / b" |
387 "a / (b / c) = (a * c) / b" |
388 by (simp add: divide_inverse mult_ac) |
388 by (simp add: divide_inverse mult_ac) |
389 |
389 |
390 lemma divide_divide_eq_left [simp, no_atp]: |
390 lemma divide_divide_eq_left [simp]: |
391 "(a / b) / c = a / (b * c)" |
391 "(a / b) / c = a / (b * c)" |
392 by (simp add: divide_inverse mult_assoc) |
392 by (simp add: divide_inverse mult_assoc) |
393 |
393 |
394 |
394 |
395 text {*Special Cancellation Simprules for Division*} |
395 text {*Special Cancellation Simprules for Division*} |
396 |
396 |
397 lemma mult_divide_mult_cancel_left_if [simp,no_atp]: |
397 lemma mult_divide_mult_cancel_left_if [simp]: |
398 shows "(c * a) / (c * b) = (if c = 0 then 0 else a / b)" |
398 shows "(c * a) / (c * b) = (if c = 0 then 0 else a / b)" |
399 by (simp add: mult_divide_mult_cancel_left) |
399 by (simp add: mult_divide_mult_cancel_left) |
400 |
400 |
401 |
401 |
402 text {* Division and Unary Minus *} |
402 text {* Division and Unary Minus *} |
403 |
403 |
404 lemma minus_divide_right: |
404 lemma minus_divide_right: |
405 "- (a / b) = a / - b" |
405 "- (a / b) = a / - b" |
406 by (simp add: divide_inverse) |
406 by (simp add: divide_inverse) |
407 |
407 |
408 lemma divide_minus_right [simp, no_atp]: |
408 lemma divide_minus_right [simp]: |
409 "a / - b = - (a / b)" |
409 "a / - b = - (a / b)" |
410 by (simp add: divide_inverse) |
410 by (simp add: divide_inverse) |
411 |
411 |
412 lemma minus_divide_divide: |
412 lemma minus_divide_divide: |
413 "(- a) / (- b) = a / b" |
413 "(- a) / (- b) = a / b" |
425 |
425 |
426 lemma inverse_eq_1_iff [simp]: |
426 lemma inverse_eq_1_iff [simp]: |
427 "inverse x = 1 \<longleftrightarrow> x = 1" |
427 "inverse x = 1 \<longleftrightarrow> x = 1" |
428 by (insert inverse_eq_iff_eq [of x 1], simp) |
428 by (insert inverse_eq_iff_eq [of x 1], simp) |
429 |
429 |
430 lemma divide_eq_0_iff [simp, no_atp]: |
430 lemma divide_eq_0_iff [simp]: |
431 "a / b = 0 \<longleftrightarrow> a = 0 \<or> b = 0" |
431 "a / b = 0 \<longleftrightarrow> a = 0 \<or> b = 0" |
432 by (simp add: divide_inverse) |
432 by (simp add: divide_inverse) |
433 |
433 |
434 lemma divide_cancel_right [simp, no_atp]: |
434 lemma divide_cancel_right [simp]: |
435 "a / c = b / c \<longleftrightarrow> c = 0 \<or> a = b" |
435 "a / c = b / c \<longleftrightarrow> c = 0 \<or> a = b" |
436 apply (cases "c=0", simp) |
436 apply (cases "c=0", simp) |
437 apply (simp add: divide_inverse) |
437 apply (simp add: divide_inverse) |
438 done |
438 done |
439 |
439 |
440 lemma divide_cancel_left [simp, no_atp]: |
440 lemma divide_cancel_left [simp]: |
441 "c / a = c / b \<longleftrightarrow> c = 0 \<or> a = b" |
441 "c / a = c / b \<longleftrightarrow> c = 0 \<or> a = b" |
442 apply (cases "c=0", simp) |
442 apply (cases "c=0", simp) |
443 apply (simp add: divide_inverse) |
443 apply (simp add: divide_inverse) |
444 done |
444 done |
445 |
445 |
446 lemma divide_eq_1_iff [simp, no_atp]: |
446 lemma divide_eq_1_iff [simp]: |
447 "a / b = 1 \<longleftrightarrow> b \<noteq> 0 \<and> a = b" |
447 "a / b = 1 \<longleftrightarrow> b \<noteq> 0 \<and> a = b" |
448 apply (cases "b=0", simp) |
448 apply (cases "b=0", simp) |
449 apply (simp add: right_inverse_eq) |
449 apply (simp add: right_inverse_eq) |
450 done |
450 done |
451 |
451 |
452 lemma one_eq_divide_iff [simp, no_atp]: |
452 lemma one_eq_divide_iff [simp]: |
453 "1 = a / b \<longleftrightarrow> b \<noteq> 0 \<and> a = b" |
453 "1 = a / b \<longleftrightarrow> b \<noteq> 0 \<and> a = b" |
454 by (simp add: eq_commute [of 1]) |
454 by (simp add: eq_commute [of 1]) |
455 |
455 |
456 lemma times_divide_times_eq: |
456 lemma times_divide_times_eq: |
457 "(x / y) * (z / w) = (x * z) / (y * w)" |
457 "(x / y) * (z / w) = (x * z) / (y * w)" |
557 apply (simp add: less_le [of "inverse a"] less_le [of "b"]) |
557 apply (simp add: less_le [of "inverse a"] less_le [of "b"]) |
558 apply (force dest!: inverse_le_imp_le nonzero_inverse_eq_imp_eq) |
558 apply (force dest!: inverse_le_imp_le nonzero_inverse_eq_imp_eq) |
559 done |
559 done |
560 |
560 |
561 text{*Both premises are essential. Consider -1 and 1.*} |
561 text{*Both premises are essential. Consider -1 and 1.*} |
562 lemma inverse_less_iff_less [simp,no_atp]: |
562 lemma inverse_less_iff_less [simp]: |
563 "0 < a \<Longrightarrow> 0 < b \<Longrightarrow> inverse a < inverse b \<longleftrightarrow> b < a" |
563 "0 < a \<Longrightarrow> 0 < b \<Longrightarrow> inverse a < inverse b \<longleftrightarrow> b < a" |
564 by (blast intro: less_imp_inverse_less dest: inverse_less_imp_less) |
564 by (blast intro: less_imp_inverse_less dest: inverse_less_imp_less) |
565 |
565 |
566 lemma le_imp_inverse_le: |
566 lemma le_imp_inverse_le: |
567 "a \<le> b \<Longrightarrow> 0 < a \<Longrightarrow> inverse b \<le> inverse a" |
567 "a \<le> b \<Longrightarrow> 0 < a \<Longrightarrow> inverse b \<le> inverse a" |
568 by (force simp add: le_less less_imp_inverse_less) |
568 by (force simp add: le_less less_imp_inverse_less) |
569 |
569 |
570 lemma inverse_le_iff_le [simp,no_atp]: |
570 lemma inverse_le_iff_le [simp]: |
571 "0 < a \<Longrightarrow> 0 < b \<Longrightarrow> inverse a \<le> inverse b \<longleftrightarrow> b \<le> a" |
571 "0 < a \<Longrightarrow> 0 < b \<Longrightarrow> inverse a \<le> inverse b \<longleftrightarrow> b \<le> a" |
572 by (blast intro: le_imp_inverse_le dest: inverse_le_imp_le) |
572 by (blast intro: le_imp_inverse_le dest: inverse_le_imp_le) |
573 |
573 |
574 |
574 |
575 text{*These results refer to both operands being negative. The opposite-sign |
575 text{*These results refer to both operands being negative. The opposite-sign |
599 apply force |
599 apply force |
600 apply (insert inverse_less_imp_less [of "-b" "-a"]) |
600 apply (insert inverse_less_imp_less [of "-b" "-a"]) |
601 apply (simp add: nonzero_inverse_minus_eq) |
601 apply (simp add: nonzero_inverse_minus_eq) |
602 done |
602 done |
603 |
603 |
604 lemma inverse_less_iff_less_neg [simp,no_atp]: |
604 lemma inverse_less_iff_less_neg [simp]: |
605 "a < 0 \<Longrightarrow> b < 0 \<Longrightarrow> inverse a < inverse b \<longleftrightarrow> b < a" |
605 "a < 0 \<Longrightarrow> b < 0 \<Longrightarrow> inverse a < inverse b \<longleftrightarrow> b < a" |
606 apply (insert inverse_less_iff_less [of "-b" "-a"]) |
606 apply (insert inverse_less_iff_less [of "-b" "-a"]) |
607 apply (simp del: inverse_less_iff_less |
607 apply (simp del: inverse_less_iff_less |
608 add: nonzero_inverse_minus_eq) |
608 add: nonzero_inverse_minus_eq) |
609 done |
609 done |
610 |
610 |
611 lemma le_imp_inverse_le_neg: |
611 lemma le_imp_inverse_le_neg: |
612 "a \<le> b \<Longrightarrow> b < 0 ==> inverse b \<le> inverse a" |
612 "a \<le> b \<Longrightarrow> b < 0 ==> inverse b \<le> inverse a" |
613 by (force simp add: le_less less_imp_inverse_less_neg) |
613 by (force simp add: le_less less_imp_inverse_less_neg) |
614 |
614 |
615 lemma inverse_le_iff_le_neg [simp,no_atp]: |
615 lemma inverse_le_iff_le_neg [simp]: |
616 "a < 0 \<Longrightarrow> b < 0 \<Longrightarrow> inverse a \<le> inverse b \<longleftrightarrow> b \<le> a" |
616 "a < 0 \<Longrightarrow> b < 0 \<Longrightarrow> inverse a \<le> inverse b \<longleftrightarrow> b \<le> a" |
617 by (blast intro: le_imp_inverse_le_neg dest: inverse_le_imp_le_neg) |
617 by (blast intro: le_imp_inverse_le_neg dest: inverse_le_imp_le_neg) |
618 |
618 |
619 lemma one_less_inverse: |
619 lemma one_less_inverse: |
620 "0 < a \<Longrightarrow> a < 1 \<Longrightarrow> 1 < inverse a" |
620 "0 < a \<Longrightarrow> a < 1 \<Longrightarrow> 1 < inverse a" |
711 text{* Lemmas @{text sign_simps} is a first attempt to automate proofs |
711 text{* Lemmas @{text sign_simps} is a first attempt to automate proofs |
712 of positivity/negativity needed for @{text field_simps}. Have not added @{text |
712 of positivity/negativity needed for @{text field_simps}. Have not added @{text |
713 sign_simps} to @{text field_simps} because the former can lead to case |
713 sign_simps} to @{text field_simps} because the former can lead to case |
714 explosions. *} |
714 explosions. *} |
715 |
715 |
716 lemmas sign_simps [no_atp] = algebra_simps |
716 lemmas sign_simps = algebra_simps zero_less_mult_iff mult_less_0_iff |
717 zero_less_mult_iff mult_less_0_iff |
717 |
718 |
718 lemmas (in -) sign_simps = algebra_simps zero_less_mult_iff mult_less_0_iff |
719 lemmas (in -) sign_simps [no_atp] = algebra_simps |
|
720 zero_less_mult_iff mult_less_0_iff |
|
721 |
719 |
722 (* Only works once linear arithmetic is installed: |
720 (* Only works once linear arithmetic is installed: |
723 text{*An example:*} |
721 text{*An example:*} |
724 lemma fixes a b c d e f :: "'a::linordered_field" |
722 lemma fixes a b c d e f :: "'a::linordered_field" |
725 shows "\<lbrakk>a>b; c<d; e<f; 0 < u \<rbrakk> \<Longrightarrow> |
723 shows "\<lbrakk>a>b; c<d; e<f; 0 < u \<rbrakk> \<Longrightarrow> |
996 |
994 |
997 text {* Division and the Number One *} |
995 text {* Division and the Number One *} |
998 |
996 |
999 text{*Simplify expressions equated with 1*} |
997 text{*Simplify expressions equated with 1*} |
1000 |
998 |
1001 lemma zero_eq_1_divide_iff [simp,no_atp]: |
999 lemma zero_eq_1_divide_iff [simp]: |
1002 "(0 = 1/a) = (a = 0)" |
1000 "(0 = 1/a) = (a = 0)" |
1003 apply (cases "a=0", simp) |
1001 apply (cases "a=0", simp) |
1004 apply (auto simp add: nonzero_eq_divide_eq) |
1002 apply (auto simp add: nonzero_eq_divide_eq) |
1005 done |
1003 done |
1006 |
1004 |
1007 lemma one_divide_eq_0_iff [simp,no_atp]: |
1005 lemma one_divide_eq_0_iff [simp]: |
1008 "(1/a = 0) = (a = 0)" |
1006 "(1/a = 0) = (a = 0)" |
1009 apply (cases "a=0", simp) |
1007 apply (cases "a=0", simp) |
1010 apply (insert zero_neq_one [THEN not_sym]) |
1008 apply (insert zero_neq_one [THEN not_sym]) |
1011 apply (auto simp add: nonzero_divide_eq_eq) |
1009 apply (auto simp add: nonzero_divide_eq_eq) |
1012 done |
1010 done |
1013 |
1011 |
1014 text{*Simplify expressions such as @{text "0 < 1/x"} to @{text "0 < x"}*} |
1012 text{*Simplify expressions such as @{text "0 < 1/x"} to @{text "0 < x"}*} |
1015 |
1013 |
1016 lemma zero_le_divide_1_iff [simp, no_atp]: |
1014 lemma zero_le_divide_1_iff [simp]: |
1017 "0 \<le> 1 / a \<longleftrightarrow> 0 \<le> a" |
1015 "0 \<le> 1 / a \<longleftrightarrow> 0 \<le> a" |
1018 by (simp add: zero_le_divide_iff) |
1016 by (simp add: zero_le_divide_iff) |
1019 |
1017 |
1020 lemma zero_less_divide_1_iff [simp, no_atp]: |
1018 lemma zero_less_divide_1_iff [simp]: |
1021 "0 < 1 / a \<longleftrightarrow> 0 < a" |
1019 "0 < 1 / a \<longleftrightarrow> 0 < a" |
1022 by (simp add: zero_less_divide_iff) |
1020 by (simp add: zero_less_divide_iff) |
1023 |
1021 |
1024 lemma divide_le_0_1_iff [simp, no_atp]: |
1022 lemma divide_le_0_1_iff [simp]: |
1025 "1 / a \<le> 0 \<longleftrightarrow> a \<le> 0" |
1023 "1 / a \<le> 0 \<longleftrightarrow> a \<le> 0" |
1026 by (simp add: divide_le_0_iff) |
1024 by (simp add: divide_le_0_iff) |
1027 |
1025 |
1028 lemma divide_less_0_1_iff [simp, no_atp]: |
1026 lemma divide_less_0_1_iff [simp]: |
1029 "1 / a < 0 \<longleftrightarrow> a < 0" |
1027 "1 / a < 0 \<longleftrightarrow> a < 0" |
1030 by (simp add: divide_less_0_iff) |
1028 by (simp add: divide_less_0_iff) |
1031 |
1029 |
1032 lemma divide_right_mono: |
1030 lemma divide_right_mono: |
1033 "[|a \<le> b; 0 \<le> c|] ==> a/c \<le> b/c" |
1031 "[|a \<le> b; 0 \<le> c|] ==> a/c \<le> b/c" |
1078 "a / c < b / c \<longleftrightarrow> (0 < c \<longrightarrow> a < b) \<and> (c < 0 \<longrightarrow> b < a) \<and> c \<noteq> 0" |
1076 "a / c < b / c \<longleftrightarrow> (0 < c \<longrightarrow> a < b) \<and> (c < 0 \<longrightarrow> b < a) \<and> c \<noteq> 0" |
1079 by (auto simp add: divide_inverse mult_less_cancel_right) |
1077 by (auto simp add: divide_inverse mult_less_cancel_right) |
1080 |
1078 |
1081 text{*Simplify quotients that are compared with the value 1.*} |
1079 text{*Simplify quotients that are compared with the value 1.*} |
1082 |
1080 |
1083 lemma le_divide_eq_1 [no_atp]: |
1081 lemma le_divide_eq_1: |
1084 "(1 \<le> b / a) = ((0 < a & a \<le> b) | (a < 0 & b \<le> a))" |
1082 "(1 \<le> b / a) = ((0 < a & a \<le> b) | (a < 0 & b \<le> a))" |
1085 by (auto simp add: le_divide_eq) |
1083 by (auto simp add: le_divide_eq) |
1086 |
1084 |
1087 lemma divide_le_eq_1 [no_atp]: |
1085 lemma divide_le_eq_1: |
1088 "(b / a \<le> 1) = ((0 < a & b \<le> a) | (a < 0 & a \<le> b) | a=0)" |
1086 "(b / a \<le> 1) = ((0 < a & b \<le> a) | (a < 0 & a \<le> b) | a=0)" |
1089 by (auto simp add: divide_le_eq) |
1087 by (auto simp add: divide_le_eq) |
1090 |
1088 |
1091 lemma less_divide_eq_1 [no_atp]: |
1089 lemma less_divide_eq_1: |
1092 "(1 < b / a) = ((0 < a & a < b) | (a < 0 & b < a))" |
1090 "(1 < b / a) = ((0 < a & a < b) | (a < 0 & b < a))" |
1093 by (auto simp add: less_divide_eq) |
1091 by (auto simp add: less_divide_eq) |
1094 |
1092 |
1095 lemma divide_less_eq_1 [no_atp]: |
1093 lemma divide_less_eq_1: |
1096 "(b / a < 1) = ((0 < a & b < a) | (a < 0 & a < b) | a=0)" |
1094 "(b / a < 1) = ((0 < a & b < a) | (a < 0 & a < b) | a=0)" |
1097 by (auto simp add: divide_less_eq) |
1095 by (auto simp add: divide_less_eq) |
1098 |
1096 |
1099 |
1097 |
1100 text {*Conditional Simplification Rules: No Case Splits*} |
1098 text {*Conditional Simplification Rules: No Case Splits*} |
1101 |
1099 |
1102 lemma le_divide_eq_1_pos [simp,no_atp]: |
1100 lemma le_divide_eq_1_pos [simp]: |
1103 "0 < a \<Longrightarrow> (1 \<le> b/a) = (a \<le> b)" |
1101 "0 < a \<Longrightarrow> (1 \<le> b/a) = (a \<le> b)" |
1104 by (auto simp add: le_divide_eq) |
1102 by (auto simp add: le_divide_eq) |
1105 |
1103 |
1106 lemma le_divide_eq_1_neg [simp,no_atp]: |
1104 lemma le_divide_eq_1_neg [simp]: |
1107 "a < 0 \<Longrightarrow> (1 \<le> b/a) = (b \<le> a)" |
1105 "a < 0 \<Longrightarrow> (1 \<le> b/a) = (b \<le> a)" |
1108 by (auto simp add: le_divide_eq) |
1106 by (auto simp add: le_divide_eq) |
1109 |
1107 |
1110 lemma divide_le_eq_1_pos [simp,no_atp]: |
1108 lemma divide_le_eq_1_pos [simp]: |
1111 "0 < a \<Longrightarrow> (b/a \<le> 1) = (b \<le> a)" |
1109 "0 < a \<Longrightarrow> (b/a \<le> 1) = (b \<le> a)" |
1112 by (auto simp add: divide_le_eq) |
1110 by (auto simp add: divide_le_eq) |
1113 |
1111 |
1114 lemma divide_le_eq_1_neg [simp,no_atp]: |
1112 lemma divide_le_eq_1_neg [simp]: |
1115 "a < 0 \<Longrightarrow> (b/a \<le> 1) = (a \<le> b)" |
1113 "a < 0 \<Longrightarrow> (b/a \<le> 1) = (a \<le> b)" |
1116 by (auto simp add: divide_le_eq) |
1114 by (auto simp add: divide_le_eq) |
1117 |
1115 |
1118 lemma less_divide_eq_1_pos [simp,no_atp]: |
1116 lemma less_divide_eq_1_pos [simp]: |
1119 "0 < a \<Longrightarrow> (1 < b/a) = (a < b)" |
1117 "0 < a \<Longrightarrow> (1 < b/a) = (a < b)" |
1120 by (auto simp add: less_divide_eq) |
1118 by (auto simp add: less_divide_eq) |
1121 |
1119 |
1122 lemma less_divide_eq_1_neg [simp,no_atp]: |
1120 lemma less_divide_eq_1_neg [simp]: |
1123 "a < 0 \<Longrightarrow> (1 < b/a) = (b < a)" |
1121 "a < 0 \<Longrightarrow> (1 < b/a) = (b < a)" |
1124 by (auto simp add: less_divide_eq) |
1122 by (auto simp add: less_divide_eq) |
1125 |
1123 |
1126 lemma divide_less_eq_1_pos [simp,no_atp]: |
1124 lemma divide_less_eq_1_pos [simp]: |
1127 "0 < a \<Longrightarrow> (b/a < 1) = (b < a)" |
1125 "0 < a \<Longrightarrow> (b/a < 1) = (b < a)" |
1128 by (auto simp add: divide_less_eq) |
1126 by (auto simp add: divide_less_eq) |
1129 |
1127 |
1130 lemma divide_less_eq_1_neg [simp,no_atp]: |
1128 lemma divide_less_eq_1_neg [simp]: |
1131 "a < 0 \<Longrightarrow> b/a < 1 <-> a < b" |
1129 "a < 0 \<Longrightarrow> b/a < 1 <-> a < b" |
1132 by (auto simp add: divide_less_eq) |
1130 by (auto simp add: divide_less_eq) |
1133 |
1131 |
1134 lemma eq_divide_eq_1 [simp,no_atp]: |
1132 lemma eq_divide_eq_1 [simp]: |
1135 "(1 = b/a) = ((a \<noteq> 0 & a = b))" |
1133 "(1 = b/a) = ((a \<noteq> 0 & a = b))" |
1136 by (auto simp add: eq_divide_eq) |
1134 by (auto simp add: eq_divide_eq) |
1137 |
1135 |
1138 lemma divide_eq_eq_1 [simp,no_atp]: |
1136 lemma divide_eq_eq_1 [simp]: |
1139 "(b/a = 1) = ((a \<noteq> 0 & a = b))" |
1137 "(b/a = 1) = ((a \<noteq> 0 & a = b))" |
1140 by (auto simp add: divide_eq_eq) |
1138 by (auto simp add: divide_eq_eq) |
1141 |
1139 |
1142 lemma abs_inverse [simp]: |
1140 lemma abs_inverse [simp]: |
1143 "\<bar>inverse a\<bar> = |
1141 "\<bar>inverse a\<bar> = |