Дискуссионный математический форумМатематический форум

Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 4 часа [ Летнее время ]
MathHelpPlanet.com RSS-лента Математического форума

Часовой пояс: UTC + 4 часа [ Летнее время ]


Неразрешимые алгоритмические проблемы

Неразрешимые алгоритмические проблемы


Алгоритмическая проблема — это проблема, в которой требуется найти единый метод (алгоритм) для решения бесконечной серии однотипных единичных задач. Такие проблемы называют также массовыми проблемами. Они возникали и решались в различных областях математики на протяжении всей ее истории. Примеры таких проблем рассматривались ранее.


Математики в начале XX в. столкнулись с тем, что для некоторых массовых проблем не удается подобрать общий алгоритм для их решения. В связи с этим возникла необходимость дать точное определение самому понятию алгоритма. Мы познакомились с несколькими способами такого уточнения, и в настоящем параграфе приведем примеры алгоритмически неразрешимых массовых проблем. Сначала в качестве понятия, уточняющего понятие алгоритма, будем использовать понятие машины Тьюринга. Затем рассмотрим проблему алгоритмической разрешимости в рамках общей теории алгоритмов.




Нумерация алгоритмов


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


Поскольку любой алгоритм можно задать конечным описанием (словом) (например, в конечном алфавите знаков, используемых при наборе математических книг), а множество всех конечных слов в фиксированном конечном алфавите счетно, то множество всех алгоритмов счетно. Это означает наличие взаимно-однозначного соответствия между множеством [math]N[/math] натуральных чисел и множеством всех алгоритмов, рассматриваемым как подмножество множества [math]Al^{\ast}[/math] всех слов в алфавите [math]Al[/math], выбранном для описания алгоритмов [math](\varphi\colon N\to Al^{\ast})[/math]. Такая функция называется нумерацией алгоритмов. Если [math]\varphi(n)=A[/math], то число [math]n[/math] называется номером алгоритма [math]A[/math]. Из взаимной однозначности отображения [math]\varphi[/math] следует существование обратной функции [math]\varphi^{-1}[/math], восстанавливающей по описанию алгоритма [math]A_n[/math] его номер в этой нумерации [math]\varphi^{-1}(A_n)=n[/math]. Очевидно, что различных нумераций много.


Нумерация всех алгоритмов является одновременно и нумерацией всех вычислимых функций в следующем смысле: номер функции [math]f[/math] — это номер некоторого алгоритма, вычисляющего [math]f[/math]. Ясно, что в любой нумерации всякая функция будет иметь бесконечное множество различных номеров.


Существование нумераций позволяет работать с алгоритмами как с числами. Это особенно удобно при исследовании алгоритмов над алгоритмами. Отсутствие именно таких алгоритмов часто приводит к алгоритмически неразрешимым проблемам.




Нумерация машин Тьюринга


Опишем теперь более конкретный процесс нумерации всех машин Тьюринга, который используем при построении примера невычислимой по Тьюрингу функции. Будем считать, что для обозначения внутренних состояний машин Тьюринга используются буквы бесконечной последовательности: [math]q_0,q_1,q_2,\ldots, q_r,\ldots[/math], а для обозначения букв внешних алфавитов используются буквы последовательности: [math]a_0,a_1,a_2,\ldots,a_s,\ldots[/math].


Выразим (или, как говорят, закодируем) все символы этих бесконечных последовательностей словами конечного стандартного алфавита [math]\{a_0,1,q,C,\Pi,L\}[/math] по следующим правилам:


[math]q_i~(i=0,1,\ldots)[/math] обозначим (закодируем) словом из [math]i+1[/math] букв [math]q\colon\, qq\ldots q[/math];

[math]a_j~(j=1,2,\ldots)[/math] обозначим (закодируем) словом из у единиц: [math]11\ldots1[/math].


В стандартном алфавите программу машины Тьюринга можно записать в виде слова, руководствуясь следующим правилом. Сначала все команды программы переводятся на язык стандартного алфавита, для чего в записях этих команд [math]q_ia_j\to q_la_mX[/math], где [math]X\in \{C,\Pi,L\}[/math], опускается символ "[math]\to[/math]", а буквы [math]q_i,a_j,q_l,a_m[/math] заменяются соответствующими словами стандартного алфавита. Затем полученные слова-команды записываются подряд в любом порядке в виде единого слова.


Например, программа машины Тьюринга, рассмотренной в Примере 32.1, в этих обозначениях имеет вид:


