рисование минимального DFA для данного регулярного выражения

Каков прямой и простой подход к рисованию минимального DFA, который принимает тот же язык, что и данный Regular Expression(RE).
Я знаю, что это можно сделать с помощью:

Regex ---to----► NFA ---to-----► DFA ---to-----► minimized DFA

Но есть ли короткий путь? лайк за (a+b)*ab


person Niraj Rana    schedule 07.12.2012    source источник
comment
Я не думаю, что есть ярлык.   -  person John Dvorak    schedule 08.12.2012
comment
Я думаю, что есть некоторые алгоритмы, упомянутые в компиляторах: принципы, методы и инструменты от AHO, SETHI и ULLMAN. автор(ы) написали метод создания dfa непосредственно из регулярного выражения. Но я не мог этого понять.   -  person Niraj Rana    schedule 08.12.2012
comment
@NirajRana дай мне ссылку .. о какой теме ты говоришь   -  person Grijesh Chauhan    schedule 22.02.2013


Ответы (1)


Регулярное выражение для DFA

Хотя НЕТ алгоритмического сокращения для рисования DFA из регулярного выражения (RE), но метод сокращения возможен путем анализа, а не путем вывода, он может сэкономить ваше время при рисовании минимизированного DFA. Но конечно технику можно освоить только на практике. Я беру ваш пример, чтобы показать мой подход:

(a + b)*ab   

Во-первых, подумайте о языке регулярного выражения. Если трудно определить, что такое описание языка с первой попытки, то найдите наименьшие возможные строки, которые можно сгенерировать на языке, а затем найдите второй наименьший.....

Запомните решение некоторых основных регулярных выражений. Например, я записал здесь некоторую основную идею написания леволинейного и прямолинейные грамматики непосредственно из регулярного выражения. Точно так же вы можете написать для построения минимизированного dfa.

В RE (a + b)*ab наименьшая возможная строка — ab, потому что с помощью (a + b)* можно сгенерировать NULL(^) строку. Вторая наименьшая строка может быть либо aab, либо bab. Теперь одна вещь, которую мы можем легко заметить о языке, заключается в том, что любая строка на языке этого RE всегда заканчивается на ab (суффикс), тогда как префиксом может быть любая возможная строка, состоящая из a и b, включая ^.

Также, если текущий символ a; тогда один из возможных шансов состоит в том, что следующим символом будет b и конец строки. Таким образом, в dfa нам требовался такой переход, чтобы всякий раз, когда символ b шел после символа a, он должен был перемещаться в одно из конечных состояний в dfa.

Затем, если новый символ приходит в конечное состояние, мы должны перейти в какое-то нефинальное состояние, потому что любой символ после b возможен только в середине некоторой строки на языке, так как вся языковая строка заканчивается суффиксом 'ab' .

Таким образом, с этими знаниями на данном этапе мы можем нарисовать неполную диаграмму перехода, как показано ниже:

--►(Q0)---a---►(Q1)---b----►((Qf< /под>))

Теперь в этот момент вам нужно понять: каждое состояние имеет какое-то значение, например

(Q0) означает = Начальное состояние
(Q1) означает = Последний символ был «a», и с помощью еще одного «b» мы можем перейти к конечное состояние
(Qf) означает = последние два символа были 'ab'

Теперь подумайте, что произойдет, если символ a перейдет в конечное состояние. Просто больше, чтобы указать Q1, потому что это состояние означает, что последний символ был a. (обновленная диаграмма перехода)

--►(Q0)---a---►(Q1)---b----►((Qf))  
                ▲-----a--------|  

Но предположим, что вместо символа a в конечном состоянии появляется символ b. Затем мы должны перейти из конечного состояния в какое-то не конечное состояние. В данном графе переходов в этой ситуации мы должны сделать переход в начальное состояние из конечного состояния Qf.(поскольку нам снова нужно ab в строке для принятия)

--►(Q0)---a---►(Q1)---b----►((Qf))  
     ▲          ▲-----a--------|  
     |----------------b--------|  

Этот график все еще неполный! потому что нет исходящего ребра для символа a из Q1. А для символа a в состоянии Q1 требуется автоцикл, потому что Q1 означает, что последний символ был a.

                a-  
                ||
                ▼|
--►(Q0)---a---►(Q1)---b----►((Qf))  
     ▲          ▲-----a--------|  
     |----------------b--------|     

Теперь я считаю, что все возможные исходящие ребра присутствуют из Q1 и Qf на приведенном выше графике. Одно недостающее ребро — это исходящее ребро из Q0 для символа b. И должен быть цикл в состоянии Q0, потому что снова нам нужна последовательность ab, чтобы строка могла быть принята. (смещение от Q0 до Qf возможно с помощью ab)

    b-          a-  
    ||          ||
    ▼|          ▼|
--►(Q0)---a---►(Q1)---b----►((Qf))  
     ▲          ▲-----a--------|  
     |----------------b--------|      

Теперь DFA готов!

Конечно, метод может показаться сложным при первых нескольких попытках. Но если вы научитесь рисовать таким образом, вы заметите улучшение своих аналитических способностей. И вы обнаружите, что этот метод является быстрым и объективным способом рисования DFA.

* В приведенной мной ссылке я описал еще несколько регулярных выражений, я настоятельно рекомендую вам изучить их и попытаться создать DFA для этих регулярных выражений.

person Grijesh Chauhan    schedule 24.12.2012
comment
Найдите еще несколько примеров в разделе EDIT документа мой ответ Я рисую той же техникой. - person Grijesh Chauhan; 02.03.2013
comment
Грижеш бхаи, мне нужна твоя помощь. Посоветуйте мне хорошую книгу по теории автоматов. - person haccks; 12.09.2013
comment
@hackcks Peter Linz — относительно простая книга, хорошая для студентов - person Grijesh Chauhan; 12.09.2013
comment
А как насчет теории вычислений К.Л.П. Мишры и теории автоматов Ульмана и Хопкрафта? - person haccks; 12.09.2013
comment
@hackks Ульман и Хопкрафт сложны, и сначала нужно время, чтобы их прочитать. K.L.P Mishra в порядке, ничего не объясняет, похоже, что написано математиком. Я думаю, что студенту, изучающему информатику, понравится Питер Линц. Кстати, я прочитал все 3. -grammar/7717#7717">Видео лекции - person Grijesh Chauhan; 12.09.2013
comment
@hackks Я ответил почти на все основные темы, некоторые из них я также прикрепил к своему профилю. - person Grijesh Chauhan; 12.09.2013
comment
@hackcks Очень хорошие видео, но для продвинутых тем, начиная с ТМ и далее: youtube.com/watch?v=oF92Z7qVivs - person Grijesh Chauhan; 29.09.2013
comment
@hackcks Проверьте эта книга Выглядит хорошо - person Grijesh Chauhan; 08.10.2013