Научная статья на тему 'Преобразование моделей алгоритмов'

Преобразование моделей алгоритмов Текст научной статьи по специальности «Математика»

CC BY
492
265
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
РЕГУЛЯРНЫЕ ЯЗЫКИ / REGULAR EXPRESSIONS / РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ / КОНЕЧНЫЕ АВТОМАТЫ / FINITE AUTOMATA / МОДЕЛИ АЛГОРИТМОВ / MODEL ALGORITHMS / БЛОК-СХЕМЫ / BLOCK DIAGRAM

Аннотация научной статьи по математике, автор научной работы — Поляков Владимир Иванович, Скорубский Владимир Иванович

Рассматриваются преобразования регулярных выражений в конечные автоматы и обратные преобразования, относящиеся к теории алгоритмов и автоматов. Приведены преобразования этих моделей в блок-схемы и обратно.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

CONVERSION OF ALGORITHM MODELS

Conversion of regular expressions to finite automata and inverse conversion related to the theory of algorithms and automata are considered. Conversions of these models to block diagrams and backwards are presented. Application of the theory of algorithms to practical problems in algorithmic programming languages and testing of programs is discussed.

Текст научной работы на тему «Преобразование моделей алгоритмов»

УДК 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Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

i. Ахо А.., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов. М.: Мир, i979. 536 с.

i. Хопкрофт Дж., Мотвани Р., Ульман Дж. Введение в теорию автоматов, языков и вычислений. М.: Изд. дом „Вильямс", iOOi. 5iS с.

3. Шалыто А. А. Switch-технология. Алгоритмизация и программирование задач логического управления. СПб: Наука, i998. 6iS с.

4. Майоров С. А., Новиков Г. И., Немолочнов О. Ф. и др. Проектирование цифровых вычислительных машин. М.: Высш. школа, Ш!. 344 с.

Сведения об авторах

Владимир Иванович Поляков — канд. техн. наук, доцент; Санкт-Петербургский национальный иссле-

довательский университет информационных технологий, механики и оптики, кафедра вычислительной техники; E-mail: [email protected] Владимир Иванович Скорубский — канд. техн. наук, доцент; Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики, кафедра вычислительной техники; E-mail: [email protected]

Рекомендована кафедрой Поступила в редакцию

вычислительной техники 08.02.12 г.

i Надоели баннеры? Вы всегда можете отключить рекламу.