[math]q_1a_0\to q_2a_0\Pi,\quad q_1a_1\to q_1a_1\Pi,\quad q_2a_0\to q_0a_1C,\quad q_2a_1\to q_2a_1\Pi.[/math]

Опускаем символ "[math]\to[/math]", заменяем буквы словами стандартного алфавита и в результате полу- чаем следующие слова в стандартном алфавите, кодирующие соответствующие команды:


[math]qqa_0qqqa_0\Pi,\quad qq1qq1\Pi,\quad qqqa_0q1C,\quad qqq1qqq1\Pi.[/math]

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


[math]qqa_0qqqa_0\Pi qq1qq1\Pi qqqa_0q1C qqq1qqq1\Pi.[/math]

Нетрудно указать алгоритм, позволяющий узнавать, является ли слово в стандартном алфавите программой некоторой машины Тьюринга. Такой алгоритм может, например, состоять в следующем. Нужно анализировать все подслова данного слова, заключенные между всевозможными парами букв из [math]\{C,\Pi,L\}[/math]. Эти подслова должны иметь следующую структуру: сначала записаны несколько букв [math]q[/math], затем [math]a_0[/math] или несколько букв 1, затем снова несколько букв [math]q[/math] и, наконец, снова [math]a_0[/math] или несколько единиц.


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


Перенумеруем теперь все машины Тьюринга, для чего все слова стандартного алфавита, представляющие собой программы всевозможных машин Тьюринга, расположим в виде фиксированной счетно-бесконечной последовательности, которую составим по такому правилу: сначала выписываются в какой-нибудь фиксированной последовательности все однобуквенные слова: [math]\alpha_0,\alpha_1,\ldots, \alpha_{\xi}[/math], представляющие программы машин Тьюринга (множество таких слов конечно, потому что конечен стандартный алфавит, из букв которого строятся слова), затем выписываются все двухбуквенные слова [math]\alpha_{\xi+1},\ldots, \alpha_{\eta}[/math], представляющие программы машин Тьюринга (множество таких слов также конечно, потому что конечен стандартный алфавит), затем выписываются трехбуквенные слова и т.д. Получится последовательность программ [math]\alpha_0,\alpha_1, \alpha_2,\ldots, \alpha_,\ldots[/math] всех мыслимых машин Тьюринга. Число [math]k[/math] будем называть номером машины Тьюринга, если программа этой машины записывается словом [math]\alpha_k[/math].




Существование невычислимых по Тьюрингу функций


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


Доказательство. Функции, о которых идет речь, представляют собой функции, заданные и принимающие значения в множестве слов в алфавите [math]A_1=\{1\}[/math]. Ясно, что множество слов в алфавите [math]A_1=\{1\}[/math] счетно. Следовательно, рассматривается множество всех функций, заданных на счетном множестве и принимающих значения в счетном же множестве. Как известно, это множество имеет мощность континуума. С другой стороны, поскольку множество всевозможных машин Тьюринга, как мы установили в предыдущем пункте, перенумеровав их, счетно, это и множество функций, вычислимых по Тьюрингу, также счетно. Континуальная мощность строго больше счетной. Следовательно, существуют функции, не вычислимые по Тьюрингу.


Доказанная теорема есть чистая теорема существования. Интересно получить пример конкретной функции, не вычислимой по Тьюрингу.


Пример 36.2. Укажем конкретную функцию, которую нельзя вычислить ни на какой машине Тьюринга. На основании тезиса Тьюринга это будет означать, что не существует вообще никакого алгоритма для вычисления значений такой функции.


Рассмотрим следующую функцию [math]\psi(\alpha)[/math] на словах в алфавите [math]A_1=\{1\}[/math]. Для произвольного слова [math]\alpha[/math] длиной [math]n[/math] в алфавите [math]A_1=\{1\}[/math] положим: [math]\psi(\alpha)= \beta_n1[/math], если слово [math]\alpha[/math] перерабатывается машиной Тьюринга с номером [math]n[/math] (см. предыдущий пункт) в слово [math]\beta_n[/math] алфавита [math]A_1=\{1\};~ \psi(\alpha)=1[/math] в противном случае. Докажем, что функция [math]\psi(\alpha)[/math] не вычислима по Тьюрингу.


