Упростить регулярное выражение

Я делаю некоторые предэкзаменационные упражнения для моего класса компиляторов и должен упростить это регулярное выражение.

(a U b)*(a U e)b* U (a U b)*(b U e)a*

совершенно очевидно, что e-пустая строка, а U означает объединение.

до сих пор я думаю, что один из (a U b)* может быть удален, как объединение a U a = a. Однако я не могу найти никаких других упрощений, и до сих пор не так хорошо справляюсь с другими проблемами. :(

любая помощь будет оценили, спасибо!

4 ответов


немного ржавый на regex, но если * все еще представляет "ноль или более ocurrences", вы можете заменить:

(a U e)b* for (a U b)*

который оставляет первую часть с:

(a U b)*(a U b)* = (a U b)*

С правой стороны, у вас есть это

(b U e)a* = (b U a)*

теперь, так как a U b = b U a, вы получаете:

(a U b)*(a U b)*

С правой стороны, которая оставляет только

(a U b)* U (a U b)* = (a U b)*

Я думаю, что это он...


сначала переведите на английский язык описание языка:

(a U b)*(a U e)b* U (a U b)*(b U e)a*

переводится как:


любая последовательность aили bs, за которым следует необязательный a, за которым следует любое число bs.

или

любое число as и bs, за которым следует необязательный b, за любое число as


здесь много перекрытий - по крайней мере (a U b)*(a U e) точно так же, как (a U b)*, потому что "любая последовательность as и bs"обязательно либо заканчивается a или epsilon (так как любая строка может заканчиваться epsilon), поэтому эти группы могут быть устранены, оставив

(a U b)*b* U (a U b)*a*

переводится как:


любая последовательность aили bs, а затем любое количество bs.

или

любое число as и bs, вслед за любым числом as


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

(a U b)*(a* U b*)

переводится как:


любая последовательность aили bs, а затем любое количество as или любым числом bs.


теперь подождите минуту, "любая последовательность As и Bs"обязательно заканчивается на " любой последовательности as или любая последовательность bs", что означает все, что соответствует первой части может соответствовать всему регулярному выражению (потому что вторая часть может иметь нулевую длину) так почему бы нам не сделать это

(a U b)*

Та Да. Простой.


Я думаю, что все это эквивалентно (a U b)* (или в большинстве регулярных грамматик, (a|b)*)


Я дам вам представление о том, как я бы его решил: (не очень формально и без гарантии)

посмотрите на левую сторону главного U:

(a U b)* - что это значит? Комбинация as и bs длины n, где n >= 0.

Далее идет (U e). Что у нас тут? Или пустые слова. Если бы мы этого хотели, мы могли бы просто получить его в предыдущей части. Если нам нужна буква "е", мы все равно можем ее опустить. Пожалуйста, обратите внимание, что нам не нужно возьмите a, потому что у нас есть возможность выбрать e. Так что мы можем пропустить всю эту часть.

Что дальше? си.* Что это? Столько БС, сколько мы хотим. Мы могли бы получить их и в первой части! мы можем оставить!

Итак, единственное, что слева, это (a U b)*.

давайте посмотрим на правую сторону:

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

мы также получим (a U b)* в том же путь.

Так что в итоге мы имеем (п б)* у (п б)* что ты знаешь равна (п б)*.