src/HOL/Ring_and_Field.thy
changeset 14377 f454b3004f8f
parent 14370 b0064703967b
child 14387 e96d5c42c4b0
equal deleted inserted replaced
14376:9fe787a90a48 14377:f454b3004f8f
    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