Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Lekce - Automaty a regularní výrazy
Evropská unie Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
2
Automat Hrací skřínka, Leopold Aucac Aine, Paris
3
Řídicí automat typu Moore
M = < X, S=Sz ∪ Sm, Z, ω, δ, S0 > Z Následující stav S* Sm Sz * δ P a m ě ť ω Xt Vzorkování, měření vstupů Zápis výstupů X vnitřní proměnné automatu Zt
4
Definice konečného automatu FSM – Finite State Machine
Uspořádaná šestice M = < X, S, Z, ω, δ, s0 > X - konečná množina všech vstupních vektorů Z - konečná množina všech výstupních vektorů S - konečná množina všech vnitřních stavů δ - přechodová funkce - zobrazení δ: X x S -> S ω - výstupní funkce - zobrazení ω: ω: S -> Z (Moore) ω: X x S -> Z (Mealy) s0 - počáteční stav S0 S
5
Příklad: Synchronní kódový zámek
Odemkne, pokud vstup začíná: 0011, jinak ne. Generuje výstup A (Accepted=přijato) ve stavu Q5 Q1 1 Q2 Q3 Q4 A QE 0,1 Accepted Start Takový automat se někdy nazývá konečný akceptor, nebo rozpoznávací či klasifikační automat (Finite State Acceptor or Acceptor Finite State Machine)
6
Příklad2: Synchronní kódový zámek
Chceme nyní odemknout, pokud vstupní posloupnost začíná 00 a končí 11 1 A B C D E
7
Příklad: Synchronní kódový zámek
NFA – Nondeterministic Finite Automat/Acceptor 0, 1 1 Nedeterministický přechod A B C D E 1 A B C D E DFA – Deterministic Finite Automat/Acceptor
8
NFA- animace 1/2 NFA – Nondeterministic Finite Automat/Acceptor 0, 1 1 Nedeterministický přechod A B C D E 1 1 1 stack stack backtracking
9
NFA – animace 2/2 NFA – Nondeterministic Finite Automat/Acceptor 0, 1 1 Nedeterministický přechod A B C D E Accepted 1 1 1 stack
10
Nedeterministické chování není náhodné
Deterministické: f(1) → 1 vždy Náhodné: f(1) → 1 v 50% případů, f(1) → 2 v ostatních situacích Nedeterministické chování f(1) → 1 nebo f(1) → 2, ale nepovíme, kdy tomu tak bude. Nedeterministické chování může vypadat deterministicky, náhodně, nebo i hůře
11
Definice konečného akceptoru
Uspořádaná pětice M = < X, S, δ, s0, F > X - konečná množina všech vstupních vektorů S - konečná množina všech vnitřních stavů δ - přechodová funkce pro DFA - zobrazení δ: X x S -> S pro NFA – zobrazení δ: {X + ε} x S -> množina S, kde ε je prázdný vstup s0 - počáteční stav s0 S F – množina (i prázdná) koncových stavů F S
12
DFA versus NFA NFA se dají mnohem rychleji sestavit, ale obtížněji se prochází jejich stavovým diagramem – musíme si pamatovat stavy a případně se vracet. NFA s více koncovými stavy lze vždy převést na NFA s jedním koncovým stavem. NFA lze vždy převést na DFA, ale odpovídající DFA reprezentace může mít exponenciální nárůst počtu stavů nebo přechodů.
13
Jakákoliv posloupnost a b končící a b
NFA a DFA Jakákoliv posloupnost a b končící a b C A B b a NFA a,b A A,B A,C b a DFA b a a b
14
Jazyky The Tower of Babel, Pieter Brueghel, c. 1563, Kunsthistorisches Museum, Vienna
15
Automaty rozpoznávají jazyk
Abeceda (Alphabet) – konečná množina znaků Slovo (String) – konečná posloupnost znaku – může být prázdná e, (prázdné slovo se v některých textech označuje i jako l) Jazyk (Language) – množina, případně i nekonečná, všech slov utvořených z abecedy – množina může být i prázdný { }, tj. prázdný jazyk.
16
Předpokládejme S = {a, b, c}, pak lze z S utvořit například jazyky:
Příklady jazyků Předpokládejme S = {a, b, c}, pak lze z S utvořit například jazyky: {aa,ab,ac,bb,bc,cc} {ab,abc,abcc,abccc,. . .} { e } { } {a, b, c, e}
17
Regulární jazyky jsou jazyky rozpoznávané pomocí NFA nebo DFA.
Akceptory, které rozpoznávají regulární jazyky, se popisují regulárními výrazy. Java, PHP, Python, C# a další, implementují regulární výrazy zpravidla pomocí NFA, která se dá rychleji sestavit.
18
Příklady jazyků a jejich DFA
19
Sjednocení (Union) jazyků
20
Příklad sjednocení
21
Spojení (Concatenation)
22
Příklad spojení
23
Operace * (Kleene star)
24
Příklad *
25
Příklad na doplněk jazyka
Fneg = S-F , slovy: invertujeme koncové stavy
26
Regulární výrazy
27
Příklad: Automat → regulární výraz 1/5
2 3 4 5 6 7 d b c 1 2 3 4 5 6 7 d [abc] a b [bc] [abc] - jeden znak ze seznamu znaků. V uvedeném příkladu jde o znak a nebo b nebo c.
28
Příklad: Automat → regulární výraz 2/5
[abc] d a d 1 2 3 4 5 d b [bc] 6 7 3 4 5 d[abc]d d a b[bc]d
29
Příklad: Automat → regulární výraz 3/5
4 5 d[abc]d d a b[bc]d 3 4 5 d[abc]d d a b[bc]da b(b|c)da
30
Příklad: Automat → regulární výraz 4/5
3 4 5 d[abc]d d a b[bc]da 3 4 5 d[abc]d a (b[bc]da)*d
31
Příklad: Automat → regulární výraz 5/5
3 4 5 d[abc]d a (b[bc]da)*d 5 d[abc]da(b[bc]da)*d * - 0 nebo více znaků ze seznamu. V uvedeném příkladu jde o skupinu (b[bc]da)
32
Příklad: jazyk W = {anbn | n>0}
Neregulární jazyky Pro neregulární jazyky nelze navrhnout NFA nebo DFA. Nelze je ani popsat regulárním výrazem. Příklad: jazyk W = {anbn | n>0}
33
Regulární výrazy: Metacharacters
Začátečníkům pomůže knihovna regulárních výrazů Některé "character-class" metacharacters \d – libovolné číslo \D – nečíselný znak \w – libovolný znak slova \W – neslovní znak \s – oddělovač "whitespace" \S – není "whitespace" Příklad \d\d\d\s nalezne: " "
34
Některé uživatelské znaky
. Jeden znak s výjimkou konce řádku "newline". Např. a.a určuje aea, aia, aca, and a a [XY] Jeden znak ze seznamu znaků. V uvedeném příkladu jde o znak X nebo Y [A-Z] Jeden znak z rozsahu od A do Z (v příkladu pouze velká písmena). [A-Za-z] Jeden znak, malá nebo velká písmena A až Z [^AB] Jeden znak různý od A nebo B
35
Modifikátory výrazu \ ^ $
Následující znak je literal, ne "metacharacter" ^ Následující výraz se musí se objevit na začátku textu $ Následující výraz se musí objevit na konci textu "^Kolo" nalezne "Kolohnát", ale nikoliv "Moje Kolo" "stroj$" matches "Nástroj", ale ne "stroje"
36
Kvantifikátory * + ? {n} {n,} {n,m} ()
Určuje 0 or více výskytů předchozího + Určuje 1 or více výskytů předchozího ? Určuje 0 or 1 výskytů předchozího {n} Určuje přesně n výskytů předchozího {n,} Určuje nejméně n výskytů {n,m} Určuje nejméně n, ale maximálně m výskytů () Označení skupiny pro kvantifikátor, chceme-li, aby se vztahoval na více prvků
37
Jaká je správná odpověď?
38
Ukázka programu v |Java
import java.util.regex.Matcher; import java.util.regex.Pattern; public class DateMatcher { public DateMatcher() { String aDate = "date: "; Pattern datePattern = Pattern.compile( "date: (\\d{2})-(\\d{2})-(\\d{4})"); Matcher dateMatcher = datePattern.matcher(aDate); if (dateMatcher.find()) { System.out.println("Month is: " + dateMatcher.group(1)); System.out.println("Day is: " + dateMatcher.group(2)); System.out.println("Year is: " + dateMatcher.group(3)); } } public static void main(String[] args) { new DateMatcher(); } }
39
Podmnožinu regulárních výrazů umí i MS-Word
Regulární výrazy se skrývají pod zástupnými znaky Nabídku operátorů najdete pod Speciální
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.