A quick recap of Lecture 27.
Shown by dovetailing.
Shown by diagonalization.
Suppose for contradiction that there is a list $\{r_0, r_1, r_2, \ldots \}$ of all real numbers in $[0,1)$.
Consider the digits $x_0, x_{1}, x_{2}, x_{3}, \ldots$ on the diagonal of this list, i.e., the $n$-th digit of $r_n$ for $n\in\N$.
For each such digit $x_{i}$, construct the digit $\widehat{x}_i$ as follows:
Now, consider the number $\widehat{r} = 0.\widehat{x} _ 0 \widehat{x} _ 1 \widehat{x} _ 2 \widehat{x} _ 3 \ldots$
Note that $r_n \neq \widehat{r}$ for any $n\in\N$ because they differ on the $n$-th digit.
So the list doesn’t include $\widehat{r}$, which is a contradiction. Thus the set $[0, 1)$ is uncountable.
$r_0$ | $0.$$5$$00000000000\ldots$ |
$r_1$ | $0.3$$3$$3333333333\ldots$ |
$r_2$ | $0.14$$2$$857142857\ldots$ |
$r_3$ | $0.141$$5$$92653589\ldots$ |
$r_4$ | $0.2000$$0$$0000000\ldots$ |
$\vdots$ |
Suppose for contradiction that there is a list $\{f_1, f_2, f_3, \ldots \}$ of functions from $\N$ to $\{0,1\}$.
Consider the outputs $x_0, x_1, x_2, x_3, \ldots$ on the diagonal of this list, i.e., $f_n(n)$ for $n\in\N$.
For each such output $x_{i}$, construct $\widehat{x}_i$ as follows:
Now, consider the function $\widehat{f}(n) = \widehat{x} _ {n}$.
Note that $f_n \neq \widehat{f}$ for any $n\in\N$ because the functions differ on the $n$-th output.
So the list doesn’t include $\widehat{f}$, which is a contradiction. Thus the set $\{f \,|\, f:\N\to\{0,1\}\}$ is uncountable.
$f_0$ | $0$$\,0\,0\,0\,0\,0\,0\,0\,0\ldots$ |
$f_1$ | $1\,$$1$$\,1\,1\,1\,1\,1\,1\,1\ldots$ |
$f_2$ | $0\,1\,$$0$$\,1\,0\,1\,0\,1\,0\ldots$ |
$f_3$ | $0\,1\,1\,$$1$$\,0\,1\,1\,1\,0\ldots$ |
$f_4$ | $1\,1\,0\,0\,$$0$$\,1\,1\,0\,0\ldots$ |
$\vdots$ |
We’ll study one such important function today.
Important problems computers can’t solve.
code(P)
will denote “the code of the program P
”.public static boolean P(String x) {
return x.matches("public .*");
}
P(code(P))
?code(P)
for any program $P$ and an input $x$,true
if $P$ halts on the input $x$, andfalse
if $P$ does not halt (diverges) on the input $x$.code(P)
for any program $P$ and an input $x$,true
if $P$ halts on the input $x$, andfalse
if $P$ does not halt (diverges) on the input $x$.In other words, there is no program H(code(P),x)
that computes the function described by the halting problem.
This function is therefore uncomputable.
Because the function outputs a boolean (a yes/no decision),
we say that the underlying problem is undecidable.
H
is a program that solves the halting problem.D
as follows:public static void D(String x) {
if (H(x, x) == true) {
while (true); // diverge
} else {
return; // halt
}
}
Does D(code(D))
halt?
H
solves the halting problem means the following:D(x)
halts then H(code(D),x)
is true otherwise H(code(D),x)
is false.D(code(D))
halts.H
, it must be that H(code(D),code(D))
is true.D(code(D))
doesn’t halt by definition of D
.D(code(D))
doesn’t halt.H
, it must be that H(code(D),code(D))
is false.D(code(D))
halts by definition of D
.H
exists must be false. $\square$D
come from?public static void D(String x) {
if (H(x, x) == true) {
while (true); // diverge
} else {
return; // halt
}
}
D
halts on code(P)
H(code(P),code(P))
outputs false, i.e.,P
doesn’t halt on the input code(P)
.D
differs from every program P
on the input code(P)
.code(P)
.D
behaves like the flipped diagonalD
isn’t included, it cannot exist!$\langle P_0\rangle$ | $\langle P_1\rangle$ | $\langle P_2\rangle$ | $\langle P_3\rangle$ | $\langle P_4\rangle$ | $\ldots$ | |
$P_0$ | 0 | 1 | 1 | 0 | 1 | $\ldots$ |
$P_1$ | 1 | 1 | 0 | 1 | 0 | $\ldots$ |
$P_2$ | 1 | 0 | 1 | 0 | 0 | $\ldots$ |
$P_3$ | 0 | 1 | 1 | 0 | 1 | $\ldots$ |
$P_4$ | 0 | 1 | 1 | 1 | 1 | $\ldots$ |
$\vdots$ | $\vdots$ | $\vdots$ | $\vdots$ | $\vdots$ | $\vdots$ | $\ldots$ |
Go forth and prove great things!