Дискуссионный математический форумМатематический форум

Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 4 часа [ Летнее время ]
MathHelpPlanet.com RSS-лента Математического форума

Часовой пояс: UTC + 4 часа [ Летнее время ]


Нормальные алгоритмы Маркова

Нормальные алгоритмы Маркова


Теория нормальных алгоритмов (или алгорифмов, как называл их создатель теории) была разработана советским математиком А. А. Марковым (1903–1979) в конце 1940-х — начале 1950-х гг. XX в. Эти алгоритмы представляют собой некоторые правила по переработке слов в каком-либо алфавите, так что исходные данные и искомые результаты для алгоритмов являются словами в некотором алфавите.


Марковские подстановки


Алфавитом (как и прежде) называется любое непустое множество. Его элементы называются буквами, а любые последовательности букв — словами в данном алфавите. Для удобства рассуждений допускаются пустые слова (они не имеют в своем составе ни одной буквы). Пустое слово будем обозначать [math]\Lambda[/math]. Если [math]A[/math] и [math]B[/math] — два алфавита, причем [math]A\subseteq B[/math], то алфавит [math]B[/math] называется расширением алфавита [math]A[/math].


Слова будем обозначать латинскими буквами: [math]P,\,Q,\,R[/math] (или этими же буквами с индексами). Одно слово может быть составной частью другого слова. Тогда первое называется подсловом второго или вхождением во второе. Например, если [math]A[/math] — алфавит русских букв, то можем рассмотреть такие слова: [math]P_1= \text{paragraf},[/math] [math]P_2= \text{graf},[/math] [math]P_3=\text{ra}[/math]. Слово [math]P_2[/math] является подсловом слова [math]P_1[/math], а [math]P_3[/math] — подсловом [math]P_1[/math] и [math]P_2[/math], причем в [math]P_1[/math] оно входит дважды. Особый интерес представляет первое вхождение.


Определение 34.1. Марковской подстановкой называется операция над словами, задаваемая с помощью упорядоченной пары слов [math](P,Q)[/math], состоящая в следующем. В заданном слове [math]R[/math] находят первое вхождение слова [math]P[/math] (если таковое имеется) и, не изменяя остальных частей слова [math]R[/math], заменяют в нем это вхождение словом [math]Q[/math]. Полученное слово называется результатом применения марковской подстановки [math](P,Q)[/math] к слову [math]R[/math]. Если же первого вхождения [math]P[/math] в слово [math]R[/math] нет (и, следовательно, вообще нет ни одного вхождения [math]P[/math] в [math]R[/math]), то считается, что марковская подстановка [math](P,Q)[/math] неприменима к слову [math]R[/math].


Частными случаями марковских подстановок являются подстановки с пустыми словами:


[math](\Lambda,Q),\qquad (P,\Lambda),\qquad (\Lambda,\Lambda).[/math]

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


Преобразуемое словоМарковская подстановкаРезультат
138 578 926
(8 578 9, 00)
130 026
тарарам
(ара, Λ)
трам
шрам
(ра, ар)
шарм
функция
(Λ, ζ-)
ζ-функция
логика
лог
книга
книга
поляна
(пор, т)
[неприменима]

Для обозначения марковской подстановки [math](P,Q)[/math] используется запись [math]P\to Q[/math]. Она называется формулой подстановки [math](P,Q)[/math]. Некоторые подстановки [math](P,Q)[/math] будем называть заключительными (смысл названия станет ясен чуть позже). Для обозначения таких подстановок будем использовать запись [math]P\to\,.\,Q[/math], называя ее формулой заключительной подстановки. Слово [math]P[/math] называется левой частью, а [math]Q[/math] — правой частью в формуле подстановки.




Нормальные алгоритмы и их применение к словам


Упорядоченный конечный список формул подстановок


[math]\begin{cases}P_1\to (.)Q_1,\\ P_2\to (.)Q_2,\\ \cdots\cdots\cdots\cdots\\ P_r\to (.)Q_r, \end{cases}[/math]

в алфавите [math]A[/math] называется схемой (или записью) нормального алгоритма в [math]A[/math]. (Запись точки в скобках означает, что она может стоять в этом месте, а может отсутствовать.) Данная схема определяет (детерминирует) алгоритм преобразования слов, называемый нормальным алгоритмом Маркова. Дадим его точное определение.


