3 ms·
And I am likewise convinced that you are missing basic connections between computing, Gödel, the halting problem and so on. Last try. Suppose that X is an axi
by btilly 3y ago
And I am likewise convinced that you are missing basic connections between computing, Gödel, the halting problem and so on.
Last try.
Suppose that X is an axiom system that models computation. Since Turing machines can be described in arithmetic, and arithmetic in computation, that's actually equivalent to being able to model arithmetic. But we'll stick with computation.
I'll use Python syntax for computation. Both because it is readable, and because it has https://docs.python.org/3/tutorial/classes.html#generators https://docs.python.org/3/tutorial/classes.html#generators, closures, and eval. Which are really convenient for what I'm going to do.
Let's look at code that generates a functions that take natural numbers and return Booleans. Some are simple.
def is_even (n):
return n % 2 == 0
Obviously this always returns a Boolean. Some are more complex.
def is_even (n):
return n % 2 == 0
def collatz (n):
i = 0
while n != 1:
i += 1
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
return i
def collatz_is_even (n):
return is_even(collatz(n))
We don't know that collatz_is_even always returns. It returns a Boolean if it does. But if the Collatz conjecture is false, then some inputs will never return and this isn't a Boolean sequence.
Now the following function can obviously be written, but will be somewhat complicated:
def proofs (X):
# Does a breadth-first search through proofs in first order logic
# from axiom system X. Will yield proofs in order.
...
Here is another function that can clearly be written, and is also somewhat complicated.
def found_boolean_seq (code):
# If proof proves that <code> returns a function seq which always
# returns a Boolean when passed a natural number, will return code
# as a string.
#
# Otherwise it returns None.
....
Based on these we can write the following.
def boolean_seqs (X):
# A list that will include every function that X proves defines a
# boolean sequence. All functions that X can prove this about will
# be somewhere in the sequence.
#
# This returns them as closures.
#
for proof in proofs(X):
code = found_boolean_seq(proof)
if code is None:
yield lambda n: False
else
yield eval(code, {})
def boolean_seq (X, n):
# Returns the n'th boolean sequence from boolean_seqs.
#
# This returns it as a closure.
i = 0
for f in boolean_seqs(X):
i += 1
if i == n:
return f
And now let's diagonalize to produce a new sequence.
def diagonalize (X):
# Returns a sequence that disagrees with every other one on our list.
def inner (n):
return not boolean_seq(X, n)(n)
return inner
# Do some work to set up the axiom system X
...
# And return the diagonalized sequence.
diagonalize(X)
OK. If proofs and found_boolean_seq are both correctly written, we can prove from how Python works that every proof from X will show up in proofs(X). And every piece of code that X can prove defines a Boolean sequence will show up in boolean_seqs(X).
Now a question. Can the diagonalized sequence show up in boolean_seqs(X)? If X is inconsistent, then it certainly does. X proves anything. Including that that code always returns a Boolean.
Next question. If the diagonalized sequence shows up in the n'th position, what will happen if we call seq(n) on it? The answer is that the copy we call will find its own code in the sequence and will eval it. It will then call seq(n) on that copy, which will repeat. By induction we can prove that it will create an unlimited number of copies of itself, which takes forever, so it never returns.
But note, If it is on the list, that's because axiom system X proved that it WOULD return. So if it is on the list, then axiom system X is inconsistent.
A version of Gödel's theorem follows. If the axiom system X is consistent, then the diagonalized sequence is not on the list. This means that X cannot prove whether or not the diagonalized sequence always returns. Which in turn means that X is incomplete.
The fact that I keep pointing out is that cannot prove whether or not the diagonalized sequence always returns. If the axiom system X is consistent, then you need a strictly stronger axiom system than X to prove that the diagonalized function always returns a Boolean. It has to be stronger exactly because proving things about the diagonalized function means that you're proving things about the axiom system X.
And that is true of diagonalized computation in general. Diagonalizing creates a layer of self-reference. Which means that you can't always prove things about the diagonalized function, even though you can prove the same thing about each function in the sequence.
- Tainnor 3y agoThis is all true. It shows that no effectively computable set of axioms can prove all "true" computable functions computable (or in less metaphysical language, that there are always functions we can show to be computable from "outside" our logical system, i.e. metalogically, while not being able to show it within that system). It's basically just a different variant of the incompleteness theorem. And another way to put it is that the set of computable functions is not recursively enumerable, and by extension, neither is the set of real numbers. But just because this set is not recursively enumerable, it doesn't mean that we can't talk about it and prove theorems about it, and not even a constructivist such as Bishop would go so far. He wouldn't even be able to define the real numbers if he did because there is no way of enumerating all the sequences that satisfy his definition of a real number. Your proposed definition of the set of real numbers (that kind of encode a proof of their own existence) is IMHO at odds with how constructivists themselves define them and IMHO also a totally unworkable definition for real analysis. Maybe there is some oddball mathematical framework that does what you want, but I'd certainly never want to work in a framework which doesn't even allow me to write down theorems of the form "for every decidable language, ..." just because I can't enumerate all the decidable languages, and similar.
- btilly 3y agoI agree that most constructivists define things differently than this. I brought up this example in https://news.ycombinator.com/item?id=37425642 https://news.ycombinator.com/item?id=37425642 to demonstrate that you were wrong in https://news.ycombinator.com/item?id=37423933 https://news.ycombinator.com/item?id=37423933 to claim that Cantor's argument necessarily must work constructively. It works in some constructive systems, and not in others. I'm not arguing for attempting to work in such constructive systems. Merely pointing out that they exist. And their existence is a limitation on what diagonalization can prove a priori. Also look at what you said in https://news.ycombinator.com/item?id=37427973 https://news.ycombinator.com/item?id=37427973. Now can you see that my point is not nonsense? Diagonalization really does add a layer of self-reference. And the fact that it does is why it doesn't work in the system that I described. This also explains the point that I was making in https://news.ycombinator.com/item?id=37428468 https://news.ycombinator.com/item?id=37428468. Your Coq proof was fine for what it proved. But it was not looking at the key piece of my example. Which is the fact that the functions are not necessarily total functions. They are merely functions which we have a specific reason for believing that they might be total. Namely a proof from a particular set of axioms. And my whole point was that the diagonalized function in general doesn't have equivalent evidence of being total. Which is a point of complexity that your Coq proof did not address. Are you still so certain that I don't know what I'm talking about?