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