src/HOL/Hilbert_Choice.thy
changeset 55415 05f5fdb8d093
parent 55088 57c82e01022b
child 55811 aa1acc25126b
equal deleted inserted replaced
55414:eab03e9cee8a 55415:05f5fdb8d093
   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+)