390 likes | 517 Views
Lekce - Automaty a regularní výrazy. Evropská unie Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti. Automat. Hrací skřínka, Leopold Aucac Aine , Paris. X. X t. P a m ě ť. Vzorkování, měření vstupů. X. *. S z. Následující stav S*. S z. S z. Z. ω. Z t. *.
E N D
Lekce - Automaty a regularní výrazy Evropská unie Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Automat Hrací skřínka, Leopold Aucac Aine, Paris
X Xt P a m ě ť Vzorkování,měření vstupů X * Sz Následující stav S* Sz Sz Z ω Zt * Sm Sm Sm Zápis výstupů δ vnitřní proměnné automatu Řídicí automat typu Moore M = < X, S=Sz∪Sm,Z,ω, δ,S0>
Definice konečného automatuFSM – Finite State Machine • δ - přechodová funkce - zobrazení δ: X x S -> S • ω - výstupní funkce - zobrazení ω: ω: S -> Z (Moore)ω: X x S -> Z (Mealy) 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ů • s0 - počáteční stav S0 S
Q1 Q1 Q2 Q3 Q4 QE 0 0 1 1 A 1 0 0 1 Accepted Start 0,1 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 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)
0 1 0 0 1 A B C D E 0 Příklad2: Synchronní kódový zámek • Chceme nyní odemknout, pokud vstupní posloupnost začíná 00 a končí 11
0 1 Nedeterministický přechod 0 0 1 0,1 A B C D E 0 0 1 1 0 A B C D E Příklad: Synchronní kódový zámek NFA – Nondeterministic Finite Automat/Acceptor DFA – Deterministic Finite Automat/Acceptor
Nedeterministický přechod 0,1 0 0 1 1 A B C D E stack stack NFA- animace 1/2 NFA – Nondeterministic Finite Automat/Acceptor 0 0 1 0 1 1 backtracking
Nedeterministický přechod 0,1 0 0 1 1 A B C D E stack NFA – animace 2/2 NFA – Nondeterministic Finite Automat/Acceptor Accepted 0 0 1 0 1 1
Nedeterministické chování není náhodné • Deterministické: f(1) → 1vždy • Náhodné: f(1) → 1v 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
Definice konečného akceptoru Uspořádaná pětice M = < X, S, δ,s0, F> • δ - přechodová funkce • pro DFA - zobrazení δ: X x S -> S • pro NFA – zobrazení δ: {X + ε} x S -> množina S,kde ε je prázdný vstup • X - konečná množina všech vstupních vektorů • S - konečná množina všech vnitřních stavů • s0 - počáteční stav s0 S • F – množina (i prázdná) koncových stavů F S
DFA versus NFA • NFAse 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. • NFAs více koncovými stavy lze vždy převést naNFAs jedním koncovým stavem. • NFAlze vždy převést naDFA, ale odpovídajícíDFAreprezentace může mít exponenciální nárůst počtu stavů nebo přechodů.
NFA a DFA Jakákoliv posloupnosta bkončícía b C A B b a NFA a,b A A,B A,C b a DFA b a a b
Jazyky The Tower of Babel, Pieter Brueghel, c. 1563, Kunsthistorisches Museum, Vienna
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 jakol) • 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.
Příklady jazyků PředpokládejmeS = {a,b,c}, pak lze zS utvořit například jazyky: • {aa,ab,ac,bb,bc,cc} • {ab,abc,abcc,abccc,. . .} • { e } • { } • {a,b,c,e}
Regulární jazyky • 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.
Příklad na doplněk jazyka Fneg = S-F , slovy: invertujeme koncové stavy
Regulární výrazy http://www.dotnetcoders.com/web/Learning/Regex/default.aspx
a d a d b d 0 1 2 3 4 5 c b d b c 6 7 d [abc] d a d 0 1 2 3 4 5 d b [bc] 6 7 Příklad: Automat → regulární výraz 1/5 [abc] - jeden znak ze seznamu znaků. V uvedeném příkladu jde o znakanebobneboc.
d[abc]d a d 0 3 4 5 b[bc]d Příklad: Automat → regulární výraz 2/5 d [abc] d a d 0 1 2 3 4 5 d b [bc] 6 7
d[abc]d a d 0 3 4 5 b[bc]d d[abc]d a d 0 3 4 5 b[bc]da Příklad: Automat → regulární výraz 3/5 b(b|c)da
d[abc]d a d 0 3 4 5 b[bc]da d[abc]d a (b[bc]da)*d 0 3 4 5 Příklad: Automat → regulární výraz 4/5
d[abc]d a (b[bc]da)*d 0 3 4 5 d[abc]da(b[bc]da)*d 0 5 Příklad: Automat → regulární výraz 5/5 * - 0 nebo více znaků ze seznamu. V uvedeném příkladu jde o skupinu(b[bc]da)
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}
Regulární výrazy: Metacharacters • Začátečníkům pomůže knihovna regulárních výrazů http://regexlib.com/ • 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: "123 456"
Modifikátory výrazu • "^Kolo" nalezne "Kolohnát",ale nikoliv "Moje Kolo" • "stroj$" matches "Nástroj",ale ne "stroje"
Ukázka programu v |Java import java.util.regex.Matcher; import java.util.regex.Pattern;public class DateMatcher{ public DateMatcher() {String aDate = "date: 12-15-2003"; 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(); }}
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í