Глава 20

Машины Тьюринга

[16/94%]
Показать
LaTeX
Задача 302

Построить машину Тьюринга, выполняющую следующую задачу: по входу, состоящему из одного или нескольких слов w1ΛΛwnw_{1} \Lambda \ldots \Lambda w_{n} в алфавите Σ\Sigma (возможно, что n=1n=1), построить выход, удвоив последнее из слов: w1ΛΛwnΛwnw_{1} \Lambda \ldots \Lambda w_{n} \Lambda w_{n}.

?
Задача 303

Построить машину Тьюринга, сравнивающую два входных слова в алфавите {a,b,c}\left\{ a, b, c\right\} лексикографически. Она должна вычислять словарную функцию:

f(x,y)={a, если x<yb, если x=yc, если y<x f(x, y)= \begin{cases} a, & \text{ если } x<y \\ b, & \text{ если } x=y \\ c, & \text{ если } y<x \end{cases}
?
Задача 304

Построить программы машин Тьюринга, вычисляющих следующие словарные функции в алфавите Σ={a,b,c}\Sigma =\left\{ a, b, c\right\} :

?
(а)

циклическая перестановка букв: f(xw)=wx,xΣf(x w)=w x, x \in \Sigma;

(б)

циклическая перестановка слов: f(w1,,wn)=(w2,,wn,w1)f\left(w_{1}, \ldots , w_{n}\right)=\left(w_{2}, \ldots , w_{n}, w_{1}\right);

(в)

«переворачивание» последовательности слов: f(w1,,wn)=(wn,,w1)f\left(w_{1}, \ldots , w_{n}\right)=\left(w_{n}, \ldots , w_{1}\right);

(г)

удвоение каждой буквы: f(x1xn)=x1x1xnxnf\left(x_{1} \ldots x_{n}\right)=x_{1} x_{1} \ldots x_{n} x_{n};

(д)

нахождение образа при гомоморфизме φ:φ(a)=a,φ(b)=cb,φ(c)=ε\varphi : \varphi (a)=a, \varphi (b)=c b, \varphi (c)=\varepsilon;

(е)

удаление всех одиночных букв aa, стоящих на чётных позициях;

(ж)

проверка, содержат ли два слова одно и то же количество букв aa (результат равен 1, если ответ «да», 0, если «нет»);

(з)

проверка, является ли слово палиндромом (то есть симметричным);

(и)

проверка, есть ли в слове две последовательности букв aa одной и той же длины;

(к)

проверка, образуют ли в слове количества букв a,ba, b и cc возрастающую арифметическую прогрессию.

Задача 305

Построить машину Тьюринга для перевода записи числа из двоичной системы в унарную, входной алфавит {0,1}\left\{ 0,1\right\}.

?
Задача 306

Построить программы односторонних машин Тьюринга, вычисляющих следующие арифметические функции в унарной системе:

?
(а)

x+yx+y;

(б)

xy\lfloor x-y\rfloor

(в)

xyx y

(г)

сравнение x<yx<y;

(д)

возведение в степень: xyx^{y};

(е)

квадратный корень: x\lfloor \sqrt{x}\rfloor;

(ж)

логарифм: log2x;\left\lfloor \log_{2} x\right\rfloor ;

(з)

деление нацело: x/y\lfloor x / y\rfloor;

(и)

остаток: xmodyx \bmod y;

(к)

функция выбора mm-го аргумента: idm,m\mathrm{id}_{m}, m — заранее заданная константа.

Задача 307

Даны машины Тьюринга со стандартной заключительной конфигурацией Mi\mathfrak {M}_{i}, каждая из которых вычисляет словарную функцию fi(x)f_{i}(x) за время ti(x)t_{i}(x), i=1,,ni=1, \ldots , n. Указать, как построить, и оценить время работы

?
(а)

машины M1;;Mn\mathfrak {M}_{1} ; \ldots ; \mathfrak {M}_{n}, вычисляющей функцию g1(x)=fn(f1(x))g_{1}(x)=f_{n}\left(\ldots f_{1}(x) \ldots \right);

(б)

машины par(a,M1,,Mn)\operatorname {par}\left(a, \mathfrak {M}_{1}, \ldots , \mathfrak {M}_{n}\right), вычисляющей функцию

g2(x1ax2aaxn)=f1(x1)af2(x2)aafn(xn); g_{2}\left(x_{1} a x_{2} a \ldots a x_{n}\right)=f_{1}\left(x_{1}\right) a f_{2}\left(x_{2}\right) a \ldots a f_{n}\left(x_{n}\right) ;
(в)

машины if(M1,M2,M3)\operatorname {if}\left(\mathfrak {M}_{1}, \mathfrak {M}_{2}, \mathfrak {M}_{3}\right), вычисляющей функцию

g3(x)={M2(x), если M1(x) непусто, M3(x), если M1(x) пусто;  g_{3}(x)= \begin{cases} \mathfrak {M}_{2}(x), & \text{ если } \mathfrak {M}_{1}(x) \text{ непусто, } \\ \mathfrak {M}_{3}(x), & \text{ если } \mathfrak {M}_{1}(x) \text{ пусто; }\end{cases}
(г)

машины while(M1,M2)\operatorname {while}\left(\mathfrak {M}_{1}, \mathfrak {M}_{2}\right), вычисляющей функцию g4(x)=xqg_{4}(x)=x_{q}, где qq — наименьшее натуральное число, для которого M1(xq)\mathfrak {M}_{1}\left(x_{q}\right) пусто, при этом x0=xx_{0}=x и xj+1=M2(xj)x_{j+1}=\mathfrak {M}_{2}\left(x_{j}\right). Считать, что xjL(x)\left|x_{j}\right| \leqslant L(x) и ti(xj)Ti(x)t_{i}\left(x_{j}\right) \leqslant T_{i}(x).

Задача 308

Используя машины Тьюринга из предыдущих задач, построить программы машин Тьюринга, вычисляющих следующие функции:

?
(а)

f1(x,y)={x2y3, если x<y,(x+y)/2, в противном случае; f_{1}(x, y)= \begin{cases} x^{2} y^{3}, & \text{ если } x<y, \\ \lfloor (x+y) / 2\rfloor , & \text{ в противном случае; }\end{cases}

(б)

f2(x,y)={x, если x+1y,2(x+y), в противном случае; f_{2}(x, y)= \begin{cases} \lfloor \sqrt{x}\rfloor , & \text{ если } x+1 \geqslant y, \\ 2(x+y), & \text{ в противном случае; }\end{cases}

(в)

f3(x,y)={log2(1+x/y), если x>2y,xy, в противном случае; f_{3}(x, y)= \begin{cases} \left\lfloor \log_{2}(1+\lfloor x / y\rfloor )\right\rfloor , & \text{ если } x>2 y, \\ x y, & \text{ в противном случае; }\end{cases}

(г)

f4(x,y)={x, если 2xy,xmody, в противном случае. f_{4}(x, y)= \begin{cases} \lfloor \sqrt{x}\rfloor , & \text{ если } 2 x \geqslant y, \\ x \bmod y, & \text{ в противном случае. }\end{cases}

Задача 309

Показать, как на обычной машине Тьюринга можно организовать выполнение следующих команд:

?
(а)

q,ap,bq, a \rightarrow p, b, return — возврат головки в ту из соседних ячеек, из которой она пришла в текущую;

(б)

q,ap,bq, a \rightarrow p, b, zero — возврат головки в нулевую ячейку;

(в)

q,ap,bq, a \rightarrow p, b, mirror — сдвиг головку в ячейку i-i, если она была в ячейке с номером ii;

(г)

q,ap,bq, a \rightarrow p, b, double — сдвиг головку в ячейку 2i2 i, если она была в ячейке с номером ii;

(д)

q,ap,bq, a \rightarrow p, b, next — сдвиг головки в ближайшую справа к текущей ячейку, содержащую aa (если она есть, иначе головка остаётся на месте);

(е)

q,ap,insertbq, a \rightarrow p, \operatorname {insert} b — сдвиг текущей и всех ячеек справа от неё на одну позицию вправо и запись символа bb в освободившуюся ячейку, головка оказывается в новой ячейке;

(ж)

q,apq, a \rightarrow p, restore, ss — замена символа aa на тот, который находился в ячейке в начальной конфигурации.

Задача 310

Реализовать машину Тьюринга из примеров 111 на стр. 409 и 112 на стр. 410 без расширения алфавита.

Пример 111: машина Тьюринга в алфавите Σ={a,b,c}\Sigma =\left\{ a,b,c\right\}, вычисляющая функцию f(w1w2)=w1f\left(w_{1}w_{2}\right)=w_{1} для слов, у которых w1w2{0,1}\left|w_{1}\right|-\left|w_{2}\right| \in \left\{ 0,1\right\} (то есть стирающая вторую половину слова, оставляя центральный символ, если длина нечётная), реализованная с расширением алфавита штрихованными символами a,b,ca^{\prime }, b^{\prime }, c^{\prime }.

Пример 112: машина Тьюринга в алфавите Σ={0,1}\Sigma =\left\{ 0,1\right\}, складывающая два непустых двоичных числа, записанных на ленте, реализованная с расширением алфавита штрихованными символами 0,10^{\prime }, 1^{\prime }.

?
Задача 311

Завершить построение машины Тьюринга из теоремы 156 на стр. 413.

Теорема 156: Для всякой машины Тьюринга M=(Q,Σ,P,q0)\mathfrak {M}=(Q, \Sigma , P, q_{0}) можно построить Σ\Sigma-эквивалентную машину Тьюринга N\mathfrak {N}, имеющую стандартную заключительную конфигурацию (то есть такую, что в момент остановки головка находится в нулевой ячейке, а на ленте записан только результат без вспомогательных символов-меток).

?
Задача 312

Другой, по сравнению с конструкцией теоремы 157 на стр. 417, подход к моделированию двухсторонней ленты на односторонней заключается в том, чтобы содержимое неотрицательной половины ленты M\mathfrak {M} хранить в ячейках с нечётными номерами, а содержимое левой половины — с чётными. То есть новая лента будет иметь вид β(0)=#,β(2x+1)=α(x)\beta (0)=\# , \beta (2 x+1)=\alpha (x) и β(2x)=α(x)\beta (2 x)=\alpha (-x) при x>0x>0. Построить программу односторонней машины N\mathfrak {N}, реализующую этот подход.

Теорема 157: Для всякой машины Тьюринга M=(Q,Σ,P,q0)\mathfrak {M}=(Q, \Sigma , P, q_{0}) существует Σ\Sigma-эквивалентная односторонняя машина Тьюринга N\mathfrak {N}, имеющая стандартную заключительную конфигурацию. (Конструкция из доказательства теоремы 157 «складывает» двухстороннюю ленту пополам с помощью двухэтажных символов: ячейка ii ленты N\mathfrak {N} хранит пару, где сверху — символ из ячейки i+10i+1 \geqslant 0 ленты M\mathfrak {M}, а снизу — символ из ячейки i0-i \leqslant 0; в этой задаче требуется предложить альтернативный способ кодирования без двухэтажных символов, достигающий той же цели.)

?
Задача 313

Доказать, что односторонняя машина Тьюринга N\mathfrak {N}, построенная в теореме 157 на стр. 417, корректно моделирует исходную машину M\mathfrak {M}.

Теорема 157: Для всякой машины Тьюринга M=(Q,Σ,P,q0)\mathfrak {M}=(Q, \Sigma , P, q_{0}) существует Σ\Sigma-эквивалентная односторонняя машина Тьюринга N\mathfrak {N}, имеющая стандартную заключительную конфигурацию. (В доказательстве конструкция использует двухэтажные символы, чтобы «сложить» двухстороннюю ленту машины M\mathfrak {M} пополам: ячейка ii ленты N\mathfrak {N} хранит пару, верхний этаж которой — это ячейка i+1i+1 ленты M\mathfrak {M}, а нижний — ячейка i-i, так что неотрицательные и отрицательные ячейки ленты M\mathfrak {M} чередуются на односторонней ленте N\mathfrak {N}.)

?
Задача 314

Показать, как извлечь из кода ленты ρ(α)\rho (\alpha ) выходные слова (теорема 159 на стр. 426).

Для односторонней ленты α\alpha в алфавите Σ={a0,a1,,ak}\Sigma =\left\{ a_{0}, a_{1}, \ldots , a_{k}\right\} (где a0=Λa_{0}=\Lambda), содержащей в каждый момент последовательность #ai1ai2ainΛΛ\# a_{i_{1}} a_{i_{2}} \ldots a_{i_{n}} \Lambda \Lambda \ldots, код ленты определяется как ρ(α)=j=1α(j)kj1\rho (\alpha )=\sum_{j=1}^{\infty } \alpha (j) \cdot k^{j-1}, то есть последовательность индексов символов читается как цифры числа в kk-ичной системе счисления (в этой сумме лишь конечно много слагаемых ненулевые). Теорема 159: каждая вычислимая по Тьюрингу словарная функция является программно вычислимой — в доказательстве машина Тьюринга M\mathfrak {M} моделируется программой с метками Π\Pi, которая хранит конфигурацию (q,i,α)(q, i, \alpha ) машины M\mathfrak {M} с помощью переменной rr, содержащей код ленты ρ(α)\rho (\alpha ); в конце полученный код ленты нужно раскодировать обратно в последовательность выходных слов — именно это и требуется в данной задаче.

?
Задача 315

Показать, как на машине Тьюринга построить унарную запись входа и по унарной записи восстановить выход (теорема 160 на стр. 429) без расширения алфавита.

Теорема 160: Если словарная функция f:ΩΩf:\Omega^{*} \rightarrow \Omega^{*} вычислима на машине Тьюринга M=(Q,Σ,P,q0)\mathfrak {M}=(Q, \Sigma , P, q_{0}), ΩΣ\Omega \subseteq \Sigma, то она вычислима на односторонней машине Тьюринга N=(Q,Σ,P,q0)\mathfrak {N}=(Q^{\prime }, \Sigma^{\prime }, P^{\prime }, q_{0}^{\prime }) без расширения алфавита, то есть Σ=Ω{Λ,#}\Sigma^{\prime }=\Omega \cup \left\{ \Lambda , \# \right\}. (В доказательстве машина N\mathfrak {N} строится так: сначала по входу строится унарная запись его кода ленты ρ(α0)\rho (\alpha_{0}), затем запускается машина N1\mathfrak {N}_{1}, вычисляющая ту же функцию на этой унарной записи — она даётся теоремой 158, — и, наконец, по унарной записи получившегося кода ленты восстанавливается сам выход; в этой задаче требуется реализовать именно эти два шага перекодировки.)

?
Задача 316

Показать, как промоделировать на машине Тьюринга работу программы с метками в двоичной системе (теорема 158 на стр. 422).

Теорема 158: Каждая программно вычислимая функция ff вычислима по Тьюрингу без расширения алфавита. (В доказательстве программа с метками Π\Pi с переменными x1,,xkx_{1}, \ldots , x_{k} моделируется односторонней машиной Тьюринга, конфигурация которой (qα,0,κ)(q_{\alpha }, 0, \kappa ) соответствует конфигурации (α,σ)(\alpha , \sigma ) программы Π\Pi, а на ленте последовательно хранятся унарные записи значений σ(x1),,σ(xk)\sigma (x_{1}), \ldots , \sigma (x_{k}), разделённые пустыми символами; там в качестве системы счисления выбрана унарная, а в этой задаче требуется показать, что подходит и двоичная.)

?
Задача 317

Построить универсальную машину Тьюринга, реализовав пункты 1)-21) из теоремы 161 на стр. 430.

Теорема 161: Для любого алфавита Σ\Sigma существует Σ\Sigma-универсальная машина Тьюринга U\mathfrak {U}, то есть такая машина, что для всякой машины Тьюринга M=(Q,Σ,P,q0)\mathfrak {M}=(Q,\Sigma ,P,q_{0}) найдётся вход cMc_{\mathfrak {M}} (кодирующий программу M\mathfrak {M}), для которого при любом входе xx выполнено U(cM,x)=M(x)\mathfrak {U}(c_{\mathfrak {M}}, x) = \mathfrak {M}(x).

?