diff --git a/01-regular/regular.tex b/01-regular/regular.tex index 40fa0d310990f4f6c82c0901d040d19b49acb820..297db04408807e670ce701f0fd00e521681322b4 100644 --- a/01-regular/regular.tex +++ b/01-regular/regular.tex @@ -825,7 +825,7 @@ Dosažitelné stavy jsou přesně ty, do nichž ze stavu~$q_0$ vede cesta. Tím je můžeme najít prohledáním automatu do šířky. Odstraníme-li všechny nedosažitelné stavy, nezmění se množina možných výpočtů, 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 +\defn{Stavy $s,t\in Q$ jsou \df{ekvivalentní} (značíme $s\approx t$), pokud pro každé slovo $\alpha\in\Sigma^*$ platí $\delta^*(s,\alpha)\in F$, právě když $\delta^*(t,\alpha)\in F$. } @@ -835,23 +835,23 @@ 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í, +Snadno ověříme, že relace~$\approx$ 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$), +\defn{Stavy $s,t\in Q$ jsou \df{ekvivalentní do délky~$k$} (značíme $s\approx_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+1} t$, platí také $s\equiv_k t$. Ekvivalence~$\equiv_{k+1}$ je tedy -\em{zjemněním} ekvivalence~$\equiv_k$, tedy $\mathord{\equiv_{k+1}} \subseteq \mathord{\equiv_k}$ +\:Je-li $s\approx_{k+1} t$, platí také $s\approx_k t$. Ekvivalence~$\approx_{k+1}$ je tedy +\em{zjemněním} ekvivalence~$\approx_k$, tedy $\mathord{\approx_{k+1}} \subseteq \mathord{\approx_k}$ 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$. +\:$s\approx t$ platí právě tehdy, když je $s\approx_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í. @@ -865,46 +865,46 @@ slovem~$\alpha'$ délky $k-1$. 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 +&(s\approx_0 t) \Longleftrightarrow (s\in F \Leftrightarrow t\in F) \cr +&(s\approx_{k+1} t) \Longleftrightarrow (s\approx_0 t) \land (\forall x\in\Sigma: \delta(s,x) \approx_k \delta(t,x)) \cr }$$ -To nám dává induktivní postup na sestrojení všech ekvivalencí~$\equiv_k$. +To nám dává induktivní postup na sestrojení všech ekvivalencí~$\approx_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}$. +s~$\mathord{\approx_{k+1}} = \mathord{\approx_k}$. +Z~toho ovšem plyne $\mathord{\approx_\ell} = \mathord{\approx_k}$ pro všechna $\ell > k$, +a~tím pádem i $\mathord{\approx} = \mathord{\approx_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: +\:$\approx_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: +\:$\approx_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: +\:$\approx_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$. +\:Ekvivalence~$\approx_2$ vyšla stejná jako~$\approx_1$, takže máme hotovou plnou ekvivalenci~$\approx$. \endlist } Nyní ukážeme, jak ekvivalentní stavy sloučit: -\defn{Nechť $A=(Q,\Sigma,\delta,q_0,F)$ DFA, $\equiv$ ekvivalence jeho stavů +\defn{Nechť $A=(Q,\Sigma,\delta,q_0,F)$ DFA, $\approx$ 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: +Pak definujeme \df{faktorový automat} $A/\mathord{\approx} = (Q',\Sigma,\delta',q'_0,F')$, kde: \tightlist{o} \:$Q' = \{[s] \mid s\in Q\}$, \:$\delta'([s],x) = [t]$, kdykoliv $\delta(s,x)=t$, @@ -917,8 +917,8 @@ Pak definujeme \df{faktorový automat} $A/\mathord{\equiv} = (Q',\Sigma,\delta', 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$ přitom plyne, že nezáleží na volbě reprezentantů $s$ a~$t$: -pro každé $s,s'\in S$ a $x\in\Sigma$ je $sx \equiv s'x$. +Z~vlastností relace~$\approx$ přitom plyne, že nezáleží na volbě reprezentantů $s$ a~$t$: +pro každé $s,s'\in S$ a $x\in\Sigma$ je $sx \approx s'x$. 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šichni reprezentanti třídy shodnou. } @@ -953,17 +953,17 @@ 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í +Postupně budeme vytvářet ekvivalence~$\approx_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$: +\:Vytvoříme počáteční ekvivalenci~$\approx_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 $k=1,2,\ldots,|Q|$: \cmt{postupně vytváříme další ekvivalence~$\approx_k$} \::Pro všechny stavy $s\in Q$: \:::$a_s \= \hbox{pole nul indexované abecedou rozšířenou o~$\varepsilon$}$ \:::$a_s[\varepsilon] \= t[s]$ @@ -978,14 +978,14 @@ pamatovat číslo $t[s]$ třídy, kam patří. \::::$t[s] \= i$ \:::Je-li $i = p$, skončíme. \:::$p \= i$ -\algout Ekvivalence~$\equiv$ popsaná polem~$t$ čísel tříd. +\algout Ekvivalence~$\approx$ popsaná polem~$t$ čísel tříd. \endalgo -Při konstrukci ekvivalence~$\equiv_k$ algoritmus každému stavu~$s$ přiřadí jeho \em{kód:} +Při konstrukci ekvivalence~$\approx_k$ algoritmus každému stavu~$s$ přiřadí jeho \em{kód:} $(|\Sigma|+1)$-tici čísel indexovanou znaky abecedy rozšířené o~$\varepsilon$. -Na $x$-té pozici leží číslo ekvivalenční třídy v~$\equiv_{k-1}$, do níž padne $\delta(s,x)$. +Na $x$-té pozici leží číslo ekvivalenční třídy v~$\approx_{k-1}$, do níž padne $\delta(s,x)$. Na pozici~$\varepsilon$ leží číslo původní ekvivalenční třídy. -Dva stavy jsou pak ekvivalentní v~$\equiv_k$ právě tehdy, když dostaly stejný kód. +Dva stavy jsou pak ekvivalentní v~$\approx_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|$?