Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Course

.pdf
Скачиваний:
10
Добавлен:
28.03.2015
Размер:
1.03 Mб
Скачать

Другими словами, вычислимость функции f на машине Тьюринга при помощи программы P означает следующее. При данных n1; : : : ; nk 2 N мы записываем на ленту слово 01n1 : : : 01nk , устанавливаем головку на первую позицию и запускаем машину работать по программе P из состояния q1. Тогда если f(n1; : : : ; nk) определено, то машина через некоторое время остановится и число единиц на ленте будет равно f(n1; : : : ; nk), а если это значение не определено, то машина будет работать бесконечно.

Теорема 8 Каждая функция, вычислимая на машине Шенфилда, вычислима на машине Тьюринга.

Доказательство. Пусть f(x1; : : : ; xk) частичная k-местная функция, вычислимая на машине Шенфилда по программе P 46 и M некоторое число, которое больше чем k и больше чем номер любого регистра, упоминаемого в программе P .

Ниже нам предстоит написать программу для машины Тьюринга Q, моделирующую работу машины Шенфилда по программе P . Программа Q, согласно определению программы для машины Тьюринга, для любого состояния q (из списка упомянутых в ней и отличных от q0 состояний) и любого символа a 2 § [ fn; mg должна содержать команду qa ! : : :. Однако некоторые команды программы, которую мы напишем, никогда не смогут исполниться, если машина начнет свою работу из состояния, задаваемого конфигурацией hw(n1; : : : ; nk); q1; 1i при произвольных натуральных n1; : : : ; nk (то есть в случае, когда мы используем эту программу для вычисления k-местной функции). В связи с этим мы, чтобы не писать лишнего, примем следующее соглашение: если команда qa ! : : :

отсутствует в приведенном ниже списке команд, то эта команда имеет

вид qa ! qR.

 

 

 

 

 

 

 

 

 

 

 

 

 

Пусть программа P состоит из n строк. Программа Q будет содер-

 

 

 

qa

!

: : :

для

a

2 § [ f

n; m

g и

q

q

; : : : ; q

M¡k+1g [

жать команды n

 

 

 

 

2 f 1

 

q0

; q0 ; q0 ; q0

 

qm; : : : ; qm

 

 

 

 

 

 

 

 

f 1

2 3 4g[ m=1f

1

s(m)g. Мы считаем, что все упомянутые здесь

состояния

различны. Кроме того, примем следующее соглашение: для

 

S

 

 

 

 

 

 

 

 

 

 

 

m > n или m = 0 запись q1m обозначает состояние q10 .

 

 

 

Способ, которым программа Q моделирует работу машины Шенфил-

да по программе P , заключается в следующем. Предположим, что мы

используем программу P

для вычисления f(n1; : : : ; nk). В процессе вы-

числения машина Шенфилда, работая по шагам, последовательно меняет

46P программа для машины Шенфилда.

71

содержимое своих регистров, не затрагивая регистры с номерами, большими чем M. Пусть перед выполнением шага a 2 f1; 2; 3; : : :g содержимое регистром с номерами от 0 до M равно r0a; : : : ; rMa соответственно и на шаге a исполняется команда с номером m(a).

Тогда для машины Тьюринга, начинающей работу по программе Q из состояния, задаваемого конфигурацией hw(n1; : : : ; nk); q1; 1i, существует последовательность шагов t1 < t2 < : : : ее работы, такая что:

1.перед выполнением шага ta на ленте записано слово 1r0a 01r1a 0 : : : 01rMa ;

2.перед выполнением шага ta головка находится в состоянии q1m(a) и указывает на первую ячейку ленты;

3.на шагах ta 6 t < ta+1 все состояния, которые принимает головка, принадлежат множеству fq1m(a); : : : ; qsm(m(a()a))g.

Таким образом, команды программы Q, имеющие вид qa ! : : : для q 2 fq1m; : : : ; qsm(m)g, моделируют исполнение команды исходной программы P под номером m, меняя содержимое ленты машины Тьюринга в соответствии с тем, как команда под номером m меняет содержимое регистров машины Шенфилда. Если при каких-то начальных данных машина Шенфилда останавливается на шаге a (то есть m(a) 621f; : : : ; ng), то в начале шага ta головка машины Тьюринга, работающей по программе Q, оказывается в состоянии q10 и машина Тьюринга переходит к исполнению заключительных команд, после выполнения которых на ленте остается только содержимое нулевого регистра (значение функции, вычисленной на машине Шенфилда) и машина останавливается. Кроме заключительных команд и команд, моделирующих исполнение конкретной команды в исходной программе P , программа Q содержит так называемые подготовительные команды. Это команды, исполняемые на шагах t < t1 и приводящие содержимое ленты машины Тьюринга в соответствие с начальным состоянием регистров машины Шенфилда.

Переходим к детальному описанию команд каждой группы. Подготовительные команды. Эти команды подготавливают ленту ма-

шины, приводя записанные на ней данные в соответствие с содержимым

72

регистров машины Шенфилда перед началом работы по программе P .

q11 ! q1R

q3n ! q40

 

 

q10 ! q1R

 

: : :

 

 

 

 

q1n ! q20

qM¡kn ! qM¡k+10

q20 ! q2R

qM¡k+10 ! qM¡k+1

q n

q

0

q

M¡k+1

1

!

qM

k+1

2

! 3

 

 

 

1¡

 

q30 ! q3R

qM¡k+1m ! q1R

L L

Исполняя эти команды, головка машины движется вправо по ленте, находясь все время в начальном состоянии q1, пока не встанет напротив ячейки с символом n. После этого она дописывает справа M ¡ k символов 0, перейдя в состояние qM¡k+1. Затем она в этом состоянии движется по ленте влево ”до упора” и из самой левой ячейки передвигается вправо,

переходя в состояние q11. Содержимое ленты при этом преобразуется из

w(n1; : : : ; nk) в 1r01 01r11 0 : : : 01rM1 , где ri1 равно ni при 1 6 i 6 k и нулю в противном случае.

Команды, моделирующие выполнение команды машины Шенфилда

сномером m. Возможны два случая.

1.Команда с номером m имеет вид INC i. Тогда список команд для этой группы следующий:

q1m0

q2mR

qim+21

 

qim+30

 

q1m1

! q1mR

qim+30

! qim+1R

 

q2m0

! q3mR

qim+31

! qim+1R

 

qm1

! qmR

qm 0

! qm R

 

2

!

2

im

! m

 

 

 

 

+4

 

i+2

 

 

: : :

 

q +41

!

qi+2R

 

m

q

m

im

m

 

 

qi 0

+1R

qi+1n

 

qi+51

 

qm1

! qimR

qm n

! qm

0

 

i

! i m

+2

 

i+5

 

 

m

im

! m

 

 

qi+10

q +41

qi+50

 

qi+5L

 

qim+11 ! qim+31

qim+51

! qim+5L

 

m

! im

m

!

m+1

R

qi+20 ! qi+40

qi+5m ! q1

 

Исполняя эту группу команд, головка машины сначала сдвигается вправо, отсчитывая i нулей и переходя в состояние qim+1. Затем она вставляет единицу в ту ячейку ленты, на которую указывает, сдвигая содержимое следующих ячеек на одну позицию вправо. Закончив сдвиг, она переходит в состояние qim+5, из которого движется

влево ”до упора”, а потом переходит на первую позицию, меняя состояние на q1m+1.

73

2.Команда с номером m имеет вид DEC i; l. Список команд для этой группы таков:

q1m0

!

q2mR

qim+21

!

qim+2L

qim+61

!

qim+3R

 

m

1

m

R

m

m+1

m

0

m

q1

!

q1

qi+2m

q1

R qi+6

!

qi+61

 

m

0

m

R

m

 

! m

m

 

m

q2

 

 

q3

qi+11

 

 

qi+31

qi+4n

 

qi+7L

qm1

! qmR

qm 0

! qm R

qm

0

! qm n

 

 

 

! 2

 

+3

 

 

i+4

i+7

 

 

i+8

 

2

 

 

im

! m

m

 

! m

 

 

: : :

 

 

 

q +31

!

qi+4R

qi+71

!

qi+8n

q

m

0

 

 

q

m

 

im

m

m

 

m

 

 

 

+1R

qi+40

 

 

qi+5L

qi+8n qi+8L

qim1

! qimR

qm 1

! qm L

qm

0

! qm L

 

im

 

! i m

+4

 

 

i+6

i+8

 

 

i+8

q

 

im

! m

m

 

! m

+10

!

qi+2L

qi+50

!

qi+3R

qi+81

!

qi+8L

 

im

 

 

m

m

m

m

 

l

qi+20 ! qi+2L

qi+51 ! qi+50

qi+8m ! q1R

Исполняя эту группу команд, машина выполняет следующие действия. Сначала, как и в предыдущем случае, головка машины сдвигается вправо, отсчитывая i нулей и переходя в состояние qim+1. Дальнейшие действия зависят от содержимого ячейки, на которую указывает головка. Если в этой ячейке находится ноль (то есть содержимое i-го регистра машины Шенфилда равно нулю), то головка машины Тьюринга переходит в состояние qim+2, идет влево ”до упора”, а затем сдвигается на одну позицию вправо, переходя в состояние q1m+1. Если же головка в состоянии qim+1 указывает на ячейку, в которой записана единица, то она переходит в состояние qim+3 и затем стирает содержимое этой ячейки, сдвигая все ячейки справа от этой на одну позицию влево и постепенно перемещаясь вправо. После того, как сдвиг осуществлен, головка переходит в состояние qim+8, находясь в котором, движется ”до упора” влево, а затем сдвигается вправо на одну позицию и переходит в состояние q1l .

Заключительные команды. После того, как работа машины Шенфилда закончена, на ленте машины Тьюринга сначала записана группа единиц, число которых равно вычисленному значению функции, затем ноль и далее еще нули и единицы, отображающие состояние регистров машины Шенфилда, отличных от R0. Эти лишние символы надо стереть. Для этого предназначена следующая группа команд:

q10 1 ! q10 R

q20 1 ! q30 n

q40 n ! q40 L

q10 0 ! q20 0

q30 n ! q20 R

q40 1 ! q40 L

q20 0 ! q30 n

q20 n ! q40 L

q40 m ! q0R

74

Действия, производимые этими командами, очевидны.

Из описаний следует, что все группы команд выполняют те действия, которые от них требуются. Собирая вместе все команды из различных групп, получаем программу Q, вычисляющую на машине Тьюринга функцию f. ¤

Следствие 4 Каждая частично рекурсивная функция вычислима на машине Тьюринга.

Доказательство. Это прямое следствие теорем 7 и 8. ¤

На самом деле мы доказали чуть больше, чем требовалось. Пусть f(x1; : : : ; xk) частично рекурсивная функция и P программа для вычисления функции f, которую мы построили в теореме 8. Если для n1; : : : ; nk 2 N f(n1; : : : ; nk) определено и мы запустим машину Тьюринга работать по этой программе, записав на ленте слово w(n1; : : : ; nk), установив головку на первую позицию и приведя ее в состояние q1, то через некоторое время машина остановится, придя в состояние q0, и на ленте окажется записанным некоторое слово v. Нам было бы достаточно, чтобы число единиц в слове v было равно f(n1; : : : ; nk), причем эти единицы могут быть раскиданы по ленте как угодно, перемежаясь символами 0 и n. Однако у нас эти единицы идут подряд, одна за другой, начиная с первой ячейки; нулей на ленте нет, а головка находится в первой позиции. Если вспомнить определение 13, то этот результат можно интерпретировать следующим образом: мы доказали, что каждая частично рекурсивная функция является вычислимой в самом общем смысле, то есть в смысле определения 4. У нас есть два конструктивных пространства: Nk и N, а также функция f из первого пространства во второе. Эта функция будет вычислимой, если существует алгоритм, который по описанию набора аргументов дает описание значения функции на этих аргументах. Можно зафиксировать следующие описания: набор чисел n1; : : : ; nk описывается словом w(n1; : : : ; nk), а натуральное число n словом 1n. Тогда реализацией требуемого алгоритма будет программа для машины Тьюринга, для построения которой можно использовать конструкции теорем 7 и 8.

В настоящий момент мы собираемся определить кодировки конфигураций и программ машин Тьюринга. Позже мы введем общее понятие

75

нумерации и увидим, что кодировка это, по сути, частный случай нумерации. А пока скажем, что кодировка объекта это способ его задания при помощи натуральных чисел.

Кодирование конфигураций. Мы продолжаем работать с алфавитом § = f0; 1g. Вспомним, что конфигурация это тройка hw; qi; li, где w слово алфавита § [ fng, не заканчивающееся на n, qi состояние головки, а l натуральное число (номер ячейки ленты, на которую указывает головка). Конфигурации мы будем кодировать тройками натуральных чисел hm1; m2; m3i, где m1 код слова w, m2 код состояния qi, а m3 код числа l. Кодом числа l будет само число l (то есть m3 = l). Код состояния qi это номер этого состояния, то есть число i. Наконец, кодом слова w = a1 : : : ak назовем число p(1)"1 p(2)"2 : : : p(k)"k , где для 1 6 i 6 k "i определяется следующим образом:

 

>

ai = n;

 

0;

 

<2;

ai = 1:

"i =

81;

ai = 0;

 

>

 

 

:

 

Из единственности разложения каждого натурального числа на простые множители следует, что разным словам сопоставляются разные коды, то есть по коду слова можно однозначно восстановить само слово.

Кодирование программ. Задавая кодировку программ, мы ставим перед собой более сложную задачу, чем в предыдущем случае. Мы хотим, чтобы наша кодировка удовлетворяла следующим трем требованиям:

1.Код каждой программы это некоторое натуральное число (а не тройка чисел, как в предыдущем случае).

2.Каждая программа имеет хотя бы один код (мы допускаем, что разные числа могут кодировать одну и ту же программу).

3.Каждое натуральное число является кодом некоторой программы.

Для задания кодировки поступим следующим образом: опишем, как по натуральному числу восстановить программу, которую оно кодирует. Из описания будет следовать, что каждая программа получит какой-то код.

Пусть k 2 N. Программа, которую это число кодирует, содержит команды вида qia ! : : :, где a символ алфавита f0; 1; n; mg, а qi элемент множества fq0; q1; : : : ; qsg для некоторого s > 1. Значит, по коду k

76

8 >0;
>
>
<1;

мы должны уметь получать число s. Положим s = l(k) + 1, рассматривая ”левую часть” числа47 k как код для множества состояний головки. ”Правую часть” r(k) мы интерпретируем как код для списка команд программы.

Сопоставим каждой паре hqi; ai, где i 6 s и a 2 f0; 1; n; mg натуральное число ¯(qi; a) следующим образом: ¯(qi; a) = c(i; "(a)), где "(a) определяется так:

a = n

"(a) =

a = 0

>>>2; a = 1

:3; a = m

Ясно, что разным парам будут сопоставлены разные натуральные числа. Число r(k) + 1 единственным способом раскладывается на простые множители. Поступим следующим образом: показатель степени при простом числе p(¯(qi; a)) в разложении r(k) + 1 будем рассматривать как число, кодирующее правую часть команды qia ! : : :.

Итак, пусть t это максимальное натуральное число, такое что p(¯(qi; a))t делит r(k) + 1. Соответствующая числу t команда программы, кодом которой является число k, имеет вид qia ! qjb, где j 6 s и b 2 f0; 1; n; L; Rg. ”Левую часть” l(t) числа t будем интерпретировать как код состояния qj, а ”правую часть” r(t) как код символа b. Примем следующие правила кодирования: j равно остатку от деления числа l(t)

на s + 1 (то есть j = rest(l(t); s + 1)), а

8

>>n; rest(r(t); 5) = 0 и a =6 m

>

>

>

>0; rest(r(t); 5) = 1 и a 6= m

<

b = >1; rest(r(t); 5) = 2 и a =6 m

>

>L; rest(r(t); 5) = 3 и a 6= m

>

>

>

:R; rest(r(t); 5) = 4 или a = m

Описание кодировки закончено. Легко видеть, что каждому натуральному числу действительно сопоставляется некоторая единственная программа, кодом которой оно является. Разным натуральным числам может сопоставляться одна и та же программа, однако этот факт для нас

47Имеем k = c(x; y) для некоторых единственных x и y. Число x мы называем ”левой частью” числа k, а число y ”правой частью”.

77

8
>f (x ; : : : ; x ); P (x ; : : : ; x )
> 1 1 k 1 1 k
>
<f2(x1; : : : ; xk); P2(x1; : : : ; xk)

не является помехой. Также легко понять, что для каждой программы найдется натуральное число, которое является ее кодом. Действительно, если есть программа, написанная для множества состояний fq0; q1 : : : qsg, то ее кодом будет число c(s ¡ 1; x ¡ 1), где x вычисляется так: надо для каждой команды qia ! : : :, взять число p(¯(qi; a)), возвести его в степень t, где t какой-либо из кодов правой части команды, а затем взять произведение этих степеней по всем командам программы.

Определим три четырехместные функции Step1, Step2 и Step3. Пусть hm1; m2; m3i произвольная тройка натуральных чисел и n натуральное число. Пусть P программа, кодом которой является число n. Возможны два случая.

1.Тройка hm1; m2; m3i не является кодом никакой конфигурации либо hm1; m2; m3i код конфигурации hw; qi; li, но состояние qi не входит в число состояний, с которыми работает программа P (то есть i >

l(n)+1). Полагаем Step1(n; m1; m2; m3) = m1, Step2(n; m1; m2; m3) = m2 и Step3(n; m1; m2; m3) = m3.

2. Тройка hm1; m2; m3i является кодом конфигурации hw; qi; li и i 6 l(n) + 1. Тогда определена конфигурация hv; qj; ki, равная Step(hw; qi; li; P ), которая отражает состояние машины Тьюринга, получающееся после одного шага работы машины по программе P из состояния, соответсвующего конфигурации hw; qi; li. Конфигурация hv; qj; ki имеет код, равный hm01; m02; m03i. Полагаем Step1(n; m1;

m2; m3) = m01, Step2(n; m1; m2; m3) = m02 и Step3(n; m1; m2; m3) = m03.

Лемма 3 (о кусочном определении функции) Пусть P1(x1; : : : ; xk),

: : :, Pn(x1; : : : ; xk) примитивно рекурсивные предикаты, такие что для любых n1; : : : ; nk 2 N существует единственное 1 6 i 6 n, для которого

предикат Pi(n1; : : : ; nk) истинен. Пусть f1(x1; : : : ; xk), : : :, fn(x1; : : : ; xk)

примитивно рекурсивные функции. Тогда функция

f(x1

; : : : ; xk) = >fn(x1;:::::: ; xk); Pn(x1;:

::

::: ; xk)

 

>

 

 

 

>

 

 

 

:

 

 

примитивно рекурсивна.

78

Доказательство. f(x1; : : : ; xk) = Pni=1 ÂPi (x1; : : : ; xk)fi(x1; : : : ; xk). ¤

Лемма 4 Функции Step1, Step2 и Step3 примитивно рекурсивны.

Доказательство. Ясно, что тройка hm1; m2; m3i является кодом некоторой конфигурации тогда и только тогда, когда для любого i

log(p(i); m1) 6 2, log(p(0); m1) = 0 и m1 =6 0. Легко заметить, что для любого i p(i) > i и что если log(p(i); m1) > 2, то p(i) < m1. В связи с этим условие, при выполнении которого функции Stepi (1 6 i 6 3) задаются в

пункте 2 приведенного выше определения, выполняется тогда и только тогда, когда на наборе n; m1; m2 истинен примитивно рекурсивный пре-

дикат S(y; x1; x2) = (x2 6 l(y) + 1) & (x1 =6 0) & ((¹i 6 x1)(log(p(i); x1) > 2) = x1 + 1) & (log(p(0); x1) = 0).

Введем несколько примитивно рекурсивных функций:

i(x1; x2; x3) = x2

 

 

3;

x3

= 0

a(x1; x2; x3) = (log(p(x3); x1);

x3

> 0

t(y; x1; x2; x3) = log(p(c(i(x1; x2; x3); a(x1; x2; x3))); r(y) + 1)

j(y; x1; x2; x3) = rest(l(t(y; x1; x2; x3)); l(y) + 2)

b(y; x1; x2; x3) =

(4;

1

2

3

 

x3

= 0

 

rest(r(t(y; x

; x

; x

)); 5);

x3

> 0

Смысл этих функций таков. Пусть n номер программы P и hm1; m2; m3i код конфигурации hw; qi; ki, причем i 6 l(n)+1. Рассмотрим состояние машины, соответствующее этой конфигурации. В этом состоянии головка находится в состоянии qi и указывает на k-ую ячейку ленты, в которой записан некоторый символ a 2 f0; 1; m; ng. В программе P есть команда qia ! qjb, где b 2 fn; 0; 1; L; Rg. Тогда i = i(m1; m2; m3),

79

a(m1; m2; m3) код символа a, t(n; m1; m2; m3) код правой части команды qia ! qjb, j = j(n; m1; m2; m3) и b(n; m1; m2; m3) код символа b. Пусть T (y; x1; x2) примитивно рекурсивный предикат, равный

S(y; x1; x2) & (i(x1; x2; x3) 6= 0). Окончательно получаем

 

 

 

>

x3

;

 

 

(b(y; x1; x2; x3) 6 2) _ :T (y; x1; x2)

Step3(y; x1; x2; x3) =

8x3

 

:

 

1; (b(y; x1; x2; x3) = 3) & T (y; x1; x2)

 

 

 

 

 

 

>

 

 

 

 

 

 

>

 

 

 

:

 

 

+ 1; (b(y; x1; x2; x3) 4) & T (y; x1; x2);

 

 

 

<x3

Step (y; x

; x

 

; x

) =

x2;

:T (y; x1; x2)

2

1

 

2

 

3

 

 

 

 

(j(y; x1; x2; x3); T (y; x1; x2);

(

Step1(y; x1; x2; x3) = x1; (b(y; x1; x2; x3) > 3) _ :T (y; x1; x2) °(y; x1; x2; x3); (b(y; x1; x2; x3) 6 2) & T (y; x1; x2);

где °(y; x1; x2; x3) = div(x1; p(x3)a(x1;x2;x3)) ¢ p(x3)b(y;x1;x2;x3). ¤

Введем теперь три пятиместные функции Com1, Com2, Com3. Для

1 6 i 6 3 полагаем

 

 

 

2

Comi(y; x1

; x2; x3

; 0)

=

xi

Comi(y; x1

; x2; x3

; t + 1)

=

Stepi(y; Com1(y; x1; x2; x3; t);

4

 

 

 

 

Com2(y; x1; x2; x3; t); Com3(y; x1; x2; x3; t))

Смысл этих функций ясен. Если hm1; m2; m3i код конфигурации C, n натуральное число, кодирующее программу P , и программа P применима к конфигурации C (то есть m2 6 l(n) + 1), то для любого t

hCom1(n; m1; m2; m3; t); Com2(n; m1; m2; m3; t); Com3(n; m1; m2; m3; t)i

код конфигурации Com(C; P; t), отражающей состояние машины, которое получается из состояния, задаваемого конфигурацией C, после t шагов работы по программе P .

Лемма 5 Функции Com1, Com2 и Com3 примитивно рекурсивны.

Доказательство. Рассмотрим трехместную функцию ®(y; x; t), которая задается следующей схемой примитивной рекурсии:

·

®(y; x; 0)

=

x

®(y; x; t + 1)

=

2¯1(y;®(y;x;t)) ¢ 3¯2(y;®(y;x;t)) ¢ 5¯3(y;®(y;x;t));

80

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]