equal
deleted
inserted
replaced
287 lemma infinite_countable_subset: |
287 lemma infinite_countable_subset: |
288 assumes inf: "\<not> finite (S::'a set)" |
288 assumes inf: "\<not> finite (S::'a set)" |
289 shows "\<exists>f. inj (f::nat \<Rightarrow> 'a) \<and> range f \<subseteq> S" |
289 shows "\<exists>f. inj (f::nat \<Rightarrow> 'a) \<and> range f \<subseteq> S" |
290 -- {* Courtesy of Stephan Merz *} |
290 -- {* Courtesy of Stephan Merz *} |
291 proof - |
291 proof - |
292 def Sseq \<equiv> "nat_rec S (\<lambda>n T. T - {SOME e. e \<in> T})" |
292 def Sseq \<equiv> "rec_nat S (\<lambda>n T. T - {SOME e. e \<in> T})" |
293 def pick \<equiv> "\<lambda>n. (SOME e. e \<in> Sseq n)" |
293 def pick \<equiv> "\<lambda>n. (SOME e. e \<in> Sseq n)" |
294 { fix n have "Sseq n \<subseteq> S" "\<not> finite (Sseq n)" by (induct n) (auto simp add: Sseq_def inf) } |
294 { fix n have "Sseq n \<subseteq> S" "\<not> finite (Sseq n)" by (induct n) (auto simp add: Sseq_def inf) } |
295 moreover then have *: "\<And>n. pick n \<in> Sseq n" by (metis someI_ex pick_def ex_in_conv finite.simps) |
295 moreover then have *: "\<And>n. pick n \<in> Sseq n" by (metis someI_ex pick_def ex_in_conv finite.simps) |
296 ultimately have "range pick \<subseteq> S" by auto |
296 ultimately have "range pick \<subseteq> S" by auto |
297 moreover |
297 moreover |
532 apply (rule iffI) |
532 apply (rule iffI) |
533 apply (rule notI) |
533 apply (rule notI) |
534 apply (erule exE) |
534 apply (erule exE) |
535 apply (erule_tac x = "{w. \<exists>i. w=f i}" in allE, blast) |
535 apply (erule_tac x = "{w. \<exists>i. w=f i}" in allE, blast) |
536 apply (erule contrapos_np, simp, clarify) |
536 apply (erule contrapos_np, simp, clarify) |
537 apply (subgoal_tac "\<forall>n. nat_rec x (%i y. @z. z:Q & (z,y) :r) n \<in> Q") |
537 apply (subgoal_tac "\<forall>n. rec_nat x (%i y. @z. z:Q & (z,y) :r) n \<in> Q") |
538 apply (rule_tac x = "nat_rec x (%i y. @z. z:Q & (z,y) :r)" in exI) |
538 apply (rule_tac x = "rec_nat x (%i y. @z. z:Q & (z,y) :r)" in exI) |
539 apply (rule allI, simp) |
539 apply (rule allI, simp) |
540 apply (rule someI2_ex, blast, blast) |
540 apply (rule someI2_ex, blast, blast) |
541 apply (rule allI) |
541 apply (rule allI) |
542 apply (induct_tac "n", simp_all) |
542 apply (induct_tac "n", simp_all) |
543 apply (rule someI2_ex, blast+) |
543 apply (rule someI2_ex, blast+) |