Skip to content
Snippets Groups Projects
Commit f233ae1a authored by Martin Mareš's avatar Martin Mareš
Browse files

Redukce automatů (WIP)

parent 514d203d
Branches
No related tags found
No related merge requests found
......@@ -43,7 +43,7 @@ Naopak jazyku $L\subseteq\Sigma^*$ přiřadíme problém~$P_L$ takový, že $P_L
\foot{Bystrý čtenář v~tom poznává charakteristickou funkci podmnožiny.}
}
\section{Konečné automaty}
\section[dfa]{Konečné automaty}
\defn{\em{Deterministický konečný automat} (jinak řečený DFA\foot{deterministic finite-state automaton})
je uspořádaná pětice $(Q,\Sigma,\delta,q_0,F)$, kde:
......@@ -782,8 +782,227 @@ pro jazyk automatu. Srovnejte délky výrazu s~předchozím cvičením.
\endexercises
\sectionstar{Redukce automatů}
Už jsme se vybavili řadou nástrojů, které nám umožňují snadno sestrojit automat
rozpoznávající zadaný jazyk. Tyto automaty ale bývají dost složité. V~tomto oddílu
prozkoumáme, jak automaty zjednodušovat.
\figure[dfa-reduce]{redukce.epdf}{width 0.8\hsize}{Automat a jeho redukce}
Prohlédněme si na automat na obrázku \figref{dfa-reduce} vlevo,
definovaný nad abecedou $\{\|a|, \|b|\}$.
Zřejmě rozpoznává jazyk generovaný regulárním výrazem $(\|a|\mid\|b|)\;\|a|^*\|b|\;(\|a|\mid\|b|)^*$.
Tentýž jazyk lze ovšem rozpoznávat i automatem vpravo, který má pouhé 3~stavy.
Zamysleme se nad tím, jakých stavů bychom se v~levém automatu dokázali zbavit:
\list{o}
\:Především můžeme odstranit stav~5, protože není z~počátečního stavu~0 dosažitelný
-- v~grafu do něj z~0 nevede žádná cesta.
\:Stavy 3 a~4 není potřeba rozlišovat: oba jsou přijímací a po zpracování
libovolného slova automat skončí zase v~přijímacím stavu. Můžeme je tedy
sloučit do společného stavu 34, který bude přijímací a jak~\|a|, tak~\|b| povedou
do téhož stavu.
\:Stavy 1 a~2 také není potřeba rozlišovat: v~obou platí, že \|b| nás posune
do stavu 34, zatímco na \|a| zůstaneme v~1 nebo~2. Opět je můžeme sloučit
do společného stavu 12. (Naproti tomu 12 a 34 se chovají jinak, například se
liší tím, zda jsou přijímací.)
\endlist
Tím jsme z~levého automatu vytvořili pravý -- ten je daleko jednodušší, ale pořád přijímá
tentýž jazyk. Nyní se tento proces pokusíme popsat obecně.
\defn{Stav $s\in Q$ je \df{dosažitelný,} pokud existuje slovo $\alpha\in\Sigma^*$ takové,
že $\delta^*(q_0,\alpha) = s$.
}
Dosažitelné stavy jsou přesně ty, do nichž ze stavu~$q_0$ vede cesta. Tím pádem
je můžeme najít prohledáním automatu do šířky. Odstraníme-li všechny nedosažitelné
stavy, nezmění se $\delta(q_0,\alpha)$ pro žádné~$\alpha$, a~tím pádem ani jazyk
přijímaný automatem.
\defn{Stavy $s,t\in Q$ jsou \df{ekvivalentní} (značíme $s\equiv t$), pokud pro
každé slovo $\alpha\in\Sigma^*$ platí $\delta^*(s,\alpha)\in F$, právě když
$\delta^*(t,\alpha)\in F$.
}
To znamená, že výpočty začínající ve stavech $s$ a~$t$ se po zpracování libovolného slova~$\alpha$
shodnou na tom, zda slovo přijaly.
Stavy, které nejsou ekvivalentní, jdou \df{oddělit} nějakým slovem~$\alpha$,
na jehož přijetí se výpočty neshodnou.
Snadno ověříme, že relace~$\equiv$ je opravdu ekvivalence (je reflexivní,
symetrická a tranzitivní). Počítat ji podle definice není praktické, protože
bychom museli otestovat nekonečně mnoho slov. Ukážeme, že ji lze počítat
indukcí.
\defn{Stavy $s,t\in Q$ jsou \df{ekvivalentní do délky~$k$} (značíme $s\equiv_k t$),
pokud nejdou oddělit žádným slovem délky nejvýše~$k$. Tedy
$(\delta^*(s,\alpha)\in F) \Leftrightarrow (\delta^*(t,\alpha)\in F)$,
kdykoliv $|\alpha|\le k$.
}
\obs{\list{o}
\:Je-li $s\equiv_k t$, platí také $s\equiv_{k+1} t$. Ekvivalence~$\equiv_{k+1}$ je tedy
\em{zjemněním} ekvivalence~$\equiv_k$, tedy $\mathord{\equiv_k} \subseteq \mathord{\equiv_{k+1}}$
a třídy jemnější ekvivalence jsou podmnožinami tříd hrubší ekvivalence.
\:$s\equiv t$ platí právě tehdy, když je $s\equiv_k t$ pro všechna~$k$.
\:Stavy $s$ a~$t$ jsou odděleny prázdným slovem právě tehdy, je-li jeden z~nich
přijímací a druhý nepřijímací.
\:Stavy $s$ a~$t$ jsou odděleny neprázdným slovem $\alpha=x\alpha'$ délky~$k$
právě tehdy, když jsou stavy $s'=\delta(s,x)$ a $t'=\delta(t,x)$ odděleny
slovem~$\alpha'$ délky $k-1$.
\endlist
}
Z~toho plyne:
$$\eqalign{
&(s\equiv_0 t) \Longleftrightarrow (s\in F \Leftrightarrow t\in F) \cr
&(s\equiv_{k+1} t) \Longleftrightarrow (s\equiv_0 t) \land (\forall x\in\Sigma: \delta(s,x) \equiv_k \delta(t,x)) \cr
}$$
To nám dává induktivní postup na sestrojení všech ekvivalencí~$\equiv_k$.
Jelikož každá další ekvivalence je zjemněním té předchozí a tříd není nikdy
víc než stavů automatu, musí se zjemňování po konečně mnoha krocích zastavit
s~$\mathord{\equiv_{k+1}} = \mathord{\equiv_k}$.
Z~toho ovšem plyne $\mathord{\equiv_\ell} = \mathord{\equiv_k}$ pro všechna $\ell > k$,
a~tím pádem i $\mathord{\equiv} = \mathord{\equiv_k}$.
\example{Sestrojíme ekvivalence pro automat z~obrázku \figref{dfa-reduce} bez nedosažitelného stavu~5.
\tightlist{o}
\:$\equiv_0$ má třídy:
$$\halign{\hbox to 5em{\hfil$#$}&\hbox to 7em{${}#$\hfil}&#\hfil\cr
A&=\{0,1,2\} & nepřijímací \cr
B&=\{3,4\} & přijímací \cr
}$$
\:$\equiv_1$ má třídy:
$$\halign{\hbox to 5em{\hfil$#$}&\hbox to 7em{${}#$\hfil}&#\hfil\cr
C&=\{0\} & nepřijímací, znaky \|a| i~\|b| vedou do stavů z~třídy~$A$ \cr
D&=\{1,2\} & nepřijímací, \|a| vede do~$A$, \|b| do~$B$ \cr
E&=\{3,4\} & přijímací, \|a| i~\|b| vedou do~$B$ \cr
}$$
\:$\equiv_2$ má třídy:
$$\halign{\hbox to 5em{\hfil$#$}&\hbox to 7em{${}#$\hfil}&#\hfil\cr
F&=\{0\} & nepřijímací, znaky \|a| i~\|b| vedou do stavů z~třídy~$D$ \cr
G&=\{1,2\} & nepřijímací, \|a| vede do~$D$, \|b| do~$E$ \cr
H&=\{3,4\} & přijímací, \|a| i~\|b| vedou do~$E$ \cr
}$$
\:Ekvivalence~$\equiv_2$ vyšla stejná jako~$\equiv_1$, takže máme hotovou plnou ekvivalenci~$\equiv$.
\endlist
}
Nyní ukážeme, jak ekvivalentní stavy sloučit:
\defn{Nechť $A=(Q,\Sigma,\delta,q_0,F)$ DFA, $\equiv$ ekvivalence jeho stavů
a pro každý stav $s\in Q$ je $[s]$ jeho ekvivalenční třída.
Pak definujeme \df{faktorový automat} $A/\mathord{\equiv} = (Q',\Sigma,\delta',q'_0,F')$, kde:
\tightlist{o}
\:$Q' = \{[s] \mid s\in Q\}$,
\:$\delta'([s],x) = [t]$, kdykoliv $\delta(s,x)=t$,
\:$q'_0 = [q_0]$,
\:$F' = \{[s] \mid s\in F\}$.
\endlist
}
\note{
Stavy faktorového automatu jsou tedy ekvivalenční třídy stavů původního
automatu. Přechod z~ekvivalenční třídy $S$ do $T$ přes znak~$x$ odpovídá
přechodu mezi $s\in S$ do $t\in T$ přes~$x$ v~původním automatu;
z~vlastností relace~$\equiv$ plyne, že nezáleží na volbě reprezentantů
tříd $s$ a~$t$. Podobně třída je přijímací, pokud stavy v~ní ležící
byly v~původním automatu přijímací; opět se na tom všechny stavy shodnou.
Faktorizací automatu se nezmění přijímaný jazyk. Indukcí snadno dokážeme,
že pro každý řetězec~$\alpha$ platí $\delta'(q'_0,\alpha) = \delta'([q_0],\alpha) = [\delta(q_0,\alpha)]$.
}
\example{Z~levého automatu na obrázku \figref{dfa-reduce} dostaneme faktorizací pravý automat.}
\defn{
Automat je \df{redukovaný,} pokud nemá dosažitelné stavy a pokud žadné
dva stavy nejsou ekvivalentní.
}
Z~předchozích úvah přímo plyne:
\theorem{
Nechť z~automatu~$A$ vznikne automat~$A'$ odstraněním nedosažitelných stavů a následnou faktorizací.
Pak automat~$A'$ je redukovaný a přijímá stejný jazyk jako~$A$.
}
V~příštím oddílu navíc dokážeme, že všechny redukované automaty přijímající
tentýž jazyk jsou v~nějakém smyslu izomorfní.
\subsection{Algoritmus na ekvivalenci stavů}
Nyní konstrukci ekvivalence stavů formulujeme jako algoritmus.
Postupně budeme vytvářet ekvivalence~$\equiv_k$. Budeme je reprezentovat pomocí
ekvivalenčních tříd očíslovaných přirozenými čísly. Pro každy stav~$s$ si budeme
pamatovat číslo $t[s]$ třídy, kam patří.
\algo{EkvivalenceStavů}
\algin Automat $(Q,\Sigma,\delta,q_0,F)$
\:Vytvoříme počáteční ekvivalenci~$\equiv_0$:
\::Pro všechny stavy $s\in Q$:
\:::Je-li $s\in F$, pak $t[s]\=2$, jinak $t[s]\=1$.
\::$p \= 2$ \cmt{počet tříd}
\:Pro $k=1,2,\ldots,|Q|$: \cmt{postupně vytváříme další ekvivalence~$\equiv_k$}
\::Pro všechny stavy $s\in Q$:
\:::$a_s \= \hbox{pole nul indexované abecedou}$
\:::Pro všechny znaky $x\in\Sigma$:
\::::$a_s[x] \= t[\delta(s,x)]$
\::Setřídíme všechna $a_s$ lexikograficky.
\::Očíslujeme nové ekvivalenční třídy:
\:::$i \= 0$
\:::Pro všechna $a_s$ v~setříděném pořadí:
\::::Pokud $a_s$ je první nebo různé od svého předchůdce:
\:::::$i \= i + 1$
\::::$t[s] \= i$
\:::Je-li $i = p$, skončíme.
\:::$p \= i$
\algout Ekvivalence~$\equiv$ popsaná polem~$t$ čísel tříd.
\endalgo
Při konstrukci ekvivalence~$\equiv_k$ algoritmus každému stavu~$s$ přiřadí jeho kód:
$|\Sigma|$-tici čísel indexovanou znaky abecedy. Na $x$-té pozici leží číslo ekvivalenční
třídy v~$\equiv_{k-1}$, do níž padne $\delta(s,x)$. Dva stavy jsou pak ekvivalentní v~$\equiv_k$
právě tehdy, když dostaly stejný kód. Stačí tedy kódy setřídit a pro každou skupinu stejných
kódů založit ekvivalenční třídu.
Jaká je složitost tohoto algoritmu v~závislosti na počtu stavů $S = |Q|$ a velikosti abecedy $A = |\Sigma|$?
Hlavní smyčka přes~$k$ proběhne nejvýš $S$-krát, pak už nemůže ekvivalenčních tříd přibývat.
Pro každou ekvivalenci sestrojíme $S$ kódů délky~$A$, což trvá $\Theta(SA)$.
V~tomto čase je stihneme i přihrádkově setřídit a očíslovat nové ekvivalenční třídy.
Algoritmus tedy doběhne v~čase $\Theta(S^2A)$.
\exercises
\ex{Dokažte, že vyhledávací automaty typu Knuth-Morris-Pratt (viz oddíl \secref{dfa}) jsou redukované.
}
\ex{Platí totéž o~vyhledávacích automatech typu Aho-Corasicková?
}
\ex{Navrhněte, jak pomocí ekvivalence stavů zjistit, zda dva automaty přijímají stejný jazyk.}
\ex{Funguje myšlenka ekvivalence stavů a faktorizace automatu i pro nedeterministické automaty?}
\endexercises
\sectionstar{Algebraické souvislosti}
{\bf Pozor! Tato kapitola je ve vývoji.}
V~tomto oddílu prozkoumáme některé souvislosti mezi teorií automatů
a algebrou. Předpokládáme čtenáře zběhlého v~základech algebry, takže
důkazy jsou zde poněkud hutnější.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment