Что такое алгоритм?
Неформально алгоритм — это однозначно определенная совокупность инструкций по преобразованию исходных данных в результат, причем все инструкции элементарны, т.е. при их выполнении "нам придется только механически следовать предписаниям, как если бы мы были роботами: от нас не потребуется ни понимания, ни искусства, ни изобретательности" [5, с. 270]. Формализовать это понятие можно различными способами.
Обычно подразумевается, что каждый алгоритм решает какую-то вычислительную задачу. С формальной точки зрения, вычислительная задача - это функция
F: входные данные -> результат,
Что такое "входные данные" и "результат"? Рассмотрим, например, задачу об умножении двух многочленов с целыми коэффициентами. Тогда входные данные - это пара многочленов. Проблема в том, как записать эти многочлены, чтобы их можно было ввести в компьютер. Машины Тьюринга, которые мы рассматриваем ниже, понимают лишь конечные последовательности символов (слова) из некоторого конечного множества A, называемого внешним алфавитом. Поэтому строгая формулировка вычислительной задачи должна включать в себя алфавит и способ кодировки входных данных. Например, можно записать пару многочленов с использованием 10 цифр, символа переменной x, знаков +, -, * и скобок: (x**2-5)(-4*x+1). В другой кодировке коэффициенты записываются в двоичной системе счисления и перечисляются через запятую; два многочлена разделяются звездочкой: 1, 0, -101* -100, 1. Таким образом, мы имеем две различные вычислительные задачи. С практической точки зрения, обе задачи эквивалентны, поскольку перевод из одной кодировки в другую осуществляется с помощью полиномиального алгоритма. Пока определения полиномального алгоритма у нас нет, давайте будем формалистами: вычислительная задача - это частичная1Под частичной функцией на множестве X здесь и далее понимается функция, область определения которой содержится в X. функция F: A* -> A* (где A* обозначает множество конечных слов в алфавите ). Потом мы позволим себе некоторую вольность и будем говорить о задаче умножения многочленов или разложения целого числа на множители, имея ввиду, что все разумные кодировки эквивалентны (т.е. переводятся друг в друга при помощи полиномиальных алгоритмов). Однако нужно помнить, что не всякая кодировка является "разумной". Нехорошо, например, представлять натуральное число n набором из n звездочек, потому что длина такой записи экспоненциально велика по сравнению с двоичной или десятичной записью. Заметим также, что в некоторых задачах нет хорошего выбора "разумной" кодировки, в таких случаях (они нам не встретятся) необходимо указывать кодировку всякий раз, когда формулируется задача.
Теперь дадим формальное определение алгоритма.
Машины Тьюринга.
Машина Тьюринга (сокращенно МТ) однозначно задается указанием набора , где
,
,
— конечные множества, причем
;
— некоторый элемент
;
— некоторый элемент
, а
— некоторая (частичная, вообще говоря) функция из
в
.
Составляющие части МТ называются так:
— пустой символ (или пробел),
— множество состояний управляющего устройства,
— начальное состояние,
Состояние МТ задается тройкой , где
— бесконечное слово в алфавите
, т.е. произвольная последовательность
элементов
;
— неотрицательное целое число;
. Символы слова
будем, как это принято, представлять записанными на ленте, разбитой на ячейки, по ячейке на символ. На ленте также имеется головка, которая расположена над ячейкой с номером
. Наглядно это изображается так:
Помимо ленты машина Тьюринга имеет управляющее устройство, состояние которого задается элементом множества
.
Состояния МТ меняются дискретно. За один такт работы управляющее устройство выполняет следующие действия (полагаем, что МТ находится в состоянии ):
-
читает символ, находящийся под головкой (т.е. определяет
);
-
вычисляет значение функции переходов:
(если функция переходов на паре
не определена, то останавливает машину Тьюринга);
-
записывает на ленту в ячейку
символ
, сдвигает головку на
и переходит в состояние
(другими словами, новое состояние машины задается тройкой
);
-
если
, то останавливает машину.
Пожалуй, всякий согласится, что эти действия не требуют ни понимания, ни искусства, ни изобретательности.
Работа машины Тьюринга будет всегда начинаться из состояния , где за конечным словом
, состоящим из символов внешнего алфавита (множество таких слов обозначается
), следует бесконечное слово, целиком состоящее из пустых символов. Слово
будем называть входом МТ. В любой момент времени слово, записанное на ленте, однозначно записывается в виде
, где последний символ слова
— не пустой, а за ним идут только пустые символы. Будем называть слово
используемой частью ленты.
Выполняя один такт работы за другим, машина Тьюринга порождает последовательность состояний
Если МТ останавливается, используемая часть ленты в достигнутом перед остановкой состоянии называется результатом работы МТ.