Turing Machines
samwho.dev
samwho.dev
It's interesting that Turing didn't realise this, as the whole paper revolves around diagonalisation arguments in a few places.
The "modern" take is to define a computable real to be a program that takes an epsilon as input and returns a rational number within that epsilon from the real being represented. Or something similar - in this case it is very simple to define addition, for instance, as you have control over these bounds.
One more fact - equality is incomputable for both of these representations! There's no program that can uniformly decide whether two computable reals are the same, no matter how you cook up the definition. This one maybe isn't too surprising - in some sense no matter how many digits or bounds you check between two reals you can never be sure there isn't a smaller gap between them you haven't gotten to yet.
This has nothing to do with such a "confusion", by the way, which is obvious to anyone writing about this stuff (including me). Rather it's the difference between something being logically definable and computable, which Turing himself writes about in his paper.
Wrong is a judgement call, of course, but given that we're talking about computability here I think it's fair to call Turing's definition flawed. There's a reason nobody uses it in computable analysis.
[1] H. G. Rice, Recursive real numbers, Proc. Amer. Math. Soc. 5 (1954) https://doi.org/10.1090/S0002-9939-1954-0063328-5
However, under Turing's definition there is no algorithm that can uniformly compute addition or multiplication! This has nothing to do with whether the set of computable reals is closed under those operations (although it is, of course - this is an easy exercise, no need to cite a paper).
I'll be more formal. Let us say a Turing machine A is a "Turing-real for x" if A outputs the successive digits of x when run. Then consider the following problem: given two Turing-reals A for a and B for b as input, output a Turing-real for a+b.
It turns out this problem is incomputable!
On the other hand the same problem but for the modern "approximation-reals" is computable, a marked improvement.
The lack of computable addition and multiplication is the flaw in Turing's definition. This is well known stuff - there's even a discussion of it on the Wikipedia page for computable reals. The fact that you keep bringing up orthogonal issues, like closure of the computable reals and the distinction between a Turing machine coding for a real and the real itself, makes me think that you might be missing the crux of the matter here.
By the way I read through that paper you linked and I think it's possible Rice wasn't aware of the issue here either. He references Turing's paper and notes that Turing's definition is equivalent to his, but what I've been getting at here is that this equivalence itself is not computable. There's no effective procedure to convert between Turing-reals and Rice-reals, even though you can prove that they define equivalent subsets of R.
Turing himself proves this in "On Computable Numbers, with an Application to the Entscheidungsproblem: A Correction", so it seems he came to realise his error.
I think claiming these efforts were independent is misleading. Church was Turing’s PhD advisor in 1936, and one of the appendices of Turing’s thesis retroactively justifies the lambda calculus definition of computing, by proving it equivalent to his Turing machine definition. That sounds less like competing definitions of computability to me, and instead a story of collaboration to produce a philosophical justification (Turing machines) for Church’s pure mathematical theory (lambda calculus). Which is not to disparage Turing either: creating this philosophical justification was an impressive and fundamentally important achievement. I think Church sometimes gets unfairly maligned in these discussions as an out-of-touch purist who didn’t care to come up with a believable definition, but clearly he cared enough to support his student working on the problem!
Is there some evidence for the independence or competitiveness of their work that I’ve missed?
Anyway, apart from this nitpick about the introduction, I appreciate seeing this foundational stuff explained clearly!
Happy to answer any questions you might have, and love to hear feedback good and bad.
[1] https://ideas.lego.com/projects/10a3239f-4562-4d23-ba8e-f4fc...
0b00: Increment memory pointer (wraps)
0b01: Increment memory value (wraps)
0b10: Jump marker - Jump to next marker if memory value 1, prior if 2 (wraps)
0b11: Output current memory value
It has 2 tapes, instruction & memory. Memory is an array of byte.
This cannot handle any kind of input, but is useful for generating programs that can. Being able to pack 32 instructions into each interpreter machine word opens up some interesting possibilities for how we search the space.
Note the “computed” - this is about computing the results, there’s no mention of IO or UI.
E.g. a Turing complete language might still not allow you to build a word processor or YouTube; you could compute the color of every pixel, but you’d still need a way to display it.
> • What can and cannot be computed.
I don’t think it delivered on the “can” part. (And I don’t think we really know that well.)
What would you suggest I do to deliver on this?
Maybe rather:
• That some truths cannot be computed.
> Something is said to be "computable" if there exists an algorithm that can get from the given input to the expected output. For example, adding together 2 integers is computable.
I could probably have dug into some of the restrictions, like how it has to be a finite number of steps.
At the level you’re describing Turing machines, it’s also not clear that readers would have a precise notion of what an algorithm is. At no point (unless I missed it) do you explain that any algorithm is supposed to be implementable as a Turing machine, or the assumption of what is otherwise known as the Church–Turing thesis.
What’s different is that accessing an arbitrary position on the tape isn’t O(1), like normally assumed for memory, On the other hand, memory (and address space) on real-world computers is finite, so you can always find a large-enough constant to make the Turing equivalent O(1) again.
It's a systolic array of Look Up Tables, 4 bits in, 4 bits out, with a latch on each latched.
This is like saying a CPU isn't a computer. It's sort of right but sort of wrong, you know?