src/HOL/Divides.thy
changeset 26300 03def556e26e
parent 26100 fbc60cd02ae2
child 26748 4d51ddd6aa5c
equal deleted inserted replaced
26299:2f387f5c0f52 26300:03def556e26e
   314   ultimately have "m div n = Suc ((m - n) div n)"
   314   ultimately have "m div n = Suc ((m - n) div n)"
   315     and "m mod n = (m - n) mod n" using m_div_n by simp_all
   315     and "m mod n = (m - n) mod n" using m_div_n by simp_all
   316   then show ?thesis using divmod_div_mod by simp
   316   then show ?thesis using divmod_div_mod by simp
   317 qed
   317 qed
   318 
   318 
   319 text {* The ''recursion´´ equations for @{const div} and @{const mod} *}
   319 text {* The ''recursion'' equations for @{const div} and @{const mod} *}
   320 
   320 
   321 lemma div_less [simp]:
   321 lemma div_less [simp]:
   322   fixes m n :: nat
   322   fixes m n :: nat
   323   assumes "m < n"
   323   assumes "m < n"
   324   shows "m div n = 0"
   324   shows "m div n = 0"
   700 lemma nat_mod_div_trivial [simp]: "m mod n div n = (0 :: nat)"
   700 lemma nat_mod_div_trivial [simp]: "m mod n div n = (0 :: nat)"
   701   by (cases "n = 0") auto
   701   by (cases "n = 0") auto
   702 
   702 
   703 lemma nat_mod_mod_trivial [simp]: "m mod n mod n = (m mod n :: nat)"
   703 lemma nat_mod_mod_trivial [simp]: "m mod n mod n = (m mod n :: nat)"
   704   by (cases "n = 0") auto
   704   by (cases "n = 0") auto
   705 
       
   706 
       
   707 (* Antimonotonicity of div in second argument *)
       
   708 lemma div_le_mono2: "!!m::nat. [| 0<m; m\<le>n |] ==> (k div n) \<le> (k div m)"
       
   709 apply (subgoal_tac "0<n")
       
   710  prefer 2 apply simp
       
   711 apply (induct_tac k rule: nat_less_induct)
       
   712 apply (rename_tac "k")
       
   713 apply (case_tac "k<n", simp)
       
   714 apply (subgoal_tac "~ (k<m) ")
       
   715  prefer 2 apply simp
       
   716 apply (simp add: div_geq)
       
   717 apply (subgoal_tac "(k-n) div n \<le> (k-m) div n")
       
   718  prefer 2
       
   719  apply (blast intro: div_le_mono diff_le_mono2)
       
   720 apply (rule le_trans, simp)
       
   721 apply (simp)
       
   722 done
       
   723 
       
   724 lemma div_le_dividend [simp]: "m div n \<le> (m::nat)"
       
   725 apply (case_tac "n=0", simp)
       
   726 apply (subgoal_tac "m div n \<le> m div 1", simp)
       
   727 apply (rule div_le_mono2)
       
   728 apply (simp_all (no_asm_simp))
       
   729 done
       
   730 
       
   731 (* Similar for "less than" *)
       
   732 lemma div_less_dividend [rule_format]:
       
   733      "!!n::nat. 1<n ==> 0 < m --> m div n < m"
       
   734 apply (induct_tac m rule: nat_less_induct)
       
   735 apply (rename_tac "m")
       
   736 apply (case_tac "m<n", simp)
       
   737 apply (subgoal_tac "0<n")
       
   738  prefer 2 apply simp
       
   739 apply (simp add: div_geq)
       
   740 apply (case_tac "n<m")
       
   741  apply (subgoal_tac "(m-n) div n < (m-n) ")
       
   742   apply (rule impI less_trans_Suc)+
       
   743 apply assumption
       
   744   apply (simp_all)
       
   745 done
       
   746 
       
   747 declare div_less_dividend [simp]
       
   748 
       
   749 text{*A fact for the mutilated chess board*}
       
   750 lemma mod_Suc: "Suc(m) mod n = (if Suc(m mod n) = n then 0 else Suc(m mod n))"
       
   751 apply (case_tac "n=0", simp)
       
   752 apply (induct "m" rule: nat_less_induct)
       
   753 apply (case_tac "Suc (na) <n")
       
   754 (* case Suc(na) < n *)
       
   755 apply (frule lessI [THEN less_trans], simp add: less_not_refl3)
       
   756 (* case n \<le> Suc(na) *)
       
   757 apply (simp add: linorder_not_less le_Suc_eq mod_geq)
       
   758 apply (auto simp add: Suc_diff_le le_mod_geq)
       
   759 done
       
   760 
   705 
   761 
   706 
   762 subsubsection{*The Divides Relation*}
   707 subsubsection{*The Divides Relation*}
   763 
   708 
   764 lemma dvdI [intro?]: "n = m * k ==> m dvd n"
   709 lemma dvdI [intro?]: "n = m * k ==> m dvd n"