--- title: Teorema de Cantor date: 2024-05-02 06:00:00 UTC+02:00 category: 'Funciones' has_math: true --- [mathjax] Demostrar con Lean4 el teorema de Cantor; es decir, que no existe ninguna aplicación suprayectiva de un conjunto en el conjunto de sus subconjuntos. Para ello, completar la siguiente teoría de Lean4:
import Mathlib.Data.Set.Basic
open Function
variable {α : Type}
example : ∀ f : α → Set α, ¬Surjective f :=
by sorry
import Mathlib.Data.Set.Basic
open Function
variable {α : Type}
-- 1ª demostración
-- ===============
example : ∀ f : α → Set α, ¬Surjective f :=
by
intros f hf
-- f : α → Set α
-- hf : Surjective f
-- ⊢ False
let S := {i | i ∉ f i}
unfold Surjective at hf
-- hf : ∀ (b : Set α), ∃ a, f a = b
cases' hf S with j hj
-- j : α
-- hj : f j = S
by_cases j ∈ S
. -- h : j ∈ S
dsimp at h
-- h : ¬j ∈ f j
apply h
-- ⊢ j ∈ f j
rw [hj]
-- ⊢ j ∈ S
exact h
. -- h : ¬j ∈ S
apply h
-- ⊢ j ∈ S
rw [←hj] at h
-- h : ¬j ∈ f j
exact h
-- 2ª demostración
-- ===============
example : ∀ f : α → Set α, ¬ Surjective f :=
by
intros f hf
-- f : α → Set α
-- hf : Surjective f
-- ⊢ False
let S := {i | i ∉ f i}
cases' hf S with j hj
-- j : α
-- hj : f j = S
by_cases j ∈ S
. -- h : j ∈ S
apply h
-- ⊢ j ∈ f j
rwa [hj]
. -- h : ¬j ∈ S
apply h
rwa [←hj] at h
-- 3ª demostración
-- ===============
example : ∀ f : α → Set α, ¬ Surjective f :=
by
intros f hf
-- f : α → Set α
-- hf : Surjective f
-- ⊢ False
let S := {i | i ∉ f i}
cases' hf S with j hj
-- j : α
-- hj : f j = S
have h : (j ∈ S) = (j ∉ S) :=
calc (j ∈ S)
= (j ∉ f j) := Set.mem_setOf_eq
_ = (j ∉ S) := congrArg (j ∉ .) hj
exact iff_not_self (iff_of_eq h)
-- 4ª demostración
-- ===============
example : ∀ f : α → Set α, ¬ Surjective f :=
cantor_surjective
-- Lemas usados
-- ============
-- variable (x : α)
-- variable (p : α → Prop)
-- variable (a b : Prop)
-- #check (Set.mem_setOf_eq : (x ∈ {y : α | p y}) = p x)
-- #check (iff_of_eq : a = b → (a ↔ b))
-- #check (iff_not_self : ¬(a ↔ ¬a))
-- #check (cantor_surjective : ∀ f : α → Set α, ¬ Surjective f)
Se puede interactuar con las demostraciones anteriores en [Lean 4 Web](https://live.lean-lang.org/#url=https://raw.githubusercontent.com/jaalonso/Calculemus2/main/src/Teorema_de_Cantor.lean).
theory Teorema_de_Cantor
imports Main
begin
(* 1ª demostración *)
theorem
fixes f :: "'α ⇒ 'α set"
shows "¬ surj f"
proof (rule notI)
assume "surj f"
let ?S = "{i. i ∉ f i}"
have "∃ j. ?S = f j"
using ‹surj f› by (simp only: surjD)
then obtain j where "?S = f j"
by (rule exE)
show False
proof (cases "j ∈ ?S")
assume "j ∈ ?S"
then have "j ∉ f j"
by (rule CollectD)
moreover
have "j ∈ f j"
using ‹?S = f j› ‹j ∈ ?S› by (rule subst)
ultimately show False
by (rule notE)
next
assume "j ∉ ?S"
with ‹?S = f j› have "j ∉ f j"
by (rule subst)
then have "j ∈ ?S"
by (rule CollectI)
with ‹j ∉ ?S› show False
by (rule notE)
qed
qed
(* 2ª demostración *)
theorem
fixes f :: "'α ⇒ 'α set"
shows "¬ surj f"
proof (rule notI)
assume "surj f"
let ?S = "{i. i ∉ f i}"
have "∃ j. ?S = f j"
using ‹surj f› by (simp only: surjD)
then obtain j where "?S = f j"
by (rule exE)
have "j ∉ ?S"
proof (rule notI)
assume "j ∈ ?S"
then have "j ∉ f j"
by (rule CollectD)
with ‹?S = f j› have "j ∉ ?S"
by (rule ssubst)
then show False
using ‹j ∈ ?S› by (rule notE)
qed
moreover
have "j ∈ ?S"
proof (rule CollectI)
show "j ∉ f j"
proof (rule notI)
assume "j ∈ f j"
with ‹?S = f j› have "j ∈ ?S"
by (rule ssubst)
then have "j ∉ f j"
by (rule CollectD)
then show False
using ‹j ∈ f j› by (rule notE)
qed
qed
ultimately show False
by (rule notE)
qed
(* 3ª demostración *)
theorem
fixes f :: "'α ⇒ 'α set"
shows "¬ surj f"
proof
assume "surj f"
let ?S = "{i. i ∉ f i}"
have "∃ j. ?S = f j" using ‹surj f› by (simp only: surjD)
then obtain j where "?S = f j" by (rule exE)
have "j ∉ ?S"
proof
assume "j ∈ ?S"
then have "j ∉ f j" by simp
with ‹?S = f j› have "j ∉ ?S" by simp
then show False using ‹j ∈ ?S› by simp
qed
moreover
have "j ∈ ?S"
proof
show "j ∉ f j"
proof
assume "j ∈ f j"
with ‹?S = f j› have "j ∈ ?S" by simp
then have "j ∉ f j" by simp
then show False using ‹j ∈ f j› by simp
qed
qed
ultimately show False by simp
qed
(* 4ª demostración *)
theorem
fixes f :: "'α ⇒ 'α set"
shows "¬ surj f"
proof (rule notI)
assume "surj f"
let ?S = "{i. i ∉ f i}"
have "∃ j. ?S = f j"
using ‹surj f› by (simp only: surjD)
then obtain j where "?S = f j"
by (rule exE)
have "j ∈ ?S = (j ∉ f j)"
by (rule mem_Collect_eq)
also have "… = (j ∉ ?S)"
by (simp only: ‹?S = f j›)
finally show False
by (simp only: simp_thms(10))
qed
(* 5ª demostración *)
theorem
fixes f :: "'α ⇒ 'α set"
shows "¬ surj f"
proof
assume "surj f"
let ?S = "{i. i ∉ f i}"
have "∃ j. ?S = f j" using ‹surj f› by (simp only: surjD)
then obtain j where "?S = f j" by (rule exE)
have "j ∈ ?S = (j ∉ f j)" by simp
also have "… = (j ∉ ?S)" using ‹?S = f j› by simp
finally show False by simp
qed
(* 6ª demostración *)
theorem
fixes f :: "'α ⇒ 'α set"
shows "¬ surj f"
unfolding surj_def
by best
end