92 lemma add_right_cancel [simp]: |
92 lemma add_right_cancel [simp]: |
93 "(b + a = c + a) = (b = (c::'a::semiring))" |
93 "(b + a = c + a) = (b = (c::'a::semiring))" |
94 by (simp add: add_commute) |
94 by (simp add: add_commute) |
95 |
95 |
96 lemma minus_minus [simp]: "- (- (a::'a::ring)) = a" |
96 lemma minus_minus [simp]: "- (- (a::'a::ring)) = a" |
97 proof (rule add_left_cancel [of "-a", THEN iffD1]) |
97 proof (rule add_left_cancel [of "-a", THEN iffD1]) |
98 show "(-a + -(-a) = -a + a)" |
98 show "(-a + -(-a) = -a + a)" |
99 by simp |
99 by simp |
100 qed |
100 qed |
101 |
101 |
102 lemma equals_zero_I: "a+b = 0 ==> -a = (b::'a::ring)" |
102 lemma equals_zero_I: "a+b = 0 ==> -a = (b::'a::ring)" |
103 apply (rule right_minus_eq [THEN iffD1, symmetric]) |
103 apply (rule right_minus_eq [THEN iffD1, symmetric]) |
104 apply (simp add: diff_minus add_commute) |
104 apply (simp add: diff_minus add_commute) |
105 done |
105 done |
118 |
118 |
119 lemma diff_minus_eq_add [simp]: "a - - b = a + (b::'a::ring)" |
119 lemma diff_minus_eq_add [simp]: "a - - b = a + (b::'a::ring)" |
120 by (simp add: diff_minus) |
120 by (simp add: diff_minus) |
121 |
121 |
122 lemma neg_equal_iff_equal [simp]: "(-a = -b) = (a = (b::'a::ring))" |
122 lemma neg_equal_iff_equal [simp]: "(-a = -b) = (a = (b::'a::ring))" |
123 proof |
123 proof |
124 assume "- a = - b" |
124 assume "- a = - b" |
125 hence "- (- a) = - (- b)" |
125 hence "- (- a) = - (- b)" |
126 by simp |
126 by simp |
127 thus "a=b" by simp |
127 thus "a=b" by simp |
128 next |
128 next |
129 assume "a=b" |
129 assume "a=b" |
130 thus "-a = -b" by simp |
130 thus "-a = -b" by simp |
131 qed |
131 qed |
132 |
132 |
133 lemma neg_equal_0_iff_equal [simp]: "(-a = 0) = (a = (0::'a::ring))" |
133 lemma neg_equal_0_iff_equal [simp]: "(-a = 0) = (a = (0::'a::ring))" |
134 by (subst neg_equal_iff_equal [symmetric], simp) |
134 by (subst neg_equal_iff_equal [symmetric], simp) |
135 |
135 |
136 lemma neg_0_equal_iff_equal [simp]: "(0 = -a) = (0 = (a::'a::ring))" |
136 lemma neg_0_equal_iff_equal [simp]: "(0 = -a) = (0 = (a::'a::ring))" |
137 by (subst neg_equal_iff_equal [symmetric], simp) |
137 by (subst neg_equal_iff_equal [symmetric], simp) |
138 |
138 |
139 text{*The next two equations can make the simplifier loop!*} |
139 text{*The next two equations can make the simplifier loop!*} |
140 |
140 |
141 lemma equation_minus_iff: "(a = - b) = (b = - (a::'a::ring))" |
141 lemma equation_minus_iff: "(a = - b) = (b = - (a::'a::ring))" |
142 proof - |
142 proof - |
143 have "(- (-a) = - b) = (- a = b)" by (rule neg_equal_iff_equal) |
143 have "(- (-a) = - b) = (- a = b)" by (rule neg_equal_iff_equal) |
144 thus ?thesis by (simp add: eq_commute) |
144 thus ?thesis by (simp add: eq_commute) |
145 qed |
145 qed |
146 |
146 |
147 lemma minus_equation_iff: "(- a = b) = (- (b::'a::ring) = a)" |
147 lemma minus_equation_iff: "(- a = b) = (- (b::'a::ring) = a)" |
148 proof - |
148 proof - |
149 have "(- a = - (-b)) = (a = -b)" by (rule neg_equal_iff_equal) |
149 have "(- a = - (-b)) = (a = -b)" by (rule neg_equal_iff_equal) |
150 thus ?thesis by (simp add: eq_commute) |
150 thus ?thesis by (simp add: eq_commute) |
151 qed |
151 qed |
152 |
152 |
153 |
153 |
154 subsection {* Derived rules for multiplication *} |
154 subsection {* Derived rules for multiplication *} |
155 |
155 |
156 lemma mult_1_right [simp]: "a * (1::'a::semiring) = a" |
156 lemma mult_1_right [simp]: "a * (1::'a::semiring) = a" |
261 apply (erule add_strict_left_mono) |
261 apply (erule add_strict_left_mono) |
262 done |
262 done |
263 |
263 |
264 lemma add_less_imp_less_left: |
264 lemma add_less_imp_less_left: |
265 assumes less: "c + a < c + b" shows "a < (b::'a::ordered_semiring)" |
265 assumes less: "c + a < c + b" shows "a < (b::'a::ordered_semiring)" |
266 proof (rule ccontr) |
266 proof (rule ccontr) |
267 assume "~ a < b" |
267 assume "~ a < b" |
268 hence "b \<le> a" by (simp add: linorder_not_less) |
268 hence "b \<le> a" by (simp add: linorder_not_less) |
269 hence "c+b \<le> c+a" by (rule add_left_mono) |
269 hence "c+b \<le> c+a" by (rule add_left_mono) |
270 with this and less show False |
270 with this and less show False |
271 by (simp add: linorder_not_less [symmetric]) |
271 by (simp add: linorder_not_less [symmetric]) |
272 qed |
272 qed |
273 |
273 |
274 lemma add_less_imp_less_right: |
274 lemma add_less_imp_less_right: |
275 "a + c < b + c ==> a < (b::'a::ordered_semiring)" |
275 "a + c < b + c ==> a < (b::'a::ordered_semiring)" |
276 apply (rule add_less_imp_less_left [of c]) |
276 apply (rule add_less_imp_less_left [of c]) |
277 apply (simp add: add_commute) |
277 apply (simp add: add_commute) |
304 |
304 |
305 subsection {* Ordering Rules for Unary Minus *} |
305 subsection {* Ordering Rules for Unary Minus *} |
306 |
306 |
307 lemma le_imp_neg_le: |
307 lemma le_imp_neg_le: |
308 assumes "a \<le> (b::'a::ordered_ring)" shows "-b \<le> -a" |
308 assumes "a \<le> (b::'a::ordered_ring)" shows "-b \<le> -a" |
309 proof - |
309 proof - |
310 have "-a+a \<le> -a+b" |
310 have "-a+a \<le> -a+b" |
311 by (rule add_left_mono) |
311 by (rule add_left_mono) |
312 hence "0 \<le> -a+b" |
312 hence "0 \<le> -a+b" |
313 by simp |
313 by simp |
314 hence "0 + (-b) \<le> (-a + b) + (-b)" |
314 hence "0 + (-b) \<le> (-a + b) + (-b)" |
315 by (rule add_right_mono) |
315 by (rule add_right_mono) |
316 thus ?thesis |
316 thus ?thesis |
317 by (simp add: add_assoc) |
317 by (simp add: add_assoc) |
318 qed |
318 qed |
319 |
319 |
320 lemma neg_le_iff_le [simp]: "(-b \<le> -a) = (a \<le> (b::'a::ordered_ring))" |
320 lemma neg_le_iff_le [simp]: "(-b \<le> -a) = (a \<le> (b::'a::ordered_ring))" |
321 proof |
321 proof |
322 assume "- b \<le> - a" |
322 assume "- b \<le> - a" |
323 hence "- (- a) \<le> - (- b)" |
323 hence "- (- a) \<le> - (- b)" |
324 by (rule le_imp_neg_le) |
324 by (rule le_imp_neg_le) |
325 thus "a\<le>b" by simp |
325 thus "a\<le>b" by simp |
326 next |
326 next |
327 assume "a\<le>b" |
327 assume "a\<le>b" |
328 thus "-b \<le> -a" by (rule le_imp_neg_le) |
328 thus "-b \<le> -a" by (rule le_imp_neg_le) |
329 qed |
329 qed |
330 |
330 |
331 lemma neg_le_0_iff_le [simp]: "(-a \<le> 0) = (0 \<le> (a::'a::ordered_ring))" |
331 lemma neg_le_0_iff_le [simp]: "(-a \<le> 0) = (0 \<le> (a::'a::ordered_ring))" |
332 by (subst neg_le_iff_le [symmetric], simp) |
332 by (subst neg_le_iff_le [symmetric], simp) |
333 |
333 |
334 lemma neg_0_le_iff_le [simp]: "(0 \<le> -a) = (a \<le> (0::'a::ordered_ring))" |
334 lemma neg_0_le_iff_le [simp]: "(0 \<le> -a) = (a \<le> (0::'a::ordered_ring))" |
344 by (subst neg_less_iff_less [symmetric], simp) |
344 by (subst neg_less_iff_less [symmetric], simp) |
345 |
345 |
346 text{*The next several equations can make the simplifier loop!*} |
346 text{*The next several equations can make the simplifier loop!*} |
347 |
347 |
348 lemma less_minus_iff: "(a < - b) = (b < - (a::'a::ordered_ring))" |
348 lemma less_minus_iff: "(a < - b) = (b < - (a::'a::ordered_ring))" |
349 proof - |
349 proof - |
350 have "(- (-a) < - b) = (b < - a)" by (rule neg_less_iff_less) |
350 have "(- (-a) < - b) = (b < - a)" by (rule neg_less_iff_less) |
351 thus ?thesis by simp |
351 thus ?thesis by simp |
352 qed |
352 qed |
353 |
353 |
354 lemma minus_less_iff: "(- a < b) = (- b < (a::'a::ordered_ring))" |
354 lemma minus_less_iff: "(- a < b) = (- b < (a::'a::ordered_ring))" |
355 proof - |
355 proof - |
356 have "(- a < - (-b)) = (- b < a)" by (rule neg_less_iff_less) |
356 have "(- a < - (-b)) = (- b < a)" by (rule neg_less_iff_less) |
357 thus ?thesis by simp |
357 thus ?thesis by simp |
358 qed |
358 qed |
359 |
359 |
360 lemma le_minus_iff: "(a \<le> - b) = (b \<le> - (a::'a::ordered_ring))" |
360 lemma le_minus_iff: "(a \<le> - b) = (b \<le> - (a::'a::ordered_ring))" |
361 apply (simp add: linorder_not_less [symmetric]) |
361 apply (simp add: linorder_not_less [symmetric]) |
362 apply (rule minus_less_iff) |
362 apply (rule minus_less_iff) |
363 done |
363 done |
643 by (simp add: mult_commute [of c] mult_le_cancel_right) |
643 by (simp add: mult_commute [of c] mult_le_cancel_right) |
644 |
644 |
645 lemma mult_less_imp_less_left: |
645 lemma mult_less_imp_less_left: |
646 assumes less: "c*a < c*b" and nonneg: "0 \<le> c" |
646 assumes less: "c*a < c*b" and nonneg: "0 \<le> c" |
647 shows "a < (b::'a::ordered_semiring)" |
647 shows "a < (b::'a::ordered_semiring)" |
648 proof (rule ccontr) |
648 proof (rule ccontr) |
649 assume "~ a < b" |
649 assume "~ a < b" |
650 hence "b \<le> a" by (simp add: linorder_not_less) |
650 hence "b \<le> a" by (simp add: linorder_not_less) |
651 hence "c*b \<le> c*a" by (rule mult_left_mono) |
651 hence "c*b \<le> c*a" by (rule mult_left_mono) |
652 with this and less show False |
652 with this and less show False |
653 by (simp add: linorder_not_less [symmetric]) |
653 by (simp add: linorder_not_less [symmetric]) |
654 qed |
654 qed |
655 |
655 |
656 lemma mult_less_imp_less_right: |
656 lemma mult_less_imp_less_right: |
657 "[|a*c < b*c; 0 \<le> c|] ==> a < (b::'a::ordered_semiring)" |
657 "[|a*c < b*c; 0 \<le> c|] ==> a < (b::'a::ordered_semiring)" |
658 by (rule mult_less_imp_less_left, simp add: mult_commute) |
658 by (rule mult_less_imp_less_left, simp add: mult_commute) |
659 |
659 |
721 done |
721 done |
722 |
722 |
723 text{*Compared with @{text mult_eq_0_iff}, this version removes the requirement |
723 text{*Compared with @{text mult_eq_0_iff}, this version removes the requirement |
724 of an ordering.*} |
724 of an ordering.*} |
725 lemma field_mult_eq_0_iff [simp]: "(a*b = (0::'a::field)) = (a = 0 | b = 0)" |
725 lemma field_mult_eq_0_iff [simp]: "(a*b = (0::'a::field)) = (a = 0 | b = 0)" |
726 proof cases |
726 proof cases |
727 assume "a=0" thus ?thesis by simp |
727 assume "a=0" thus ?thesis by simp |
728 next |
728 next |
729 assume anz [simp]: "a\<noteq>0" |
729 assume anz [simp]: "a\<noteq>0" |
730 thus ?thesis |
730 { assume "a * b = 0" |
731 proof auto |
731 hence "inverse a * (a * b) = 0" by simp |
732 assume "a * b = 0" |
732 hence "b = 0" by (simp (no_asm_use) add: mult_assoc [symmetric])} |
733 hence "inverse a * (a * b) = 0" by simp |
733 thus ?thesis by force |
734 thus "b = 0" by (simp (no_asm_use) add: mult_assoc [symmetric]) |
734 qed |
735 qed |
|
736 qed |
|
737 |
735 |
738 text{*Cancellation of equalities with a common factor*} |
736 text{*Cancellation of equalities with a common factor*} |
739 lemma field_mult_cancel_right_lemma: |
737 lemma field_mult_cancel_right_lemma: |
740 assumes cnz: "c \<noteq> (0::'a::field)" |
738 assumes cnz: "c \<noteq> (0::'a::field)" |
741 and eq: "a*c = b*c" |
739 and eq: "a*c = b*c" |
742 shows "a=b" |
740 shows "a=b" |
743 proof - |
741 proof - |
744 have "(a * c) * inverse c = (b * c) * inverse c" |
742 have "(a * c) * inverse c = (b * c) * inverse c" |
745 by (simp add: eq) |
743 by (simp add: eq) |
746 thus "a=b" |
744 thus "a=b" |
747 by (simp add: mult_assoc cnz) |
745 by (simp add: mult_assoc cnz) |
748 qed |
746 qed |
749 |
747 |
750 lemma field_mult_cancel_right [simp]: |
748 lemma field_mult_cancel_right [simp]: |
751 "(a*c = b*c) = (c = (0::'a::field) | a=b)" |
749 "(a*c = b*c) = (c = (0::'a::field) | a=b)" |
752 proof cases |
750 proof cases |
753 assume "c=0" thus ?thesis by simp |
751 assume "c=0" thus ?thesis by simp |
754 next |
752 next |
755 assume "c\<noteq>0" |
753 assume "c\<noteq>0" |
756 thus ?thesis by (force dest: field_mult_cancel_right_lemma) |
754 thus ?thesis by (force dest: field_mult_cancel_right_lemma) |
757 qed |
755 qed |
758 |
756 |
759 lemma field_mult_cancel_left [simp]: |
757 lemma field_mult_cancel_left [simp]: |
760 "(c*a = c*b) = (c = (0::'a::field) | a=b)" |
758 "(c*a = c*b) = (c = (0::'a::field) | a=b)" |
761 by (simp add: mult_commute [of c] field_mult_cancel_right) |
759 by (simp add: mult_commute [of c] field_mult_cancel_right) |
762 |
760 |
763 lemma nonzero_imp_inverse_nonzero: "a \<noteq> 0 ==> inverse a \<noteq> (0::'a::field)" |
761 lemma nonzero_imp_inverse_nonzero: "a \<noteq> 0 ==> inverse a \<noteq> (0::'a::field)" |
764 proof |
762 proof |
765 assume ianz: "inverse a = 0" |
763 assume ianz: "inverse a = 0" |
766 assume "a \<noteq> 0" |
764 assume "a \<noteq> 0" |
767 hence "1 = a * inverse a" by simp |
765 hence "1 = a * inverse a" by simp |
768 also have "... = 0" by (simp add: ianz) |
766 also have "... = 0" by (simp add: ianz) |
769 finally have "1 = (0::'a::field)" . |
767 finally have "1 = (0::'a::field)" . |
770 thus False by (simp add: eq_commute) |
768 thus False by (simp add: eq_commute) |
771 qed |
769 qed |
772 |
770 |
773 |
771 |
774 subsection{*Basic Properties of @{term inverse}*} |
772 subsection{*Basic Properties of @{term inverse}*} |
775 |
773 |
776 lemma inverse_zero_imp_zero: "inverse a = 0 ==> a = (0::'a::field)" |
774 lemma inverse_zero_imp_zero: "inverse a = 0 ==> a = (0::'a::field)" |
788 "(inverse a = 0) = (a = (0::'a::{field,division_by_zero}))" |
786 "(inverse a = 0) = (a = (0::'a::{field,division_by_zero}))" |
789 by (force dest: inverse_nonzero_imp_nonzero) |
787 by (force dest: inverse_nonzero_imp_nonzero) |
790 |
788 |
791 lemma nonzero_inverse_minus_eq: |
789 lemma nonzero_inverse_minus_eq: |
792 assumes [simp]: "a\<noteq>0" shows "inverse(-a) = -inverse(a::'a::field)" |
790 assumes [simp]: "a\<noteq>0" shows "inverse(-a) = -inverse(a::'a::field)" |
793 proof - |
791 proof - |
794 have "-a * inverse (- a) = -a * - inverse a" |
792 have "-a * inverse (- a) = -a * - inverse a" |
795 by simp |
793 by simp |
796 thus ?thesis |
794 thus ?thesis |
797 by (simp only: field_mult_cancel_left, simp) |
795 by (simp only: field_mult_cancel_left, simp) |
798 qed |
796 qed |
799 |
797 |
800 lemma inverse_minus_eq [simp]: |
798 lemma inverse_minus_eq [simp]: |
801 "inverse(-a) = -inverse(a::'a::{field,division_by_zero})"; |
799 "inverse(-a) = -inverse(a::'a::{field,division_by_zero})"; |
802 proof cases |
800 proof cases |
803 assume "a=0" thus ?thesis by (simp add: inverse_zero) |
801 assume "a=0" thus ?thesis by (simp add: inverse_zero) |
804 next |
802 next |
805 assume "a\<noteq>0" |
803 assume "a\<noteq>0" |
806 thus ?thesis by (simp add: nonzero_inverse_minus_eq) |
804 thus ?thesis by (simp add: nonzero_inverse_minus_eq) |
807 qed |
805 qed |
808 |
806 |
809 lemma nonzero_inverse_eq_imp_eq: |
807 lemma nonzero_inverse_eq_imp_eq: |
810 assumes inveq: "inverse a = inverse b" |
808 assumes inveq: "inverse a = inverse b" |
811 and anz: "a \<noteq> 0" |
809 and anz: "a \<noteq> 0" |
812 and bnz: "b \<noteq> 0" |
810 and bnz: "b \<noteq> 0" |
813 shows "a = (b::'a::field)" |
811 shows "a = (b::'a::field)" |
814 proof - |
812 proof - |
815 have "a * inverse b = a * inverse a" |
813 have "a * inverse b = a * inverse a" |
816 by (simp add: inveq) |
814 by (simp add: inveq) |
817 hence "(a * inverse b) * b = (a * inverse a) * b" |
815 hence "(a * inverse b) * b = (a * inverse a) * b" |
818 by simp |
816 by simp |
819 thus "a = b" |
817 thus "a = b" |
820 by (simp add: mult_assoc anz bnz) |
818 by (simp add: mult_assoc anz bnz) |
821 qed |
819 qed |
822 |
820 |
823 lemma inverse_eq_imp_eq: |
821 lemma inverse_eq_imp_eq: |
824 "inverse a = inverse b ==> a = (b::'a::{field,division_by_zero})" |
822 "inverse a = inverse b ==> a = (b::'a::{field,division_by_zero})" |
825 apply (case_tac "a=0 | b=0") |
823 apply (case_tac "a=0 | b=0") |
826 apply (force dest!: inverse_zero_imp_zero |
824 apply (force dest!: inverse_zero_imp_zero |