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

Redukce: Jiný symbol pro ekvivalenci stavů

\approx se tolik neplete s rovnítkem jako \equiv.
parent 5343eef8
No related branches found
No related tags found
No related merge requests found
...@@ -825,7 +825,7 @@ Dosažitelné stavy jsou přesně ty, do nichž ze stavu~$q_0$ vede cesta. Tím ...@@ -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é 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. 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ž každé slovo $\alpha\in\Sigma^*$ platí $\delta^*(s,\alpha)\in F$, právě když
$\delta^*(t,\alpha)\in F$. $\delta^*(t,\alpha)\in F$.
} }
...@@ -835,23 +835,23 @@ shodnou na tom, zda slovo přijaly. ...@@ -835,23 +835,23 @@ shodnou na tom, zda slovo přijaly.
Stavy, které nejsou ekvivalentní, jdou \df{oddělit} nějakým slovem~$\alpha$, Stavy, které nejsou ekvivalentní, jdou \df{oddělit} nějakým slovem~$\alpha$,
na jehož přijetí se výpočty neshodnou. 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 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 bychom museli otestovat nekonečně mnoho slov. Ukážeme, že ji lze počítat
indukcí. 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 pokud nejdou oddělit žádným slovem délky nejvýše~$k$. Tedy
$(\delta^*(s,\alpha)\in F) \Leftrightarrow (\delta^*(t,\alpha)\in F)$, $(\delta^*(s,\alpha)\in F) \Leftrightarrow (\delta^*(t,\alpha)\in F)$,
kdykoliv $|\alpha|\le k$. kdykoliv $|\alpha|\le k$.
} }
\obs{\list{o} \obs{\list{o}
\:Je-li $s\equiv_{k+1} t$, platí také $s\equiv_k t$. Ekvivalence~$\equiv_{k+1}$ je tedy \:Je-li $s\approx_{k+1} t$, platí také $s\approx_k t$. Ekvivalence~$\approx_{k+1}$ je tedy
\em{zjemněním} ekvivalence~$\equiv_k$, tedy $\mathord{\equiv_{k+1}} \subseteq \mathord{\equiv_k}$ \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. 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 \: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í. přijímací a druhý nepřijímací.
...@@ -865,46 +865,46 @@ slovem~$\alpha'$ délky $k-1$. ...@@ -865,46 +865,46 @@ slovem~$\alpha'$ délky $k-1$.
Z~toho plyne: Z~toho plyne:
$$\eqalign{ $$\eqalign{
&(s\equiv_0 t) \Longleftrightarrow (s\in F \Leftrightarrow t\in F) \cr &(s\approx_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_{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 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 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}$. s~$\mathord{\approx_{k+1}} = \mathord{\approx_k}$.
Z~toho ovšem plyne $\mathord{\equiv_\ell} = \mathord{\equiv_k}$ pro všechna $\ell > k$, Z~toho ovšem plyne $\mathord{\approx_\ell} = \mathord{\approx_k}$ pro všechna $\ell > k$,
a~tím pádem i $\mathord{\equiv} = \mathord{\equiv_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. \example{Sestrojíme ekvivalence pro automat z~obrázku \figref{dfa-reduce} bez nedosažitelného stavu~5.
\tightlist{o} \tightlist{o}
\:$\equiv_0$ má třídy: \:$\approx_0$ má třídy:
$$\halign{\hbox to 5em{\hfil$#$}&\hbox to 7em{${}#$\hfil}&#\hfil\cr $$\halign{\hbox to 5em{\hfil$#$}&\hbox to 7em{${}#$\hfil}&#\hfil\cr
A&=\{0,1,2\} & nepřijímací \cr A&=\{0,1,2\} & nepřijímací \cr
B&=\{3,4\} & př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 $$\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 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 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 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 $$\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 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 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 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 \endlist
} }
Nyní ukážeme, jak ekvivalentní stavy sloučit: 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. 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} \tightlist{o}
\:$Q' = \{[s] \mid s\in Q\}$, \:$Q' = \{[s] \mid s\in Q\}$,
\:$\delta'([s],x) = [t]$, kdykoliv $\delta(s,x)=t$, \:$\delta'([s],x) = [t]$, kdykoliv $\delta(s,x)=t$,
...@@ -917,8 +917,8 @@ Pak definujeme \df{faktorový automat} $A/\mathord{\equiv} = (Q',\Sigma,\delta', ...@@ -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 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á 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. 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$: 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 \equiv s'x$. 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í; 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. opět se na tom všichni reprezentanti třídy shodnou.
} }
...@@ -953,17 +953,17 @@ tentýž jazyk jsou v~nějakém smyslu izomorfní. ...@@ -953,17 +953,17 @@ tentýž jazyk jsou v~nějakém smyslu izomorfní.
\subsection{Algoritmus na ekvivalenci stavů} \subsection{Algoritmus na ekvivalenci stavů}
Nyní konstrukci ekvivalence stavů formulujeme jako algoritmus. 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 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ří. pamatovat číslo $t[s]$ třídy, kam patří.
\algo{EkvivalenceStavů} \algo{EkvivalenceStavů}
\algin Automat $(Q,\Sigma,\delta,q_0,F)$ \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$: \::Pro všechny stavy $s\in Q$:
\:::Je-li $s\in F$, pak $t[s]\=2$, jinak $t[s]\=1$. \:::Je-li $s\in F$, pak $t[s]\=2$, jinak $t[s]\=1$.
\::$p \= 2$ \cmt{počet tříd} \::$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$: \::Pro všechny stavy $s\in Q$:
\:::$a_s \= \hbox{pole nul indexované abecedou rozšířenou o~$\varepsilon$}$ \:::$a_s \= \hbox{pole nul indexované abecedou rozšířenou o~$\varepsilon$}$
\:::$a_s[\varepsilon] \= t[s]$ \:::$a_s[\varepsilon] \= t[s]$
...@@ -978,14 +978,14 @@ pamatovat číslo $t[s]$ třídy, kam patří. ...@@ -978,14 +978,14 @@ pamatovat číslo $t[s]$ třídy, kam patří.
\::::$t[s] \= i$ \::::$t[s] \= i$
\:::Je-li $i = p$, skončíme. \:::Je-li $i = p$, skončíme.
\:::$p \= i$ \:::$p \= i$
\algout Ekvivalence~$\equiv$ popsaná polem~$t$ čísel tříd. \algout Ekvivalence~$\approx$ popsaná polem~$t$ čísel tříd.
\endalgo \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$. $(|\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. 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. 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|$? Jaká je složitost tohoto algoritmu v~závislosti na počtu stavů $S = |Q|$ a velikosti abecedy $A = |\Sigma|$?
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment