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
5343eef8
Commit
5343eef8
authored
1 year ago
by
Martin Mareš
Browse files
Options
Downloads
Patches
Plain Diff
Redukce: Korektury
parent
f233ae1a
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
+31
-22
31 additions, 22 deletions
01-regular/regular.tex
with
31 additions
and
22 deletions
01-regular/regular.tex
+
31
−
22
View file @
5343eef8
...
@@ -790,8 +790,8 @@ prozkoumáme, jak automaty zjednodušovat.
...
@@ -790,8 +790,8 @@ prozkoumáme, jak automaty zjednodušovat.
\figure
[dfa-reduce]
{
redukce.epdf
}{
width 0.8
\hsize
}{
Automat a jeho redukce
}
\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,
Prohlédněme si automat na obrázku
\figref
{
dfa-reduce
}
vlevo,
definovaný
nad abecedou
$
\{\|
a|,
\|
b|
\}
$
.
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|
)
^
*
$
.
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.
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
...
@@ -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í
\:
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
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
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
\:
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
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í.)
liší tím, zda jsou přijímací.)
...
@@ -823,8 +823,7 @@ tentýž jazyk. Nyní se tento proces pokusíme popsat obecně.
...
@@ -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
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é
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
stavy, nezmění se množina možných výpočtů, a~tím pádem ani jazyk přijímaný automatem.
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
\equiv
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ž
...
@@ -848,8 +847,8 @@ kdykoliv $|\alpha|\le k$.
...
@@ -848,8 +847,8 @@ kdykoliv $|\alpha|\le k$.
}
}
\obs
{
\list
{
o
}
\obs
{
\list
{
o
}
\:
Je-li
$
s
\equiv
_
k
t
$
, platí také
$
s
\equiv
_
{
k
+
1
}
t
$
. Ekvivalence~
$
\equiv
_{
k
+
1
}$
je tedy
\:
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
}
\subseteq
\mathord
{
\equiv
_
{
k
+
1
}
}$
\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.
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
\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',
...
@@ -917,19 +916,27 @@ Pak definujeme \df{faktorový automat} $A/\mathord{\equiv} = (Q',\Sigma,\delta',
\note
{
\note
{
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
$
plyne, že nezáleží na volbě reprezentantů
Z~vlastností relace~
$
\equiv
$
přitom plyne, že nezáleží na volbě reprezentantů
$
s
$
a~
$
t
$
:
tříd
$
s
$
a~
$
t
$
. Podobně třída je přijímací, pokud stavy v~ní ležící
pro každé
$
s,s'
\in
S
$
a
$
x
\in\Sigma
$
je
$
sx
\equiv
s'x
$
.
byly v~původním automatu přijímací; opět se na tom všechny stavy shodnou.
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,
\lemma
{
že pro každý řetězec~
$
\alpha
$
platí
$
\delta
'
(
q'
_
0
,
\alpha
)
=
\delta
'
([
q
_
0
]
,
\alpha
)
=
[
\delta
(
q
_
0
,
\alpha
)]
$
.
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.
}
\example
{
Z~levého automatu na obrázku
\figref
{
dfa-reduce
}
dostaneme faktorizací pravý automat.
}
\defn
{
\defn
{
Automat je
\df
{
redukovaný,
}
pokud
nemá dosažitelné stavy a pokud
ž
a
dné
Automat je
\df
{
redukovaný,
}
pokud
jsou všechny jeho stavy dosažitelné a
ž
á
dné
dva stavy nejsou ekvivalentní.
dva stavy nejsou ekvivalentní.
}
}
...
@@ -958,7 +965,8 @@ pamatovat číslo $t[s]$ třídy, kam patří.
...
@@ -958,7 +965,8 @@ pamatovat číslo $t[s]$ třídy, kam patří.
\:
:
$
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~
$
\equiv
_
k
$}
\:
:Pro všechny stavy
$
s
\in
Q
$
:
\:
: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
$
:
\:
::Pro všechny znaky
$
x
\in\Sigma
$
:
\:
:::
$
a
_
s
[
x
]
\=
t
[
\delta
(
s,x
)]
$
\:
:::
$
a
_
s
[
x
]
\=
t
[
\delta
(
s,x
)]
$
\:
:Setřídíme všechna
$
a
_
s
$
lexikograficky.
\:
:Setřídíme všechna
$
a
_
s
$
lexikograficky.
...
@@ -973,15 +981,16 @@ pamatovat číslo $t[s]$ třídy, kam patří.
...
@@ -973,15 +981,16 @@ pamatovat číslo $t[s]$ třídy, kam patří.
\algout
Ekvivalence~
$
\equiv
$
popsaná polem~
$
t
$
čísel tříd.
\algout
Ekvivalence~
$
\equiv
$
popsaná polem~
$
t
$
čísel tříd.
\endalgo
\endalgo
Při konstrukci ekvivalence~
$
\equiv
_
k
$
algoritmus každému stavu~
$
s
$
přiřadí jeho kód:
Při konstrukci ekvivalence~
$
\equiv
_
k
$
algoritmus každému stavu~
$
s
$
přiřadí jeho
\em
{
kód:
}
$
|
\Sigma
|
$
-tici čísel indexovanou znaky abecedy. Na
$
x
$
-té pozici leží číslo ekvivalenční
$
(
|
\Sigma
|
+
1
)
$
-tici čísel indexovanou znaky abecedy rozšířené o~
$
\varepsilon
$
.
třídy v~
$
\equiv
_{
k
-
1
}$
, do níž padne
$
\delta
(
s,x
)
$
. Dva stavy jsou pak ekvivalentní v~
$
\equiv
_
k
$
Na
$
x
$
-té pozici leží číslo ekvivalenční třídy v~
$
\equiv
_{
k
-
1
}$
, do níž padne
$
\delta
(
s,x
)
$
.
právě tehdy, když dostaly stejný kód. Stačí tedy kódy setřídit a pro každou skupinu stejných
Na pozici~
$
\varepsilon
$
leží číslo původní ekvivalenční třídy.
kódů založit ekvivalenční třídu.
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
|
$
?
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.
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.
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
)
$
.
Algoritmus tedy doběhne v~čase
$
\Theta
(
S
^
2
A
)
$
.
...
...
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