src/HOL/Isar_Examples/Schroeder_Bernstein.thy
author wenzelm
Sat, 16 Jan 2016 15:03:55 +0100
changeset 62188 74c56f8b68e8
parent 61939 3c8c390a8f0a
child 63040 eb4ddd18d635
permissions -rw-r--r--
tuned message;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Isar_Examples/Schroeder_Bernstein.thy
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
     3
*)
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
     4
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
     5
section \<open>Schröder-Bernstein Theorem\<close>
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
     6
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
     7
theory Schroeder_Bernstein
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
     8
imports Main
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
     9
begin
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    10
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    11
text \<open>
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    12
  See also:
61939
3c8c390a8f0a tuned document;
wenzelm
parents: 61938
diff changeset
    13
  \<^item> @{file "$ISABELLE_HOME/src/HOL/ex/Set_Theory.thy"}
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    14
  \<^item> @{url "http://planetmath.org/proofofschroederbernsteintheoremusingtarskiknastertheorem"}
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    15
  \<^item> Springer LNCS 828 (cover page)
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    16
\<close>
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    17
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    18
theorem Schroeder_Bernstein:
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    19
  fixes f :: "'a \<Rightarrow> 'b"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    20
    and g :: "'b \<Rightarrow> 'a"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    21
  assumes "inj f" and "inj g"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    22
  shows "\<exists>h :: 'a \<Rightarrow> 'b. inj h \<and> surj h"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    23
proof
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    24
  def A \<equiv> "lfp (\<lambda>X. - (g ` (- (f ` X))))"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    25
  def g' \<equiv> "inv g"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    26
  let ?h = "\<lambda>z. if z \<in> A then f z else g' z"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    27
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    28
  have "A = - (g ` (- (f ` A)))"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    29
    unfolding A_def by (rule lfp_unfold) (blast intro: monoI)
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    30
  then have A_compl: "- A = g ` (- (f ` A))" by blast
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    31
  then have *: "g' ` (- A) = - (f ` A)"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    32
    using g'_def \<open>inj g\<close> by auto
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    33
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    34
  show "inj ?h \<and> surj ?h"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    35
  proof
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    36
    from * show "surj ?h" by auto
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    37
    have "inj_on f A"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    38
      using \<open>inj f\<close> by (rule subset_inj_on) blast
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    39
    moreover
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    40
    have "inj_on g' (- A)"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    41
      unfolding g'_def
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    42
    proof (rule inj_on_inv_into)
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    43
      have "g ` (- (f ` A)) \<subseteq> range g" by blast
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    44
      then show "- A \<subseteq> range g" by (simp only: A_compl)
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    45
    qed
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    46
    moreover
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    47
    have False if eq: "f a = g' b" and a: "a \<in> A" and b: "b \<in> - A" for a b
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    48
    proof -
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    49
      from a have fa: "f a \<in> f ` A" by (rule imageI)
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    50
      from b have "g' b \<in> g' ` (- A)" by (rule imageI)
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    51
      with * have "g' b \<in> - (f ` A)" by simp
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    52
      with eq fa show False by simp
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    53
    qed
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    54
    ultimately show "inj ?h"
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    55
      unfolding inj_on_def by (metis ComplI)
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    56
  qed
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    57
qed
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    58
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    59
end