Our proof that the acceptance problem is uncomputable uses a method called diagonalization.
The goal here is to reduce diagonalization to its simplest form.
Definition. K = {‹M› | φM(‹M›) ≠ ⊥}
Theorem. K is uncomputable.
Proof. Suppose that K is computable. Select a Turing machine t that solves K. That is,
(1) φt(‹M›) = true ⇔ φM(‹M›) ≠ ⊥
(2) φt(‹M›) = false ⇔ φM(‹M›) = ⊥
Construct the following program F.
F(‹M›) if t answers true on input ‹M› loop forever else return true end if
Notice that
φF(M) = ⊥
⇔ φt(‹M›) = true (by inspection of F)
⇔ φM(‹M›) ≠ ⊥
Once again, substituting M = F yields contradiction
φF(F) = ⊥ ⇔ φF(‹F›) ≠ ⊥◊
The name diagonalization comes from the fact that we run F on itself. If you create an infinite grid with a row for each Turing machine and a column for each input string, then the values in that table that we are interested in are on the diagonal.
TM s1 s2 s3 … M1 x M2 x M3 x …