Wzorce i wyrażenia regularne

Wstęp

Wyrażenia regularne to rodzaj wzorców, do których dopasowuje się fragmenty różnych tekstów. Nazwy tej używa się w dwóch kontekstach. Pierwszy z nich dotyczy wyrażeń regularnych, jakie można znaleźć np. przy wyszukiwaniu tekstu, w bardziej rozbudowanych edytorach tekstów. Są one również szeroko stosowane w Uniksie, w różnego rodzaju programach do wyszukiwania i przetwarzania informacji tekstowych, np. grep, awk i sed, a także w generatorze analizatorów leksykalnych Lex.

Terminu tego używa się również w teorii języków formalnych w podobnym znaczeniu. Jednak w tym przypadku liczba konstrukcji jakie mogą być używane do budowy wyrażeń regularnych jest ograniczona do absolutnego minimum.

Jest to poniekąd naturalne, gdyż oba rodzaje wyrażeń regularnych służą innym celom. W pierwszym przypadku ma to być wygodny w użyciu język, pozwalający na zwięzłe zapisywanie wzorców. Stąd jest od dosyć rozbudowany i zawiera wiele konstrukcji. W drugim przypadku bardziej nas interesuje badanie samych wyrażeń regularnych i ich siły wyrazu. Stąd język tych wyrażeń regularnych jest maksymalnie uproszczony, a wszystkie konstrukcje, które można wyrazić w inny sposób zostały z niego usunięte.

W trakcie tego kursu będziemy używali obu rodzajów ,,wyrażeń regularnych''. Musimy więc nadać im różne nazwy. Wyrażenia regularne takie, jak są używane w Lex'ie, będziemy nazywać wzorcami. Natomiast sam termin ,,wyrażenia regularne'' zarezerwujemy dla takiego jego znaczenia, jakie ma w teorii języków formalnych.

Na potrzeby tego rozdziału ustalamy jako domyślny alfabet $\Sigma$ zbiór znaków ASCII.

Wzorce

Poniżej podajemy definicję wzorców. Z jednej strony jest ona wzorowana na wyrażeniach regularnych w Lex'ie, ale nie wymieniliśmy tutaj wszystkich dostępnych tam konstrukcji. Z drugiej strony dodaliśmy dwie konstrukcje, które nie są dostępne w Lex'ie. Definicja ta, oprócz składni wzorców, opisuje też nieformalnie ich semantykę. Semantyka ta jest bardziej formalnie zdefiniowana dalej.

Definicja

Wzorce, to wyrażenia, które możemy budować w podany poniżej sposób.

Przykład

Oto garść przykładowych wzorców:
Zdefiniujemy teraz bardziej formalnie semantykę wzorców.

Definicja

Niech $\alpha$ i $\beta$ będą wzorcami. Przez $L(\alpha)$ oznaczamy język opisywany przez wzorzec $\alpha$, czyli język złożony z tych słów, które pasują do wzorca $\alpha$. $L(\alpha)$ definiujemy indukcyjnie ze względu na budowę wzorca $\alpha$:
Badając wzorce często będziemy chcieli porównywać nie tyle je same, ale ich znaczenia. Przyda nam się do tego pojęcie równoważności wzorców.

Definicja

Powiemy, że dwa wzorce $\alpha$ i $\beta$ są równoważne, $\alpha \equiv \beta$, wtw., gdy $L(\alpha)=L(\beta)$.

Oto garść tożsamości dotyczących wzorców. Niektóre z nich, tak naprawdę, poznaliśmy już w poprzednim wykładzie jako tożsamości dotyczące języków.

Wyrażenia regularne

Okazuje się, że wiele z konstrukcji występujących we wzorcach może być zastąpionych prostszymi konstrukcjami. Na przykład zamiast [a-c] można napisać $a \;\vert\;b \;\vert\;c$. Postępując w ten sposób, każdy wzorzec można przerobić na taki, który został zapisany przy użyciu tylko pewnego minimalnego zestawu konstrukcji. Wzorce, które możemy zapisać przy użyciu owego minimalnego zestawu operacji, nazywamy wyrażeniami regularnymi.

Definicja

