Reguliere Expressies en Automaten: Overzicht

advertisement
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
Download