вопросы по нфа и дфа - PullRequest
       17

вопросы по нфа и дфа

2 голосов
/ 24 апреля 2010

Надеюсь, вы поможете мне с этим ....

У меня есть главный вопрос: как определить, будет ли регулярное выражение приниматься NFA и / или DFA ?

Например, Мой вопрос говорит о том, что из регулярных выражений эквивалентны? объяснить ... 1. (а + б) ** б (а + б) ** б (а + б) *

2.а ба ба *

3.a ба Ь (а + б) *

Должны ли мы нарисовать NFA и DFA, а затем найти алгоритм минимизации? если мы это сделаем, то как мы узнаем, какое регулярное выражение принято NFA / DFA, чтобы мы могли начать с ответа? это так запутанно ....

Во-вторых, это очень похоже, вопрос требует от меня показать, что язык (a ^ nb ^ n | n> 1} не принят DFA ... grrrrr ... откуда я это знаю? (Кстати это набор всех строк, в которых за числом a следует одинаковое количество b) ....

Надеюсь, я все хорошо объяснил ...

Ответы [ 3 ]

3 голосов
/ 24 апреля 2010

Во-первых, примечание о терминологии: язык - это набор строк в некотором алфавите. DFA и NFA распознают обычные языки , а не регулярные выражения . Может быть несколько регулярных выражений, которые определяют один и тот же язык. Для двух языков L1 и L2, если каждый член L1 является членом L2, и наоборот, L1 и L2 эквивалентны.

Что касается вашего первого вопроса, язык L1 состоит из всех строк по {a, b} с не менее двумя 'b's. Язык L2 состоит из всех строк над {a, b} с в точности двумя 'b's. Строка "abbb" является элементом L1 и L3, но не L2. Так что оставляет L1 и L3 сравнивать. Любой элемент S из L1 должен содержать как минимум два символа «b». Пусть первые два "б" в S соответствуют двум явным 'b' в выражении E3; тогда другие компоненты a*, a* и (a+b)* всегда могут быть сопоставлены, и S должно быть в L3. Следовательно, L1 является подмножеством L3. Точно так же любой элемент S в L3 должен содержать по крайней мере два 'b'. Пусть они совпадают с двумя явными 'b' в выражении E1; другие компоненты (a+b)*, (a+b)* и (a+b)* также будут есть совпадения, и S тоже в L1. Таким образом, L1 является подмножеством L3, а L3 является подмножеством L1, поэтому L1 и L3 должны быть эквивалентны.

По поводу вашего второго вопроса: используйте насосную лемму . Предположим, у вас есть DFA, который принял этот язык ... покажите, что он также должен принимать строки не на этом языке, поэтому такой DFA не может существовать. Пусть S будет любой строкой в ​​языке ... любая подстрока в S будет иметь либо все a, либо все b, либо оба ... так что произойдет после того, как вы "накачаете" ее?

2 голосов
/ 24 апреля 2010

NFA и DFA принимают эквивалентные (обычные) языки, поэтому один из способов показать, что язык является регулярным, - создать для него NFA или DFA.

Чтобы показать, что язык отсутствует в классе, вы обычно используете лемму прокачки.

В Википедии очень похожий пример, за исключением того, что n> = 0; Я не закончу твою домашнюю работу для тебя.

http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages

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

0 голосов
/ 24 апреля 2010

Если вас просят показать, что какой-то язык не принят DFA / NFA, вы почти всегда должны применять насосную лемму , которая используется именно для этой цели .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...