Нормальные алгоритмы Маркова
Советский ученый А. А. Марков избрал другой путь уточнения понятия алгоритма. Им разработана строгая теория класса алгоритмов, которые он назвал нормальными алгоритмами[14].
Нормальные алгоритмы в качестве исходных данных и искомых результатов имеют, подобно машинам Тьюринга, строки букв — слова.
Предположим, что заранее выделен некоторый алфавит (это' было и в случае машин Тьюринга). Обозначим его А. Букву, одинаковую с одной из букв, входящих в алфавит Л, называют буквой, в А. Слово, состоящее из букв в А, называют словом в А. При этом для удобства рассуждений допускают и пустые слова (не имеющие в своем составе ни одной буквы).
Если А и В — два алфавита, причем каждая буква алфавита А является буквой в В, а хотя бы одна из букв алфавита В не является буквой в А, то В называется расширением алфавита А.
Например, если
A = {а, б, в, г}, B={1, а, б, в, г, д},
то В является расширением А, так как содержит две буквы («1» и «д»), не являющиеся буквами в А, тогда как все буквы алфавита А являются буквами в В.
Рассмотрим какое-либо конкретное слово для определенности в алфавите русских букв, например слово «самолет». Мы видим, что из него можно вырезать подслова, например «сам», «амол» или «олет», или «лет», или, наконец, однобуквенное слово «т». Про такие подслова говорят, что они входят в рассматриваемое слово или являются вхождениями в него. Заметим, что в наше слово входит и пустое слово, причем — несколько раз (оно входит перед первой буквой, между каждыми двумя буквами и, наконец, после последней буквы, т. е., в данном случае, 8 раз).
Условимся обозначать слова заглавными латинскими буквами (если эти буквы не являются буквами в применяемом алфавите). Если задано некоторое слово и нами выбрана буква, являющаяся его обозначением (именем), то будем ставить между ними знак = (равенства). Возвращаясь к нашему примеру, мы можем написать: для слова R= самолет слово P=амол является вхождением.
Заметим, что не только пустое слово может многократно входить в другое слово. Например, в слово R=тарарам слово Р=ара входит два раза. Особый интерес для нас будет представлять так называемое первое вхождение.
Марковской подстановкой называется операция над словами, задаваемая с помощью пары слов (Р, Q), заключающаяся в следующем.
Если задано исходное слово R, то в нем находят первое вхождение слова Р (если таковое имеется) и, не изменяя остальных частей слова R, заменяют в нем это вхождение словом Q. Полученное слово является результатом применения марковской подстановки (Р, Q) к слову R. Если же нет первого вхождения Р в слово R (при этом нет вообще ни одного вхождения Р в R), то считается, что марковской подстановке слово R не поддается.
Частными случаями марковских подстановок являются (,Q), (Р,) и (,). В первом из приведенных примеров Р, во втором Q, а в третьем и Р, и Q являются пустыми. Приведем некоторые примеры преобразования слов с помощью марковских подстановок (табл. 3).
Таблица 3 Преобразование слов с помощью марковских подстановок
Преобразуемое слово | Марковская подстановка | Результат | |
(923, 0000) | |||
функция | ( ,λ-) | Λ-функция | |
паровоз | (овоз,) | пар | |
терек | (е, ) | трек | |
слово | ( , ) | слово | |
слово | (ра, да) | (результата нет) |
Будем рассматривать слова в некотором алфавите А. Предположим, что символы «→» и «→•» не являются буквами в А. Записи
P→Q и P→•Q
будем называть записями марковской подстановки (Р, Q), причем первую из них будем называть подстановкой, а вторую
заключительной подстановкой. Смысл этих названий станет ясным немного ниже.
Подстановки и заключительные подстановки (в данном параграфе) будем называть формулами, различая в них левую часть Р и правую часть Q.
Записью нормального алгоритма в алфавите А называют столбец формул, левые и правые части которых являются словами в А. Выполнение нормального алгоритма применительно к исходному данному R, являющемуся словом в А, заключается в следующем.
Двигаясь по столбцу формул, ищут первую формулу, левая часть которой входит в преобразуемое слово. Если такой формулы не найдется, процесс окончен. Если же она найдется, то выполняют марковскую подстановку, соответствующую данной формуле, изменяя преобразуемое слово.
Затем смотрят, является ли выполненная подстановка заключительной. Если она является заключительной, то процесс окончен. В противном случае весь процесс повторяют с самого начала.
Пусть В является расширением алфавита А. Нормальный алгоритм в В, который слова в А, если он к ним применим, перерабатывает в результаты, являющиеся словами в А, называется нормальным алгоритмом над А. В некоторых случаях построение нормального алгоритма над А гораздо легче, чем построение нормального алгоритма в А.
Приведем примеры некоторых нормальных алгоритмов. Мы уже показывали, как можно для λ(х)=х+1построить машину Тьюринга, изображая х в виде слова, состоящего из палочек, количество которых равно значению х (в частности, для х=0 количество палочек равно нулю, т. е. изображающее его слово является пустым). Полагая алфавит А состоящим из единственной буквы |, мы искомый нормальный алгоритм запишем в виде единственной формулы →•|•.
Интереснее нормальный алгоритм для вычисления λ(х)в случае, когда х записано в обычной десятичной системе счисления. В этом случае в качестве алфавита А возьмем перечень арабских цифр 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Нормальный алгоритм мы будем строить не в А, а над А, добавив к перечисленным буквам (цифры,. для нас — буквы) еще две буквы х и у. Ради экономии места столбец формул нашего алгоритма запишем в виде четырех подстолбцов.
Искомый нормальный алгоритм будет иметь вид
0y→•1 | 8y→•9 | x5→5x | 3x→3y |
1y→•2 | 9y→y0 | x6→6x | 4x→4y |
2y→•3 | y→•1 | x7→7x | 5x→5y |
3y→•4 | x0→0x | x8→8x | 6x→6y |
4y→•5 | x1→1x | x9→9x | 7x→7y |
5y→•6 | x2→2x | 0x→0y | 8x→8y |
6y→•7 | x3→3x | 1x→1y | 9x→9y |
7y→•8 | x4→4x | 2x→2y | →y |
Если бы этот алгоритм мы применили к исходному данному R= (пустому), то получили бы бесконечный процесс, промежуточными результатами которого были бы слова х, хх, ххх, . . . Это означает, что к пустому слову наш алгоритм неприменим. Его применение к слову R=299 дало бы промежуточные результаты х299 (в силу последней строки) 2x99, 29x9, 299х (в силу строк, расположенных в конце второго и начале третьего подстолбцов), 299у (в силу предпоследней формулы), 29у0, 2у00 (в результате двукратного применения второй формулы второго подстолбца), и привело бы к искомому результату 300 (в силу третьей формулы алгоритма). Мы получили бы λ(299)=300, что и требуется.
Внимательно рассматривая нормальные алгоритмы, мы видим, что они вполне соответствуют нашему пониманию алгоритма, но имеют очень частный характер. Большинство алгоритмов, встречающихся на практике, не являются нормальными алгоритмами. Но, безусловно, нормальные алгоритмы описаны с полной математической строгостью и точностью. Они вполне пригодны для тех целей, для которых были разработаны, а именно — для целей обоснования математики и исследования неразрешимости проблем.
Иной вопрос, как это делать. Для них, как и для рассмотренных нами других семейств избранных алгоритмов, выдвигается гипотеза (которую нельзя доказать, но можно принять, опираясь на весь предыдущий опыт человечества), известная под названием принципа нормализации.
Принцип нормализации. Каков бы ни был алгоритм, для которого допустимыми исходными данными и соответствующими им результатами являются слова в А, существует эквивалентный ему нормальный алгоритм над А.