src/HOL/Isar_Examples/Schroeder_Bernstein.thy
author wenzelm
Tue, 02 Aug 2016 18:44:37 +0200
changeset 63583 a39baba12732
parent 63297 ce995deef4b0
child 63680 6e1e8b5abbfa
permissions -rw-r--r--
tuned;
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
63583
wenzelm
parents: 63297
diff changeset
     8
  imports Main
61938
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
63297
wenzelm
parents: 63291
diff changeset
    18
theorem Schroeder_Bernstein: \<open>\<exists>h :: 'a \<Rightarrow> 'b. inj h \<and> surj h\<close> if \<open>inj f\<close> and \<open>inj g\<close>
wenzelm
parents: 63291
diff changeset
    19
  for f :: \<open>'a \<Rightarrow> 'b\<close> and g :: \<open>'b \<Rightarrow> 'a\<close>
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    20
proof
63291
wenzelm
parents: 63040
diff changeset
    21
  define A where \<open>A = lfp (\<lambda>X. - (g ` (- (f ` X))))\<close>
wenzelm
parents: 63040
diff changeset
    22
  define g' where \<open>g' = inv g\<close>
63297
wenzelm
parents: 63291
diff changeset
    23
  let \<open>?h\<close> = \<open>\<lambda>z. if z \<in> A then f z else g' z\<close>
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    24
63291
wenzelm
parents: 63040
diff changeset
    25
  have \<open>A = - (g ` (- (f ` A)))\<close>
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    26
    unfolding A_def by (rule lfp_unfold) (blast intro: monoI)
63291
wenzelm
parents: 63040
diff changeset
    27
  then have A_compl: \<open>- A = g ` (- (f ` A))\<close> by blast
wenzelm
parents: 63040
diff changeset
    28
  then have *: \<open>g' ` (- A) = - (f ` A)\<close>
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    29
    using g'_def \<open>inj g\<close> by auto
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    30
63291
wenzelm
parents: 63040
diff changeset
    31
  show \<open>inj ?h \<and> surj ?h\<close>
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    32
  proof
63291
wenzelm
parents: 63040
diff changeset
    33
    from * show \<open>surj ?h\<close> by auto
wenzelm
parents: 63040
diff changeset
    34
    have \<open>inj_on f A\<close>
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    35
      using \<open>inj f\<close> by (rule subset_inj_on) blast
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    36
    moreover
63291
wenzelm
parents: 63040
diff changeset
    37
    have \<open>inj_on g' (- A)\<close>
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    38
      unfolding g'_def
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    39
    proof (rule inj_on_inv_into)
63291
wenzelm
parents: 63040
diff changeset
    40
      have \<open>g ` (- (f ` A)) \<subseteq> range g\<close> by blast
wenzelm
parents: 63040
diff changeset
    41
      then show \<open>- A \<subseteq> range g\<close> by (simp only: A_compl)
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    42
    qed
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    43
    moreover
63297
wenzelm
parents: 63291
diff changeset
    44
    have \<open>False\<close> if eq: \<open>f a = g' b\<close> and a: \<open>a \<in> A\<close> and b: \<open>b \<in> - A\<close> for a b
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    45
    proof -
63291
wenzelm
parents: 63040
diff changeset
    46
      from a have fa: \<open>f a \<in> f ` A\<close> by (rule imageI)
wenzelm
parents: 63040
diff changeset
    47
      from b have \<open>g' b \<in> g' ` (- A)\<close> by (rule imageI)
wenzelm
parents: 63040
diff changeset
    48
      with * have \<open>g' b \<in> - (f ` A)\<close> by simp
63297
wenzelm
parents: 63291
diff changeset
    49
      with eq fa show \<open>False\<close> by simp
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    50
    qed
63291
wenzelm
parents: 63040
diff changeset
    51
    ultimately show \<open>inj ?h\<close>
61938
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    52
      unfolding inj_on_def by (metis ComplI)
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    53
  qed
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    54
qed
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    55
e1205f814159 more proofs;
wenzelm
parents:
diff changeset
    56
end