Równoważność wzorców, wyrażeń regularnych i automatów skończonych

Tematem tego wykładu jest pokazanie, że wzorce, wyrażenia regularne i automaty skończone mają taką samą siłę wyrazu. Wszystkie one opisują dokładnie języki regularne.


\begin{theorem}
Niech $\Sigma$\ będzie ustalonym alfabetem, a $A$\ niech będzie...
...$\ dla pewnego wyrażenia regularnego $\alpha$.
\end{description} \end{theorem}

Dowód:

Pokażemy, że $c) \Rightarrow b)$, $b) \Rightarrow a)$ i $a) \Rightarrow c)$.
$c) \Rightarrow b)$
Oczywiste, bo każde wyrażenie regularne jest wzorcem.
$b) \Rightarrow a)$
Indukcyjnie ze względu na strukturę wzorca budujemy automat z $\varepsilon$-przejściami, o jednym stanie początkowym i jednym stanie akceptującym, który akceptuje dokładnie słowa pasujące do wzorca.

$a) \Rightarrow c)$
Niech $M = \angles{Q, \Sigma, \delta, S, F}$ będzie danym automatem skończonym (deterministycznym lub niedeterministycznym). Konstrukcja wyrażenia regularnego opisującego język akceptowany przez M przebiega rekurencyjnie. Budujemy wyrażenia regularne opisujące coraz większe fragmenty automatu. Niech u i v będą stanami, a X będzie zbiorem stanów, $u,v \in Q$, $X \subseteq Q$. Wyrażenie regularne $\alpha^X_{u,v}$ opisuje te słowa, za pomocą których można przejść z u do v zatrzymując się po drodze jedynie w stanach z X. Wyrażenie $\alpha^X_{u,v}$ definiujemy indukcyjnie ze względu na |X|.
  1. Załóżmy, że $X = \emptyset$. Oznaczmy przez $a_1, \dots, a_k$ wszystkie znaki powodujące przejście z u do v. Możliwe są dwa przypadki: u=v lub $u \neq v$:
    \includegraphics{rys-4-c}
    Jeśli $u \neq v$ i nie ma żadnych przejść z u do v, to wczytanie żadnego słowa nie spowoduje przejścia z u do v. Tak więc:

    \begin{displaymath}
\alpha^\emptyset_{u,v} =
\left \{
\begin{array}{lcl}
a_1...
...\emptyset & ; & u \neq v \andalso k = 0
\end{array} \right .
\end{displaymath}

  2. Załóżmy, że $X \neq \emptyset$. Niech q będzie dowolnym stanem należącym do X, $q
\in X$. Wówczas możliwe są dwa rodzaje przejścia z u do v:
    • Przechodzimy z u do v zatrzymując się po drodze w stanach należących do X, ale nie w q. Czyli po drodze zatrzymujemy się w stanach należących do $X \setminus \{q\}$. Słowa, które możemy wczytać w ten sposób są opisane przez $\alpha^{X \setminus \{q\}}_{u,v}$.
    • Przechodząc z u do v przynajmniej raz, a być może więcej razy, przechodzimy przez q. Całą trasę możemy podzielić na odcinki, na każdym przejściu przez stan q.

      Pierwszy odcinek to przejście z u do q (pierwsza wizyta w q), przechodząc po drodze przez stany z $X \setminus \{q\}$. To co możemy wczytać przechodząc przez ten pierwszy odcinek jest opisane przez $\alpha^{X \setminus \{q\}}_{u,q}$.

      Następnie pewną liczbę razy (być może zero) wychodzimy z q i wracamy do q. To co możemy wczytać w trakcie pojedynczego przejścia z q do q jest opisane przez $\alpha^{X \setminus \{q\}}_{q,q}$.

      Na koniec, wychodzimy z q (ostatnia wizyta w q) i przechodzimy do v. To co możemy w trakcie tego przejścia wczytać opisuje $\alpha^{X \setminus \{q\}}_{q,v}$.

    \includegraphics{rys-4-d}
    Łącząc obie powyższe możliwości, wszystko co może zostać wczytane w trakcie przejścia z u do v, po drodze zatrzymując się w stanach należących do X, jest opisane przez:

    \begin{displaymath}
\alpha^X_{u,v} =
\alpha^{X \setminus \{q\}}_{u,v} \;\vert\...
...X \setminus \{q\}}_{q,q})^*
\alpha^{X \setminus \{q\}}_{q,v}
\end{displaymath}

