Опубликован: 16.03.2007 | Уровень: профессионал | Доступ: платный
Лекция 1:

Вычислимость, разрешимость и перечислимость

Лекция 1: 12 || Лекция 2 >
Аннотация: Посвящена основным понятиям теории вычислимых функции и перечислимых множеств: вычислимость, разрешимость, перечислимость, а также некоторым критериям выполнения этих условий.

Вычислимые функции

Функция f с натуральными аргументами и значениями называется вычислимой, если существует алгоритм, ее вычисляющий, то есть такой алгоритм A, что

  • если f(n) определено для некоторого натурального n, то алгоритм A останавливается на входе n и печатает f(n) ;
  • если f(n) не определено, то алгоритм A не останавливается на входе n.

Несколько замечаний по поводу этого определения:

  1. Понятие вычислимости определяется здесь для частичных функций (областью определения которых является некоторое подмножество натурального ряда). Например, нигде не определенная функция вычислима (в качестве A надо взять программу, которая всегда зацикливается).
  2. Можно было бы изменить определение, сказав так: " если f(n) не определено, то либо алгоритм A не останавливается, либо останавливается, но ничего не печатает ". На самом деле от этого ничего бы не изменилось (вместо того, чтобы останавливаться, ничего не напечатав, алгоритм может зацикливаться).
  3. Входами и выходами алгоритмов могут быть не только натуральные числа, но и двоичные строки (слова в алфавите {0,1} ), пары натуральных чисел, конечные последовательности слов и вообще любые, как говорят, " конструктивные объекты ". Поэтому аналогичным образом можно определить понятие, скажем, вычислимой функции с двумя натуральными аргументами, значениями которой являются рациональные числа.

    Для функций, скажем, с действительными аргументами и значениями понятие вычислимости требует специального определения. Здесь ситуация сложнее, определения могут быть разными, и мы о вычислимости таких функций говорить не будем. Отметим только, что, например, синус (при разумном определении вычислимости) вычислим, а функция sign(x), равная -1, 0 и 1 при x < 0, x = 0 и x > 0 соответственно - нет. Точно так же требует специального определения вычислимость функций, аргументами которых являются бесконечные последовательности нулей и единиц и т.п.

  4. Несколько десятилетий назад понятие алгоритма требовало специального разъяснения. Сейчас (" компьютерная грамотность "?) такие объяснения все равно никто читать не будет, поскольку и так ясно, что такое алгоритм. Но все же надо соблюдать осторожность, чтобы не принять за алгоритм то, что им не является. Вот пример неверного рассуждения:

    " Докажем", что всякая вычислимая функция f с натуральными аргументами и значениями может быть продолжена до всюду определенной вычислимой функции g: N -> N . В самом деле, если f вычисляется алгоритмом A, то следующий алгоритм B вычисляет функцию g, продолжающую f: " если A останавливается на n, то B дает тот же результат, что и A ; если A не останавливается на n, то B дает результат (скажем) 0 ". (В чем ошибка в этом рассуждении?)

Разрешимые множества

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

Другими словами, X разрешимо, если его характеристическая функция \chi (n) = (if n \in  X then 1 else 0 fi) вычислима.

Очевидно, пересечение, объединение и разность разрешимых множеств разрешимы. Любое конечное множество разрешимо.

Аналогично определяют разрешимость множеств пар натуральных чисел, множеств рациональных чисел и т.п.

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

    Отметим тонкий момент: можно доказать разрешимость множества неконструктивно, не предъявляя алгоритма. Вот традиционный пример: множество тех n, для которых в числе \pi есть не менее n девяток подряд, разрешимо. В самом деле, это множество содержит либо все натуральные числа, либо все натуральные числа вплоть до некоторого. В обоих случаях оно разрешимо. Тем не менее мы так и не предъявили алгоритма, который по n узнавал бы, есть ли в \pi не менее n девяток подряд.

  3. Использованы ли в этом рассуждении какие-то свойства числа \pi? Что изменится, если заменить слова " не менее n девяток" на " ровно n девяток (окруженных не-девятками)"?

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

