src/HOL/Library/Nat_Infinity.thy
changeset 41853 258a489c24b2
parent 38621 d6cb7e625d75
child 41855 c3b6e69da386
equal deleted inserted replaced
41852:9aae2eed4696 41853:258a489c24b2
     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"