Вычисления с оракулом
Машины с оракулом
Если множество B m -сводится к разрешимому множеству A, то и B разрешимо. Более того, если даже A и неразрешимо, но у нас есть доступ к "оракулу" для A, который отвечает на вопросы о принадлежности чисел множеству A, то мы можем с его помощью отвечать на вопросы о принадлежности чисел множеству B. В самом деле, если f сводящая функция и если мы хотим узнать, принадлежит ли некоторое число x множеству B, достаточно спросить у оракула, принадлежит ли f(x) множеству A.
Легко видеть, что m -сводимость использует возможности оракула довольно ограниченным образом: во-первых, оракулу задается только один вопрос, во-вторых, ответ на этот вопрос и считается ответом на исходный вопрос о принадлежности числа x множеству B. Вот пример, не укладывающийся в такую схему: имея оракул для множества A, мы можем отвечать на вопросы о принадлежности чисел множеству B=N \ A. Здесь вопрос по-прежнему один, но ответ на него заменяется на противоположный. Другой пример: имея оракул для множества A, можно отвечать на вопросы о принадлежности пары натуральных чисел множеству B=A x A. (Здесь оракулу надо задать уже два вопроса.)
Поэтому естественно желание отказаться от этих ограничений и дать общее определение сводимости множества B к множеству A. Наиболее общее и естественное определение таково: B сводится к A, если существует алгоритм, который разрешает множество B при условии, что ему предоставлен доступ к оракулу, отвечающему на вопросы про множество A. В более программистских терминах: есть алгоритм, содержащий вызовы внешней функции a(x:integer):boolean (не описанной внутри алгоритма); этот алгоритм разрешает множество B, если вызовы a(x) возвращают правильные ответы про множество A.
Этот вид сводимости называется сводимостью по Тьюрингу, или T -сводимостью. Обозначение: B <=T A означает, что B сводится по Тьюрингу к A. Вот несколько простых фактов про T -сводимость:
Теорема 43. (а) Если B <=m A, то B <=T A. (б) A <=T N \ A при любом A. (в) Если A <=T B и B <=T C, то A <=T C. (г) Если A <=T B и B разрешимо, то A разрешимо.
Все эти утверждения почти очевидны поясним, например, утверждение (в). Пусть у нас есть алгоритм для A, включающий вызовы внешней разрешающей процедуры для B, а также алгоритм для B, включающий вызовы внешней процедуры для C. Тогда можно заменить вызовы внешней B -процедуры на этот второй алгоритм и получится разрешающий алгоритм для A, использующий вызовы внешней процедуры для C.
Заметим, что (в отличие от m -сводимости) неперечислимое множество вполне может T -сводиться к перечислимому. Например, дополнение перечислимого неразрешимого множества K сводится к самому множеству K.
Можно говорить не только о сводимости к множеству A, но и вообще об алгоритмах, имеющих доступ к оракулу для множества A. Пусть такой алгоритм вычисляет некоторую функцию f. Это означает, напомним, что если f(x) определено, то на входе x алгоритм останавливается и дает ответ f(x), а если f(x) не определено, то не останавливается. (Предполагается, естественно, что оракул " не зависает" и выдает ответы, притом правильные, на все заданные ему вопросы.) В этом случае говорят, что (частичная) функция f вычислима относительно множества A.
В нашем определении сводимости вызываемая внешняя функция принимала только два значения (" да" и " нет"). Такое ограничение вовсе не обязательно. Пусть произвольная всюду определенная функция. Тогда можно говорить о функциях, вычислимых относительно ; вычисляющие их алгоритмы включают в себя вызовы функции Однако это обобщение не является существенным:
Теорема 44. Частичная функция f вычислима относительно всюду определенной функции тогда и только тогда, когда она вычислима относительно множества, являющегося графиком функции то есть относительно множества .
В самом деле, если мы можем вызывать функцию то можем и отвечать на вопросы о принадлежности произвольной пары графику функции Напротив, если мы можем разрешать график то можем найти для данного x, задавая по очереди вопросы о принадлежности графику пар , пока не получим положительный ответ.
Определяя вычислимость относительно функции мы предполагали, что всюду определена. Это ограничение принципиально: для не всюду определенных функций механизм обращения к ним (как к внешним процедурам) требует уточнений. Допустим, мы вызвали , а оказалось, что функция не определена на x. Означает ли это, что алгоритм " зависает" и уже не может выдать результат? Или мы можем параллельно развернуть какие-то вычисления и в каких-то случаях выдать результат, не дожидаясь ответа от ? Можем ли мы параллельно запросить несколько значений функции Скажем, является ли функция f(x), заданная формулой
вычислимой относительно Короче говоря, в отличие от случая всюду определенных функций, тут есть разные (и притом не эквивалентные) варианты определений, и всегда надо уточнять, какое именно понятие имеется в виду. Поэтому мы, говоря о вычислимости относительно некоторой функции предполагаем, что функция всюду определена.
59. Пусть есть два различных множества X и Y. Будем рассматривать программы, имеющие доступ к двум оракулам для X и для Y, и функции, которые можно вычислить с помощью таких программ. Покажите, что это определение не дает ничего существенно нового, указав такое множество Z, что X - Y -вычислимость совпадает с Z -вычислимостью.
Эквивалентное описание
Сейчас мы дадим эквивалентное определение вычислимости функции относительно не апеллирующее к программам с вызовом оракула.
Мы называли образцом функцию с натуральными аргументами и значениями, определенную на конечном подмножестве натурального ряда. Такой образец задается списком пар ; образцы можно вычислимо пронумеровать, после чего не различать образец и его номер и говорить о разрешимом множестве образцов, перечислимом множестве образцов и т.д.
Два образца называются совместными, если объединение их графиков есть по-прежнему график функции, то есть если нет такой точки, в которой оба они были бы определены и принимали разные значения.
Пусть имеется множество M троек вида , где x и y натуральные числа, а t образец. Будем говорить, что две тройки и противоречат друг другу, если x1=x2, , а образцы t1 и t2 совместны. Множество M будем называть корректным, если в нем нет противоречащих друг другу троек.
Пусть M корректное множество, а некоторая функция. Отберем в M все тройки вида , для которых t является частью (график t является подмножеством графика ). Входящие в них образцы совместны, поэтому (в силу корректности) среди отобранных троек нет двух, у которых первые члены равны, а вторые нет. Значит, отбросив третьи компоненты в отобранных тройках, мы получим график некоторой функции (вообще говоря, частичной). Будем обозначать эту функцию .
Теорема 45. Частичная функция f : N -> N вычислима относительно всюду определенной функции тогда и только тогда, когда существует перечислимое корректное множество троек M, для которого .
Пусть имеется программа p, вычисляющая f и включающая в себя обращения к внешней процедуре Будем для всех натуральных n моделировать работу этой программы на входе n по всем путям, то есть предусматривая все возможные значения для каждого обращения к внешней процедуре. Для каждого n получается дерево вариантов каждому обращению к внешней процедуре соответствует развилка со счетным ветвлением. На некоторых ветвях этого дерева вычисления завершаются и программа выдает ответ. Как только мы обнаруживаем, что на входе x возможен ответ y (на некоторой ветви), мы образуем тройку , где t образец, содержащий все аргументы и значения функции использованные на этой ветви.
Полученное множество троек, которое мы обозначим M, будет перечислимым (описанная процедура позволяет выписывать все его элементы). В этом множестве нет противоречащих друг другу троек. В самом деле, если для одного и того же x в него вошли тройки и с , то они соответствуют разным путям в дереве вычислений на одном и том же входе x. Эти пути в каком-то месте разошлись, то есть на один и тот же вопрос в них были получены разные ответы. Эти ответы вошли в образцы t1 и t2, и потому эти образцы несовместны. Итак, множество M корректно.
Пусть всюду определенная функция. Присоединим ее к программе p. После этого программа p вычисляет функцию f. Покажем, что . В самом деле, пусть f(x)=y, то есть работа программы p на входе x дала ответ y. Эта работа включала в себя несколько вызовов функции и соответствовала некоторой ветви рассмотренного выше дерева. Пусть t образец, содержащий все заданные при этом вопросы и полученные на них ответы. Тогда t является частью Кроме того, тройка входит в множество M. Следовательно, определено и равно y.
Напротив, если , то существует тройка , для которой t является частью Эта тройка соответствует некоторой ветви дерева вычислений. Поскольку t является частью присоединение к программе p внешней процедуры приведет к тому, что вычисления пойдут именно по этому пути, и программа даст ответ y.
Итак, для любой программы p мы построили корректное множество M, которое задает ту же функцию, что и программа p, и первая половина утверждения теоремы доказана.
Чтобы доказать вторую половину, предположим, что имеется корректное множество M, и построим эквивалентную ему программу p. Эта программа будет (после присоединения к ней оракула, вычисляющего ) вычислять функцию . Программа p действует так: получив вход x, она перечисляет множество M и отбирает в нем тройки, первым членом которых является x. Для каждой такой тройки , вызывая внешнюю процедуру (задавая вопросы оракулу) мы выясняем, является ли t частью функции Если является, то вычисление заканчивается и выдается ответ y, если нет, перечисление множества M продолжается.
Очевидно, что построенная программа p вычисляет функцию .
60. Предположим, что мы провели это построение в обе стороны: сначала по корректному множеству M построили некоторую программу, как это описано во второй половине доказательства, а затем по программе построили некоторое корректное множество M'. Может ли M' отличаться от M?