LAP-lunttilappu v. 1.5 Joukko-opin peruskäsitteitä - UEF-Wiki

LAP-lunttilappu v. 1.5
PK 2015-01-09
Aakkoston
Σ
kaikkien
merkkijono∗
jen joukkoa merkitään Σ ;
{0, 1}∗
=
+
{ε, 0, 1, 00, 01, 10, 11, 000, 001, . . .}. Σ = Σ∗ \ {ε}.
Kurssin tueksi — EI tenttiin mukaan!
Merkkijonojen v
= a1 a2 · · · am ja w =
b1 b2 · · · bn katenaatio vw
muodostuu niiden
peräkkäin
asetetetuista
merkeistä:
vw = a1 a2 · · · am b1 b2 · · · bn ; jos v = JÄ ja
w = BÄ, niin vw = JÄBÄ; εw = wε = w kaikilla
w ∈ Σ∗ .
Joukko-opin peruskäsitteitä
Joukko on kokoelma alkioita; {}, {1, 2, 3},
{kissa, koira}, N = {0, 1, 2, . . .}, 2N = {x ∈ N |
x on parillinen}. Sitä että a on joukon A alkio eli
kuuluu joukkoon A merkitään a ∈ A; 1 ∈ {1, 2, 3},
4 ∈ 2N, 4 6∈ {1, 2, 3}, 5 6∈ 2N, kana 6∈ {kissa, koira}.
Sanan
i-kertainen
toisto:
wi
=
0
1
ww · · · w (i kertaa); w = ε ja w = w; Jos
w = HE, niin w3 = HEHEHE.
Tyhjässä joukossa ∅ ei ole yhtään alkiota: ∅ = {}.
Joukko A on joukon B osajoukko, merk. A ⊆ B,
jos jokainen sen alkio on myös joukon B alkio;
{1} ⊆ {1, 2, 3}, {1, 2, 3} ⊆ N, 2N ⊆ N; ∅ ⊆ A
ja A ⊆ A jokaisella joukolla A.
(Aakkoston Σ) merkkijonojen joukkoja (L ⊆ Σ∗ )
kutsutaan (aakkoston Σ) kieliksi ; esim. ∅, Σ∗ .
Kielten A ja B katenaatio AB muodostuu
sanoista, joiden alkuosa voidaan valita joukosta
A ja loppuosa joukosta B: AB = {xy |
x ∈ A, y ∈ B}; {J, JÄ}{ε, BÄ, ÄBÄ} =
{J, JBÄ, JÄBÄ, JÄ, JÄÄBÄ}; Kaikilla kielillä A
pätee A{ε} = {ε}A = A ja A∅ = ∅A = ∅.
Joukkojen A ja B yhdiste A ∪ B koostuu alkioista,
jotka kuuluvat joukkoon A tai joukkoon B (tai
molempiin): A ∪ B = {x | x ∈ A tai x ∈ B};
{1, 2, 3} ∪ {2, 4} = {1, 2, 3, 4}.
Joukkojen A ja B leikkaus A ∩ B koostuu alkioista,
jotka kuuluvat kumpaankin joukkoon A ja B: A ∩
B = {x | x ∈ A ja x ∈ B}; {1, 2, 3} ∩ {2, 4} = {2}.
Kielen A sulkeuma A∗ koostuu sanoista, jotka
voidaan muodostaa katenoimalla nolla tai useampia sen sanoja: A∗ = {w1 w2 · · · wk | k ≥
0, wi ∈ A jokaisella i = 1, 2, . . . , k}; {ab, ba}∗ =
{ε, ab, ba, abab, abba, baab, baba, ababab, . . .}; ∅∗ =
{ε}∗ = {ε}; muiden kielten sulkeuma on ääretön.
Joukkojen A ja B erotus A \ B koostuu alkioista,
jotka kuuluvat joukkoon A mutta eivät kuulu
joukkoon B: A \ B = {x ∈ A | x 6∈ B};
{1, 2, 3} \ {2, 4} = {1, 3}.
Joukkojen A ja B karteesinen tulo A × B
on niiden alkioparien joukko:
A × B =
{(a, b) | a ∈ A, b ∈ B}; {1, 2, 3} × {2, 4} =
{(1, 2), (1, 4), (2, 2), (2, 4), (3, 2), (3, 4)}.
Säännölliset
kielet
äärelliset automaatit
Funktio f joukosta A joukkoon B on sääntö, merk.
f : A → B, joka liittää jokaiseen a ∈ A yksikäsitteisen f (a) ∈ B.
Aakkoston Σ säännöllinen lauseke on muotoa x
missä x ∈ {∅, ε} ∪ Σ, tai (EF ), (E ∪ F ) tai E ∗ ,
missä E ja F ovat säännöllisiä lausekkeita; Esim.
∅, ε, a, ((ab∗ ) ∪ c∗ ), ((a ∪ b)∗ c).
Joukon A potenssijoukko P(A) on joukon
A
osajoukkojen
kokoelma:
P(A)
=
{X
|
X
⊆
A};
P({1, 2, 3})
=
{∅, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}.
ja
lausekkeet,
Säännöllisen lausekkeen E kuvaama kieli L(E) ⊆
Σ∗ määritellään induktiivisesti: L(∅) = ∅, L(x) =
{x} kun x ∈ Σ ∪ {ε}, L((EF )) = L(E)L(F ),
L((E ∪ F )) = L(E) ∪ L(F ) ja L(E ∗ ) = L(E)∗ ;
L(ε) = {ε}, L(a) = {a}, L((ab∗ ) ∪ c∗ )) =
{a, ab, abb, . . . , ε, c, cc, ccc, . . .}, L(((a ∪ b)∗ c)) =
{c, ac, bc, aac, abc, bac, bbc, aaac, . . .}.
Merkkijonot ja formaalikielet
Aakkosto on epätyhjä ja äärellinen joukko
Σ = {a1 , a2 , . . . , aσ } merkkejä eli symboleja;
Esim. binääriaakkosto = {0, 1}, DNA-aakkosto =
{C, A, T, G}, ASCII, UNICODE.
Määritelmä: Kieli on säännöllinen joss se
voidaan kuvata säännöllisellä lausekkeella.
Äärellinen automaatti (FA) M = (Q, Σ, δ, q0 , F )
on viisikko, jossa Q on äärellinen joukko tiloja, Σ
on (syöte)aakkosto, δ siirtymäfunktio, q0 ∈ Q alkutila ja F ⊆ Q joukko (hyväksyviä) lopputiloja. Jos
siirtymäfunktio liittää jokaiseen tilaan q ∈ Q ja
merkkiin a ∈ Σ yksikäsitteisen kohdetilan δ(q, a) ∈
Merkkijono eli sana on järjestetty jono symboleja. Sanan w = a1 a2 · · · an pituus |w| on sen sen
merkkien lukumäärä n. Tyhjä merkkijono ε ei
sisällä yhtään merkkiä; |ε| = 0, |0| = 1, |kissa| = 5.
1
Q eli on muotoa δ : Q × Σ → Q, kyseessä on deterministinen automaatti (DFA). Jos jokaiseen tilaan
q ja merkkiin a liittyy joukko vaihtoehtoisia kohdetiloja δ(q, a) ⊆ Q eli siirtymäfunktio on muotoa
δ : Q × Σ → P(Q), kyseessä on epädeterministinen
automaatti (NFA). Jos siirtymäfunktio sallii tilan
vaihtamisen myös lukematta syötemerkkiä eli se
on muotoa δ : Q × (Σ ∪ {ε}) → P(Q), kyseessä
on ε-automaatti (ε-NFA). Jos automaatti pääsee
siirtymäfunktionsa mukaisesti alkutilastaan q0 johonkin lopputilaan q ∈ F lukien syötteen w ∈ Σ∗
kaikki merkit, automaatti hyväksyy sanan w. Automaatin M tunnistama kieli L(M ) ⊆ Σ∗ koostuu
niistä merkkijonoista, jotka automaatti hyväksyy;
w ∈ L(M ) ∼ automaatti M hyväksyy sanan w, ja
w 6∈ L(M ) ∼ automaatti M hylkää sanan w.
kuvaavia lausekkeita tai tunnistavia automaatteja
muokkaamalla.
Pumppauslemma:
Jokaisella säännöllisellä
kielellä L on pumppauspituus p ∈ N: jokainen
vähintään sen pituinen kielen L sana s voidaan
jakaa osiin s = xyz, missä (1) y 6= ε, (2) |xy| ≤ p
ja (3) xy i z ∈ L kaikilla i ∈ N. Käyttö: Osoitetaan
kieli L ei-säännölliseksi valitsemalla jokin pumppauslemman mukainen sana s ∈ L josta voidaan
perustella, että se ei täytä lemman ehtoja. Esim.
jos kieli L = {an bn | n ∈ N} olisi säännöllinen,
sillä olisi jokin pumppauspituus p ∈ N. Nyt
s = ap bp ∈ L on pumppauslemman mukainen
sana, jonka ehtojen (1) ja (2) mukaisissa jaoissa
s = xyz “pumppaustermi” y = ak jollain k > 0,
joten ehto (3) ei toteudu; siksi kieli L ei voi olla
säännöllinen.
Tulos: Jokaisen NFA:n tai ε-NFA:n M tunnistama
kieli voidaan tunnistaa myös deterministisellä automaatilla, joka syntyy n.s. osajoukkokonstruktiolla:
Kontekstittomat kieliopit ja kielet
Tilan q ∈ Q ε-sulkeuma E(q) ⊆ Q sisältää tilan q ja
siitä ε-siirtymin saavutettavat tilat: q ∈ E(q) ja p ∈
E(q) ⇒ δ(p, ε) ⊆ E(q). Yleistetään ε-sulkeuma ja
siirtymäfunktion δ arvo merkillä a ∈ Σ tilajoukoille
Q0 = {q1 , . . . , qn }: E(Q0 ) = E(q1 ) ∪ · · · ∪ E(qn ) ja
δ(Q0 , a) = δ(q1 , a) ∪ · · · ∪ δ(qn , a).
Kontekstiton kielioppi (CFG) G = (V, Σ, P, S) on
nelikko, jossa V on kieliopin aakkosto, Σ ⊆ V on
päätesymbolien aakkosto ja S ∈ N on lähtösymboli,
missä N = V \ Σ on välikesymbolien aakkosto. P
on joukko sääntöjä eli produktioita, jotka ovat muotoa A → α, missä A ∈ N ja α ∈ V ∗ . Kieliopilla
voidaan johtaa jonosta α ∈ V ∗ jono β ∈ V ∗ , merk.
α ⇒∗ β, jos jonon α voi muuttaa jonoksi β korvaamalla välikesymboleja niiden sääntöjen oikeilla
puolilla. Jos S ⇒∗ α, niin α on kieliopin lausejohdos, ja jos lisäksi α ∈ Σ∗ , se on kieliopin (tuottama)
lause. Kieliopin tuottama tai kuvaama kieli L(G)
koostuu kieliopin tuottamista lauseista: L(G) =
{w ∈ Σ∗ | S ⇒∗ w}.
ε-NFA M = (Q, Σ, δ, q0 , F ) ⇒ DFA M̂ =
(Q̂, Σ, δ̂, qˆ0 , F̂ ): Q̂ ← {qˆ0 ← E(q0 )}; while δ̂(q̂, ·)
puuttuu joltain q̂ ∈ Q̂, muodosta se: for each
a ∈ Σ: δ̂(q̂, a) ← E(δ(q̂, a)) ja Q̂ ← Q̂∪{E(δ(q̂, a))};
Aseta F̂ ← {q̂ ∈ Q̂ | q̂ ∩ F 6= ∅}.1
Tulos: Jokaisen säännöllisen lausekkeen E kuvaama kieli voidaan tunnistaa äärellisellä automaatilla.
Kielen L(E) tunnistava ε-NFA
ME syntyy lausekkeesta E esim. “Thompsonkonstruktiolla”.
Määritelmä: Kieli on kontekstiton joss joku kontekstiton kielioppi tuottaa sen.
Tulos: Jokaisen äärellisen automaatin M tunnistama kieli voidaan kuvata säännöllisellä lausekkeella. Perustelu: Automaatista M voidaan muodostaa kieltä L(M ) kuvaava lauseke (muuntamalla
M kaksitilaiseksi lausekeautomaatiksi ).
Tulos: Kontekstittomat kielet on säännöllisten
kielten aito laajennus.
Perustelu: Jokainen
säännöllinen kieli voidaan kuvata jo lineaarisella
kieliopilla. Toisaalta esim. kielioppi, jonka produktiot ovat S → aSb ja S → ε tuottaa ei-säännöllisen
kielen {an bn | n ≥ 0}.
Säännöllisten kielten sulkeumaominaisuudet
ja pumppauslemma
Sulkeumaominaisuuksia: Jos A ja B ovat kontekstittomia kieliä, niin myös AB, A ∪ B, A∗ ja AR
ovat kontekstittomia; A ∩ B ja A eivät välttämättä
ole kontekstittomia.
Tulos: Jos A ja B ovat aakkoston Σ säännöllisiä
kieliä, niin myös AB, A ∪ B, A∗ , A = Σ∗ \ A, A \ B,
A ∩ B sekä AR = {a1 a2 · · · an | an an−1 · · · a1 ∈
A, ai ∈ Σ} ovat säännöllisiä kieliä. Perustelut kieliä
1
Pinoautomaatti (PDA) M = (Q, Σ, Γ, δ, q0 , F ) on
kuusikko, jossa Q on äärellinen joukko tiloja, Σ
on (syöte)aakkosto, Γ on pinoaakkosto, δ siirtymäfunktio, q0 ∈ Q alkutila ja F ⊆ Q joukko
lopputiloja. Pinoautomaatin siirtymäfunktio δ :
X ← Y tarkoittaa sijoitusta “X saa arvon Y ”.
2
Q × (Σ ∪ {ε}) × (Γ ∪ {ε}) → P(Q × (Γ ∪ {ε})
voi riippua tilan ja syötemerkin lisäksi pinon huipulla olevasta merkistä, ja kohdetilaan siirtymisen
lisäksi voi lisätä/poistaa/vaihtaa pinon huipulla
olevan merkin. Syötteen hyväksymisen ja kielen
tunnistamisen määritelmä on muuten sama kuin
äärellisillä automaateilla.
Rekursiivisesti etenevä LL(1)-jäsennys: Laske
etukäteen sääntöjen first-joukot. Tee kieliopin
kullekin symbolille oma jäsennysproseduuri.
Välikesymbolin jäsennysproseduuri valitsee sovellettavan säännön viimeksi luetun päätesymbolin
ja
sääntöjen
first-joukkojen
perusteella.
Päätesymbolin
jäsennysproseduuri
tarkistaa,
että viimeksi luettu päätesymboli on oikea ja lukee
seuraavan päätesymbolin.
Tulos: Jokainen kontekstiton kieli voidaan tunnistaa (epädeterministisellä) PDA:lla, ja jokaisen
PDA:n tunnistama kieli on kontekstiton.
Kieliopin G = (V, Σ, P, S) mukaisen lauseen w ∈
L(G) jäsennyspuu on järjestetty puu, jonka (1) juuri on S, (2) lehtien katenointi muodostaa jonon w
ja (3) jokaisella sisäsolmulla A ∈ N on lapsisolmuina x1 , x2 , . . . , xk vain jos A → x1 x2 · · · xk ∈ P .
Kielioppi on moniselitteinen jos se sallii jollekin
syötteelle vaihtoehtoisia jäsennyspuita.
LL(1)-kielioppi mahdollistaa kielen osittavan (topdown), vasemmalta oikealle etenevän jäsentämisen
siten, että sovellettavat produktiot määräytyvät
yhden päätesymbolin kurkistuksella.
Jonoille α ∈ V ∗ määritelty joukko first(α) ⊆ (Σ∪
{ε}) koostuu päätesymboleista, jotka voivat aloittaa jonosta α johdettavissa olevan jonon; jos α ⇒∗
ε, myös ε ∈ first(α). Välikkeille A määritelty
joukko follow(A) ⊆ Σ koostuu päätesymboleista,
jotka voivat esiintyä kieliopin lausejohdoksissa heti
välikkeen A oikealla puolella.
Formaali LL(1)-ehto: Jos A → α1 | α2 | · · · | αk
ovat välikesymbolin A vaihtoehtoiset säännöt, niin
(1) first(αi ) ∩ first(αj ) = ∅ kun i 6= j ja (2) jos
A ⇒∗ ε niin follow(A) ∩ first(αi ) = ∅ jokaisella
ei-nollautuvalla αi eli kun αi 6⇒∗ ε.
Kieliopin muokkaaminen LL(1)-muotoon (ei ole
aina mahdollista!):
Sääntöjen yhteisten alkuosien poisto: Korvaa
(esim.) säännöt A → αβ1 | αβ2 , missä α 6= ε on
niiden pisin yhteinen alkuosa, säännöillä A → αA0
ja A0 → β1 | β2 .
Välittömän vasemman rekursion poisto: Korvaa
(esim.) produktiot A → Aa | Ab | c | d produktioilla A → cA0 | dA0 ja A0 → aA0 | bA0 | ε.
Yleinen vasemman rekursion poisto: Käsittele
välikkeet jossain järjestyksessä A1 , . . . , An : (i) Jos
välikkeellä Ai on muotoa Ai → Bα olevia sääntöjä,
joissa B on aiemmin käsitelty välike, korvaa ne
säännöillä jotka muodostuvat laventamalla B sen
säännöillä B → β1 | · · · | βk ; (ii) Poista välikkeen
Ai mahdollinen välitön vasen rekursio kuten yllä.
3