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 |