Глава 8. Приложения теории алгоритмов к разрешимости некоторых проблем.

  1. Теорема Райса.

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

Теорема 1 (теорема Райса). Никакое нетривиальное свойство вычислимой функции не является алгоритмически разрешимым.

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

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

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

Пусть нигде не определенная функция . Выберем какую-нибудь конкретную вычислимую функциюи определим функцию:

Функция вычислима: для ее вычисления необходимо вычислять. Еслиопределена, то этот процесс когда-нибудь остановится и тогда надо перейти к вычислению, если жене определена, то процесс не остановится, что равносильно вычислению нигде не определенной функции.

Если в функциизафиксировать, тостанет вычислимой функцией одной переменной. Номер этой функции зависит от значения, т.е. является всюду определенной функцией. Нетрудно показать, чтовычислима. Итак,

Следовательно, , если и только еслиопределена (так как, а).

Отсюда

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

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

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

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

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

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

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

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

Несколько раз повторенное выражение "ничего нельзя узнать" — это, строго говоря, преувеличение. Eгo точный эквивалент — "не существует единого алгоритма, позволяющего узнать". К тому же речь идет, о невозможности распознавания свойств вычисляемых функций, записанных в универсальном алгоритмическом языке (язык машин Тьюринга и др.). Свойства подклассов вычислимых функций, описанных в специальных языках, вполне могут оказаться разрешимыми.

До сих пор речь шла о неразрешимых проблемах внутри самой теории алгоритмов.

Во-первых, если проблема неразрешима, надо искать ее разрешимые частные случаи. Во-вторых, появление неразрешимости — это, как правило, результат чрезмерно общей задачи (или языка, на котором написаны объекты задачи). Задача в более общей постановке имеет больше шансов оказаться неразрешимой.