Перечислимые множества

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

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

Существует много эквивалентных определений перечислимого множества. Вот некоторые из них:

  1. Множество перечислимо, если оно есть область определения вычислимой функции.
  2. Множество перечислимо, если оно есть область значений вычислимой функции.
  3. Множество X перечислимо, если его (как иногда говорят) " полухарактеристическая " функция, равная 0 на элементах X и не определенная вне X, вычислима.

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

Пусть X перечисляется некоторым алгоритмом A. Покажем, что полухарактеристическая функция множества X вычислима. В самом деле, алгоритм ее вычисления таков: получив на вход число n, пошагово выполнять алгоритм A, ожидая, пока он напечатает число n. Как только он это сделает, выдать на выход 0 и закончить работу.

Наоборот, пусть X есть область определения (вычислимой) функции f, вычисляемой некоторым алгоритмом B. Тогда X перечисляется таким алгоритмом A:

Параллельно запускать B на входах 0,1,2,..., делая все больше шагов работы алгоритма B (сначала один шаг работы на входах 0 и 1 ; потом по два шага работы на входах 0,1,2, потом по три на входах 0,1,2,3 и так далее). Все аргументы, на которых алгоритм B заканчивает работу, печатать по мере обнаружения.

Итак, мы установили эквивалентность исходного определения определениям 1 и 3 . Если в только что приведенном описании алгоритма A печатать не аргументы, на которых B заканчивает работу, а результаты этой работы, то получается алгоритм, перечисляющий область значений функции f. Осталось еще убедиться, что всякое перечислимое множество есть область значений вычислимой функции. Это можно сделать, например, так: пусть X есть область определения вычислимой функции, вычисляемой некоторым алгоритмом A. Тогда X есть область значений функции

b(x)=\left\{
        \begin{aligned}
           & x,\ \text{если $A$ заканчивает работу на $x$},\\
           & \text{не определено в противном случае}.
        \end{aligned}
     \right.

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

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

В самом деле, пусть перечислимое множество X, перечисляемое алгоритмом A, непусто. Возьмем в нем какой-то элемент x0. Теперь рассмотрим такую всюду определенную функцию a: если на nшаге работы алгоритма A появляется число t, то положим a(n)=t ; если же ничего не появляется, то положим a(n)=x0. (Мы предполагаем, что на данном шаге работы алгоритма может появиться только одно число в противном случае работу надо разбить на более мелкие шаги.)

Заметим, что это рассуждение неконструктивно имея алгоритм A, мы можем не знать, пусто ли перечисляемое им множество или нет.

Теорема 1. Пересечение и объединение перечислимых множеств перечислимы.

Если X и Y перечисляются алгоритмами A и B, то их объединение перечисляется алгоритмом, который параллельно выполняет по шагам A и B и печатает все, что печатают A и B. С пересечением немного сложнее результаты работы A и B надо накапливать и сверять друг с другом; что появится общего печатать.

  4. Проведите это рассуждение, используя какое-либо другое эквивалентное определение перечислимости.

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

  5. Иногда говорят о так называемых " недетерминированных алгоритмах " (оксюморон, но распространенный) такой алгоритм включает в себя команды типа

n := произвольное натуральное число

(достаточно, впрочем, команды " n := 0 или 1 ", так как произвольное число можно формировать по битам). Недетерминированный алгоритм (при одном и том же входе) может действовать по-разному, в зависимости от того, какие " произвольные " числа будут выбраны. Докажите, что перечислимое множество можно эквивалентно определить как множество чисел, которые могут появиться на выходе недетерминированного алгоритма (при фиксированном входе).

  6. Докажите, что если множества A \subset  N и B \subset  N перечислимы, то их декартово произведение A x B \subset  N x N также перечислимо.

Лекция 1: 12 || Лекция 2 >
Жансерик Амзеев
Жансерик Амзеев
Казахстан, Алматы
Виталий Федоров
Виталий Федоров
Россия, Ярославская область