src/HOL/Library/Countable_Set.thy
author hoelzl
Wed, 21 Nov 2012 12:05:05 +0100
changeset 50144 885deccc264e
parent 50134 13211e07d931
child 50148 b8cff6a8fda2
permissions -rw-r--r--
renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50134
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
     1
(*  Title:      HOL/Library/Countable_Set.thy
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
     2
    Author:     Johannes Hölzl
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
     3
    Author:     Andrei Popescu
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
     4
*)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
     5
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
     6
header {* Countable sets *}
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
     7
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
     8
theory Countable_Set
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
     9
  imports "~~/src/HOL/Library/Countable" "~~/src/HOL/Library/Infinite_Set"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    10
begin
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    11
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    12
subsection {* Predicate for countable sets *}
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    13
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    14
definition countable :: "'a set \<Rightarrow> bool" where
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    15
  "countable S \<longleftrightarrow> (\<exists>f::'a \<Rightarrow> nat. inj_on f S)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    16
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    17
lemma countableE:
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    18
  assumes S: "countable S" obtains f :: "'a \<Rightarrow> nat" where "inj_on f S"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    19
  using S by (auto simp: countable_def)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    20
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    21
lemma countableI: "inj_on (f::'a \<Rightarrow> nat) S \<Longrightarrow> countable S"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    22
  by (auto simp: countable_def)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    23
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    24
lemma countableI': "inj_on (f::'a \<Rightarrow> 'b::countable) S \<Longrightarrow> countable S"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    25
  using comp_inj_on[of f S to_nat] by (auto intro: countableI)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    26
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    27
lemma countableE_bij:
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    28
  assumes S: "countable S" obtains f :: "nat \<Rightarrow> 'a" and C :: "nat set" where "bij_betw f C S"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    29
  using S by (blast elim: countableE dest: inj_on_imp_bij_betw bij_betw_inv)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    30
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    31
lemma countableI_bij: "bij_betw f (C::nat set) S \<Longrightarrow> countable S"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    32
  by (blast intro: countableI bij_betw_inv_into bij_betw_imp_inj_on)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    33
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    34
lemma countable_finite: "finite S \<Longrightarrow> countable S"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    35
  by (blast dest: finite_imp_inj_to_nat_seg countableI)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    36
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    37
lemma countableI_bij1: "bij_betw f A B \<Longrightarrow> countable A \<Longrightarrow> countable B"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    38
  by (blast elim: countableE_bij intro: bij_betw_trans countableI_bij)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    39
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    40
lemma countableI_bij2: "bij_betw f B A \<Longrightarrow> countable A \<Longrightarrow> countable B"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    41
  by (blast elim: countableE_bij intro: bij_betw_trans bij_betw_inv_into countableI_bij)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    42
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    43
lemma countable_iff_bij[simp]: "bij_betw f A B \<Longrightarrow> countable A \<longleftrightarrow> countable B"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    44
  by (blast intro: countableI_bij1 countableI_bij2)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    45
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    46
lemma countable_subset: "A \<subseteq> B \<Longrightarrow> countable B \<Longrightarrow> countable A"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    47
  by (auto simp: countable_def intro: subset_inj_on)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    48
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    49
lemma countableI_type[intro, simp]: "countable (A:: 'a :: countable set)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    50
  using countableI[of to_nat A] by auto
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    51
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    52
subsection {* Enumerate a countable set *}
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    53
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    54
lemma countableE_infinite:
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    55
  assumes "countable S" "infinite S"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    56
  obtains e :: "'a \<Rightarrow> nat" where "bij_betw e S UNIV"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    57
