Упростить регулярное выражение
Я делаю некоторые предэкзаменационные упражнения для моего класса компиляторов и должен упростить это регулярное выражение.
(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
или b
s, за которым следует необязательный a
, за которым следует любое число b
s.
или
любое число a
s и b
s, за которым следует необязательный b
, за любое число a
s
здесь много перекрытий - по крайней мере (a U b)*(a U e)
точно так же, как (a U b)*
, потому что "любая последовательность a
s и b
s"обязательно либо заканчивается a
или epsilon (так как любая строка может заканчиваться epsilon), поэтому эти группы могут быть устранены, оставив
(a U b)*b* U (a U b)*a*
переводится как:
любая последовательность a
или b
s, а затем любое количество b
s.
или
любое число a
s и b
s, вслед за любым числом a
s
теперь первый раздел тех, кто к внешним группам является тем же самым, так что давайте свернуть их в один
(a U b)*(a* U b*)
переводится как:
любая последовательность a
или b
s, а затем любое количество a
s или любым числом b
s.
теперь подождите минуту, "любая последовательность As и Bs"обязательно заканчивается на " любой последовательности a
s или любая последовательность b
s", что означает все, что соответствует первой части может соответствовать всему регулярному выражению (потому что вторая часть может иметь нулевую длину) так почему бы нам не сделать это
(a U b)*
Та Да. Простой.
Я дам вам представление о том, как я бы его решил: (не очень формально и без гарантии)
посмотрите на левую сторону главного U:
(a U b)* - что это значит? Комбинация as и bs длины n, где n >= 0.
Далее идет (U e). Что у нас тут? Или пустые слова. Если бы мы этого хотели, мы могли бы просто получить его в предыдущей части. Если нам нужна буква "е", мы все равно можем ее опустить. Пожалуйста, обратите внимание, что нам не нужно возьмите a, потому что у нас есть возможность выбрать e. Так что мы можем пропустить всю эту часть.
Что дальше? си.* Что это? Столько БС, сколько мы хотим. Мы могли бы получить их и в первой части! мы можем оставить!
Итак, единственное, что слева, это (a U b)*.
давайте посмотрим на правую сторону:
ок, это сейчас легко, мы можем использовать ту же идею, это просто разные буквы.
мы также получим (a U b)* в том же путь.
Так что в итоге мы имеем (п б)* у (п б)* что ты знаешь равна (п б)*.