1 (* Title: HOL/Library/Nat_Infinity.thy |
1 (* Title: HOL/Library/Nat_Infinity.thy |
2 Author: David von Oheimb, TU Muenchen; Florian Haftmann, TU Muenchen |
2 Author: David von Oheimb, TU Muenchen; Florian Haftmann, TU Muenchen |
|
3 Contributions: David Trachtenherz, TU Muenchen |
3 *) |
4 *) |
4 |
5 |
5 header {* Natural numbers with infinity *} |
6 header {* Natural numbers with infinity *} |
6 |
7 |
7 theory Nat_Infinity |
8 theory Nat_Infinity |
166 by (cases n) (simp_all add: iSuc_Fin one_inat_def) |
167 by (cases n) (simp_all add: iSuc_Fin one_inat_def) |
167 |
168 |
168 lemma plus_1_iSuc: |
169 lemma plus_1_iSuc: |
169 "1 + q = iSuc q" |
170 "1 + q = iSuc q" |
170 "q + 1 = iSuc q" |
171 "q + 1 = iSuc q" |
171 unfolding iSuc_plus_1 by (simp_all add: add_ac) |
172 by (simp_all add: iSuc_plus_1 add_ac) |
172 |
173 |
|
174 lemma iadd_Suc: "iSuc m + n = iSuc (m + n)" |
|
175 by (simp_all add: iSuc_plus_1 add_ac) |
|
176 |
|
177 lemma iadd_Suc_right: "m + iSuc n = iSuc (m + n)" |
|
178 by (simp only: add_commute[of m] iadd_Suc) |
|
179 |
|
180 lemma iadd_is_0: "(m + n = (0::inat)) = (m = 0 \<and> n = 0)" |
|
181 by (cases m, cases n, simp_all add: zero_inat_def) |
173 |
182 |
174 subsection {* Multiplication *} |
183 subsection {* Multiplication *} |
175 |
184 |
176 instantiation inat :: comm_semiring_1 |
185 instantiation inat :: comm_semiring_1 |
177 begin |
186 begin |
230 instance inat :: semiring_char_0 proof |
239 instance inat :: semiring_char_0 proof |
231 have "inj Fin" by (rule injI) simp |
240 have "inj Fin" by (rule injI) simp |
232 then show "inj (\<lambda>n. of_nat n :: inat)" by (simp add: of_nat_eq_Fin) |
241 then show "inj (\<lambda>n. of_nat n :: inat)" by (simp add: of_nat_eq_Fin) |
233 qed |
242 qed |
234 |
243 |
|
244 lemma imult_is_0[simp]: "((m::inat) * n = 0) = (m = 0 \<or> n = 0)" |
|
245 by(auto simp add: times_inat_def zero_inat_def split: inat.split) |
|
246 |
|
247 lemma imult_is_Infty: "((a::inat) * b = \<infinity>) = (a = \<infinity> \<and> b \<noteq> 0 \<or> b = \<infinity> \<and> a \<noteq> 0)" |
|
248 by(auto simp add: times_inat_def zero_inat_def split: inat.split) |
|
249 |
|
250 |
|
251 subsection {* Subtraction *} |
|
252 |
|
253 instantiation inat :: minus |
|
254 begin |
|
255 |
|
256 definition diff_inat_def: |
|
257 "a - b = (case a of (Fin x) \<Rightarrow> (case b of (Fin y) \<Rightarrow> Fin (x - y) | \<infinity> \<Rightarrow> 0) |
|
258 | \<infinity> \<Rightarrow> \<infinity>)" |
|
259 |
|
260 instance .. |
|
261 |
|
262 end |
|
263 |
|
264 lemma idiff_Fin_Fin[simp,code]: "Fin a - Fin b = Fin (a - b)" |
|
265 by(simp add: diff_inat_def) |
|
266 |
|
267 lemma idiff_Infty[simp,code]: "\<infinity> - n = \<infinity>" |
|
268 by(simp add: diff_inat_def) |
|
269 |
|
270 lemma idiff_Infty_right[simp,code]: "Fin a - \<infinity> = 0" |
|
271 by(simp add: diff_inat_def) |
|
272 |
|
273 lemma idiff_0[simp]: "(0::inat) - n = 0" |
|
274 by (cases n, simp_all add: zero_inat_def) |
|
275 |
|
276 lemmas idiff_Fin_0[simp] = idiff_0[unfolded zero_inat_def] |
|
277 |
|
278 lemma idiff_0_right[simp]: "(n::inat) - 0 = n" |
|
279 by (cases n) (simp_all add: zero_inat_def) |
|
280 |
|
281 lemmas idiff_Fin_0_right[simp] = idiff_0_right[unfolded zero_inat_def] |
|
282 |
|
283 lemma idiff_self[simp]: "n \<noteq> \<infinity> \<Longrightarrow> (n::inat) - n = 0" |
|
284 by(auto simp: zero_inat_def) |
|
285 |
|
286 (*lemmas idiff_self_eq_0_Fin = idiff_self_eq_0[unfolded zero_inat_def]*) |
|
287 |
235 |
288 |
236 subsection {* Ordering *} |
289 subsection {* Ordering *} |
237 |
290 |
238 instantiation inat :: linordered_ab_semigroup_add |
291 instantiation inat :: linordered_ab_semigroup_add |
239 begin |
292 begin |
284 by (simp_all add: number_of_inat_def) |
337 by (simp_all add: number_of_inat_def) |
285 |
338 |
286 lemma i0_lb [simp]: "(0\<Colon>inat) \<le> n" |
339 lemma i0_lb [simp]: "(0\<Colon>inat) \<le> n" |
287 by (simp add: zero_inat_def less_eq_inat_def split: inat.splits) |
340 by (simp add: zero_inat_def less_eq_inat_def split: inat.splits) |
288 |
341 |
289 lemma i0_neq [simp]: "n \<le> (0\<Colon>inat) \<longleftrightarrow> n = 0" |
342 lemma ile0_eq [simp]: "n \<le> (0\<Colon>inat) \<longleftrightarrow> n = 0" |
290 by (simp add: zero_inat_def less_eq_inat_def split: inat.splits) |
343 by (simp add: zero_inat_def less_eq_inat_def split: inat.splits) |
291 |
344 |
292 lemma Infty_ileE [elim!]: "\<infinity> \<le> Fin m \<Longrightarrow> R" |
345 lemma Infty_ileE [elim!]: "\<infinity> \<le> Fin m \<Longrightarrow> R" |
293 by (simp add: zero_inat_def less_eq_inat_def split: inat.splits) |
346 by (simp add: zero_inat_def less_eq_inat_def split: inat.splits) |
294 |
347 |
295 lemma Infty_ilessE [elim!]: "\<infinity> < Fin m \<Longrightarrow> R" |
348 lemma Infty_ilessE [elim!]: "\<infinity> < Fin m \<Longrightarrow> R" |
296 by simp |
349 by simp |
297 |
350 |
298 lemma not_ilessi0 [simp]: "\<not> n < (0\<Colon>inat)" |
351 lemma not_iless0 [simp]: "\<not> n < (0\<Colon>inat)" |
299 by (simp add: zero_inat_def less_inat_def split: inat.splits) |
352 by (simp add: zero_inat_def less_inat_def split: inat.splits) |
300 |
353 |
301 lemma i0_eq [simp]: "(0\<Colon>inat) < n \<longleftrightarrow> n \<noteq> 0" |
354 lemma i0_less [simp]: "(0\<Colon>inat) < n \<longleftrightarrow> n \<noteq> 0" |
302 by (simp add: zero_inat_def less_inat_def split: inat.splits) |
355 by (simp add: zero_inat_def less_inat_def split: inat.splits) |
303 |
356 |
304 lemma iSuc_ile_mono [simp]: "iSuc n \<le> iSuc m \<longleftrightarrow> n \<le> m" |
357 lemma iSuc_ile_mono [simp]: "iSuc n \<le> iSuc m \<longleftrightarrow> n \<le> m" |
305 by (simp add: iSuc_def less_eq_inat_def split: inat.splits) |
358 by (simp add: iSuc_def less_eq_inat_def split: inat.splits) |
306 |
359 |
307 lemma iSuc_mono [simp]: "iSuc n < iSuc m \<longleftrightarrow> n < m" |
360 lemma iSuc_mono [simp]: "iSuc n < iSuc m \<longleftrightarrow> n < m" |
314 by (simp add: zero_inat_def iSuc_def less_eq_inat_def split: inat.splits) |
367 by (simp add: zero_inat_def iSuc_def less_eq_inat_def split: inat.splits) |
315 |
368 |
316 lemma i0_iless_iSuc [simp]: "0 < iSuc n" |
369 lemma i0_iless_iSuc [simp]: "0 < iSuc n" |
317 by (simp add: zero_inat_def iSuc_def less_inat_def split: inat.splits) |
370 by (simp add: zero_inat_def iSuc_def less_inat_def split: inat.splits) |
318 |
371 |
|
372 lemma iless_iSuc0[simp]: "(n < iSuc 0) = (n = 0)" |
|
373 by (simp add: zero_inat_def iSuc_def less_inat_def split: inat.split) |
|
374 |
319 lemma ileI1: "m < n \<Longrightarrow> iSuc m \<le> n" |
375 lemma ileI1: "m < n \<Longrightarrow> iSuc m \<le> n" |
320 by (simp add: iSuc_def less_eq_inat_def less_inat_def split: inat.splits) |
376 by (simp add: iSuc_def less_eq_inat_def less_inat_def split: inat.splits) |
321 |
377 |
322 lemma Suc_ile_eq: "Fin (Suc m) \<le> n \<longleftrightarrow> Fin m < n" |
378 lemma Suc_ile_eq: "Fin (Suc m) \<le> n \<longleftrightarrow> Fin m < n" |
323 by (cases n) auto |
379 by (cases n) auto |
324 |
380 |
325 lemma iless_Suc_eq [simp]: "Fin m < iSuc n \<longleftrightarrow> Fin m \<le> n" |
381 lemma iless_Suc_eq [simp]: "Fin m < iSuc n \<longleftrightarrow> Fin m \<le> n" |
326 by (auto simp add: iSuc_def less_inat_def split: inat.splits) |
382 by (auto simp add: iSuc_def less_inat_def split: inat.splits) |
|
383 |
|
384 lemma imult_Infty: "(0::inat) < n \<Longrightarrow> \<infinity> * n = \<infinity>" |
|
385 by (simp add: zero_inat_def less_inat_def split: inat.splits) |
|
386 |
|
387 lemma imult_Infty_right: "(0::inat) < n \<Longrightarrow> n * \<infinity> = \<infinity>" |
|
388 by (simp add: zero_inat_def less_inat_def split: inat.splits) |
|
389 |
|
390 lemma inat_0_less_mult_iff: "(0 < (m::inat) * n) = (0 < m \<and> 0 < n)" |
|
391 by (simp only: i0_less imult_is_0, simp) |
|
392 |
|
393 lemma mono_iSuc: "mono iSuc" |
|
394 by(simp add: mono_def) |
|
395 |
327 |
396 |
328 lemma min_inat_simps [simp]: |
397 lemma min_inat_simps [simp]: |
329 "min (Fin m) (Fin n) = Fin (min m n)" |
398 "min (Fin m) (Fin n) = Fin (min m n)" |
330 "min q 0 = 0" |
399 "min q 0 = 0" |
331 "min 0 q = 0" |
400 "min 0 q = 0" |