diff --git a/01-regular/regular.tex b/01-regular/regular.tex index a45b27e9a30ab3321353d64b7328848871e22fde..40fa0d310990f4f6c82c0901d040d19b49acb820 100644 --- a/01-regular/regular.tex +++ b/01-regular/regular.tex @@ -790,8 +790,8 @@ 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|\}$. +Prohlédněme si automat na obrázku \figref{dfa-reduce} vlevo, +pracující 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. @@ -805,10 +805,10 @@ Zamysleme se nad tím, jakých stavů bychom se v~levém automatu dokázali zbav \: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. +opět do stavu 34. \: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 stavu 34, zatímco po \|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í.) @@ -823,8 +823,7 @@ tentýž jazyk. Nyní se tento proces pokusíme popsat obecně. 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. +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 každé slovo $\alpha\in\Sigma^*$ platí $\delta^*(s,\alpha)\in F$, právě když @@ -848,8 +847,8 @@ 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}}$ +\: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}$ 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$. @@ -917,19 +916,27 @@ Pak definujeme \df{faktorový automat} $A/\mathord{\equiv} = (Q',\Sigma,\delta', \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. +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$. +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. +} -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)]$. +\lemma{ +Faktorizací automatu se nezmění přijímaný jazyk. } +\proof +Indukcí podle délky řetězce dokážeme, že pro každý řetězec~$\alpha$ platí +$\delta'(q'_0,\alpha) = \delta'([q_0],\alpha) = [\delta(q_0,\alpha)]$. +Tento stav leží v~$F'$ právě tehdy, když $\delta(q_0,\alpha)$ leží v~$F$. +\qed + \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é +Automat je \df{redukovaný,} pokud jsou všechny jeho stavy dosažitelné a žádné dva stavy nejsou ekvivalentní. } @@ -958,7 +965,8 @@ pamatovat číslo $t[s]$ třídy, kam patří. \::$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}$ +\:::$a_s \= \hbox{pole nul indexované abecedou rozšířenou o~$\varepsilon$}$ +\:::$a_s[\varepsilon] \= t[s]$ \:::Pro všechny znaky $x\in\Sigma$: \::::$a_s[x] \= t[\delta(s,x)]$ \::Setřídíme všechna $a_s$ lexikograficky. @@ -973,15 +981,16 @@ pamatovat číslo $t[s]$ třídy, kam patří. \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. +Při konstrukci ekvivalence~$\equiv_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 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. +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)$. +Pro každou ekvivalenci sestrojíme $S$ kódů délky~$A+1$, 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)$.