Constructive set theory is the theory where to prove the existence of an object, you must construct that object. That means the Law of Excluded Middle doesn’t work, which makes the proofs difficult to make but easy to follow.
Let’s start by constructing the empty set. That’s the set with nothing in it, {}. Let’s also call it 0, for reasons which will become clear later. Each natural number is the set that contains the previous natural number as well as all of the previous natural number’s elements, e.g. 1 = {0}, 2 = {0, 1}, and so on.
A natural number is any set that is the empty set or the set that contains some other natural number (its predecessor) as well as all of that number’s elements.
The function succ takes in a natural number n and returns its successor, which is the number whose predecessor is n. I was unable to prove that a number’s predecessor is unique, so you’ll just have to assume that.
Let’s also assume that reverse induction works, i.e. if a function takes in [statement that includes succ(N)] and outputs [same statement but with N instead], we can make a function that takes in [that statement again] for any N and outputs [same statement with 0 instead].
If we’re given a natural number X that contains itself, then it is its own successor (because all elements of its successor are elements of it), and thus also its own predecessor.
Therefore, the identity function restricted to numbers that contain themselves can be interpreted as a function that takes in a natural number succ(N) that contains itself and outputs a number N that contains itself. Then, by reverse induction, we get a function that takes in a number that contains itself and outputs the number 0 that contains itself.
The statement of the Pigeonhole Principle which we will prove is: “If you have a bijection from a natural number to an element of that natural number, then an element of the empty set can be constructed.” Some may notice that this only implies that the conventional statement of the Pigeonhole Principle can’t be false, rather than implying that it must be true, but we will ignore these objections.
We have been given a function F from N to M, where N contains M, and its inverse G. M is a natural number, so there are two cases to check: M is the empty set, or M is a successor.
If M is the empty set, {} contains F({}).
If M is a successor, then there are two cases to check for N:
If N is the empty set, {} contains M.
If N is also a successor, then N and M both have predecessors, which we’ll name L and K respectively. Every element of N is L or an element of L, and every element of M is K or an element of K. F(L) is an element of M, so it’s equal to K or an element of K.
If F(L) = K, then construct a bijection from L to K by removing L and K themselves from F’s input and output set, respectively. (Unless L contains itself and/or K contains itself, in which case 0 contains itself and thus 0 is an element of the empty set)
If F(L) is an element of K, then either G(K) = L (in which case F(G(K)) is both K and an element of K, so K contains itself, which means 0 is an element of the empty set) or G(K) is an element of L. In that case, construct a bijection from L to K that maps G(K) to F(L) and is otherwise1 identical to F.
The previous proof is a function that takes in a bijection from N to M where N contains M, and returns either an element of the empty set or the same format as its input but with the predecessors of the input numbers.
Now, construct a function that takes in an element of the empty set or a bijection from a number containing succ(M) to succ(M) and outputs an element of the empty set or a bijection from a number containing M to M. The function is constructed as follows: if the input is already an element of the empty set, output the same input, otherwise apply the previous proof’s function.
Then, by reverse induction, we get a function that takes in an element of the empty set or a bijection from N to M with N > M and outputs an element of the empty set or a bijection from a number containing 0 to 0.
If the previous function outputs a bijection from a number containing 0 to 0, then applying that function to 0 gives an element of the empty set, which means we have constructed a function of the type that proves the previous statement of the Pigeonhole Principle.
- Natural numbers are always equal or unequal, right? ↩︎