Słowa, które są akceptowane przez M to te, które mogą zostać wczytane przy przejściu z jednego ze stanów początkowych do jednego ze stanów akceptujących. Niech $S = \{s_1, \dots, s_k\}$, $F = \{f_1, \dots, f_l\}$. Wówczas:

\begin{displaymath}
L(M) = L(
\alpha^Q_{s_1,f_1} \;\vert\;\dots \;\vert\;\alph...
...pha^Q_{s_k,f_1} \;\vert\;\dots \;\vert\;\alpha^Q_{s_k,f_l}
)
\end{displaymath}

\qed
Tym samym pokazaliśmy, że: wzorce, wyrażenia regularne, oraz automaty skończone (wszystkie trzy poznane rodzaje), wszystkie opisują dokładnie klasę języków regularnych.

Konstrukcja wyrażenia regularnego odpowiadającego automatowi skończonemu, podana w powyższym dowodzie daje dosyć skomplikowane wyrażenie regularne. Zauważmy, że rozmiar wynikowego wyrażenia regularnego rośnie czterokrotnie z każdym kolejnym stanem automatu! Jednocześnie wiele powstających podwyrażeń można pominąć, gdyż nie wnoszą nic do wyniku. Jeśli więc będziemy chcieli przekształcić jakiś automat na wyrażenie regularne, to nie musimy sztywno trzymać się pokazanej powyżej konstrukcji. Gdy jednak zdrowy rozsądek nie podpowiada nam jak sobie poradzić, wówczas powinniśmy zastosować konstrukcję z dowodu, zmniejszając rozmiar rozważanego automatu. Ilustruje to poniższy przykład:

Przykład

Przekształćmy następujący automat na wyrażenie regularne:
\includegraphics{rys-4-1}
Język akceptowany przez automat jest opisany wyrażeniem.

\begin{displaymath}
\alpha_{s,q}^{\{s,p,q\}} =
\alpha_{s,q}^{\{s,q\}} \;\vert\...
...{\{s,q\}}
(\alpha_{p,p}^{\{s,q\}})^*
\alpha_{p,q}^{\{s,q\}}
\end{displaymath}

Patrząc na automat możemy wywnioskować:

\begin{displaymath}
\alpha_{s,q}^{\{s,q\}} \equiv b^*aa^*
\end{displaymath}


\begin{displaymath}
\alpha_{p,p}^{\{s,q\}} \equiv \varepsilon \;\vert\;ba^*b
\end{displaymath}


\begin{displaymath}
\alpha_{p,q}^{\{s,q\}} \equiv ba^*
\end{displaymath}

Stąd:

\begin{displaymath}
\alpha_{s,q}^{\{s,p,q\}} \equiv
b^*aa^* \;\vert\;
\alpha_{s,p}^{\{s,q\}}(\varepsilon \;\vert\;ba^*b)^*ba^*
\end{displaymath}

Dalej:

\begin{displaymath}
\alpha_{s,p}^{\{s,q\}} =
\alpha_{s,p}^{\{s\}} \;\vert\;
...
...{s,q}^{\{s\}}
(\alpha_{q,q}^{\{s\}})^*
\alpha_{q,p}^{\{s\}}
\end{displaymath}

Zauważmy, że:

\begin{displaymath}
\alpha_{s,p}^{\{s\}} \equiv \alpha_{s,q}^{\{s\}} \equiv b^*a
\end{displaymath}


\begin{displaymath}
\alpha_{q,q}^{\{s\}} \equiv \varepsilon \;\vert\;a
\end{displaymath}


\begin{displaymath}
\alpha_{q,p}^{\{s\}} \equiv b
\end{displaymath}

Czyli:

\begin{displaymath}
\alpha_{s,p}^{\{s,q\}} \equiv
b^*a \;\vert\;b^*a(\varepsilon \;\vert\;a)^*b
\end{displaymath}

Stąd:

