Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Графы. Модели вычислений. Структуры данных

..pdf
Скачиваний:
231
Добавлен:
01.05.2014
Размер:
2.53 Mб
Скачать

вующие им индуктивные утверждения пронумерованы.

3.Для каждой пары i, j контрольных точек, для которых в блок-схеме имеется путь из i в j, минующий другие контрольные точки, выбираются все такие пути и для каждого выбранного пути доказывается утверждение (индуктивный шаг): «Если при очередном проходе

через точку i выполнялось индуктивное предположение Pi и если реализуется рассматриваемый путь, то при достижении точки j бу-

дет выполняться условие Pj ».

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

1.4. Вычислимость и разрешимость

Упорядоченный набор из n слов в алфавите A называется n-местным

набором над A. Множество всех n-местных наборов над A обозначим через (A*)n.

Любое подмножество R множества (A*)n называется n-местным словарным отношением.

Любое, возможно частичное, отображение f: (A*)n A* называется n- местной словарной функцией. Область определения функции f обозначается через Def (f ).

Результатом работы программы T на входном псевдослове x называется псевдослово T (x), которое появляется на ленте в момент остановки программы; если программа работает бесконечно, то результат неопределен.

Программу, которая в процессе работы над любым псевдословом x не сдвигает головку левее пробела, расположенного слева от n-го слова псевдослова x, будем называть n-программой.

Словарное n-местное отношение R называется полуразрешимым, если существует n-программа T, которая останавливается в точности на всех псевдословах, имеющих вид

X # un # un–1 # … # u1 # ,

где (u1, u2, …, un) R.

Словарное n-местное отношение R называется разрешимым, если R и R полуразрешимы (под R здесь понимается множество (A*)n \ R).

121

Словарная n-местная функция f: (A*)n A* называется вычислимой по Тьюрингу, если существует программа T такая, что

↓ ↓

T(*u1*u2*...*un*) = *u1*u2*...*un*v*,

где u1, u2, ..., un Def (f ) и v = f (u1, u2, ..., un) , в противном случае результат не определен.

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

1.5. Вычисление числовых функций

Чтобы вычислять значения числовых функций с помощью тьюринговых программ, необходимо выбрать способ кодирования на ленте аргументов и значений функции. Мы рассматриваем функции из N n в N, где N – множество натуральных чисел, включая 0, а n 1.

Значения функции и ее аргументов будем записывать в бинарном, унарном или каком-либо ином коде, для этого нам потребуется соответственно алфавит A = {1}, A = {0, 1} и т.д. Значения аргументов перед вычислением должны быть представлены на ленте в виде псевдослова

*x n*xn–1*...*x1*,

где xi – код i-го аргумента (i = 1, 2, ..., n).

После вычисления содержимое ленты должно иметь вид:

*x n*xn–1*...*x1*y*,

где y – код значения функции при заданных значениях аргумента.

Упражнения

1. Составить программу, перерабатывающую псевдослово *u* в псев-

дослово *u*v*, где u – бинарный, а v – унарный код некоторого числа изN.

2.Составить программу сложения и умножения чисел в унарном и бинарном кодах.

3.Составить программу для удвоения числа в бинарном и унарном

кодах.

4.Составить программу деления нацело натуральных чисел в унарном

коде.

1.6.Частично-рекурсивные функции

Пытаясь выяснить содержание интуитивного понятия вычислимой

122

функции, А. Черч в 1936 году рассмотрел класс так называемых рекурсивных функций, а Клини расширил его до класса частично-рекурсивных функций. В то же время впервые была высказана естественно-научная гипотеза о том, что интуитивное понятие вычислимой частичной функции совпадает с понятием частично рекурсивной функции. Эту гипотезу называют тезисом Черча. Здесь мы напомним понятие частичнорекурсивной функции и покажем, что любая частично-рекурсивная функция вычислима по Тьюрингу. Набор аргументов x1, x2, ..., xm обозначим через x.

Функция f (x) называется суперпозицией n-местных функций g1, g2, ..., gm и m-местной функции h, если

f (x) = h (g1(x), g2(x), ..., gm(x)).

Говорят, что (n + 1)-местная функция f (x, y) получена примитивной рекурсией из (n + 2)-местной функции g и n-местной функции h, если

h(x)

 

при

y = 0;

f (x, y) =

 

 

y > 0.

g( f (x, y 1), x, y 1), при

Говорят, что n-местная функция

 

f (x) получена минимизацией из

(n + 1)-местной функции g, если

 

 

 

k, если g(k, x) = 0 и при всех k

 

 

< k g(k , x) определена и не равна 0,

f (x) =

 

 

 

неопределенавпротивномслучае.

 

Часто обозначают f (x) через µy(g(y, x) = 0).

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

Числовая функция f : N n N называется частично рекурсивной, если она является одной из базисных функций:

а) O (y) = 0 (при всех y N),

б) S (y) = y + 1 (при всех y N),

в) Imn (x1, x2, ..., xn) = xm (n = 1, 2,...; 1 m n)

или получена из них с помощью конечного числа применений суперпозиции, примитивной рекурсии и минимизации.

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

123

Доказательство теоремы заключено в следующих четырех леммах, с использованием унарного кодирования чисел.

Лемма 1 (о базисных функциях). Базисные функции O (y), S (y), Imn (x1, x2, ..., xn) вычислимы по Тьюрингу.

Действительно, функцию S (y) вычисляет программа [Km, 1, r], функцию O (y) – программа [r], функцию Imn (x1, x2, ..., xn) – программа Km.

Лемма 2 (о суперпозиции). Если функции g1 (x), g2 (x), ..., gm (x) и h (y1, y2, ..., ym) вычислимы, соответственно, программами G1, G2 ,..., Gm и H, то функцию

f (x)=h (g1 (x), g2 (x),..., gm (x))

вычисляет программа:

[Gm, (Zn + 1)n, Gm 1, (Zn + 1)n, ..., G1, (Zn + 1)n, (Zn + m)n, H, (Λ2)m].

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

*xn*xn1*...*x1*,

после выполнения Gm на ленте будет

*x n*xn 1*...*x1*gm*,

после [Gm, (Zn + 1)n]

*gm*x n*xn 1*...*x1*,

после [Gm, (Zn + 1)n, Gm 1]

*gm*x n*xn–1*...*x1 * gm–1*,

и т.д.

после [Gm, (Zn + 1)n, Gm 1, (Zn + 1)n, ..., G1, (Zn + 1)n]

*gm *gm 1 *...*g1 * x n*xn 1*...*x1*,

после [Gm, (Zn + 1)n, Gm–1, (Zn+1)n, ..., G1, (Zn+1)n, (Zn+m)n, H]

* x n*xn–1*...*x1*gm*gm–1 *...*g1 *f *,

и, наконец, после выполнения всей программы получим

* x n*xn–1*...*x1* f *.

124

Лемма 3 (о примитивной рекурсии). Если функции h (x1, x2 ,..., xn) и g (y1, y2, ..., yn+2) вычислимы соответственно с помощью программ H и G, то функция f (x1, x2 ,..., xn, y), полученная по схеме примитивной рекурсии, вычислима программой

[H, Ln+1, l, (пока 1)[*, Rn+2 ,G, Λ2, Ln+2 ,1, l], Rn+2].

Доказательство. Представим программу, предлагаемую для вычисления функции f (x1, x2, …, xn, y), блок-схемой, изображенной на рисунке.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

H; Ln+1

 

l

*; Rn+2; G

 

Λ2; Ln+2; l

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P1

 

 

 

 

 

 

 

Rn+2

P3

P2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пунктирными стрелками показаны контрольные дуги, для которых будут сформированы соответствующие индуктивные утверждения P1, P2,

P3.

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

Напомним, что основное требование, предъявляемое к утверждениям P1 , P2 , P3 , заключается в том, чтобы была возможность доказательства индуктивных шагов:

P1 P2, если реализуется путь [H; Ln+1; l; *; Rn+2; G]; P1 P3, если реализуется путь [H; Ln+1; l; Rn+2];

P2 P2, если реализуется путь 2; Ln+2; l; l; *; Rn+2; G]; P2 P3, если реализуется путь 2; Ln+2; l; l; Rn+2].

Пусть x1, x2, …, xn, y – исходные значения аргументов из множества N, тогда требуемые утверждения можно сформулировать следующим обра-

125

зом:

P1 содержимое ленты равно *1y *1xn *1xn1 *...*1x1 * ,

P2 существует y1 1, y2, g1, g2 0, такие, что содержимое ленты рав-

но *1y2 *1y2 *1xn 1xn1 *...*1x1 1g1 1g2 * и y1 +y2 +1 = y, g1 = g(f (x1, x2, …, xn,y1 – 1), x1, x2, …xn, y1 – 1), g2 = g(f (x1, x2, …, xn, y1), x1, x2, …, xn, y1),

P3 содержимое ленты равно *1y *1xn *1xn1 *...*1x1 *1z * и z = f (x1, x2,

…, xn, y).

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

Лемма 4 (о минимизации). Если функция g(y, x1, x2, ..., xn) вычислима программой G, то функция f (x1, x2, ..., xn), полученная из нее по схеме минимизации, вычисляется программой

[r, G, l, (пока 1) [r, Λ1,1, r, G, l].

Доказательство. Представим программу, предлагаемую для вычисления функции f (x1, x2, …, xn), блок-схемой c указанными контрольными точками P1, P2, P3.

r

 

G

 

 

1

r; Λ1;1

 

 

l

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P2

P1

P3

Пусть x1, x2, …, xn – исходные значения аргументов, тогда для доказательства частичной корректности предлагаемой программы можно воспользоваться следующими индуктивными утверждениями:

P1 – содержимое ленты равно *1xn *1xn1 *...*1x1 * ,

126

P2 – существуют k, z 0, такие, что содержимое ленты равно *1xn *

*1xn1 *...*1x1 *1k *1z *, где z = g (k, x1, x2, …, xn),

P3 – содержимое ленты равно *1xn *1xn1 *...*1x1 *1z *, где z = f (x1, x2,

…, xn).

Требуется доказать следующие индуктивные шаги. P1 P2, если реализуется путь [r, G];

P2 P2, если реализуется путь [l; r; Λ1; 1; r; G];

P2 P3, еслиреализуетсяпуть[l], иголовкаостановитсянасимволе *. Доказательство индуктивных утверждений и завершаемости програм-

мы предоставляется читателю в качестве упражнений.

Заметим, что в доказательствах лемм 3 и 4 при рисовании блок-схемы мы несущественно отступили от текстов программ, данных в их формулировках, а при доказательстве леммы 2 не выписывали индуктивных утверждений, так как в представлении программы блок-схемой нет циклов. Обращаем внимание на то, что правильность блоков, из которых составлены программы, мы не подвергаем сомнению.

1.7.Универсальная тьюрингова программа

ипример невычислимой функции

Вэтом параграфе мы объявляем о существовании универсальной тьюринговой программы U, которая может имитировать любую програм-

му, работающую над фиксированным алфавитом A = {a1, a2 ,..., an}. Эта программа U, получив на входе псевдослово, содержащее в определенном виде код произвольной программы T и псевдослово X, должна оставить на ленте код программы T и псевдослово T (X) – результат работы программы T на псевдослове X.

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

Пусть Ψn – множество всех функций из N в N таких, что каждая из них определена в точке 0 и вычислима программой, состоящей не более чем из n тьюринговых команд. Рассмотрим функцию s (n) = max f (0), где максимум берется по всем функциям из Ψn. Очевидно, s(n) всюду определена и монотонна. Более того, справедлива

Теорема. Для любой всюду определенной вычислимой функции f : N N существует k N такое, что при любом m k выполняется неравенство f (m) < s (m).

127

Действительно, пусть f (n) – произвольная всюду определенная функция из N в N, тогда, очевидно, функция

F(n) = max(f (3n), f (3n + 1), f (3n + 2)) + 1

будет также всюду определенной и вычислимой. Пусть в унарном коде ее вычисляет программа TF, состоящая из k команд. Рассмотрим программу T = [[1, r]n, TF], которая сначала записывает на ленте число n, а затем работает как TF. Очевидно, она состоит из 2n + k команд и вычисляет неко-

торую функцию F ′ Ψ2n+k.

По определению F и s имеем F(n) = F(0) s (2n + k). Используя монотонность функции s, получим F (n) s (3n) при всех n k, следовательно, f (3n + i) < s (3n + i), (i = 0, 1, 2). Отсюда следует, что при m 3k выполняется неравенство f (m) < s (m), что и требовалось доказать.

Следствие. Функция s (n) невычислима, так как она растет быстрее, чем любая вычислимая функция.

Заметим, что при любом фиксированном n значение s (n) можно попытаться вычислить путем перебора всех программ длины n и определения для каждой из них времени работы до момента остановки или доказательства ее незавершаемости. Но вопрос о завершаемости программ в общем виде алгоритмически неразрешим. Уточним основные моменты этого утверждения.

Пусть T – тьюрингова программа, работающая в алфавите A, и пусть kod (T) – слово в алфавите A, кодирующее программу T (на деталях кодирования не останавливаемся).

Программа T называется самоприменимой, если при подаче ей на вход ее собственного кода она через конечное число шагов остановится, в противном случае программа называется несамоприменимой. Пусть M – множество кодов самоприменимых программ.

Теорема. Множество M алгоритмически неразрешимо.

Доказательство. Пусть M – алгоритмически разрешимо. Тогда существуют две программы T1 и T2 такие, что T1 останавливается только на словах из M, а T2 – только на словах из A* \M.

Тогда, если T2 на своем собственном коде остановится, то kod (T2)M по определению M, но kod (T2) M по определению T2.

Если же T2 на своем собственном коде не остановится, то по определению M kod(T2) M, а по определению T2 kod(T2) M. Итак, в любом случае имеем противоречие.

128

Еще одним примером алгоритмически неразрешимого множества является множество M1 кодов программ, которые останавливаются при пустом входе. Легко показать, что если бы M1 было разрешимым, то множество M тоже было бы разрешимым.

1.8. Об измерении алгоритмической сложности задач

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

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

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

Рассмотрим некоторые подробности на примере тьюринговых программ. Считаем, что задача представлена двухместным словарным предикатом R (u, v) над некоторым алфавитом A и заключается в нахождении по заданному слову u A* слова v A* такого, что R (u, v) истинно.

Слово v будем считать решением задачи R при входном слове u. Чтобы пустоту слова v трактовать как отсутствие решения, наложим на R следующие ограничения

R (λ, λ),

u v R (u, v),

u [R (u, λ) v [v ≠ λ → ¬R (u, v)]].

Результат работы тьюринговой программы T на входном слове u обозначим T (u), считая T (u) равным выходному слову.

Будем говорить, что тьюрингова программа T решает задачу R, если на любом входном слове u она останавливается через конечное число ша-

гов и u R (u, T (u)).

Через time (T, u) обозначим число элементарных тьюринговых команд, которые будут выполнены программой T от начального момента до момента остановки при работе на входном слове u. Если при входном слове u программа T выполняет бесконечное число шагов, то считаем

129

time (T, u) = .

Величину time (T, u) будем называть временем работы программы T на слове u. В большинстве случаев эта величина существенно зависит от длины слова u, поэтому представляет интерес функция t (T, n) = = max time (T, u), где максимум вычисляется по всем словам длины n.

Заметим, что эта ситуация не является общей; в некоторых случаях величина time (T, u) не зависит от длины слова u. Например, пусть требуется определить четность числа, представленного в двоичном коде. Для этого достаточно посмотреть на его младший разряд.

Временной сложностью задачи R можно было бы попытаться назвать функцию f (n) = min t (T, n), где минимум вычисляется по всем программам Т, решающим задачу R. Однако существование такой функции не гарантировано. Можно надеяться на существование таких функций при ограничениях на класс вычислительных алгоритмов. На практике ограничиваются нахождением верхней и нижней оценочных функций для времени работы конкретных алгоритмов.

Заметим, что получение нижних нетривиальных оценок каждый раз представляет собой сложную математическую задачу. Известно, например, что временная сложность задачи распознавания симметрии слова тьюринговыми программами оценивается снизу функцией cn2, где n длина слова, а c некоторая константа.

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

Если для задачи R имеется полиномиальная от n верхняя оценочная функция, то говорят, что R разрешима в полиномиальное время.

Для многих задач не удается установить существования верхних полиномиальных оценочных функций. Однако распознавание на паре слов u, v, является ли слово v решением задачи R на входе u, решается за полиномиальное от длины слова u время и, кроме того, для каждого u существует ответ v, длина которого ограничена некоторым полиномом от длины u. Это так называемые задачи с проверяемым за полиномиальное время ответом.

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

130