Imagine a turing machine running forever on an infinite input tape of binary digits, and writing to an output tape of binary digits. This defines a computable function .1
We assume all turing machines preform no "tape reversals", i.e. once digit is output it cannot be changed later on. If there were arbitrary tape reversals then the halting problem would prevent us from ever knowing when the first digits have been output.
Let and . We want a so implies .
Compute . at step our turing machine has computed digits of using (at most!) the first digits of , meaning any with the first digits in common with must have the first digits of equal to ! 2
Setting such that -digit agreement implies -closeness, and letting be the timestep when we finish computing the first digits allows us to define small enough so the first digits must agree, finally giving us .
See also: this confusing stackexchange post.
Technically is only computable numbers (in the output at least, input too if you're defining stuff reasonably (e.g. so computable inverses exist)) ↩
The reason has also computed digits after steps is that looks the same as when restricted to timesteps (since the first digits agree!), we are assuming "no tape reversals" (after reading more digits of we decide to go back and edit the first digits) in our argument. ↩