Zulip Chat Archive

Stream: new members

Topic: No surjection from a set to its powerset


Gihan Marasingha (Oct 26 2020 at 14:19):

I know mathlib has the theorem cantor_surjective, that given {α} (f : α → set α), we have ¬ function.surjective f. Can one prove a similar statement given (S : set α) (f : S → 𝒫 S)?

I've attempted this, but I come a cropper because I'm trying apply surjectivity to a term of the wrong type. Here's the start of my attempt. The problem is that I'm applying h with a term of type set ↥S rather than one of type ↥𝒫 S. Can this be fixed?

import data.set

example {α} (S : set α) (f : S  𝒫 S) : ¬ function.surjective f :=
begin
  haveI := classical.prop_decidable,
  intro h,
  cases h { b : S | (b : α)  (f b : set α)} with x hx, -- This fails.
/-  by_cases k : x ∈ f x,
  { have : x ∉ f x,
    { rwa [hx, nmem_set_of_eq, not_not_mem], },
    exact this k, },
  { have : x ∈ f x,
    { rwa [hx, mem_set_of_eq], },
    exact k this, }, -/
end

Mario Carneiro (Oct 26 2020 at 14:20):

why not just turn it into an instance of cantor_surjective?

Mario Carneiro (Oct 26 2020 at 14:21):

also #mwe

Gihan Marasingha (Oct 26 2020 at 14:23):

Ah sorry, I've added the import.

Gihan Marasingha (Oct 26 2020 at 14:25):

OK, so how would I apply cantor_surjective in this case to get the desired result?

Mario Carneiro (Oct 26 2020 at 14:27):

def equiv.set.powerset {α} (S : set α) : 𝒫 S  set S := sorry

Gihan Marasingha (Oct 26 2020 at 14:38):

Thanks. I haven't come across equiv before. I'll think about this and come back if I get stuck.

Mario Carneiro (Oct 26 2020 at 14:40):

Kevin Buzzard (Oct 26 2020 at 15:33):

When I do this with Imperial 1st years I just use types:

import data.set

open_locale classical

open set

example (S : Type) (f : S  set S) : ¬ function.surjective f :=
begin
  intro h,
  cases h { b : S | b  f b} with x hx,
  by_cases k : x  f x,
  { have : x  f x,
    { rw hx at k, exact k },
    contradiction, },
  { have : x  f x,
    { rwa hx, },
    contradiction, },
end

Kevin Buzzard (Oct 26 2020 at 15:34):

I just tell them that a type is a collection of stuff in type theory, like a set is a collection of stuff in set theory.

Mario Carneiro (Oct 26 2020 at 15:40):

Although I think it is interesting how shockingly short the mathlib proof of cantor_surjective is

Gihan Marasingha (Oct 26 2020 at 15:40):

@Kevin Buzzard . Thanks. I feel less bad about trying a classical proof (given that function.cantor_surjective is constructive).

Mario Carneiro (Oct 26 2020 at 15:41):

it actually uses that ever popular lemma from TPIL that is not obviously constructive: not (p <-> not p)

Gihan Marasingha (Oct 26 2020 at 15:42):

Oh, good to know! I take it then the result is not true using constructive reasoning?

Edit: I can't read. Ignore this comment.

Kevin Buzzard (Oct 26 2020 at 15:42):

not (p <-> not p) can be proved constructively, rather surprisingly

Gihan Marasingha (Oct 26 2020 at 16:01):

@Kevin Buzzard when teaching do you avoid discussing power sets entirely (treating set S as a 'power type') or do you discuss power sets then ask students to think of set S (in this situation) as being a power set? Or something else?

Mario Carneiro (Oct 26 2020 at 16:02):

I don't think set.powerset has been used at all in mathlib

Mario Carneiro (Oct 26 2020 at 16:03):

Once you have a separate notion of the type of subsets of a type, there are very few instances where the subcollection of subsets of a given subset of a type comes up

Gihan Marasingha (Oct 26 2020 at 16:05):

@Mario Carneiro. Trying to prove this non-surjectivity result for power sets, I can see why!

Mario Carneiro (Oct 26 2020 at 16:06):

Well in this case you aren't really using set.powerset as a set, so the translation to set S is natural

Kevin Buzzard (Oct 26 2020 at 16:06):

I say that set S is the type of subsets of S, and the reason it's not called subset S is because a term of type set S is a set of elements of S.

Mario Carneiro (Oct 26 2020 at 16:06):

There are uses of set.prod in mathlib (the cartesian product of sets), so conceivably a similar thing might come up for set.powerset

Yury G. Kudryashov (Oct 26 2020 at 16:08):

docs#filter.eventually_lift'_powerset

Mario Carneiro (Oct 26 2020 at 16:09):

oh that's right, filters will need this sometimes

Mario Carneiro (Oct 26 2020 at 16:09):

I went looking for uses of the notation

Mario Carneiro (Oct 26 2020 at 16:13):

Hm, should we use Iic instead of set.powerset?

Mario Carneiro (Oct 26 2020 at 16:13):

that would allow us to unify it with the collection of supersets {x | S \sub x}, which also comes up in filters

Yury G. Kudryashov (Oct 26 2020 at 16:20):

I'm not going to do this refactor!

Mario Carneiro (Oct 26 2020 at 17:00):

I can lump it in with that refactor I never finished to generalize filters to subsets of a poset

Johan Commelin (Oct 26 2020 at 17:03):

I fear that refactor might be really painful. Don't you think?
The fact that filters are filters on set X is really used all over the place now.
Not saying that it can't be done, but I think it might be one of the biggest refactors we've seen so far.

Mario Carneiro (Oct 26 2020 at 17:39):

You are not wrong

Mario Carneiro (Oct 26 2020 at 17:40):

It was one of those refactors where the size of the refactor grows exponentially with the number of touched theorems


Last updated: Dec 20 2023 at 11:08 UTC