Környezetfüggetlen nyelvek Kiegészítő nyg z Algoritmuselmélet tárgyhoz VI. ( ónyi Ivnyos Szó: Algoritmusok könyv mellé) Friedl Ktlin BM SZI friedl@cs.me.hu 2016. feruár 24. A reguláris nyelveket véges utomtákkl vgy reguláris kifejezésekkel dtuk meg. Vn továi lehetőség is, ezek formális nyelvtnok vgy röviden nyelvtnok. A formális nyelvtnok nem egészen olynok, mint például mgyr nyelvtn. Bár eredetileg természetes nyelvek szályink leírásár készültek, de inká hsználhtók mesterséges nyelvek, például progrmozási nyelvek pontos megdásár, mint egy eszélt nyelv helyes mondtink tökéletes leírásár. A formális nyelvtnok lényegéen átírási szályokt dnk meg, mikkel egy kezdő szimólumól kiindulv szvkt tudunk előállítni. zeknek itt csk egy speciális, tlán leggykrn hsznált fjtájávl fogllkozunk. 1. Definíció. gy környezetfüggetlen nyelvtn (röviden CF nyelvtn) ltt egy olyn G = (V, Σ, S, P ) rendszert értünk, hol V egy véges, nem üres hlmz, változók (vgy nemterminálisok) hlmz, Σ egy áécé, mire V Σ =, krkterek (vgy terminálisok) hlmz S V kezdő változó, P egy véges hlmz, z ún. levezetési (vgy produkciós, illetve átírási) szályok hlmz. P elemei A α lkúk, hol A V egy változó, α (V Σ) egy változókól és Σ elemeiől álló tetszőleges, véges hosszú sorozt. 1. Péld. Legyen V = {A}, Σ = {, }, kezdő változó természetesen z A, levezetési szályok hlmz pedig P = {A A, A ε} 1
A nyelvtnok megdásánál sokszor nem írjuk ki z összes prmétert, csk levezetési szályokt soroljuk fel. H mást nem mondunk, kkor szályokn szereplő kisetűk Σ elemei, ngyetűk változók, z első szály l oldl kezdő változó. ováá zok szályok, melyeknek l oldlán ugynz áll, összevonhtók, függőleges vonlll elválsztv különöző jo oldlkt, en formán z előző nyelvtn így néz ki: A A ε 2. Definíció. gy G = (V, Σ, S, P ) nyelvtnnál levezetés ltt egy olyn γ 0 γ 1 γ 2 γ n véges hosszú soroztot értünk (n 0), melyen γ 0 = S, továá γ i (V Σ), és mindegyik γ i+1 megkphtó γ i -ől egy levezetési szály lklmzásávl. z zt jelenti, hogy minden 0 i < n esetén γ i felírhtó γ i = δ 1 Aδ 2 lkn, hol δ 1, δ 2 (V Σ) és A V úgy, hogy és γ i+1 = δ 1 αδ 2 hol A α egy P -hez trtozó levezetési szály. 2. Péld. Az előző nyelvtn esetén egy levezetés pl. z lái A A A A ε Az így levezetett szó z. Könnyű látni, hogy eől nyelvtnól pontosn zok szvk vezethetők le, melyek n n lkúk (n 0). A levezetések közül zok lesznek számunkr érdekesek, melyeken kezdő változóól indulv végül egy olyn sorozthoz jutunk, mien már nincsenek változók. 3. Definíció. A G = (V, Σ, S, P ) nyelvtn áltl generált L(G) nyelv zokól w Σ szvkól áll, melyekhez vlmilyen n 0 számr vn olyn S γ 1 γ 2 γ n levezetés, hol γ n = w 1. Megjegyzés. Vegyük észre, hogy h egy levezetés során eljutunk egy w Σ szóhoz, kkor levezetés tová már iztos nem folytthtó, w nem trtlmz változót, tehát ilyenkor már egyetlen szály sem lklmzhtó. 3. Péld. ekintsük z lái nyelvtnt! S S S Itt tehát z egyetlen változó z S, z áécé z {, }. A nyelvtnól levezethető pl. z szó: S S Az is látszik, hogy nyelvtn áltl generált nyelv {, } -ól z összes nem üres szót trtlmzz, zz L = {, } \ {ε}. z zért igz, mert egy tetszőleges, leglá 1 hosszú w {, } szóhoz előről kezdve egymás után tudjuk generálni krktereit: míg nem z utolsó krkterről vn szó, ddig z első vgy második szállyl, z utolsó krkter pedig 3. vgy 4. szállyl állíthtó elő. 2
1. Feldt. Mely szvkól áll z lái nyelvtn áltl generált nyelv? S ε Megoldás: Világos, hogy S-ől csk olyn szó vezethető le, mi nem üres, továá z első és z utolsó krktere megegyezik. Megmuttjuk, hogy generált nyelv z összes ilyen szóól áll. hhez vegyük észre, hogy -ől minden és etűkől álló sorozt előállíthtó z előző példához hsonlón. Az S szályi lehetővé teszik, hogy szó első és utolsó krkterét generáljuk. H 1-nél hossz szót krunk, kkor ezek közé -ől tetszőleges krktersoroztot előállíthtunk. 2. Feldt. Legyen Σ = {, } és L álljon zokól szvkól, melyeken z etűk szám megegyezik etűk számávl. Adjunk olyn G nyelvtnt, mire L(G) = L. Megoldás: gy lehetséges megoldás: S SS SS ε Ahhoz, hogy ez vlón jó nyelvtn, először is vegyük észre, hogy minden eseten, mikor vlmelyik szályt lklmzzuk, ugynnnyi -t generálunk, mint hány -t ezért L(G) L. Azt kell még megmuttni, hogy minden w L szó levezethető nyelvtnól. zt w hossz szerinti indukcióvl látjuk e. Nyilván ez igz 0 hosszú w = ε szór. gy hosszú szó nincs z L nyelven. A kettő hosszú szvkr is könnyű látni, mert vgy z első vgy második szály egyszeri lklmzás után hrmdik szályt kétszer hsználv megkphtjuk w szót. együk fel, hogy L legfelje k hosszú szviról már tudjuk, hogy levezethetők és legyen w = k + 1. ö eset lehetséges: mennyien w = w, kkor w L és een z eseten z S SS kezdés után S első előfordulásáól, z indukciós feltevés szerint w levezethető, miután második S etűre z S ε szályt lklmzv megkpjuk w szót. Hsonlón járhtunk el, mennyien w = w. H viszont w első és utolsó etűje megegyezik, és ez etű mondjuk, kkor vegyük w-nek egy legrövide kezdőszeletét, mien ugynnnyi vn mint, legyen ez x és w = xy. kkor egyrészt x, y L, másrészt x szükség szerűen -re végződik, zz x = z lkú, hol z L. gy ilyen w-re jó levezetést kpunk, h z S SS lépés után z első S-ől z x-et, másodikól z y-t vezetjük le (mi z indukciós feltevés mitt lehetséges). Hsonlón járhtunk el kkor is, mikor w első ezűje, csk ilyenkor levezetés z S SS szállyl indul. Nézzünk egy kicsit onyolult nyelvtnt! 3
4. Péld. S (1-2) S (3-4) ε (5-7) (8-9) z is környezetfüggetlen nyelvtn, hol kezdő változó z. Az lái levezetésen z láhúzott rész jelöli következőként lklmzott szály l oldlát, nyíl feletti szám szály sorszámát. 1 1 2 S 8 S 9 S 8 9 S 8 S 3 5 7 9 ehát kpott szó L(G). A fenti levezetés során tö válsztásunk is volt, hogy melyik változót melyik szály lpján helyettesítsük. gy levezetés sokszor jon áttekinthető h lépéseket egy fá rendezzük. 4. Definíció. Legyen G egy környezetfüggetlen nyelvtn és x egy szó. Az x levezetési fáj G-en egy gyökeres f, melyen gyökér kezdő változóvl, minden nem levél csúcs egy-egy változóvl, minden levél pedig Σ egy-egy elemével (vgy ε-nl) vn címkézve. H egy A csúcs gyerekei lról jor olvsv B 1, B 2,..., B k, kkor nyelvtnnk vn A B 1 B 2... B k szály. (Itt B i Σ V {ε}.) A levelek lról jor olvsv éppen z x szót dják. A definícióól világos, hogy egy x L(G) szó tetszőleges levezetéséől lehet levezetési fát készíteni, és levezetési fáól is kiolvshtó leglá egy levezetés. Fontos zonn megjegyezni, hogy míg levezetés egyértelműen meghtározz fát, visszfelé ez nem igz, áltlán egy levezetési fáól ugynnnk szónk tö levezetése is kiolvshtó. 5. Definíció. gy x L(G) szó l-levezetése egy olyn levezetés, mikor minden lépésen γ i elejéhez legközelei változót helyettesítjük egy megfelelő nyelvtni szály lpján. rre már igz, hogy egy levezetési fáól egyetlen l-levezetés olvshtó ki. 4
5. Péld. Az előző példán leírt levezetéshez trtozó levezetési f. ől töféle levezetés is leolvhtó, l-levezetés szályi sorrenden: 1, 8, 1, 9, 2, 3, 5, 9, 7, 9, 8, 8. Jo oldlt egy ugynehhez szóhoz trtozó másik levezetési f láthtó. S S ε ε 6. Definíció. gy w Σ szó egyértelműen levezethető G nyelvtnól, h G-en csk egy levezetési fáj vn. A G nyelvtn egyértelmű, h G-ől minden w L(G) szó egyértelműen levezethető. Az L nyelv egyértelmű, h létezik egyértelmű nyelvtn. zek szerint z előző példeli szó nem egyértelműen levezethető, hiszen két különöző levezetési fáj is vn. Így persze nyelvtn sem egyértelmű. 2. Megjegyzés. Az egyértelműen levezethetőség fenti definíciój ekvivlens zzl, hogy szó l-levezetése egyértelmű. Lássunk most egy fontos példát, z ritmetiki kifejezések nyelvét. Az egyszerűség kedvéért csk összedást és szorzást fogunk enne hsználni, de kiegészíthető továi műveletekkel is. + () (1) Itt z egyetlen változó, z áécé elemei pedig +,,, vlmint nyitó és csukó zárójel. z egy nem egyértelmű nyelvtn, hiszen például z + kifejezéshez két különöző levezetési f is trtozik, 5
+ + 3. Megjegyzés. H erre két fár nem mint levezetési fákr, hnem mint kifejezés kiértékelésének módját megdó fákr gondolunk, kkor látszik, hogy míg z első megfelel z ritmetiki kifejezések szokásos kirétékelésének (elő szorzást végezzük el, után z összedást) második,,rossz sorrenden végzi műveleteket. 1. étel. Az ritmetiki kifejezésekre dott fenti G egyszerű nyelvtn (1) nem egyértelmű, de z áltl generált L(G) nyelv egyértelmű nyelv. Bizonyítás vázlt: Az elő már láttuk, hogy nyelvtn nem egyértelmű. A nyelv egyértelműségéhez muttnunk kell egy G egyértelmű nyelvtnt, mire L(G ) = L(G). Legyen G következő: + F F F () Világos, hogy G nyelvtnnl levezethető ritmetiki kifejezések levezethetők z eredeti nyelvtnól is. Azt kell megmuttni, hogy h w L(G), kkor w L(G ) is teljesül, sőt G -eli levezetési fáj egyértelmű. zt w hossz szerinti indukcióvl mutthtjuk meg. H w = 1, kkor csk w = lehet, és ez egyedül z F lépésekkel kphtó meg G nyelvtnn. Hossz szvkr zt kell észrevenni, hogy h vnnk zárójelen kívüli + jelek, kkor először ezeket kell generálni (sorrenden visszfelé) z első szály segítségével, után zárójelen kívüli jeleket, mjd zárójeleken levő kifejezéseket. 4. Megjegyzés. Vegyük észre, hogy een módosított nyelvtnn h levezetési fát kiértékelési fánk tekintjük, kkor műveletek sorrendje is szokásos lesz. 6