I have doubts regarding a proof of the following theorem:

'Set of all problems' is larger than the 'set of all algorithms' (or set of all C programs).

Put rhetorically, the theorem says that there are more problems than there are solutions.

The proof is by cardinality comparison of the two sets and has the following steps.

  1. (Lemma 1) Prove that the 'set of all C programs' is at most countable.
  2. (Lemma 2) Prove that the 'set of all problems' is at least uncountable.
  3. Hence, $|$set of all problems$| > |$set of all C programs$|$ ($|.|$ represents cardinality)

For completion, and to ensure that we all are on the same page, I have stated the proof below. However, my concern is not related to the proof directly.

Proof of Lemma 1

The vocabulary of C language is finite (say of size $K$). Therefore, every text of finite length written in C can be encoded as a number in base $K$. Hence, the set of all finite-length texts written in C is of the same cardinality as the set of all numbers in base $K$ i.e. countable. The set of all syntactically and semantically valid C programs is only a subset of this set, hence that set is at most countable.

Proof of Lemma 2

Consider the following set: $S = \{f\ |\ f$ is a function from $\mathbb{N}$ to $\{0,1\}\}$. Now, we shall find the cardinality of $S$. To that end, map each function $f$ in $S$ to a unique subset $T_f$ of $\mathbb{N}$ s.t. $f(x)=1$ iff $x$ is in the subset $T_f$. This mapping is a bijection and hence the cardinality of set $S$ is same as the cardinality of the set of all $T_f$s i.e. the power set of $\mathbb{N}$ i.e. uncountable.

Then we agree/realize/assume that set $S$ is a subset of the set of all problems and hence the latter set is at least uncountable, which completes the proof.

I cannot see $S$ as being a subset of all problems. Why is every element of $S$ a problem in itself? Is it not more sane to talk only about the problems that you can understand and communicate (in English say)?

To me, any problem must be explainable in English, for it to be called a problem. It is not meaningful to be talking about other problems anyway. Therefore, the set of all (worthy) problems must at most be countable, since the set $E$ of all English texts of finite length is countable (proved like Lemma 1 above). So, if we assume that we can write each individual element of $S$ as a problem, that leads us to conclude that all problems in $S$ are elements of $E$, and therefore $|E| \geq |S|$ which is clearly false (since $S$ is uncountable).

Therefore, we cannot even write individual problems of $S$ in English, let alone the whole set. Why are we concerned about those problems then? $S$ may represent one set of decision problems, but are these decision problems worth solving? Should we just believe that there are uncountably many problems even if we would never want to solve uncountably many of them?

I do understand that the notion of a problem for me (the explainability in English) is different from the one that the proof uses. That is fair and in theory I can see why that might be appreciated as well. But this theorem and the corresponding proof limit all human efforts. They tell us that no matter what we do, we will never be able to get all the questions (forget about the answers). So, I want to be really sure that there is indeed no hope. Sorry for being sentimental about this but it is one of those things which render me powerless. It is right up there with Gödel's Incompleteness Theorems, results that forever limit our abilities and make us doubt our entire existence.

Please help me understand why is $S$ a set of problems worth considering and what is a problem after all? Thanks for your time!


1 Answer 1


Should we just believe that there are uncountably many problems even if we would never want to solve uncountably many of them?

Yep. Thats the thing, we want to talk about all possible problems - why would we want to restrict ourselves to theoretically analyzing only a small portion of problems? So essentially what you are saying (and I totally agree with you), is that only a really small portion of the so-called "problems" are actually interesting and make sense to try and solve.

In a drastic switch, to my opinion, even though Godel's incompleteness therem, the halting problem's undecidability and Rice's theorem do show us that we are "powerless", just think about how much power we actually do have - to even consider thinking about such theoretical questions. Who would have thought its possible to prove that we cant do something? I believe you just have to "go with it", and accept the reality that there are things we can't do. Its part of what makes computer science interesting, since if we could do everything - nothing would be interesting...

  • $\begingroup$ That's the kind of answer I was looking for! You're right in that it's about the perspective. Our power lies in the fact that we can prove such things about our field. But still, the limits created by these results always lie above us. We will never know if the problem we're working on is provable in our current system or not unless we prove it. At times I feel Hilbert when he said "We must know, we will know" but the truth is that we won't know, and we have to live with it. Thanks for the answer. $\endgroup$ Commented Jun 13, 2021 at 16:57

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.