Определение 34.3. Нормальным алгоритмом (Маркова) в алфавите [math]A[/math] называется следующее правило построения последовательности [math]V_i[/math] слов в алфавите [math]A[/math], исходя из данного слова [math]{V}[/math] в этом алфавите. В качестве начального слова [math]V_0[/math] последовательности берется слово [math]{V}[/math]. Пусть для некоторого [math]i\geqslant 0[/math] слово [math]V_i[/math] построено и процесс построения рассматриваемой последовательности еще не завершился. Если при этом в схеме нормального алгоритма нет формул, левые части которых входили бы в [math]V_i[/math], то [math]V_{i+1}[/math] полагают Равным [math]V_i[/math], и процесс построения последовательности считается завершившимся. Если же в схеме имеются формулы с левыми частями, входящими в [math]V_i[/math], то в качестве [math]V_{i+1}[/math] берется результат марковской подстановки правой части первой из таких формул вместо первого вхождения ее левой части в слово [math]V_i[/math]; процесс построения последовательности считается завершившимся, если на данном шаге была применена формула заключительной подстановки) и продолжающимся — в противном случае. Если процесс построения упомянутой последовательности обрывается, то говорят, что рассматриваемый нормальный алгоритм применим к слову [math]{V}[/math]. Последний член [math]{W}[/math] последовательности называется результатом применения нормального алгоритма к слову [math]{V}[/math]. Говорят, что нормальный алгоритм перерабатывает [math]{V}[/math] и [math]{W}[/math].


Последовательность [math]V_i[/math] будем записывать следующим образом:


[math]V_0 ~\Rightarrow~ V_1~ \Rightarrow~ V_2~ \Rightarrow~ \ldots~ \Rightarrow~ V_{m-1} ~\Rightarrow~ V_m[/math], где [math]V_0=V[/math] и [math]V_m=W[/math].

Мы определили понятие нормального алгоритма в алфавите [math]A[/math]. Если же алгоритм задан в некотором расширении алфавита [math]A[/math], то говорят, что он есть нормальный алгоритм над [math]A[/math].


Рассмотрим примеры нормальных алгоритмов.


Пример 34.4. Пусть [math]A=\{a,b\}[/math] — алфавит. Рассмотрим следующую схему нормального алгоритма в [math]A\colon[/math]


[math]\begin{cases}a\to\,.\,\Lambda,\\ b\to b.\end{cases}[/math]

Нетрудно понять, как работает определяемый этой схемой нормальный алгоритм. Всякое слово [math]{V}[/math] в алфавите [math]A[/math], содержащее хотя бы одно вхождение буквы [math]a[/math], он перерабатывает в слово, получающееся из [math]{V}[/math] вычеркиванием в нем самого левого (первого) вхождения буквы а. Пустое слово он перерабатывает в пустое. (Алгоритм не применим к таким словам, которые содержат только букву [math]b[/math].) Например,


[math]aabab~ \Rightarrow~ abab,\quad ab~ \Rightarrow~ b,\quad aa~ \Rightarrow~a,\quad bbab~\Rightarrow~bbb,\quad baba~ \Rightarrow~ bba.[/math]

Пример 34.5. Пусть [math]A=\{a_0,a_1,\ldots,a_n\}[/math] — алфавит. Рассмотрим схему


[math]\begin{cases}a_0\to \Lambda,\\ a_1\to \Lambda,\\ \cdots\cdots\cdots\cdots\\ a_n\to \Lambda,\\ \Lambda\to\,.\,\Lambda. \end{cases}[/math]

Она определяет нормальный алгоритм, перерабатывающий всякое слово (в алфавите [math]A[/math]) в пустое слово. Например,


[math]\begin{gathered}a_1a_2a_1a_3a_0~ \Rightarrow~ a_1a_2a_1a_3~ \Rightarrow~ a_2a_1a_3~ \Rightarrow~ a_2a_3~ \Rightarrow~ a_3~ \Rightarrow~ \Lambda;\\[2pt] a_0a_2a_2a_1a_3a_1~ \Rightarrow~ a_2a_2a_1a_3a_1~ \Rightarrow~ a_2a_2a_3a_1~ \Rightarrow~ a_2a_2a_3~ \Rightarrow~ a_2a_3~ \Rightarrow~ a_3~ \Rightarrow~\Lambda. \end{gathered}[/math]



Нормально вычислимые функции и принцип нормализации Маркова


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