Wyrażenia regularne, to takie wzorce, które są zbudowane tylko przy użyciu:
Jak zobaczymy dalej, wszystkie pozostałe konstrukcje są redundantne, choć w praktyce są przydatne. Wyrażenia regularne będą nam potrzebne wówczas, gdy będziemy się zajmowali tym, co można wyrazić za pomocą wzorców i ogólnymi właściwościami języków, które można opisywać za pomocą wzorców. Dzięki ograniczeniu zestawu możliwych konstrukcji do niezbędnego minimum, nasze rozważania będą prostsze.

Języki regularne

Klasę języków, dla których istnieją opisujące je wzorce nazywamy językami regularnymi.

Definicja

Powiemy, że język A jest regularny, wtw., gdy istnieje wzorzec $\alpha$ opisujący A, czyli $A = L(\alpha)$.
Jak później pokażemy, wzorce mają taką samą siłę wyrazu co wyrażenia regularne, tzn. jeśli dla danego języka istnieje opisujący go wzorzec, to istnieje również opisujące go wyrażenie regularne.

Jeden z problemów, jakim będziemy się zajmować w trakcie tego kursu, to: jakie języki są regularne? Okazuje się, że nie wszystkie. Poniżej podajemy kilka prostych własności klasy języków regularnych.


\begin{fact}
Każdy język skończony jest regularny.
\end{fact}

Dowód:

Niech $\{x_1, x_2, \dots, x_n\}$ będzie niepustym skończonym językiem. Język ten można opisać wzorcem (a dokładniej wyrażeniem regularnym) postaci $x_1 \;\vert\;x_2 \;\vert\;\dots \;\vert\;x_n$. Język pusty można opisać wzorcem $\emptyset$. \qed


\begin{fact}
Niech $A$\ i $B$\ będą językami regularnymi.
Języki $A \setsum B$, $A \setint B$, $AB$, $\overline{A}$\ i
$A^*$\ są też regularne.
\end{fact}

Dowód:

Skoro A i B są regularne, to istnieją opisujące je wzorce $\alpha$ i $\beta$, $L(\alpha) = A$, $L(\beta) = B$. Interesujące nas języki są regularne, bo opisują je wzorce: $\alpha \;\vert\;\beta$, $\alpha \setint \beta$, $\alpha\beta$, $\overline{\alpha}$ i $\alpha^*$. \qed

Podsumowanie

W tym wykładzie poznaliśmy wzorce oraz wyrażenia regularne. Języki jakie można za ich pomocą opisać tworzą klasę języków regularnych.

Skorowidz

Praca domowa

  1. Podaj wyrażenie regularne równoważne wzorcowi: $([a-c]\ \vert\ a(b?))^+$.
  2. Podaj wzorzec opisujący poprawne numery indeksów studentów, np. postaci s0124.
  3. Uprość następujący wzorzec $(a\ \vert\ b)(aa\ \vert\ ab\ \vert\ bb\ \vert\ ba)^*(a\ \vert\ b)$.

Ćwiczenia

  1. Podaj wzorce/wyrażenia regularne opisujące język złożony ze słów:
    1. nad alfabetem {a,b}, które zawierają podsłowo bbab,
    2. nad alfabetem {a,b,c}, które zaczynają się i kończą tym samym znakiem,
    3. nad alfabetem {a,b}, które nie zawierają podsłowa aa,
    4. nad alfabetem {a,b}, które nie zawierają podsłowa ab,
    5. nad alfabetem {a,b,c}, które nie zawierają podsłowa aa,
    6. nad alfabetem {a,b,c}, które nie zawierają podsłowa ab,
    7. nad alfabetem {a,b,c} złożonych tylko z jednego rodzaju symboli,
    8. nad alfabetem {a,b,c} złożonych co najwyżej z dwóch rodzai symboli,
    9. nad alfabetem {a,b}, które zawierają parzystą liczbę liter a.
  2. Porównaj podane wzorce pod kątem równoważności / zawierania się odpowiadających im języków. Jeśli są równoważne, to uzasadnij to. Jeżeli nie, to podaj przykład słowa, które pasuje do jednego wzorca, ale nie do drugiego.
    1. (a? b?)* i $(a \;\vert\;b)^*$,
    2. $(a \;\vert\;b)^*$ i $a^* \;\vert\;b^*$,
    3. (a*b)* i (b*a)*,
    4. $(a \;\vert\;b)^*$ i $(aa \;\vert\;ab \;\vert\;ba \;\vert\;bb)$,
    5. $aa (bbaa \;\vert\;baa)^*$ i $(aabb \;\vert\;aab)^*a$.