Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
automaty
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Martin Mareš
automaty
Commits
f233ae1a
Commit
f233ae1a
authored
1 year ago
by
Martin Mareš
Browse files
Options
Downloads
Patches
Plain Diff
Redukce automatů (WIP)
parent
514d203d
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
01-regular/regular.tex
+220
-1
220 additions, 1 deletion
01-regular/regular.tex
with
220 additions
and
1 deletion
01-regular/regular.tex
+
220
−
1
View file @
f233ae1a
...
...
@@ -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
5
em
{
\hfil
$#$
}&
\hbox
to
7
em
{
$
{}
#$
\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
5
em
{
\hfil
$#$
}&
\hbox
to
7
em
{
$
{}
#$
\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
5
em
{
\hfil
$#$
}&
\hbox
to
7
em
{
$
{}
#$
\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
^
2
A
)
$
.
\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ší.
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment