3Computability theory

III Logic



3.6 Reducibility
We’ve alluded to the notion of reducibility several times previously. For example,
we had two versions of the halting set, and said that if we could decide membership
of one of them, then we can decide membership of the other. When we proved that
there is a decidable partition of
N
(3)
with no infinite decidable monochromatic
set, we said if we had such a thing, then we could use it to solve the halting
problem.
The general idea is that we can often “reduce” one problem to another one.
The most basic way of expressing this is via many-to-one reducibility.
Definition
(Many-to-one reducibility)
.
Let
A, B N
. We write
B
m
A
if
there exists a total computable functions
f
:
N N
such that for all
n N
, we
have n B f(n) A.
Thus, if we have such a set, then whenever we can correctly answer questions
about membership in
A
, then we can answer questions about membership in
B
.
It is easy to see that this is a quasi-order. If we take the intersection
m
m
of the relations, then we get an equivalence relation. The equivalence classes are
called many-one degrees. We think of these as “degree of unsolvability”.
Proposition. Let A N. Then A
m
K iff A is semi-decidable.
This is a technical exercise. Another useful fact is the following:
Proposition. (N \ K)
M
A iff A is productive.
But it turns out this is a rather awkward definition of “relative computability”.
In our definition of many-one reducibility, we are only allowed to run
f
once,
and see if the answer is in A. But why once?
The idea is define reducibility semantically. We assume that when writing
programs, we can do all the usual stuff, but also have access to a magic function
f
, and we are allowed to call
f
as many times as we wish and use the results.
We call
f
an oracle. For our purposes,
f
is the (total) characteristic function of
A.
For technical reasons, we will suppose we have a fixed programming language
that just refers to an opaque function
f
, and then we can later plug different
things as
f
. This allows us to compare odel numberings for functions with
different oracles.
Definition
(Turing reducibility)
.
We say
B
T
A
, or simply
B A
, if it is
possible to determine membership of
B
whenever we have access to an oracle
that computes χ
A
.
Again
is a quasi-order, and intersecting with the reverse, we get an
equivalence relation, which we call Turing degree, or just degree.
Now the quasi-order gives us a relation on Turing degrees. A natural question
to ask is if this is actually a total order.
To begin with, Turing degrees certainly form an upper semi-lattice, as given
A
and
B
, we can form the disjoint union of
A
and
B
, and knowing about
membership of
A
`
B
means we know membership of
A
and
B
, and vice versa.
But are they linearly ordered by ? The answer is no!
Theorem
(Friedberg–Muchnik)
.
There exists two
A, B N
such that
A 6≤ B 6≤
A. Moreover, A and B are both semi-decidable.
Proof. We will obtain the sets A and B as
A =
[
n<ω
A
n
, B =
[
n<ω
B
n
,
where
A
n
and
B
n
are finite (and in particular decidable) and nested, i.e.
i < j
implies A
i
A
j
and B
i
B
j
.
We introduce a bit of notation. As mentioned, if we allow our programs to
access the oracle
B
, then our “programming language” will allow consultation of
B
. Then in this new language, we can again assign odel numbers to programs,
and we write
{e}
B
for the program whose G¨odel number is
e
. Instead of inventing
a new language for each
B
, we invent a language that allows calling an “oracle”,
without specifying what it is. We can then plug in different sets and run.
Our objective is to pick A, B such that
χ
A
6= {e}
B
χ
B
6= {e}
A
for all e. Here we are taking χ
A
to be the total version, i.e.
χ
A
(x) =
(
1 x A
0 x 6∈ A
.
The idea is, of course, to choose
A
m
such that it prevents
χ
A
from being
{m}
B
,
and vice versa. But this is tricky, because when we try to pick
A
m
, we don’t
know the whole of B yet.
It helps to spell out more explicitly what we want to achieve. We want to
find some n
i
, m
i
N such that for each i, we have
χ
A
(n
(i)
) 6= {i}
B
(n
(i)
)
χ
B
(m
(i)
) 6= {i}
A
(m
(i)
)
These n
i
and m
i
are the witness to the functions being not equal.
We now begin by producing infinite lists
N
i
= {n
(i)
1
, n
(i)
2
, · · · }
M
i
= {m
(i)
1
, m
(i)
2
, · · · }
of “candidate witnesses”. We will assume all of these are disjoint. For reasons
that will become clear later, we assign some “priorities” to these sets, say
N
1
> M
1
> N
2
> M
2
> N
3
> N
3
> · · · .
We begin by picking
A
0
= B
0
= .
Suppose at the
t
th iteration of the process, we have managed to produce
A
t1
and
B
t1
. We now look at
N
1
, . . . , N
t
and
M
1
, · · · , M
t
. If they have managed to
found a witness, then we leave them alone. Otherwise, suppose
N
i
hasn’t found
a witness yet. Then we run
{i}
B
t1
(
n
(i)
1
) for
t
many time steps. We consider
the various possibilities:
Let
n
be the first remaining element of
N
i
. If
{i}
B
t1
(
n
) halts within
t
steps and returns 0, then we put
n
into
A
t
, and then pick this as the
desired witness. We now look at all members of
B
t1
our computation of
{i}
B
t1
has queried. We remove all of these from all sets of lower priority
than N
i
.
Otherwise, do nothing, and move on with life.
Now the problem, of course, is that whenever we add things into
A
t
or
B
t
, it
might have changed the results of some previous computations. Suppose we
originally found that
{
10
}
B
4
(32) = 0, and therefore put 32 into
A
5
as a witness.
But later, we found that
{
3
}
A
23
(70) = 0, and so we put 70 into
B
24
. But if the
computation of
{
10
}
B
4
(32) relied on the fact that 70
6∈ B
4
, then we might have
{10}
B
24
(32) 6= 0,
and now our witness is “injured”. When this happens, we forget the fact that we
picked 32 as a witness, and then pretend
N
10
hasn’t managed to find a witness
after all.
Fortunately, this can only happen because
M
3
is of higher priority than
N
10
,
and thus 70 was not forbidden from being a witness of
M
3
. Since there are only
finitely many things of higher priorities, our witness can be injured only finitely
many times, and we will eventually be stabilized.
We are almost done. After all this process, we take the union and get
A
and
B
. If, say,
{i}
A
has a witness, then we are happy. What if it does not?
Suppose
{i}
A
is some characteristic function, and
m
is the first element in the
list of witnesses. Then since the lists of candidate witnesses are disjoint, we
know
m 6∈ B
. So it suffices to show that
{i}
A
(
m
)
6
= 0. But if
{i}
A
(
m
) = 0,
then since this computation only involves finitely many values of
A
, eventually,
the membership of these things in
A
would have stabilized. So we would have
{i}
A
(m) = 0 long ago, and made m a witness.