Reguliere Expressies en Automaten: Overzicht Alfabetten Tekenrijtjes over een alfabet Talen over een alfabet Reguliere Uitdrukkingen Reguliere Operaties Herkenners voor Reguliere Patronen Deterministische automaten Non-deterministische automaten Woordenlijsten als automaat Non-deterministische automaten ⇒ deterministische automaten De pomp-eigenschap van reguliere talen Transducers Opdrachten Reguliere Uitdrukkingen – Jan van Eijck – p.1 Alfabetten Een alfabet Σ is een eindige verzameling symbolen. Voorbeelden: • Σ1 = {0, 1, 2, 3, 4, 5, 6, 7.8.9}. De tien-elements verzameling van de decimale cijfers. • Σ2 = {a, b, c, . . . , x, y, z}. De 26-elements verzameling van alle kleine letters van het Nederlands. Een niet-voorbeeld: • N = {0, 1, 2, . . .}. De verzameling van alle natuurlijke getallen is geen alfabet, want deze verzameling is oneindig. Reguliere Uitdrukkingen – Jan van Eijck – p.2 Tekenrijtjes over een alfabet Een tekenrijtje van lengte n(≥ 0) over een alfabet Σ is een geordend n-tal van elementen van Σ, geschreven zonder leestekens. Voorbeeld: als Σ = {a, b, c}, dan zijn a, aa, ab, acc en bbac tekenrijtjes over Σ, met respectieve lengtes 1, 2, 2, 3, 4. def ∗ Σ = de verzameling van alle tekenrijtjes over Σ met een eindige lengte. Er is precies één tekenrijtje over Σ van lengte 0. Dit rijtje heet het lege rijtje, en we gebruiken er de notatie ε of {} voor. We spreken af dat tekenrijtjes altijd eindig zijn (een eindige lengte hebben). Reguliere Uitdrukkingen – Jan van Eijck – p.3 Talen over een alfabet Een taal is een verzameling tekenrijtjes over een alfabet. Dus: een taal over alfabet Σ is een deelverzameling van Σ∗ . Voorbeelden: • De verzameling {michael, jan}; een taal die slechts twee rijtjes bevat. • De verzameling van alle tekenrijtjes die bestaan uit letters van het alfabet {a, . . . , z}. • De verzameling van alle tekenrijtjes die bestaan uit tekens uit het alfabet {0, . . . , 9} (alle decimale representaties van natuurlijke getallen, met eventueel nullen voorop). Een niet-voorbeeld: de verzameling die bestaat uit het ene rijtje 0, 14285714285714 . . . (de decimale expansie van 17 ). Dit rijtje is oneindig. Reguliere Uitdrukkingen – Jan van Eijck – p.4 Reguliere Uitdrukkingen (notatie egrep) a*b* een willekeurig aantal as, gevolgd door een willekeurig aantal b’s. Deze taal bevat de tekenrijtjes aaabb, aab, aaaaa, bbb, maar niet de tekenrijtjes aba, bbaa, acb, cab. (ab)* een willekeurig aantal keren het tekenrijtje ab: ab, ababab, maar niet abba, aabb, of bb. . een willekeurig symbool .* een willekeurige reeks symbolen ˆ[ˆa]*$ een regel die geen a bevat. .*q.* alle tekenrijtjes waarin ergens een q voorkomt. (ac|abc)*: alle rijtjes die bestaan uit een willekeurig aantal malen ac of abc. Dus: acabc, abc, acac zitten er in, ab niet. Reguliere Uitdrukkingen – Jan van Eijck – p.5 Reguliere Operaties Lege rijtje, aangeduid als {} Los symbool van het alfabet Σ, bij voorbeeld a Opeenvolging, bij voorbeeld ab Keuze, bij voorbeeld (a|b) Iteratie, bij voorbeeld a* Dat is alles. Andere operaties kunnen nu als afkorting worden ingevoerd. Uitgaande van het alfabet {a, b, c} hebben we bij voorbeeld: ˆa = (b|c) . = (a|b|c) a+ = aa* ˜a = ({}|b|c|...*). Reguliere Uitdrukkingen – Jan van Eijck – p.6 Herkenners voor Reguliere Patronen Leeg rijtje: zeg ja. Enkel symbool a: kijk of je een symbool kunt inlezen. Zeg nee als dat niet lukt, of het symbool is geen a. Zeg ja als het volgende symbool een a is. Opeenvolging AB: zeg ja als je eerst A kunt herkennen en vervolgens B, anders nee. Keuze (A|B): zeg ja als je hetzij A, hetzij B kunt herkennen. Iteratie A*: probeer A te herkennen zolang er nog invoer is. Dit is een herhalings-lus. Dit kan machinaal, met behulp van een eindige automaat: een machine die invoer kan lezen, en ja of nee kan zeggen, afhankelijk van de toestand waarin hij is. Reguliere Uitdrukkingen – Jan van Eijck – p.7 Deterministische automaten Doel: inlezen van rijtjes, om te kijken of ze aan een regulier patroon voldoen. Begintoestand: hier start je. Toestandsovergang bij het lezen van een enkel symbool van het alfabet: voor elk symbool hoogstens één overgang (dit heet determinisme). Ja-toestanden: toestanden waarbij de automaat het rijtje accepteert (als alle invoer gelezen is). Nee-toestanden: toestanden waarbij de automaat het rijtje verwerpt (als alle invoer gelezen is). Reguliere Uitdrukkingen – Jan van Eijck – p.8 Deterministische Automaat voor (a*|b*|c*) Voor elk symbool precies één overgang. a c a b a b a b b c c a b c c Reguliere Uitdrukkingen – Jan van Eijck – p.9 Determinische Automaat voor (a*|b*|c*) Voor elk symbool hoogstens één overgang. a a b c b c Reguliere Uitdrukkingen – Jan van Eijck – p.10 Non-deterministische automaat voor (ab|aba)* b a a b Reguliere Uitdrukkingen – Jan van Eijck – p.11 Nog gemakkelijker: ab aba Reguliere Uitdrukkingen – Jan van Eijck – p.12 Woordenlijsten als automaat Woordenlijsten kunnen op verschillende manieren als automaat worden gepresenteerd. Vergelijk de volgende reguliere expressies. (aap|alp|aak|alm) a(l(p|m)|a(p|k)) Een automaat op basis van de tweede staat sneller zoeken toe. Reguliere Uitdrukkingen – Jan van Eijck – p.13 Non-deterministische ⇒ Deterministische Automaten Twee automaten zijn equivalent wanneer ze dezelfde taal accepteren. Voor elke non-deterministische automaat is er een equivalente deterministische automaat te construeren. Voor overgangen met symboolrijtjes, bij voorbeeld, ab, dienen tussenliggende toestanden te worden geı̈ntroduceerd. Voor de rest van de constructie is het hoofdidee: maak nieuwe toestanden die bestaan uit verzamelingen van oude toestanden. Zorg dat de nieuwe automaat na lezen van invoer ab in de verzameling toestanden komt die in de oude automaat kunnen worden bereikt vanaf start met het lezen van deze invoer. Reguliere Uitdrukkingen – Jan van Eijck – p.14 Voorbeeld van Non-deterministische automaat {} 1 3 a {} 0 b {} a a {} 4 2 b NB: {} staat voor het lege rijtje. Reguliere Uitdrukkingen – Jan van Eijck – p.15 Omzetten naar Deterministische Versie a {0,1,2,3} a {0,1,2,3,4 } a b b a a {2,3,4] b {3,4} b {} b Reguliere Uitdrukkingen – Jan van Eijck – p.16 Pomp-eigenschap van reguliere talen Als T een oneindige reguliere taal is. Dan zijn er rijtjes x,y,z te vinden met y 6= ε, en [x,yn ,z] in T, voor elke n ≥ 0. Idee: omdat T regulier is, is er een deterministische automaat die T herkent. Die automaat heeft een eindig aantal toestanden, zeg k. Omdat de taal oneindig is moeten er rijtjes in T zitten die lengte > k hebben. Dus moet de automaat bij het herkennen van zo’n rijtje een toestand q meer dan één keer bereiken. Maar dan bevat de herkenningsprocedure een lus. Tijdens het doorlopen van die lus wordt een niet-leeg rijtje ingelezen. Noem dat rijtje y, en klaar. Reguliere Uitdrukkingen – Jan van Eijck – p.17 De pompeigenschap gebruiken We willen laten zien dat bepaalde talen niet regulier zijn. De taal { a p | p is een priemgetal } is niet regulier. De taal { an bn | n ≥ 0 } is niet regulier. wwR (de taal van alle even palindromen) is niet regulier. Verzin zelf nog meer voorbeelden. Reguliere Uitdrukkingen – Jan van Eijck – p.18 Transducers Een transducer is een automaat die tot taak heeft eindige invoer rijtjes om te zetten in eindige uitvoerrijtjes. In plaats van alleen een symbool a te lezen, zet de transducer het symbool om in een rijtje. We nemen aan dat een transducer deterministisch is (anders wordt de uitvoer onvoorspelbaar). Maak van een deterministische automaat een transducer door elke pijl met een symbool te vervangen door een pijl met een symbool gevolgd door een rijtje w. Dus: vervang a door a:w. Voorbeeld: a:1 b:{} Reguliere Uitdrukkingen – Jan van Eijck – p.19 Transducers: voorbeelden Programma’s die patronen omzetten in andere patronen zijn in feite transducers. Bij voorbeeld: • Het omzetten van je eigen naam in hoofdletters, overal waar die naam voorkomt in een bestand. • Het weglaten van regels uit een bestand die alleen spaties bevatten. • Het comprimeren van rijtjes van meer dan één spatie in een regel door een enkele spatie. Je kunt transducers specificeren met sed (zie opdrachten verderop). Reguliere Uitdrukkingen – Jan van Eijck – p.20 Opdrachten: Deterministische automaten construeren Geef (deterministische) automaten over het alfabet 0,1 voor de volgende natuurlijke taal determinatoren: 1. Alle (dwz, de automaat die alleen rijtjes 1-en accepteert) 2. Geen 3. Sommige 4. Niet alle 5. meer dan drie 6. hoogstens zeven 7. minstens drie en hoogstens zeven Reguliere Uitdrukkingen – Jan van Eijck – p.21 Opdrachten: Reflectie op automaten 1. Is er een algemeen recept te vinden voor hoe je de automaat voor ‘Niet alle’ construeert uit die voor ‘alle’ ? 2. Net zo: is er een algemeen recept om de automaat voor ‘minstens drie en hoogstens zeven’ te construeren uit die voor ‘minstens drie’ en ‘hoogstens zeven’? 3. Is het mogelijk een automaat te geven voor de determinator ‘meer dan de helft’? Als je denkt dat het kan, geef dan de automaat die het doet, en anders: geef zo nauwkeurig mogelijk aan waarom je denkt dat het niet kan. Reguliere Uitdrukkingen – Jan van Eijck – p.22 Opdracht: Regulier of niet? De decimale expansie van 17 vind je door de staartdeling 7/1\.. uit te voeren. Dat levert op: 1 7 = 0, 14285714285714 . . . (enz, ad infinitum) Laat T de taal zijn van alle deelstukken genomen uit deze oneindige expansie, dwz T = {w | w is een deelrijtje van 0, 14285714285714...}. Dit is een taal over het alfabet ‘,’, ‘0’, ..., ‘9’. Is deze taal regulier? Zo ja: geef een automaat die de taal herkent. Zo nee: geef aan waarom de taal volgens jou niet regulier kan zijn. Reguliere Uitdrukkingen – Jan van Eijck – p.23 Opdrachten: Transducers 1. Definiëer een transducer die klinkers van medeklinkers onderscheidt. 2. Definiëer een transducer die je eigen naam omzet in hoofdletters, maar de rest van de tekst ongemoeid laat. 3. Definiëer een transducer die je eigen naam vervangt door NN, maar de rest van de tekst ongemoeid laat. 4. Definiëer een transducer die getallen in arabische cijfers (1 tot en met 20) omzet in woorden (‘een’ tot en met ‘twintig’), en de rest van de tekst ongemoeid laat. 5. Geef een transducer voor het comprimeren van rijtjes van meer dan één spatie in een regel door een enkele spatie. 6. Maak implementaties in sed. Reguliere Uitdrukkingen – Jan van Eijck – p.24