Допустим противное. Это означает, что существует машина Тьюринга [math]T[/math] со стандартным алфавитом [math]\{a_0,1,q,\Pi,L\}[/math], вычисляющая эту функцию. Пусть [math]k[/math] — номер этой машины в нумерации, описанной в предыдущем пункте. Посмотрим, чему равно слово [math]\psi(1^k)[/math] (напомним, что [math]1^k=11\ldots1[/math] — слово из [math]k[/math] единиц), являющееся значением функции [math]\psi(\alpha)[/math] при [math]\alpha=1^k[/math]. Предположим, что машина [math]t[/math] перерабатывает слово [math]1^k[/math] в слово [math]\beta_k[/math] в том же алфавите [math]A_1=\{1\}[/math]. Тогда по определению вычислимости функции [math]\psi(\alpha)[/math] на машине [math]T[/math] это означает, что [math]\psi(1^k)=\beta_k[/math]. Но с другой стороны, по самому определению функции [math]\psi(\alpha)[/math] это означает, что [math]\psi(1^k)= \beta_k1[/math]. Полученное противоречие доказывает, что машины Тьюринга, вычисляющей функцию [math]\psi(\alpha)[/math], не существует.


Принимая во внимание тезис Тьюринга, заключаем, что не существует вообще никакого алгоритма для вычисления значений функции [math]\psi(\alpha)[/math]. Это означает, что массовая проблема нахождения значений функции [math]\psi(\alpha)[/math] для всевозможных значений аргумента алгоритмически не разрешима.




Проблемы распознавания самоприменимости и применимости


Это еще два примера алгоритмически не разрешимых проблем. Сначала о первой. Предположим, что на ленте машины Тьюринга записана ее собственная функциональная схема в алфавите машины. Если машина применима к такой конфигурации, то будем называть ее самоприменяемой, в противном случае — несамоприме-Няемой. Возникает массовая проблема распознавания самоприме-Кяемых машин Тьюринга, состоящая в следующем. По заданной Функциональной схеме (программе) машины Тьюринга устано-Вить, к какому классу относится машина: к классу самопримени-Mbix машин или к классу несамоприменимых машин.


Теорема 36.3. Проблема распознавания самоприменимых машин Тьюринга алгоритмически не разрешима.


▼ Доказательство

Допустим противное, т. е. алгоритм для такого распознавания существует. Значит, на основании тезиса Тьюринга, существует машина Тьюринга, реализующая данный алгоритм. Пусть [math]\Theta[/math] — такая машина. На ее ленту заносится соответствующим образом закодированная программа той или иной машины Тьюринга. При этом, если машина самоприменима, то занесенное слово перерабатывается машиной [math]\Theta[/math] в какой-то символ [math]\sigma[/math] (имеющий смысл утвердительного ответа на поставленный вопрос о самоприменимости). Если же машина несамоприменима, то занесенное на ленту слово, кодирующее ее программу, перерабатывается машиной [math]\Theta[/math] в какой-то символ [math]\tau[/math] (имеющий смысл отрицательного ответа на поставленный вопрос).


Рассмотрим теперь такую машину Тьюринга [math]\Theta_1[/math], которая по-прежнему перерабатывает несамоприменимые коды в [math]\tau[/math], а к самоприменимым кодам машина [math]\Theta_1[/math] уже не применима. Такая машина получается из машины [math]\Theta[/math], если следующим образом слегка изменить ее программу: после появления символа [math]\sigma[/math] вместо остановки машина должна неограниченно его повторять.


Итак, [math]\Theta_1[/math] применима ко всякому несамоприменимому коду (вырабатывая символ [math]\tau[/math]) и не применима к самоприменимым кодам. Это приводит к противоречию, потому что такая машина не может быть ни самоприменимой, ни несамоприменимой. В самом деле, если машина [math]\Theta_1[/math] самоприменима, то она не применима к своему коду. Значит, машина несамоприменима. Противоречие. С другой стороны, если машина [math]\Theta_1[/math] несамоприменима, то ее код должен перерабатываться самой машиной [math]\Theta_1[/math] в символ [math]\tau[/math]. Значит, [math]\Theta_1[/math] применима к собственному коду, т.е. самоприменима. Снова противоречие. Оно и доказывает теорему.


На основании доказанной теоремы устанавливается алгоритмическая неразрешимость и некоторых других массовых проблем, возникающих в теории машин Тьюринга, например проблема распознавания применимости для машин Тьюринга, которая состоит в следующем. Заданы функциональная схема (программа) какой-нибудь машины Тьюринга и конфигурация в ней: узнать, применима ли машина к данной конфигурации или нет.


