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
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|$?
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment