Машина Тьюринга (МТ) — абстрактный исполнитель (абстрактная вычислительная машина).
Сочетания алгоритмов - это название, установившееся за рядом конкретных способов конструирования новых алгоритмов из нескольких заданных.
Теоремы о сочетаниях алгоритмов составляют важный раздел общей теории алгоритмов. Будучи доказанными однажды, они позволяют в дальнейшем убеждаться в осуществимости сложных и громоздких алгоритмов без фактического выписывания определяющих их схем.
Сочетания алгоритмов для машины Тьюринга описываются операциями над машинами Тьюринга.
1. Операция композиции.
Пусть M1 и M2 - машины Тьюринга, имеющие одинаковый внешний алфавит A«[i153] {a0,a1,...,ap}. Обозначим множества их состояний соответственно Q1[i154] «[i155] {q0,q1,...,qn} и Q2[i156] «[i157] {q0',q1',...,qm'}.
Определение.[i158]
Композицией машин M1 и M2 называют машину, обозначаемую M=M1×M2, программа которой имеет алфавит A, множество состояний Q«[i159] {q0,q1,...,qn,qn+1,...,qn+m} и получается из программ машин M1 и M2 следующим образом: везде в программе машины M1, где встречаются "тройки" с символом q1 (заключительное состояние машины M1), он заменяется на символ q0' (начальное состояние машины M2); все остальные символы в программах машин M1 и M2 остаются неизменными (в завершение остаётся перенумеровать все состояния машины M: {q0,q1'[i160],q2,...,qn,q0',q2',...,qm'}).
Композиция начинает "работать" как машина M1, но в тех случаях, когда машина M1 должна остановиться, происходит переключение на программу машины M2, вследствие замены q1[i161] на q0'. Очевидно, что операция композиции ассоциативна, но не коммутативна.
[i161] Её работа равносильна последовательной работе машин T1 и T2 [i162].
На рисунке изображена композиция машин Тьюринга, реализующая оператор суперпозиции для n=1 и m=1.
Рисунок 1.
Определение.[i163]
Итерацией машины Тьюринга M будем называть машину
2. Операция ветвления.
Пусть M1, M2 и M3 - машины Тьюринга, имеющие одинаковый внешний алфавит A«[i164] {a0,a1,...,ai,...,aj,...,ap} и, соответственно, множества состояний: Q1[i165] «[i166] {q0,q1,...,qn}, Q2[i167] «[i168] {q0',q1',...,qm'}, Q3[i169] «[i170] {q0",q1",...,ql"}.
Определение.
[i171] Результатом операции ветвления над машинами Тьюринга M1, M2 и M3[i172] называется машина Тьюринга M, программа которой получается из программ машин M1,M2 и M3 следующим образом: записана программа машины M1[i173], затем приписаны программы машины M2 и M3. Если в заключительном состоянии q1 машины M1[i174] наблюдается символ ai, то управление передается на машину M2, т.е. символ q1 заменяется символом q0' и начинает работать машина M2. Если же в заключительном состоянии q1 машины M1 наблюдается символ a[i175] j, то управление передается на машину M3, т.е. символ q1 заменяется символом q0" и начинает работать машина M3. Все остальные символы в программах машин M1 и M2 остаются неизменными. Машина M завершает работу в заключительном состоянии q1 (в заключение остается осуществить сквозную перенумерацию состояний машины M).
Результат операции ветвления над машинами Тьюринга M1, M2 и M3[i176] обозначается следующим образом:
[i177]
Для двухбуквенных машин Тьюринга (машин Тьюринга с двухбуквенным алфавитом) операция ветвления над произвольными машинами Тьюринга M1[i178], M2 [i179] и M3[i180] обозначается следующим образом:
т.е. если при работе машины M1[i181] в состоянии q1 наблюдается символ a0, то управление передается на машину M2[i182], в противном случае - на машину M3.
3. Операция зацикливания.
Пусть M - машина Тьюринга с алфавитом A«[i183] {a0,a1,...,ap} и множеством состояний Q«[i184] {q0,q1,...,qn}.
Определение.[i185]
Результатом операции зацикливания будем называть машину Тьюринга, обозначаемую (i=0,2,3,...,n; j=0,1,2,...,p; s=0,2,3,...,n)[i186]
программа которой получается из программы машины M заменой в консеквент[i187] е команды qiaj®q1atr, rÎ{L,R,L}, [i188] t=0,1,2,...p, символа q1 на символ qs.
2[i189].4 Варианты машины Тьюринга[i190]
Модель машины Тьюринга допускает расширения. Можно рассматривать машины Тьюринга с произвольным числом лент и многомерными лентами с различными ограничениями. Однако все эти машины являются полными по Тьюрингу и моделируются обычной машиной Тьюринга[i191].
В качестве примера такой эквивалентности рассмотрим сведение любой МТ к МТ, работающая на полубесконечной ленте[i191].
Теорема: [i191] Для любой машины Тьюринга существует эквивалентная машина Тьюринга, работающая на полубесконечной ленте.
Доказательство:
Рассмотрим доказательство Ю. Г. Карпова[i192]. Доказательство этой теоремы конструктивное, то есть мы дадим алгоритм, по которому для любой машины Тьюринга может быть построена эквивалентная машина Тьюринга с объявленным свойством. Во-первых произвольно занумеруем ячейки рабочей ленты МТ, то есть определим новое расположение информации на ленте:
Рисунок 1.
Затем перенумеруем ячейки, причём будем считать, что символ «*» не содержится в словаре МТ:
Рисунок 1.
2.5 Вычислимость по Тьюрингу и разрешимость[i193]
Выше было доказано, что классы функций, вычислимых с помощью рекурсивных функций, машин Тьюринга или нормальных алгоритмов Маркова, совпадают. Это позволяет рассматривать понятие «вычислительный алгоритм» инвариантным к способу описания. Различия наблюдаются лишь в использовании алгоритмических объектов. Если для рекурсивных функций объектами являются числа и числовые функции, а процесс вычисления задан операторами суперпозиции, рекурсии, минимизации и итерации, то для машин Тьюринга такими объектами являются символы алфавитов внешней и внутренней памяти, а процесс вычисления задан протоколом, использующим функции выхода, перехода и перемещения головки. Для нормального алгоритма Маркова такими объектами являются слова или последовательности символов, а процесс вычисления задан правилами подстановки или продукциями, изменяющими состав и структуру исходной последовательности символов до искомого результата.
Арифметической (числовой) функцией [i194] называют функцию, областью значений которой является подмножество множества N, а областью определения - элемент множества N.
Для алгоритмических проблем типичной является ситуация, когда требуется найти алгоритм для вычисления числовой функции f(x1, x2, …, xn), зависящей от целочисленных значений аргументов x1, x2, …, xn.
Функцию f:Nn→N назовем вычислимой[i195], если существует алгоритм, позволяющий для любого набора значений ее аргументов вычислить значение функции (или указать, что функция на данном наборе не определена). Так как в определении вычислимой функции используется интуитивное понятие алгоритма, то часто вместо термина «вычислимая функция» используется термин «интуитивно вычислимая функция». Таким образом, массовая проблема имеет решение, если арифметическая функция, соответствующая этой проблеме, является интуитивно вычислимой.
Функция f(x1, x2, …, xn) называется эффективно вычислимой[i196], если для заданных значений k1, k2, …, kn аргументов можно найти значение функции f(k1, k2, …,kn) с помощью некоторой имеющейся механической процедуры (алгоритма).
Вместо уточнения понятия алгоритма можно рассматривать уточнение понятия «вычислимая функция». Обычно при этом действуют по следующей схеме:
1. Вводят точно определенный класс функций.
2. Убеждаются, что все функции из этого класса являются вычислимыми.
3. Принимают гипотезу (тезис) о том, что класс вычислимых функций совпадает с введенным классом функций.
Функция называется вычислимой[i197], если существует вычисляющий её алгоритм. «Вычислимость» является одним из основных понятий теории алгоритмов, инвариантном к вычисляемой функции и алгоритму. Различие между вычислимой функцией и алгоритмом – это различие между описанием функции и способом вычисления её значений при заданных значениях независимых аргументов.
Тезис Тьюринга[i198]. Всякий интуитивный алгоритм может быть реализован с помощью некоторой машины Тьюринга.
Из тезиса Тьюринга следует, что, если возникают алгоритмические проблемы, то их следует решать на базе построения машин Тьюринга, то есть достаточно формализованного понятия алгоритма. При этом в алгоритмических проблемах часто речь идет не о построении алгоритма, а о вычислимости некоторых специальным образом построенных функций.
Следует отметить, что в этих случаях достаточно использовать алфавит {0,|}, где 0 – пустой символ. Например, натуральные числа, включая 0, в этом алфавите кодируются следующим образом: 0 - |; 1 - ||; 2 -
N - ||…| (n + 1 раз). Частичная числовая n – местная функция f(x1, x2, …, xn[i199]) называется вычислимой по Тьюрингу[i200], если существует машина М, вычисляющая ее в следующем смысле: 1. Если набор значений аргументов <x1, x2, …, xn[i201] > принадлежит области определения функции f, то машина М, начиная работу в конфигурации 0 |x1+1 0 |x2+1 [i202] … 0 |xn[i203] q1[i204] |, где |x = ||… | (x раз) ,[i205] и воспринимается самый правый символ, останавливается, заканчивая работу в конфигурации 0|yq0[i206] |, где y = f(x1, x2, …, xn). 2. Если набор значений аргументов <x1, x2, …, xn> не принадлежит области определения функции f, то машина М, начиная работу в исходной конфигурации, работает бесконечно, то есть не приходит в заключительное состояние. Машина Тьюринга есть точное формальное определение алгоритма. С помощью этого понятия можно доказывать разрешимость или неразрешимость алгоритмических проблем. Если для решения задачи, принадлежащей единому классу задач, найден алгоритм вычисления, то о задаче говорят как об алгоритмически разрешимой проблеме[i207]. Иначе говоря, обязательным условием вычислимости или результативности вычисления является её алгоритмическая разрешимость. В этом смысле понятие «разрешимость» является также основным понятием в теории алгоритмов. Анализ трех типов моделей показывает, что основные свойства дискретности, детерминизма, массовости и результативности остаются неизменными для различных способов описания: • Свойство дискретности: [i208] алгоритм состоит из отдельных элементарных действий, выполняемых по шагам; множество элементарных шагов, из которых состоит алгоритмический процесс, конечно и счетно. • Свойство детерминированности: [i209] после каждого шага дается точное указание, как и в какой последовательности выполнять следующие шаги алгоритмического процесса. • Свойство массовости: [i210] использование алгоритма допустимо для множества алгоритмических объектов данного типа и данного класса задач. • Свойство результативности: [i211] остановка алгоритмического процесса обязательна после конечного числа шагов с указанием искомого результата. Однако[i212], тезис невозможно доказать, так как он связан точным понятием вычислимости по Тьюрингу с неточным понятием интуитивно вычислимой функции.
ПРОБЛЕМА САМОПРИМЕНИМОСТИ
Согласно определению машины Тьюринга это тройка T = <A, Q, П>, в которой A -алфавит, Q – внутренние состояния машины, Q -программа, которая и отличает одну машину от другой. В общем случае (для всех машин) программа может выглядеть, например, так:
П: qi a [i213] aj a [i214] ® qr a [i215] as a [i216] St a [i217], a = 1, 2, …, k, где S1 - R, S2 - L, S3 - C. (*)
При этом можно считать, что существуют некоторые общие алфавиты A0 и Q0, в которых записываются символы a и q для всех машин Тьюринга. Тогда символы qi a, aj a, qr a, as a, St a [i218] являются символами алфавитов A0 и Q0.
Такой подход позволяет все машины Тьюринга пронумеровать, то есть каждой машине присвоить некоторый номер (код), присущий только этой машине, по которому можно было бы отличать ее от других машин. Здесь рассмотрим один из способов нумерации.[i219]
Геделева нумерация машин Тьюринга. Пусть p1, p2, p3, … - последовательность простых чисел, расположенная в порядке возрастания, например, 2, 3, 5, 7, 11, 13, …
Номером машины Тьюринга с программой (*) называется число
n (T) = .
Пример
Машина, реализующая функцию S (x) = x + 1, имеет программу в алфавите {0, [i220] }. Номер этой программы с учетом того, что a0 = 0, a1 = | будет число: .
n (T)= 21 31 51 71 111 131 170 190 231 293.
Очевидно, что не все натуральные числа являются номерами машин Тьюринга. С другой стороны, если n – номер некоторой машины, в общих алфавитах, то ее программу можно однозначно восстановить по этому номеру.
Машина T, применимая к слову n (T) (то есть к коду своего собственного номера), называется самоприменимой.
Можно построить как самоприменимые машины, так и несамоприменимые машины. Например, машина из выданного примера – самоприменима. Машина T, у которой в правых частях программы (в теле таблицы) отсутствует символ останова, неприменима ни к какому слову, а, следовательно, и к слову n (T).
Проблема самоприменимости состоит в следующем: указать алгоритм, который по любой машине Тьюринга устанавливал бы, самоприменима она или нет.
Согласно Т[i221] езису Тьюринга, такой алгоритм следует искать в виде машины Тьюринга. Эта машина должна быть применима к кодам номеров всех машин Тьюринга, и в зависимости от результата переработки кодов проверяемых машин, имела бы различные заключительные конфигурации.
Пусть, например, данная машина T применяется к коду n (T *). Если машина T * самоприменима, то заключительная конфигурация машины T имеет вид a' q0 [i222] | B' [i223], а в случае, если машина T * несамоприменима, то заключительная конфигурация машины T имеет вид a" q0 [i224] 0 B [i225] ". [i226] Здесь a', B', a", B" [i227] – слова.
Теорема Проблема самоприменимости алгоритмически неразрешима, то есть не существует машины Тьюринга, решающей эту проблему в указанном выше смысле.
Из[i228] теоремы следует, что не существует общего алгоритма решающего проблему самоприменимости. В конкретных же частных случаях такие алгоритмы могут существовать.
Воспользуемся результатами этой теоремы для доказательства неразрешимости проблемы применимости к начальному слову.
Проблема применимости к начальному слову состоит в следующем: создать алгоритм, который по машине T и слову X устанавливал бы, применима машина T к слову X или нет (иначе проблема останова).
В терминах машин Тьюринга, аналогично формулировке проблемы самоприменимости, эта проблема формулируется так: можно ли построить машину, которая была бы применима ко всем словам вида n (T)0 X, где T произвольная машина, X – произвольное слово, и в случае, если машина T применима к слову X, приводила бы к заключительной конфигурации a' q0 [i229] |B' [i230], а в случае, если машина T не применима к слову Х, приводила бы к заключительной конфигурации a" q0 [i231] 0 B" [i232]. Здесь a', B' и a", B" [i233] – произвольные слова.
Теорема Проблема применимости к начальному слову алгоритмически неразрешима, то есть не существует машины Тьюринга, решающей эту проблему в указанном выше смысле.
Как[i234] было вышесформулировано[i235] для проблемы самоприменимости первым предварительным шагом является нумерация. Поэтому ниже этот вопрос последовательно рассматривается и решается для алгоритмов и его трех основных типов алгоритмических моделей.
Нумерация алгоритмов
Нумерация алгоритмов играет важную роль в их исследовании и анализе. Поскольку любой алгоритм можно задать в виде конечного слова (представить в виде конечной последовательности символов некоторого алфавита), а множество всех конечных слов в конечном алфавите счётное, то множество всех алгоритмов также счётное. Это означает существование взаимно однозначного отображения между множеством натуральных чисел и множеством алгоритмов, то есть возможность присвоить каждому алгоритму номер.
Нумерация алгоритмов является одновременно и нумерацией всех алгоритмически исчисляемых функций, причем любая функция может иметь бесконечное количество номеров.
Существование нумерации позволяет работать с алгоритмами так же, как с числами. Особенно полезна нумерация в исследовании алгоритмов, работающих с другими алгоритмами.
Пусть имеется некая массовая проблема с множеством исходных объектов X и множеством искомых объектов Y. Для существования решения массовой проблемы необходимо, чтобы элементы множеств X и Y были конструктивными объектами. Следовательно, элементы этих множеств можно занумеровать натуральными числам. Пусть x∈[i236] X – некий исходный объект, обозначим через n(x) его номер. Если в массовой проблеме по исходному объекту x требуется получить искомый объект y∈[i237] Y с номером n(y), то определим арифметическую функцию f: Nn[i238] →N, такую что f(n(x))=n(y).
В качестве примера построения арифметических функций по массовым проблемам рассмотрим массовые проблемы.
1. Если дан массив [x1, x2, …, xn[i239] ] натуральных чисел, то ему в соответствие можно поставить натуральное число 2x1, 3x2,... p(n)xn [i240], где p(n) – n-е простое число. Рассмотрим для примера массив длины 5:
[x1, x2, x3, x4, x5[i241] [i242] ] 2x13x25x37x411x5.[i243]
Данная нумерация определяет арифметическую функцию f (например, f(73500) = f(22315372110) = 20315272113 = 4891425).[i244]
2. Любое рациональное число имеет некоторый натуральный номер. Нумерация множества искомых объектов проблемы тривиальна:
{«да», «нет»} a {1, 0}. [i245] Для данной массовой проблемы можно построить арифметическую функцию одного аргумента, воспользовавшись приемом из предыдущего примера[i246], а можно рассмотреть функцию трех аргументов (три номера элементов исходной тройки).
3. Нумерация текстов программ может быть осуществлена следующим образом: любую программу можно воспринимать как запись числа в 256-ричной системе счисления (если для записи программы использовались символы таблицы ASCII).
Переход от массовой проблемы к арифметической функции позволяет свести вопрос о существовании решения массовой проблемы к вопросу существования эффективного способа вычислений значений арифметической функции по ее аргументу (аргументам).
Нумерация наборов чисел
В теории алгоритмов получил распространение прием, позволяющий сводить изучение функций от нескольких переменных к изучению функций одной переменной. Он основан на нумерации наборов чисел так, что имеется биективное соответствие между наборами чисел и их номерами, причем функции, определяющие по набору чисел его номер и по номеру сам набор чисел являются общерекурсивными. Например, для функции, содержащей две независимых переменных (x, y), это отображение h(x, y) может быть таким:
[i246]
Рисунок 1.
Пусть пары (x, y) формируют частично упорядоченное множество N(2). Если дано h(x, y) = n, то существует обратное отображение: x = h-11(n) и y= h-12 (n), [i247] т. е. h(h-11 (n), h-12 (n)) = n. Это позволяет вычислять номер n для любой пары (x, y) и, наоборот, по номеру n вычислять значения x и y:
Используя эти правила, можно вычислять нумерацию троек h2(x, y, z)[i248] = h(h(x, y), z) = n и, наоборот, по номеру тройки - значения x, y, z. Например, если h2 (x, y, z) = n, то z= h-12(n), y= h-12 (h-11 (n)), x= h-11 (h-11 (n)), h2(x, y, z) [i249] = h(h(h-11 (h-11 (n)), h-12 (h-11 (n))), h-12 (n)). Тройки (x, y, z) формируют частично упорядоченное множество N(3). Аналогично для произвольного количества чисел имеем:
hn-1(x1, x2,…, xn[i250])=h(h…h(h(x1, x2), x3)…[i251] xn-1), xn[i252]). Если hn-1(x1, x2,…, xn[i253])=m, то xn[i254] = h-12 (m), xn-1 =h-12 (h-11 (m)),....................................., x2[i255] = h-12 (h-11 (...h-11 (m)...)), x1[i256] = h-12 (h (...h (m)...)).
Имея нумерацию множеств наборов N(1), N(2),..., N (i),..., N(n, где N (i) – множество наборов (i) чисел, можно установить объединенную нумерацию произвольных наборов чисел M = N(1) N(2) ... N (i) .. N(n), где M N. Для любого n N имеем h(x1,x2,..., xn [i257])= h(hn−1(x1,x2,..., xn), n −1[i258]).
Если h(x,1x,2..., x)n[i259] = m, то hn−1(x,1x,2..., x)n[i260] = h-11 (m), n= h-12 (m)+1. Используя вышеприведенные формулы, можно восстановить значения x1, x2,…, xn. [i261]