Рассмотрим подобный пример в алгебре обычной арифметики. Одно дело сказать, что 1+2 = 2+1. Данный частный случай закона коммутативности операции сложения легко проверить: выполнив операцию сложения в обеих частях этого равенства, получим 3 = 3. Однако коммутативный закон сложения утверждает большее, а именно, что х+у = у + х, где х и у — переменные, которые можно заменять любыми двумя числами. Следовательно, он гласит, что, какие бы числа мы ни складывали, получим один и тот же результат независимо от порядка суммирования.
Регулярные выражения, подобно обычным арифметическим, подчиняются ряду законов. Многие из них подобны законам арифметики, если рассматривать объединение как сложение, а конкатенацию — как умножение. Однако в некоторых случаях эта аналогия нарушается. Кроме того, существует ряд законов для регулярных выражений, которым в арифметике аналогов нет, особенно если речь идет об операторе итерации. Следующие разделы содержат перечень главных законов для регулярных выражений. В завершение обсуждается вопрос, как вообще можно проверить, является ли некоторый формулируемый для регулярных выражений закон на самом деле законом, т. е. выполняется ли он для любых языков, подставляемых вместо его переменных.
3.4.1. Ассоциативность и коммутативность
Коммутативность— это свойство операции, заключающееся в том, что при перестановке ее операндов результат не меняется. Арифметический пример мы уже приводили выше: х + у = у + х. Ассоциативность— это свойство операции, позволяющее перегруппировывать операнды, если оператор применяется дважды. Например, ассоциативный закон умножения имеет вид: (xxy)xz = xx(yxz). Для регулярных выражений выполняются три закона такого типа.
- L + М= M+L, т. е. коммутативный закон для объединения утверждает, что два языка можно объединять в любом порядке. (L + М) + N = L + (М + N). Этот закон— ассоциативный закон объединения — говорит, что для объединения трех языков можно сначала объединить как два первых, так и два последних из них. Обратите внимание на то, что вместе с коммутативным законом объединения этот закон позволяет объединять любое количество языков в произвольном порядке, разбивая их на любые группы, и результат будет одним и тем же. Очевидно, что некоторая цепочка принадлежит объединению L\ U L2 U... U Lk тогда и только тогда, когда она принадлежит одному или нескольким языкам Lv (LM)N - L(MN). Этот ассоциативный закон конкатенации гласит, что для конкатенации трех языков можно сначала соединить как два первых, так и два последних из них.
В предложенном списке нет "закона" LM=ML, гласящего, что операция конкатенации является коммутативной, поскольку это утверждение неверно.
Пример 3.10. Рассмотрим регулярные выражения 01 и 10. Эти выражения задают языки {01} и {10}, соответственно. Поскольку эти языки различаются, то общий закон LM=ML для них не выполняется. Если бы он выполнялся, то можно было бы подставить регулярное выражение 0 вместо L и 1 вместо Ми получить неверное заключение 01 = 10. □
Единичные и нулевые элементыЕдиничным (нейтральным) элементом (единицей) операции называется элемент, для которого верно следующее утверждение: если данная операция применяется к единичному элементу и некоторому другому элементу, то результат равен другому элементу. Например, 0 является единичным элементом операции сложения, поскольку 0 + х = л: + 0 = х, а 1 — единичным элементом для умножения, потому что 1 х х = х х 1 = х. Нулевым элементом (нулем, аннулятором) операции называется элемент, для которого истинно следующее: результатом применения данной операции к нулевому и любому другому элементу является нулевой элемент. Например, 0 является нулевым элементом умножения, поскольку 0хх = хх0 = 0. Операция сложения нулевого элемента не имеет.
Для регулярных выражений существует три закона, связанных с этими понятиями.
- 0 + L = L + 0 = L. Этот закон утверждает, что 0 является единицей объединения. eL = Le = L. Этот закон гласит, что е является единицей конкатенации. 0L = L0 = 0. Этот закон утверждает, что 0 является нулевым элементом конкатенации.
Эти законы являются мощным средством упрощения выражений. Например, если необходимо объединить несколько выражений, часть которых упрощена до 0, то 0 можно исключить из объединения. Аналогично, если при конкатенации нескольких выражений некоторые из них можно упростить до е, то е можно исключить из конкатенации. Наконец, если при конкатенации любого количества выражений хотя бы одно из них равно 0, то результат такой конкатенации — 0.
Дистрибутивные законыДистрибутивный закон связывает две операции и утверждает, что одну из операций можно применить отдельно к каждому аргументу другой операции. Арифметическим примером этого закона является дистрибутивный закон умножения относительно сложения, т. е. xx(y + z) = xxy+x~xz. Поскольку умножение коммутативно, то не имеет значения, с какой стороны, слева или справа от суммы, применяется умножение. Для регулярных выражений существует аналогичный закон, но, поскольку операция конкатенации некоммутативна, то мы сформулируем его в виде следующих двух законов.
- L(M + N) = LM + LN. Этот закон называется левосторонним дистрибутивным законом конкатенации относительно объединения. (М + N)L = ML + NL. Этот закон называется правосторонним дистрибутивным законом конкатенации относительно объединения.
Докажем левосторонний дистрибутивный закон. Правосторонний доказывается аналогично. В доказательстве используются только языки, и оно не зависит от того, существуют ли для этих языков регулярные выражения.
Теорема 3.11. Если L, MnN— произвольные языки, то
L(M(J N) = LM\J LN
Доказательство. Это доказательство аналогично доказательству дистрибутивного закона, представленного в теореме 1.10. Требуется показать, что цепочка w принадлежит ДА/U N) тогда и только тогда, когда она принадлежит LM U LN.
(Необходимость) Если w принадлежит L(M U N), то w = xy, где х принадлежит L, а у принадлежит либо М, либо N. Если у принадлежит М, то ху принадлежит LM и, следовательно, принадлежит LM\JLN. Аналогично, если у принадлежит N, то ху принадлежит LN и, следовательно, принадлежит LM U LN.
(Достаточность) Предположим, что w принадлежит LM (J LN. Тогда w принадлежит либо LM, либо LN. Пусть и> принадлежит LM. Тогда и> = ху, где х принадлежит L, ay принадлежит М. Если у принадлежит М, то у также содержится в A/U N. Следовательно, ху принадлежит L(M\JN). Если w не принадлежит LM, то она точно содержится в LN, и аналогичные рассуждения показывают, что w принадлежит L(M[j N). □
Пример 3.12. Рассмотрим регулярное выражение 0 + 01 . В объединении можно "вынести за скобки 0", но сначала необходимо представить выражение 0 в виде конкатенации 0 с чем-то еще, а именно с е. Используем свойства единичного элемента для конкатенации, меняя 0 на Ое, в результате чего получим выражение 0е + 01*. Теперь можно применить левосторонний дистрибутивный закон, чтобы заменить это выражение на 0(е+ 1*). Далее, учитывая, что е принадлежит L(l'), заметим, что е+ 1* = 1*, и окончательно упростим выражение до 01*. □
3.4.4. Закон идемпотентности
Операция называется идемпотентной, если результат применения этой операции к двум одинаковым значениям как операндам равен этому значению. Обычные арифметические операции не являются идемпотентными. В общем случаех+х*хяхх. х*х (хотя существуют некоторые значения х, для которых это равенство выполняется, например 0 + 0 = 0). Однако объединение и пересечение являются идемпотентными операциями, поэтому для регулярных выражений справедлив следующий закон.
- L+ L = L. Этот закон — закон идемпотентности операции объединения — утверждает, что объединение двух одинаковых выражений можно заменить одним таким выражением.
Существует ряд законов, связанных с операцией итерации и ее разновидностями + и? в стиле UNIX. Перечислим эти законы и вкратце поясним, почему они справедливы.
- (L*)* = L*. Этот закон утверждает, что при повторной итерации язык уже итерированного выражения не меняется. Язык выражения (Z,*)* содержит все цепочки, образованные конкатенацией цепочек языка L*. Последние же цепочки построены из цепочек языка L. Таким образом, цепочки языка (X*)* также являются кон - катенациями цепочек из L и, следовательно, принадлежат языку L*. 0* = е. Итерация языка 0 состоит из одной-единственной цепочки е, что уже обсуждалось в примере 3.6. е* = е. Легко проверить, что единственной цепочкой, которую можно образовать конкатенацией любого количества пустых цепочек, будет все та же пустая цепочка. L+ = LL* = L*L. Напомним, что V по определению равно L+ LL + LLL + .... Поскольку L* = е + L + LL + LLL + ..., то
LL* = Le + LL + LLL + LLLL + ...
Если учесть, что Le = L, то очевидно, что бесконечные разложения для LL* и для V совпадают. Это доказывает, что V = LL'. Доказательство того, что L* = L*L, аналогично6.
- L* = L+ + е. Это легко доказать, поскольку в разложении L+ присутствуют те же члены, что и в разложении Z,*, за исключением цепочки е. Заметим, что если язык L содержит цепочку е, то слагаемое "+е" лишнее, т. е. в этом случае V = V. Ll = е + L. В действительности это правило является определением оператора "?".
Каждый из вышеперечисленных законов был доказан, формально или неформально. Однако есть еще бесконечно много законов для регулярных выражений, которые можно было бы сформулировать. Существует ли некая общая методика, с помощью которой можно было бы легко доказывать истинность таких законов? Оказывается, что вопрос о справедливости некоторого закона сводится к вопросу о равенстве двух определенных языков. Интересно, что эта методика тесно связана с регулярными операциями и не может быть распространена на выражения, использующие некоторые другие операции, например пересечение.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |


