src/HOL/Fields.thy
changeset 68527 2f4e2aab190a
parent 67969 83c8cafdebe8
child 68547 549a4992222f
equal deleted inserted replaced
68524:f5ca4c2157a5 68527:2f4e2aab190a
   423 text \<open>Calculations with fractions\<close>
   423 text \<open>Calculations with fractions\<close>
   424 
   424 
   425 text\<open>There is a whole bunch of simp-rules just for class \<open>field\<close> but none for class \<open>field\<close> and \<open>nonzero_divides\<close>
   425 text\<open>There is a whole bunch of simp-rules just for class \<open>field\<close> but none for class \<open>field\<close> and \<open>nonzero_divides\<close>
   426 because the latter are covered by a simproc.\<close>
   426 because the latter are covered by a simproc.\<close>
   427 
   427 
   428 lemma mult_divide_mult_cancel_left:
   428 lemmas mult_divide_mult_cancel_left = nonzero_mult_divide_mult_cancel_left
   429   "c \<noteq> 0 \<Longrightarrow> (c * a) / (c * b) = a / b"
   429 
   430 apply (cases "b = 0")
   430 lemmas mult_divide_mult_cancel_right = nonzero_mult_divide_mult_cancel_right
   431 apply simp_all
       
   432 done
       
   433 
       
   434 lemma mult_divide_mult_cancel_right:
       
   435   "c \<noteq> 0 \<Longrightarrow> (a * c) / (b * c) = a / b"
       
   436 apply (cases "b = 0")
       
   437 apply simp_all
       
   438 done
       
   439 
   431 
   440 lemma divide_divide_eq_right [simp]:
   432 lemma divide_divide_eq_right [simp]:
   441   "a / (b / c) = (a * c) / b"
   433   "a / (b / c) = (a * c) / b"
   442   by (simp add: divide_inverse ac_simps)
   434   by (simp add: divide_inverse ac_simps)
   443 
   435 
   466   "a / - b = - (a / b)"
   458   "a / - b = - (a / b)"
   467   by (simp add: divide_inverse)
   459   by (simp add: divide_inverse)
   468 
   460 
   469 lemma minus_divide_divide:
   461 lemma minus_divide_divide:
   470   "(- a) / (- b) = a / b"
   462   "(- a) / (- b) = a / b"
   471 apply (cases "b=0", simp)
   463   by (cases "b=0") (simp_all add: nonzero_minus_divide_divide)
   472 apply (simp add: nonzero_minus_divide_divide)
       
   473 done
       
   474 
   464 
   475 lemma inverse_eq_1_iff [simp]:
   465 lemma inverse_eq_1_iff [simp]:
   476   "inverse x = 1 \<longleftrightarrow> x = 1"
   466   "inverse x = 1 \<longleftrightarrow> x = 1"
   477   by (insert inverse_eq_iff_eq [of x 1], simp)
   467   by (insert inverse_eq_iff_eq [of x 1], simp)
   478 
   468 
   480   "a / b = 0 \<longleftrightarrow> a = 0 \<or> b = 0"
   470   "a / b = 0 \<longleftrightarrow> a = 0 \<or> b = 0"
   481   by (simp add: divide_inverse)
   471   by (simp add: divide_inverse)
   482 
   472 
   483 lemma divide_cancel_right [simp]:
   473 lemma divide_cancel_right [simp]:
   484   "a / c = b / c \<longleftrightarrow> c = 0 \<or> a = b"
   474   "a / c = b / c \<longleftrightarrow> c = 0 \<or> a = b"
   485   apply (cases "c=0", simp)
   475   by (cases "c=0") (simp_all add: divide_inverse)
   486   apply (simp add: divide_inverse)
       
   487   done
       
   488 
   476 
   489 lemma divide_cancel_left [simp]:
   477 lemma divide_cancel_left [simp]:
   490   "c / a = c / b \<longleftrightarrow> c = 0 \<or> a = b"
   478   "c / a = c / b \<longleftrightarrow> c = 0 \<or> a = b"
   491   apply (cases "c=0", simp)
   479   by (cases "c=0") (simp_all add: divide_inverse)
   492   apply (simp add: divide_inverse)
       
   493   done
       
   494 
   480 
   495 lemma divide_eq_1_iff [simp]:
   481 lemma divide_eq_1_iff [simp]:
   496   "a / b = 1 \<longleftrightarrow> b \<noteq> 0 \<and> a = b"
   482   "a / b = 1 \<longleftrightarrow> b \<noteq> 0 \<and> a = b"
   497   apply (cases "b=0", simp)
   483   by (cases "b=0") (simp_all add: right_inverse_eq)
   498   apply (simp add: right_inverse_eq)
       
   499   done
       
   500 
   484 
   501 lemma one_eq_divide_iff [simp]:
   485 lemma one_eq_divide_iff [simp]:
   502   "1 = a / b \<longleftrightarrow> b \<noteq> 0 \<and> a = b"
   486   "1 = a / b \<longleftrightarrow> b \<noteq> 0 \<and> a = b"
   503   by (simp add: eq_commute [of 1])
   487   by (simp add: eq_commute [of 1])
   504 
   488 
   519   by (simp add: add_divide_distrib add.commute)
   503   by (simp add: add_divide_distrib add.commute)
   520 
   504 
   521 lemma dvd_field_iff:
   505 lemma dvd_field_iff:
   522   "a dvd b \<longleftrightarrow> (a = 0 \<longrightarrow> b = 0)"
   506   "a dvd b \<longleftrightarrow> (a = 0 \<longrightarrow> b = 0)"
   523 proof (cases "a = 0")
   507 proof (cases "a = 0")
   524   case True
       
   525   then show ?thesis
       
   526     by simp
       
   527 next
       
   528   case False
   508   case False
   529   then have "b = a * (b / a)"
   509   then have "b = a * (b / a)"
   530     by (simp add: field_simps)
   510     by (simp add: field_simps)
   531   then have "a dvd b" ..
   511   then have "a dvd b" ..
   532   with False show ?thesis
   512   with False show ?thesis
   533     by simp
   513     by simp
   534 qed
   514 qed simp
   535 
   515 
   536 end
   516 end
   537 
   517 
   538 class field_char_0 = field + ring_char_0
   518 class field_char_0 = field + ring_char_0
   539 
   519