equal
deleted
inserted
replaced
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") |