src/HOL/Nat.thy
changeset 28514 da83a614c454
parent 27823 52971512d1a2
child 28562 4e74209f113e
equal deleted inserted replaced
28513:b0b30fd6c264 28514:da83a614c454
   145   by (induct m) simp_all
   145   by (induct m) simp_all
   146 
   146 
   147 lemma add_Suc_right [simp]: "m + Suc n = Suc (m + n)"
   147 lemma add_Suc_right [simp]: "m + Suc n = Suc (m + n)"
   148   by (induct m) simp_all
   148   by (induct m) simp_all
   149 
   149 
       
   150 declare add_0 [code]
       
   151 
   150 lemma add_Suc_shift [code]: "Suc m + n = m + Suc n"
   152 lemma add_Suc_shift [code]: "Suc m + n = m + Suc n"
   151   by simp
   153   by simp
   152 
   154 
   153 primrec minus_nat
   155 primrec minus_nat
   154 where
   156 where
   155   diff_0:     "m - 0 = (m\<Colon>nat)"
   157   diff_0:     "m - 0 = (m\<Colon>nat)"
   156   | diff_Suc: "m - Suc n = (case m - n of 0 => 0 | Suc k => k)"
   158   | diff_Suc: "m - Suc n = (case m - n of 0 => 0 | Suc k => k)"
   157 
   159 
   158 declare diff_Suc [simp del, code del]
   160 declare diff_Suc [simp del]
       
   161 declare diff_0 [code]
   159 
   162 
   160 lemma diff_0_eq_0 [simp, code]: "0 - n = (0::nat)"
   163 lemma diff_0_eq_0 [simp, code]: "0 - n = (0::nat)"
   161   by (induct n) (simp_all add: diff_Suc)
   164   by (induct n) (simp_all add: diff_Suc)
   162 
   165 
   163 lemma diff_Suc_Suc [simp, code]: "Suc m - Suc n = m - n"
   166 lemma diff_Suc_Suc [simp, code]: "Suc m - Suc n = m - n"
   345 
   348 
   346 primrec less_eq_nat where
   349 primrec less_eq_nat where
   347   "(0\<Colon>nat) \<le> n \<longleftrightarrow> True"
   350   "(0\<Colon>nat) \<le> n \<longleftrightarrow> True"
   348   | "Suc m \<le> n \<longleftrightarrow> (case n of 0 \<Rightarrow> False | Suc n \<Rightarrow> m \<le> n)"
   351   | "Suc m \<le> n \<longleftrightarrow> (case n of 0 \<Rightarrow> False | Suc n \<Rightarrow> m \<le> n)"
   349 
   352 
   350 declare less_eq_nat.simps [simp del, code del]
   353 declare less_eq_nat.simps [simp del]
   351 lemma [code]: "(0\<Colon>nat) \<le> n \<longleftrightarrow> True" by (simp add: less_eq_nat.simps)
   354 lemma [code]: "(0\<Colon>nat) \<le> n \<longleftrightarrow> True" by (simp add: less_eq_nat.simps)
   352 lemma le0 [iff]: "0 \<le> (n\<Colon>nat)" by (simp add: less_eq_nat.simps)
   355 lemma le0 [iff]: "0 \<le> (n\<Colon>nat)" by (simp add: less_eq_nat.simps)
   353 
   356 
   354 definition less_nat where
   357 definition less_nat where
   355   less_eq_Suc_le [code func del]: "n < m \<longleftrightarrow> Suc n \<le> m"
   358   less_eq_Suc_le: "n < m \<longleftrightarrow> Suc n \<le> m"
   356 
   359 
   357 lemma Suc_le_mono [iff]: "Suc n \<le> Suc m \<longleftrightarrow> n \<le> m"
   360 lemma Suc_le_mono [iff]: "Suc n \<le> Suc m \<longleftrightarrow> n \<le> m"
   358   by (simp add: less_eq_nat.simps(2))
   361   by (simp add: less_eq_nat.simps(2))
   359 
   362 
   360 lemma Suc_le_eq [code]: "Suc m \<le> n \<longleftrightarrow> m < n"
   363 lemma Suc_le_eq [code]: "Suc m \<le> n \<longleftrightarrow> m < n"
  1159   by (induct m) (simp_all add: add_ac)
  1162   by (induct m) (simp_all add: add_ac)
  1160 
  1163 
  1161 lemma of_nat_mult: "of_nat (m * n) = of_nat m * of_nat n"
  1164 lemma of_nat_mult: "of_nat (m * n) = of_nat m * of_nat n"
  1162   by (induct m) (simp_all add: add_ac left_distrib)
  1165   by (induct m) (simp_all add: add_ac left_distrib)
  1163 
  1166 
  1164 definition
  1167 primrec of_nat_aux :: "('a \<Rightarrow> 'a) \<Rightarrow> nat \<Rightarrow> 'a \<Rightarrow> 'a" where
  1165   of_nat_aux :: "nat \<Rightarrow> 'a \<Rightarrow> 'a"
  1168   "of_nat_aux inc 0 i = i"
  1166 where
  1169   | "of_nat_aux inc (Suc n) i = of_nat_aux inc n (inc i)" -- {* tail recursive *}
  1167   [code func del]: "of_nat_aux n i = of_nat n + i"
  1170 
  1168 
  1171 lemma of_nat_code [code, code unfold, code inline del]:
  1169 lemma of_nat_aux_code [code]:
  1172   "of_nat n = of_nat_aux (\<lambda>i. i + 1) n 0"
  1170   "of_nat_aux 0 i = i"
  1173 proof (induct n)
  1171   "of_nat_aux (Suc n) i = of_nat_aux n (i + 1)" -- {* tail recursive *}
  1174   case 0 then show ?case by simp
  1172   by (simp_all add: of_nat_aux_def add_ac)
  1175 next
  1173 
  1176   case (Suc n)
  1174 lemma of_nat_code [code]:
  1177   have "\<And>i. of_nat_aux (\<lambda>i. i + 1) n (i + 1) = of_nat_aux (\<lambda>i. i + 1) n i + 1"
  1175   "of_nat n = of_nat_aux n 0"
  1178     by (induct n) simp_all
  1176   by (simp add: of_nat_aux_def)
  1179   from this [of 0] have "of_nat_aux (\<lambda>i. i + 1) n 1 = of_nat_aux (\<lambda>i. i + 1) n 0 + 1"
  1177 
  1180     by simp
       
  1181   with Suc show ?case by (simp add: add_commute)
       
  1182 qed
       
  1183     
  1178 end
  1184 end
  1179 
  1185 
  1180 text{*Class for unital semirings with characteristic zero.
  1186 text{*Class for unital semirings with characteristic zero.
  1181  Includes non-ordered rings like the complex numbers.*}
  1187  Includes non-ordered rings like the complex numbers.*}
  1182 
  1188