src/HOL/Finite_Set.thy
changeset 29920 b95f5b8b93dd
parent 29918 214755b03df3
child 29923 24f56736c56f
equal deleted inserted replaced
29919:1e07290c46c3 29920:b95f5b8b93dd
   137 qed
   137 qed
   138 
   138 
   139 lemma finite_conv_nat_seg_image:
   139 lemma finite_conv_nat_seg_image:
   140   "finite A = (\<exists> (n::nat) f. A = f ` {i::nat. i<n})"
   140   "finite A = (\<exists> (n::nat) f. A = f ` {i::nat. i<n})"
   141 by(blast intro: nat_seg_image_imp_finite dest: finite_imp_nat_seg_image_inj_on)
   141 by(blast intro: nat_seg_image_imp_finite dest: finite_imp_nat_seg_image_inj_on)
       
   142 
       
   143 lemma finite_Collect_less_nat[iff]: "finite{n::nat. n<k}"
       
   144 by(fastsimp simp: finite_conv_nat_seg_image)
   142 
   145 
   143 
   146 
   144 subsubsection{* Finiteness and set theoretic constructions *}
   147 subsubsection{* Finiteness and set theoretic constructions *}
   145 
   148 
   146 lemma finite_UnI: "finite F ==> finite G ==> finite (F Un G)"
   149 lemma finite_UnI: "finite F ==> finite G ==> finite (F Un G)"
   186 
   189 
   187 lemma finite_Collect_conjI [simp, intro]:
   190 lemma finite_Collect_conjI [simp, intro]:
   188   "finite{x. P x} | finite{x. Q x} ==> finite{x. P x & Q x}"
   191   "finite{x. P x} | finite{x. Q x} ==> finite{x. P x & Q x}"
   189   -- {* The converse obviously fails. *}
   192   -- {* The converse obviously fails. *}
   190 by(simp add:Collect_conj_eq)
   193 by(simp add:Collect_conj_eq)
       
   194 
       
   195 lemma finite_Collect_le_nat[iff]: "finite{n::nat. n<=k}"
       
   196 by(simp add: le_eq_less_or_eq)
   191 
   197 
   192 lemma finite_insert [simp]: "finite (insert a A) = finite A"
   198 lemma finite_insert [simp]: "finite (insert a A) = finite A"
   193   apply (subst insert_is_Un)
   199   apply (subst insert_is_Un)
   194   apply (simp only: finite_Un, blast)
   200   apply (simp only: finite_Un, blast)
   195   done
   201   done
   327 
   333 
   328 lemma finite_UN [simp]:
   334 lemma finite_UN [simp]:
   329   "finite A ==> finite (UNION A B) = (ALL x:A. finite (B x))"
   335   "finite A ==> finite (UNION A B) = (ALL x:A. finite (B x))"
   330 by (blast intro: finite_UN_I finite_subset)
   336 by (blast intro: finite_UN_I finite_subset)
   331 
   337 
       
   338 lemma finite_Collect_bex[simp]: "finite A \<Longrightarrow>
       
   339   finite{x. EX y:A. Q x y} = (ALL y:A. finite{x. Q x y})"
       
   340 apply(subgoal_tac "{x. EX y:A. Q x y} = UNION A (%y. {x. Q x y})")
       
   341  apply auto
       
   342 done
       
   343 
       
   344 lemma finite_Collect_bounded_ex[simp]: "finite{y. P y} \<Longrightarrow>
       
   345   finite{x. EX y. P y & Q x y} = (ALL y. P y \<longrightarrow> finite{x. Q x y})"
       
   346 apply(subgoal_tac "{x. EX y. P y & Q x y} = UNION {y. P y} (%y. {x. Q x y})")
       
   347  apply auto
       
   348 done
       
   349 
       
   350 
   332 lemma finite_Plus: "[| finite A; finite B |] ==> finite (A <+> B)"
   351 lemma finite_Plus: "[| finite A; finite B |] ==> finite (A <+> B)"
   333 by (simp add: Plus_def)
   352 by (simp add: Plus_def)
   334 
   353 
   335 text {* Sigma of finite sets *}
   354 text {* Sigma of finite sets *}
   336 
   355 
   394 qed
   413 qed
   395 
   414 
   396 lemma finite_Collect_subsets[simp,intro]: "finite A \<Longrightarrow> finite{B. B \<subseteq> A}"
   415 lemma finite_Collect_subsets[simp,intro]: "finite A \<Longrightarrow> finite{B. B \<subseteq> A}"
   397 by(simp add: Pow_def[symmetric])
   416 by(simp add: Pow_def[symmetric])
   398 
   417 
   399 lemma finite_bex_subset[simp]:
       
   400   "finite B \<Longrightarrow> finite{x. EX A<=B. P x A} = (ALL A<=B. finite{x. P x A})"
       
   401 apply(subgoal_tac "{x. EX A<=B. P x A} = (UN A:Pow B. {x. P x A})")
       
   402  apply auto
       
   403 done
       
   404 
   418 
   405 lemma finite_UnionD: "finite(\<Union>A) \<Longrightarrow> finite A"
   419 lemma finite_UnionD: "finite(\<Union>A) \<Longrightarrow> finite A"
   406 by(blast intro: finite_subset[OF subset_Pow_Union])
   420 by(blast intro: finite_subset[OF subset_Pow_Union])
   407 
   421 
   408 
   422