Zulip Chat Archive

Stream: maths

Topic: Cantor golf


Kevin Buzzard (Dec 12 2018 at 16:42):

1) Is there a very short proof of this in Lean / mathlib?

example (X : Type) (x : X) (f : X  set X) (H : x  f x  x  f x) : false := sorry

2) Can anyone golf the mathlib proof of Cantor's Diagonal Argument (using only imports in mathlib):

theorem cantor_surjective {α} (f : α  α  Prop) : ¬ function.surjective f | h :=
let D, e := h (λ a, ¬ f a a) in
(iff_not_self (f D D)).1 $ iff_of_eq (congr_fun e D)

Rob Lewis (Dec 12 2018 at 16:44):

For 1), by tauto!It shouldn't need classical logic but by tauto fails.

Kevin Buzzard (Dec 12 2018 at 16:44):

My answer to (1):

example (X : Type) (x : X) (f : X  set X) (H : x  f x  x  f x) : false :=
begin
  revert H,
  generalize : x  f x = p,
  cc
end

I'm sure something much better will exist.

Kevin Buzzard (Dec 12 2018 at 16:44):

...and indeed it existed before I even posted! Many thanks Rob!

Kevin Buzzard (Dec 12 2018 at 16:54):

Why my code no work?

import tactic.interactive

open function

theorem no_bijection_to_power_set'
  (X : Type)
  (f : X  set X) :
bijective f  false :=
λ Hi, Hs, -- unexpected occurrence of recursive function error
begin
  cases Hs {x : X | x  f x} with x Hx,
    have Hconclusion_so_far : x  f x  x  _ := by rw [Hx],
      have Hlogical_nonsense : (x  f x)  ¬ (x  f x) := Hconclusion_so_far,
  tauto!
end

Kevin Buzzard (Dec 12 2018 at 16:58):

Changing tauto! to sorry fixes the error. Is it a combination of the equation compiler and the tactic? Why is this happening?

Kevin Buzzard (Dec 12 2018 at 16:59):

import tactic.interactive

open function

theorem no_bijection_to_power_set'
  (X : Type)
  (f : X  set X) :
bijective f  false :=
λ Hb, let Hi,Hs := Hb in -- unexpected occurrence of recursive function
begin
  cases Hs {x : X | x  f x} with x Hx,
    have Hconclusion_so_far : x  f x  x  _ := by rw [Hx],
      have Hlogical_nonsense : (x  f x)  ¬ (x  f x) := Hconclusion_so_far,
  tauto!
end

Also doesn't work.

Reid Barton (Dec 12 2018 at 16:59):

For some reason using lambda with pattern matching like this makes a hypothesis (I think it's called _fun_match) which I guess represents some kind of recursion

Reid Barton (Dec 12 2018 at 17:00):

if you use a tactic which tries to apply everything like tauto, it'll try to apply _fun_match and then you get this error

Reid Barton (Dec 12 2018 at 17:01):

Same with let but I think the hypothesis name is different

Reid Barton (Dec 12 2018 at 17:01):

You could use begin rintros \<Hi,Hs\>, cases ...

Kevin Buzzard (Dec 12 2018 at 17:32):

I was trying to get out of tactic mode, on this occasion.

Kevin Buzzard (Dec 12 2018 at 17:35):

Here's the game. I have a version of Cantor's theorem in Lean, spelt out so that mathematicians with epsilon Lean experience can still understand it:

-- Cantor's theorem in Lean

import tactic.interactive

open function

/- Theorem: If X is any type, then there is no bijective function
   f from X to the power set of X.
-/
theorem no_bijection_to_power_set (X : Type) :
 f : X  set X, ¬ (bijective f) :=
begin
  -- Let f be a function from X to the power set of X
  intro f,
  -- Assume, for a contradiction, that f is bijective
  intro Hf,
  -- f is bijective, so it's surjective.
  cases Hf with Hi Hs,
  -- it's also injective, but I don't even care
  clear Hi,
  -- Let S be the usual cunning set
  let S : set X := {x : X | x  f x},
  -- What does surjectivity of f say when applied to S?
  have HCantor := Hs S,
  -- It tells us that there's x in X with f x = S!
  cases HCantor with x Hx,
  -- That means x is in f x if and only if x has is in S.
  have Hconclusion_so_far : x  f x  x  S := by rw [Hx],
  -- but this means (x ∈ f x) ↔ ¬ (x ∈ f x)
  have Hlogical_nonsense : (x  f x)  ¬ (x  f x) := Hconclusion_so_far,
  -- automation can now take over.
  tauto!,
end

and I was trying to compress it into a term mode function.

I also have the mathlib proof

import tactic.interactive

theorem cantor_surjective {α} (f : α  α  Prop) : ¬ function.surjective f | h :=
let D, e := h (λ a, ¬ f a a) in
(iff_not_self (f D D)).1 $ iff_of_eq (congr_fun e D)

and I was attempting to expand this into a tactic mode proof. I could just use rcases, as you say.

Rob Lewis (Dec 12 2018 at 18:14):

You can use simpa using Hlogical_nonsense to avoid the weird tauto behavior, but I guess it doesn't look quite as good when you have to name the hypothesis.


Last updated: Dec 20 2023 at 11:08 UTC