![]() Главная страница Случайная лекция ![]() Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика ![]() Мы поможем в написании ваших работ! |
Регулярные выражения и языки
Регулярные выражения являются достаточно удобным средством для построения "алгебраических" описаний языков. Они строятся из элементарных выражений Пусть L1 и L2 - языки в алфавите Тогда Введем обозначения для "степеней" языка L: Таким образом в Li входят все слова, которые можно разбить на i подряд идущих слов из L. Итерацию (L)* языка L образуют все слова которые можно разбить на несколько подряд идущих слов из L: Ее можно представить с помощью степеней: Часто удобно рассматривать "усеченную" итерацию языка, которая не содержит пустое слово, если его нет в языке: Отметим также, что если рассматривать алфавит В следующей таблице приведено формальное индуктивное определение регулярных выражений над алфавитом
При записи регулярных выражений будем опускать знак конкатенации Определение 5.1. Два регулярных выражения r и p называются эквивалентными, если совпадают представляемые ими языки, т.е. Lr=Lp. В этом случае пишем r = p. Нетрудно проверить, например, такие свойства регулярных операций:
Пример 5.1. Докажем в качестве примера не столь очевидное равенство: (r + p)* = (r*p*)*. Пусть L1 - язык, представляемый его левой частью, а L2 - правой. Пустое слово Рассмотрим несколько примеров регулярных выражений и представляемых ими языков. Пример 5.2. Регулярное выражение (0 +1)* представляет множество всех слов в алфавите {0, 1}. Пример 5.3. Регулярное выражение 11(0 +1)*001 представляет язык, состоящий из всех слов в алфавите {0, 1}, которые начинаются на '11', а заканчиваются на '001'. Пример 5.4. Регулярное выражение Пример 5.5. Регулярное выражение 1*(01*01*)* представляет язык L0ч, состоящий из всех слов в алфавите {0, 1}, в которых четное число нулей. Действительно, каждое слово из L0ч либо вообще не содержит нулей, т.е. входит в язык, представляющий 1*, либо может быть разбито на блоки вида 01i01j, i,j >= 0, которым, быть может, предшествует блок единиц. Выражение (01*01*), очевидно задает один такой блок, а его итерация - произвольную последовательность таких блоков. Пример 5.6. Построим теперь регулярное выражение, представляющее язык L0ч1ч, который состоит из всех слов в алфавите {0, 1}, содержащих четное число нулей и четное число единиц. Пусть w=w1w2 ... wn - произвольное слово из L0ч1ч. Тогда, разумеется, n - четно, пусть n=2k. Разобьем w на пары соседних букв pi =w2i-1w2i, i= 1,2,... ,k. Возможны 4 вида таких пар: 00, 11, 01 и 10. Пар вида 00 и 11 может быть сколько угодно, а пар вида 01 и 10 обязательно четное число. Поэтому w разбивается на блоки, каждый из которых начинается одной из пар 01 или 10 и содержит еще одну такую пару. Каждый такой блок описывается выражением (01 +10)(00 + 11)*(01+10)(00 + 11)*. При этом перед первым блоком может быть префикс, состоящий из пар 00 и 11. Множество слов состоящих из пар 00 и 11 задается выражением (00 +11)*. Отсюда получаем выражение R0ч1ч, задающее язык L0ч1ч:
Дата добавления: 2015-07-26; просмотров: 165; Нарушение авторских прав ![]() Мы поможем в написании ваших работ! |