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
© Copyright 2024