DAB76: Språk och logik /4: Finita automater och -7 reguljära uttryck Leif Grönqvist (leif.gronqvist@msi.vxu.se) Växjö Universitet (MSI) GSLT (Sveriges nationella forskarskola i språkteknologi) Göteborg Universitet (Institutionen för lingvistik) Formell språkteori Viktigt att kunna definiera och känna igen mönster Optisk teckenigenkänning (OCR) Kompilatorteknik Textsökning (i databaser och på Internet) Stavnings- och grammatikkontroll Automatisk översättning Mönstren byggs upp av ett ändligt antal byggstenar (bokstäver, ord, ljud, etc.) En finit automat (FSA) Lite terminologi FSA = Finite State Automaton Ett alfabet (a, b, c, d) Ett antal tillstånd (,,) Ett tillstånd () Ett antal sluttillstånd () Måste sluta i sluttillstånd a b c d Alfabet (Σ): en ändlig mängd symboler i ett formellt språk (t.ex. siffror eller bokstäver) Sträng: sekvens av symboler ur alfabetet ε är den tomma strängen (längd ) a a a n :sträng av längd n Språk: en mängd strängar Σ * är språket uppbyggt av symboler ur Σ Σ + är språket av icke-tomma strängar är det tomma språket FSA (Finite State Automaton): accepterar vissa strängar FST (Finite State Transducer): översättare mellan par av strängar ur två språk Reguljära uttryck: ett annat sätt att beskriva språken ovan 4 Exempel på ett språk: jämna binära tal Σ = {, } Exempel på strängar i Σ * : ε,,,,, Språket J: Mängden av alla strängar i Σ * vars sista symbol är (och första är om längden är minst symboler) Exempel:,,, Vi vill inte ha med,, ε,,, etc. Definition av en FSA Består av fem komponenter: S={s, s,, s m }: en ändlig mängd tillstånd Σ = {σ, σ,, σ n }: ett alfabet En övergångsfunktion från par av <tillstånd, symbol> till tillstånd, dvs. bågar med tillhörande symboler mellan tillstånd s ε S: ett tillstånd F S: en mängd sluttillstånd (accepterande tillstånd) FSA:er representeras ofta som grafer: noder = tillstånd bågar med symboler representerar övergångar tillstånd: en pil märkt med accepterade tillstånd markeras som dubbla cirklar 5 6
Automat för jämna binära tal Hur används automater för att känna igen strängar i ett språk? Alfabetet Σ = {, } Tillståndsmängd S = {, } tillstånd: Accepterande tillstånd:. a i tillståndet. Läs nästa symbol i strängen Om strängen var slut: Acceptera om vi står i ett accepterande tillstånd Förkasta annars. Följ bågen markerad med inläst symbol Om ingen sådan båge finns så förkastas strängen 4. Gå till steg. 7 8 Att utforska ett språk utifrån dess FSA Determinism eller inte Om språket är ändligt så kan samtliga strängar fås fram genom att följa alla möjliga vägar från tillstånd till accepterande tillstånd Annars kan vi ta fram godtyckligt många strängar i språket genom att följa möjliga vägar tills vi är nöjda Vilka strängar ingår i språket jämna binära tal? De vi vill ha där och inga andra? Deterministisk FSA: <s i, σ j > högst ett tillstånd s k till vilket det finns en övergång från s i till s k för symbol σ j. Inga övergångar för symbol ε Intuitivt: Det finns aldrig mer än en övergång att välja på när man stegar runt i automaten Icke-deterministisk FSA Uppfyller inte båda kraven ovan Besvärligare att implementera Långsammare att slå upp strängar i Kan ofta ha färre tillstånd än motsvarande deterministiska FSA Kan göras om till en deterministisk FSA 9 Determinisering av ickedeterministisk FSA Automat för jämna binära tal (felaktig) En icke-deterministisk automat N med tillståndsmängd S={s, s,, s m } kan determiniseras till D: Tillstånd i D (D-tillstånd) utgörs av mängder av tillstånd i N (N-tillstånd) Låt S = {s } vara tillstånd för D De accepterande tillstånden i D är de D-tillstånd som innehåller något av de accepterande N- tillstånden Givet ett D-tillstånd S i och en symbol x, skapa en övergång från S i för x till det D-tillstånd S j som innehåller alla N-tillstånd för vilka det finns en övergång för x från något N-tillstånd i S i Alfabetet Σ = {, } Tillståndsmängd S = {, } tillstånd: Accepterande tillstånd:
Exempel på ett språk: jämna binära tal Σ = {, } Exempel på strängar i Σ * : ε,,,,, Språket J: Mängden av alla strängar i Σ * vars sista symbol är (och första är om längden är minst symboler) Exempel:,,, Vi vill inte ha med,, ε,,, etc. Korrekt (icke-deterministisk) automat för jämna binära tal Icke-deterministisk eftersom tillstånd har två övergångar med symbol Vi gör den deterministisk! 4 De två automaterna Resultatet av determiniseringen Den icke-deterministiska (N) S = {,,} S = F = {} Σ = {, } Den deterministiska (D) S = {,,,,,, } S = F = {,,, } (alla som innehåller N- tillståndet ) Σ = {, } 5 6 Men vissa tillstånd kan man inte komma till! FST: Finite State-transduktorer Det finns inga övergångar till:, eller så vi tar bort dem Kvar blir en deterministisk automat med fyra tillstånd Ett övre och ett undre språk Symbolerna skrivs som par av symboler från respektive alfabet a:b betyder symbol a från övre språket och symbol b från undre a:ε betyder symbol a från övre språket och inget från det undre a betyder symbol a från både det övre och undre språket Verifiering av par av strängar kan göras Uppslagning av sträng i övre språket givet sträng i undre språket Uppslagning av sträng i undre språket givet sträng i övre språket 7 8
En transduktor Alfabetet Σ = {a, b} Tillståndsmängd S = {,, } Accepterande tillstånd: tillstånd: a:a Vad gör den? Är den deterministisk? a:ε b:b a:b Påminnelse FSA = Finite state automaton (finite stateautomat Avgör om symbolsträngar tillhör ett språk Kan generera alla symbolsträngar i språket FST = Finite state transducer (finite statetransduktor) Översätter symbolsträngar från övre till undre språket eller tvärtom Verifierar om en given sträng i övre språket motsvaras av en annan given sträng i undre språket Kan generera alla strängpar s, s där s ingår i övre språket, s ingår i undre språket, samt s i övre motsvarar s i det undre 9 Viktiga egenskaper hos FSA/FST Epsilonfri: inga övergångar är markerade med epsilon Deterministisk: Inga tillstånd har mer än en utgående båge med samma symbol (symbolpar) Minimal: Det finns ingen automat med färre tillstånd som beskriver samma språk Implementation Deterministiska FSA/FST implementeras extremt effektivt i C En label för varje tillstånd Använd goto för att hoppa mellan tillstånd Stacken används inte vi behöver inte komma ihåg varifrån vi kommit Icke-determinism är besvärligare Välj en väg i taget Backtracka för att testa alla möjligheter I praktiken är de användbara om det inte finns för mycket icke-determinism Reguljära uttryck Ett annat sätt att definiera formella språk Enklare för människor liknar mer vårt sätt att tänka(?) Språken vi kan definiera är de samma som för finita automater De kan kompileras till deterministiska automater eller transduktorer Exempel i UNIX ls myfiles*[45].txt egrep a [a-z]+ has four (legs) (arms) *.txt Definitioner Atomära reguljära uttryck givet alfabetet Σ x (där x ε Σ) ε (den tomma strängen) Ø (matchar ingenting) R (en variabel innehållande ett reguljärt uttryck) Språken som definieras av atomära reguljära uttryck L(x) = {x} L(ε) = {ε} L(Ø) = Ø 4 4
Sammansatta reguljära uttryck Om R och S är reguljära uttryck så är: Union R S ett reguljärt uttryck L (R S) = L(R) L(S) Konkatenering R S ett reguljärt uttryck L (R S) = {r s r ε L(R), s ε L(S)} Hölje R* ett reguljärt uttryck L (R*) = L(ε R R R R R R ) Precedensordning: Hölje, Konkatenering, Union Exempel: de jämna binära talen Σ = {, } Reguljärt uttryck: ( )* Vi får med Samt alla sekvenser som börjar med och slutar med Men inga sekvenser som börjar med förutom sekvensen 5 6 Utvidgningar Det är smidigt att införa beteckningar för vanliga mängder: Teckenmängden siffra = {,,,, 4, 5, 6, 7, 8, 9} Reguljärt uttryck som beskriver siffra: siffra = ( 4 5 6 7 8 9) Motsvarande i UNIX: [-9] Reguljärt uttryck för heltalskonstant: (- ε) siffra siffra* Fler utvidgningar Fler operatorer Noll eller en: R? R ε En eller flera: R+ R R* Förenklad definition av heltalskonstanter: -? siffra+ Specialtecken i UNIX. Ett godtyckligt ASCII-tecken ^ början på rad $ Radslut [a-z] Ett teckan som är en bokstav a-z [^-9] Ett tecken som inte är en siffra 7 8 Från reguljärt uttryck (RE) till FSA Denna algoritm konverterar ett RE till en icke-deterministisk automat med ε- övergångar tillstånd: s Accepterande tillstånd s A Ingen övergång till s Ingen övergång från s A RE -> FSA Atomära uttryck Ø: Ingen övergång ε: Lägg till en ε-övergång från s till s A Symbol a: Lägg till en a-övergång från s till s A En variabel innehållande ett reguljärt uttryck Operatorer (givet automater för uttrycken R och S) Union (R S) Lägg till en ε-övergång från s till R- och S- Lägg till ε-övergångar från R-accept och S-accept till s A 9 5
RE -> FSA, forts. Operatorer, forts. Konkatenering (R S) Låt s = R- Låt s A = S-accept Låt R-accept = S- Hölje (R*) Lägg till en ε-övergång från s till R- Lägg till en ε-övergång från R-accept till s A Lägg till en ε-övergång från s till s A Lägg till en ε-övergång från R-accept till R- En annan algoritm tar bort ε-övergångarna Exempel De jämna binära talen: ( )* Ytterst har vi en union: R = s S = ( )* R är ett atomärt uttryck: S är en konkatenering av S = S = ( )* S = S är ett hölje, osv. s a FSA -> RE Nästa gång Det finns en algoritm som gör även denna omvandling Läs mer i boken hur den fungerar Finite state-teknologi i språkteknologin Xerox-verktyget XFST Finns både som gratisversion och en mer kraftfull version som kostar pengar Kan användas för att bygga upp och testa automater och transduktorer 4 6