УДК 510.5
В. И. Поляков, В. И. Скорубский ПРЕОБРАЗОВАНИЕ МОДЕЛЕЙ АЛГОРИТМОВ
Рассматриваются преобразования регулярных выражений в конечные автоматы и обратные преобразования, относящиеся к теории алгоритмов и автоматов. Приведены преобразования этих моделей в блок-схемы и обратно.
Ключевые слова: регулярные языки, регулярные выражения, конечные автоматы, модели алгоритмов, блок-схемы.
Введение. Практика программирования предполагает решение задачи, а не получение доказательства того, что она разрешима. Вместе с тем в теории алгоритмов исследованы методы и модели, которые используются в программировании. К числу таких моделей относят регулярные языки и конечные автоматы. В практической реализации алгоритмов используются алгоритмические языки и блок-схемы. В настоящей работе рассматриваются преобразования моделей в блок-схемы и обратно.
Представить формальное описание алгоритма можно с помощью формального описания решаемой задачи, в то время как имеется неформальное (вербальное) описание задачи и соответственно переход к алгоритму будет также неформальным, и требуются верификация, тестирование и многократные итерации для приближения к допустимому решению.
Формализованное описание может быть получено с помощью регулярных языков [1, 2]. Ставится задача разработки алгоритма распознавания принадлежности фрагмента любого текста конкретному регулярному языку; доказывается, что регулярный язык может быть формально преобразован в модель алгоритма решения этой задачи за конечное число шагов. Такой моделью является конечный автомат (КА).
Расширения регулярных языков находят применение при описании лексики формальных алгоритмических языков, при описании алгоритмов редактирования, поиска по шаблону, в современном программировании (языки Perl, Java, Phyton, C#, PHP), в компиляторах и системах управления обработкой данных, реализованных в операционных системах. Следовательно, для алгоритмического решения таких задач может быть использован конечный автомат.
Преобразование регулярных выражений в конечные автоматы. Для любого регулярного языка, представленного регулярным выражением (РВ), можно построить КА — распознаватель слов, допустимых в языке.
Рассмотренная в работе [2] методика преобразования может быть упрощена с учетом алгебраических свойств операций регулярного выражения:
— последовательности символов, помещенных в скобки с операцией сложения, имеют общее начальное состояние перед открывающей скобкой и конечное после закрывающей;
— цикл может иметь произвольное число повторений. При пустом числе циклов (итераций) сохраняется начальное состояние;
— в конкатенации нескольких символов различимые состояния заменяют конкатенацией пары символов. Например, в следующем регулярном выражении определены состояния в правильных арифметических операторах и выбраны позиции — состояния КА [1]:
L(M)=(ab + b)((c + a)b)*, 0 12 2 2 32
где L(M) — язык, допускаемый автоматом М; a, b, c — символы входного языка КА; ((c + a)b)* — множество всех цепочек, начинающихся с символов c или a и оканчивающихся символом b; 0 — начальное, 2 — конечное, 1 и 3 — промежуточные состояния.
Общие оценки числа состояний и переходов КА определяются следующим образом:
— число переходов (ребер графа) КА равно п+1, где п — число букв в регулярном выражении (в данном примере п=6);
— в полностью определенном КА нижнюю границу числа состояний m определяют из условия ms=n+1, где s — число символов входного алфавита (в данном случае s=3, 3m=7 и m=]7/3[=3);
— если ms>n+1, то автомат является частично определенным и верхняя граница числа состояний k < п+1 — количество позиций в регулярном выражении (в данном примере Л=7).
Состояния размещаются в выбранные для них позиции и формируются тройки (qi w ■ обозначающие переходы из состояния qi в q7■, w — символ входной цепочки символов предложения регулярного языка:
Ь(Ы)=(аЪ + Ъ)((с + а )Ъ)* = ((0а1)(1Ъ2) +(0Ъ2)) ((2(с +а)3)(3Ь2))* = 0 12 2 3 2
=0(а1Ъ + Ъ)2((с + а)3Ъ2)*.
Линейная помеченная строка символов заменяется графом КА. На рис. 1 приведен детерминированный КА, распознающий символы языка Ь(Ы). Начальное состояние 0 указано направленной на него стрелкой, а конечное 2 обведено жирным кружком.
Рис. 1
Состояния qi и q связаны дугой ^, ■ если существует смежный символ в отмеченном регулярном выражении, и дуга помечается этим символом.
Преобразование недетерминированного конечного автомата в детерминированный.
В общем случае регулярное выражение может быть преобразовано в недетерминированный конечный автомат (НДКА).
Пример. Рассмотрим следующее регулярное выражение:
Ь(Ы)=аа*Ъй* + ай* = (аа*Ъ + а)й* =(0а1(а1)*Ъ + 0а)2(й2)*.
0 1 2
Недетерминированный КА, распознающий входные цепочки символов языка Ь(Ы),
Рис. 2
Утверждение. Для НДКА можно построить эквивалентный ДКА.
Преобразование по методике, описанной в работе [2], можно представить следующей упрощенной процедурой:
1) на г-м шаге множество состояний ДКА обозначим Qi. Q0 обозначает множество состояний в НДКА;
2) находим различимые подмножества следующих состояний для всех условий применяемых к Qi, и включаем их в множество Qi+1. Итерации повторяются, пока Qi Ф Qi+1;
3) на каждом шаге недетерминированные переходы в состояния {цг} и {■ становятся детерминированными при объединении их в одно состояние {{1},{2}}. Детерминированные выходы из {{1},{2}} сохраняются.
Лемма. Число состояний в ДКА не превышает 2т-1, где т — число состояний в НДКА.
Число 2т-1 — количество собственных подмножеств множества, состоящего из т различимых элементов. Следовательно, процедура конечна.
Выполним преобразование НДКА в ДКА для автомата, представленного на рис. 2:
00 ={о, 1, 2},
Ql= {0, 1, 2, {1, 2}}.
Эквивалентный детерминированный автомат содержит четыре состояния и определен тем же регулярным выражением Ь(Ы')=Ь(М), состояния {2} и {1, 2} включают финальное состояние {2} из НДКА и становятся финальными в ДКА. Недетерминированные переходы в состояния {1} и {2} становятся детерминированными при объединении их в {1, 2}. Детерминированные выходы из {1, 2} сохраняются (рис. 3).
а г \ ч.
а
Рис. 3
Преобразование детерминированного конечного автомата в регулярное выражение может быть полезно, если КА является естественной формой описания алгоритма в задачах логического управления или получен преобразованием блок-схем.
Конечные автоматы могут применяться в качестве моделей алгоритмов для непосредственного программирования задач управления объектами [3].
К регулярному выражению применяются алгебраические преобразования и повторное обратное преобразование, позволяющее получить другие эквивалентные модели алгоритма (НДКА, минимальные ДКА и др.).
Пример. Дан КА (рис. 4).
0, 1
1
Рис. 4
Рассмотрим метод прямого преобразования КА в регулярное выражение:
1) выбрать циклы и для них последовательно представить дуги тройками вида (qi w gj);
2) смежные дуги заменить последовательно тройками
L(M = p(p1p)*(p0q1p)*p0q0r(r(0+1)r)*;
3) пропустить первое состояние и сохранить полученное выражение
L(M = p(1p)*(0q1p)*p0q0r((0+1)r)*;
4) отметки-состояния рассматривать как позиции в регулярном выражении и выписать их
L(M = p(1p)*(0q1p)*p0q0r((0+1)r)* = p p q p p q г Г
= (1)*(0 1)*0 0(0+1)* = (1*+0 1)*0 0(0+1)*. P P q P Pq Г Г p p q p q Г Преобразование блок-схемы алгоритма в конечный автомат. Используя конструктивный метод преобразования блок-схем алгоритмов в КА [4], выполним преобразование на примере блок-схемы алгоритма умножения „в столбик" S=A*B. Содержательное описание алгоритма умножения:
— множимое А = (ап-1 ап-2 ... а1 а0) — «-разрядное десятичное число;
— множитель В = (Ьп-1 Ьп-2 ... Ь1 Ь0) — «-разрядное десятичное число;
— произведение £ — 2п-разрядное десятичное число, которое вычисляется суммированием частичных произведений со сдвигом влево на один десятичный разряд:
А• Ьо А• Ь
A'b„
£= £2и-1 £2п-2 • • • £0.
В результате получена рекуррентная формула вычисления частичных произведений £¿+1 = +10 (А*Ьг). Предполагается, что вычисление частичных произведений, сдвиг и суммирование — эффективные операции. Блок-схема алгоритма умножения приведена на рис. 5.
(^^Начало^^)
1
S=0, /=1
qo/а
9х/Р
Рис. 5
Операторные вершины, а также начальная (ввод) и конечная (вывод) обозначаются как состояния КА, они обеспечивают задержку, необходимую для выполнения соответствующих операций. Задержки-состояния можно выбирать также для упрощения условий ветвления. В данном случае для этой цели можно включить промежуточное состояние q5.
Таким образом, получено множество состояний Q ={qo, qi, ..., q4, q5}. Входной алфавит определяет множество символов, кодирующих обозначенные в условных вершинах предикаты и принимающие двоичные значения {true, false}. Переходы из одного состояния в другое могут быть представлены конъюнкциями значений входных переменных {х1, x2}.
Функции переходов КА определены в таблице.
q qi qi qs q4 qs
qo T —
qi — -Xi — — Xi
qi — — -Xi Xi —
qs — -Xi — — Xi
q4 — — — — —
qs — — -Xi Xi —
Функции выходов, формируемых в состояниях, обозначим символами-командами выходного алфавита Ж={а, в, 5, у, ф, ц} и поставим им в соответствие состояния КА. Очевидно, что модель алгоритма в виде КА легко преобразуется в блок-схему, следовательно, всегда может быть выполнен переход к формальному описанию алгоритма на алгоритмическом языке и в виде программы.
При преобразованиях алгоритмов, представленных блок-схемами, могут быть использованы частичные КА.
Особенности использования частичных автоматов в программировании зависят от типа задачи, решаемой алгоритмическим методом:
— для распознавателей языка — ограничение на регулярный язык;
— для алгоритмов преобразования данных — ограничение на область значений данных и результатов выполнения преобразований;
— для алгоритмов управления — ограничение на входные данные.
В случае распознавателей предложений языка при тестировании признаки частичных автоматов могут быть использованы для контроля и выявления предложений, не принадлежащих языку.
Доопределение переходов можно использовать для контроля и тестирования программы в процессе исполнения. Для этого выполняется замена логических условий символами входного алфавита Е*={Т, а, Ь, с, а}, где а= —х1, Ь= х1, с= -х2, ё= х2, q0 — начальное и q4 — финальное состояние:
L(M =(0Т1){[(1а2)(((2с3)(3а2))*(2а4)+(2с3)((3Ь5)(5с3))*(3Ь5)(5а4)] + +(1Ь5)[((5с3)(3Ь5))*(5а4)+(5с3)((3Ь5)(5с3))*((3а2)(2с3))*(3а2)(2а4)]}= =Т[а((са)*а+с(Ьс)* Ьа)+Ь((сЬ)*а+с(Ьс)*(ас)*а^]= =Т[а((са)*+с(Ьс)*Ь)+Ь((сЬ)*+с(Ьс)*(ас)*а]а= =Т[а((са)* +с(Ьс)*Ь) +Ь((сЬ)* +с(Ьс)*(ас)*а]а= = Т[а((са)* +Л) +Ь((сЬ)* +^ас)*а]ё,
^ — переводит КА в состояние, которое запускает КА, распознающий строку с(Ьс)*.
Модель алгоритма умножения в символах входного алфавита приведена на рис. 6.
Заключение. Алгоритм может быть представлен в формальной записи - конечными автоматами, синтаксическим разбором, рекурсивными функциями, регулярными выражениями. В работе рассмотрены методы преобразования моделей алгоритмов: регулярных выражений в конечные автоматы; недетерминированного конечного автомата в детерминированный; детерминированного конечного автомата в регулярное выражение; блок-схем в конечные автоматы и обратно. С помощью приведенных преобразований можно проектировать программы вычислительных машин. Скомпилированные по этим моделям программы не требуют верификации, так как получение этих моделей является доказательством существования алгоритма.
а
Рис. 6
Работа выполнена при поддержке Российского фонда фундаментальных исследований (грант № И-07-00376-а).
СПИСОК ЛИТЕРАТУРЫ
i. Ахо А.., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов. М.: Мир, i979. 536 с.
i. Хопкрофт Дж., Мотвани Р., Ульман Дж. Введение в теорию автоматов, языков и вычислений. М.: Изд. дом „Вильямс", iOOi. 5iS с.
3. Шалыто А. А. Switch-технология. Алгоритмизация и программирование задач логического управления. СПб: Наука, i998. 6iS с.
4. Майоров С. А., Новиков Г. И., Немолочнов О. Ф. и др. Проектирование цифровых вычислительных машин. М.: Высш. школа, Ш!. 344 с.
Сведения об авторах
Владимир Иванович Поляков — канд. техн. наук, доцент; Санкт-Петербургский национальный иссле-
довательский университет информационных технологий, механики и оптики, кафедра вычислительной техники; E-mail: v_i_polyakov@mail.ru Владимир Иванович Скорубский — канд. техн. наук, доцент; Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики, кафедра вычислительной техники; E-mail: vlis@km.ru
Рекомендована кафедрой Поступила в редакцию
вычислительной техники 08.02.12 г.