Теорема 36.4. Проблема распознавания применимых машин Тьюринга алгоритмически не разрешима.


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




Алгоритмически неразрешимые проблемы в общей теории алгоритмов


Итак, мы установили алгоритмическую неразрешимость двух проблем, связанных с машинами Тьюринга: проблема распознавания самоприменимых машин Тьюринга (теорема 36.3) и проблема распознавания применимости для машин Тьюринга (теорема 36.4). Каждое из этих утверждений может быть сформулировано и доказано и в общей теории алгоритмов (в инвариантном виде).


Теорема о неразрешимости проблемы остановки (т. е. проблемы распознавания применимости алгоритма) звучит так. Не существует алгоритма, который по номеру [math]x[/math] любого алгоритма (в произвольной, но фиксированной нумерации) и исходным данным у определял бы, остановится алгоритм при этих данных или нет; иначе говоря, не существует алгоритма [math]B(x,y)[/math], такого, что для любого алгоритма [math]A_x[/math] (с номером [math]\varphi^{-1}(A)=x[/math])


[math]B(x,y)= \begin{cases} 1,&\text{esli}~ A_x(y)~ \text{opredelena},\\ 0,&\text{esli}~ A_x(y)~ \text{neopredelena}. \end{cases}[/math]

Теорему об алгоритмической неразрешимости проблемы самоприменимости алгоритмов можно сформулировать так. Не существует алгоритма [math]B_1(x)[/math] такого, что для любого алгоритма [math]A_x[/math]


[math]B_1(x)= \begin{cases} 1,&\text{esli}~ A_x(x)~ \text{opredelena},\\ 0,&\text{esli}~ A_x(x)~ \text{neopredelena}. \end{cases}[/math]

Рассмотрим еще одну алгоритмическую проблему об алгоритмах и докажем ее неразрешимость. Это проблема определения обще-рекурсшности алгоритмов (и функции), т.е. проблема определения того, ко всяким ли допустимым начальным данным применим алгоритм. Прежде докажем лемму.


Лемма 36.5. Для любого перечисления любого множества [math]\Phi[/math] всюду определенных вычислимых (т. е. общерекурсивных) функций существует общерекурсивная функция, не входящая в это перечисление.


Доказательство. Пусть [math]\psi[/math] — перечисление множества [math]\Phi[/math], порождающее последовательность [math]A_0,A_1,A_2,\ldots[/math] всюду определенных вычислимых функций. Введем функцию [math]B(x)= A_x(x)+1[/math]. Так как [math]A_x[/math] общерекурсивна, то и [math]B(x)[/math] общерекурсивна. Если предположить, что [math]B\in\Phi[/math], то [math]B[/math] имеет некоторый номер [math]x_0[/math] и, следовательно, [math]B(x)= A_{x_0}(x)[/math]. Тогда в точке [math]x=x_0[/math] по определению [math]B(x_0)= A_{x_0}(x_0)+1[/math], а в силу последнего соотношения имеем [math]B(x_0)= A_{x_0}(x_0)[/math]. Получаем противоречие, из которого следует, что [math]B[/math] не входит в перечисление, порождаемое [math]\psi[/math].


(Заметим, что если бы в перечислении допускались частичные функции, то такое определение функции [math]B[/math] не привело бы к Противоречию, а означало бы лишь, что [math]B[/math] не определена в точке [math]x_0[/math]).


Теорема 36.6. Проблема определения общерекурсивности алгоритмов неразрешима, т. е. не существует алгоритма [math]B(x)[/math], такого, что для любого алгоритма [math]A_x[/math]


[math]B(x)= \begin{cases}1,& \text{esli}~ A_x~ \text{vsudu opredelen},\\ 0,& \text{esli}~ A_x~ \text{ne vsudu opredelen}. \end{cases}[/math]

Доказательство. Допустим противное, т. е. такой алгоритм [math]B(x)[/math] существует. Тогда он определяет общерекурсивную функцию [math]f(x)[/math]. Определим функцию [math]g(x)[/math] следующим образом:


[math]\begin{gathered}g(0)= \mu y[f(y)=1];\\ g(x+1)= \mu y[y>g(x)\land f(y)=1]. \end{gathered}[/math]