\begin{eqnarray*}
\alpha_{s,q}^{\{s,p,q\}} &\equiv&
b^*aa^* \;\vert\;
\left(
...
...quiv&
b^*aa^* \;\vert\;
(b^*a \;\vert\;b^*aa^*b)(ba^*b)^*ba^*
\end{eqnarray*}


Zastosowania automatów skończonych

Automaty skończone nie są tylko teoretycznym narzędziem do badania języków regularnych. Mają one również wiele zastosowań praktycznych. Na przykład, stosuje się je do wyszukania wzorca lub podsłowa w tekście -- dla danego wzorca czy podsłowa należy skonstruować odpowiedni automat (deterministyczny), a następnie wczytać analizowany tekst; każde przejście takiego automatu przez stan akceptujący reprezentuje jedno wystąpienie wzorca czy podsłowa w tekście.

Dalej, analizatory leksykalne są realizowane jako automaty skończone. Lex na podstawie specyfikacji tworzy odpowiedni automat skończony, który wyszukuje wystąpienia leksemów i równocześnie określa które fragmenty kodu ze specyfikacji należy zastosować.

Automaty skończone mają też zastosowanie w bardzo młodej dziedzinie informatyki, weryfikacji modelowej (ang. model-checking). Weryfikacja modelowa jest stosowana do badania, czy określony mechanizm (np. układ elektroniczny, protokół komunikacyjny, prosty program o ograniczonej liczbie stanów) posiada wymagane własności. W tym celu tworzy się automat skończony będący modelem systemu. Język akceptowany przez ten automat reprezentuje możliwe przebiegi zdarzeń. Następnie bada się, czy język akceptowany przez automat zawiera się w języku złożonym z dopuszczalnych przez specyfikację przebiegów zdarzeń. Zaletą weryfikacji modelowej w porównaniu z testowaniem jest to, że weryfikacja modelowa obejmuje wszystkie możliwe przebiegi zdarzeń, a nie tylko niektóre.

Podsumowanie

W niniejszym wykładzie pokazaliśmy, że: wzorce, wyrażenia regularne, oraz automaty skończone (wszystkie trzy poznane rodzaje), wszystkie opisują dokładnie klasę języków regularnych. Ponieważ dowód był konstruktywny, widać z niego jak można tłumaczyć wzorce na automaty i odwrotnie.

Skorowidz

Praca domowa

  1. Dopasuj do siebie automaty i wyrażenia regularne:
    a)

    \begin{picture}(80,40)(-15,-15)
\put(-15,0){\vector(1,0){12}}
\put(0,0){\circl...
...15,-13){\makebox(0,0)[b]{$a$}}
\put(52,10){\makebox(0,0)[l]{$b$}}
\end{picture}
    b)

    \begin{picture}(80,40)(-15,-15)
\put(-15,0){\vector(1,0){12}}
\put(0,0){\circl...
...15,-13){\makebox(0,0)[b]{$b$}}
\put(52,10){\makebox(0,0)[l]{$a$}}
\end{picture}
    c)

    \begin{picture}(80,40)(-15,-15)
\put(-15,0){\vector(1,0){12}}
\put(0,0){\circl...
...15,-13){\makebox(0,0)[b]{$a$}}
\put(52,10){\makebox(0,0)[l]{$a$}}
\end{picture}
    d)

    \begin{picture}(80,40)(-15,-15)
\put(-15,0){\vector(1,0){12}}
\put(0,0){\circl...
...15,-13){\makebox(0,0)[b]{$b$}}
\put(52,10){\makebox(0,0)[l]{$b$}}
\end{picture}
    e)

    \begin{picture}(80,40)(-15,-15)
\put(-15,0){\vector(1,0){12}}
\put(0,0){\circl...
...15,-13){\makebox(0,0)[b]{$b$}}
\put(52,10){\makebox(0,0)[l]{$a$}}
\end{picture}
    1)
    $a(ba\ \vert\ b)^*$,
    2)
    $b(bb\ \vert\ a)^*$,
    3)
    $a(aa\ \vert\ b)^*$,
    4)
    $a(ba\ \vert\ a)^*$,
    5)
    $b(ab\ \vert\ a)^*$.
  2. Podaj automat skończony akceptujący język opisany wzorcem: $b(aba \;\vert\;aa)^+a$.
  3. Podaj wyrażenie regularne opisujące język akceptowany przez następujący automat niedeterministyczny:

    \begin{displaymath}
