Języki, automaty i obliczenia/Ćwiczenia 5: Algorytmy konstrukcji automatu minimalnego

Z Studia Informatyczne
Wersja z dnia 13:06, 15 sie 2006 autorstwa Rogoda (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

{theor}{TWIERDZENIE}[section] {rem}{UWAGA}[section] {corol}{WNIOSEK}[section] {fact}{FAKT}[section] {ex}{PRZYKŁAD}[section] {defin}{DEFINICJA}[section] {lem}{LEMAT}[section] {cw}{ĆWICZENIE}[section]

{prf}{DOWÓD}

{Algorytmy konstrukcji automatu minimalnego}

ĆWICZENIA 5

Ćwiczenie [Uzupelnij]

Ile co najmniej stanów ma automat akceptujący dokładnie jedno słowo w o długości n?

ROZWIĄZANIE. Minimalny automat akceptujący słowo a1...an ma n+2 stany.

RYSUNEK ja-lekcja5-c-rys1

Ćwiczenie [Uzupelnij]

Niech k0 będzie dowolną, ustaloną liczbą. Wykaż, że automat rozpoznający język

L={anbn:0nk}

ma co najmniej 2k+2 stany.

ROZWIĄZANIE.Automat

RYSUNEK ja-lekcja5-c-rys2

akcepuje język L i jest automatem minimalnym (jego minimalizacja daje automat izomorficzny, wszystkie klasy są jednoelementowe).

Ćwiczenie [Uzupelnij]

Niech Parser nie mógł rozpoznać (nieznana funkcja „\slash”): {\displaystyle \mathcal{B}=(S \slash \equiv, A, f', [s_0], T)} będzie automatem minimalnym dla automatu 𝒜=(S,A,f,s0,T). Czy zbiór stanów Parser nie mógł rozpoznać (nieznana funkcja „\slash”): {\displaystyle S \slash \equiv} automatu minimalnego obliczonego za pomocą algorytmu wyznaczania stanów rozróżnialnych, zależy od:

  1. wyboru w 𝒜 stanu początkowego s0,
  1. wyboru w 𝒜 zbioru stanów końcowych T?

ROZWIĄZANIE punktu 1. Nie. Wynika to bezpośrednio z analizy algorytmu. Relacja nie rozróżnia stanów ze względu na stan początkowy. Stan początkowy nie jest w żaden sposób wyróżniony w algorytmie podczas konstrukcji zbioru Parser nie mógł rozpoznać (nieznana funkcja „\slash”): {\displaystyle S \slash \equiv } .

ROZWIĄZNIE punktu 2. Tak, gdyż postać relacji zależy od tego jakie pary stanów są zaznaczone jako stany rozróżnialne, a w liniach 3. i 4. algorytmu, początkowe wyznaczenie stanów rozróżnialnych jest zależne od postaci zbioru T.

Ćwiczenie [Uzupelnij]

Zastosuj algorytm wyznaczający stany rozróżnialne do zminimalizowania następujących automatów:

  1. RYSUNEK ja-lekcja5-c-rys3
  1. RYSUNEK ja-lekcja5-c-rys4

ROZWIĄZANIE punktu 1. Po wypełnieniu tabelki stwierdzamy, że s1s2, s3s4 oraz s5s6, zatem automat minimalny ma 3 stany: [s1,s2], [s3,s4] oraz [s5,s6].

WSKAZÓWKA do punktu 2. Zauważ, że stany s1, s3, s5, s6 i s7 są równoważne. Przed rozpoczęciem algorytmu "sklej" je w jeden stan tak, aby uprościć automat, który będziesz minimalizował. W ten sposób zamiast minimalizować automat 10-stanowy, będziesz minimalizował automat o 6 stanach.

ROZWIĄZANIE punktu 2. Sklejmy stany s1,s3,s5,s6,s7 w jeden stan (od razu widać, że są równoważne) i powstały w ten sposób stan oznaczmy jako s0. Po wypełnieniu tabelki okazuje się, że wszystkie jej pola są wypełnione X-ami. Zatem każde dwa spośród stanów s0,s2,s4,s8,s9,s10 są rozróżnialne. Automat minimalny posiada więc 6 stanów.

Ćwiczenie [Uzupelnij]

Wykorzystując algorytm stabilizujących się relacji wyznacz automaty minimalne dla automatów z rysunków Uzupelnic ja-lekcja5-c-rys3| oraz Uzupelnic ja-lekcja5-c-rys4|.

Ćwiczenie [Uzupelnij]

Niech L=A*aA*bA*, gdzie A={a,b}. Zastosuj algorytm wykorzystujący pochodną Brzozowskiego do obliczenia automatu minimalnego dla tego języka.

ROZWIĄZANIE. Obliczamy zgodnie z algorytmem kolejne pochodne zaczynając od języka L. Dla uproszczenia oznaczmy X=LA*bA*=A*aA*bA*A*bA*, Y=XA*=A*.

Parser nie mógł rozpoznać (nieznana funkcja „\aligneda”): {\displaystyle \aligneda^{-1}L & = & a^{-1}(A^*aA^*bA^*) = A^*aA^*bA^* \cup A^*bA^* = X\\ b^{-1}L & = & b^{-1}(A^*aA^*bA^*) = A^*aA^*bA^* = L\\ a^{-1}X & = & a^{-1}(A^*aA^*bA^*) \cup a^{-1}A^*bA^* = X \cup A^*bA^* = X\\ b^{-1}X & = & b^{-1}(A^*aA^*bA^*) \cup b^{-1}A^*bA^* = L \cup A^*bA^* \cup A^* = A^* = Y\\ a^{-1}Y & = & a^{-1}A^* = A^* = Y\\ b^{-1}Y & = & b^{-1}A^* = A^* = Y \endaligned}

Automat minimalny ma więc trzy stany, odpowiadające odpowiednio językom L=A*aA*bA*, X=A*aA*bA*A*bA* orazy Y=A*. Stanem początkowym jest oczywiście stan L, natomiast stanem końcowym - stan Y (dlaczego?). Automat minimalny przedstawiony jest na rysunku Uzupelnic ja-lekcja5-c-rys5|.

RYSUNEK ja-lekcja5-c-rys5

Poniżej znajduje się opis jeszcze jednego algorytmu minimalizacji -- algorytmu Hopcrofta. Jest on nieco bardziej skomplikowany niż trzy podane dotychczas algorytmy, ale posiada lepszą złożoność niż algorytm obliczania stanów rozróżnialnych czy też algorytm wyznaczania ciągu relacji stabilizujących. Przeanalizuj opis algorytmu i jego zapis, a następnie rozwiąż zadanie Uzupelnic cw_hop|.

Algorytm Hopcrofta

Niech 𝒜=(S,A,f,s0,T) będzie automatem, a QS podzbiorem. Dowolny podzbiór RS i dowolna litera aA wyznaczają na zbiorze Q relację równoważności o dwóch klasach abstrakcji:

Q1={sQ:f(s,a)R}; Q2={sQ:f(s,a)∉R},

przy czym jeśli jeden ze zbiorów Q1,Q2 jest pusty, to relacja ta posiada tylko jedną klasę abstrakcji. Wprost z definicji zbiory Q1 i Q2 tworzą podział zbioru Q (tzn. Q=Q1Q2,Q1Q2=).Oznaczmy omawianą relację przez ρRa.

W algorytmie zmienna P oznacza podział zbioru stanów S, a - listę par (Y,a), które będą wykorzystane do definiowania kolejnych relacji ρYa.

{{MinHopcroft} - algorytm Hopcrofta minimalizacji automatu} [1] Wejście: 𝒜=(S,A,f,s0,T) -- automat taki, że L=L(𝒜)

Wyjście: P -- podział zbioru S przez prawą kongruencję automatową

P{T,ST}; Parser nie mógł rozpoznać (nieznana funkcja „\trianglerightP”): {\displaystyle \trianglerightP} jest zbiorem rozłącznych podzbiorów S

{ |T|<|ST|}

{each aA} włóż(,(T,a));

{each aA} włóż(,(ST,a));

{ }

(Y,a) zdejmij ();

Parser nie mógł rozpoznać (nieznana funkcja „\slash”): {\displaystyle \mathcal{X} \leftarrow \{X \in P:\ |X \slash \rho^a_Y| = 2\}} ;

{each X𝒳} {each bA}

Parser nie mógł rozpoznać (nieznana funkcja „\slash”): {\displaystyle \{X_1, X_2\} \leftarrow X \slash \rho^a_Y} ; Parser nie mógł rozpoznać (nieznana funkcja „\trianglerightX”): {\displaystyle \trianglerightX \slash \rho^a_Y} zawiera dwie klasy abstrakcji

P(PX)X1X2;

{(X,b)}

(X,b); zdejmij z dokładnie parę (X,b)

włóż(,(X1,b));

włóż(,(X2,b));

{ |X1|<|X2|} włóż(,(X1,b));

włóż(,(X2,b));

P;

Funkcja zdejmij() pobiera z listy dowolny element i zwraca go jako swoją wartość. Procedura włóż(,X) dodaje do listy element X.

Aby zdefiniować funkcję przejść automatu minimalnego, jego zbiór stanów końcowych oraz stan początkowy, należy postąpić identycznie jak w algorytmie wyznaczania ciągu stabilizujących się relacji. Jedyna różnica polega na tym, że w miejsce relacji otrzymaliśmy podział zbioru S na klasy abstrakcji zadane przez poszukiwaną relację. Oczywiście klasy abstrakcji wyznaczają jednoznacznie relację równoważności i na odwrót -- relacja równoważności wyznacza jednoznacznie podział zbioru na klasy równoważności, zatem forma opisu relacji przez klasy abstrakcji nie stanowi dla nas żadnego problemu.

Przy właściwej reprezentacji wszystkich używanych struktur, algorytm {MinHopcroft} działa w czasie |A|nlogn, gdzie n jest liczbą stanów automatu, a |A| rozmiarem jego alfabetu wejściowego. Wyjściem algorytmu jest podział P zbioru stanów. Każdy element zbioru P reprezentuje jeden stan automatu minimalnego.

Ćwiczenie [Uzupelnij]

Zastosuj algorytm Hopcrofta do zminimalizowania automatu z rysunku Uzupelnic ja-lekcja5-c-rys3| (patrz zadanie Uzupelnic cw_first|).

ROZWIĄZANIE. Na początku podział P dzieli S na P1={s1,s2} i P2={s3,s4,s5,s6}. Ponieważ |P1|<|P2| do pustej listy dodajemy ({s1,s2},a) oraz ({s1,s2},b).

Przechodzimy do pętli while (linia 5.). Zdejmujemy z element (Y,a)=({s1,s2},a). Dla każdego elementu X podziału P sprawdzamy, czy ρYa podzieli X.

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned\{s_1,s_2\} \slash \rho_{\{s_1,s_2\}}^a & = & \{s_1,s_2\}, \\ \{s_2,s_3,s_4,s_5,s_6\} \slash \rho_{\{s_1,s_2\}}^a & = & \{s_3,s_4,s_5,s_6\}. \\ \endaligned}

Zdejmujemy z kolejny element, (Y,a)=({s1,s2},b) . Obliczamy:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned\{s_1,s_2\} \slash \rho_{\{s_1,s_2\}}^b & = & \{s_1,s_2\} \\ \{s_2,s_3,s_4,s_5,s_6\} \slash \rho_{\{s_1,s_2\}}^b & = & \{s_3,s_4\},\{s_5,s_6\} \\ \endaligned}

Relacja ρ{s1,s2}b podzieliła zbiór {s3,s4,s5,s6}.
( f(s3,b),f(s4,b){s1,s2}, f(s5,b),f(s6,b)∉{s1,s2}. )
P={s1,s2},{s3,s4},{s5,s6}. Usuwamy ({s1,s2},b) z . Ponieważ na liście nie było ani elementu ({s3,s4,s5,s6},a), ani ({s3,s4,s5,s6},b), do listy dodajemy elementy ({s3,s4},a), ({s3,s4},b), ({s5,s6},a) oraz ({s5,s6},b).

Powracamy do początku pętli. Zdejmujemy z element (Y,a)=({s3,s4},a). Obliczamy:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned\{s_1,s_2\} \slash \rho_{\{s_3,s_4\}}^a & = & \{s_1,s_2\} \\ \{s_3,s_4\} \slash \rho_{\{s_3,s_4\}}^a & = & \{s_3,s_4\} \\ \{s_5,s_6\} \slash \rho_{\{s_3,s_4\}}^a & = & \{s_5,s_6\} \\ \endaligned}

ρ{s3,s4}a nie dzieli żadnego z elementów podziału P. Zdejmujemy więc z kolejny element, (Y,a)=({s3,s4},b).
Sprawdź, że żadna z relacji: ρ{s3,s4}b, ρ{s5,s6}a, ρ{s5,s6}b nie utworzy nowego podziału.

({s5,s6},b) jest ostatnim elementem listy i algorytm kończy działanie. Ostateczny podział zbioru S ma postać: {s1,s2},{s3,s4},{s5,s6}. Automat minimalny ma więc 3 stany, odpowiadające elementom podziału. Stanem początkowym jest stan {s3,s4}, a końcowym -- stan {s1,s2}.

Otrzymaliśmy ten sam automat minimalny, co w zadaniu Uzupelnic cw_first|.

ZADANIA DOMOWE

Ćwiczenie [Uzupelnij]

Zminimalizuj przedstawione poniżej automaty:

  1. stosując algorytm wyznaczający stany rozróżnialne,
  1. stosując algorytm stabilizujących się relacji,
  1. stosując algorytm Hopcrofta.

RYSUNEK ja-lekcja5-c-rys6

RYSUNEK ja-lekcja5-c-rys7

Ćwiczenie [Uzupelnij]

Niech L=A*aA2, gdzie A={a,b}. Zastosuj algorytm wykorzystujący pochodną Brzozowskiego do obliczenia automatu minimalnego dla tego języka.