Так как номеров всюду определенных функций (и, следовательно, точек [math]y[/math], в которых [math]f(y)=1[/math]) бесконечное множество, то функция [math]g(x)[/math] всюду определена. Ясно, что функция [math]g(x)[/math] принимает значение 1 на каждой всюду определенной вычислимой (т.е. общерекурсивной) функции, т.е. является перечислением множества всех общерекурсивных функций. Но, на основании предыдущей леммы, такого перечисления не существует. Противоречие. Следовательно, не существует и алгоритма [math]B(x)[/math], определенного в условии теоремы, т.е. проблема определения общерекурсивности алгоритмов неразрешима.


Раз нельзя указать единого алгоритма, отличающего всюду определенные вычислимые (т. е. общерекурсивные) функции от частично рекурсивных, попытаемся подойти к проблеме частично рекурсивных функций с другой стороны. Может быть, возможно каждую частично рекурсивную функцию доопределить на неопределимых точках так, чтобы получилась рекурсивная (т. е. общерекурсивная) функция. Оказывается, и эта задача неразрешима, что следует из теоремы, приведенной ниже.


Теорема 36.7. Существует такая частично рекурсивная функция [math]f[/math], что никакая общерекурсивная функция [math]g[/math] не является ее доопределением.


Доказательство. Как и прежде, считаем, что выбрана некоторая вычислимая нумерация [math]\varphi\colon N\to Al^{\ast}[/math] и для каждого алгоритма [math]A_x[/math] значение [math]\varphi^{-1}(A_x)=x[/math] — его номер в этой нумерации. Рассмотрим следующую частичную функцию:


[math]f(x)= \begin{cases}A_x(x)+1,~~ \text{esli}~ A_x~ \text{opredelen},\\ \text{ne opredelena},~~\text{esli}~ A_x~ \text{ne opredelen}. \end{cases}[/math]

Ясно, что функция [math]f(x)[/math] вычислима и, значит, частично рекурсивна.


Пусть теперь [math]g(x)[/math] — произвольная общерекурсивная функция и [math]x_g[/math] — ее номер в нумерации [math]\varphi[/math], то есть [math]\varphi^{-1}(g)=x_g[/math]. Так как [math]g[/math] всюду определена, то [math]g(x_g)= A_{x_g}(x_g)[/math] определена и, следовательно, [math]f(x_g)= g(x_g)+1[/math]. Таким образом, для любой общерекурсивной функции [math]g[/math] имеем [math]f(x_g)\ne g(x_g)[/math]. Это и означает, что [math]f\ne g[/math]. Теорема доказана.


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




Теорема Раиса


Эта теорема описывает в рамках общей теории алгоритмов еще один достаточно обширный круг алгоритмически не разрешимых проблем. Рассмотренные ранее подобные проблемы носили довольно экзотический характер: все они были так или иначе связаны с самоприменимостью алгоритма, когда алгоритм работает с собственным описанием (находится значение вычислимой функции [math]f_x[/math] в точке, являющейся ее собственным номером в выбранной нумерации вычислимых функций: [math]f_x(x)[/math]). Теорема Раиса, опираясь на неразрешимость этой проблемы, устанавливает алгоритмическую неразрешимость вообще всякого нетривиального свойства вычислимых функций.


По-прежнему имеется некоторая нумерация алгоритмов [math]\varphi\colon N\to Al^{\ast}[/math], в которой каждый алгоритм [math]A_x[/math] имеет номер [math]\varphi^{-1}(A_x)=x[/math]. Этот же номер имеет и функция [math]f_x[/math], которую вычисляет алгоритм [math]A_x[/math]. (Следует помнить, что одна и та же функция, будучи вычисляема разными алгоритмами, может иметь в данной нумерации много номеров. Но это обстоятельство не влияет на нижеследующую теорему.)


Теорема 36.8 (Райе). Пусть [math]C[/math] — любой непустой собственный класс вычислимых функций от одного аргумента (существуют как функции, принадлежащие [math]C[/math], так и вычислимые функции, не принадлежащие [math]C[/math]). Тогда не существует алгоритма, который бы по номеру [math]x[/math] функции [math]f_x[/math] определял бы, принадлежит [math]f_x[/math] классу [math]C[/math] или нет. Иначе говоря, множество [math]\{x\colon\, f_x\in C\}[/math] неразрешимо.


▼ Доказательство

Допустим противное, т. е. множество [math]\{x\colon\, f_x\in C\}[/math] разрешимо. Тогда оно обладает вычислимой характеристической функцией:


