Języki, automaty i obliczenia/Ćwiczenia 5: Algorytmy konstrukcji automatu minimalnego
Ćwiczenia 5
Ćwiczenie 1.1
Ćwiczenie 1.2
Ćwiczenie 1.3
Ćwiczenie 1.4
Ćwiczenie 1.5
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 , gdzie . 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 . Dla uproszczenia oznaczmy , .
Automat minimalny ma więc trzy stany, odpowiadające odpowiednio językom , orazy . Stanem początkowym jest oczywiście stan , natomiast stanem końcowym - stan (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 będzie automatem, a podzbiorem. Dowolny podzbiór i dowolna litera wyznaczają na zbiorze relację równoważności o dwóch klasach abstrakcji:
przy czym jeśli jeden ze zbiorów jest pusty, to relacja ta posiada tylko jedną klasę abstrakcji. Wprost z definicji zbiory i tworzą podział zbioru (tzn. ).Oznaczmy omawianą relację przez .
W algorytmie zmienna oznacza podział zbioru stanów , a - listę par , które będą wykorzystane do definiowania kolejnych relacji .
{{MinHopcroft} - algorytm Hopcrofta minimalizacji automatu} [1] Wejście: -- automat taki, że
Wyjście: -- podział zbioru przez prawą kongruencję automatową
; Parser nie mógł rozpoznać (nieznana funkcja „\trianglerightP”): {\displaystyle \trianglerightP} jest zbiorem rozłącznych podzbiorów
{ }
{each } włóż;
{each } włóż;
{ }
zdejmij ;
Parser nie mógł rozpoznać (nieznana funkcja „\slash”): {\displaystyle \mathcal{X} \leftarrow \{X \in P:\ |X \slash \rho^a_Y| = 2\}} ;
{each } {each }
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
;
{}
; zdejmij z dokładnie parę
włóż;
włóż;
{ } włóż;
włóż;
;
Funkcja zdejmij() pobiera z listy dowolny element i zwraca go jako swoją wartość. Procedura włóż() dodaje do listy element .
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 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 , gdzie jest liczbą stanów automatu, a rozmiarem jego alfabetu wejściowego. Wyjściem algorytmu jest podział zbioru stanów. Każdy element zbioru 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ł dzieli na i . Ponieważ do pustej listy dodajemy oraz .
Przechodzimy do pętli while (linia 5.). Zdejmujemy z element . Dla każdego elementu podziału sprawdzamy, czy podzieli .
Zdejmujemy z kolejny element, . Obliczamy:
Relacja podzieliła zbiór
.
( , . )
. Usuwamy
z . Ponieważ na liście
nie było ani elementu , ani
, do listy dodajemy elementy
, , oraz
.
Powracamy do początku pętli. Zdejmujemy z element . Obliczamy:
nie dzieli żadnego z elementów
podziału . Zdejmujemy więc z kolejny element,
.
Sprawdź, że żadna z relacji: , ,
nie utworzy nowego podziału.
jest ostatnim elementem listy i algorytm kończy działanie. Ostateczny podział zbioru ma postać: . Automat minimalny ma więc 3 stany, odpowiadające elementom podziału. Stanem początkowym jest stan , a końcowym -- stan .
Otrzymaliśmy ten sam automat minimalny, co w zadaniu Uzupelnic cw_first|.
ZADANIA DOMOWE
Ćwiczenie [Uzupelnij]
Zminimalizuj przedstawione poniżej automaty:
- stosując algorytm wyznaczający stany rozróżnialne,
- stosując algorytm stabilizujących się relacji,
- stosując algorytm Hopcrofta.
RYSUNEK ja-lekcja5-c-rys6
RYSUNEK ja-lekcja5-c-rys7
Ćwiczenie [Uzupelnij]
Niech , gdzie . Zastosuj algorytm wykorzystujący pochodną Brzozowskiego do obliczenia automatu minimalnego dla tego języka.