Учитывая регулярный язык, найдите регулярное выражение - PullRequest
0 голосов
/ 04 февраля 2019

Язык выглядит следующим образом.

∑ = {a, b, c}

L = второй и третий до последнего символа ω совпадают, ω имеет длину больше чем5 и ω содержит ccc.

Я пытался сделать это, и я не уверен, правильно ли это.Получил следующее:

((ccc) (aUbUc) * (a) (a) (aUbUC)) U ((ccc) (aUbUc) * (b) (b) (aUbUC)) U ((ccc) (aUbUc) * (c) (c) (aUbUC))

Это правильно?

1 Ответ

0 голосов
/ 04 февраля 2019

Нет, это не правильно.Например, ваше выражение не распознает строку aaccc, потому что все ваши подвыражения требуют, чтобы ваши строки начинались с ccc, что отличается от того, что будет указано в описании языка.

Некоторые выраженияверно, например, необходимость разделить части aa, bb и cc.Вы немного злоупотребляете скобками, но это скорее вопрос вкуса, чем правильности.

Ваша базовая единица - (aUbUc), что соответствует .Строка должна содержать ccc где-то в ней, поэтому давайте начнем с этого:

(aUbUc)*ccc(aUbUc)*

Это все строки, содержащие ccc.Следующее требование является сложным: символы от третьего до последнего и второго от последнего должны быть одинаковыми.Это может совпадать с частью ccc.Если этого не произойдет, этого будет достаточно:

(aUbUc)*ccc(aUbUc)*(aaUbbUcc)(aUbUc)

Но это не позволяет нам иметь строку типа accca или aaccc.Обратите внимание, однако, что он требует, чтобы все строки были по крайней мере длиной 6, поэтому он удовлетворяет требованию, чтобы длина строк была больше 5. Я собираюсь сокращать и использовать вместо (aUbUc), чтобы сделать этоменьше:

(∑*ccc∑*(aaUbbUcc)∑)U(∑∑∑∑*ccc)U(∑∑∑*ccc∑)

Обратите внимание на дополнительные s, которые требуются для дополнения других подвыражений, чтобы все пути имели длину строки больше 5.

Альтернативанепосредственно придумать регулярное выражение - это создать DFA, соответствующий этому языку, а затем преобразовать его в регулярное выражение .При создании DFA вы обнаружите аналогичные проблемы, например необходимость убедиться, что вы закрываете случай перекрытия, где ccc находится в конце строки.Чтобы сделать это немного проще, вы можете начать с NFA, а затем преобразовать NFA в DFA.

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