src/HOL/Nat.thy
changeset 57514 bdc2c6b40bf2
parent 57512 cc97b347b301
child 57952 1a9a6dfc255f
equal deleted inserted replaced
57513:55b2afc5ddfc 57514:bdc2c6b40bf2
  1073 done
  1073 done
  1074 
  1074 
  1075 lemma add_leE: "(m::nat) + k \<le> n ==> (m \<le> n ==> k \<le> n ==> R) ==> R"
  1075 lemma add_leE: "(m::nat) + k \<le> n ==> (m \<le> n ==> k \<le> n ==> R) ==> R"
  1076 by (blast dest: add_leD1 add_leD2)
  1076 by (blast dest: add_leD1 add_leD2)
  1077 
  1077 
  1078 text {* needs @{text "!!k"} for @{text add_ac} to work *}
  1078 text {* needs @{text "!!k"} for @{text ac_simps} to work *}
  1079 lemma less_add_eq_less: "!!k::nat. k < l ==> m + l = k + n ==> m < n"
  1079 lemma less_add_eq_less: "!!k::nat. k < l ==> m + l = k + n ==> m < n"
  1080 by (force simp del: add_Suc_right
  1080 by (force simp del: add_Suc_right
  1081     simp add: less_iff_Suc_add add_Suc_right [symmetric] add_ac)
  1081     simp add: less_iff_Suc_add add_Suc_right [symmetric] ac_simps)
  1082 
  1082 
  1083 
  1083 
  1084 subsubsection {* More results about difference *}
  1084 subsubsection {* More results about difference *}
  1085 
  1085 
  1086 text {* Addition is the inverse of subtraction:
  1086 text {* Addition is the inverse of subtraction:
  1403 
  1403 
  1404 lemma of_nat_1 [simp]: "of_nat 1 = 1"
  1404 lemma of_nat_1 [simp]: "of_nat 1 = 1"
  1405   by (simp add: of_nat_def)
  1405   by (simp add: of_nat_def)
  1406 
  1406 
  1407 lemma of_nat_add [simp]: "of_nat (m + n) = of_nat m + of_nat n"
  1407 lemma of_nat_add [simp]: "of_nat (m + n) = of_nat m + of_nat n"
  1408   by (induct m) (simp_all add: add_ac)
  1408   by (induct m) (simp_all add: ac_simps)
  1409 
  1409 
  1410 lemma of_nat_mult: "of_nat (m * n) = of_nat m * of_nat n"
  1410 lemma of_nat_mult: "of_nat (m * n) = of_nat m * of_nat n"
  1411   by (induct m) (simp_all add: add_ac distrib_right)
  1411   by (induct m) (simp_all add: ac_simps distrib_right)
  1412 
  1412 
  1413 primrec of_nat_aux :: "('a \<Rightarrow> 'a) \<Rightarrow> nat \<Rightarrow> 'a \<Rightarrow> 'a" where
  1413 primrec of_nat_aux :: "('a \<Rightarrow> 'a) \<Rightarrow> nat \<Rightarrow> 'a \<Rightarrow> 'a" where
  1414   "of_nat_aux inc 0 i = i"
  1414   "of_nat_aux inc 0 i = i"
  1415 | "of_nat_aux inc (Suc n) i = of_nat_aux inc n (inc i)" -- {* tail recursive *}
  1415 | "of_nat_aux inc (Suc n) i = of_nat_aux inc n (inc i)" -- {* tail recursive *}
  1416 
  1416 
  1867   done
  1867   done
  1868 
  1868 
  1869 lemma dvd_mult_cancel: "!!k::nat. [| k*m dvd k*n; 0<k |] ==> m dvd n"
  1869 lemma dvd_mult_cancel: "!!k::nat. [| k*m dvd k*n; 0<k |] ==> m dvd n"
  1870   unfolding dvd_def
  1870   unfolding dvd_def
  1871   apply (erule exE)
  1871   apply (erule exE)
  1872   apply (simp add: mult_ac)
  1872   apply (simp add: ac_simps)
  1873   done
  1873   done
  1874 
  1874 
  1875 lemma dvd_mult_cancel1: "0<m ==> (m*n dvd m) = (n = (1::nat))"
  1875 lemma dvd_mult_cancel1: "0<m ==> (m*n dvd m) = (n = (1::nat))"
  1876   apply auto
  1876   apply auto
  1877    apply (subgoal_tac "m*n dvd m*1")
  1877    apply (subgoal_tac "m*n dvd m*1")