5. előadás Reguláris kifejezések, a reguláris nyelvek jellemzése 1. Dr. Kallós Gábor 2014 2015 1
Tartalom Reguláris kifejezések Meghatározás, tulajdonságok Kapcsolat a reguláris nyelvekkel A reguláris nyelvek általános tulajdonságai A reguláris nyelvek osztályának jellemzése a körbebizonyítás Az 1. állítás és igazolása Ekvivalens reguláris és 3-típusú nyelvek Feladatok 2
Reguláris kifejezések Reguláris nyelvek Eddig: generáló reguláris nyelvtannal Most: új előállítási módszer (a reguláris kifejezés egy formula, amely szavakat állít elő) Legyen X egy ábécé Az alap ábécé jelölésére X helyett Ʃ is szokásos Definíció: Az X feletti reguláris kifejezések (Regular Expression, RE) halmaza az (X {, (, ), +, *})* halmaz legszűkebb olyan U részhalmaza, amelyre teljesül: U (λ U), a X-re a U, ha R 1, R 2 U, akkor (R 1 ) + (R 2 ), (R 1 ) (R 2 ) és (R 1 )* is elemei U-nak. (R 1 ) + (R 2 ): unió művelet (R 1 ) (R 2 ): konkatenáció művelet (a elhagyható) (R 1 )*: iteráció művelet (vagy: tranzitív lezárás, Kleene csillag) Kérdés: λ U-t nem kell feltétlenül kiírni (ha legalább egy a U található). Miért? Az X feletti reguláris kifejezések tehát az X elemeiből, valamint a, (, ), +, * (és esetleg ) szimbólumokból álló bizonyos szavak Alternatív definíció: X ábécé felett reguláris kifejezés, λ reguláris kifejezés, a X-re a reguláris kifejezés, amennyiben p és q reguláris kifejezések X felett, akkor p + q, p q és p* is reguláris kifejezések. 3
Reguláris kifejezések Megjegyzések A zárójelek itt ha ez nem okoz gondot elhagyhatók, precedencia a műveletekre: * (iteráció), majd konkatenáció, végül unióképzés (tudjuk már; lényegében: ^,, +) Például (A + B) (C + D) = AC + AD + BC + BD De vigyázzunk, ha A B, akkor A + B = B Hasonlóan: (a + ((b*)c)) = a + ((b*)c) = a + (b*)c = a + b*c A precedencia itt is megváltoztatható zárójelezéssel A reguláris kifejezések megadása környezetenként lehet kissé eltérő (gyakran: használható a vagy / unió kapcsolatra; ill. a + művelet -val is jelölhető), de ez nem okoz zavart Példák Legyen X = {a, b, c}. Ekkor (a + b c)* (c + ) reguláris kifejezés X felett, (a + b +) nem reguláris kifejezés. Adjunk meg további példákat reguláris és nem reguláris kifejezésre X felett! Legyen X = {0, 1}. Ekkor a 010 részt tartalmazó szavakat definiáló reguláris kifejezés megadható a következő módokon: (((0) + (1))*) (010) (((0) + (1))*) ((0) + (1))* (010) ((0) + (1))* (0 + 1)* (010) (0 + 1)* (0 + 1)* 010 (0 + 1)* vagy: (0 + 1)*(010)(0 + 1)* (0 1)* 010 (0 1)*. A kifejezést kielégítő szó: 00101011. 4
Reguláris kifejezések és reguláris nyelvek Minden X feletti R reguláris kifejezés meghatároz (reprezentál) egy X feletti nyelvet Definíciók: Legyen R egy X feletti reguláris kifejezés. Az R által meghatározott (reprezentált) R nyelvet indukcióval a következőképpen definiáljuk: Ha R = (szimbólum), akkor R = (nyelv), Ha R = a (szimbólum), akkor R = {a} (nyelv), Ha R = (R 1 ) + (R 2 ), akkor R = R 1 R 2, Ha R = (R 1 ) (R 2 ), akkor R = R 1 R 2, Ha R = (R 1 )*, akkor R = R 1 *. Egy L X * nyelvről azt mondjuk, hogy reguláris nyelv, ha reprezentálható reguláris kifejezéssel, vagyis, ha van olyan X feletti R reguláris kifejezés, amelyre L = R Igazoljuk majd, hogy ez konzekvens a korábbi meghatározással (korábban: 3-típusú, jobblineáris, reguláris) Megjegyzés R helyett az L(R) jelölés is használatos, ekkor L( ) =, L(λ) = {λ}, L(a) = {a} L(R 1 + R 2 ) = L(R 1 ) L(R 2 ) L(R 1 R 2 ) = L(R 1 ) L(R 2 ) L((R 1 )*) = (L(R 1 ))* 5
Reguláris kifejezések és reguláris nyelvek Az unió és a konkatenáció műveletek tartják a végességet, vagyis ha a * művelet nem szerepel egy reguláris kifejezésben, akkor az általa leírt nyelv véges Így pontosan a véges nyelvek egy jellemzését kapjuk (lásd 15. slide) Definíció: Két reguláris kifejezés ekvivalens, ha ugyanazt a nyelvet generálják Formális jelöléssel: p q, ha L(p) = L(q) Egy reguláris nyelvhez általában több generáló reguláris kifejezés is található (Érdekes problémák: El lehet-e dönteni algoritmussal, hogy két reguláris kifejezés ugyanazt a nyelvet állítja-e elő? Van-e egy adott nyelvhez őt előállító minimális legrövidebb reguláris kifejezés? A válasz mindkét kérdésre igen, lásd lent.) A definíciókból az is következik, hogy az X feletti reguláris nyelvek pontosan azok a nyelvek, amelyek előállnak az üres halmazból (mint nyelvből), és az {a} alakú elemi nyelvekből (ahol a X) az egyesítés, a konkatenáció és az iteráció műveletek véges sokszori alkalmazásával (Lásd még: zártság, 13. slide) Ezt a tulajdonságot fel fogjuk használni a későbbiekben 6
Reguláris kifejezések és reguláris nyelvek Példák Reprezentált nyelvek megadása szavak felsorolásával (Legyen X = {a, b}) ( )* = * = * = {λ} = {λ} (a + b)* = a + b * = {a, b}* = tudjuk (ab) (a)* = (ab) (a)* = a b (a) * = a b a * = {a}{b}{a}* = = {ab}{λ, a, aa, } = {ab, aba, abaa, } L((a + b) a*) = L(a + b) L(a*) = (L(a) L(b)) (L(a))* = = ({a} {b})({a})* = {a, b}{λ, a, aa, aaa, } = Az utóbbi nyelvet adjuk meg halmaz definícióval is! Reprezentált nyelvek megadása halmaz definícióval L(a* b (a + b)) = {a n ba, a n bb n 0} L((aa)*(bb)*b) = {a 2n b 2m b n, m 0} (Legyen X = {0, 1}) L(0* 0 1* 1 0) = {0 n 1 m 0 n 1, m 1} Reprezentált nyelvek megadása szóbeli leírással L(0 (0 + 1) (0 + 1)*) = {0-val kezdődő, legalább 2 hosszú szavak} L(0 (0 + 1)* 1 (0 + 1)* 1 (0 + 1)*) = {0-val kezdődő, legalább két 1-est tartalmazó szavak} 7
Reguláris kifejezések és reguláris nyelvek Feladatok Adjuk meg az L((a + b c)*) nyelvet! Adjuk meg az L((a + b)*(a + bb)) nyelvet! Adjuk meg az L((a c + b c)*) nyelvet! Szerepelhet a nyelv valamely szavában az ab részszó? Milyen nyelveket definiálnak a következő reguláris kifejezések: (a + b)* (aa + bb)(a + b)* (a + b)* (aa (b + a)* bb + bb (a + b)* aa) (a + b)* Írjuk le szavakkal vagy halmaz definícióval az alábbi reguláris kifejezésekkel meghatározott nyelveket! 0 (0 + 1)*1 (a + b)* a (a + b)* (λ + 1)* 0* 001 (111)* Adjunk meg ekvivalens reguláris kifejezést a következőkhöz! (Lásd köv. old.) (a + b + aa + bb), (a + b) (a + bb) (a + b) a*, (a + b)*(a + bb) (a c + b c)*, (aa)*(bb)*b Mely esetekben lesz a generált nyelv véges? 8
Reguláris kifejezések és reguláris nyelvek Általános ekvivalenciák Itt P, Q, R és T tetszőleges reguláris kifejezések: P P +, P + Q Q + P, (P + Q) + R P + (Q + R), (P Q) R P (Q R), (P + Q) (R + T) (PR + PT + QR + QT), (ebből több másik ekvivalencia is következik, lásd lent) (P + Q)* (P* + Q)* (P + Q*)* (P* + Q*)*, (P*)* P*, RR* R*R, RR* + λ R*. Írjuk le, hogy mi adódik (P + Q) (R + T) -ból, ha Q = vagy T =! Emellett egyéb ekvivalenciák is felírhatók, pl. * λ(7. slide) Példák ekvivalens kifejezésekre Az {a, ab} ( szegényes ) nyelvhez (a *) + (a b) = {a, ab}, és a + a b = {a, ab} 1*1* 1*, 1*(1 + *) 1* 9
Reguláris kifejezések és reguláris nyelvek Feladatok Adjuk meg reguláris kifejezéssel azt a nyelvet az X = {0, 1} ábécé felett, amely azon szavakból áll, amelyek tartalmazzák részszóként a 010 szót! Megoldás: L = ((0) + (1))* (010) ((0) + (1))* = (0 + 1)*(010) (0 + 1)* Vagy másként, csak a definiáló reguláris kifejezés (2. jelölésmód): R = (0 1)*(010) (0 1)* amely azon szavakból áll, amelyek tartalmazzák részszóként a 000 vagy az 111 szót! Megoldás: L = ((0) + (1))* ((000) + (111)) ((0) + (1))* = = (0 + 1)*(000 + 111) (0 + 1)* Csak a definiáló reguláris kifejezés (2. jelölésmód): R = (0 1)*(000 111) (0 1)* amely azon 1-esre végződő szavakból áll, amelyek nem tartalmazzák részszóként a 00 szót! Megoldás: L = ((1) + (01))* = (1 + 01)* amely azon szavakból áll, amelyek hárommal osztható számú egyest tartalmaznak! Megoldás: L = ((0)* (1) (0)* (1) (0)* (1) (0)*)* = (0* 1 0* 1 0* 1 0*)* amely azon szavakból áll, amelyek 3. betűje 0! amely azon szavakból áll, amelyek tartalmaznak legalább három egyest! További feladatok Egyszerűsítsük a felesleges zárójeleket tartalmazó alakokat! Próbáljunk ekvivalens kifejezéseket is keresni! (pl. utolsó előtti feladat) 10
Reguláris kifejezések és reguláris nyelvek Feladatok haladóknak Vizsgáljuk meg az a*(ba*)* és a b*(ab*)* kifejezések által előállított nyelveket! Azonosak-e? (Útm.: Próbáljuk ki sorban az {a, b}* feletti szavak előállítását) Mondhatjuk-e, hogy az előállított nyelv {a, b}*? Ha nem, akkor keressünk ekvivalens reguláris kifejezést {a, b}* előállítására! *Próbáljunk minél egyszerűbb kifejezést megadni! Adjunk meg két különböző reguláris kifejezést {0, 1}* felett a páros számú egyest tartalmazó szavak előállítására! Adjunk reguláris kifejezést a legfeljebb egy, ill. legfeljebb három db a-t tartalmazó {a, b}*-beli szavak előállítására! Hogyan lehetne megadni reguláris kifejezéssel egy előjeles egész számot (tízes számrendszerben)? Milyen problémákba ütközünk, milyen megoldás jöhet szóba? Bővítsük a megoldást úgy, hogy törtszámokat is tudjunk kezelni! Konstruáljunk olyan példát, hogy egy általunk választott hosszú (pl. 15-20 karakternél hosszabb) és egy rövid reguláris kifejezés ekvivalens! Ellenőrizzük a konstrukciónkat! 11
Reguláris kifejezések Példa (alkalmazás) (A reguláris kifejezések nyelveket határoznak meg, azok pedig felismerhetők automatákkal, lásd lent) A lexikális elemző (lásd később, fordítás) egy olyan az eredeti programszövegből előállított karaktersorozatot dolgoz fel, amely szintén megadható reguláris kifejezések segítségével Jelöljön most D egy tetszőleges számjegyet és L egy tetszőleges betűt, azaz D {0, 1,, 9} és L {a, b,, z, A, B,, Z}. A nem látható karaktereket jelöljük a rövid nevükkel (pl. space, Eof, Eol). Néhány szimbólum megadása reguláris kifejezéssel Egész szám: (+ λ) D + Vagy: (+ λ) DD* Pozitív egész és valós szám: (D + ( λ.)) (D*. D + ) Kitevő részt is tartalmazó valós szám: (+ λ) D +. D + (E(+ λ) D + λ) Egyszerű azonosító szimbólum: L (L D)* Azonosító szimbólum: L ((_ λ) (D L))* Komment: // (Not(Eol))*Eol ## karakterpárokkal határolt komment: ## ((# λ) Not(#))* ## Kérdés: Mi itt a belső blokk szerepe? Feladat: Adjuk meg az 1., 2., 4., 5., 6. és 7. kifejezésekhez konstruálható determinisztikus véges automatákat! (Cs. Z. 16.) 12
A reguláris nyelvek tulajdonságai Eml.: Mit jelent a zártság? Veszünk egy (vagy kettő, három, ) tetszőleges nyelvet az adott típusból Alkalmazzuk a nyelvre/nyelvekre a megfelelő műveletet Ha igazolni tudjuk, hogy az eredményül kapott nyelv szintén mindig beletartozik az adott típusba, akkor az adott típusú nyelvek zártak (azaz maga a nyelvosztály zárt) az adott műveletre Eml.: Mire jó a zártság? Egyszerűen igazolható sokféle származtatott nyelv adott típusba tartozása Nyelvosztály általános jellemzéséhez stb. Tétel: A reguláris nyelvek osztálya zárt a reguláris műveletekre nézve Bizonyítás: Meg kell mutatni, hogy ha L, L 1, L 2 X * reguláris nyelvek, akkor L 1 L 2, L 1 L 2 és L* is azok. (Eml.: Egy nyelv reguláris, ha van olyan X feletti reg. kif., ami előállítja.) Legyenek tehát R, R 1 és R 2 olyan reguláris kifejezések, amelyekre R = L, R 1 = L 1 és R 2 = L 2 (ilyenek találhatók). A reguláris kifejezések definíciója szerint (R 1 ) + (R 2 ), (R 1 ) (R 2 ) és (R)* is reguláris kifejezések. Továbbá, a reprezentált nyelv definíciója szerint (R 1 ) + (R 2 ) = L 1 L 2, (R 1 ) (R 2 ) = L 1 L 2, (R)* = L*. Tehát az L 1 L 2, L 1 L 2 és L* nyelvek reprezentálhatók reguláris kifejezésekkel, így regulárisak. Megj.: A reguláris műveletekre a többi nyelvosztály is zárt (kivéve 2.5 típ., lásd D. P.) 13
Formális nyelvek A reguláris nyelvek tulajdonságai Állítás: Az X* feletti nyelvek nyelvalgebrát alkotnak. Azaz: Az L, L 1, L 2 és L 3 X* reguláris (kifejezések által definiált) nyelvekre érvényesek a következő tulajdonságok: L 1 L 2 = L 2 L 1 (az összeadás kommutatív) (L 1 L 2 ) L 3 = L 1 (L 2 L 3 ) (az összeadás asszociatív) L = L (létezik additív egységelem) (L 1 L 2 )L 3 = L 1 (L 2 L 3 ) (a szorzás asszociatív) L{λ} = {λ}l = L (létezik multiplikatív egységelem) (L 1 L 2 )L 3 = L 1 L 3 L 2 L 3 (baloldali disztributivitás) L 1 (L 2 L 3 ) = L 1 L 2 L 1 L 3 (jobboldali disztributivitás) {λ}* = {λ}, * = {λ} LL* = L*L, L* = {λ} LL* (eml.: L + = LL*) (L 1 L 2 )* = (L 1 * L 2 *)* (unió kiváltása) k = ( ) U k i L L L, k 1 i= 1 Igazolás (*csak az utolsó kifejezésre): Bal oldali szavak: üres szó, és p = p 1 p 2 p n (n 1) alakúak, ahol p 1, p 2,, p n L, és van nem üres szó a p i -k között Legyen most n = uk + v, ahol 0 v < k. Ekkor p = q 1 q 2, ahol vagy q 1 = λ (ekkor u = 0), vagy pedig q 1 = p 1 p 2 p uk, ahol p 1, p 2,, p uk L, (ha u 0), és ugyanekkor vagy q 2 = λ (ekkor v = 0), vagy q 2 = p uk+1 p uk+2 p uk+v, ahol p uk+1, p uk+2,, p uk+v L, (ha v 0). Mindenképpen fennáll, hogy q 1 (L k )*, és q 2 L v (0 v < k), azaz p = q 1 q 2 (L k )*L v. Így tehát p mindkét oldalnak eleme. 14
A reguláris nyelvek tulajdonságai Állítás: Minden véges nyelv reguláris Bizonyítás: Legyen X egy ábécé és L X* egy véges nyelv. Ha L =, akkor L nyilván reguláris, hiszen L = R, ahol R =. Különben megadható L = {x 1, x 2,, x n }, ahol n 1 (a szavak felsorolhatók). Mivel L = {x 1 } {x 2 } {x n }, és a reguláris nyelvek zártak az unió műveletre, elegendő igazolni, hogy az {x i } alakú nyelvek regulárisak. Ha x i = λ, akkor {x i } = R i, ahol R i = ( )*, azaz {x i } reguláris. Különben x i = a i1 a i2 a im, ahol m 1, és a i1, a i2,, a im X. Az {a i1 }, {a i2 },, {a im } betűkhöz tartozó nyelvek regulárisak (a definícióból), így az {x i } = {a i1 }{a i2 } {a im } nyelv is reguláris, mert a reguláris nyelvek zártak a konkatenációra. Alternatív bizonyítás: Legyen L = {w 1, w 2,, w n } véges nyelv (megadhatjuk az elemeinek a felsorolásával) valamilyen T ábécé felett, ekkor a G = ({S}, T, S, {S w i w i L}) (nagyon egyszerű) nyelvtan pontosan L-t generálja. Másrészt G minden szabályára igaz, hogy a jobboldalon csak terminálisok szerepelhetnek, így a G reguláris. (Ez a bizonyítás felhasználja, hogy a 3-típusú nyelvek osztálya megegyezik a reguláris nyelvek osztályával, lásd körbebiz. vége) Megjegyzések Tudjuk, hogy vannak végtelen reguláris nyelvek is (lásd 2. slidesor., ill. lent) (Azaz: nem minden reguláris nyelv véges, itt tehát valódi tartalmazás áll fent!) Példa: végtelen reguláris nyelv Az (aa)* reguláris kifejezés által generált nyelv: L = {a 2n n 0} Ugyanez a nyelv a G = ({S}, {a}, S, {S aas, S λ}) nyelvtannal is megadható 15
A reguláris nyelvek osztályának jellemzése A továbbiakban megmutatjuk, hogy Tétel: Tetszőleges Ʃ ábécé felett a korábban megismert 3-típusú nyelvek osztálya, a véges automatákkal felismerhető nyelvek osztálya és a reguláris nyelvek osztálya egymással megegyezik (Eml.: 3-típusú nyelvtan szabályaira N T* vagy N T*N, itt T = Ʃ = X = I) Több lehetséges igazolási mód is elképzelhető Mi a bizonyítást 3 állításra bontjuk ( körbebizonyítás, F. Z.) Ötlet: 1. tul. (reg.) 2. tul. (3-típ.) 3. tul. (véges aut. felism.) 1. tul. (reg.) Más megközelítés, B. I.: Véges automatával felismerhető és 3-típusú nyelvek ekvivalenciája (32 34); az előzőek és reguláris nyelvek ekvivalenciája (73 78) Állítás 1: Tetszőleges Ʃ ábécé feletti L reguláris nyelv generálható 3-típusú nyelvtannal Bizonyítás: Indukcióval dolgozunk, az L-et reprezentáló kifejezés struktúrája szerint. (Az egyszerűbb nyelvektől a bonyolultabbak felé.) (i) Legyen L = R, ahol R =. Ekkor L = generálható a G = ({S}, Ʃ,, S) nyelvtannal, hiszen nincs S-ből levezethető terminális szó (nincs szabály, Ʃ-t nem is használjuk). Emellett G 3-típusú, mert szabályaira teljesülnek a 3-típusú nyelvtanokra vonatkozó feltételek (nincs átírási szabály) (ii) Legyen L = R, ahol R = a. Ekkor L = {a} generálható a G = ({S}, Ʃ, {S a}, S) nyelvtannal, ami nyilvánvalóan 3-típusú. 16
A reguláris nyelvek osztályának jellemzése Állítás 1 bizonyítás folyt. (Minden Ʃ feletti L reguláris nyelv generálható ) (iii/a) Unió Tegyük fel, hogy L = R, ahol R = (R 1 ) + (R 2 ). Ekkor L = L 1 L 2, ahol L 1 = R 1 és L 2 = R 2 reguláris nyelvek Ʃ felett. Mivel R 1 és R 2 részkifejezései R-nek, az indukciós feltevés szerint L 1 és L 2 generálhatók a G 1 = (N 1, Ʃ, P 1, S 1 ) és G 2 = (N 2, Ʃ, P 2, S 2 ) 3-típusú nyelvtanokkal. Feltehetjük, hogy N 1 N 2 = (szükséges, hogy a levezetések különválaszthatók legyenek G 1 -ben és G 2 -ben). (Ha ez alapból nem teljesül: nemterminális átnevezéssel ekvivalens nyelvtan) Ekkor L is generálható 3-típusú nyelvtannal, ugyanis legyen G = (N 1 N 2 {S}, Ʃ, P 1 P 2 {S S 1, S S 2 }, S), ahol S egy új nemterminális szimbólum. A konstrukció miatt teljesül, hogy G is 3-típusú, és L(G) = L 1 L 2. Megjegyzések S szerepe: a két fa egyesítése egy új gyökércsúcsba. Az új G nyelvtanban az S-re két szabály alkalmazható, vagy G 1 vagy G 2 kezdőszimbólumát vezetjük be, ezután viszont a nemterm. halmazok diszjunktsága miatt csak a választott nyelvtan szabályai lesznek alkalmazhatók. Rekurzív felépítés: először egy darab egyszerű összegre, aztán fokozatosan bővítjük. 17
A reguláris nyelvek osztályának jellemzése Állítás 1 bizonyítás folyt. (Minden Ʃ feletti L reguláris nyelv generálható ) (iii/b) Konkatenáció Tegyük fel, hogy L = R, ahol R = (R 1 ) (R 2 ). Ekkor L = L 1 L 2, ahol L 1 = R 1 és L 2 = R 2 reguláris nyelvek Ʃ felett. Mint (iii/a)-ban, most is feltehető, hogy L 1 és L 2 generálhatók a G 1 és G 2 3-típusú nyelvtanokkal. Azt is feltehetjük most is, hogy N 1 N 2 = (így a levezetések különválaszthatók G 1 -ben és G 2 -ben, átnevezés ). Legyen most G = (N 1 N 2, Ʃ, P, S 1 ), ahol P a legszűkebb olyan szabályhalmaz, amire teljesülnek a következő feltételek: Ha A xb P 1, akkor A xb P, Ha A x P 1, akkor A xs 2 P, (a folytatás lehetősége miatt) P 2 minden eleme P-nek is eleme. Azaz: P = P 2 {A xb A xb P 1, B N 1 } {A xs 2 A x P 1, x T*} Most is teljesül, hogy G is 3-típusú, és L(G) = L 1 L 2. Megjegyzések S 1 -ből indulunk, S 2 -nél tudjuk becsatlakoztatni a 2. fát. Amikor az első nyelvtanban befejeződne egy levezetés, az új nyelvtanban az első nyelvbeli levezetett szó után megjelenik a 2. nyelvtan kezdőszimbóluma a szóban. Rekurzív felépítés: itt is először egy darab egyszerű szorzatra, aztán fokozatosan bővítjük. 18
A reguláris nyelvek osztályának jellemzése Állítás 1 bizonyítás folyt. (Minden Ʃ feletti L reguláris nyelv generálható ) (iii/c) Kleene-iteráció Tegyük fel, hogy L = R, ahol R = (R 1 )*. Ekkor L = L 1 *, ahol L 1 = R 1 egy Ʃ feletti reguláris nyelv. Az indukciós feltevés szerint L 1 generálható egy G 1 = (N 1, Ʃ, P 1, S 1 ) 3-típusú nyelvtannal. Legyen G = (N 1 {S}, Ʃ, P, S) az a nyelvtan, amelyben S egy új nemterminális szimbólum, P pedig a legszűkebb olyan szabályrdsz-halmaz, amire teljesülnek a köv. feltételek: S S 1, S λ P, (kiszállás leh.) Ha A xb P 1, akkor A xb P, Ha A x P 1, akkor A xs P (itt is a folytatás ismétlődő lehetősége miatt). Azaz: P = {A xb A xb P 1, B N 1 } {A xs A x P 1, x T*} {S S 1, S λ}. A konstrukció miatt teljesül, hogy G is 3-típusú, és következik, hogy L(G) = L 1 *. (Utóbbira: L(G)-ben nincs olyan szó, ami L 1 *-ban ne lenne benne, és fordítva.) Változat: A szabályhalmazra más ekvivalens konstrukció is megadható (D. P. 117.) Mint fent, S S 1, S λ P, és az A xb P 1 szabályokat is változatlanul felvesszük P-be. Az A x P 1 szabályokat felvesszük P-be, plusz ezekhez hozzávesszük az A xs alakú szabályokat is. (Ez redundanciát hoz a rendszerbe, mert A xs, S λ-ból úgyis kijönnek az A x szabályok, de így az átláthatóság nőhet és a levezetések rövidülhetnek.) Azaz: P = {A xb A xb P 1 } {A xs és A x A x P 1 } {S S 1, S λ}. Megjegyzések Mint eddig, itt is rekurzív felépítést alkalmazunk. (Az A xs alakú szabályok helyett A xs 1 alakúak is felvehetők, ha az A x P 1 szabályokat átvesszük. Ez is ekvivalens nyelvtant ad, de ezzel az esettel külön nem foglalkozunk.) 19
Formális nyelvek Ekvivalens reguláris nyelvtan megadása reguláris kifejezéshez A bizonyításban szereplő konstrukciók, ill. az alapnyelveket generáló egyszerű reguláris nyelvtanok segítségével tetsz. reguláris kifejezéshez le is gyárthatjuk azt a 3-típusú nyelvtant, amely a kifejezéssel leírt szavakat generálja Gyakorlás: Egyszerű példák az unió és konkatenáció alkalmazására Feladat: Adjuk meg az L = a*b b*a reguláris kifejezéssel megadott nyelvet generáló 3-típusú nyelvtant! Először vezessünk be a terminális betűkhöz olyan 3-típusú nyelvtant, amely kizárólag az adott terminálist generálja: G a = ({A}, {a, b}, {A a}, A), G b = ({B}, {a, b}, {B b}, B) A kifejezésben belülről kifelé haladva építjük fel a nyelvtant a következők szerint. 1. Adott G = (N, T, H, S 1 ) nyelvtan esetén az L(G)* nyelvet generáló nyelvtant megkaphatjuk, ha bevezetjük az S új mondatszimbólumot és az S λ, S S 1 szabályokat, valamint az összes A p alakú szabály helyett (vagy esetleg: mellé) itt p T* felvesszük az új A ps alakú szabályt. (A többi szabály változatlan.) Nálunk most: G a* = ({A, S}, {a, b}, {A as, S λ, S A}, S), G b* = ({B, S}, {a, b}, {B bs, S λ, S B}, S). 2. Adott G 1 = (N 1, T, H 1, S 1 ) és G 2 = (N 2, T, H 2, S 2 ) nyelvtanok esetén (itt N 1 N 2 = ) az L(G) = L(G 1 )L(G 2 ) konkatenált nyelvet generáló nyelvtan előállításához az összes H 1 -beli A p alakú szabályt (itt p T*) az A ps 2 alakú szabályra cseréljük. Az így kapott szabályhalmazt jelöljük H 1 '-vel. Ezek után G = (N 1 N 2, T, H 1 ' H 2, S 1 ). Nálunk most (csak 1-1 szabály változik): G a*b = ({A, S, B}, {a, b}, {A as, S B, S A, B b}, S), G b*a = ({B, S, A}, {b, a}, {B bs, S A, S B, A a}, S). 20
Ekvivalens reguláris nyelvtan megadása reguláris kifejezéshez Feladat (folyt., ekvivalens 3-típusú nyelvtan megadása reg. kifejezéshez, L = a*b b*a) (Eddig: G a = ({A}, {a, b}, {A a}, A), G b = ({B}, {a, b}, {B b}, B), G a* = ({A, S}, {a, b}, {A as, S λ, S A}, S), G b* = ({B, S}, {a, b}, {B bs, S λ, S B}, S), G a*b = ({A, S, B}, {a, b}, {A as, S B, S A, B b}, S), G b*a = ({B, S, A}, {b, a}, {B bs, S A, S B, A a}, S).) 3. Adott G 1 = (N 1, T, H 1, S 1 ) és G 2 = (N 2, T, H 2, S 2 ) nyelvtanok esetén (itt N 1 N 2 = ) az L(G) = L(G 1 ) L(G 2 ) nyelvet generáló nyelvtan előállításához a G = (N 1 N 2 {S 3 }, T, H 1 H 2 {S 3 S 1, S 3 S 2 }, S 3 ) nyelvtan megfelelő lesz, ahol S 3 nem eleme az N 1, N 2, T halmazok egyikének sem. Nálunk most a fent megadott G a*b és G b*a nyelvtanok esetén nem teljesül az a feltétel, hogy a nemterminálisok halmazai diszjunktak, ezért az egyik nyelvtanban át kell jelölni a nemterminálisokat. Például legyen G' a*b = ({C, S 2, D}, {a, b}, {C as 2, S 2 D, S 2 C, D b}, S 2 ). A nemterm.ok átjelölése nem befolyásolja a generált nyelvet, azaz L(G' a*b ) = L(G a*b ) Így végül: G a*b b*a = ({C, S 2, D, B, S, A, S 3 }, {a, b}, {C as 2, S 2 D, S 2 C, D b, B bs, S A, S B, A a, S 3 S 2, S 3 S}, S 3 ). 21
Ekvivalens reguláris nyelvtan megadása reguláris kifejezéshez Feladat (folyt., ekvivalens 3-típusú nyelvtan megadása reg. kifejezéshez, L = a*b b*a) Ha a Kleene-iterációnál a redundáns megközelítést alkalmazzuk (lásd: bizonyítás (iii/c) rész, változat), akkor a következő ekvivalens nyelvtanokat kapjuk: G a = ({A}, {a, b}, {A a}, A), G b = ({B}, {a, b}, {B b}, B), G a * = ({A, S}, {a, b}, {A a, A as, S λ, S A}, S), G b * = ({B, S}, {a, b}, {B b, B bs, S λ, S B}, S), G a*b = ({A, S, B}, {a, b}, {A ab, A as, S B, S A, B b}, S), G b*a = ({B, S, A}, {b, a}, {B ba, B bs, S A, S B, A a}, S). Átjelölés: G' a*b = ({C, S 2, D}, {a, b}, {C ad, C as 2, S 2 D, S 2 C, D b}, S 2 ) És végül: G a*b b*a = ({C, S 2, D, B, S, A, S 3 }, {a, b}, {C ad, C as 2, S 2 D, S 2 C, D b, B ba, B bs, S A, S B, A a, S 3 S 2, S 3 S}, S 3 ). Néhány levezetés a generált nyelvtanokkal: S 3 S 2 D b, S 3 S A a, S 3 S 2 C as 2 ac aas 2 aad aab, S 3 S 2 C as 2 ac aad aab, S 3 S B bs bb bbs bba bba. Megjegyzés A Kleene-iterációs részben említett harmadik változat szerinti megoldást nem tárgyaljuk (régi S használata; további 1-1 szabály változik G a *-tól kezdve), ez fakultatív módon megtekinthető D. P. 118. oldalán 22
Ekvivalens reguláris nyelvtan megadása reguláris kifejezéshez Feladat: Adjuk meg az L = (a b)* reguláris kifejezéssel megadott nyelvet generáló 3-típusú nyelvtant! A fenti módon: G a = ({A}, {a, b}, {A a}, A), G b = ({B}, {a, b}, {B b}, B), G a b = ({A, B, S}, {a, b}, {A a, B b, S A, S B}, S). (Eml.: Az L(G)* nyelvet generáló nyelvtanhoz kell egy új S 1 kezdőszimb., felvesszük S 1 λ, S 1 S-t, és minden A p helyett (esetleg: mellé) A ps 1 -et.) G (a b)* = ({A, B, S, S 1 }, {a, b}, {A as 1, B bs 1, S A, S B, S 1 λ, S 1 S}, S 1 ) A redundáns alak: G (a b)* = ({A, B, S, S 1 }, {a, b}, {A a, A as 1, B b, B bs 1, S A, S B, S 1 λ, S 1 S}, S 1 ). Néhány levezetés: S 1 λ, S 1 S A as 1 a S 1 S A a, S 1 S B bs 1 b S 1 S B b, S 1 S A as 1 as aa aas 1 aa, S 1 S A as 1 as aa aa, S 1 S B bs 1 bs ba bas 1 ba. S 1 S B bs 1 bs ba ba. 23
Ekvivalens reguláris nyelvtan megadása reguláris kifejezéshez Feladat: Adjuk meg az L = ab*c reguláris kifejezéssel megadott nyelvet generáló 3-típusú nyelvtant! Megoldás: G a = ({A}, {a, b, c}, {A a}, A), G b = ({B}, {a, b, c}, {B b}, B), G c = ({C}, {a, b, c}, {C c}, C), G b* = ({B, S}, {a, b, c}, {B b, B bs, S λ, S B}, S), G ab* = ({A, B, S}, {a, b, c}, {A as, B b, B bs, S λ, S B}, A), G ab*c = ({A, B, S, C}, {a, b, c}, {A as, B bc, B bs, S C, S B, C c}, A). Néhány levezetés: A as ac ac, A as ab abs abc abc, A as ab abc abc, A as ab abs abb abbs abbc abbc. Feladat: Adjuk meg az L = a* b* c* reguláris kifejezéssel megadott nyelvet generáló 3-típusú nyelvtant! Feladat: Adjuk meg az L = (ab*)* reguláris kifejezéssel megadott nyelvet generáló 3-típusú nyelvtant! Külön köszönet: Pukler A. kollégámnak és a hiv. jegyzetek szerzőinek 24