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
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
+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.
\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|
\}
$
.
Prohlédněme si automat na obrázku
\figref
{
dfa-reduce
}
vlevo,
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|
)
^
*
$
.
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
\:
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.
opět do
stavu
34
.
\:
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
liší tím, zda jsou přijímací.)
...
...
@@ -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
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.
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
každé slovo
$
\alpha\in\Sigma
^
*
$
platí
$
\delta
^
*(
s,
\alpha
)
\in
F
$
, právě když
...
...
@@ -848,8 +847,8 @@ 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
}
}$
\:
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
}$
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
$
.
...
...
@@ -917,19 +916,27 @@ Pak definujeme \df{faktorový automat} $A/\mathord{\equiv} = (Q',\Sigma,\delta',
\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.
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
$
.
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,
že pro každý řetězec~
$
\alpha
$
platí
$
\delta
'
(
q'
_
0
,
\alpha
)
=
\delta
'
([
q
_
0
]
,
\alpha
)
=
[
\delta
(
q
_
0
,
\alpha
)]
$
.
\lemma
{
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.
}
\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í.
}
...
...
@@ -958,7 +965,8 @@ pamatovat číslo $t[s]$ třídy, kam patří.
\:
:
$
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
}$
\:
::
$
a
_
s
\=
\hbox
{
pole nul indexované abecedou rozšířenou o~
$
\varepsilon
$}$
\:
::
$
a
_
s
[
\varepsilon
]
\=
t
[
s
]
$
\:
::Pro všechny znaky
$
x
\in\Sigma
$
:
\:
:::
$
a
_
s
[
x
]
\=
t
[
\delta
(
s,x
)]
$
\:
:Setřídíme všechna
$
a
_
s
$
lexikograficky.
...
...
@@ -973,15 +981,16 @@ pamatovat číslo $t[s]$ třídy, kam patří.
\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.
Při konstrukci ekvivalence~
$
\equiv
_
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 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.
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
)
$
.
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.
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