From f233ae1a60ff798e1edc037bbf51600be6adf801 Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Tue, 21 May 2024 21:38:59 +0200 Subject: [PATCH] =?UTF-8?q?Redukce=20automat=C5=AF=20(WIP)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01-regular/regular.tex | 221 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 220 insertions(+), 1 deletion(-) diff --git a/01-regular/regular.tex b/01-regular/regular.tex index 92065b4..a45b27e 100644 --- a/01-regular/regular.tex +++ b/01-regular/regular.tex @@ -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ší. -- GitLab