В этом лекции мы установим, что
Напомним, что в теореме 8.1 мы уже показали, что каждая ч.р.ф.
вычислима некоторой
Теорема 10.1. Для всякой ч.р.ф. f существует
м.Т. $$\mathcal{ M}_f$$, вычисляющая функцию f.
Доказательство. Доказательство проведем индукцией по определению частично рекурсивной функции f.
Базис. Вычислимость простейших функций машинами Тьюринга очевидна.
Индукционный шаг. Покажем, что операторы суперпозиции,
Суперпозиция. Пусть Fm и fn1,..., fnm
- ч.р.ф., вычислимые на м.Т. $$\mathcal {M}_F, \mathcal { M}_{f_1},
\ldots, \mathcal {M}_{f_n}$$, соответственно. Пусть функция Gn
получена из них с помощью суперпозиции: Gn=[Fm;fn1,..., fnm]. Тогда м.Т. $$\mathcal { M}_G$$,
вычисляющая G, работает следующим образом:
m раз копирует вход $$|^{x_1}*\ldots *|^{x_n}$$, отделяя одну копию от другой символом # ;* ;Если обозначить м.Т., выполняющую копирование на этапе (1), через Копm,
а м.Т., выполняющую замену # на * на этапе (3), через Зам*#, то требуемую для суперпозиции м.Т. $$\mathcal { M}_G$$ можно представить как
Примитивная рекурсия. Пусть функция Fn+1(x1,... ,xn,y) получена с помощью оператора
gn(x1,..., xn) и fn+2(x1,... ,xn, y, z), которые вычислимы на м.Т. $$\mathcal{ M}_g$$ и $$\mathcal {M}_f$$. Определим вспомогательные м.Т.:
Построение каждой из указанных м.Т. достаточно очевидно. Из них можно получить, используя определенные в предыдущем разделе конструкции "языка программирования" для машин Тьюринга, требуемую м.Т. $$\mathcal {M}_F$$:
$$\mathcal {M}_1\/;\ \mathbf{ while\ }\Phi\ \mathbf{ do\ } \mathcal{ M}_2\ \mathbf{enddo};\ \mathcal {M}_3$$Минимизация. Пусть $$f^{n}(x_{1},\dots , x_{n}) = \mu y [ g^{n+1}(x_{1},\dots , x_{n},y)=0]$$
и м.Т. $$\mathcal{M}_g$$ вычисляет функцию gn+1.
Определим следующие вспомогательные м.Т.:
$$\mathcal {N}_1$$ приписывает аргумент 0 ко входу, т.е. вход вида $$|^{ x_1}*\ldots *|^{x_n}$$ переводит в конфигурацию на ленте $$|^{x_1}*\ldots*|^{x_n}*\wedge $$ (напомним, что при унарном кодировании 0 соответствует пустой символ).
$$\mathcal{N}_2$$ копирует свой вход с разделителем #, т.е. по любому входу w выдает w # w.
Через E обозначим м.Т., которая ничего не делает.
Пусть $$\mathcal{N}_3 = \mathbf{par}_{\#}(E, M_g)$$, т.е. вход вида $$|^{x_1}*\ldots*|^{x_n}* |^y\# |^{x_1}*\ldots*|^{x_n}* |^y$$ машина $$\mathcal{N}_3$$ перерабатывает, используя $$\mathcal{M}_g$$,
в $$|^{x_1}*\ldots*|^{x_n}* |^y\# |^z$$, где z= g(x1,... ,xn, y)
$$\Phi$$ на входе вида w # v проверяет непустоту v (т.е. условие v > 0 ).
Таким образом, при v=g(x1,...,xn,y) машина $$\Phi$$ проверяет
условие $$g(x_{1},\dots ,x_{n},y) \ne 0$$.
$$\mathcal{N}_4$$ по входу вида $$|^{x_1}*\ldots*|^{x_n}* |^y\# w$$ стирает #w и прибавляет
к y единицу, т.е. выдает результат: $$|^{x_1}*\ldots*|^{x_n}* |^{y+1}$$.
Наконец, $$\mathcal{N}_5 $$ по входу $$|^{x_1}*\ldots*|^{x_n}* |^y\# w$$ выдает |y, стирая ненужные блоки символов.
Ясно, что каждая из перечисленных м.Т. $$\mathcal{N}_1$$, $$\mathcal{N}_2$$, $$\mathcal{N}_3$$, $$\mathcal{N}_4$$, $$\mathcal{N}_5$$ и $$\Phi$$ легко реализуема. Построим теперь с их помощью следующую м.Т. $$\mathcal{M}_f$$:
$$\mathcal{M}_f: \\ \mathcal{N}_1; \mathcal{N}_2; \mathcal{N}_3; \\ {\bf while\ } \Phi\ {\bf do\ } \mathcal{N}_4;\ \mathcal{N}_2;\ \mathcal{N}_3\ {\bf enddo};\\ \mathcal{N}_5.$$Из этого определения непосредственно следует, что $$\mathcal{M}_f $$ вычисляет функцию fn(x1,..., xn),
заданную с помощью оператора минимизации.
На первый взгляд могло показаться, что машины Тьюринга с их примитивными
элементарными действиями являются более слабыми
Теорема 10.2. Всякая
Доказательство Пусть структурированная программа $$\Pi$$ вычисляет арифметическую функцию f(x1, ..., xn).
Не ограничивая общности, будем считать, что $$Var_{\Pi } =\{ x_{1}, \dots , x_{n}$$, xn+1, ..., xm }
и что результирующей переменной является x1.
М.Т. $$M_{\Pi }$$, моделирующая $$\Pi,$$ будет иметь m -этажную ленту с алфавитом $$\Sigma =\{ \wedge , |, *\} \cup \{ \wedge , |\} ^{m}$$.
Обозначим конфигурацию ленты M\Pi, в которой на i -ом этаже, начиная с
1-ой ячейки, записано слева направо ki символов '|' (i = 1, 2, ..., m), а далее идут "пустышки " $$\wedge,$$
как (k1, k2, ..., km).
Тогда состоянию $$\sigma : Var_{\{ }\Pi \} \to N$$ программы $$\Pi$$ будет соответствовать конфигурация ленты $$M_{\Pi }$$: $$K_{\sigma } =(\sigma (x_{1}),\sigma (x_{2}),\dots , \sigma (x_{m}))$$.
$$M_{\Pi }$$ получается с помощью конструкций
Команду xi := 0 (i=1,... , m) программы $$\Pi$$
реализует м.Т. Mi0 , обнуляющая i -ый этаж M, т.е. переводящая любую
конфигурацию (k1,..., ki-1,ki, k i+1 ..., km) в конфигурацию (k1,..., k i-1, 0, ki+1, ... , km).
Команду xi := xi +1 (i=1,... , m) программы $$\Pi$$
реализует м.Т. Mi+1 , добавляющая один символ ' | ' справа на i -ом этаже,
т.е. переводящая любую
конфигурацию (k1,..., k i-1, ki, ki+1 ... , km) в конфигурацию (k1,..., k i-1, ki+1, ki+1, ... , km).
Команду xi := xj (i, j=1,... , m) программы $$\Pi$$
реализует м.Т. Mij, переписывающая содержимое j -го этажа на i -ый,
т.е. переводящая любую
конфигурацию (k1,..., ki, ..., kj, ... , km) в конфигурацию (k1,..., kj, ... , kj, ... , km).
Условие xi = xj реализуется машиной $$\Phi _{=}^{ij}$$, которая, работая на
конфигурации (k1, ..., ki, ..., kj, ... , km) выдает 0, если ki=kj,
и 1 - в противном случае.
Условие xi < xj реализуется машиной $$\Phi _{<}^{ij}$$, которая, работая на
конфигурации (k1, ..., ki, ..., kj, ... , km) выдает 0, если ki < kj,
и 1 - в противном случае.
Далее по индукции: пусть $$\Pi _{1}$$ и $$\Pi _{2}$$ -
Используя доказанные выше свойства конструкций машин Тьюринга, нетрудно проверить по индукции следующее
Утверждение 1. Пусть м.Т. $$M_{\Pi }$$ реализует в соответствии с приведенными определениями
Теперь для завершения доказательства теоремы достаточно взять в качестве
результирующей следующую м.Т.: $$M = M_{start}; M_{\Pi }; M_{end}$$,
где м.Т. Mstart переводит одноэтажную начальную конфигурацию $$|^{x_1}*|^{x_2}*\ldots |^{x_n}$$ в m -этажную конфигурацию (x1, x2,..., xn, 0,..., 0),
а м.Т. Mend заключительную m -этажную конфигурацию (x1, 0,..., 0) переводит
в одноэтажную заключительную конфигурацию |x1.
В этом параграфе покажем, как можно промоделировать работу машины Тьюринга, используя частично рекурсивные определения.
Теорема 10.3. Всякая
Доказательство этой теоремы - дополнительный материал, который можно при первом чтении опустить.
Доказательство Пусть м.Т. $$\mathcal{ M} = <Q, \Sigma, P,q_0, q_f> $$ вычисляет функцию f(x1,..., xn).
Пусть также Q ={q0,q1,... ,q k-1 }, qf=q1 и $$\Sigma = \{ a_{0}=\wedge , a_{1}, \dots , a_{ R-1}= | \}$$. Предположим также,
не ограничивая общности, что $$\mathcal{ M} $$ никогда не пишет пустой
символ $$\wedge$$ (как перестроить программу произвольной м.Т.,
чтобы она удовлетворяла этому условию ?).
Определим кодирование элементов конфигураций $$\mathcal{ M} $$ целыми числами. Пусть конфигурация $$\mathcal{ M} $$ имеет вид K=(w1,qi,aj,w2), где $$w_1=a_{i_m}a_{i_{m-1}} \ldots a_{i_0} $$ - слово на ленте левее головки, qi - состояние м.Т., aj - наблюдаемый в данной конфигурации символ
и w2= aj0aj1 ... ajp} - слово на ленте правее головки.
Кодом символа $$a_{j} \in \Sigma$$ будет число j,
кодом состояния qi - число i.
Слова w1 и w2 будем рассматривать как числа в R -ичной
системе счисления, читаемые в противоположных направлениях (из наших
предположений следует, что $$i_{m} \ne 0$$ при m >0
и $$j_{p} \ne 0$$ при p>0 ) :
Например, если $$\Sigma = \{ \wedge , *, |\}$$, то для конфигурации K=(|**,q3,|,* | |) имеем code1(w1)=30 1+31 1+ 32 2= [211]3=22
и code2(w2)=30 1+ 31 2 +32 2= [221]3=25. По программе P определим следующие табличные функции, кодирующие ее команды:
A(i,j) - код символа, который пишет $$\mathcal{ M}$$, когда она
в состоянии qi видит символ aj;
Q(i,j) - код состояния, в которое переходит $$\mathcal{ M}$$, когда
она в состоянии qi видит символ aj;
C(i,j) - код направления сдвига головки $$\mathcal{M}$$, когда
она в состоянии qi видит символ aj (0 - на месте, 1 - вправо, 2 - влево).
Пусть при i >= k или j >= R эти функции принимают
какое-нибудь фиксированное значение (например, 0). Тогда по лемме 18.1
все они примитивно рекурсивны.
Определим функции, которые по кодам компонент одной
конфигурации K=(w1,qi,aj,w2) вычисляют коды компонент
следующей конфигурации K’=(w1’,qm,ap,w2’).
Покажем, что все эти функции примитивно рекурсивны. Для q
это следует из того, что для любых i, j q(l,i,j,m)=Q(i,j).
Определения остальных трех функций зависят от сдвига. При C(i,j)=0 имеем lf(l,i,j,r)=l, rt(l,i,j,r)= r, a(l,i,j,r)=A(i,j).
Если C(i,j)=2, то lf(l,i,j,r)=div(R, l), rt(l,i,j,r)= rR+A(i,j), a(l,i,j,r)=rm(R,l). Если же C(i,j)=1, то lf(l,i,j,r)= Объединяя эти случаи получаем, что
( здесь rm(x,y) - это функция, дающая остаток от деления y на x, а div(x,y) - функция целочисленного деления y на x ).
Аналогичные представления справедливы и для функций rt(l,i,j,r) и a(l,i,j,r). Следовательно, все эти функции примитивно рекурсивны.
Пусть из данной конфигурации K через t тактов
получается конфигурация Kt. Определим коды компонент Kt
как функции от компонент K и t :
Это определение задает функции A(4), Q(4), Lf(4), Rt(4) с помощью совместной рекурсии. Следовательно, по лемме 18.5
они примитивно рекурсивны.
Пусть м.Т. $$\mathcal{ M} $$ вычисляет функцию f(x), (т.е. n=1 ). Тогда для начальной конфигурации $$K_{x}=K^{0}=(\wedge ,q_{0},|,|^{x-1})$$ code1(w1)=0, code(q0)=0, code(|)=R-1, code2( w2 ) = (R-1)Rx-2+(R-1)R x-3+ ... +(R-1)R0=R x-1-1. Положим $$\bar Q(x,t)=Q(0,0,R-1,R^{x-1}-1, t) $$ и $$\bar{Rt}(x,t)=Q(0,0,R-1,R^{x-1}-1, t)$$. Тогда функция $$\tau(x)= \mu t(\bar Q(x,t)=1) $$ задает число шагов
до перехода $$\mathcal{ M} $$ в заключительное состояние на входе x. Эта функция, очевидно, частично рекурсивна. Тогда функция $$\hat{Rt}(x)=\bar{Rt}(x,\tau(x)) $$ задает код правой
части заключительной конфигурации, имеющий вид Rf(x)-1-1.
Отсюда получаем, что
и следовательно, функция f(x) частично рекурсивна.
Мы рассмотрели три математические модели для описания алгоритмов и вычисляемых ими функций, отражающие различные аспекты и представления о работе абстрактного вычислителя. Из теорем 8.1, 10.2 и 10.3 непосредственно получаем
Следствие.
Естественно, возникает вопрос о том, насколько общим является этот результат? Верно ли, что каждый алгоритм может быть задан одним из рассмотренных способов? На эти вопросы теория алгоритмов отвечает следующей гипотезой.
Тезис Тьюринга-Черча:
Всякий алгоритм может быть задан в виде
соответствующей машины Тьюринга или частично рекурсивного определения, а
Значение этого тезиса заключается в том, что он уточняет общее неформальное
определения "всякого алгоритма" и "вычислимой функции" через точные формальные
понятия машины Тьюринга, частично рекурсивного определения и
соответствующих им классов функций.
После этого можно осмысленно ставить вопрос о существовании или несуществовании
алгоритма, решающего тот или иной класс задач.
Теперь этот вопрос следует понимать как вопрос о существовании или несуществовании
соответствующей машины Тьюринга, или (что эквивалентно)
Можно ли доказать этот тезис как теорему? Нет, поскольку в его формулировке речь идет о неточных понятиях "всякого алгоритма" и "вычислимой функции", которые не могут быть объектами математических рассуждений. На чем же тогда основана уверенность в справедливости тезиса Тьюринга-Черча? В первую очередь, на опыте. Все известные алгоритмы, придуманные за многие века математиками, могут быть заданы с помощью машин Тьюринга. Для всех многочисленных моделей алгоритмов, появившихся за последние 70 лет (некоторые из них мы упоминали в начале лекции), была доказана их равносильность машинам Тьюринга. В качестве доводов в пользу тезиса Тьюринга-Черча можно также рассматривать замкнутость класса машин Тьюринга и ч.р.ф. относительно многочисленных естественных операций над алгоритмами и функциями. Отметим также, что тезис Тьюринга-Черча обращен и в будущее: он предполагает, что какие бы новые формальные определения алгоритмов ни были предложены (а таковыми, например, являются новые языки программирования), все они не выйдут из класса алгоритмов, задаваемых машинами Тьюринга.
Чтобы показать связь теории алгоритмов с "практическим" программированием, рассмотрим некоторые алгоритмичские проблемы, связанные со структурированными программами.
Зафиксируем конечный алфавит A={a0, a1,..., am-1}, включающий все символы латинского алфавита,
цифры, знак пробела (пусть это будет a0 ), знаки ' ; ', ' = ', ' < ', ' := ' , а также знаки-ключевые слова если, то, конец, пока, делай и все.
Тогда каждая структурированная программа $$\Pi$$ представляет собой некоторое слово $$w_{\Pi}=a_{i_1}a_{i_2}\ldots a_{i_k}$$ в алфавите A. Не ограничивая общности,
будем считать, что это слово начинается не с пробела, т.е. i1 >0.
Тогда слово $$w_{\Pi }$$ однозначно определяет натуральное число $$n_{\Pi }$$, m -ичной записью
которого оно является, т.е. $$n_{\Pi}=\sum_{j=1}^k i_j m^{k - j}$$. Назовем это число
номером программы $$\Pi$$ . По тексту программы $$\Pi$$ ее номер $$n_{\Pi }$$ определяется однозначно.
Рассмотрим теперь обратное соответствие. Конечно, не каждое число является номером
некоторой n не является
"естественным" номером никакой программы, сопоставим ему в качестве $$\Pi _{n}$$
некоторую никогда не
останавливающуюся программу P (например, программу $$\Pi _{5}(1)$$: x1 := x1; пока x1=x1 делай x1:=x1 все из примера 7.5).
Проблема самоприменимости заключается в проверке для каждой программы $$\Pi$$ с входной переменной x и выходной переменной y того, остановится ли $$\Pi$$ на собственном номере $$n_{\Pi }$$, т.е в вычислении
Теорема 10.4. Проблема самоприменимости алгоритмически неразрешима, т.е. не существует Fs(x).
Доказательство от противного. Предположим, что существует программа P, вычисляющая функцию Fs(x). Без ограничения общности, можно считать,
что ее выходная переменная есть y (почему?) и поэтому $$\Phi _{P,y}(x)=F_{s}(x)$$ для всех x. Пусть переменная z не входит в P.
Рассмотрим следующую программу P’:
Легко проверить, что если P на входе x выдает результат y=1, то P’
на этом входе не останавливается, а если P выдает результат y=0, то P’
останавливается ( и тоже выдает 0). Пусть n’=nP’ - номер программы P’.
Чему тогда равно значение $$\Phi _{P,y}(n’)$$?
Если оно равно 1, то на входе x=n’ программа P’ не остановится, т.е. $$\Phi _{P’,y}(n’)= \infty$$, но тогда $$F_{s}(n’)=0 \ne \Phi _{P,y }(n’)$$.
Если же $$\Phi _{P,y }(n')=0$$, то P’ на входе x=n’ останавливается с результатом 0,
т.е. $$\Phi _{P’,y}(n') < \infty$$. Но тогда $$F_{s}(n’)=1 \ne \Phi _{P,y }(n')=0$$.
Во всех случаях получили, что $$F_{s} \ne \Phi _{P,y }$$ и, следовательно,
предположение о существовании программы для вычисления функции Fs
неверно.
Заметим, что на самом деле мы доказали отсутствие Fs. Но тезис Тьюринга-Черча и эквивалентность
Проблема самоприменимости может показаться не очень интересной с практической ("программистской") точки зрения. Но оказывается, что ее можно использовать для доказательства алгоритмической неразрешимости многих других алгоритмических проблем, более тесно связанных с практикой программирования.
Проблема останова: по произвольной 0, т.е вычислить всюду определенную функцию
В более общем виде проблема останова состоит в вычислении следующей функции:
$$F_h(n,a)=\left\{\begin{array}{ll} 1,\qquad \textit{если } \Phi_{\Pi_n,y}(a) < \infty\\ 0 \qquad \textit{в противном случае} \end{array} \right.$$Из этого определения следует, что программа $$\Pi _{n}$$ останавливается
на входе a тогда и только тогда, когда Fh(n,a)=1.
Проблема тотальности: по произвольной
Проблемы оптимизации текста программы. Одна из возможных оптимизаций (текста) программы состоит в удалении из нее операторов присваивания, которые никогда не работают, а другая - в замене условных операторов вида
$$\textbf{ если } \varphi \textbf{ то } \Pi_1 \textbf{ иначе } \Pi_2 \textbf{ конец},$$на $$\Pi _{1}$$ в случае, когда условие $$\phi$$ истинно на любых входных данных, и - на $$\Pi _{2}$$, если оно на любом входе ложно. Определим соответствующие этим оптимизациям функции:
$$F_{opt1}(n,m)= \left\{\begin{array}{ll} 1, \qquad \textit{если существует вход } a, \textit{при работе на котором}\\ \qquad\textit{ в программе } \Pi_n \textit{срабатывает } m\textit{-ый по счету}\\ \qquad \textit{оператор присваивания}\\ 0 \qquad \textit{в противном случае} \end{array} \right.$$Из этого определения следует, что при Fopt1(n,m)=0 программу $$\Pi _{n}$$ можно оптимизировать, удалив из нее m -ый оператор присваивания. Назовем задачу вычисления функции Fopt1(n,m) проблемой лишнего присваивания
Ясно, что при Fopt2(n,m)=0 программу $$\Pi _{n}$$ можно оптимизировать, заменив ее m -ый условный оператор его второй альтернативой.
Назовем задачу вычисления функции Fopt2 (n,m) проблемой лишнего условия
Заметим, что проблема самоприменимости и все проблемы, перечисленные в пп. 1-4 выше,
связаны с вычислением функций, принимающих два значения 0 и 1.
Эти функции являются характеристическими функциями соответствующих
множеств.
Например, Fh0(n) является характеристической функцией множества номеров программ,
останавливающихся на входе 0.
Напомним, что для множества $$A \subseteq N^{k}$$ его характеристическая функция cAk определяется следующим образом:
На множества переносится понятия разрешимости и неразрешимости.
Определение 10.1. cAk вычислима, т.е. является общерекурсивной функцией,
в противном случае, оно (и связанная с ним проблема) неразрешимо
Используя это определение, теорему 10.4 можно переформулировать так:
Множество номеров программ, остановливающихся на собственном номере,
$$M_s=\{ n | \Phi_{\Pi_n}, y (n) < \infty\} неразрешимо.}$$Обычно доказательства неразрешимости проблем используют метод сведения.
Неформально его идею можно сформулировать следующим образом:
"Если решение некоторой неразрешимой проблемы A можно эффективно получить,
используя решение проблемы B, то тогда проблема B тоже неразрешима."
Определим отношение сводимости более формально.
Напомним, что нумерационные функции позволяют вместо
наборов (векторов, n -ок) целых чисел рассматривать их номера.
Для множества $$B \subseteq N^{r}$$ обозначим через cr(B) множество номеров входящих в B наборов: $$c_{r}(B)=\{ c_{r}(a_{1},\dots , a_{r}) | (a_{1},\dots , a_{r})\in B\}$$
(при r=1, разумеется, c1(B)=B ).
Лемма 10.1.
Множество (проблема) $$A \subseteq N^{k}$$ сводится
к множеству (проблеме) $$B \subseteq N^{r}$$, если существует общерекурсивная функция f: Nk -> N
такая, что $$(x_{1},\dots ,x_{k}) \in A \Leftrightarrow f (x_{1},\dots ,x_{k}) \in c_{r}(B)$$.
В этом случае будем писать A <=m B посредством f.
Содержательно, " A сводится к B посредством f " означает, что для выяснения, входит ли x в A, можно эффективно преобразовать x в такие входные данные y=f(x)
проблемы B, что при $$y \in B$$ имеем $$x \in A$$, а если $$y \notin B$$, то и $$x \notin A$$.
Лемма 10.2. Если A разрешимо, а B не совпадает с $$\varnothing$$ и N, то A <=m B.
Доказательство. По условию имеются такие b и d, что $$b \in B$$, а $$d \notin B$$.
Положим f(x) = b , cA(x) + d ,(1 - cA(x)). Тогда при $$x \in A$$ имеем $$f(x) = b , 1 + d ,(1-1)= b \in B$$,
а при $$x \notin A$$ - $$f(x) = b , 0 + d ,(1-0)= d \notin B$$. Таким образом, A <=m B посредством f.
Как мы уже отмечали, доказательство неразрешимости можно основывать на следующем утверждении.
Лемма 10.3.
Если A сводится к B и проблема A неразрешима, то
и проблема B неразрешима.
Доказательство. Пусть A <=m B посредством f.
Тогда из определения
сводимости следует, что для всех x имеет место равенство cA(x)=cB(f(x)). Поэтому, если бы B была разрешима,
то ее характеристическая функция cB была бы общерекурсивна и cA также была бы общерекурсивна. Но это противоречит неразрешимости
проблемы A.
Теорема 10.5. Все проблемы, перечисленные выше в пунктах 1-4, являются алгоритмически неразрешимыми.
Доказательство. Нам потребуются следующие вспомогательные
программы $$\Pi _{x:=n}: x:=0; x:= x+1; \dots ; x:= x+1$$ ( присваиваие x:=x+1
повторяется n раз). Понятно, что для любого начального состояния $$\sigma$$ после выполнения $$\Pi _{x:=n}$$ имеем $$\Pi _{x:=n}(\sigma )(x)=n$$.
Докажем неразрешимость {проблемы останова:} по произвольной структурированной
программе $$\Pi$$ определить, завершится ли вычисление $$\Pi$$ на входе 0.
Пусть $$M_{h0}=\{ n | \Phi _{\Pi n,y }(0) < \infty \}$$. Докажем, что множество номеров
самоприменимых программ Ms сводится к Mh0. Пусть n - номер программы $$\Pi _{n}$$. преобразуем ее в программу $$\Pi ': \Pi _{x:=n};\Pi _{n}; y:=0$$.
Таким образом, $$\Pi '$$ вначале заносит в x номер n программы $$\Pi _{n}$$,
а затем применяет $$\Pi _{n}$$ к этому номеру и, если $$\Pi _{n}$$ на n останавливается, выдает
результат y=0. Поэтому $$\Pi '$$ останавливается на любом аргументе (в том числе и на 0) тогда и только тогда,
когда $$n \in M_{s}$$. Преобразование программы $$\Pi _{n}$$ в программу $$\Pi '$$ осуществляется эффективно. Поэтому (на основании тезиса Тьюринга-Черча)
существует такая о.р.ф. f, которая по n вычисляет номер m программы $$\Pi '=\Pi _{m}=\Pi _{f(n)}$$.
Эта функция и будет сводить Ms к Mh0, так как $$n \in M_{s} \Leftrightarrow f(n) \in M_{h0}$$.
Следовательно, по лемме ref{lm-red} проблемы останова Mh0 неразрешима.
Очевидно, что и более общая форма проблемы останова $$M_{h}=\{ (n,a) | \Phi _{\Pi n, y }(a) < \infty \}$$ также неразрешима, поскольку к ней
сводится Mh0: $$n \in M_{h0} \Leftrightarrow (n,0) \in M_{h}$$.
Ms к множеству Mt номеров программ, вычисляющих всюду
определенные функции, можно также использовать функцию f из пункта 1.
Действительно, $$\Pi _{n}$$ останавливается на входе n тогда и только тогда, когда $$\Pi '=\Pi _{f(n)}$$ останавливается на всех входах, т.е. $$n\in M_{s} \Leftrightarrow f(n) \in M_{t}$$.
Следовательно, проблема тотальности Mt неразрешима.Рассмотрим теперь проблему эквивалентности. Пусть
$$M_{eq}=\{(n,m) | \textit{ для всех } x \\ \Phi_{\Pi_n,y}(x) = \Phi_{\Pi_m,y}(x) \}.$$Зафиксируем следующую программу P0: x:=x; y:=0. Очевидно, что она вычисляет функцию,
тождественно равную нулю, т.е. $$\Phi_{P^0,y}(x)=0$$ для всякого x.
Пусть ее номер n(P0) равен k0. Для произвольного n рассмотрим
пару (f(n), k0). Из определения f следует, что $$\Pi _{n}$$ останавливается на входе n тогда и только тогда, когда $$\Pi '=\Pi _{f(n)}$$ останавливается на всех входах и выдает результат 0: $$\Phi_{\Pi_{f(n),y}}(x)=0$$ для всех x, т.е. $$\Pi _{ f(n)}$$ и $$\Pi_{k_0}$$
эквивалентны. Тогда $$n \in M_{s}\Leftrightarrow (f(n),k_{0}) \in M_{eq}$$. Положим g(n)= c2(f(n),k0) .
Тогда g является о.р.ф. и $$n \in M_{s}\Leftrightarrow g(n) \in c_{2}(M_{eq})$$. Следовательно, Ms
сводится к Meq посредством g и проблема Meq неразрешима.
Для доказательства неразрешимости проблемы лишнего присваивания:
$$M_{opt1}=\{(n,m) | \textit{на некотором входе } \ a\ \textit{ в программе } \ \Pi_n \textit{срабатывает }\\ m\textit{-ый по счету } \textit{оператор присваивания}\}$$снова используем функцию f из пункта 1. Напомним, что $$\Pi _{f(n)}: \Pi _{\{ }x:=n\} ;\Pi _{n}; y:=0$$. По n и соответствующей программе $$\Pi _{n}$$
можно легко определить номер m последнего присваивания y:=0 в $$\Pi _{f(n)}$$:
Пусть g(n) - это о.р.ф., вычисляющая по n этот номер m. Тогда $$n \in M_{s}\Leftrightarrow (f(n),g(n)) \in M_{opt1}$$. Положим h(n)= c2(f(n),g(n)). Тогда h является о.р.ф. и $$n \in M_{s}\Leftrightarrow h(n) \in c_{2}(M_{opt1})$$. Следовательно, Ms
сводится к Mopt1 посредством h и проблема Mopt1 неразрешима.
Рассмотрим теперь проблему лишнего условия:
$$M_{opt2}=\{(n,m) | \textit{существует вход\ }, a\\ \textit{ на котором при некотором срабатывании}\\\textit{ m-го по счету условного оператора}\\\textit{ в программе } \Pi_n\ \textit{его условие истинно}\}.$$Для доказательства ее неразрешимости определим по n программу $$\Pi ’‘: \Pi ’; если y=0 то y:=y иначе y:=y +1 конец$$ ( здесь $$\Pi '$$ - программа из п. 1).
И в этом случае программа $$\Pi ''$$ строится по программе $$\Pi _{n}$$ эффективно. Пусть ее номер вычисляется о.р.ф. f’, т.е. $$\Pi _{f’(n)}=\Pi ''$$, и пусть
о.р.ф. g’(n) определяет номер последнего условного оператора в программе $$\Pi _{f’(n)}$$.
Тогда $$n \in M_{s}\Leftrightarrow$$ в программе $$\Pi _{f'(n)}$$ последний условный
оператор выполняется (на любом входе) и при этом y=0, т.е. его условие
истинно, а это означает, что $$(f’(n),g'(n)) \in M_{opt2}$$.
Положив h’(n)= c2(f’(n),g’(n)), получим, что $$n \in M_{s} \Leftrightarrow h'(n) \in c_{2}(M_{opt2})$$. Следовательно, Ms
сводится к Mopt2 посредством h’ и проблема Mopt2
также неразрешима.
Теорема доказана.
Какой же вывод можно сделать из того, что некоторая алгоритмическая проблема оказалась неразрешимой? Для программистов из такого утверждения извлекаются "две новости: плохая и хорошая ". "Плохая новость" состоит в том, что невозможно построить алгоритм (программу) для автоматического решения такой проблемы. Например, из теоремы 10.5 следует, что невозможно автоматически проверить, входит ли некоторый вход в область определения вычислимой функции, нельзя определить корректность программы, т.е. то, что она вычисляет требуемую функцию, нет способа проверять эквивалентность программ (не только структурированных, но и написанных на Паскале, Си, ассемблере, Яве и других языках программирования), не существует алгоритмов для оптимизаций, связанных с удалением лишних присваиваний и условий, и т.п. Но неразрешимость проблемы не означает, что она не может быть решена для некоторых отдельных входных данных. Например, в предыдущих разделах мы построили достаточно много программ и доказали их корректность. Поэтому "хорошая новость" для программистов и математиков состоит в том, что их труд при решении неразрешимых проблем в каждом отдельном случае является творческим - никакой программой их не заменить. Появление каждой новой содержательно интересной неразрешимой проблемы только расширяет область их творчества, заставляет искать все более и более широкие алгоритмы, которые позволяют решать все более обширные подклассы относящихся к этой проблеме индивидуальных задач.
Задача 10.1. Докажите, что машины Тьюринга $$\mathcal{ M}_F $$ и $$\mathcal{M}_f$$, определенные в доказательстве теоремы 10.1 для
Задача 10.2. Постройте машины Тьюринга Mi0 , Mi+1, Mij, $$\Phi ^{ ij }_{=}$$, $$\Phi ^{ ij}_{<}$$, Mstart и Mend, определенные
в доказательстве теоремы 10.2.
Задача 10.3. Докажите утверждение 1, сформулированное в доказательстве теоремы 10.2, используя индукцию по построению программы $$\Pi$$ и соответствующей м.Т. $$M_{\Pi }$$.
Задача 10.4. В доказательстве теоремы 10.3 рассмотрен случай, когда
м.Т. $$\mathcal{ M} $$ вычисляет функцию
от одного аргумента f(x) . Покажите, что теорема верна и в
общем случае для функций f(x1,...,xn) при любом n.
Задача 10.5.
Докажите, что отношение <=m является рефлексивным и транзитивным.
Задача 10.6. Доказать алгоритмическую неразрешимость следующих проблем.
a и b проверить равенство $$\Phi _{\Pi ,y}(a)=b$$.x имеет место неравенство $$\Phi _{\Pi ,y}(x) > \Phi _{\Pi ',y}(x)$$.Задача 10.7. Докажите, что
Задача 10.8.
Докажите, что для двух A и B их "сумма" $$A+B=\{ x+y | x\in A, y\in B\}$$ также
является
Задача 10.9. Пусть A - g(x) и h(x) являются о.р.ф. Докажите, что функция
также является общерекурсивной.
В этом лекции мы установим, что
Напомним, что в теореме 8.1 мы уже показали, что каждая ч.р.ф.
вычислима некоторой
Теорема 10.1. Для всякой ч.р.ф. f существует
м.Т. $$\mathcal{ M}_f$$, вычисляющая функцию f.
Доказательство. Доказательство проведем индукцией по определению частично рекурсивной функции f.
Базис. Вычислимость простейших функций машинами Тьюринга очевидна.
Индукционный шаг. Покажем, что операторы суперпозиции,
Суперпозиция. Пусть Fm и fn1,..., fnm
- ч.р.ф., вычислимые на м.Т. $$\mathcal {M}_F, \mathcal { M}_{f_1},
\ldots, \mathcal {M}_{f_n}$$, соответственно. Пусть функция Gn
получена из них с помощью суперпозиции: Gn=[Fm;fn1,..., fnm]. Тогда м.Т. $$\mathcal { M}_G$$,
вычисляющая G, работает следующим образом:
m раз копирует вход $$|^{x_1}*\ldots *|^{x_n}$$, отделяя одну копию от другой символом # ;* ;Если обозначить м.Т., выполняющую копирование на этапе (1), через Копm,
а м.Т., выполняющую замену # на * на этапе (3), через Зам*#, то требуемую для суперпозиции м.Т. $$\mathcal { M}_G$$ можно представить как
Примитивная рекурсия. Пусть функция Fn+1(x1,... ,xn,y) получена с помощью оператора
gn(x1,..., xn) и fn+2(x1,... ,xn, y, z), которые вычислимы на м.Т. $$\mathcal{ M}_g$$ и $$\mathcal {M}_f$$. Определим вспомогательные м.Т.:
Построение каждой из указанных м.Т. достаточно очевидно. Из них можно получить, используя определенные в предыдущем разделе конструкции "языка программирования" для машин Тьюринга, требуемую м.Т. $$\mathcal {M}_F$$:
$$\mathcal {M}_1\/;\ \mathbf{ while\ }\Phi\ \mathbf{ do\ } \mathcal{ M}_2\ \mathbf{enddo};\ \mathcal {M}_3$$Минимизация. Пусть $$f^{n}(x_{1},\dots , x_{n}) = \mu y [ g^{n+1}(x_{1},\dots , x_{n},y)=0]$$
и м.Т. $$\mathcal{M}_g$$ вычисляет функцию gn+1.
Определим следующие вспомогательные м.Т.:
$$\mathcal {N}_1$$ приписывает аргумент 0 ко входу, т.е. вход вида $$|^{ x_1}*\ldots *|^{x_n}$$ переводит в конфигурацию на ленте $$|^{x_1}*\ldots*|^{x_n}*\wedge $$ (напомним, что при унарном кодировании 0 соответствует пустой символ).
$$\mathcal{N}_2$$ копирует свой вход с разделителем #, т.е. по любому входу w выдает w # w.
Через E обозначим м.Т., которая ничего не делает.
Пусть $$\mathcal{N}_3 = \mathbf{par}_{\#}(E, M_g)$$, т.е. вход вида $$|^{x_1}*\ldots*|^{x_n}* |^y\# |^{x_1}*\ldots*|^{x_n}* |^y$$ машина $$\mathcal{N}_3$$ перерабатывает, используя $$\mathcal{M}_g$$,
в $$|^{x_1}*\ldots*|^{x_n}* |^y\# |^z$$, где z= g(x1,... ,xn, y)
$$\Phi$$ на входе вида w # v проверяет непустоту v (т.е. условие v > 0 ).
Таким образом, при v=g(x1,...,xn,y) машина $$\Phi$$ проверяет
условие $$g(x_{1},\dots ,x_{n},y) \ne 0$$.
$$\mathcal{N}_4$$ по входу вида $$|^{x_1}*\ldots*|^{x_n}* |^y\# w$$ стирает #w и прибавляет
к y единицу, т.е. выдает результат: $$|^{x_1}*\ldots*|^{x_n}* |^{y+1}$$.
Наконец, $$\mathcal{N}_5 $$ по входу $$|^{x_1}*\ldots*|^{x_n}* |^y\# w$$ выдает |y, стирая ненужные блоки символов.
Ясно, что каждая из перечисленных м.Т. $$\mathcal{N}_1$$, $$\mathcal{N}_2$$, $$\mathcal{N}_3$$, $$\mathcal{N}_4$$, $$\mathcal{N}_5$$ и $$\Phi$$ легко реализуема. Построим теперь с их помощью следующую м.Т. $$\mathcal{M}_f$$:
$$\mathcal{M}_f: \\ \mathcal{N}_1; \mathcal{N}_2; \mathcal{N}_3; \\ {\bf while\ } \Phi\ {\bf do\ } \mathcal{N}_4;\ \mathcal{N}_2;\ \mathcal{N}_3\ {\bf enddo};\\ \mathcal{N}_5.$$Из этого определения непосредственно следует, что $$\mathcal{M}_f $$ вычисляет функцию fn(x1,..., xn),
заданную с помощью оператора минимизации.
На первый взгляд могло показаться, что машины Тьюринга с их примитивными
элементарными действиями являются более слабыми
Теорема 10.2. Всякая
Доказательство Пусть структурированная программа $$\Pi$$ вычисляет арифметическую функцию f(x1, ..., xn).
Не ограничивая общности, будем считать, что $$Var_{\Pi } =\{ x_{1}, \dots , x_{n}$$, xn+1, ..., xm }
и что результирующей переменной является x1.
М.Т. $$M_{\Pi }$$, моделирующая $$\Pi,$$ будет иметь m -этажную ленту с алфавитом $$\Sigma =\{ \wedge , |, *\} \cup \{ \wedge , |\} ^{m}$$.
Обозначим конфигурацию ленты M\Pi, в которой на i -ом этаже, начиная с
1-ой ячейки, записано слева направо ki символов '|' (i = 1, 2, ..., m), а далее идут "пустышки " $$\wedge,$$
как (k1, k2, ..., km).
Тогда состоянию $$\sigma : Var_{\{ }\Pi \} \to N$$ программы $$\Pi$$ будет соответствовать конфигурация ленты $$M_{\Pi }$$: $$K_{\sigma } =(\sigma (x_{1}),\sigma (x_{2}),\dots , \sigma (x_{m}))$$.
$$M_{\Pi }$$ получается с помощью конструкций
Команду xi := 0 (i=1,... , m) программы $$\Pi$$
реализует м.Т. Mi0 , обнуляющая i -ый этаж M, т.е. переводящая любую
конфигурацию (k1,..., ki-1,ki, k i+1 ..., km) в конфигурацию (k1,..., k i-1, 0, ki+1, ... , km).
Команду xi := xi +1 (i=1,... , m) программы $$\Pi$$
реализует м.Т. Mi+1 , добавляющая один символ ' | ' справа на i -ом этаже,
т.е. переводящая любую
конфигурацию (k1,..., k i-1, ki, ki+1 ... , km) в конфигурацию (k1,..., k i-1, ki+1, ki+1, ... , km).
Команду xi := xj (i, j=1,... , m) программы $$\Pi$$
реализует м.Т. Mij, переписывающая содержимое j -го этажа на i -ый,
т.е. переводящая любую
конфигурацию (k1,..., ki, ..., kj, ... , km) в конфигурацию (k1,..., kj, ... , kj, ... , km).
Условие xi = xj реализуется машиной $$\Phi _{=}^{ij}$$, которая, работая на
конфигурации (k1, ..., ki, ..., kj, ... , km) выдает 0, если ki=kj,
и 1 - в противном случае.
Условие xi < xj реализуется машиной $$\Phi _{<}^{ij}$$, которая, работая на
конфигурации (k1, ..., ki, ..., kj, ... , km) выдает 0, если ki < kj,
и 1 - в противном случае.
Далее по индукции: пусть $$\Pi _{1}$$ и $$\Pi _{2}$$ -
Используя доказанные выше свойства конструкций машин Тьюринга, нетрудно проверить по индукции следующее
Утверждение 1. Пусть м.Т. $$M_{\Pi }$$ реализует в соответствии с приведенными определениями
Теперь для завершения доказательства теоремы достаточно взять в качестве
результирующей следующую м.Т.: $$M = M_{start}; M_{\Pi }; M_{end}$$,
где м.Т. Mstart переводит одноэтажную начальную конфигурацию $$|^{x_1}*|^{x_2}*\ldots |^{x_n}$$ в m -этажную конфигурацию (x1, x2,..., xn, 0,..., 0),
а м.Т. Mend заключительную m -этажную конфигурацию (x1, 0,..., 0) переводит
в одноэтажную заключительную конфигурацию |x1.
В этом параграфе покажем, как можно промоделировать работу машины Тьюринга, используя частично рекурсивные определения.
Теорема 10.3. Всякая
Доказательство этой теоремы - дополнительный материал, который можно при первом чтении опустить.
Доказательство Пусть м.Т. $$\mathcal{ M} = <Q, \Sigma, P,q_0, q_f> $$ вычисляет функцию f(x1,..., xn).
Пусть также Q ={q0,q1,... ,q k-1 }, qf=q1 и $$\Sigma = \{ a_{0}=\wedge , a_{1}, \dots , a_{ R-1}= | \}$$. Предположим также,
не ограничивая общности, что $$\mathcal{ M} $$ никогда не пишет пустой
символ $$\wedge$$ (как перестроить программу произвольной м.Т.,
чтобы она удовлетворяла этому условию ?).
Определим кодирование элементов конфигураций $$\mathcal{ M} $$ целыми числами. Пусть конфигурация $$\mathcal{ M} $$ имеет вид K=(w1,qi,aj,w2), где $$w_1=a_{i_m}a_{i_{m-1}} \ldots a_{i_0} $$ - слово на ленте левее головки, qi - состояние м.Т., aj - наблюдаемый в данной конфигурации символ
и w2= aj0aj1 ... ajp} - слово на ленте правее головки.
Кодом символа $$a_{j} \in \Sigma$$ будет число j,
кодом состояния qi - число i.
Слова w1 и w2 будем рассматривать как числа в R -ичной
системе счисления, читаемые в противоположных направлениях (из наших
предположений следует, что $$i_{m} \ne 0$$ при m >0
и $$j_{p} \ne 0$$ при p>0 ) :
Например, если $$\Sigma = \{ \wedge , *, |\}$$, то для конфигурации K=(|**,q3,|,* | |) имеем code1(w1)=30 1+31 1+ 32 2= [211]3=22
и code2(w2)=30 1+ 31 2 +32 2= [221]3=25. По программе P определим следующие табличные функции, кодирующие ее команды:
A(i,j) - код символа, который пишет $$\mathcal{ M}$$, когда она
в состоянии qi видит символ aj;
Q(i,j) - код состояния, в которое переходит $$\mathcal{ M}$$, когда
она в состоянии qi видит символ aj;
C(i,j) - код направления сдвига головки $$\mathcal{M}$$, когда
она в состоянии qi видит символ aj (0 - на месте, 1 - вправо, 2 - влево).
Пусть при i >= k или j >= R эти функции принимают
какое-нибудь фиксированное значение (например, 0). Тогда по лемме 18.1
все они примитивно рекурсивны.
Определим функции, которые по кодам компонент одной
конфигурации K=(w1,qi,aj,w2) вычисляют коды компонент
следующей конфигурации K’=(w1’,qm,ap,w2’).
Покажем, что все эти функции примитивно рекурсивны. Для q
это следует из того, что для любых i, j q(l,i,j,m)=Q(i,j).
Определения остальных трех функций зависят от сдвига. При C(i,j)=0 имеем lf(l,i,j,r)=l, rt(l,i,j,r)= r, a(l,i,j,r)=A(i,j).
Если C(i,j)=2, то lf(l,i,j,r)=div(R, l), rt(l,i,j,r)= rR+A(i,j), a(l,i,j,r)=rm(R,l). Если же C(i,j)=1, то lf(l,i,j,r)= Объединяя эти случаи получаем, что
( здесь rm(x,y) - это функция, дающая остаток от деления y на x, а div(x,y) - функция целочисленного деления y на x ).
Аналогичные представления справедливы и для функций rt(l,i,j,r) и a(l,i,j,r). Следовательно, все эти функции примитивно рекурсивны.
Пусть из данной конфигурации K через t тактов
получается конфигурация Kt. Определим коды компонент Kt
как функции от компонент K и t :
Это определение задает функции A(4), Q(4), Lf(4), Rt(4) с помощью совместной рекурсии. Следовательно, по лемме 18.5
они примитивно рекурсивны.
Пусть м.Т. $$\mathcal{ M} $$ вычисляет функцию f(x), (т.е. n=1 ). Тогда для начальной конфигурации $$K_{x}=K^{0}=(\wedge ,q_{0},|,|^{x-1})$$ code1(w1)=0, code(q0)=0, code(|)=R-1, code2( w2 ) = (R-1)Rx-2+(R-1)R x-3+ ... +(R-1)R0=R x-1-1. Положим $$\bar Q(x,t)=Q(0,0,R-1,R^{x-1}-1, t) $$ и $$\bar{Rt}(x,t)=Q(0,0,R-1,R^{x-1}-1, t)$$. Тогда функция $$\tau(x)= \mu t(\bar Q(x,t)=1) $$ задает число шагов
до перехода $$\mathcal{ M} $$ в заключительное состояние на входе x. Эта функция, очевидно, частично рекурсивна. Тогда функция $$\hat{Rt}(x)=\bar{Rt}(x,\tau(x)) $$ задает код правой
части заключительной конфигурации, имеющий вид Rf(x)-1-1.
Отсюда получаем, что
и следовательно, функция f(x) частично рекурсивна.
Мы рассмотрели три математические модели для описания алгоритмов и вычисляемых ими функций, отражающие различные аспекты и представления о работе абстрактного вычислителя. Из теорем 8.1, 10.2 и 10.3 непосредственно получаем
Следствие.
Естественно, возникает вопрос о том, насколько общим является этот результат? Верно ли, что каждый алгоритм может быть задан одним из рассмотренных способов? На эти вопросы теория алгоритмов отвечает следующей гипотезой.
Тезис Тьюринга-Черча:
Всякий алгоритм может быть задан в виде
соответствующей машины Тьюринга или частично рекурсивного определения, а
Значение этого тезиса заключается в том, что он уточняет общее неформальное
определения "всякого алгоритма" и "вычислимой функции" через точные формальные
понятия машины Тьюринга, частично рекурсивного определения и
соответствующих им классов функций.
После этого можно осмысленно ставить вопрос о существовании или несуществовании
алгоритма, решающего тот или иной класс задач.
Теперь этот вопрос следует понимать как вопрос о существовании или несуществовании
соответствующей машины Тьюринга, или (что эквивалентно)
Можно ли доказать этот тезис как теорему? Нет, поскольку в его формулировке речь идет о неточных понятиях "всякого алгоритма" и "вычислимой функции", которые не могут быть объектами математических рассуждений. На чем же тогда основана уверенность в справедливости тезиса Тьюринга-Черча? В первую очередь, на опыте. Все известные алгоритмы, придуманные за многие века математиками, могут быть заданы с помощью машин Тьюринга. Для всех многочисленных моделей алгоритмов, появившихся за последние 70 лет (некоторые из них мы упоминали в начале лекции), была доказана их равносильность машинам Тьюринга. В качестве доводов в пользу тезиса Тьюринга-Черча можно также рассматривать замкнутость класса машин Тьюринга и ч.р.ф. относительно многочисленных естественных операций над алгоритмами и функциями. Отметим также, что тезис Тьюринга-Черча обращен и в будущее: он предполагает, что какие бы новые формальные определения алгоритмов ни были предложены (а таковыми, например, являются новые языки программирования), все они не выйдут из класса алгоритмов, задаваемых машинами Тьюринга.
Чтобы показать связь теории алгоритмов с "практическим" программированием, рассмотрим некоторые алгоритмичские проблемы, связанные со структурированными программами.
Зафиксируем конечный алфавит A={a0, a1,..., am-1}, включающий все символы латинского алфавита,
цифры, знак пробела (пусть это будет a0 ), знаки ' ; ', ' = ', ' < ', ' := ' , а также знаки-ключевые слова если, то, конец, пока, делай и все.
Тогда каждая структурированная программа $$\Pi$$ представляет собой некоторое слово $$w_{\Pi}=a_{i_1}a_{i_2}\ldots a_{i_k}$$ в алфавите A. Не ограничивая общности,
будем считать, что это слово начинается не с пробела, т.е. i1 >0.
Тогда слово $$w_{\Pi }$$ однозначно определяет натуральное число $$n_{\Pi }$$, m -ичной записью
которого оно является, т.е. $$n_{\Pi}=\sum_{j=1}^k i_j m^{k - j}$$. Назовем это число
номером программы $$\Pi$$ . По тексту программы $$\Pi$$ ее номер $$n_{\Pi }$$ определяется однозначно.
Рассмотрим теперь обратное соответствие. Конечно, не каждое число является номером
некоторой n не является
"естественным" номером никакой программы, сопоставим ему в качестве $$\Pi _{n}$$
некоторую никогда не
останавливающуюся программу P (например, программу $$\Pi _{5}(1)$$: x1 := x1; пока x1=x1 делай x1:=x1 все из примера 7.5).
Проблема самоприменимости заключается в проверке для каждой программы $$\Pi$$ с входной переменной x и выходной переменной y того, остановится ли $$\Pi$$ на собственном номере $$n_{\Pi }$$, т.е в вычислении
Теорема 10.4. Проблема самоприменимости алгоритмически неразрешима, т.е. не существует Fs(x).
Доказательство от противного. Предположим, что существует программа P, вычисляющая функцию Fs(x). Без ограничения общности, можно считать,
что ее выходная переменная есть y (почему?) и поэтому $$\Phi _{P,y}(x)=F_{s}(x)$$ для всех x. Пусть переменная z не входит в P.
Рассмотрим следующую программу P’:
Легко проверить, что если P на входе x выдает результат y=1, то P’
на этом входе не останавливается, а если P выдает результат y=0, то P’
останавливается ( и тоже выдает 0). Пусть n’=nP’ - номер программы P’.
Чему тогда равно значение $$\Phi _{P,y}(n’)$$?
Если оно равно 1, то на входе x=n’ программа P’ не остановится, т.е. $$\Phi _{P’,y}(n’)= \infty$$, но тогда $$F_{s}(n’)=0 \ne \Phi _{P,y }(n’)$$.
Если же $$\Phi _{P,y }(n')=0$$, то P’ на входе x=n’ останавливается с результатом 0,
т.е. $$\Phi _{P’,y}(n') < \infty$$. Но тогда $$F_{s}(n’)=1 \ne \Phi _{P,y }(n')=0$$.
Во всех случаях получили, что $$F_{s} \ne \Phi _{P,y }$$ и, следовательно,
предположение о существовании программы для вычисления функции Fs
неверно.
Заметим, что на самом деле мы доказали отсутствие Fs. Но тезис Тьюринга-Черча и эквивалентность
Проблема самоприменимости может показаться не очень интересной с практической ("программистской") точки зрения. Но оказывается, что ее можно использовать для доказательства алгоритмической неразрешимости многих других алгоритмических проблем, более тесно связанных с практикой программирования.
Проблема останова: по произвольной 0, т.е вычислить всюду определенную функцию
В более общем виде проблема останова состоит в вычислении следующей функции:
$$F_h(n,a)=\left\{\begin{array}{ll} 1,\qquad \textit{если } \Phi_{\Pi_n,y}(a) < \infty\\ 0 \qquad \textit{в противном случае} \end{array} \right.$$Из этого определения следует, что программа $$\Pi _{n}$$ останавливается
на входе a тогда и только тогда, когда Fh(n,a)=1.
Проблема тотальности: по произвольной
Проблемы оптимизации текста программы. Одна из возможных оптимизаций (текста) программы состоит в удалении из нее операторов присваивания, которые никогда не работают, а другая - в замене условных операторов вида
$$\textbf{ если } \varphi \textbf{ то } \Pi_1 \textbf{ иначе } \Pi_2 \textbf{ конец},$$на $$\Pi _{1}$$ в случае, когда условие $$\phi$$ истинно на любых входных данных, и - на $$\Pi _{2}$$, если оно на любом входе ложно. Определим соответствующие этим оптимизациям функции:
$$F_{opt1}(n,m)= \left\{\begin{array}{ll} 1, \qquad \textit{если существует вход } a, \textit{при работе на котором}\\ \qquad\textit{ в программе } \Pi_n \textit{срабатывает } m\textit{-ый по счету}\\ \qquad \textit{оператор присваивания}\\ 0 \qquad \textit{в противном случае} \end{array} \right.$$Из этого определения следует, что при Fopt1(n,m)=0 программу $$\Pi _{n}$$ можно оптимизировать, удалив из нее m -ый оператор присваивания. Назовем задачу вычисления функции Fopt1(n,m) проблемой лишнего присваивания
Ясно, что при Fopt2(n,m)=0 программу $$\Pi _{n}$$ можно оптимизировать, заменив ее m -ый условный оператор его второй альтернативой.
Назовем задачу вычисления функции Fopt2 (n,m) проблемой лишнего условия
Заметим, что проблема самоприменимости и все проблемы, перечисленные в пп. 1-4 выше,
связаны с вычислением функций, принимающих два значения 0 и 1.
Эти функции являются характеристическими функциями соответствующих
множеств.
Например, Fh0(n) является характеристической функцией множества номеров программ,
останавливающихся на входе 0.
Напомним, что для множества $$A \subseteq N^{k}$$ его характеристическая функция cAk определяется следующим образом:
На множества переносится понятия разрешимости и неразрешимости.
Определение 10.1. cAk вычислима, т.е. является общерекурсивной функцией,
в противном случае, оно (и связанная с ним проблема) неразрешимо
Используя это определение, теорему 10.4 можно переформулировать так:
Множество номеров программ, остановливающихся на собственном номере,
$$M_s=\{ n | \Phi_{\Pi_n}, y (n) < \infty\} неразрешимо.}$$Обычно доказательства неразрешимости проблем используют метод сведения.
Неформально его идею можно сформулировать следующим образом:
"Если решение некоторой неразрешимой проблемы A можно эффективно получить,
используя решение проблемы B, то тогда проблема B тоже неразрешима."
Определим отношение сводимости более формально.
Напомним, что нумерационные функции позволяют вместо
наборов (векторов, n -ок) целых чисел рассматривать их номера.
Для множества $$B \subseteq N^{r}$$ обозначим через cr(B) множество номеров входящих в B наборов: $$c_{r}(B)=\{ c_{r}(a_{1},\dots , a_{r}) | (a_{1},\dots , a_{r})\in B\}$$
(при r=1, разумеется, c1(B)=B ).
Лемма 10.1.
Множество (проблема) $$A \subseteq N^{k}$$ сводится
к множеству (проблеме) $$B \subseteq N^{r}$$, если существует общерекурсивная функция f: Nk -> N
такая, что $$(x_{1},\dots ,x_{k}) \in A \Leftrightarrow f (x_{1},\dots ,x_{k}) \in c_{r}(B)$$.
В этом случае будем писать A <=m B посредством f.
Содержательно, " A сводится к B посредством f " означает, что для выяснения, входит ли x в A, можно эффективно преобразовать x в такие входные данные y=f(x)
проблемы B, что при $$y \in B$$ имеем $$x \in A$$, а если $$y \notin B$$, то и $$x \notin A$$.
Лемма 10.2. Если A разрешимо, а B не совпадает с $$\varnothing$$ и N, то A <=m B.
Доказательство. По условию имеются такие b и d, что $$b \in B$$, а $$d \notin B$$.
Положим f(x) = b , cA(x) + d ,(1 - cA(x)). Тогда при $$x \in A$$ имеем $$f(x) = b , 1 + d ,(1-1)= b \in B$$,
а при $$x \notin A$$ - $$f(x) = b , 0 + d ,(1-0)= d \notin B$$. Таким образом, A <=m B посредством f.
Как мы уже отмечали, доказательство неразрешимости можно основывать на следующем утверждении.
Лемма 10.3.
Если A сводится к B и проблема A неразрешима, то
и проблема B неразрешима.
Доказательство. Пусть A <=m B посредством f.
Тогда из определения
сводимости следует, что для всех x имеет место равенство cA(x)=cB(f(x)). Поэтому, если бы B была разрешима,
то ее характеристическая функция cB была бы общерекурсивна и cA также была бы общерекурсивна. Но это противоречит неразрешимости
проблемы A.
Теорема 10.5. Все проблемы, перечисленные выше в пунктах 1-4, являются алгоритмически неразрешимыми.
Доказательство. Нам потребуются следующие вспомогательные
программы $$\Pi _{x:=n}: x:=0; x:= x+1; \dots ; x:= x+1$$ ( присваиваие x:=x+1
повторяется n раз). Понятно, что для любого начального состояния $$\sigma$$ после выполнения $$\Pi _{x:=n}$$ имеем $$\Pi _{x:=n}(\sigma )(x)=n$$.
Докажем неразрешимость {проблемы останова:} по произвольной структурированной
программе $$\Pi$$ определить, завершится ли вычисление $$\Pi$$ на входе 0.
Пусть $$M_{h0}=\{ n | \Phi _{\Pi n,y }(0) < \infty \}$$. Докажем, что множество номеров
самоприменимых программ Ms сводится к Mh0. Пусть n - номер программы $$\Pi _{n}$$. преобразуем ее в программу $$\Pi ': \Pi _{x:=n};\Pi _{n}; y:=0$$.
Таким образом, $$\Pi '$$ вначале заносит в x номер n программы $$\Pi _{n}$$,
а затем применяет $$\Pi _{n}$$ к этому номеру и, если $$\Pi _{n}$$ на n останавливается, выдает
результат y=0. Поэтому $$\Pi '$$ останавливается на любом аргументе (в том числе и на 0) тогда и только тогда,
когда $$n \in M_{s}$$. Преобразование программы $$\Pi _{n}$$ в программу $$\Pi '$$ осуществляется эффективно. Поэтому (на основании тезиса Тьюринга-Черча)
существует такая о.р.ф. f, которая по n вычисляет номер m программы $$\Pi '=\Pi _{m}=\Pi _{f(n)}$$.
Эта функция и будет сводить Ms к Mh0, так как $$n \in M_{s} \Leftrightarrow f(n) \in M_{h0}$$.
Следовательно, по лемме ref{lm-red} проблемы останова Mh0 неразрешима.
Очевидно, что и более общая форма проблемы останова $$M_{h}=\{ (n,a) | \Phi _{\Pi n, y }(a) < \infty \}$$ также неразрешима, поскольку к ней
сводится Mh0: $$n \in M_{h0} \Leftrightarrow (n,0) \in M_{h}$$.
Ms к множеству Mt номеров программ, вычисляющих всюду
определенные функции, можно также использовать функцию f из пункта 1.
Действительно, $$\Pi _{n}$$ останавливается на входе n тогда и только тогда, когда $$\Pi '=\Pi _{f(n)}$$ останавливается на всех входах, т.е. $$n\in M_{s} \Leftrightarrow f(n) \in M_{t}$$.
Следовательно, проблема тотальности Mt неразрешима.Рассмотрим теперь проблему эквивалентности. Пусть
$$M_{eq}=\{(n,m) | \textit{ для всех } x \\ \Phi_{\Pi_n,y}(x) = \Phi_{\Pi_m,y}(x) \}.$$Зафиксируем следующую программу P0: x:=x; y:=0. Очевидно, что она вычисляет функцию,
тождественно равную нулю, т.е. $$\Phi_{P^0,y}(x)=0$$ для всякого x.
Пусть ее номер n(P0) равен k0. Для произвольного n рассмотрим
пару (f(n), k0). Из определения f следует, что $$\Pi _{n}$$ останавливается на входе n тогда и только тогда, когда $$\Pi '=\Pi _{f(n)}$$ останавливается на всех входах и выдает результат 0: $$\Phi_{\Pi_{f(n),y}}(x)=0$$ для всех x, т.е. $$\Pi _{ f(n)}$$ и $$\Pi_{k_0}$$
эквивалентны. Тогда $$n \in M_{s}\Leftrightarrow (f(n),k_{0}) \in M_{eq}$$. Положим g(n)= c2(f(n),k0) .
Тогда g является о.р.ф. и $$n \in M_{s}\Leftrightarrow g(n) \in c_{2}(M_{eq})$$. Следовательно, Ms
сводится к Meq посредством g и проблема Meq неразрешима.
Для доказательства неразрешимости проблемы лишнего присваивания:
$$M_{opt1}=\{(n,m) | \textit{на некотором входе } \ a\ \textit{ в программе } \ \Pi_n \textit{срабатывает }\\ m\textit{-ый по счету } \textit{оператор присваивания}\}$$снова используем функцию f из пункта 1. Напомним, что $$\Pi _{f(n)}: \Pi _{\{ }x:=n\} ;\Pi _{n}; y:=0$$. По n и соответствующей программе $$\Pi _{n}$$
можно легко определить номер m последнего присваивания y:=0 в $$\Pi _{f(n)}$$:
Пусть g(n) - это о.р.ф., вычисляющая по n этот номер m. Тогда $$n \in M_{s}\Leftrightarrow (f(n),g(n)) \in M_{opt1}$$. Положим h(n)= c2(f(n),g(n)). Тогда h является о.р.ф. и $$n \in M_{s}\Leftrightarrow h(n) \in c_{2}(M_{opt1})$$. Следовательно, Ms
сводится к Mopt1 посредством h и проблема Mopt1 неразрешима.
Рассмотрим теперь проблему лишнего условия:
$$M_{opt2}=\{(n,m) | \textit{существует вход\ }, a\\ \textit{ на котором при некотором срабатывании}\\\textit{ m-го по счету условного оператора}\\\textit{ в программе } \Pi_n\ \textit{его условие истинно}\}.$$Для доказательства ее неразрешимости определим по n программу $$\Pi ’‘: \Pi ’; если y=0 то y:=y иначе y:=y +1 конец$$ ( здесь $$\Pi '$$ - программа из п. 1).
И в этом случае программа $$\Pi ''$$ строится по программе $$\Pi _{n}$$ эффективно. Пусть ее номер вычисляется о.р.ф. f’, т.е. $$\Pi _{f’(n)}=\Pi ''$$, и пусть
о.р.ф. g’(n) определяет номер последнего условного оператора в программе $$\Pi _{f’(n)}$$.
Тогда $$n \in M_{s}\Leftrightarrow$$ в программе $$\Pi _{f'(n)}$$ последний условный
оператор выполняется (на любом входе) и при этом y=0, т.е. его условие
истинно, а это означает, что $$(f’(n),g'(n)) \in M_{opt2}$$.
Положив h’(n)= c2(f’(n),g’(n)), получим, что $$n \in M_{s} \Leftrightarrow h'(n) \in c_{2}(M_{opt2})$$. Следовательно, Ms
сводится к Mopt2 посредством h’ и проблема Mopt2
также неразрешима.
Теорема доказана.
Какой же вывод можно сделать из того, что некоторая алгоритмическая проблема оказалась неразрешимой? Для программистов из такого утверждения извлекаются "две новости: плохая и хорошая ". "Плохая новость" состоит в том, что невозможно построить алгоритм (программу) для автоматического решения такой проблемы. Например, из теоремы 10.5 следует, что невозможно автоматически проверить, входит ли некоторый вход в область определения вычислимой функции, нельзя определить корректность программы, т.е. то, что она вычисляет требуемую функцию, нет способа проверять эквивалентность программ (не только структурированных, но и написанных на Паскале, Си, ассемблере, Яве и других языках программирования), не существует алгоритмов для оптимизаций, связанных с удалением лишних присваиваний и условий, и т.п. Но неразрешимость проблемы не означает, что она не может быть решена для некоторых отдельных входных данных. Например, в предыдущих разделах мы построили достаточно много программ и доказали их корректность. Поэтому "хорошая новость" для программистов и математиков состоит в том, что их труд при решении неразрешимых проблем в каждом отдельном случае является творческим - никакой программой их не заменить. Появление каждой новой содержательно интересной неразрешимой проблемы только расширяет область их творчества, заставляет искать все более и более широкие алгоритмы, которые позволяют решать все более обширные подклассы относящихся к этой проблеме индивидуальных задач.
Задача 10.1. Докажите, что машины Тьюринга $$\mathcal{ M}_F $$ и $$\mathcal{M}_f$$, определенные в доказательстве теоремы 10.1 для
Задача 10.2. Постройте машины Тьюринга Mi0 , Mi+1, Mij, $$\Phi ^{ ij }_{=}$$, $$\Phi ^{ ij}_{<}$$, Mstart и Mend, определенные
в доказательстве теоремы 10.2.
Задача 10.3. Докажите утверждение 1, сформулированное в доказательстве теоремы 10.2, используя индукцию по построению программы $$\Pi$$ и соответствующей м.Т. $$M_{\Pi }$$.
Задача 10.4. В доказательстве теоремы 10.3 рассмотрен случай, когда
м.Т. $$\mathcal{ M} $$ вычисляет функцию
от одного аргумента f(x) . Покажите, что теорема верна и в
общем случае для функций f(x1,...,xn) при любом n.
Задача 10.5.
Докажите, что отношение <=m является рефлексивным и транзитивным.
Задача 10.6. Доказать алгоритмическую неразрешимость следующих проблем.
a и b проверить равенство $$\Phi _{\Pi ,y}(a)=b$$.x имеет место неравенство $$\Phi _{\Pi ,y}(x) > \Phi _{\Pi ',y}(x)$$.Задача 10.7. Докажите, что
Задача 10.8.
Докажите, что для двух A и B их "сумма" $$A+B=\{ x+y | x\in A, y\in B\}$$ также
является
Задача 10.9. Пусть A - g(x) и h(x) являются о.р.ф. Докажите, что функция
также является общерекурсивной.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.