9. előadás Környezetfüggetlen nyelvek Dr. Kallós Gábor 2015 2016 1 Tartalom Bevezetés CF nyelv példák Nyelvek és nyelvtanok egy- és többértelműsége Bal- és jobboldali levezetések A fák magassága és határa A derivációk és a levezetési fák kapcsolata Elemzések Feladatok 2
Bevezetés, példa Eml.: környezetfüggetlen (CF) nyelvtan: 2-típusú, csak A α alakú levezetési szabályai lehetnek A helyettesítési szabály a környezettől függetlenül bárhol alkalmazható Itt α egy (N T)*-beli szó (ún. mondatforma) Itt nagyobb a szabadság a helyettesítési szabályoknál, mint a reguláris nyelveket generáló nyelvtanoknál Ez viszont több olyan problémát is felvet, amivel eddig még nem találkoztunk Példa Legyen G ar = (N, T, P, S), ahol N = {E, T, F} T = {+, *, (, ), a} S = E P = {E E + T T, T T *F F, F (E) a} Megj.: Itt megszegtük a konvenciót a nemterminális és terminális jelek használatáról (de: ezek a szimbólumok kellenek) (E expression, T term, F factor; az a pedig egy azonosító) A nyelvtan az egy additív és egy multiplikatív operátort tartalmazó, és a zárójelezést megengedő aritmetikai kifejezéseket generálja (van precedencia) Be lehetne vezetni hasonlóan a, / és ^ műveleteket, ill. előjeleket is, egy igazi számítástechnikai nyelv aritmetikai kifejezéseket generáló CF nyelvtana tartalmazza ezeket is (a mi céljainkra most ez kissé szegényes nyelv is elég) 3 CF nyelv példa Példa (folyt.) (Eml.: P = {E E + T T, T T *F F, F (E) a}) A nyelvnek eleme az a + a*a jelsorozat, hiszen egy levezetése E E+ T T+ T F+ T a + T a + T*F a + F*F a + a*f a + a*a De a kifejezést másként is le lehet vezetni (több nemterm. a jobb oldalon) E E+ T E + T*F E + T*a E + F*a E + a*a T + a*a F + a*a a + a*a Okoz-e a több levezetés megléte zavart? Eml.: A CF nyelvek (nyelvtanok) fontos tulajdonsága, hogy a levezetések fa alakban ábrázolhatók A fa gyökere a mondatszimbólum Minden csomópontból annyi él (olyan kötött sorrendben) fut ki, amennyi a szabály jobboldalán található szimbólumok száma, és az élek végein a jobboldal megfelelő szimbólumai találhatók Minden levezetésnek egy levezetési fa felel meg, de egy levezetési fához több levezetés is tartozhat (!) Ha egy kifejezéshez pontosan egy levezetési fa tartozik, akkor a nyelvtant egyértelműnek mondjuk Nevezetes levezetések: mindig a legbaloldalibb N-beli szimbólumot helyettesítjük (bal (oldali) levezetés); hasonlóan jobb (oldali) levezetés (lásd fent) 4
CF nyelv példa, elemzés Megjegyzések Vigyázat, a levezetési fa nem a nyelvtanhoz tartozik egyértelműen, hanem a levezetéshez! (Egy nyelvtannak sok levezetési fája van/lehet) Példa (folyt.) (Eml.: P = {E E + T T, T T *F F, F (E) a}) Most módosítjuk a nyelvtant, legyen P = {E E + E E *E (E) a} Ez a nyelvtan (G ar2 ) ugyanazt a nyelvet generálja, mint fenti párja Két különböző levezetés az a + a*a jelsorozatra E E+ E E + E*E a + E*E a + a*e a + a*a E E*E E*a E + E*a E + a*a a + a*a Itt azonban két különböző levezetési fa adható meg! A két levezetés tehát lényegesen eltérő 5 Egy- és többértelműség A természetes nyelvekre nagyon jellemző a többértelműség/többalakúság Például: Láttam Zsókát egy távcsővel, ill. Az oroszlán simogatása veszélyes Angol: Fruit flies like a banana (Az angolban gyakori: egy szóalak lehet főnév vagy ige is) Itt a szövegkörnyezet vagy a beszédhelyzet segít eldönteni a helyes jelentést A fordítóprogramoktól ilyet nem nagyon várhatunk Egyszerű példák, amikor a Word helyesírás-ellenőrzője nem jelez: Be nem fejezet, fejezett Jelenjen megy, meg Nem sok szó eset, esett Feladatok Mutassuk meg, hogy a G 2' = ({S}, {2, +, *}, {S S + S, S S*S, S 2}, S) nyelvtanban a 2 + 2*2 szónak két lényegesen különböző levezetése és két levezetési fája van! (Segítség: lásd előző oldal) Milyen eredményt ad a kifejezésre ezekben az esetekben a fordító? A csellengő else probléma (nem egyértelmű, hogy az else melyik feltételhez tartozik): if a then if b then do else print Milyen megoldásokat kínálnak erre a problémára az általunk használt programozási nyelvek? 6
Egy- és többértelműség Ha pusztán csak azt vizsgálnánk, hogy generálható-e valamely jelsorozat egy adott nyelvtannal, akkor az eredeti és a módosított nyelvtan egyenértékű (lenne) De a számítástechnikai nyelvészet szempontjából nem közömbös, hogy milyen szintaktikai egységeken keresztül jutottunk el a levezetés során a mondathoz (!) Utolsó példáinkban (G ar2 és G 2' ) nagyon fontos lenne tudni, hogy melyik műveletet kell előbb elvégezni, az összeadást vagy a szorzást! A számítástechnikai nyelvészetben (automatizált működés) a nem egyértelmű nyelvtanok lényegében használhatatlanok G ar2 -nél az egy- és többértelműséget nyelvtanhoz, és nem a nyelvhez kapcsoltuk Itt a generált nyelv egyértelmű nyelvtannal is előállítható Vajon mindig ez a helyzet, vagy lehet a többértelműség nyelvi tulajdonság? Vá.: Léteznek olyan nyelvek, amelyekről bizonyítható, hogy nem lehet őket egyértelmű nyelvtannal generálni Ekkor a többértelműség nyelvi tulajdonság (azaz: nincs CF nyelvnek egyért. nyelvtana) Tehát: az egy- és többértelműség tartozhat nyelvhez és nyelvtanhoz is Példa (nem egyértelmű nyelv; csak a helyettesítési szabályokat soroljuk): S aabx YbCc A aab ab C bcc bc X cx c Y ay a Ez a nyelvtan az L = a i b i c j a j b i c i nyelvet generálja Ezzel a nyelvtannal az a i b i c i alakú kifejezések két lényegesen különböző levezetéssel állíthatók elő Igazolható, hogy nincs olyan egyértelmű CF nyelvtan, ami ezt a nyelvet generálja 7 Egy- és többértelműség Az egyértelműség eldöntése: Sajnos nincs olyan módszer, amelynek segítségével általánosan, minden esetre alkalmazhatóan meg lehetne mondani, hogy egy nyelvtan vagy nyelv egyértelmű-e (B. I. 83.) Persze ettől még sok konkrét esetben a probléma megoldható (egyedi tulajdonságok vagy szerencsés ötletek felhasználásával) Például a G ar nyelvtan egyértelműsége igazolható Visszatekintés: Felmerül-e az egyértelműség/többértelműség kérdése a reguláris nyelveknél? (B. I.) Vá.: Nem! (Mindegy, hogy a redukált- vagy a nem redukált esetet vizsgáljuk.) Itt a levezetési fa nagyon egyszerű, csupán egy szárból áll, amelynek jobb- ill. baloldalán vannak levelek attól függően, hogy bal- vagy jobbreguláris nyelvtanról van-e szó (Eml.: a bal- és jobbreguláris nyelvtanok ekvivalensek) Egy levezetési fához itt csak egy levezetés tartozik (minden mondatformában csak egyetlen nemterminális szimbólum szerepel) Nemdeterminisztikusság: egy mondatnak létezhet több kül. levezetési fája, de a ND megszüntethető (NDA DA konstrukció) Tehát (végül): Minden reguláris nyelv egyértelmű, és szerkeszthető hozzá egyértelmű nyelvtan 8
Bal- és jobboldali levezetések Legyen G = (N, T, P, S) egy tetszőleges CF nyelvtan Definíciók Az α 0 α 1 α 2 α n alakú kifejezéseket levezetéseknek (derivációknak) hívjuk. Ha a deriváció során minden i = 1, 2,, n esetén α i -t úgy kapjuk, hogy α i 1 -ben a bal oldalról nézve legelső nemterminálist helyettesítjük egy rá vonatkozó szabály jobb oldalával, akkor a derivációt bal (oldali) derivációnak hívjuk, és rá az α 0 l α 1 l α 2 l l α n jelölést használjuk. Ha egy deriváció minden lépésében a jobbról nézve legelső nemterminálist helyettesítjük, akkor jobb (oldali) derivációról beszélünk, ennek jelölése α 0 r α 1 r α 2 r r α n. Továbbá, ha α olyan, hogy S * α, akkor α-t mondatformának nevezzük Hasonlóan, ha S l * α (ill. S r * α) áll fent, akkor α-t bal (ill. jobb) mondatformának nevezzük Megj.: a bal (oldali) levezetés technikája a mélységi kereséshez hasonlít Feladat: Nézzük meg az előző fóliákon, hogy melyik levezetés milyen típusú, ill. milyen mondatformát állít elő! Vigyázzunk arra, hogy a bal oldalról első, második, szabály következetes alkalmazása általában nem eredményez bal (oldali) levezetést 9 Példa (a nyelvtan λ-szabályt is tartalmaz) Alapnyelvtan: G 6 = ({S}, {a, b}, {S ab, S ba, S λ, A as, A baa, B bs, B abb}, S) Szó: aababb A (sikeres) levezetés: S ab aabb aabsb aabb aababb aababsb aababb aababbs aababb Az ábra alján látható a levezetett szó (a betűket összeolvassuk, a λ-kat elhagyjuk) Feladatok Nézzük meg, hogyan tudjuk kiolvasni a levezetési fából a közbülső mondatformákat Rajzoljunk fel más levezetési fákat is a nyelvtanhoz Próbáljunk előállítani bal és jobb (oldali) levezetéseket a nyelvtannal 10
Definíció Legyen X (N T). Az X gyökerű derivációs fák halmazán címkézett, rendezett fák legszűkebb olyan D X halmazát értjük, amelyre teljesülnek az alábbi feltételek: Az a fa, amelynek egyetlen szögpontja (csak gyökere) van, és annak címkéje X, eleme D X -nek (ezt a fát X-szel jelöljük) Ha X λ P, akkor az a fa, amelynek gyökere X-szel van címkézve, és gyökerének egyetlen leszármazottja van, aminek címkéje λ, eleme D X -nek (ezt a fát X[λ]-val jelöljük) Ha X X 1 X 2 X n P és t 1 D X1, t 2 D X2,, t n D Xn (gyermek fák), akkor az a fa, amelynek gyökere X-szel van címkézve, és a gyökérből n él indul rendre a t 1, t 2,, t n fák gyökeréhez, eleme D X -nek (ezt a fát X[t 1, t 2,, t n ]-nel jelöljük) Ha X T, akkor a 2. és 3. feltételek soha nem teljesülnek, ekkor tehát D X = {X} (Terminálisból már nem lehet levezetni semmit) Megjegyzések A derivációs fa leveleihez T-beli vagy N-beli szimbólumokat, közbülső csúcsaihoz pedig N-beli jeleket rendelünk Ha minden levélelem terminális, akkor befejezett levezetésről beszélünk A levezetési fákat szintaxisfának is nevezzük (szintaktikai elemzés) Feladatok Rajzoljuk le a definícióban szereplő levezetési fákat! Rajzoljuk le a következő módon adott levezetési fákat (a G ar nyelvtanhoz): t 1 = E[T[T[F], *, F[(, E, )]]] t 2 = F[(, E[E[T[F[a]]], +, T[F[a]]], )] Rajzoljuk le ugyanezen nyelvtanhoz az a*(a + a) + a levélelemeket tartalmazó levezetési fát! (Cs. Z. 32.) 11 Definíció Legyen t egy X gyökerű levezetési fa. A t fa magasságát h(t)-vel, határát pedig fr(t)-vel jelöljük és az alábbi módon definiáljuk: Ha t = X, akkor h(t) = 0 és fr(t) = X Ha t = X[λ], akkor h(t) = 1 és fr(t) = λ Ha t = X[t 1, t 2,, t n ], akkor h(t) = 1 + max{ h(t i ) 1 i n} és fr(t) = fr(t 1 ) fr(t 2 ) fr(t n ). Azaz: Egy t levezetési fa esetén h(t) a t-ben levő olyan utak hosszának a maximuma, amelyek t gyökerétől annak valamely leveléig vezetnek, fr(t) pedig az az (N T)*- beli szó, amelyet t leveleinek balról jobbra történő leolvasásával kapunk Megj.: h(t)-t a levezetési gráf mélységének is nevezzük Példa Az előző feladatban szereplő t 1 és t 2 fákra h(t 1 ) = 3, fr(t 1 ) = F*(E), h(t 2 ) = 5 és fr(t 2 ) = (a + a) Feladatok Határozzuk meg az előző oldalakon szereplő további levezetési fák határát és magasságát! Térjünk vissza a 2. slidesor levezetési fáira (27. és 28. slide), és ott is végezzük el ugyanezt a feladatot (2-es, 2.5-es, 3-as típusú nyelvtanok) Adjunk meg az előző példák alapján 0, 1 és 2 magasságú levezetési fákat! A levezetések és a levezetési fák közötti szoros kapcsolatot mutatja a következő tétel 12
Tétel: Tetszőleges X (N T) és α (N T)* esetén X * α akkor és csak akkor áll fent, ha van olyan t D X levezetési fa, amelyre fr(t) = α Bizonyítás (F. Z.) a) A feltétel szerint ekkor X n α teljesül valamely n 0-ra. A jobb oldal igazolása: n szerinti indukcióval. Az n = 0 esetben X = α. Itt az egyetlen szögpontú t = X fa megfelelő, mert erre t D X és fr(t) = X (= α). Legyen most n 1, és tfh. az állítás m n-re teljesül. Tegyük fel továbbá, hogy X n+1 α. Ekkor X X 1 X 2 X k n α 1 α 2 α k = α, ahol teljesülnek a következők: X X 1 X 2 X k egy P-beli szabály, és minden 1 i k esetén X i n i α i, ahol n i n (ezen felül n = n 1 + n 2 + + n k is teljesül). Mivel n i n, az indukciós feltevés miatt 1 i k-ra van olyan t i D X, hogy fr(t i ) = α i. Legyen t = X[t 1, t 2,, t k ]. A levezetési fa definíciója miatt t D X, a magasság és a határ definíciója miatt pedig fr(t) = fr(t 1 ) fr(t 2 ) fr(t k ) = α 1 α 2 α k = α. b) Tfh. az X gyökerű t derivációs fára teljesül, hogy fr(t) = α. A bal oldal igazolása: t magassága szerinti indukcióval. Legyen h(t) = 0. Ekkor t = X, tehát fr(t) = α = X. Így X * α (= X) teljesül. Legyen most h(t) = n + 1, és tfh. az állítás minden n-nél nem magasabb deriv. fára teljesül. A magasság és a határ definíciója miatt ekkor t = X[t 1, t 2,, t n ], valamilyen k 1-re és t 1 D X1, t 2 D X2,, t n D Xn levezetési fák esetén, és a derivációs fa definíciója miatt X X 1 X 2 X k P is teljesül. Vezessük be az α i = fr(t i ) jelölést minden 1 i k-ra. Ekkor egyrészt α = α 1 α 2 α k, másrészt az indukciós feltevés szerint minden 1 i k-ra X i * α i. Így X X 1 X 2 X k * α 1 α 2 α k = α. 13 Megjegyzések Az előző tételben szereplő X * α levezetéshez általában nem csak egy olyan X gyökerű levezetési fa létezik, amelynek határa α. Példa: Legyenek az A ab Ab A a B b szabályok egy CF nyelvtan szabályai. Ekkor A * ab. Ugyanakkor a t 1 = A[a, B[b]] és t 2 = A[A[a], b] fákra fr(t 1 ) = ab és fr(t 2 ) = ab. Feladat: Rajzoljuk le ezeket a fákat! A tételben szereplő t fából az persze következik, hogy X * α fennáll, de az nem, hogy a levezetés lépései egyértelműen meghatározottak. Példa: A t 1 = E[T[T[F], *, F[(, E, )]]] fa határa F*(E); ez kétféle módon is megkapható: E T T*F F*F F*(E) E T T*F T*(E) F*(E). Egy derivációs fa által reprezentált levezetések egy ekvivalencia-osztályt alkotnak Mindegyikben ugyanaz a mondatforma (szó) van levezetve Az ugyanott megjelenő ugyanolyan nemterminálisra ugyanazt a szabályt alkalmazzák Ez a példákban jól látható A szabályalkalmazások sorrendje lehet különböző 14
Célunk a továbbiakban: minden ekvivalencia-osztályból kiemelni egy reprezentánst, legyen ez például a legbaloldalibb levezetés (ez jó, és mindig létezik) Készen vagyunk? Ha X l * α, akkor X * α is fennáll, mivel minden bal (oldali) levezetés egyúttal levezetés is Ugyanaz érvényes a jobb (oldali) levezetésekre is De fordítva ez már nem igaz, X * α-ból nem következik, hogy X l * α is fenáll Egy legbaloldalibb levezetés persze mindig kijelölhető a fában Gond: A legbaloldalibb levezetés nem biztos, hogy tényleg bal (oldali) levezetés! (És ugyanaz persze a legjobboldalibbra is érvényes) Példa: A G ar nyelvtan esetén E * E + F + T teljesül, de E l * E + F + T és E r * E + F + T nem áll fent Feladat: Ellenőrizzük a példát! Ha csak terminális szavakat engedünk meg a levezetési fa leveleiben, akkor a kijelentés már megfordítható Azaz: teljes, befejezett fa kell! 15 Állítás: Tetszőleges X (N T) és w T* esetén a következő három állítás ekvivalens: X * w X l * w X r * w Bizonyítás A bal és a jobb (oldali) levezetések között fennálló szimmetria miatt elegendő az első és a második állítás ekvivalenciáját igazolni. (Tudjuk: Ha X l * w, akkor X * w, mivel bal (oldali) levezetés egyúttal levezetés is.) Fordítva, tfh. X * w. Ekkor X n w teljesül valamely n 0-ra. A másik oldal igazolása: n szerinti indukcióval. Az n = 0 esetben X = w, ami csak úgy lehet, hogy X T. Így nyilvánvaló, hogy X l * w. Tegyük fel most, hogy a következtetés teljesül minden n-nél nem nagyobb számra, és legyen X n + 1 w. Ekkor ez a deriváció felírható X X 1 X 2 X k n w 1 w 2 w k = w alakban, ahol k 1, X X 1 X 2 X k P és minden 1 i k-ra teljesül X i n i w i, ahol n i n. Így az indukciós feltevés miatt X i n l i w i is fennáll. Ekkor viszont X l X 1 X 2 X 3 X k l w 1 X 2 X 3 X k l w 1 w 2 X 3 X k l l l w 1 w 2 w 3 w k = w. A G nyelvtan által generált nyelv fogalma a jelen részben definiált fogalmak segítségével is megadható L(G) = {w T* S * w} = {w T* S l * w} = {w T* S r * w} L(G) = {fr(t) t D S, fr(t) T*} 16
Elemzések Az elemzés (parsing) feladatáról A cél a nyelvtani struktúra felfedezése/felderítése, ez a fordítás fontos része Parsing kifejezés eredete: parts of speech (latin megfelelő) A feladat: adott x T* szóhoz konstruáljunk egy olyan derivációs fát, amit a nyelvtan elő tud állítani A feladat (könnyű) része lehet egy ellenőrzés is, hogy x valóban terminális szó-e Két alapvető megközelítés: felülről-lefelé (top-down) és alulról-felfelé (bottom-up) Mindegyiken belül: többféle egyedi módszer (algoritmus) Felülről-lefelé elemzés S-ből kiindulva, a szokásos (ismert) módon felépítjük a levezetési fát Ehhez általában sok különböző mondatformát és mondatot kell előállítani Alulról-felfelé elemzés Az x szóból kiindulva felfelé építjük fel a fát, végül el kell jutni S-ig Egyik lehetséges megvalósítás: a redukciós módszer Felcseréljük a szabályok jobb és bal oldalát, így a szabályokból (produkció) redukciókat kapunk Ez sok esetben sima ügy, de adódhatnak nehézségek (eml.: probléma adódik a λ-szabályokkal) 17 Elemzések Egyszerű példa a redukciós módszer alkalmazására Alapnyelvtan: G 3 = ({S}, {a, b}, {S asb, S ab}, S), szó: aaabbb A fordított nyelvtan szabályai: P f = {asb S, ab S} A folyamat: x-ben keresünk egy olyan részszót, amire alkalmazható valamelyik szabály Alkalmazzuk a megfelelő szabályt Az új x' szóval végrehajtjuk ugyanezt stb. Példánkban egyértelmű a szabályok alkalmazása, mindegyik lépésben csak egy választható 18
Elemzések Redukciós módszer (második példa) Alapnyelvtan: G 6 = ({S}, {a, b}, {S ab, S ba, S λ, A as, A baa, B bs, B abb}, S), szó: aababb A fordított nyelvtan szabályai: P f = {λ S, ab S, ba S, as A, baa A, bs B, abb B} A redukció nyilván a λ S szabállyal indul, hogy alkalmazhassuk majd az as A vagy a bs B szabályok valamelyikét Csakhogy, ha S-t pl. az első vagy második a után helyezzük el, akkor a fa nem lesz felépíthető Feladat: Ellenőrizzük ezt! (Mi persze tudjuk, hogy aababb aababbs aababb aababsb aababb aabb ) További fontos kérdés: aababb-nél ab S, abb B is választható lenne, hogyan döntünk? Itt már nem egyértelmű a szabályok alkalmazása! Megoldás lehet a CF nyelvtanok megfelelő átalakítása (ld. később, 12. slidesor) λ mentesítés A jobb oldalon legfeljebb kettő hosszú szabályok legyenek (Chomsky-féle normálforma) Külön köszönet: a hivatkozott jegyzetek szerzőinek 19 Ajánlott irodalom Fülöp Zoltán: és szintaktikus elemzésük, Polygon, Szeged, 2001 Dömösi Pál és társai: és automaták, Elektronikus jegyzet, 2011 Bach Iván:, Typotex kiadó, Budapest, 2002 Csörnyei Zoltán: Fordítóprogramok, Typotex kiadó, Budapest, 2009 Alan P. Parkes: A Concise Introduction to Languages and Machines, Springer, London, 2008 20