proof -
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    58
  from `countable S`[THEN countableE] guess f .
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    59
  then have "bij_betw f S (f`S)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    60
    unfolding bij_betw_def by simp
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    61
  moreover
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    62
  from `inj_on f S` `infinite S` have inf_fS: "infinite (f`S)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    63
    by (auto dest: finite_imageD)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    64
  then have "bij_betw (the_inv_into UNIV (enumerate (f`S))) (f`S) UNIV"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    65
    by (intro bij_betw_the_inv_into bij_enumerate)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    66
  ultimately have "bij_betw (the_inv_into UNIV (enumerate (f`S)) \<circ> f) S UNIV"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    67
    by (rule bij_betw_trans)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    68
  then show thesis ..
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    69
qed
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    70
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    71
lemma countable_enum_cases:
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    72
  assumes "countable S"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    73
  obtains (finite) f :: "'a \<Rightarrow> nat" where "finite S" "bij_betw f S {..<card S}"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    74
        | (infinite) f :: "'a \<Rightarrow> nat" where "infinite S" "bij_betw f S UNIV"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    75
  using ex_bij_betw_finite_nat[of S] countableE_infinite `countable S`
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    76
  by (cases "finite S") (auto simp add: atLeast0LessThan)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    77
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    78
definition to_nat_on :: "'a set \<Rightarrow> 'a \<Rightarrow> nat" where
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    79
  "to_nat_on S = (SOME f. if finite S then bij_betw f S {..< card S} else bij_betw f S UNIV)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    80
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    81
definition from_nat_into :: "'a set \<Rightarrow> nat \<Rightarrow> 'a" where
50144
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
    82
  "from_nat_into S n = (if n \<in> to_nat_on S ` S then inv_into S (to_nat_on S) n else SOME s. s\<in>S)"
50134
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    83
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    84
lemma to_nat_on_finite: "finite S \<Longrightarrow> bij_betw (to_nat_on S) S {..< card S}"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    85
  using ex_bij_betw_finite_nat unfolding to_nat_on_def
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    86
  by (intro someI2_ex[where Q="\<lambda>f. bij_betw f S {..<card S}"]) (auto simp add: atLeast0LessThan)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    87
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    88
lemma to_nat_on_infinite: "countable S \<Longrightarrow> infinite S \<Longrightarrow> bij_betw (to_nat_on S) S UNIV"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    89
  using countableE_infinite unfolding to_nat_on_def
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    90
  by (intro someI2_ex[where Q="\<lambda>f. bij_betw f S UNIV"]) auto
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    91
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
    92
lemma from_nat_into_finite: "finite S \<Longrightarrow> bij_betw (from_nat_into S) {..< card S} S"
50144
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
    93
  unfolding from_nat_into_def[abs_def]
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
    94
  using to_nat_on_finite[of S]
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
    95
  apply (subst bij_betw_cong)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
    96
  apply (split split_if)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
    97
  apply (simp add: bij_betw_def)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
    98
  apply (auto cong: bij_betw_cong
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
    99
              intro: bij_betw_inv_into to_nat_on_finite)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   100
  done
50134
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   101
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   102
lemma from_nat_into_infinite: "countable S \<Longrightarrow> infinite S \<Longrightarrow> bij_betw (from_nat_into S) UNIV S"
50144
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   103
  unfolding from_nat_into_def[abs_def]
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   104
  using to_nat_on_infinite[of S, unfolded bij_betw_def]
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   105
  by (auto cong: bij_betw_cong intro: bij_betw_inv_into to_nat_on_infinite)
50134
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   106
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   107
lemma inj_on_to_nat_on[intro]: "countable A \<Longrightarrow> inj_on (to_nat_on A) A"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   108
  using to_nat_on_infinite[of A] to_nat_on_finite[of A]
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   109
  by (cases "finite A") (auto simp: bij_betw_def)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   110
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   111
lemma to_nat_on_inj[simp]:
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   112
  "countable A \<Longrightarrow> a \<in> A \<Longrightarrow> b \<in> A \<Longrightarrow> to_nat_on A a = to_nat_on A b \<longleftrightarrow> a = b"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   113
  using inj_on_to_nat_on[of A] by (auto dest: inj_onD)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   114
