
- •Основы теории алгоритмов и нумераций
- •Оглавление
- •Введение*
- •Глава 1. Рекурсивные и примитивно-рекурсивные функции
- •Обозначения
- •Примитивно рекурсивные функции
- •Примеры
- •Функции Аккермана
- •Примеры
- •Общерекурсивные и частично рекурсивные функции
- •Глава 2. Машины тьюринга
- •Определения
- •Табличноеиграфическоезадания машинТьюринга
- •Графическое представление
- •Табличное значение машины
- •Некоторые операции над машинами Тьюринга
- •Композиция машин Тьюринга
- •Разветвление машин Тьюринга
- •Универсальная машина Тьюринга
- •Тезис Черча. Связь рекурсивных функций с машинами Тьюринга
- •Примеры
- •Глава 3. Вычислимость и разрешимость
- •Обсуждение
- •Нумерации алгоритмов
- •Некоторые теоремы в теории алгоритмов.
- •Глава 4. Рекурсивные и рекурсивно перечислимые множества.
- •Характеристические функции множеств.
- •Рекурсивные и примитивно рекурсивные множества.
- •Рекурсивно перечислимые множества.
- •Основная теорема.
- •Примеры.
- •Глава 5. Основные нумерации в теории алгоритмов
- •Нумерация пар и-ок чисел.
- •Кодирование всех-ок.
- •Нумерация конечных множеств.
- •Нумерации Клини и Поста.
- •Нумерация семейства всех двухэлементных множеств.
- •Глава 6. Степени неразрешимости.
- •- Сводимость.
- •- Степени.
- •Теорема о редукции.
- •Примеры.
- •Глава 7. Нумерованные совокупности.
- •Нумерации множества.
- •Некоторые теоремы о нумерациях множеств
- •Глава 8. Приложения теории алгоритмов к разрешимости некоторых проблем.
- •Теорема Райса.
- •Разрешимость проблем распознавания и классификации.
- •Литература
- •Основы теории алгоритмов и нумераций.
Глава 8. Приложения теории алгоритмов к разрешимости некоторых проблем.
Теорема Райса.
Просматривая накопленный запас алгоритмически неразрешимых проблем, нетрудно заметить, что почти все они так или иначе связаны с самоприменимостью - довольно экзотической ситуацией, когда алгоритм работает с собственным описанием. Можно решить, что поскольку понятие самоприменимости далеко от алгоритмической практики, то неразрешимость в этой практике также никогда не встретится. Однако это не так.
Теорема 1 (теорема Райса). Никакое нетривиальное свойство вычислимой функции не является алгоритмически разрешимым.
Для доказательства
эту теорему удобнее сформулировать в
менее эффективном, но более точном виде.
Пусть
- любой класс вычислимых функций одной
переменной, нетривиальный в том смысле,
что имеются как функции, принадлежащие
,
так и функции, не принадлежащие
.
Тогда теорему представим в следующем
виде.
Не существует
алгоритма, который бы по номеру
функции
определял, принадлежит ли
классу
,
иначе говоря, множество
неразрешимо.
Доказательство.
Предположим, что множество
разрешимо. Тогда оно обладает
общерекурсивной характеристической
функцией:
Пусть нигде не
определенная функция
.
Выберем какую-нибудь конкретную
вычислимую функцию
и определим функцию
:
Функция
вычислима: для ее вычисления необходимо
вычислять
.
Если
определена, то этот процесс когда-нибудь
остановится и тогда надо перейти к
вычислению
,
если же
не определена, то процесс не остановится,
что равносильно вычислению нигде не
определенной функции.
Если в
функциизафиксировать
,
то
станет вычислимой функцией одной
переменной
.
Номер этой функции зависит от значения
,
т.е. является всюду определенной функцией
.
Нетрудно показать, что
вычислима. Итак,
Следовательно,
,
если и только если
определена
(так как
,
а
).
Отсюда
т.е. построена разрешающая функция для проблемы самоприменимости, что невозможно.
Для случая, когда
,
выбираем
.
Последующие рассуждения аналогичны, а
разрешающая функция для проблемы
самоприменимости будет иметь вид:
.
Из теоремы Райса следует, что по номеру вычислимой функции нельзя узнать, является ли эта функция постоянной, периодической, ограниченной, содержит ли она среди своих значений данное число и т.д. Создается впечатление, что вообще ничего нельзя узнать и все на свете неразрешимо.
С другой стороны,
не противоречит ли теореме Райса тот
факт, что по номеру машины
всегда можно узнать, например, содержит
ли она больше десяти команд.
Для того, чтобы
разобраться в смысле теоремы Райса надо
прежде всего вспомнить, что номер
функции
- это номер алгоритма
,
вычисляющего
.
В свою очередь, по номеру алгоритма
однозначно восстанавливается его
описание и разным номерам соответствуют
разные алгоритмы. Для функций это
неверно: при
и
могут быть одной и той же функцией (в ее
классическом смысле).
В теореме Райса
участвуют и алгоритмы, и функции и их
следует четко различать. Класс
– это класс функций, в то же время
означает "функция, вычислимая
алгоритмом
".
Таким образом, смысл теоремы Райса в
том, что по описанию алгоритма ничего
нельзя узнать о свойствах функции,
которую он вычисляет. Количество же
команд – это свойство описания алгоритма,
а не функции и к теореме Райса оно
отношения не имеет.
Опытного программиста теорема Райса не должна удивлять: он знает, что по тексту сколь-нибудь сложной программы, не запуская ее в работу, трудно понять, что она делает (т.е. какую функцию вычисляет), не имея гипотез о том, что она должна делать. Если это понимание и приходит, то каждый раз по-своему; систематического метода здесь не существует. С другой стороны, в этом тексте можно обнаруживать алгоритмическим путем так называемые синтаксические ошибки (что и делают компиляторы с алгоритмических языков), т.е. выявлять те или иные свойства описания алгоритма. Здесь впервые стоит упомянуть (пока неформально), два понятия - синтаксис и семантика. Синтаксические свойства алгоритмов — это свойства описывающих его текстов, т.е. свойства конечных слов в фиксированном алфавите.
Семантические (или смысловые) свойства алгоритмов связаны с тем, что он делает, их естественно описывать в терминах функций и классов эквивалентности функций, вычисляемых алгоритмами. Хорошо известно, что в процессе отладки программ синтаксические ошибки отыскиваются довольно быстро. Все неприятности связаны с анализом семантики неотлаженной программы, т.е. с попытками установить, что же она делает, вместо того чтобы делать задуманное. В несколько вольной и неформальной интерпретации теорема Райса могла бы выглядеть так: "по синтаксису алгоритма ничего нельзя узнать о его семантике".
Несколько раз повторенное выражение "ничего нельзя узнать" — это, строго говоря, преувеличение. Eгo точный эквивалент — "не существует единого алгоритма, позволяющего узнать". К тому же речь идет, о невозможности распознавания свойств вычисляемых функций, записанных в универсальном алгоритмическом языке (язык машин Тьюринга и др.). Свойства подклассов вычислимых функций, описанных в специальных языках, вполне могут оказаться разрешимыми.
До сих пор речь шла о неразрешимых проблемах внутри самой теории алгоритмов.
Во-первых, если проблема неразрешима, надо искать ее разрешимые частные случаи. Во-вторых, появление неразрешимости — это, как правило, результат чрезмерно общей задачи (или языка, на котором написаны объекты задачи). Задача в более общей постановке имеет больше шансов оказаться неразрешимой.