[math]\chi_M(x)= \begin{cases} 1,& \text{esli}~ x\in M,~ \text{to est}~ f_x\in C,\\ 0,& \text{esli}~ x\notin M,~ \text{to est}~ f_x\notin C. \end{cases}[/math]

Пусть [math]f_0[/math] — нигде не определенная функция. Рассмотрим сначала случай, когда [math]f_0\notin C[/math]. Выберем тогда какую-нибудь конкретную вычислимую функцию [math]f_a\in C[/math] и определим функцию [math]F(x,y)\colon[/math]


[math]F(x,y)= \begin{cases}f_a(y),&\text{esli znachenie}~ f_x(x)~ \text{opredeleno},\\ f_0(y),&\text{esli znachenie}~ f_x(x)~ \text{ne opredeleno}. \end{cases}[/math]

Функция [math]F(x,y)[/math] вычислима. Для ее вычисления надо вычислять [math]f_x(x)[/math]: если [math]f_x(x)[/math] определена, то этот процесс когда-нибудь остановится и нужно будет перейти к вычислению [math]f_a(x)[/math]; если же [math]f_x(x)[/math] не определена, то процесс не остановится, что равносильно вычислению функции [math]f_0(y)[/math].


Зафиксируем в функции [math]F(x,y)[/math] аргумент [math]x[/math]. Тогда встанет вычислимой функцией от одного аргумента [math]y[/math]. Номер этой функции в единой нумерации [math]\varphi[/math] вычислимых функций зависит от значения [math]x[/math] т.е. является всюду определенной функцией [math]g(x)[/math]. Ясно, что функция [math]g(x)[/math] вычислима, так как является суперпозицией двух вычислимых функций: [math]g(x)= \varphi^{-1}(F(x,y))[/math]. Таким образом, [math]F(x,y)= f_{g(x)}(y)[/math] и, значит,


[math]f_{g(x)}(y)= \begin{cases} f_a(y),& \text{esli}~ f_x(x)~ \text{opredeleno},\\ f_0(y),& \text{esli}~ f_x(x)~ \text{opredeleno}. \end{cases}[/math]

Отсюда ясно, что [math]f_{g(x)}\in C[/math] тогда и только тогда, когда [math]f_{g(x)}= f_a[/math] (так как [math]f_a\in C[/math]), r.e. [math]f_x(x)[/math] определена. (В случае же, когда [math]f_x(x)[/math] не определена, мы имеем [math]f_{g(x)}= f_0[/math] и, следовательно, [math]f_{g(x)}\notin C[/math], так как [math]f_0\notin C[/math].) Другими словами, [math]g(x)\in M[/math] тогда и только тогда, когда [math]f_x(x)[/math] определена. Это означает, что характеристическая функция [math]\chi_M[/math] на аргументах [math]g(x)[/math] имеет вид:


[math]\chi_M(g(x))= \begin{cases} 1,& \text{esli}~ f_x(x)~ \text{opredeleno},\\ 0,& \text{esli}~ f_x(x)~ \text{opredeleno}. \end{cases}[/math]

Последнее означает следующее. Поскольку функции [math]\chi_M[/math] и [math]g[/math] вычислимы, то мы для каждого номера [math]x[/math] можем выяснить, определено значение [math]f_x(x)[/math] или нет. Это, в свою очередь, означает, что построена разрешающая функция [math]\chi_M\circ g[/math] для проблемы самоприменимости алгоритма, что невозможно.


Если рассмотреть случай, когда [math]f_0\in C[/math], то нужно выбрать [math]f_a\notin C[/math]. Проведя аналогичные рассуждения, придем к следующей разрешающей функции для проблемы самоприменимости [math]1-\chi_M(g(x))[/math], что также противоречит доказанной ранее неразрешимости этой алгоритмической проблемы. Теорема доказана.


Теорема Раиса означает, что не существует единого алгоритма, который для каждой вычислимой функции (по ее номеру) определял бы, обладает эта функция тем или иным свойством или нет, например, является ли эта функция постоянной, монотонной, периодической, ограниченной и т. п. Но это лишь первое приближение к пониманию смысла этой теоремы. Дело в том, что мы пытаемся создать единый алгоритм, который имеет дело с функциями. Но что значит иметь дело с функцией? Функция должна быть как-то задана. В данном случае функция [math]f_x[/math] задается вычисляющим ее алгоритмом [math]A_x[/math] (мы помним, что каждая функция может вычисляться множеством алгоритмов). Разыскиваемый нами единый алгоритм как раз и имеет дело с алгоритмами, вычисляющими функции. Так вот, смысл теоремы Раиса состоит в том, что по описанию алгоритма, вычисляющего функцию, ничего нельзя узнать о свойствах функции, которую он вычисляет. Еще раз подчеркнем — не существует единого алгоритма, применимого к описаниям всех вычисляющих алгоритмов.