50144
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   115
lemma from_nat_into_to_nat_on[simp]: "countable A \<Longrightarrow> a \<in> A \<Longrightarrow> from_nat_into A (to_nat_on A a) = a"
50134
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   116
  by (auto simp: from_nat_into_def intro!: inv_into_f_f)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   117
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   118
lemma subset_range_from_nat_into: "countable A \<Longrightarrow> A \<subseteq> range (from_nat_into A)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   119
  by (auto intro: from_nat_into_to_nat_on[symmetric])
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   120
50144
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   121
lemma from_nat_into: "A \<noteq> {} \<Longrightarrow> from_nat_into A n \<in> A"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   122
  unfolding from_nat_into_def by (metis equals0I inv_into_into someI_ex)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   123
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   124
lemma range_from_nat_into_subset: "A \<noteq> {} \<Longrightarrow> range (from_nat_into A) \<subseteq> A"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   125
  using from_nat_into[of A] by auto
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   126
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   127
lemma from_nat_into_image[simp]: "A \<noteq> {} \<Longrightarrow> countable A \<Longrightarrow> from_nat_into A ` UNIV = A"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   128
  by (metis equalityI range_from_nat_into_subset subset_range_from_nat_into)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   129
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   130
lemma image_to_nat_on: "countable A \<Longrightarrow> infinite A \<Longrightarrow> to_nat_on A ` A = UNIV"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   131
  using to_nat_on_infinite[of A] by (simp add: bij_betw_def)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   132
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   133
lemma to_nat_on_surj: "countable A \<Longrightarrow> infinite A \<Longrightarrow> \<exists>a\<in>A. to_nat_on A a = n"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   134
  by (metis (no_types) image_iff iso_tuple_UNIV_I image_to_nat_on)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   135
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   136
lemma to_nat_on_from_nat_into[simp]: "n \<in> to_nat_on A ` A \<Longrightarrow> to_nat_on A (from_nat_into A n) = n"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   137
  by (simp add: f_inv_into_f from_nat_into_def)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   138
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   139
lemma infinite_to_nat_on_from_nat_into[simp]:
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   140
  "countable A \<Longrightarrow> infinite A \<Longrightarrow> to_nat_on A (from_nat_into A n) = n"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   141
  by (metis image_iff to_nat_on_surj to_nat_on_from_nat_into)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   142
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   143
lemma from_nat_into_inj:
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   144
  assumes c: "countable A" and i: "infinite A"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   145
  shows "from_nat_into A m = from_nat_into A n \<longleftrightarrow> m = n" (is "?L = ?R \<longleftrightarrow> ?K")
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   146
proof-
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   147
  have "?L = ?R \<longleftrightarrow> to_nat_on A ?L = to_nat_on A ?R"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   148
  unfolding to_nat_on_inj[OF c from_nat_into[OF infinite_imp_nonempty[OF i]]
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   149
                               from_nat_into[OF infinite_imp_nonempty[OF i]]] ..
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   150
  also have "... \<longleftrightarrow> ?K" using c i by simp
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   151
  finally show ?thesis .
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   152
qed
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   153
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   154
lemma from_nat_into_surj: "countable A \<Longrightarrow> a \<in> A \<Longrightarrow> \<exists>n. from_nat_into A n = a"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   155
  by (rule exI[of _ "to_nat_on A a"]) simp
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   156
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   157
lemma from_nat_into_inject[simp]:
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   158
assumes A: "A \<noteq> {}" "countable A" and B: "B \<noteq> {}" "countable B"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   159
shows "from_nat_into A = from_nat_into B \<longleftrightarrow> A = B"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   160
by (metis assms from_nat_into_image)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   161
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   162
lemma inj_on_from_nat_into:
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   163
"inj_on from_nat_into ({A. A \<noteq> {} \<and> countable A})"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   164
unfolding inj_on_def by auto
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   165
50134
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   166
subsection {* Closure properties of countability *}
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   167
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   168
lemma countable_SIGMA[intro, simp]:
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   169
  "countable I \<Longrightarrow> (\<And>i. i \<in> I \<Longrightarrow> countable (A i)) \<Longrightarrow> countable (SIGMA i : I. A i)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   170
  by (intro countableI'[of "\<lambda>(i, a). (to_nat_on I i, to_nat_on (A i) a)"]) (auto simp: inj_on_def)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   171
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   172
lemma countable_image[intro, simp]: assumes A: "countable A" shows "countable (f`A)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   173
proof -
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   174
  from A guess g by (rule countableE)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   175
  moreover have "inj_on (inv_into A f) (f`A)" "inv_into A f ` f ` A \<subseteq> A"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   176
    by (auto intro: inj_on_inv_into inv_into_into)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   177
  ultimately show ?thesis
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   178
    by (blast dest: comp_inj_on subset_inj_on intro: countableI)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   179
qed
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   180
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   181
lemma countable_UN[intro, simp]:
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   182
  fixes I :: "'i set" and A :: "'i => 'a set"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   183
  assumes I: "countable I"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   184
  assumes A: "\<And>i. i \<in> I \<Longrightarrow> countable (A i)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   185
  shows "countable (\<Union>i\<in>I. A i)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   186
proof -
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   187
  have "(\<Union>i\<in>I. A i) = snd ` (SIGMA i : I. A i)" by (auto simp: image_iff)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   188
  then show ?thesis by (simp add: assms)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   189
qed
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   190
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   191
lemma countable_Un[intro]: "countable A \<Longrightarrow> countable B \<Longrightarrow> countable (A \<union> B)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   192
  by (rule countable_UN[of "{True, False}" "\<lambda>True \<Rightarrow> A | False \<Rightarrow> B", simplified])
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   193
     (simp split: bool.split)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   194
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   195
lemma countable_Un_iff[simp]: "countable (A \<union> B) \<longleftrightarrow> countable A \<and> countable B"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   196
  by (metis countable_Un countable_subset inf_sup_ord(3,4))
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   197
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   198
lemma countable_Plus[intro, simp]:
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   199
  "countable A \<Longrightarrow> countable B \<Longrightarrow> countable (A <+> B)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   200
  by (simp add: Plus_def)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   201
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   202
lemma countable_empty[intro, simp]: "countable {}"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   203
  by (blast intro: countable_finite)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   204
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   205
lemma countable_insert[intro, simp]: "countable A \<Longrightarrow> countable (insert a A)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   206
  using countable_Un[of "{a}" A] by (auto simp: countable_finite)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   207
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   208
lemma countable_Int1[intro, simp]: "countable A \<Longrightarrow> countable (A \<inter> B)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   209
  by (force intro: countable_subset)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   210
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   211
lemma countable_Int2[intro, simp]: "countable B \<Longrightarrow> countable (A \<inter> B)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   212
  by (blast intro: countable_subset)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   213
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   214
lemma countable_INT[intro, simp]: "i \<in> I \<Longrightarrow> countable (A i) \<Longrightarrow> countable (\<Inter>i\<in>I. A i)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   215
  by (blast intro: countable_subset)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   216
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   217
lemma countable_Diff[intro, simp]: "countable A \<Longrightarrow> countable (A - B)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   218
  by (blast intro: countable_subset)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   219
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   220
lemma countable_vimage: "B \<subseteq> range f \<Longrightarrow> countable (f -` B) \<Longrightarrow> countable B"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   221
  by (metis Int_absorb2 assms countable_image image_vimage_eq)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   222
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   223
lemma surj_countable_vimage: "surj f \<Longrightarrow> countable (f -` B) \<Longrightarrow> countable B"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   224
  by (metis countable_vimage top_greatest)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   225
50144
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   226
lemma countable_Collect[simp]: "countable A \<Longrightarrow> countable {a \<in> A. \<phi> a}"
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   227
  by (metis Collect_conj_eq Int_absorb Int_commute Int_def countable_Int1)
885deccc264e renamed BNF/Countable_Set to Countable_Type and moved its generic stuff to Library/Countable_Set
hoelzl
parents: 50134
diff changeset
   228
50134
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   229
lemma countable_lists[intro, simp]:
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   230
  assumes A: "countable A" shows "countable (lists A)"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   231
proof -
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   232
  have "countable (lists (range (from_nat_into A)))"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   233
    by (auto simp: lists_image)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   234
  with A show ?thesis
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   235
    by (auto dest: subset_range_from_nat_into countable_subset lists_mono)
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   236
qed
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   237
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   238
subsection {* Misc lemmas *}
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   239
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   240
lemma countable_all:
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   241
  assumes S: "countable S"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   242
  shows "(\<forall>s\<in>S. P s) \<longleftrightarrow> (\<forall>n::nat. from_nat_into S n \<in> S \<longrightarrow> P (from_nat_into S n))"
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   243
  using S[THEN subset_range_from_nat_into] by auto
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   244
13211e07d931 add Countable_Set theory
hoelzl
parents:
diff changeset
   245
end