\begin{array}{r\vert c\vert c\vert}
& a & b \\
\hline
\...
..., 3 & 4 \\
2 & & 1 \\
3 & 1 & \\
4 & 1 & 1
\end{array} \end{displaymath}

Ćwiczenia

  1. Dopasuj do siebie automaty i wyrażenia regularne:
    a)
    $\begin{array}[t]{r\vert c\vert c}
& a & b\\
\hline
\to 1 & 2 & 2\\
\hline
F 2 & & 2
\end{array}$
    b)
    $\begin{array}[t]{r\vert c\vert c}
& a & b\\
\hline
\to F 1 & 2 & 2\\
\hline
2 & 1& 1
\end{array}$
    c)
    $\begin{array}[t]{r\vert c\vert c}
& a & b\\
\hline
\to F 1 & & 2\\
\hline
F 2 & 1 & 2
\end{array}$
    d)
    $\begin{array}[t]{r\vert c\vert c}
& a & b\\
\hline
\to 1 & 2 & 2\\
\hline
F 2 & & 1
\end{array}$
    e)
    $\begin{array}[t]{r\vert c\vert c}
& a & b\\
\hline
\to F 1 & 1 & 2\\
\hline
F 2 & 1 & 2
\end{array}$
    1)
    $(b \;\vert\;ba)^*$,
    2)
    $(a \;\vert\;b)(ba \;\vert\;bb)^*$,
    3)
    $(a \;\vert\;b)^*$,
    4)
    $(a \;\vert\;b)b^*$,
    5)
    $((a \;\vert\;b)(a \;\vert\;b))^*$.
    Rozwiązanie
    1-c, 2-d, 3-e, 4-a, 5-b
    zamknij

  2. Dopasuj automaty do podanych wyrażeń regularnych:
    a)

    \begin{picture}(50,60)(-5,-5)
\thicklines
\put(10,30){\circle*{2}}
\put(3...
...(11,20){\makebox(0,0)[l]{$a$}}
\put(30,-1){\makebox(0,0)[t]{$a$}}
\end{picture}
    b)

    \begin{picture}(50,60)(-5,-5)
\thicklines
\put(10,30){\circle*{2}}
\put(3...
...(11,20){\makebox(0,0)[l]{$a$}}
\put(30,-1){\makebox(0,0)[t]{$b$}}
\end{picture}
    c)

    \begin{picture}(50,60)(-5,-5)
\thicklines
\put(10,30){\circle*{2}}
\put(3...
...(11,20){\makebox(0,0)[l]{$a$}}
\put(30,-1){\makebox(0,0)[t]{$a$}}
\end{picture}
    d)

    \begin{picture}(50,60)(-5,-5)
\thicklines
\put(10,30){\circle*{2}}
\put(3...
...(11,20){\makebox(0,0)[l]{$a$}}
\put(30,-1){\makebox(0,0)[t]{$b$}}
\end{picture}
    e)

    \begin{picture}(50,60)(-5,-5)
\thicklines
\put(10,30){\circle*{2}}
\put(3...
...(11,20){\makebox(0,0)[l]{$a$}}
\put(30,-1){\makebox(0,0)[t]{$a$}}
\end{picture}
    1)
    $(aaa^*a \cup b)(b^* \cup bb \cup baaa^*a)^*$,
    2)
    $(b \cup aba^*a)(a^* \cup bb \cup baba^*a)^*$,
    3)
    $(aab^*a \cup a)(b^* \cup ba \cup baab^*a)^*$,
    4)
    $(a \cup aaa^*b)(b^* \cup ba \cup baaa^*b)^*$,
    5)
    $(a \cup aab^*a)(a^* \cup ba \cup baab^*a)^*$.
    Rozwiązanie
    1-e, 2-c, 3-b, 4-a, 5-d.
    zamknij

  3. Podaj automaty skończone (deterministyczne lub nie) odpowiadające następującym wzorcom:
  4. Podaj deterministyczne automaty skończone akceptujące języki opisane wyrażeniami regularnymi:
  5. Podaj wyrażenia regularne odpowiadające automatom:
    \includegraphics{rys-4-6} \includegraphics{rys-4-7}
    \includegraphics{rys-4-8}