В частности, оказывается неразрешимой проблема эквивалентности алгоритмов (упоминавшаяся нами ранее): по двум заданным алгоритмам нельзя узнать, вычисляют они одну и ту же функцию или нет.


Каждый, кто имел дело с программированием (написанием компьютерных программ), знает, что по тексту сколько-нибудь сложной программы, не запуская ее в работу, трудно понять, что она делает (какую функцию вычисляет). Если это понимание и приходит, то каждый раз по-своему; единого метода здесь не существует. Это своего рода практическое проявление теоремы Раиса.


Мы уже обсуждали проблемы синтаксиса и семантики языка при рассмотрении формальных теорий. В теории алгоритмов появляется еще один аспект этой проблемы. Синтаксические свойства алгоритма — это свойства описывающих его текстов, т.е. свойства конечных слов в фиксированном алфавите. Семантические (или смысловые) свойства алгоритма связаны с тем, что он делает. Хорошо известно, что в процессе отладки программ синтаксические ошибки отыскиваются довольно легко (этому, в частности, способствуют и дополнительные программы-алгоритмы). Главные неприятности связаны именно с анализом семантики неотлаженной программы, т.е. с попытками установить, что же она делает вместо того, чтобы делать то, что мы хотим (и здесь нам уже никакие дополнительные программы помочь не могут). Образно выражаясь, можно сказать, что теорема Раиса звучит так: по синтаксису алгоритма ничего нельзя узнать о его семантике.




Другие примеры алгоритмической неразрешимости


Ранее отмечалось, что не существует алгоритма, позволяющего для каждой формулы логики предикатов определить, будет ли формула выполнимой или общезначимой. Это означает, что массовые проблемы разрешения для общезначимости и выполнимости формул логики предикатов алгоритмически не разрешимы.


Одной из наиболее знаменитых алгоритмических проблем математики являлась 10-я проблема Гильберта, поставленная им в числе других в 1901 г. на Международном математическом конгрессе в Париже. Требовалось найти алгоритм, определяющий для любого диафантова уравнения, имеет ли оно целочисленное решение. Диафантово уравнение есть уравнение вида [math]F(x,y,\ldots, z)=0[/math], где [math]F(x,y,\ldots, z)[/math] — многочлен с целыми показателями степеней и с Целыми коэффициентами. В общем случае эта проблема долго Оставалась нерешенной, и только в 1970 г. советский математик Ю. В. Матиясевич доказал ее неразрешимость.


Существует множество и других алгоритмических проблем, относительно которых установлена их неразрешимость. Среди них ряд алгебраических проблем, приводящих к различным вариантам проблемы слов, которые исследовались советскими математиками А.А.Марковым, П.С.Новиковым, А.И.Мальцевым.


В заключение еще раз отметим, что алгоритмическая неразрешимость означает лишь отсутствие единого способа для решения всех единичных задач данной бесконечной серии, в то время как каждая индивидуальная задача серии вполне может быть решена своим индивидуальным способом. Более того, может оказаться разрешимой (своим индивидуальным методом) не только каждая отдельная задача этого класса, но и целые подклассы задач этого класса. Поэтому, если проблема неразрешима в общем случае, нужно искать ее разрешимые частные случаи. Задача в более общей постановке имеет больше шансов оказаться неразрешимой.


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


[math]a_nx^n+ a_{n-1}x^{n-1}+ \ldots+ a_1x+a_0=0[/math]

хорошо известно, что все его целые корни следует искать среди делителей свободного члена [math]a_0[/math].


В то же время понимание сути проблемы алгоритмической неразрешимости и знание основных алгоритмических неразрешимостей является одним из важных элементов современной математической и логической культуры, особенно для тех, кто имеет профессиональные дела, связанные с компьютерами, программированием и информатикой.


Часовой пояс: UTC + 4 часа [ Летнее время ]


Яндекс.Метрика

Copyright © 2010-2016 MathHelpPlanet.com. All rights reserved