equal
deleted
inserted
replaced
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 |