Пример 34.6. В алфавите [math]A=\{A\}[/math] схема [math]\Lambda\to.1[/math] определяет нормальный алгоритм, который к каждому слову в алфавите [math]A=\{A\}[/math] (все такие слова суть следующие: [math]\Lambda,\,1,\,11,\,111,\,1111,\,11111[/math] и т.д.) приписывает слева 1. Следовательно, алгоритм реализует (вычисляет) функцию [math]f(x)=x+1[/math].


Пример34.7. Дана функция [math]\varphi_3(11\ldots1)= \begin{cases} 1,&\text{if}~n~ \text{delitsya na}~3,\\ \Lambda,&\text{if}~n~\text{ne delitsya na}~3,\end{cases}[/math] где [math]n[/math] — число единиц в слове [math]11\ldots1[/math]. Рассмотрим нормальный алгоритм в алфавите [math]A=\{1\}[/math] со следующей схемой:


[math]\begin{cases}111\to \Lambda,\\ 11\to.\Lambda,\\ 1\to.\Lambda,\\ \Lambda\to.1. \end{cases}[/math]

Этот алгоритм работает по такому принципу: пока число букв 1 а слове не меньше 3, алгоритм последовательно стирает по три буквы. Если число букв меньше 3, но больше 0, то оставшиеся буквы 1 или 11 стираются заключительно; если слово пусто, оно заключительно переводится в слово 1. Например:


[math]\begin{aligned}&1111111~ \Rightarrow~ 1111~ \Rightarrow~ 1~ \Rightarrow~ \Lambda;\\ &111111111~ \Rightarrow~ 111111~ \Rightarrow~ 111~ \Rightarrow~ \Lambda~ \Rightarrow~1. \end{aligned}[/math]

Таким образом, рассмотренный алгоритм реализует (или вычисляет) данную функцию.


Сформулируем теперь точное определение такой вычислимости функций.


Определение 34.8. Функция [math]f[/math], заданная на некотором множестве слов алфавита [math]A[/math], называется нормально вычислимой, если найдется такое расширение [math]B[/math] данного алфавита [math](A\subseteq B)[/math] и такой нормальный алгоритм в [math]B[/math], что каждое слово [math]{V}[/math] (в алфавите [math]A[/math]) из области определения функции [math]f[/math] этот алгоритм перерабатывает в слово [math]f(V)[/math].


Таким образом, нормальные алгоритмы примеров 34.6 и 34.7 показывают, что функции [math]f(x)=x+1[/math] и [math]\varphi_3(x)[/math] нормально вычислимы. Причем соответствующие нормальные алгоритмы удалось построить в том же самом алфавите [math]A[/math], на словах которого были заданы рассматривавшиеся функции, т.е. расширять алфавит не потребовалось [math](B=A)[/math]. Следующий пример демонстрирует нормальный алгоритм в расширенном алфавите, вычисляющий данную функцию.


Пример 34.9. Построим нормальный алгоритм для вычисления Функции [math]f(x)=x+1[/math] не в одноичной системе (как сделано в примере 34.6), а в десятичной. В качестве алфавита возьмем перечень арабских цифр [math]A=\{0,1,2,3,4,5,6,7,8,9\}[/math], а нормальный алгоритм будем строить в его расширении [math]B=A\cup\{a,b\}[/math]. Вот схема этого нормального алгоритма (читается по столбцам):


[math]\begin{array}{ccc}0b\to.1&\quad a0\to0a&\quad \\ 1b\to.2 &\quad a1\to1a&\quad 1a\to1b\\ 2b\to.3 &\quad a2\to2a&\quad 2a\to2b\\ 3b\to.4 &\quad a3\to3a&\quad 3a\to3b\\ 4b\to.5 &\quad a4\to4a&\quad 4a\to4b\\ 5b\to.6 &\quad a5\to5a&\quad 5a\to5b\\ 6b\to.7 &\quad a6\to6a&\quad 6a\to6b\\ 7b\to.8 &\quad a7\to7a&\quad 7a\to7b\\ 8b\to.9 &\quad a8\to8a&\quad 8a\to8b\\ 9b\to b0 &\quad a9\to9a&\quad 9a\to9b\\ b\to.1 &\quad 0a\to0b&\quad \Lambda\to a \end{array}[/math]

Попытаемся применить алгоритм к пустому слову [math]\Lambda[/math]. Нетрудно понять, что на каждом шаге должна будет применяться самая последняя формула данной схемы. Получается бесконечный процесс:


[math]\Lambda~ \Rightarrow~ a~ \Rightarrow~ aa~\Rightarrow~ aaa~\Rightarrow~ aaaa~\Rightarrow~\ldots[/math]

Это означает, что к пустому слову данный алгоритм не применим.


Если применить теперь алгоритм к слову 499, получим следующую последовательность слов: [math]499 \Rightarrow a499[/math] (применена последняя формула) [math]\Rightarrow 4a99[/math] (формула из середины второго столбца) [math]\Rightarrow 49a9 \Rightarrow 499b[/math] (дважды применена формула из конца второго столбца) [math]\Rightarrow 499b[/math] (предпоследняя формула) [math]\Rightarrow 49b0 \Rightarrow 4b00[/math] (дважды применена предпоследняя формула первого столбца) [math]\Rightarrow 500[/math] (применена формула из середины первого столбца).


Таким образом, слово 499 перерабатывается данным нормальным алгоритмом в слово 500. Предлагается проверить, что [math]328 \Rightarrow 329,~ 789 \Rightarrow 790[/math].


В рассмотренном примере нормальный алгоритм построен в алфавите [math]B[/math], являющемся существенным расширением алфавита [math]a[/math] (т.е. [math]A\subseteq B[/math] и [math]A\ne B[/math]), но данный алгоритм слова в алфавите [math]a[/math] перерабатывает снова в слова в алфавите [math]A[/math]. В таком случае говорят, что алгоритм задан над алфавитом [math]A[/math].


Создатель теории нормальных алгоритмов советский математик А. А. Марков выдвинул гипотезу, получившую название "Принцип нормализации Маркова". Согласно этому принципу, для нахождения значений функции, заданной в некотором алфавите, тогда и только тогда существует какой-нибудь алгоритм, когда функция нормально вычислима.


Сформулированный принцип, как и тезисы Тьюринга и Чёрча, носит внематематический характер и не может быть строго доказан. Он выдвинут на основании математического и практического опыта.


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




Совпадение класса всех нормально вычислимых функций с классом всех функций, вычислимых по Тьюрингу

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


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


▼ Доказательство

Пусть машина Тьюринга с внешним алфавитом [math]A=\{a_0,a_1, \ldots,a_m\}[/math] и алфавитом внутренних состояний [math]Q=\{q_0,q_1,\ldots, q_n\}[/math] вычисляет некоторую функцию [math]f[/math], заданную и принимающую значения в множестве слов алфавита [math]A[/math] (словарную функцию на [math]A[/math]). Попытаемся представить программу этой машины Тьюринга в виде схемы некоторого нормального алгоритма. Для этого нужно каждую команду машины Тьюринга [math]q_{\alpha}a_i\to q_{\beta}a_jX[/math] представить в виде совокупности марковских подстановок. Конфигурации, возникающие в машине Тьюринга в процессе ее работы, представляют собой слова в алфавите [math]A\cup Q[/math]. Эти слова имеют вид: [math]a_{i_1}\ldots a_{i_k}q_{\alpha} a_{i_{k+1}}\ldots a_{i}[/math]. Нам понадобится различать начало слова и его конец (или его левый и правый концы). Для этого к алфавиту [math]A\cup Q[/math] добавим еще два символа (не входящие ни в [math]A[/math], ни в [math]Q[/math]): [math]A\cup Q\cup \{u,v\}[/math]. Эти символы будем ставить соответственно в начало и конец каждого машинного слова [math]w\colon\, uwv[/math].


Пусть на данном шаге работы машины Тьюринга к машинному слову [math]{w}[/math] предстоит применить команду [math]q_{\alpha}a_i\to q_{\beta}a_jX[/math]. Это означает, что машинное слово [math]{w}[/math] (а вместе с ним и слово [math]uwv[/math]) содержит подслово [math]q_{\alpha} a_i[/math]. Посмотрим, какой совокупностью марковских подстановок можно заменить данную команду в каждом из следующих трех случаев:


а) [math]X=C[/math], т.е. команда имеет вид: [math]q_{\alpha}a_i\to q_{\beta}a_j[/math]. Ясно, что в этом случае следующее слово получается из слова [math]uwv[/math] с помощью подстановки [math]q_{\alpha}a_i\to q_{\beta}a_j[/math], которую мы и будем считать соответствующей команде [math]q_{\alpha}a_i\to q_{\beta}a_j[/math];


б) [math]X=L[/math], т.е. команда имеет вид: [math]q_{\alpha}a_i\to q_{\beta}a_jL[/math]. Нетрудно понять, что в этом случае для получения из слова [math]uwv[/math] следующего слова надо к слову [math]uwv[/math] применить ту подстановку из совокупности


[math]\begin{aligned}&a_0q_{\alpha}a_i~\to~ q_{\beta}a_0a_j\,;\\ &a_1q_{\alpha}a_i~\to~ q_{\beta}a_1a_j\,;\\ &\quad\vdots\\ &a_mq_{\alpha}a_i~\to~ q_{\beta}a_ma_j\,;\\ &uq_{\alpha}a_i~\to~ uq_{\beta}a_0a_j\,,\end{aligned}[/math]

которая применима к слову [math]uwv[/math]. В частности, последняя подстановка применима только тогда, когда [math]q_{\alpha}[/math] — самая левая буква в слове [math]{w}[/math], т.е. когда надо пристраивать ячейку слева;


в) [math]X=\Pi[/math], т.е. команда имеет вид: [math]q_{\alpha}a_i\to q_{\beta}a_j\Pi[/math]. В этом случае аналогично, чтобы получить из слова [math]uwv[/math] следующее слово, нужно к слову [math]uwv[/math] применить ту из подстановок совокупности


[math]\begin{aligned}&q_{\alpha}a_ia_0~ \to~ a_jq_{\beta}a_0\,;\\ &q_{\alpha}a_ia_1~ \to~ a_jq_{\beta}a_1\,;\\ &\quad\vdots\\ &q_{\alpha}a_ia_m~ \to~ a_jq_{\beta}a_m\,;\\ &q_{\alpha}a_iv~ \to~ a_jq_{\beta}a_0v\,. \end{aligned}[/math]

которая применима к слову [math]uwv[/math].


Поскольку слово [math]q_{\alpha}a_i[/math] входит в слово [math]{w}[/math] только один раз, то к слову [math]uwv[/math] применима только одна из подстановок, перечисленных в пунктах б,в. Поэтому порядки следования подстановок в этих пунктах безразличны, важны лишь их совокупности.


Заменим каждую команду из программы машины Тьюринга указанным способом совокупностью марковских подстановок. Мы получим схему некоторого нормального алгоритма. Теперь ясно, что применить к слову [math]{w}[/math] данную машину Тьюринга — это все равно, что применить к слову uwv построенный нормальный алгоритм. Другими словами, действие машины Тьюринга равнозначно действию подходящего нормального алгоритма. Это и означает, что всякая функция, вычислимая по Тьюрингу, нормально вычислима.


Верно и обратное утверждение.


Теорема 34.11. Всякая нормально вычислимая функция вычислима по Тьюрингу.




Эквивалентность различных теорий алгоритмов


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


Теорема 34.12. Следующие классы функций {заданных на натуральных числах и принимающих натуральные значения) совпадают:


[indent]а) класс всех функций, вычислимых по Тьюрингу;

б) класс всех частично рекурсивных функций;

в) класс всех нормально вычислимых функций.

[/indent]

Полезно уяснить смысл и значение этого важного результата. В разное время в разных странах ученые независимо друг от друга, изучая интуитивное понятие алгоритма и алгоритмической вычислимости, создали теории, описывающие данное понятие, которые оказались равносильными. Этот факт служит мощным косвенным подтверждением адекватности этих теорий опыту вычислений, справедливости каждого из тезисов Тьюринга, Чёрча и Маркова. В самом деле, ведь если бы один из этих классов оказался шире какого-либо другого класса, то соответствующий тезис Тьюринга, Чёрча или Маркова был бы опровергнут. Например, если бы класс нормально вычислимых функций оказался шире класса рекурсивных функций, то существовала бы нормально вычислимая, но не рекурсивная функция. В силу ее нормальной вычислимости она была бы алгоритмически вычислима в интуитивном понимании алгоритма, и предположение о ее нерекурсивности опровергало бы тезис Чёрча. Но классы Тьюринга, Чёрча и Маркова совпадают, и таких функций не существует. Это и служит еще одним косвенным подтверждением тезисов Тьюринга, Маркова и Чёрча.


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


Часовой пояс: UTC + 4 часа [ Летнее время ]


Яндекс.Метрика

Copyright © 2010-2016 MathHelpPlanet.com. All rights reserved