
ПЗ_03
.doc
ПЗ-03 Нормальные алгоритмы Маркова
1 Цель занятия изучить методику разработки и трассировки работы нормальных алгоритмов Маркова (НАМ).
2 Краткие методические указания. Любое
преобразование информации можно свести
к преобразованию слов некоторого
алфавита. Например
=1.4142…
,
=1.7120
описание преобразования обозначения
величины корня из двух и трех в их
значения в виде чисел. Однако такое
перечисление значений не обладает
свойством массовости. А калькулятор,
из которого взяты эти значения, выполняет
алгоритм, который этим свойством
обладает. На этом занятии мы изучим
методику описания и трассировки
алгоритмов предложенных советским
ученым Марковым. На сайте
http://cmcmsu.no-ip.info/1course/alg.schema.nam.htm#
дано краткое описание методики описания
алгоритмов Маркова и размещен эмулятор,
который выполняет эти алгоритмы.
Рассмотрим пример построения и трассировки работы НАМ. Рассматриваются слова в алфавите А={0,1}. Требуется описать НАМ, который заменит в слове из алфавита А все 0 на 1 и 1 на 0.
Нормальный алгоритм может быть таким:
0→1
1→0
Однако этот алгоритм не результативен. Он завершается только для пустого слова, так как в нем нет символов. Для любого другого слова из алфавита А алгоритм будет бесконечно заменять значение первого символа. Для получения результативного алгоритма введем в алфавит дополнительный символ, например *. Этот символ (маркер), будет обозначать позицию обрабатываемого символа и позволит завершить выполнение за конечное число шагов.
Алгоритм может быть таким:
1 *0→1* Обработка очередного символа 0 и сдвиг маркера к следующему символу;
2 *1→0* Обработка очередного символа 1 и сдвиг маркера к следующему символу;
3 * Заключительная формула преобразования и стирание маркера;
4 →* Установка маркера перед первым символом слова.
Этот НАМ состоит из четырех формул подстановки. Первые две формулы заменяют значение символа и продвигают символ * - маркер позиции. Третья формула является заключительной. Она выполняется, если маркер достиг конца слова. В трассе мы будем записывать шаги выполнения алгоритма. Вначале будем записывать состояние слова с подчеркиванием обнаруженного фрагмента для замены, затем номер формулы подстановки в круглых скобках, затем вид формулы подстановки и результат подстановки. Знак → означает обычную подстановку, а знак - заключительную.
Трасса работы алгоритма для слова 1001 будет следующей
1001 (4) → *1001 Ставим дополнительный символ перед словом
*1001 (2)→ 0*001 Заменяем первую 1 на 0 и продвигаем *
0*001 (1)→ 01*01 Заменяем 0 на 1 и продвигаем *
01*01 (1)→ 011*1 Заменяем 0 на 1 и продвигаем *
011*1 (2)→ 0110* Заменяем 1 на 0 и продвигаем *
0110* (3) 0110 Стираем * и завершаем
В рабочее поле эмулятора не следует записывать номера правил.
Если рассматривать входное слово как двоичный вектор, то этот алгоритм выполняет инверсию двоичного вектора.
Рассмотрим решение некоторых задач из [1].
1 Замена bb на ddd и стирание с в словах алфавита А={abcd}.
c->
bb=>ddd
1 Стираем в слове все с
2 заменяем первую пару bb на ddd.
Для слова abcdbbbcd получим трассу выполнения.
аbcdbbbcd (1)→abdbbbcd исключили первую букву с
abdbbbcd (1)→abdbbbd исключили вторую букву с
abdbbbd (2)→abddddbd заменили bb на ddd
Завершили так как ни одно из правил не применяется.
После применения алгоритма к слову abcdbbbcd получим Результат: abddddbd
bbcddabbcd - Результат: dddddadddd
cbbbbdcbba - Результат: dddddddddda
2 Размещаем в слове сначала буквы а, а затем b.
ba->ab
abbabbaaabb (1)→ababbbaaabb
ababbbaaabb (1)→aabbbbaaabb
aabbbbaaabb (1)→ aabbbabaabb
aabbbabaabb (1)→ aabbabbaabb
aabbabbaabb (1)→ aababbbaabb
aababbbaabb (1)→ aaabbbbaabb
aaabbbbaabb (1)→ aaabbbababb
aaabbbababb (1)→ aaabbabbabb
aaabbabbabb (1)→ aaababbbabb
aaababbbabb (1)→ aaaabbbbabb
aaaabbbbabb (1)→ aaaabbbabbb
aaaabbbabbb (1)→ aaaabbabbbb
aaaabbabbbb (1)→ aaaababbbbb
aaaababbbbb (1)→ aaaaabbbbbb
Алгоритм завершен так как нет подстановок.
3 стираем первый символ в слове алфавита A={a,b}
*a=>
*b=>
* =>
->*
(4) Устанавливаем символ * перед словом.
(1,2) Удаляем первый символ и завершаем.
(3) Завершение для пустого слова.
baab (4)→ *baab
*baab (2)→ aab
4 Записать символ а в конец слова алфавита А={a,b}.
*a->a*
*b->b*
*=>a
->*
(4) устанавливаем маркер * перед словом.
(1,2) Сдвигаем маркер к концу слова.
(3) Завершаем с вставкой символа а вместо маркера в конце слова.
Нормальный алгоритм Маркова целесообразно разрабатывать поэтапно. Вначале описать процесс подготовки к решению основной задачи, затем последовательно описывать остальные процессы. Рассмотрим процесс описания алгоритма перевода унарного числа в позиционное двоичное число.
Перевод унарного числа в двоичную систему счисления.
1-й шаг(H1). Маркер = вправо.
1) =| --> |= Двигаем маркер = вправо
2) = -->. = Завершаем, если он справа
3) ^ --> = Устанавливаем маркер = в начале слова.
Применяя алгоритм к слову ||||| получим Результат: |||||=.
2-й шаг(Н2). Маркер влево.
Деление на 2 будем делать двигая маркер вправо на две единицы. Но маркер = уже использовался. Поэтому вместо завершающего правила 2) = -->. = выполняем правило установки нового маркера * в правиле 4. Добавляем правило 2 сдвига маркера * влево и завершаем в правиле 3 при достижении маркером * начала слова.
Новый алгоритм H2 получаем как композицию алгоритма H2 и H1. Для этого вместо подчеркнутого заключительного правила в алгоритме Н1 записываем правила алгоритма Н2. Алгоритм Н2 работает со словом Р=, которое получено после работы алгоритма Н1 со словом Р Н2=Н2(Н1(Р)).
1) =| --> |= Двигаем маркер = вправо H1
2) |* --> *| Двигаем маркер * влево H2
3) * -->. * Завершаем, если маркер * слева. H2
4) = --> *= Установка нового маркера * справа H2
5) ^ --> = Устанавливаем маркер = в начале слова. H1
Применяя алгоритм к слову ||||| получим Результат: *|||||=
3-й шаг (Н3). Получаем остаток от деления на 2
После перемещения маркера * в начало слова заменяем его на маркер & (правило 6) и продвигаем его на две единицы вправо с заменой пары единиц на одну (деление). Завершаем (4,5) после того как маркер & достигнет маркера =.
Новый алгоритм Н3=Н3(Н2(Н1(Р))) получаем заменяя заключительное правило алгоритма Н2 алгоритмом Н3.
1) =| --> |= Двигаем маркер = вправо Н1
2) |* --> *| Двигаем маркер * влево Н2
3) &|| --> |& Двигаем маркер & вправо и делим, заменяя || на | Н3
4) |&= -->. |*=0 Завершаем с записью остатка 0, если получили |&= Н3
5) &|= -->. *=1 Завершаем с записью остатка 1, если получили &|= Н3
6) * --> & Замена маркера * на & Н3
7) = --> *= Установка нового маркера * справа Н2
8) ^ --> = Устанавливаем маркер = в начале слова. Н1
Применяя алгоритм к слову ||||| получим Результат: ||*=1
4-й шаг(Н4). Перевод унарного числа в двоичную систему счисления.
В правилах (4,5) не завершаем, делаем замену маркера & на маркер *. После этого маркер * сдвигаем в начало слова (частного) и определяем новый остаток.
Алгоритм Н4=Н4(Н3(Н2(Н1(Р)))) получим как композицию алгоритма Н4 и алгоритма Н3, заменив заключительные правила алгоритма Н3 обычными правилами подстановки и добавив заключительное правило алгоритма Н4 (*= -->. =).
1) =| --> |= Н1
2) |* --> *| Н2
3) &|| --> |& Н3
4) |&= --> |*=0 Н3
5) &|= --> *=1 Н3
6) *= -->. = Н4
7) * --> & Н3
8) = --> *= Н2
9) ^ --> = Н1
Применяя алгоритм к слову |||||, которое представляет число 5 получим Результат: =101.
Применеие алгоритма Н4 можно продемонстрировать следующей последовательностью преобразований
m
3 Порядок выполнения задания.
3.1 Изучить методику разработки НАМ [1] и методику трассировки работы НАМ .
3.2 Изучить порядок разработки НАМ для перевода числа из унарной системы в двоичную.
3.3 Описать НАМ и выполнить трассировку работы НАМ для задачи 2.i из [1], где i Ваш номер варианта в классном журнале.
3.4 Описать НАМ для перевода унарного числа в систему счисления с основанием (№mod5)+3, где № Ваш номер в классном журнале.
Литература
1 В. Н. Пильщиков, В.Г Абрамов, А.А. Вылиток, И.В. Горячая. Машина Тьюринга и алгоритмы Маркова. Решение задач. (Учебное пособие) М. 2006г (http://cmcmsu.no-ip.info/1course/ электронный ресурс)
2 Эмулятор нормальных алгоритмов Маркова. Электронный ресурс: http://cmcmsu.no-ip.info/1course/alg.schema.nam.htm#
3 Эмулятор НАМ - http://binofem.wallst.ru/