Разрешимые и перечислимые множества Всякое математическое утверждение можно свести к утверждению о множествах. В этом параграфе мы определим, что такое эффективный способ задания множества, что позволит формулировать утверждения о существовании или отсутствии алгоритмов решения математических проблем на универсальном языке множеств. Слово "алгоритм"далее мы понимаем в смысле любой точной модели. Как и ранее, понятие "вычислимая функция"мы употребляем как синоним понятия "частично рекурсивная функция". Определение. Множество X ⊆ N называется разрешимым (рекурсивным), если существует алгоритм, который по любому натуральному числу x определяет, принадлежит оно множеству X или нет. Характеристической функцией χX множества X называется функция 1, если x ∈ X; χX (x) = 0, в противном случае. Т.о., множество разрешимо, если его характеристическая функция общерекурсивна. Упражнение. Показать, что объединение и пересечение конечного числа разрешимых множеств, а также разность разрешимых множеств разрешимы. Любое конечное множество разрешимо. Замечание. Существуют неразрешимые множества. Это следует из того, что алгоритмов счетное множество, а подмножеств натурального ряда несчетное множество. Определение. Множество X ⊆ N называется перечислимым (рекурсивноперечислимым), если существует алгоритм, перечисляющий все элементы данного множества и только их. Существует несколько эквивалентных определений перечислсмого множества. 1) Множество X ⊆ N перечислимо, если оно есть область определения частично рекурсивной функции. 2) Множество X ⊆ N перечислимо, если оно есть множество значений частично рекурсивной функции. 3) Множество X ⊆ N перечислимо, если его полухарактеристическая функция 0, если x ∈ X; 0 χX (x) = не определена в противном случае частично рекурсивна. 4) Множество X ⊆ N перечислимо, если оно либо пусто, либо есть множество значений общерекурсивной функции. Доказательство эквивалентности определений. Очевидны эквивалентность 2)⇔исходное определение и следования 4)⇒2), 3)⇒1). Если X – область определения частично рекурсивной функции f (x), то χ0X (x) = Z(f (x)). Отсюда получаем 1)⇒3). Пусть X перечислимо в смысле 4). Если X пусто, то оно является областью определения нигде не определенной функции, которая частично рекурсивна (доказать!). В противном случае X = E(f ) для некоторой общерекурсивной функции f . Но тогда функция g(x, y) = f (x) − y частично рекурсивна и X является областью определения частично рекурсивной функции µx(g(x, y) = 0). Таким образом, 4)⇒1). 1 2 Докажем 2)⇒4). Пусть X – множество значений частично рекурсивной функции g, и пусть X 6= ∅. Существует машина Тьюринга Tg , вычисляющая значения данной функции. Зафиксируем элемент x0 ∈ X. Определим функцию g(x), если машина Tg останавливается на входе x не более чем через y шагов; h(x, y) = x0 в противном случае. Эта функция всюду определена и вычислима, а значит, общерекурсивна по тезису Черча. Тогда общерекурсивна и функция f (z) = h(l(z), r(z)), множество значений которой совпадает с X. (Здесь l(z) и r(z) - функции, которые восстанавливают по номеру z пары (x, y) в канторовской нумерации соответственно первую и вторую компоненты. Эти функции примитивно-рекурсивны.) Пусть X = D(f ) для некоторой частично рекурсивной функции f . Для доказательства 1)⇒2) рассмотрим функцию h(x) = x + Z(f (x)). Она определена на том же множестве, что и f , и ее множество значений совпадает с X. C Замечание 1. Имеется и еще одно, более сильное определение перечислимого множества: множество X ⊆ N перечислимо, если оно либо пусто, либо есть множество значений примитивно-рекурсивной функции. Замечание 2. Понятия разрешимости и перечислимости можно распространить и на множества произвольной природы. В таком случае назовем множество X разрешимым (перечислимым), если разрешимо (перечислимо) множество номеров его элементов в некоторой вычислимой нумерации. Следующая теорема показывает, как связаны разрешимые и перечислимые множества. Теорема (Пост). Множество X разрешимо тогда и только тогда, когда оно и его дополнение до множества N перечислимы. Доказательство. Неформальное, опирающееся на тезис Черча рассуждение таково. Пусть X разрешимо и задается некоторым алгоритмом A. Тогда по очереди проверяем принадлежность чисел 0, 1, 2,.. данному множеству и печатаем те, которые принадлежат X, и те, которые не принадлежат X. Обратно, если X и его дополнение перечислимы, то надо запустить оба перечисляющих алгоритма и ждать, который из них напечатает x ∈ X. Более формально: пусть X разрешимо и χX - его характеристическая функция. Тогда функция χ0X = χX − 1 определена и равна 0 в точности на элементах из X, следовательно, X перечислимо. В качестве полухарактеристической функции множества N \ X можно взять χ0N\X = χX + (0 − χX ). Пусть X и N \ X перечислимы. Если X = ∅ или X = N, то X разрешимо. Пусть X & N. Тогда по определению 4) сушествуют такие общерекурсивные функции f1 и f2 , что X = E(f1 ), N \ X = E(f2 ). Положим g(z) = g(c(t, y)) = f1 (y)r(t, 2) + f2 (y)sg(r(t, 2)), т.е. значение функции g в точке z0 = c(t0 , y0 ) совпадает со значением функции f1 в точке y0 , если t0 – нечетное, и со значением f2 в точке y0 , если t0 четное. Функция g общерекурсивна. В качестве χX можно взять χX (x) = l(µz(|g(z) − x| = 0)). Поскольку мы выбираем наименьшее значение z, такое, что |g(z) − x| = 0, то χX принимает только значения 0 или 1. При этом она всюду определена, а значит, общерекурсивна. C Из приведенных выше определений и теоремы мы видим, что перечислимость является более слабым вариантом эффективности, чем разрешимость. Для перечислимого множества хотя и имеется порождающий его алгоритм, но попытка выяснить, принадлежит ли некоторый элемент указанному множеству, может окончиться неудачей, если алгоритм не выдаст искомый элемент достаточно быстро. 3 График вычислимой функции В этом параграфе мы покажем связь введенного выше понятия перечислимого множества и понятия вычислимой функции. Определение. Графиком функции f (x1 , .., xk ) называется множество Γf = {(x1 , .., xn , f (x1 , .., xk )) | (x1 , .., xk ) ∈ D(f )} ⊆ Nk+1 . Теорема. Функция f : N → N вычислима тогда и только тогда, когда ее график является перечислимым множеством. Доказательство. Для простоты ограничимся неформальным рассуждением. Пусть f вычислима. Тогда существует алгоритм, перечисляющий ее область определения. Вычислим для каждого x из области определения значение f (x) и получим алгоритм, перечисляющий Γf . Обратно, если имеется алгоритм, перечисляющий Γf , то f вычисляется следующим алгоритмом: имея на входе x, ждем появления пары, первый член которой равен x, и печатаем ее второй член. Точное доказательство теоремы проводится по плану: – доказать, что графики исходных функций перечислимы; – доказать, что если функция f получена из функций, графики которых перечислимы, по правилу подстановки, рекурсии или применением µ-оператора, то график f перечислим. Обратно, если Γf перечислимо, то по определению существует такая общерекурсивная функция G двух переменных, что Γf = D(G). Но тогда f (x) = µy(Z(G(x, y)) = 0), откуда получаем, что f частично рекурсивна. C Перечислимое неразрешимое множество Далее везде считаем, что зафиксирована некоторая вычислимая нумерация вычислимых функций. Теорема. Существует перечислимое неразрешимое множество. Доказательство. Рассмотрим вычислимую функцию f (x), не имеющую всюду определенного вычислимого продолжения (см. теорему 4 параграфа "Универсальные функции"). Ее область определения D(f ) и будет искомым множеством. В самом деле, D(f ) перечислимо по определению. По определению f ее область определения совпадает с множеством тех x, при которых универсальная функция U (x, x) определена. По конструкции U это множество есть множество самоприменимых программ. Если бы D(f ) было разрешимо, то оказалась бы разрешимой проблема самоприменимости. C Теорема Райса Выше мы доказали, что невозможно построить алгоритм, который по номеру n вычислимой функции f позволял бы определить, содержится n в D(f ) или нет. Оказывается, не только это свойство вычислимых функций оказывается алгоритмически неразрешимым. По номеру функции также нельзя узнать, например, будет ли она постоянной, периодической, ограниченной и т.д. А именно, имеет место следующая Теорема (Райс). Никакое нетривиальное свойство вычислимых функций не является алгоритмически разрешимым. Переформулировка. Пусть C – произвольный непустой класс вычислимых функций одной переменной, не совпадающий с классом всех вычислимых функций одной переменной. Тогда не существует алгоритма, который бы по номеру n функции fn определял, принадлежит fn классу C или нет. 4 Доказательство. Предположим, что множество M = {n | fn ∈ C} разрешимо, и пусть χM – его характеристическая функция. Если нигде не определенная функция f0 не лежит в C, то выберем какую-либо вычислимую функцию fa в C и зададим функцию F двух переменных следующим образом: fa (y), если fn (n) определено; F (n, y) = f0 (y), если fn (n) не определено. Как нетрудно видеть, F вычислима. Если в F (n, y) зафиксировать n, то получим функцию от y. Номер этой функции зависит от значения n, т.е. является всюду определенной функцией g(n). g(n) вычислима: применить алгоритм для fn к n, если он остановится, то g(n) = a. Таким образом, fa (y), если fn (n) определено; fg(n) (y) = f0 (y), если fn (n) не определено. Следовательно, fg(n) лежит во множестве C (т.е. g(n) лежит во множестве M ) тогда и только тогда, когда fn (n) определено. Рассмотрим функцию 1, если fn (n) определено; χM (g(n)) = 0, если fn (n) не определено. Поскольку по предположению множество M разрешимо, то мы получили разрешающую функцию для проблемы самоприменимости. Противоречие. Для случая f0 ∈ C выбираем fa , не лежащую в C; далее рассуждения аналогичны. C Не противоречит ли теорема Райса тому факту, что по номеру машины Тьюринга мы всегда можем узнать, например, содержит ее программа более 10 команд или нет? Чтобы разобраться в смысле теоремы. нужно вспомнить. что номер вычислимой функции f – это номер программы, вычисляющей f . По этому номеру однозначно восстанавливается программа, и разные номера соответствуют разным программам. Для функций это неверно: разные номера могут соответствовать одной и той же функции. Смысл теоремы Райса заключается в том, что невозможно составить алгоритм, по описанию программы выясняющий свойства функции, которую данная программа вычисляет. Действительно, на практике по тексту достаточно сложной программы трудно понять, что она делает, не запуская ее в работу и не имея гипотезы о том, что она должна делать. В частности, оказывается неразрешима проблема эквивалентности алгоритмов: составить алгоритм, который позволяет по двум данным алгоритмам узнать, вычисляют они одну и ту же функцию или нет.