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
d95ba595
Commit
d95ba595
authored
1 year ago
by
Martin Mareš
Browse files
Options
Downloads
Patches
Plain Diff
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
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
01-regular/regular.tex
+27
-27
27 additions, 27 deletions
01-regular/regular.tex
with
27 additions
and
27 deletions
01-regular/regular.tex
+
27
−
27
View file @
d95ba595
...
@@ -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
5
em
{
\hfil
$#$
}&
\hbox
to
7
em
{
$
{}
#$
\hfil
}&
#
\hfil\cr
$$
\halign
{
\hbox
to
5
em
{
\hfil
$#$
}&
\hbox
to
7
em
{
$
{}
#$
\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
5
em
{
\hfil
$#$
}&
\hbox
to
7
em
{
$
{}
#$
\hfil
}&
#
\hfil\cr
$$
\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
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
5
em
{
\hfil
$#$
}&
\hbox
to
7
em
{
$
{}
#$
\hfil
}&
#
\hfil\cr
$$
\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
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
|
$
?
...
...
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