Kezdőlap

|

Mi a kreditvadasz.hu Egy felsőoktatási közösségi oldal amely segít kapcsolatot tartani a hallgatók között, így segítséget nyújt a sikeres tanulmányokhoz...

Bach Iván - Formális nyelvek tankönyv

Országok listájaHungaryBudapesti Műszaki és Gazdaságtudományi EgyetemVillamosmérnöki és Informatikai KarMérnök informatikusFormális NyelvekKönyvBach Iván - Formális nyelvek tankönyv

2007.12.16 21:46:49
(10)
Szerző: Szabó Tamás
Cimkék: formális nyelvek, véges automaták, reguláris kifejezések, fordítók, elemzők


Az alábbi szöveg egy formázás és képek nélküli előnézete a dokumentumnak. A tökéletes megjelenítéshez jelentkezz be, majd töltsd le a dokumentumot.

BACH IVÁN

Formális nyelvek
Második, javított kiadás Egyetemi tankönyv

TYPOTEX Kiadó Budapest, 2002

A könyv az illetékes kuratórium döntése alapján az Oktatási Minisztérium támogatásával a Felsoktatási Tankönyvtámogatási Program keretében jelent meg (2000/362).

© Bach Iván; Typotex, 2001 ISBN 9639132 92 6

Kedves Olvasó! Önre gondoltunk, amikor a könyv elterjesztésén munkálkodtunk. Kapcsolatunkat szorosabbra fzhetjük, ha belép a Typoklubba, ahonnan értesülhet új kiadványainkról, akcióinkról, programjainkról, és amelyet a www.typotex.hu címen érhet el. Honlapunkon megtalálhatja az egyes könyvekhez tartozó hibajegyzéket is, mert sajnos hibák olykor elfordulnak.

Kiadja a Typotex Elektronikus Kiadó Kft., az 1795-ben alapított Magyar Könyvkiadók és Könyvterjesztk Egyesülésének tagja Felels kiadó: Votisky Zsuzsa Tördel: Naszódi Mátyás A borítót tervezte: Tóth Norbert Terjedelem 14,8 (A/5) ív Készült a pécsi Bornus Nyomdában Felels vezet: Borbély Tamás

Formális nyelvek

Annotáció
Egy megismételhetetlen emberi és szakmai kapcsolat örökségeként ezt a munkámat

Frey Tamás
barátom emlékének ajánlom. Mint a Budapesti Mszaki Egyetem tanára, elsk között szorgalmazta a számítástudomány oktatását. Fájdalmasan korai halála csak az els lépések megtételét tette lehetvé számára. Ez a könyv az célkitzéseit kívánja szolgálni.

Tartalomjegyzék

Elszó Bevezetés Történeti áttekintés 1. Formális nyelvek 1.1. A formális nyelvek definíciója 1.2. Grammatikák 1.3. Miért grammatika a grammatika ­ Egy illusztratív példa 1.4. A Chomsky-féle nyelvosztályok 1.5. A tartalmazás problémája ­ Eljárások és algoritmusok 1.6. Nyelvek és automaták 2. Reguláris nyelvek 2.1. Reguláris nyelvek és véges automaták 2.2. Determinisztikus és nemdeterminisztikus véges automaták 2.3. Minimálautomata 2.4. A két irányban mozgó véges automata 2.5. Mveletek nyelvekkel 2.6. Reguláris halmazok

9 11 11 13 13 14 18 20 23 26 29 29 38 43 49 57 71

3. Környezetfüggetlen nyelvek 79 79 3.1. A levezetési fa 86 3.2. Nyelvtanok átalakítása 3.3. Nyelvtanok normálalakjai 95 102 3.4. Veremautomaták 3.5. A környezetfüggetlen nyelvek és veremautomaták ekvivalenciája 114 3.6. Determinisztikus veremautomata 126 ­ Mveletek környezetfüggetlen nyelvekkel 4. Fordító automaták 4.1. Véges fordítók 4.2. Szintakszisvezérelt fordítási sémák 4.3. Veremfordító 4.4. Jellemz nyelvtanok 137 137 144 148 151

5. Szintaktikus elemzk 5.1. Általános elemzk, bal- és jobbelemezhetség 5.2. A balelemzés, LL(k) nyelvtanok 5.3. A jobbelemzés, LR(k) nyelvek 5.4. Egyszersített jobbelemzés 5.5. Nyelvek és nyelvtanok 6. Az automataelmélet alapjai 6.1. A Turing-gép 6.2. A Turing-gép lehetségei 6.3. A megállási probléma 6.4. A Turing-gép és a 0-ás osztályú nyelvek 6.5. Lineárisan korlátos automata 6.6. A számítástechnikai nyelvészet algoritmikusan eldönthetetlen feladatairól Szószedet Név- és tárgymutató Irodalom

157 157 167 182 189 202 207 207 211 220 224 230 234 243 247 255

Elszó

Ez a könyv a ,,Számítástechnikai Nyelvészet" cím egyetemi jegyzetem alapján készült. Egy tankönyvnek szánt munka sohasem lehet, ha szabad egy szakmabeli kifejezést alkalmaznom, környezetfüggetlen. A környezetet itt a tanterem, a katedra, az egyik oldalon álló oktató, és a másik oldalon helyet foglaló egyetemi hallgatók sokasága jelenti. Annak idején a jegyzetet szándékaim szerint abban a stílusban írtam, ami megfelelt az eladások hangulatának. Így aztán a közvetlenebb els személyben íródott a jegyzet. Sokak szerint egy könyv esetében a személytelenség kívántatik meg. Én nem követtem ezt a szemléletmódot, nemcsak azért, mert így a jegyzet könyvesítése egyszerbbnek ígérkezett, hanem mert írásban is meg akartam tartani azt a közvetlenséget, amelyet az eladásokon szándékaim szerint gyakorolok. Ez a könyv hosszú évek pedagógusi tapasztalatai után tulajdonképpen kollektív munka eredménye. Munkatársaim, akik velem együtt oktatták ezt a tárgyat, megjegyzéseikkel kimondatlanul is hozzájárultak a könyv megszületéséhez. Régebbi munkatársaim közül sokan már más feladatot kaptak, de a mostani munkatársi gárdát hadd soroljam itt fel köszönettel: Vitéz András, Naszódi Mátyás, Vaszil György, Csima Judit, Varró Dániel. Külön köszönöm Naszódi Mátyás aktív segítségét: az munkája többek között az ábrák számítógépes komponálása. Végül ­ last but not least ­ köszönetet szeretnék mondani annak a jóval több, mint ezer egyetemi hallgatónak, akik közül sokan nem csak passzív szerepli voltak az oktatásnak. Az igényességük szorított engem rá arra, hogy világosan, értheten, az egyetemi hallgató számára emészthet formában íródjék az egyetemi jegyzet és ez a könyv. Bízom benne, hogy ez többé-kevésbé sikerült. A munka megjelenésekor az érdemük se maradjon megemlítetlenül. Megkülönböztetett köszönet illeti a TYPOTEX kiadót, amiért beiktatta ennek a könyvnek a kiadását terveibe.

Bevezetés
Történeti áttekintés
Az emberi munka eredménye mindig valamilyen társadalmi igényt elégít ki. Ez a megállapítás igaz a tudományos élet területén is. Míg az elvont tudományok esetében az eredmény és az azt kiváltó társadalmi igény megfeleltetése gyakran nem triviális feladat, az alkalmazott tudományok mveli általában jól tudják, milyen gyakorlati céllal végzik kutató munkájukat. A matematikai nyelvésztre gondolva ez a megfeleltetés teljesen egyértelm. A második világháború alatt és az azt követ években a kutatási és fejlesztési munkákban forradalmi változások következtek be. A mszaki és természettudományokban ugrásszeren megntt a magasan kvalifikált szakemberek száma, ráadásul sokkal nagyobb hányaduk kezdett a kutatás és fejlesztés területén dolgozni, mint az azt megelz idkben. Ez a változás természetesen az új mszaki és tudományos eredmények, vele együtt pedig a tudományos publikációk számának hirtelen növekedésével járt. Korábban egy szakember viszonylag könnyen figyelemmel kísérhette azt a mintegy 5-6 folyóiratot, ahol tartalmas cikkeket remélhetett. A problémát tovább nehezítette, hogy a publikációk egy része, elssorban az angolul beszélk számára ,,szokatlan" nyelven volt írva, mint az orosz, japán vagy akár a magyar. Az információhoz való hozzáférés igénye hirtelen megnövelte a fordítandó cikkek számát olyannyira, hogy ezt a lényegében egysíkú, majdhogynem mechanikus munkát sem fordítói kapacitással, sem pénzzel nem lehetett gyzni. Ugyanakkor az egyik, éppen abban az idben, az 50-es évek elején kiteljesed, és az információrobbanáshoz nem kis mértékben hozzájáruló új tudomány, a számítástechnika azt állította, hogy célja a gépies szellemi munka kiváltása. Magától értetd volt tehát az a törekvés, hogy a fordítást, ezt a gépies szellemi munkát egy számítástechnikai eszköz, a számítógép végezze. Minthogy azonban a számítógép csak szabatosan megfogalmazott feladat megoldására képes, szükség volt a fordítás mint feladat formális leírására. Ez volt tehát az a kiváltó társadalmi igény, amely az 50-es években szinte a semmibl egy új tudomány a matematikai nyelvészet megalkotását eredményezte. Az új tudomány születési évének az 1956 esztendt tekinthetjük. Ekkor publikálta ugyanis a szakma atyja, és mindmáig egyik legnagyobb egyénisége Noam Chomsky munkásságának els eredményeit. A korai és látványos sikerek hatására igen nagy pénzek, dollármilliók áramlottak a szakmába, és ezzel együtt egy sereg kitn koponya kapcsolódott be ennek a divatszakmának a mvelésébe.

12

Bevezetés

Sajnos a kezdeti lendület ­ legalábbis ami az új eredményeket illeti ­ késbb alábbhagyott, jóllehet az anyagi és személyi feltételek továbbra is kedvezek voltak. Végül is Johnson elnök 1967-ben összehívta a szakma tojásfejit, vizsgálják meg, milyen perspektívája van a természetes nyelvek számítógépes fordításának, várható-e ezen a területen a közeljövben sikeres áttörés. A döntés a következ évben született meg: Véleményük szerint ­ ne feledjük akkor 1968-at írtak ­ a számítástechnika pillanatnyi fejlettsége nem ígér gyors eredményt, a feltételek még nem érettek meg az eredeti célkitzés megvalósítására. Ennek hatására az elssorban állami pénzekbl csordogáló dollárfolyam csapjait persze azonnal elzárták, és a téma mveli közül sokan más, jövedelmezbb foglalkozás után néztek, csak a szakma legmegrögzöttebb hívei maradtak. Ezzel a téma a nagy érdekldéssel kísért gyakorlati tudomány állapotából felemelkedett vagy lesüllyedt ­ a fogalmazás nézpont kérdése ­ az elméleti tudományok gyanúsan tiszteletreméltó státusába. Szerencsére a természetes nyelveknél sokkal egyszerbbek a mesterséges nyelvek, nevezetesen azok, amelyek nem az emberek közötti kommunikációt, hanem az ember és a számítógép közötti kapcsolatteremtést szolgálják. Fogalmi körük ersen leszkített, nyelvtani szabályaik egyszerek, általában nem ismernek kivételt, végül ­ talán ez a legfontosabb ismérvük ­ mondataik egyértelmek. A matematikai nyelvészet eredményei éppen ezért jóval könnyebben voltak alkalmazhatóak a gépi nyelvek fordításának területén, mind a fordítás elméletének megteremtésére, mind a fordítóprogramok gyakorlati megvalósítására. Így alakult ki azután egy tudomány, a matematikai nyelvészet gyakorlatibb aspektusú fattyúhajtása, a számítástechnikai nyelvészet. Ennek a tudománynak az elsajátításához kíván segítséget nyújtani ez a könyv. Befejezésül néhány szó a természetes nyelvek gépi fordításáról. Az ominózus döntés óta több mint három évtized telt el. A számítástechnika fejldése töretlen volt, és azóta lehetségei alapveten megváltoztak mind a mveleti sebesség, mind az igénybe vehet tárkapacitás tekintetében. Ennek fényében a 80-as évek óta egyre több szakember figyelme fordult ismét a természetes nyelvek gépi fordítása felé. Már túl vagyunk az els sikeresnek mondható próbálkozásokon. A természetes nyelvek gépi fordításának témája felébredt csipkerózsika álmából.

1. Formális nyelvek
1.1. A formális nyelvek definíciója
Az olvasó, akinek ,,polgári" eléletébl van valamilyen ­ és a maga nemében bizonyára helyes ­ képzete a nyelv szó jelentésérl, jobban teszi, ha egyelre megfeledkezik ilyen irányú ismereteirl. Talán helyesebb lett volna a most sorra kerül fogalom jelölésére a nyelv helyett valamilyen új szó bevezetése, ahogyan azt például a francia szaknyelv teszi, két szót használva a két fogalomra ­ la langue és le langage. Így azzal vigasztalódhatunk, hogy sem az angol, sem a német, sem az orosz nyelv nem disztingvál a két fogalom között, legalábbis elnevezés tekintetében nem. Hozzá kell azonban tennem, hogy a nyelv kétféle ­ számítástechnikai és köznapi ­ értelmezése között, az els pillanatban alapvetnek tn különbség valójában nagyon kicsi. Remélem, a késbbiekben kitnik majd, hogy a kétféle értelmezés milyen közel áll egymáshoz. Elöljáróban itt nyelv alatt mindig írott nyelv értend. A nyelv mondatai ennek megfelelen mindig írott szövegek. Ezek a szövegek egy adott véges szimbólum- illetve karakterkészlet elemeibl alkotott jelsorozatok. Jelölje a nyelv karakterkészletének véges halmazát. Ezt a halmazt a nyelv alfabetájának nevezzük. Legyen * a alfabetából alkotott véges, de nem korlátos hosszúságú jelsorozatok halmaza. A talán túl tömör megfogalmazás ,,véges, de nem korlátos hosszúságú" bizonyos magyarázatot igényel. Tekintsük például a természetes számoknak, pontosabban decimális, tízes számrendszerben való ábrázolásuknak halmazát. Ezt a halmazt nyilván a decimális számjegyekbl álló, és nem a 0 számjeggyel kezdd véges, de nem korlátos hosszúságú jelsorozatok alkotják. A jelsorozatok valóban végesek, hiszen nincsen olyan természetes szám, amelyet véges hosszúságú jelsorozattal ne tudnánk leírni, ugyanakkor azonban a hossz nem korlátos, hiszen bármilyen nagy számot engedélyezünk is a jelsorozat hosszának, mindig található olyan természetes szám, amelynek leírására a megadottnál több karaktert tartalmazó jelsorozat szükséges. Az alkalmazott * jelöléssel, illetve jelölési konvencióval kapcsolatosan a következket kell tudnunk. A i jelölés általában a elemeibl alkotott, és pontosan i hosszúságú jelsorozatok halmazát jelöli. Ennek megfelelen * = U i
i=0

(1.1.)

valóban az összes lehetséges a alfabetájából képezhet jelsorozatot adja. Az i = 0 eset a zérus hosszúságú, vagyis üres jelsorozatnak felel meg. Ennek jele .

14

1.1. A formális nyelvek definíciója

A fentiekbl nyilvánvaló, hogy nem üres halmaz esetén a * halmaz megszámlálhatóan végtelen számosságú. A továbbiakban mindig feltételezzük, hogy a halmaz nem üres. Egy adott alfabetából képezhet összes lehetséges jelsorozatba természetesen beletartozik az üres jelsorozat, az is. Éppen ezért ­ az (1.1.) jelöléseivel összhangban ­ is eleme a * halmaznak. Valamely ­ egy adott alfabeta felett értelmezett ­ L nyelv a * halmaz egy tetszleges részhalmaza. L * (1.2.) * Ha egy adott halmazbeli w jelsorozat eleme az L nyelv által meghatározott részhalmaznak, akkor a w jelsorozat az L nyelv mondata. wL (1.3.) Egy adott alfabeta feletti összes lehetséges nyelvek halmaza nyilván a * összes részhalmazából alkotott halmaz, vagyis a * halmaz hatványhalmaza. Minthogy viszont a * halmaz számossága megszámlálhatóan végtelen, így egy véges, de nem üres alfabeta felett kontinuum számosságú nyelv létezik. Ezen nyelvek között megkülönböztetett fontosságú és nevezetes nyelv az üres nyelv, amelynek egyetlen mondata, eleme sincsen, továbbá az a nyelv, amelynek egyetlen mondata az üres jelsorozat. A könyvben az elbbit L0, az L0 = Le = {} utóbbit Le jelöli. Így Felhívom az olvasó figyelmét, ügyeljen a két nyelv közötti különbségre. A nyelvek vizsgálatánál alapvet fontosságú az a kérdés, miképpen lehet egy nyelvet megadni, jellemezni. Amennyiben egy nyelv véges számú mondatot tartalmaz, úgy a mondatok exhausztív felsorolásával a nyelv egyértelmen megadható. Természetesen a gyakorlat szempontjából csakis azok a nyelvek érdekesek, amelyeknek végtelen sok mondatuk van. A programozási nyelvekre gondolva ugyanis mit kezdhetnénk egy olyan nyelvvel, amelyen csak véges sok programot lehet írni. A végtelen sok mondatot tartalmazó nyelvek, pontosabban ezen nyelvek egyik osztályának leírására egy új matematikai objektum, egy új formális eszköz, a nyelvtan, a grammatika szolgál.

1.2. Grammatikák
Mieltt a grammatikák formális leírásának részleteiben elmerülnénk, jellemezzük néhány szóval a grammatikát mint számítástechnikai fogalmat. Mindenekeltt azok a megjegyzések, amelyeket a nyelv köznapi és számítástechnikai értelmezésének els pillanatra alapvetnek tn eltérésérl, de valójában mélyenjáró azonosságáról mondottunk, betrl betre igaz a nyelvtanokra is. Mint az a késbbiekbl ­ remélem ­ kitnik, ez akkor is így van, ha a

1. Formális nyelvek

15

következkben leírtak aligha emlékeztetik az olvasót az általános-, illetve középiskolában a nyelvtanról tanultakra, jóllehet ugyanarról a fogalomról van szó. Formálisan a grammatikát egy négyes határozza meg G = ( N, , P, S ) (1.4.) ahol ­ N a grammatikai szimbólumok véges halmaza, ­ az alfabeta, a nyelv karakterkészletének már jól ismert véges halmaza, ­ P az úgynevezett levezetési szabályok összessége, ami szintén egy véges halmazt alkot, ­ S a mondatszimbólum. Az újonnan bevezetett fogalmak értelme rövidesen világos lesz. Nagyon lényeges, hogy a grammatikai és nyelvi szimbólumok között különbséget tudjunk tenni. A nyelvtanok, grammatikák azért alkalmasak egy nyelv definiálására, mert segítségükkel egy nyelv mondatai levezethetek, generálhatóak. Egy levezetés mondatszer formáknak nevezett jelsorozatok egymásutánja. A mondatszer forma abban különbözik a mondattól, hogy abban nem csak a nyelv szimbólumai, vagyis a elemei, hanem grammatikai szimbólumok is szerepelhetnek. Legyen 0 1 . . . . . n (1.5.) egy levezetés. A levezetések sorozatában az egyik mondatszer formából a következt a levezetési szabályok segítségével származtathatjuk. A szimbólum azt jelenti, hogy a baloldali mondatszer formából a nyelvtan levezetési szabályai szerint a jobboldali pontosan egy lépésben levezethet. Ha külön ki akarjuk hangsúlyozni, hogy melyik grammatika szerinti levezetésrl van szó, a grammatika azonosító jelét indexszeren a szimbólum alá írhatjuk. Amennyiben a levezetés nem egyetlen lépésben történt, hanem meg nem határozott tetszleges számú lépésben, akkor a szimbólum fölé tett csillag * jelzi ezt. Így, ha azt akarjuk leírni, hogy a 0 mondatszer formából a n mondatszer forma a G grammatika segítségével elre meg nem határozott számú lépésben levezethet, akkor ennek jelölése: 0 G n (1.6.) A levezetési szabályok ­ használatos még rájuk a produkciós szabály, helyettesítési szabály, újraírási szabály elnevezés is, amely elnevezések ezen szabályok egy-egy tulajdonságára vonatkoznak ­ a következ alakúak: (1.7.) ahol a nyíl a szabály bal-, illetve jobboldalát elválasztó szimbólum, amely különbözik mind a grammatikai, mind a nyelvi szimbólumoktól, míg és két jelsorozat, amely mind grammatikai, mind nyelvtani szimbólumokat tartalmazhat. A szabály baloldalán álló jelsorozat, tehát legalább egy grammatikai szimbólumot kell hogy tartalmazzon, a jobboldali jelsorozat tetszleges.
*

16

1.2. Grammatikák

Egy mondatszer forma esetében egy levezetési szabály akkor alkalmazható, ha a mondatszer formának van olyan ­ nem szükségképpen valódi ­ részsorozata, amely megegyezik a levezetési szabály baloldalával. Ez esetben a szabály alkalmazása abban áll, hogy az említett részsorozatot a szabály jobboldalával helyettesítjük, a mondatszer formának ezt a részét újraírjuk. Az alkalmazás módja magyarázza a korábban említett elnevezéseket. Így ha a i mondatszer formából az szabály segítségével a i+1 egy lépésben levezethet, akkor szükségképpen: i = '" '" = i+1 (1.8.) Itt ' és '' tetszleges, esetleg üres jelsorozat. A helyettesítési szabályok alkalmazásának módja utasítást ad arra vonatkozóan, hogyan haladjunk mondatszer formáról mondatszer formára. De hogyan kapjuk meg az els mondatszer formát? Megállapodás szerint minden levezetés egy különleges, egyetlen speciális grammatikai szimbólumból, a mondatszimbólumból álló mondatszer formával kezddik. Ez az a kályha, ahonnan minden levezetés elindul. Amennyiben a levezetés során olyan jelsorozatot kapunk, amely csak nyelvi szimbólumokat tartalmaz, vagyis a mondatszer forma egyben mondat is, akkor a levezetés szükségképpen befejezdik, terminálódik, hiszen grammatikai szimbólum hiányában egy levezetési szabály sem alkalmazható. A kapott jelsorozat pedig a nyelv egy mondata. Amennyiben a mondatszer forma tartalmaz grammatikai szimbólumot, akkor a levezetést ­ ha lehetséges ­ folytatni kell, a mondat generálása még nem fejezdött be, nem terminálódott. Ha annak ellenére, hogy a mondatszer forma még tartalmaz grammatikai szimbólumot, de nem találunk olyan helyettesítési szabályt, amelyet alkalmazhatnánk, akkor ez a generálás, ez a levezetési kísérlet sikertelen volt. A fentiek indokolják az irodalomban, de ebben a könyvben is a grammatikai illetve nyelvi szimbólumokra alkalmazott nemterminális illetve terminális szimbólum elnevezést. Ismerkedjünk meg néhány, a számítástechnikai irodalomban általánosan használt konvencióval. A nemterminális szimbólumokat a latin ábécé elejérl vett nagybetk jelölik ­ A, B, C. A terminális szimbólumokra a latin ábécé elejérl vett kisbetket használjuk ­ a, b, c. Egyetlen, közelebbrl meg nem határozott szimbólumot latin nagybetvel jelölünk, de az ábécé végérl ­ X, Y, Z. A jelölésbl ilyenkor nem derül ki, hogy terminális vagy nemterminális szimbólumról van-e szó. A terminális szimbólumokból álló jelsorozatokat az ábécé végérl vett latin kisbetk ­ x, y, z ­ jelentik.

1. Formális nyelvek

17

Az olyan jelsorotokat, amelyek tartalmazhatnak mind terminális, mind nemterminális szimbólumokat is görög kisbetk jelölik ­ , , . A mondatszimbólumot az angol sentence (mondat) szó kezdbetje S jelöli. A következkben a formulák jelölései ­ kivételes esetektl eltekintve ­ megfelelnek a fenti konvenciónak. Eltérés esetén külön felhívom erre a tényre az olvasó figyelmét. Ennyi bevezetés után gyorsan és könnyen túleshetünk a nyelvtanok formális leírásán. Mint említettük a grammatikát formálisan egy négyes írja le. G = ( N, , P, S) Az egyes jelölések értelmét már korábban tisztáztuk. Érdemes megfigyelni, hogy az ábécé közepérl vett betk a konvenciókat nem érintik. A terminális és nemterminális szimbólumok közötti különbségtétel nagyon fontos. Éppen ezért a két halmaznak ­ az N és a halmaznak diszjunktnak kell lennie, tehát N= (1.9.) A levezetési szabályok alakját már ismerjük, st arról is történt említés, hogy a baloldalnak mindig kell nemterminális szimbólumot tartalmaznia. Ez a követelmény formálisan a következképpen írható fel: ahol (N )*N (N )* és (N )* (1.10) vagyis az jelsorozat mindenképpen tartalmaz legalább egy nemterminális szimbólumot, amelyet ­ akárhány, ezt jelzi a kitevben szerepl * jel ­ tetszleges, tehát akár N akár halmazbeli szimbólum elzhet meg, illetve követhet. A tetszleges, így akár zérus hosszúságú, terminális és nemterminális szimbólumokból álló jelsorozat. Természetesen a mondatszimbólum eleme a nemterminális szimbólumok halmazának, így SN (1.11.) Egy adott G grammatika által definiált nyelv jelölése L(G), és ez a nyelv a * azon elemeit tartalmazza, amely jelsorozatok a G grammatika segítségével tetszleges számú lépésben generálhatóak: L(G) = { w * S G w) (1.12.) A korábbiak alapján a fenti formula könnyen értelmezhet. Gyakorlásképpen adjunk meg egy nyelvet ezzel a formális leírással. Legyen G = ({S, B, C}, {a, b, c}, P, S) ahol P = { S aSBC, S abC, CB BC, bB bb, bC bc, cC cc }
*

18

1.2. Grammatikák

Vezessük le a nyelv egy mondatát. A levezetés mondatszer formáiban ­ a levezetés követését megkönnyítend ­ aláhúzással emeltem ki azokat a részeket, amelyeket az adott lépésben újraírtunk. S aSBC aabCBC aabBCC aabbCC aabbcC aabbcc A fenti példánkban a generálás sikeres volt. A levezetés végén eljutottunk a nyelv egy mondatához. Ez nem szükségszer. Adódhat helyzet, amikor a menetközben kapott mondatszer forma tovább nem vezethet, nincsen egyetlen olyan szabály sem, amely alkalmazható volna, jóllehet a mondatszer forma még tartalmaz nemterminális szimbólumot. Ekkor a generálási kísérlet fiaskóval végzdött. Ugyanezt a grammatikát használva lássunk erre is egy példát: S aSBC aabCBC aabcBC ? A levezetés lefulladt, ezen az úton a nyelv egyetlen mondata sem generálható. A grammatika egyébként, mint arról könnyen meggyzdhetünk az L(G) = { ai bi ci | i > 0 } nyelvet generálja. Adott esetben a nyelv mondatainak száma valóban végtelen, mégpedig megszámlálhatóan végtelen.

1.3. Miért grammatika a grammatika ­ Egy illusztratív példa
A régóta jól ismert fogalmak, mint nyelv, nyelvtan, grammatika formális definíciója, mint azt elöljáróban beharangoztam, látszatra valóban nem sok rokonságot mutat az iskolában az ezekrl a fogalmakról tanultakkal. Ezt az ellentmondást oldjuk most fel egy demonstratív példával, amely ráadásul még új fogalmak megismerésére is módot ad. A példa a magyar nyelv egy nagyon korlátozott és nagyon leszkített részhalmaza lesz. Sajnos az imént nagy gonddal kidolgozott konvencióink felhasználása itt nem célszer, ezért erre a kivételes alkalomra néhány új konvencióval élünk. A nemterminális szimbólumokat, amelyek ebben az esetben szemlátomást valóban grammatikai szimbólumok, csúcsos zárójelbe tett, a szimbólum nyelvtani szerepére utaló szöveggel jelöljük. Még egy új jelölést, pontosabban jelölési egyszersítést vezetünk be. Olyan esetekben, amikor több levezetési szabály baloldala azonos, ezeket a szabályokat összevonva adjuk meg. A csupán egyszer megadott baloldalt követen a jobboldalakat egymás után a vagy olvasatú | jellel elválasztva írjuk le. Ezt a jelölést a késbbiekben máskor is alkalmazzuk. A levezetési szabályok bal- és jobboldalának elválasztására is a helyett egy új jelet a ::= szimbólumot alkalmaztuk (Backus­Naur jelölés). jobboldalának elválasztására is a helyett egy új jelet a ::= szimbólumot alkalmaztuk (Backus­Naur jelölés).

1. Formális nyelvek

19

Példa grammatikánk levezetési szabályai a következk lesznek: ::= <állítmányi rész> ::= <állítmányi rész> ::= ::= ::= | a | az | egy ::= | ::= | hideg | meleg | fehér | fekete | nagy | kis ::= kutya | macska | hús | egér | sajt | tej | víz ::= | nappal | éjjel | reggel | este ::= t ::= eszik | iszik Természetesen itt a kutya egyetlen terminális szimbólum, és nem jelsorozat. Ezért is kell ragaszkodnunk a terminális szimbólum elnevezéshez, mivel a terminális karakter kifejezés félreértések forrása lehet. A fenti minimagyar nyelv grammatikájával néhány korrekt magyar mondat generálható. Az alábbiakban erre mutatunk be egy példát, arra kérve az olvasót, hogy a kissé hosszadalmas levezetést türelemmel nézze át. <állítmányi rész> <állítmányi rész> <állítmányi rész> a <állítmányi rész> a <állítmányi rész> a nagy <állítmányi rész> a nagy <állítmányi rész> a nagy fehér <állítmányi rész> a nagy fehér kutya <állítmányi rész> a nagy fehér kutya reggel <állítmányi rész> a nagy fehér kutya reggel a nagy fehér kutya reggel t a nagy fehér kutya reggel t a nagy fehér kutya reggel t a nagy fehér kutya reggel t a nagy fehér kutya reggel meleg t a nagy fehér kutya reggel meleg húst a nagy fehér kutya reggel meleg húst eszik Úgy tnik sikerült ezzel a nem túl nagyigény nyelvtanunkkal egy épkézláb magyar mondatot levezetnünk.

20

1.3. Miért grammatika a grammatika

Sajnos a magyar nyelv szabályai azért nem annyira egyszerek. Így aztán nyelvtanunk generálja az alábbi mondatot is: az fehér egér hideg sajtt eszik Itt a kissé archaikus az nével használata még úgy ahogy elfogadható, de a sajtt alak a sajt szónak sem nem tárgyesete, sem nem múlt ideje. Ennek ellenére nézzük el grammatikánk talán túlzott nagyvonalúságát, és tekintsük a kifogásolt mondatot is, a korábban levezetett, és valóban minden igényt kielégít mondattal együtt korrekt magyar mondatnak. Hogyan vélekedjünk azonban az olyan mondatról, mint a fekete tej kutyat iszik Vajon ez is korrekt magyar mondat? Feltétlenül! A mondat ugyanis egy apró, és megállapodásunk szerint bocsánatos pongyolaságtól eltekintve minden tekintetben eleget tesz a magyar nyelv szabályainak. A matematikai nyelvészet szóhasználatával jól formált, vagy szintaktikusan helyes mondat. Egy mondat nyelvtani, szintaktikai helyességébl semmi következtetést sem vonhatunk le a mondat igazság tartalmára. Valljuk be ugyanis, hogy ennek a mondatnak nincs nagy igazság tartalma, st szintén szólva szemenszedett badarság. Az a tény, hogy mondat igazság tartalma hamis, semmiképpen sem érinti a mondat helyes magyarságát. Hiszen ha létezne olyan nyelv, amelyen csakis igaz kijelentéseket lehet tenni! St épp ellenkezleg. Csakis azért tehetünk megállapításokat egy mondat igaz vagy hamis voltára vonatkozóan, mert a mondat szintaktikusan helyes, és így érthet. Az olyan, a fenti grammatika szavaiból kialakított jelsorozat, mint kutya hús reggel fekete eszik víz szintaktikusan természetesen helytelen, számunkra emészthetetlen, és így fel sem merülhet az a kérdés, vajon a fenti szöveg igaz-e vagy hamis. Annak feltétele, hogy egy mondat értelmérl, szemantikájáról beszélhessünk az, hogy a mondat szintaktikusan helyes mondat legyen.

1.4. A Chomsky-féle nyelvosztályok
A generatív nyelveket tehát grammatikák segítségével jellemezhetjük. A grammatikákat meghatározó helyettesítési szabályok bonyolultsága alapján Chomsky a nyelveket osztályokba sorolta. Chomsky négy nyelvosztályt definiált. Ezeket számokkal jelölte, így van 0-ás, 1-es, 2-es és 3-as nyelvosztály.

1. Formális nyelvek

21

Az egyes nyelvosztályokban a helyettesítési szabályok alakjára vonatkozóan Chomsky az osztály sorszámának növekedésével egyre szigorúbb megkötéseket írt el. Ezek szerint legkevésbé kötött nyelvtanú a 0-ás nyelvosztály. Itt semmiféle külön megkötés nincsen. Természetesen az az elírás, hogy minden produkciós szabály baloldala tartalmazzon legalább egy nemterminális szimbólumot, ­ mint minden grammatikánál, ­ itt is érvényes. Lássuk most az egyes nyelvosztályokra megadott korlátozásokat. Felsorolásunkban a nagyobb sorszámoktól haladunk a kisebbek felé. A 3-as nyelvosztály nyelvtanaiban csak kétféle szabálytípus engedélyezett. Ezek: Aa illetve A aB (1.13.) A helyettesítési szabály baloldala mindig egyetlen nemterminális, jobb oldalán pedig vagy egyetlen terminális szimbólum, vagy egyetlen terminális és egyetlen nemterminális szimbólumból álló jelsorozat. Az ilyen alakú grammatikákat reguláris, pontosabban jobbreguláris nyelvtanoknak nevezzük. Amennyiben a második szabálytípusnál a két jobboldali szimbólum sorrendjét felcseréljük, vagyis a nemterminális szimbólumot követi a terminális szimbólum, akkor balreguláris grammatikáról beszélünk. Ezek a nyelvtanok generálják a reguláris nyelveket. Itt a különbségtételnek nincs értelme, hiszen ­ mint azt késbb igazoljuk ­ a kétféle nyelvtan ugyanazt a halmazt generálja. A 2-es nyelvosztály helyettesítési szabályainak alakja: A (1.14.)

ahol tetszleges, mind terminális mind nemterminális szimbólumokat tartalmazható jelsorozat. A szabály baloldala itt is egyetlen, szükségképpen nemterminális szimbólum. Ezt úgy interpretálhatjuk, hogy egy adott A nemterminális szimbólum mindig helyettesíthet az jelsorozattal, függetlenül attól mi a nemterminális környezete. Minthogy a szabályok alkalmazása a környezettl, kontextustól független, ennek a nyelvosztálynak a nyelveit környezetfüggetlen, vagy angol rövidítésük alapján CF (Context Free) nyelveknek nevezzük. Az 1-es nyelvosztály helyettesítési szabályainak korlátait kétféle módon is jellemezhetjük. Az els megadási mód szerint a levezetési szabályok alakja: A (1.15.) amit úgy interpretálhatunk, hogy az A szabály csakis a - környezetben alkalmazható. Ez az értelmezés magyarázza ezen nyelvosztály elnevezését, ezek a nyelvek a környezetfügg, vagy angol rövidítésük alapján CS (Context Sensitive) nyelvek.

22

1.4. A Chomsky-féle nyelvosztályok

Az 1-es másik lehetséges meghatározási módja szerint a szabályok alakja: ahol (1.16.) Jelsorozatok esetében a két függleges vonal, amely máshol az abszolút érték jele, itt a jelsorozat hosszát adó operátor. A fenti megkötés tehát azt fejezi ki, hogy a helyettesítési szabályok jobboldala nem lehet rövidebb a baloldalnál. Ezen tulajdonság alapján ezeket a nyelveket nem csökkent nyelveknek is nevezik. Az 1-es nyelvosztályra megadott két látszólag teljesen független meghatározás valójában, mint azt látni fogjuk, ugyanazt a halmazt definiálja. A 0-ás nyelvosztályban alkalmazható szabályokra nézve, mint már említettük, nincsen korlátozás. Természetesen egy adott grammatika akkor tesz eleget egy nyelvosztály követelményeinek, ha a grammatika valamennyi szabálya megfelel a feltételeknek. Vegyük észre, hogy a nyelvosztály sorszámát növelve a helyettesítési szabályok korlátozásai olyan értelemben súlyosbodnak, hogy egyúttal eleget tesznek az elz nyelvosztály követelményeinek is. Így például a 3-as osztályú nyelvtan a 2-es és az 1-es nyelvosztály megkötéseit is kielégíti. A figyelmes olvasónak bizonyára feltnt, hogy jóllehet következetesen nyelvosztályokról beszéltünk, ezeket a nyelvtan levezetési szabályaira vonatkozó korlátozásokkal jellemeztük. Pedig a nyelv és a nyelvtan két dolog. Egy nyelvtanhoz egy és csakis egy nyelv tartozik, nevezetesen az, amelyiket a nyelvtan generál. Egy nyelvnek viszont több nyelvtana is lehet, st az is megeshet, hogy különböz nyelvtanai különböz nyelvosztályok megkötéseinek tesznek eleget. Az alkalmazott terminológia nem a szerz pongyolasága, hanem a matematikai nyelvészet általánosan elterjedt szóhasználata. Persze meg kell mondanunk, mit is értünk egy nyelvnek egy nyelvosztályhoz való tartozásán. Egy nyelv hovatartozását az a legegyszerbb nyelvtan határozza meg, amely a nyelvet generálni képes. Az egyszerséget természetesen itt a nyelvosztályok jelentik, és nyilván a 3-as nyelvosztály a legegyszerbb. Egy adott nyelv esetén tehát két dolgot kell megvizsgálnunk. Meg kell állapítanunk, hogy a generáló nyelvtan melyik nyelvosztályba tartozik, majd igazolnunk kell, hogy a nyelvnek nincsen egyszerbb, azaz magasabb sorszámú nyelvosztályba tartozó nyelvtana. Az els kérdésre a válasz roppant könny, csak végig kell olvasnunk a helyettesítési szabályokat. A második probléma már fogas kérdés. Adott konkrét nyelv esetében néha intuitíve igazolható, hogy a szóban forgó nyelvtannál a nyelvnek egyszerbb nyelvtana nem lehet. Általánosságban azonban a kérdést nem lehet megválaszolni.

1. Formális nyelvek

23

Az irodalom ebben a tekintetben nem bakafántoskodik. A nyelvet szemrebbenés nélkül abba a nyelvosztályba tartozónak véli, amely a nyelvet generálja. Nem tördik azzal, hogy egy nyelvet esetleg ,,jogtalanul" minsített a 2-es nyelvosztályba, amikor pedig létezik 3-as osztályú nyelvtana. A nyelvek osztályba sorolásánál ez a könyv is ­ mint minden számítástechnikai publikáció ­ az elbbiekben ismertetett gyakorlatot követi.

1.5. A tartalmazás problémája ­ Eljárások és algoritmusok
A tartalmazás problémája a számítástechnikai nyelvészet egyik alapvet kérdése. Megfogalmazása a következ: Legyen adott egy nyelv grammatikájával, és egy * halmazbeli jelsorozat. Eldöntend, hogy a megadott jelsorozat eleme-e a nyelvtanával meghatározott nyelvnek, generálható-e a szóban forgó jelsorozat az adott nyelvtannal. Ennek kapcsán vizsgáljuk meg, hogyan keressünk választ egy szabatosan megfogalmazott kérdésre. Olyan mveletsorozatot, lépések egymásutánját kell megszerkesztenünk, amelynek végrehajtása révén választ kapunk kérdésünkre. Például, ha az a feladatunk, hogy egy szám prímszám voltát megállapítsuk, akkor erre olyan mveletsorozatot tervezhetünk, amely a vizsgált számot minden nála kisebb számmal elosztja. Amennyiben az osztás mindenkor eredményez maradékot, akkor a szám prímszám, ha egyszer is sikerül a számot maradék nélkül osztanunk, akkor a szám nem prímszám. Nem állítom azt, hogy ez egy hatékony megoldás, viszont nagyon könny lépésekre bontani, így nem sértem meg az olvasót azzal, hogy ennek részleteiben elmerülnék. Ami a problémánk megoldására vezet lépéssorozatot illeti, két alapvet esetet kell megkülönböztetnünk. Az els esetben a választ véges számú lépés után mindenképpen megkapjuk, míg a második esetben sajnos nem garantálható, hogy véges lépésben, tehát valaha is választ kapjunk kérdésünkre. Az els esetben algoritmusról, a másodikban eljárásról, procedúráról beszélünk. Ennek illusztrálására lássunk egy szabatosan meghatározott feladatot. Tételezzük fel, hogy egész együtthatós egyenletek, polinomok gyökeit akarjuk meghatározni. Tudjuk azt, hogy a racionális számok megszámlálhatóan végtelen sokan vannak. Generáljuk tehát sorban a racionális számokat, és helyettesítsük be ezeket egyenletünkbe. Természetesen nem állítom, hogy ez egy hatékony módszer, a gondolatkísérletnek kizárólag illusztratív szerepe van. Amennyiben els fokú egyenlettel van dolgunk, amelynek megoldása racionális szám, akkor bizonyosak lehetünk abban, hogy elbb-utóbb a megoldást

24

1.5. A tartalmazás problémája

generálni fogjuk, és így véges sok lépésben megkapjuk a megoldást. Ne csüggedjünk tehát, ha már hosszabb ideje generáljuk hiábavalóan a racionális számokat. Folytassuk munkánkat abban a biztos tudatban, hogy állhatatosságunk elbb-utóbb megtermi a maga gyümölcsét, vagyis adott esetben az egyenlet megoldását. Nagyobb fokszámú egyenletek, például másodfokú egyenletek esetében már nem lehetünk biztosak a dolgunkban. Itt nem tudhatjuk az idleges sikertelenség okát. Lehet, hogy az egyenletnek van racionális gyöke, csak ez a szám még nem került el a generálás során. Ebben az esetben érdemes továbbfolytatni a generálást. Elfordulhat viszont az az eset, hogy nincsen racionális gyök, és ilyenkor bármeddig generáljuk is a racionális számokat, sohasem kapunk eredményt. Módszerünk tehát az elsfokú egyenletek esetében algoritmus volt, vagyis véges sok lépés után mindig kaptunk eredményt, magasabb fokszámú egyenletek esetében viszont csak procedúra. Ebbl természetesen nem lehet azt a következtetést levonni, hogy magasabb fokszámú egyenletek esetében nem szerkeszthet algoritmus. Így például a másodfokú egyenletek közismert megoldó képlete nagyon hatékony algoritmust szolgáltat, és választ ad abban az esetben is, ha a gyökök nem racionálisak, st akkor is, ha komplex számok. Itt pusztán arról van szó, hogy a megoldási módszert ,,ügyetlenül" választottuk meg. A huszadik század harmincas éveinek egyik meglep és nagy jelentség tudományos felismerése volt, hogy bizonyos problémákra nem szerkeszthet algoritmus, vagyis nem minden esetben kaphatunk választ kérdésünkre. Az ilyen feladatokra azt mondjuk, hogy algoritmikusan eldönthetetlenek. Itt természetesen mindig egy feladatosztályról van szó. Ennek egyes konkrét reprezentánsai, feladatai esetleg megoldhatóak, véges sok lépésben kapunk kérdésünkre választ, annak ellenére, hogy általánosságban a feladatosztály algoritmikusan eldönthetetlen, vagyis minden esetben választ adó algoritmus nem szerkeszthet. Sajnos a tartalmazás kérdése, a számítástechnika ezen alapvet feladata algoritmikusan eldönthetetlen. Szerencsére azért a helyzet ennyire nem sötét, az 1-es nyelvosztály, és így természetesen a 2-es és 3-as nyelvosztály esetében szerkeszthet algoritmus a tartalmazás feladatára. Az alábbiakban megadjuk egy ilyen algoritmus alapgondolatát. Legyen adott egy w jelsorozat, és egy G grammatikájával adott meghatározott nyelv. Feltételezzük, hogy a nyelvtan kielégíti az 1-es nyelvosztály követelményeit. A megoldás kulcsa az a felismerés, hogy a nyelvtan nem csökkent tulajdonságú. Generáljuk ugyanis az összes lehetséges levezetést abban a reményben, hogy elbb-utóbb eljutunk a w jelsorozathoz. Ha a generálás során egy mondathoz érünk, azt mindig összevetjük a vizsgált jelsorozattal. Amennyiben a két jelsorozat azonos a vizsgált jelsorozat mondata a nyelvnek.

1. Formális nyelvek

25

Viszont valahányszor egy mondatszer forma hossza meghaladja a w jelsorozat hosszát, akkor a további próbálkozásokat ezen az ágon abbahagyhatjuk, hiszen a nyelvtan nem csökkent jellege miatt ebbl a mondatszer formából a w jelsorozat már biztosan nem vezethet le. Minthogy egy adott hosszon belül az összes lehetséges mondatszer formák száma véges, véges számú lépésben vagy megtaláljuk a szóban forgó jelsorozatot, vagy valamennyi levezetési utunk ,,befuccsol", és így kizárhatjuk a tartalmazást. Annak megoldása, hogy valamennyi levezetési utat bejárjunk, egyszer technikai probléma. Az összes lehetséges levezetés módszere a 0-ás nyelvosztály esetében is alkalmazható. Amennyiben az azonosítandó jelsorozat eleme a nyelvnek, vagyis levezethet, akkor a generálás során elbb-utóbb megkapjuk ezt a jelsorozatot, hiszen ennek levezetése is benne van az összes lehetséges levezetésben. A probléma onnan adódik, hogy most nem hagyhatjuk abba a levezetést a túl hosszú mondatszer formák esetében, hiszen a nyelv tartalmaz csökkent szabályokat (ha nem így lenne, akkor a nyelv 1-es osztályú lenne), és így a hosszúra nyúlt mondatszer formák visszasoványodhatnak az elemzett jelsorozat hosszára. Éppen ezért itt az elbbi módszer nem algoritmus, hanem csak procedúra. Abból, hogy az összes lehetséges levezetések módszere a 0-ás nyelvosztály esetében nem szolgáltat algoritmust, hanem csak procedúrát, önmagában még nem következik, hogy a tartalmazás feladata a 0-ás nyelvosztályban algoritmikusan eldönthetetlen, hanem csupán azt jelzi, hogy ezen az úton a feladat nem algoritmizálható. Mint késbb kitnik, a feladat a 0-ás nyelvosztályra valóban algoritmikusan eldönthetetlen, de ez külön igazolást igényel. Az algoritmikus eldönthetetlenség kérdésére, és ezen belül a tartalmazás feladatára nagy fontossága miatt még visszatérünk. Itt csak utalni szeretnék arra, hogy egy feladat, pontosabban egy feladatosztály algoritmikusan eldönthetetlen voltának megállapítása olyan újszer apparátust igényel, amely még nincs birtokunkban. Megjegyzem, hogy a tartalmazás kérdése sajnos a számítástechnikai nyelvészet nem egyetlen olyan lényeges problémája, amelyrl kiderül majd, hogy algoritmikusan eldönthetetlen.

26

1.6. Nyelvek és automaták

1.6. Nyelvek és automaták
A számítástechnikai nyelvészet egyik alapvet, ha nem a legalapvetbb problémáját, a tartalmazás kérdését az elz pontban tulajdonképpen megoldottuk. Ez az általános algoritmus azonban messzemenen nem optimális, és a matematikai nyelvészet erre a feladatra, a tartalmazás kérdésének megválaszolására új matematikai objektumokat definiált, az automatákat. Az automata persze ugyanolyan matematikai objektum, mint volt a nyelv és a nyelvtan, de szerencsére az automata már els látásra is jobban hasonlít a ,,civil" életbl magunkkal hozott automata fogalom képzetére. Az itt szerepl automatáknak ­ mint azt említettük ­ az a kizárólagos feladatuk, hogy választ adjanak a tartalmazás kérdésére. Minthogy a különböz nyelvosztályokhoz különböz bonyolultsági szint nyelvtanok tartoznak, nem meglep, hogy az egyes nyelvosztályokhoz különböz, egyre bonyolultabb automata szükségeltetik. Minél korlátozottabbak a nyelvtan helyettesítési szabályai, annál egyszerbb szerkezet automata elegend a tartalmazás feladatának megoldásához. Bár ezek az automaták matematikai objektumok, mégis beszélhetünk ,,szerkezeti" felépítésükrl. Tulajdonképpen itt olyan valóságos, tehát fizikai elemekbl felépített automatát specifikálunk, amely pontosan ugyanúgy viselkedik, mint az absztrakt matematikai objektum. Egy automata ­ és ebben a tekintetben a matematikai és a köznapi értelemben vett automata között nincs különbség ­ mindig valamilyen meghatározott állapotban van. Például egy telefonautomata lehet kiinduló állapotban, lehet abban az állapotban, amikor a beszélt már levettük, és pénzbedobásra vár, a következ állapot az lesz, amikor a tárcsázó hangra várunk, és így tovább. Épp így a matematikai automatának is van egy véges állapothalmaza, amelybl minden helyzetben egy és csakis egy érvényes. Amennyiben az automatát elemekbl összetettnek képzeljük, akkor az automatának a véges állapothalmaz kezelésére alkalmas részét véges vezérlésnek nevezzük. Minthogy automatánknak egy jelsorozatot, egy szöveget kell értelmeznie, kell legyen valamilyen input perifériája. Ez vagy egy olvasó, vagy egy író-olvasó berendezés. Az automata bonyolultságától függ, hogy megelégedhetünk-e csak olvasással, vagy mind olvasásra, mind írásra szükségünk van. Az elbbi esetben a perifériát mint lyukszalag olvasót, az utóbbiban mint mágnesszalag egységet képzelhetjük el. A szalag, pontosabban a szalagon lév értékes információ hossza az olvasó egység esetében triviális. Író-olvasó egységet alkalmazva korlátozhatjuk a szalag hosszát, de megengedhetünk nem korlátos szalaghosszt is. Végül az automatának lehet memóriája is. A memória jelenléte, és hozzáférési módja szintén befolyásolja az automata bonyolultságát. Az író-olvasó

1. Formális nyelvek

27

berendezéssel ellátott automaták természetesen felhasználhatják információk tárolására a bemen szalagot is. Valóban az ilyen automaták élnek is ezzel a lehetséggel.
Periféria (lyukszalagolvasó, mágnesszalag-egység)

Véges állapotú vezérlés

Memória

1.1. ábra Az 1.1. ábrán feltüntettük egy ilyen, a matematikai automatát modellez fizikai automata elvi rajzát. Mint látni fogjuk, a négy különböz nyelvosztálynak négy különböz automataosztály felel meg. Ezek az automaták alkalmasak lesznek arra, hogy a tartalmazás kérdésére a választ ­ ha ez egyáltalában lehetséges ­ megadják.

2. Reguláris nyelvek
2.1. Reguláris nyelvek és véges automaták
A reguláris nyelveket a 3-as osztályba tartozó grammatikák generálják. Az ilyen nyelveket elfogadó, a tartalmazás kérdésére választ adó automataosztály a véges automaták osztálya. A véges automaták a legegyszerbbek azon automaták közül, amelyek az elz fejezetben ismertetett általános automatából származtathatóak. A véges automata csak olvasni tud, tehát modellezésénél lyukszalag olvasót képzelhetünk el, és nincsen memóriája. Elnevezését onnan kapta, hogy állapottere véges. Tulajdonképpen a névválasztás nem mondható túl szerencsésnek, hiszen valamennyi, a késbbiekben tárgyalt automata szintén véges állapotter. Az elnevezést talán az indokolhatja, hogy errl az automatáról semmiféle más jellegzetesség nem mondható el. A véges automatát, mint matematikai objektumot egy ötös jellemez: M ( Q, , , q0, F) (2.1.) ahol ­ Q az automata állapotainak véges halmaza, ­ az elemzend jelsorozat alfabetája, ­ az automata mozgási szabályainak halmaza, amely szintén véges. A mozgási szabályok az automaták világában ugyanolyan meghatározó szerepet játszanak, mint a helyettesítési szabályok a grammatikák esetében. Ismertetésükre rögvest visszatérünk. ­ q0 az induló állapot. Az automata minden jelsorozat elemzését a q0 állapotból kiindulva végzi. Minthogy q0 szintén egy automataállapot (2.2.) q0 Q ­ F az elfogadó állapotok halmaza. Ez a halmaz az összes állapotok halmazának részhalmaza, így FQ (2.3.) A mozgási szabályok mondják meg, hogy egy adott állapotban egy adott karakter beolvasásának hatására milyen új állapotot vesz fel az automata. Így például ( A, a ) = B (2.4.) mozgási szabály akkor alkalmazható, ha az automata az A állapotban van, és az olvasott karakter a. Az új állapot B lesz. A mozgási szabályok összessége tulajdonképpen egy leképezés, amely az automataállapotok és az alfabeta karaktereinek direkt szorzatából álló halmazt képezi le az automataállapotok halmazára: QxQ (2.5.)

30

2.1. Reguláris nyelvek és véges automaták

Erre a leképezésre semmiféle külön megkötést nem teszünk, így nem kívánjuk meg sem azt, hogy teljes, sem azt, hogy egyértelm legyen. Ezek szerint lehetnek olyan állapot-karakter párok, amelyekre nincs mozgási utasítás, ugyanakkor olyan párok is elfordulhatnak, amelyekre egyidejen egynél több mozgási szabály is vonatkozik. Ilyenkor az automata bármelyik mozgási szabályt követheti, az automata valamelyik szabály által meghatározott állapotba megy át. Amennyiben minden állapot­karakter párhoz legfeljebb egy mozgási szabály tartozik, akkor az automata mködése egyértelmen meghatározott, az automata determinisztikus. Ha minden állapot­karakter pár esetében van mozgási szabály, akkor az automata teljesen specifikált. Mindannyiszor, amikor egy mozgási szabályt alkalmazva egy karaktert figyelembe vettünk, mintegy elolvastunk, a jelsorozat következ karaktere lesz érvényes. Fizikai automatánkban ezt úgy jellemezhetjük, hogy minden mozgás alkalmával az olvasófej alatt a szalag egy karakternyit elmozdul. Egy mozgássorozat eredményeképpen tehát a teljes jelsorozatot elolvashatjuk. Az automata az elemzett jelsorozatot elfogadhatja, vagy visszautasíthatja. Az elfogadásnak két, egyidejleg teljesítend feltétele van. Az automatának a szöveget végig kell olvasnia, és az utolsó karakter elolvasása után az automatának elfogadó állapotba kell kerülnie. Az els feltételre azért van szükség, mivel nem kötöttük ki a leképezés teljes voltát, és így elfordulhat, hogy egy bizonyos szituációban, egy bizonyos állapot-karakter páros esetében az automata nem tud továbblépni, mivel nincsen alkalmazható mozgási szabály. Ilyenkor az automata anélkül áll meg, hogy a jelsorozatot végigolvasta volna. A fentiek szerint ezt a helyzetet visszautasításnak tekintjük. A visszautasításnak ez a formája természetesen csak nem teljesen specifikált automaták esetében fordulhat el. Az automata mozgási folyamatát mint úgynevezett konfigurációk egymásutánját követhetjük nyomon. Valamely automata konfigurációja tulajdonképpen pillanatfelvétel az automata mködésérl, amely mindazt az információt tartalmazza, amelynek alapján az automata további mködése meghatározható k0 a k1 a . . . a ki a . . .a kn (2.6.) A a jel egy operátor, amely az egymásból egyetlen mozgással, egyetlen mozgási szabály alkalmazásával elérhet konfigurációkat választja el. Amennyiben ki akarjuk hangsúlyozni, hogy melyik automata mozgási szabályairól van szó, akkor a a mveleti jelhez indexként odaírjuk az automata nevét. Ha nem egyetlen, hanem tetszleges számú lépésben elérhet konfigurációt jelölünk, akkor a már ismert módon kitevben csillagot teszünk az operátor fölé, a*. Véges automaták esetében a konfiguráció az automata állapotát, és a még el nem olvasott jelsorozatot tartalmazza. A már elolvasott jelsorozat ugyanis csak

2. Reguláris nyelvek

31

az olvasás eredményeképpen kiadódó állapot útján befolyásolja az automata mködésének további menetét. Itt tehát egy konfiguráció: k = ( q, w) (2.7.) ahol ­ q egy automata állapot, tehát q Q ­ w pedig tetszleges jelsorozat, tehát w *. A fentiek szerint a (A, a) = B mozgási szabály abban a konfigurációban alkalmazható, ahol az állapot A, és a még elolvasandó jelsorozat els karaktere a. Egy automata L(M) nyelve alatt azon jelsorozatok halmazát értjük, amelyeket az automata elfogad. Eddigi jelöléseinkkel: L(M) = { w (q0, w) aM (p, ) p F } (2.8.) Az összefüggés szerint a nyelv elemei azok a w jelsorozatok, amelyek a kezdállapottal olyan konfigurációt alkotnak, amely az M automata mozgási szabályait alkalmazva tetszleges számú lépésben áttér olyan konfigurációra, ahol az olvasandó jelsorozat üres ­ magyarán az automata a teljes w jelsorozatot már elolvasta ­ és az állapot elfogadó állapot, vagyis az F halmaz eleme. Definiáljunk most egy automatát az elbbiekben leírt módon: M ({S, A, B, C}, {a, b, c}, , S,{C}) ahol = { (S, a) = A, (A, a) = A, (A, b) = B, (B, b) = B, (B, c) = C, (C, c) = C} Mint arról az olvasó könnyen meggyzdhet ez a leképezés nem teljes, ugyanakkor egyértelm. A véges automatákat egy gráffal szemléltethetjük, ami nagyon megkönnyíti tanulmányozásukat. A gráf irányított, és csomópontjai megfelelnek az automata állapotainak. Amennyiben egy állapotból egy adott karakter beolvasásának hatására az automata egy másik állapotba megy át, akkor a két állapotnak megfelel csomópontokat egy, a régi állapotból az új állapotba mutató, és az olvasott karaktert mint nevet visel éllel kötjük össze. Így például, ha a mozgási szabályok között szerepel (A, a) = B akkor az A csomópontból a B csomópontba egy a jel él vezet. A kiindulási állapotot kis nyíllal, az elfogadó állapotokat pedig ketts körrel jelölve tehetjük az ábrázolást egyértelmvé.
*

a S a A b

b B c

c C

2.1. ábra A 2.1. ábra a fent definiált véges automatát tünteti fel. A mködés követésére helyezzünk egy érmét a kezdállapotra, és minden mozgásnál csúsztassuk

32

2.1. Reguláris nyelvek és véges automaták

azt el a gráf élei mentén az új állapotba. Amennyiben a jelsorozat elolvasása után az érem egy elfogadó állapoton áll, az automata a jelsorozatot elfogadta. Könny belátni, hogy az ábrázolt automata az aibjck i, j, k > 0 alakú jelsorozatokat fogadja el. Az M automata L(M) nyelve azon jelsorozatok összessége, amelyeket az automata elfogad. A fenti összefüggés így az automata nyelvét adja. Az automaták által elfogadott nyelvek éppen a 3-as nyelvosztály elemei, tehát a véges automaták pontosan azokat a nyelveket fogadják el, amelyeket a reguláris nyelvtanok generálnak. Ennek az alapvet és fontos állításnak igazolására minden véges automatához rendelünk egy reguláris nyelvtant, és minden reguláris nyelvtanhoz egy véges automatát olymódon, hogy az automata által elfogadott nyelv a nyelvtan által generált nyelv legyen. Emlékeztetül írjuk fel ismét a reguláris nyelvtanokban engedélyezett két szabálytípust: A aB Aa Legyen adott egy véges automata. A hozzárendelt nyelvtan karakterkészlete azonos kell legyen az automata nyelvének karakterkészletével. Nem véletlen, hogy mindkettt jelöli. Feleltessünk meg az automata minden állapotának egy nemterminális szimbólumot. Ezen belül a kezdállapotnak a mondatszimbólum feleljen meg. Az automata minden mozgási szabályához rendeljünk egy levezetési szabályt a következképpen: (2.9.) (A, a) = B A aB Az automata elfogadó állapotainak megfeleltetett nemterminális szimbólumokhoz rendeljünk egy úgynevezett -szabályt, amelynek jobboldala az üres jelsorozat, : A (2.10) Az ilyen szabályok szemantikája betrl betre megegyezik az eddig tárgyalt szabályokéval. Ez annyit jelent, hogy a baloldalon szerepl nemterminálist a mondatszer formában a jobboldallal, vagyis adott esetben az üres jelsorozattal kell helyettesíteni. Az ilyen -szabály alkalmazásakor tehát, a mondatszer formából az adott nemterminális nyom nélkül eltnik, elenyészik. Az ilyen módon származtatott nyelvtan ugyanazt a nyelvet generálja, amelyet az automata elfogad. Mieltt azonban ennek igazolásában elmerülnénk, végezzük el elbb a fordított mveletet, vagyis készítsünk valamely reguláris nyelvtan alapján véges automatát.

2. Reguláris nyelvek

33

Az egységes tárgyalás kedvéért alakítsuk át kissé a nyelvtant, és vezessünk be egy új elenyész nemterminálist. Legyen ennek neve E. Minthogy ez a nemterminális elenyészhet, egészítsük ki a nyelvtant ennek -szabályával: E Az E elenyész nemterminálisnak a nyelvtanban nincs is más olyan szabálya, amelyben az a baloldalon szerepelne. Így ha egyszer az E nemterminális bekerül a mondatszer formába, szükségszeren azonnal megsemmisül. Ezután egészítsük ki a második típusú levezetési szabályokat az imént bevezetett elenyész nemterminálissal: Aa helyett legyen A aE (2.11.) Az -szabályokon kívül így nyelvtanunknak most már csak els típusú szabályai lesznek. Ezzel az átalakítással a generált nyelv nyilván nem változik, csupán az történt, hogy az eredeti nyelvtan utoljára alkalmazott, és a mondatszer formát mondattá alakító második típusú szabály funkcióját két lépésben oldjuk meg. Elször a (2.11.) szerint beírjuk az elenyész nemterminálist, majd azt elemésztjük. Itt minden nemterminálisnak feleltessünk meg egy automata állapotot, ezen belül a mondatszimbólum megfelelje a kezdállapot legyen. Az állapotok közül azok lesznek elfogadó állapotok, amelyek -szabállyal bíró nemterminálisnak felelnek meg. A helyettesítési szabályok átírása mozgási szabályokká az alábbi minta szerint történik: A aB (A, a) = B (2.12.) Az automaták és a nekik megfeleltetett reguláris nyelvtanok, illetve az automaták nyelvének és a reguláris nyelvtanok által generált nyelv azonossága a következképpen látható be. Elször azt igazoljuk, hogy amennyiben a nyelvtan segítségével levezethet a wA mondatszer forma, akkor létezik az automatának olyan mozgássorozata, amely a w bemenet hatására az automatát az A állapotba viszi át. Ennek az állításnak a megfordítása is igaz, vagyis ha az automata a w jelsorozat elolvasása után az A állapotba kerül, akkor a mondatszimbólumból a nyelvtan segítségével levezethet a wA mondatszer forma. Eddigi jelöléseinkkel ezt a következképpen írhatjuk le formális módon: S G wA (q0, w) aG (A, ) (2.13.) Állításunkat teljes indukcióval igazolhatjuk. Tételezzük fel, hogy a (2.13.) összefüggés az n hosszúságú jelsorozatokra igaz. Legyen egy n+1 hosszúságú jelsorozat alakja w = va, ahol |v| = n, és a a jelsorozat utolsó karaktere. Minthogy feltételezésünk szerint az n hosszúságú v jelsorozatra állításunk igaz, így ha ennek hatására az automata a B állapotba mehet át, akkor a nyelvtan képes a vB mondatszer forma generálására.
* *

34

2.1. Reguláris nyelvek és véges automaták

Ha most a következ karakter olvasásakor az automata az A állapotba kerül, vagyis létezik (B, a) = A alakú mozgási szabálya, akkor a (2.9.) megfeleltetés miatt a nyelvtan képes az B aA helyettesítésre, és így generálhatja a vaA mondatszer formát. Fordítva, ha a nyelvtan alkalmas a vB mondatszer formából a vaA mondatszer forma származtatására, akkor a (2.12.) megfeleltetés miatt az automata a va jelsorozat elolvasása után felveheti az A állapotot. Az, hogy ez a feltételezés igaz n =1 esetére, triviális. Amennyiben az automata állapota elfogadó, azaz a beolvasott jelsorozat az automata nyelvének egy mondata, akkor ennek az állapotnak megfelel nemterminális elemészthet, és így a nyelvtan ugyanazt a mondatot képes generálni. Ez az okfejtés visszafele is helytálló, így a két nyelv, a reguláris nyelvtan által generált és a véges automata által elfogadott azonos. Amennyiben az új -szabályok bevezetését nem találjuk rokonszenves megoldásnak, akkor ezt megkerülhetjük. Amikor a nyelvtanból készítünk automatát, akkor az automatában definiálnunk kell egy olyan, a nyelvtan egyik nemterminálisának sem megfeleltetett új E elfogadó állapotot. A második típusú helyettesítési szabályokhoz tartozó nyilakat ebbe az új automata állapotba irányítjuk. A=a (A, a) = E (2.14.) Vegyük észre, hogy az ily módon definiált elfogadó állapot funkcióját a korábbi konstrukcióban az elenyész nemterminálisnak megfeleltetett automata állapot látta el. Amikor az automatához szerkesztünk egy reguláris nyelvtant, megtehetjük, hogy az automata elfogadó állapotaiba vezet nyilakhoz nem egyetlen, hanem két, egy els és egy második típusú levezetési szabályt rendelünk. Így, ha a B állapot elfogadó állapot, akkor a (A, a) = B mozgási szabályhoz az alábbi két helyettesítési szabályt rendeljük: Aa (2.15.) A aB Így minden olyan esetben, amikor az automata elfogadó állapotba kerül, tehát a beolvasott jelsorozat mondat is lehet, a második típusú szabály segítségével a nyelvtan a nemterminálist megölve mondatot generálhat. Így az esetek nagy részében szerkeszthet olyan, az automata nyelvével azonos nyelvet generáló reguláris nyelvtan, amely -szabályokat nem tartalmaz. Probléma akkor adódik, amikor a kezdállapot egyben elfogadó állapot is. Míg minden más állapotba ugyanis csakis mozgás útján juthatunk el, amikor a fenti (2.15.) szerinti átírás alkalmazható, addig a kezdállapotba ,,beleszületünk" és emiatt a mozgással elérhet állapotok esetében bevált módszer nem alkalmazható.

2. Reguláris nyelvek

35

Egyébként amennyiben a kezdállapot is elfogadó állapot, akkor az üres jelsorozat, az is eleme a nyelvnek. Ez a mondat pedig csökkent, tehát -szabály nélkül nem állítható el. Így, ha mást nem is, de egy S (2.16.) alakú szabályt mindenképpen be kell vennünk a nyelvtan szabályai közé. Annyit mindenesetre rögzíthetünk, hogy amennyiben az üres jelsorozat nem eleme a nyelvnek, akkor az -szabály nélküli reguláris nyelvtannal generálható. Hogyan kell értékelnünk azt a körülményt, hogy a nem csökkent els osztályú nyelvtanok részhalmazaként említett reguláris nyelvtanok csökkent szabályt tartalmaznak. Erre vonatkozóan a késbbiekben részletes és kielégít magyarázattal fogok szolgálni. Most egyelre hunyjunk szemet e felett a látszólagos anomália felett. Ezzel egyrészt a véges automaták és az elbbi szabályok szerint konstruált reguláris nyelvtanok, másrészt a reguláris nyelvtanok és a bellük származtatott automaták megfeleltetésének helyességét igazoltuk, vagyis a két nyelvosztály, a véges automaták és a reguláris nyelvek nyelvosztályának azonosságát bebizonyítottuk. Törlesszük most egy régi adósságunkat, és mutassuk meg, hogy a jobbreguláris és balreguláris nyelvtanok ugyanazt a nyelvosztályt generálják. Itt elegend, ha a balreguláris nyelvtanok és a véges automaták ekvivalenciáját látjuk be, hiszen a jobbreguláris nyelvek és a véges automaták nyelveinek azonosságát már igazoltuk. Vegyük észre, hogy míg a jobbreguláris nyelvtanok szokásos írásmódunknak megfelelen, vagyis balról jobbra generálják a mondatokat, addig a balreguláris nyelvtanok jobbról balra generálnak. Az írási és olvasási irány persze csak konvenció kérdése, hiszen például a semita népek jobbról balra írnak és olvasnak. Azt hiszem ezek után elegend, ha csak az átírási szabályokat ismertetem, a szabatos igazolást átengedem a szorgalmas olvasónak. A két nyelvtani szabálytípus átírása a következ: A Ba (B, a) = A Aa (q0, a) = A (2.17.) (2.18.)

Az eredeti nyelvtan mondatszimbólumának az automata egyetlen elfogadó állapota felel meg, míg az újonnan bevezetett q0 állapot lesz az automata kiindulási állapota. Amennyiben a nyelvtanban volna -szabály, akkor annak baloldalán álló nemterminális, pontosabban a neki megfelel automata állapot itt értelemszeren kezdállapot lesz.

36

2.1. Reguláris nyelvek és véges automaták

Természetesen bármilyen legyen is a nyelvtan, egy automatának nem lehet egynél több kezdállapota, így ezeket egyesítenünk kell. A keveredés elkerülésére vezessünk be egy új kezdállapotot, és minden az eredeti kezdállapot jelöltekbl kiinduló nyilat duplikáljunk olymódon, hogy a nyíl kiindulása az új kezdállapot legyen. Példaképpen szerkesszünk véges automatát az alábbi balreguláris nyelvtanhoz. S Ca Db A Aa Ab C Aa D Bb B Ba Bb

A 2.2. ábra baloldalán a (2.17.) és (2.18.) összefüggések alapján szerkesztett és történetesen két kezdállapottal bíró ,,torzszülött" automata van feltüntetve, az ábra jobboldalán az állapotok már közösítve vannak.
a,b a,b a a

a

C

A S

a b

C

A
a

a,b

S
b

b

E
a,b

D

b

B
a,b

D

b

B
a,b

2.2. ábra Az átalakítás megfordításánál, amikor egy véges automatából kell balreguláris nyelvtant készítenünk, akkor nehézséget okozhat, ha az automatának több elfogadó állapota van. Ilyenkor az automatát egyenérték ­ ugyanazt a nyelvet elfogadó ­ és csak egyetlen elfogadó állapottal bíró automatává kell átalakítani. Ezt úgy érhetjük el, hogy egy új, és egyetlen elfogadó állapotot vezetünk be. Ezzel egyidejen az eredeti elfogadó állapotok elfogadó jellegét megszüntetjük. Ezek után valamennyi, eredetileg elfogadó állapotba vezet nyilat duplikálunk olymódon, hogy a nyilak kiindulási állapotát nem változtatjuk meg, a célállapot azonban az új elfogadó állapot lesz. Amennyiben az olvasott karakter a jelsorozat utolsó eleme volt, akkor a duplikált nyíl segítségével az új elfogadó állapotba kell lépnünk, viszont ha ez nem az utolsó karakter, akkor az eredeti élen haladunk tovább. Persze ez az átalakítás még akkor sem eredményez determinisztikus automatát, ha az eredeti automata determinisztikus volt. Arról, hogy egy automata több mozgási alternatíva esetében hogyan viselkedik, más szóval, hogyan kell kezelni a nemdeterminisztikus automatákat, a következ fejezetben részletesen szólunk.

2. Reguláris nyelvek

37

Most példaképpen készítsünk egy véges automatához balreguláris nyelvtant, még akkor is, ha néhány kérdés még tisztázásra vár. a,b

a,b

a b

A

a

C

S B
b

D
a,b

2.3. ábra A 2.3. ábra automatájának két elfogadó állapota van. Az automata nyelve azokat az a és b karakterekbl jelsorozatokat tartalmazza, amelyben akár két a karakter, akár két b karakter egymás után áll. Az ismertetett átírási szabályokat alkalmazva a jobbreguláris grammatika a következ lesz: S aS S bS S aA S bB A aC Aa B bD Bb C bC Ca Cb C aC D aD D bD Da Db A balreguláris grammatika származtatására alakítsuk át az automatát olymódon, hogy csak egyetlen elfogadó állapotot tartalmazzon. Ezt a módosítást tünteti fel a 2.4. ábra. Sportszeren csakis az általunk ismertetett, és minden esetben alkalmazható szabályok szerint jártunk el, jóllehet itt sokkal egyszerbb megoldás is kínálkozna. a,b

a,b

A
a b

a a b

C

a,b

S

E D
a,b a,b

B

b
2.4. ábra

38

2.1. Reguláris nyelvek és véges automaták

Az átírási szabályok megfordításával könnyen megszerkeszthetjük balreguláris nyelvtan helyettesítési szabályait. E Aa E Bb E Ca E Cb E Da E Db C Ca C Cb C Aa D Bb D Da D Db A Sa Aa B Sb Bb S Sa Sa S Sb Sb Ezzel demonstráltuk, hogy a jobb- és balreguláris nyelvtanok ugyanazt a nyelvosztályt generálják. Felhívjuk az olvasó figyelmét, hogy egy reguláris nyelvtanban csak egyféle, vagy A aB vagy A Ba alakú szabályok lehetnek. A kétféle szabály egyidej alkalmazása kivezet a reguláris nyelvek osztályából. Álljon itt erre egy példa. Az alábbi nyelvtan S aX X Sb Xb könnyen igazolhatóan az ai bi nyelvet generálja. Ez a nyelv viszont ­ mint azt késbb bizonyítjuk ­ nem reguláris nyelv.

2.2. Determinisztikus és nemdeterminisztikus véges automaták
Ha az automata minden állapot­karakter párjához legfeljebb egy mozgási szabály tartozik, akkor az automata determinisztikus. Ilyenkor a mozgási szabályok értelmezése nyilvánvaló és egyértelm. Hogyan kell azonban értelmezni az automata mködését, ha bizonyos állapot­karakter párokhoz egynél több mozgási szabály tartozik, az automata nemdeterminisztikus? Az általános definíciót, bár egy ízben már megadtuk, fontossága miatt megismételjük. Egy automata akkor fogad el egy jelsorozatot, ha létezik olyan mozgássorozat, amelynek során az automata a teljes jelsorozatot elolvassa, és utána elfogadó állapotban áll meg. A nemdeterminisztikus automaták esetében kellemetlen, hogy valamennyi mozgási lehetséget egyidejen kell figyelemmel kísérnünk, hiszen nem tudhatjuk, melyik mozgássorozat lesz sikeres, melyik vezet végül eredményre. Ugyanakkor ez a definíció nemdeterminisztikus automatáknál is egyértelmvé teszi a tartalmazás kérdését. Az olyan automatákkal, a sztochasztikus automatákkal, ahol a több lehetség közül az automata valamilyen törvényszerség szerint mindig csak egyet vesz igénybe, tehát ahol elfordulhat, hogy egy automata egy jelsorozatot egyszer elfogad máskor meg nem, ez a könyv nem foglalkozik.

2. Reguláris nyelvek

39

Az automaták ,,nem determinizmusát" egy számmal jellemezhetjük. Megadjuk a változatok számát annál az állapot­karakter párnál, amely az ilyen variánsokban leggazdagabb. Ez a szám determinisztikus automaták esetében pontosan egy, nemdeterminisztikusokénál egynél nagyobb. A determinisztikus automata így felfogható, mint a nemdeterminisztikusok speciális esete, olyan nemdeterminisztikus automata, amelynek nem determinizmusa egy. Ebbl viszont az is következik, hogy a determinisztikus automaták nyelvei a nemdeterminisztikus automaták, vagyis az összes véges automata nyelveinek részhalmazát alkotják. Kérdés persze, hogy ez a részhalmaz valódi részhalmaz-e, létezik-e olyan a 3-as nyelvosztályba tartozó nyelv, amelyet nem lehet determinisztikus automatával elfogadni. A válasz nemleges, vagyis a determinisztikus automaták által elfogadott nyelvek halmaza megegyezik az összes lehetséges véges automaták által elfogadott nyelvek halmazával. Ezt úgy igazoljuk, hogy megadunk egy mindig alkalmazható algoritmust, amely megmondja, hogyan lehet egy nemdeterminisztikus automatához egy vele ekvivalens, vagyis ugyanazt a nyelvet elfogadó determinisztikus automatát szerkeszteni. Mint említettem a véges automaták gráfos megjelenítése alkalmas az automaták mködésének követésére. Abban maradtunk, hogy egy érmét, például egy tízforintost teszünk a kiindulási állapotra, és a mozgások alkalmával ezt az érmét mindig az új érvényes állapotra csúsztatjuk át. Determinisztikus automaták esetén, amikor minden helyzetben legfeljebb egyetlen mozgási lehetség van, ez a pénzérme az egyetlen lehetséges állapotot mutatja. Amennyiben automatánk nemdeterminisztikus, bizonyos helyzetekben több mozgási lehetség is adódhat. Annak érdekében, hogy egyidejen valamennyi mozgási lehetséget nyomon követhessük, helyezzünk most érmét minden olyan állapotra, amely a mozgási szabályok útján elérhet. Ennek semmilyen elvi akadálya sincsen, megvalósítása pusztán pénzkérdés, amennyiben most egynél több tízforintos érmére lesz szükségünk. Természetesen ezt a gondolatot rekurzív módon minden lépésben véghez kell vinnünk. Egy adott helyzetben az összes megjelölt, tehát az addig elérhet állapotot megvizsgáljuk, és meghatározzuk, hogy a most beolvasott karakter hatására ezekbl az állapottokból milyen állapotok érhetek el. Így figyelemmel tudjuk kísérni az összes lehetséges változat viselkedését, ami célkitzésünk volt. Lényeges különbség azonban, hogy míg a determinisztikus automaták esetében egyetlen állapotot adtunk meg mint elérhet állapotot, addig itt egy állapothalmaz lesz az eredmény.

40

2.2. Determinisztikus és nemdeterminisztikus véges automaták

Ha most egy olyan új automatát definiálunk, amelynek állapottere az eredeti automata állapotterének hatványhalmaza, akkor nyomon tudjuk követni a nemdeterminisztikus automata lehetséges állapotait, mégpedig determinisztikus módon. Legyen adott egy nemdeterminisztikus automatánk, és definiáljunk hozzá egy új, vele ekvivalens determinisztikus automatát. A régi és az új automata karakterkészlete nyilván azonos. Az új automata állapotai a régi automata állapotterének részhalmazai. Az új automata azon állapotai lesznek az elfogadó állapotok, amelyek az eredeti automata állapotok olyan részhalmazának felelnek meg, amelyben legalább egy állapot az eredeti automata elfogadó állapota. Jelölje M(Q, , , q0, F) az eredeti feltételezésünk szerint nemdeterminisztikus automatát, míg M'( P, , ', p0, F') a belle szerkesztett determinisztikus automatát. Mint tisztáztuk a két automata alfabetája szükségképpen azonos, így megnevezésük is egyforma. A determinisztikus automata állapotterét az eredeti automata állapotterének részhalmazai alkotják. Ezek szerint P 2Q (2.19a) vagyis az új állapottér az eredeti állapottér hatványhalmazának részhalmaza. Részhalmaz, hiszen nem minden állapotkombináció fordul el, így például az üres halmaz, amely definíció szerint eleme a hatványhalmaznak, nem eleme az új állapottérnek. p0 = {q0 } (2.19b) hiszen induláskor, anélkül, hogy karaktert olvasnánk be, csakis az eredeti kezdállapot érhet el. Felhívom a gondos olvasó figyelmét, hogy az új kezdállapot nem azonos a régi kezdállapottal, hanem a régi állapottérnek egy olyan részhalmaza, amely egyedül az eredeti kezdállapotot tartalmazza. F' = { pi pi F } (2.19c) mint tisztáztuk, az eredeti állapottér azon részhalmazai lesznek az új állapottér elfogadó állapotai, amelyek tartalmaznak eredeti elfogadó állapotot. Végül az új automata mozgási szabályait az alábbiak alapján lehet származtatni: ' (R, a) = { U (q, a) = T R, T 2Q } (2.19d)
qR

Ezen formális leírás azt mondja, hogy az új állapottér R állapotában az a karakter beolvasásának hatására az új állapottér T állapotába kerülünk. Mind az R, mind a T az eredeti állapottér részhalmaza. A T által definiált részhalmazt úgy állapíthatjuk meg, hogy vesszük az R részhalmazába tartozó eredeti állapotokat, megnézzük, hogy ezekbl az állapotokból az eredeti mozgási szabályok szerint milyen állapotokba tudunk eljutni, és képezzük ezeknek az unióját.

2. Reguláris nyelvek

41

Világos, hogy az eredeti és az új most már bizonyosan determinisztikus automata nyelve azonos, és bármilyen is legyen az eredeti automata, az új automatát a leírt módszerrel mindig származtatni tudjuk. Ezzel igazoltuk, hogy a determinisztikus automaták valamennyi, a nemdeterminisztikus automaták által elfogadott nyelvet képesek elfogadni. Sajnos a hatványhalmaz képzése nagyon megnöveli a halmaz számosságát. Szerencsére általában a helyzet nem ennyire kritikus, ugyanis a hatványhalmaz nem minden elemének van szerepe az új automatában. A gyakorlatban úgy járhatunk el, hogy az eredeti nemdeterminisztikus automatát elemezve meghatározzuk az állapottér azon részhalmazait, amelyek elfordulhatnak mint egyidejen elérhet állapotok. Ezeket és csakis ezeket a részhalmazokat vesszük aztán bele az új automata állapotterébe. Az egész folyamat kezdete az új automata kezdállapota lesz, amely egyedül az eredeti automata kezdállapotát tartalmazó részhalmaz. Ebbl kiindulva állapíthatjuk meg, milyen részhalmazok figyelembe vételére van szükség. Az algoritmust legjobban egy példán szemléltethetjük. Alakítsuk át a 2.3. ábrán feltüntetett, és szemmel láthatóan nemdeterminisztikus automatát, szabatosabban szerkesszünk egy az automatával ekvivalens, de determinisztikus automatát. Az áttekinthetség biztosítására tüntessük fel újra a szóban forgó ábrát.

a,b a,b

a b

A

a

C

S B
b

D
a,b

2.5. ábra Az egyszerség kedvéért jelöljük az új automata állapotait egyetlen indexelt betvel. Az új automata kezdállapota ­ mint azt megbeszéltük ­ egyedül a régi automata kezdállapotát tartalmazó részhalmaz lesz: q0 = { S } Ebbl az állapotból az a karakter beolvasásának hatására mind az S mind az A állapot elérhet. Ily módon az új automata következ állapota az elbbi két állapotot tartalmazó részhalmaz lesz: q1 = { S, A }

42

2.2. Determinisztikus és nemdeterminisztikus véges automaták Hasonlóan a b karakter beolvasása esetén q2 = { S, B }

adódik. Ha most a q1 állapotból elérhet állapotokat keressük, akkor azokat az állapotokat kell egy részhalmazba összefognunk, amelyek az új állapotból, vagyis a q1 halmaz bármelyik állapotából elérhetek. Így tehát az új q1 állapot és az a karakter esetében a következ állapotot alkotó halmaz elemei azok az eredeti automata állapotok lesznek, amelyek az a karakter beolvasásával vagy az S állapotból vagy az A állapotból elérhetek. Minthogy az S állapotból az S és az A állapot, az A állapotból pedig a C állapot érthet el, a következ új állapot: q3 = { S, A, C } Ennek mintájára kaphatjuk meg az új automata többi állapotát is. q4 = { S, B, D } q5 = { S, B, C } q6 = { S, A, D } q8 = { S, A, C, D } q7 = {S, B, C, D } Az ekvivalens determinisztikus automatát mutatja a 2.6. ábra. Az új automata elfogadó állapotai azok az új állapotok lesznek, ahol a részhalmaznak van olyan eleme, amely az eredeti automatában elfogadó állapot volt. Két megjegyzés. Amennyiben nem a 2.6. ábrán bemutatott automatából indultunk volna ki, hanem annak módosított, csupán egyetlen elfogadó állapotot tartalmazó változatából, akkor is ugyanerre a determinisztikus automatára jutottunk volna. Ez, ha nem is véletlen, de nem is szükségszer. A determinisztikus automatának 9 állapota van, ami lényegesen kevesebb, mint az 5 elem eredeti állapottér hatványhalmazának 25 = 32 lehetséges változata. Bár példánkban az újonnan szerkesztett automata terebélyesebb az eredetinél, ez nem szükségszer. Elfordulhat, hogy a determinisztikus automata kevesebb állapotot tartalmaz, mint a nemdeterminisztikus eldje.

a

b b

a

Q1
b a

a

Q3

a a

Q5

b a

Q7
b

Q0
b

Q2

b

Q4
b b

Q6

a

Q8
a

2.6. ábra

2. Reguláris nyelvek

43

Minthogy tetszleges nemdeterminisztikus automatához a fenti módon megszerkeszthetjük annak determinisztikus párját, igazoltuk azt az állításunkat, hogy a determinisztikus automaták nyelvei teljesen lefedik a 3-as nyelvosztályt. A determinisztikus automaták mintájára beszélhetünk determinisztikus nyelvtanokról és determinisztikus nyelvekrl is. Egy reguláris nyelvtan akkor determinisztikus, ha a neki megfelel véges automata determinisztikus. Egy nyelv akkor determinisztikus, ha determinisztikus nyelvtannal generálható. Fenti eredményünket ezek után másképpen is megfogalmazhatjuk. A determinisztikus nyelvtanok alkalmasak a teljes 3-as nyelvosztály generálására. Ennek következtében minden reguláris nyelv determinisztikus nyelv.

2.3. Minimálautomata
Ugyanúgy, ahogyan több nyelvtan generálhatja ugyanazt a nyelvet, egy nyelvnek több automatája is lehet. Korlátozzuk vizsgálatunkat determinisztikus és teljesen specifikált automatákra. Az már ismeretes, hogyan lehet egy nemdeterminisztikus automatából vele ekvivalens determinisztikusat készíteni. Vizsgáljuk most azt, hogyan lehet egy nem teljesen specifikált automatát teljesen specifikálttá tenni. Ha egy automata nem teljesen specifikált, az annyit jelent, hogy van olyan állapot­karakter pár, amelyre nincsen mozgási szabály. Vezessünk be egy új, csapdának nevezett állapotot. Ezt általában a csapda angol megfeleljének a trap szónak kezdbetje, T jelöli. Ha valamelyik állapot­karakter párhoz nincsen mozgási szabály rendelve, akkor egészítsük ki szabályainkat egy olyan mozgással, amely erre az állapot­karakter párra az automatát a csapdaállapotba viszi át. Ezt természetesen valamennyi ilyen állapot­karakter párra megtesszük. A csapdaállapotból bármilyen karakter beolvasására a csapdaállapotba megyünk át, vagyis tulajdonképpen helyben maradunk. Ezek szerint, ha egyszer beleestünk a csapdába, akkor már nem tudunk belle kimászni. Teljesen világos, hogy az ily módon teljesen specifikálttá tett automata ugyanazt a nyelvet fogadja el, mint az eredeti. A kiindulási automata ugyanis bizonyos jelsorozatokat azért nem tudott elfogadni, mert mozgási szabály híján nem tudta azt végigolvasni. Most, mint minden teljesen specifikált automata, az új automata minden jelsorozatot végigolvas. Azonban abban a helyzetben, amikor az eredeti automata megállt, az új automata a csapdaállapotot veszi fel, ahonnan nem tud szabadulni, és minthogy ez az állapot visszautasító állapot, a mondatot nem fogadja el. Ezek szerint bármilyen legyen is az eredeti automata, könnyen készíthetünk belle determinisztikus teljesen specifikált automatát.

44

2.3. Minimálautomata

Keressük meg egy nyelv determinisztikus és teljesen specifikált automatái közül a legegyszerbbet. Az egyszerség mértékéül az állapotok száma szolgál. Ha egy automatának kevesebb állapota van, egyszerbb. Ilyen legegyszerbb automata természetesen létezik. A nyelvet elfogadó automaták mind véges állapotúak, így ezek között szükségképpen van minimális állapotszámú. A probléma itt abban áll, hogy hogyan lehet ilyen minimális állapotszámú automatát megszerkeszteni, és unikális-e egy ilyen minimális állapotszámú automata. A második kérdésre adott válasz: minden nyelvhez lényegében egyetlen ilyen automata tartozik. Ennek neve minimálautomata. A fentiek igazolására az automata valamennyi állapotához rendeljünk egy nyelvet. Ezt a nyelvet az az automata fogadja el, amely megegyezik az eredeti automatával, pusztán a kezdállapotot helyeztük át a szóban forgó állapotra. Az eredeti kezdállapothoz természetesen így az automata eredeti nyelve tartozik. Értelmezzünk ezek után egy relációt az automata állapotai között. A és B állapotra akkor igaz az reláció, ha a két állapothoz rendelt két nyelv azonos. Ez a reláció ekvivalenciareláció. Ugyanis az A állapothoz ugyanaz a nyelv tartozik, mint az A állapothoz, vagyis AA, tehát a reláció reflexív. Ha az A és B állapotok nyelvei azonosak, más szóval AB, akkor természetesen a B és A állapotok nyelvei is azonosak, vagyis AB BA, (2.23.) tehát a reláció szimmetrikus. Végül, ha az A és B állapotokhoz valamint a B és C állapotokhoz tartozó nyelvek azonosak, akkor az A és C állapotokhoz ugyanaz a nyelv tartozik. Formálisan: AB BC AC (2.24.) tehát a reláció tranzitív. Ezek szerint ez a reláció az automata állapotterét diszjunkt ekvivalenciaosztályokra osztja. Azonos ekvivalenciaosztályba azok az állapotok tartoznak, amelyeknek nyelve azonos. Különböz ekvivalenciaosztályhoz tartozó állapotok nyelve különböz. Fogalmazzunk kicsit árnyaltabban. Amennyiben az A és B állapot ugyanabban az ekvivalenciaosztályban van, akkor nincsen olyan jelsorozat, amely különbséget tudna tenni a két állapot között. Ugyanis ha egy jelsorozat benne van a két állapot közös nyelvében, akkor a két állapotból indulva és ezt a jelsorozatot beolvasva mindkét esetben elfogadást kapunk eredményül. Ha viszont a jelsorozat nincsen benne a közös nyelvben, akkor mindkétszer elutasítunk. Amennyiben két állapot, C és D különböz ekvivalenciaosztályban, vagyis a hozzájuk rendelt két nyelv különböz, akkor mindig található olyan jelsorozat ­ hiszen egyébként a két nyelv azonos lenne ­ amely az egyik nyelvében benne van, a másikéban viszont nincsen. Ezt a jelsorozatot a két automata állapotból indítva az egyik esetben elfogadjuk, a másikban visszautasítjuk. Tehát, ha a két állapot nincsen egy ekvivalenciaosztályban, akkor mindig létezik olyan jelsorozat, amely a két állapot között disztingvál.

2. Reguláris nyelvek

45

Miután kiderült, hogy az azonos ekvivalenciaosztályba tartozó állapotokat semmiképpen sem lehet megkülönböztetni, logikus az a megoldás, amely csak egyetlen állapotot alkalmaz a teljes ekvivalenciaosztály helyett. Egyesítsük tehát az ekvivalenciaosztályok állapotait gondosan ügyelve arra, hogy gráf éleit megtartsuk. Ezzel, ha volt olyan ekvivalenciaosztály, amely több állapotot tartalmazott, az automata állapotainak számát csökkentettük. Ez az automata lesz a minimálautomata. Ennek az automatának tehát nincs két azonos ekvivalenciaosztályhoz tartozó állapota. Az a megállapítás, hogy a minimálautomata ugyanazt a nyelvet fogadja el, mint az eredeti, triviális. Hiszen, ha az eredeti automatában ugyanahhoz az ekvivalenciaosztályhoz tartozó két állapotba érkezünk, a továbbiakban ugyanazt az eredményt kapjuk, bármit is olvassunk be ezután. Miután a minimálautomatát definiáltuk, felmerül a kérdés, hogyan lehet ezt az automatát egy adott automata alapján megszerkeszteni. A megoldás kulcsa az azonos ekvivalenciaosztályba tartozó állapotok megtalálása. Mint tudjuk, az ilyen állapotokat semmilyen jelsorozattal sem lehet megkülönböztetni. Ha tehát sorra vesszük az összes lehetséges jelsorozatot, és nem tapasztalunk különbséget, akkor a két állapot ekvivalenciáját sikerült megállapítanunk. Sajnos ez a módszer hosszadalmas eljárásnak ígérkezik, hiszen a lehetséges jelsorozatok száma, ami nem más, mint a * halmaz számossága, megszámlálhatóan végtelen. Annak érdekében, hogy ezt a feladatot véges számú lépésben oldjuk meg, vezessünk be az állapotok között egy új relációt, pontosabban egy reláció családot. Két állapot legyen i ekvivalens, ha legfeljebb i hosszúságú jelsorozattal nem különböztethet meg. Az ekvivalencia eredeti meghatározása szerint két állapotot akkor mondunk ekvivalensnek, ha azokat bármely tetszleges hosszúságú jelsorozattal sem tudjuk megkülönböztetni. Így az eredeti ekvivalencia az i ekvivalenciákból az i átmenettel áll el. Ha ismerjük egy állapottér i ekvivalens ekvivalenciaosztályait, akkor ennek alapján az i+1 ekvivalenciaosztályokat könnyen megállapíthatjuk. Nyilván ami nem volt i ekvivalens, nem lesz i+1 ekvivalens sem. Azt kell csupán megvizsgálnunk, hogy az olyan i ekvivalens osztályokban, ahol egynél több állapot szerepelt, a különböz állapotokból egy újabb karakter beolvasására különböz i-ekvivalenciaosztályokba jutunk-e vagy sem. Ha útjaik eltérnek, akkor ezt a két i ekvivalens állapotot különböz (i+1)-ekvivalenciaosztályba kell sorolnunk. Ez azt jelenti, hogy ebbl az ekvivalenciaosztályból több ekvivalenciaosztályt kell formálnunk. Amennyiben egy újabb karakter figyelembe vételével nem növekszik meg az ekvivalenciaosztályok száma, akkor nyilván ez további karakterek esetében sem fog bekövetkezni, ami annyit jelent, hogy ez az i ekvivalencia azonos a jelz nélküli, vagyis az eredetileg definiált ekvivalenciával, így a mostani felosztás megegyezik az eredeti definíció szerinti ekvivalenciaosztályokkal.

46

2.3. Minimálautomata

Induláskor vegyük a 0 ekvivalenciát, vagyis tekintsük azt az esetet, amikor egyetlen jelsorozatot sem engedélyezünk, tehát csak ránézés alapján vagyunk képesek két állapot megkülönböztetésére. Ilyenkor csak az elfogadó és visszautasító állapotok között tudunk disztingválni, tehát két ekvivalenciaosztályunk lesz, az egyikbe a visszautasító, a másikba az elfogadó állapotokat soroljuk. Ezután növeljük az engedélyezett jelsorozatok hosszát mindaddig, amíg tovább már nem növekszik az ekvivalenciaosztályok száma. Ez a jelenség elbb utóbb szükségszeren bekövetkezik, hiszen az állapotok száma véges, és az egyetlen állapotot tartalmazó ekvivalenciaosztályt tovább bontani már nem lehet. Így véges számú lépésben tudjuk meghatározni az eredetileg definiált ekvivalenciaosztályokat. Mutassuk be ezt a módszert egy példán, a 2.6. ábra automatáján. Kiindulásul írjuk fel a két 0-ekvivalenciaosztályt. Az egyikbe a visszautasító, a másikba az elfogadó állapotok kerülnek: { q0, q1, q2} {q3, q4, q5, q6, q7, q8} A új karakter beolvasásánál végzett vizsgálatnál az éppen érvényes ekvivalenciaosztályok alapul vételével egy osztály állapotait egyenértékeknek tekintjük. Két állapot nem egyenérték volta abból tnik ki, hogy van olyan karakter, amely a két állapotból két különböz osztályba visz. Példánk automatájában egy karaktert alkalmazva kiderül, hogy a q0, q1 és q2 állapotok nem egy ekvivalenciaosztályba tartoznak. Ugyanis például az a karakter a q0 állapotból a visszautasító, míg a q1 állapotból az elfogadó állapotok osztályába viszi át az automatát. Ezek szerint az 1-ekvivalenciaosztályokban a fenti három állapot különkülön képez egy-egy ekvivalenciaosztályt. Az elfogadó állapotok osztályában ilyen finomítás nem következik be, mivel az osztály bármelyik állapotából bármely karakter osztályon belüli állapotba visz. Ezek után az 1-ekvivalenciaosztályok a következk: {q0} {q1} {q2} {q3, q4, q5, q6, q7, q8} A következ karakter beolvasása ­ mint arról az olvasó könnyen meggyzdhet ­ nem hoz változást az osztályok felosztásában. Így a vizsgálatot befejezhetjük, megállapítva, hogy az elfogadó állapotok ekvivalensek, tehát egyetlen, a következ ábrán q3 állapottal jelölt állapotba közösíthetek. Ez lesz tehát a minimálautomata, és ezt mutatja a 2.7. ábra.

2. Reguláris nyelvek

47

Q0
b a

a b

Q1
a

Q2

b

Q3
a,b

2.7. ábra Minthogy determinisztikus és teljesen specifikált automatából indultunk ki, a minimálautomata is determinisztikus és teljesen specifikált lesz. Néhány megjegyzés. A minimálautomata mindig determinisztikus és teljesen specifikált, tehát ha egy nemdeterminisztikus automatának keressük a minimálautomatáját, akkor elbb szerkesszünk az eredetivel egyenérték determinisztikus és teljesen specifikált automatát, és azt redukáljuk. Eddig is volt már dolgunk nem teljesen specifikált automatákkal. Ilyen volt például a 2.1. ábrán feltüntetett automata is. A 2.8. ábra ennek az automatának teljesen specifikált változatát mutatja be. Azt kell biztosítanunk, hogy minden állapotból, minden karakterre legyen kimen él. Ahol ilyet a természet, vagyis az eredeti automata nem adott, ott nekünk kell behúzni egy, a csapdába vezet élt.

a

b b c

c c

S

a

A

B
a

C

b,c

a,b

T
a,b,c
2.8. ábra Így tetszleges automatához megszerkeszthetjük a hozzátartozó minimálautomatát. Azt azonban még igazolnunk kell, hogy az ily módon megszerkesztett automata lényegében ­ izomorfiától eltekintve ­ unikális, azaz ez az egyetlen ilyen kis állapotszámmal bíró, az adott nyelvet elfogadó és teljesen specifikált automata.

48

2.3. Minimálautomata

Tételezzük ugyanis fel, hogy létezik egy másik automata, amely ugyanazt a nyelvet fogadja el, és állapotainak száma nem nagyobb a minimálautomatáénál. Nevezzük ezt a hipotetikus automatát ellenautomatának. Legyen P az ellenautomata egy tetszleges állapota. Tekintsük most azokat a jelsorozatokat, amelyek az ellenautomata kezdállapotából kiindulva az ellenautomatát a P állapotba viszik át. Ezen jelsorozatok hatására a minimálautomata is saját kezdállapotából kiindulva egyetlen állapotba ­ nevezzük ezt A állapotnak ­ kerül. Amennyiben ez nem így lenne, ellentmondásra jutnánk abban a tekintetben, hogy a két automata ugyanazt a nyelvet fogadja el. Ha ugyanis az ellenautomatát a P állapotba viv jelsorozatok elemzésekor kiderülne, hogy ezek a jelsorozatok a minimálautomatát egynél több állapotba juttatják, akkor létezne két olyan jelsorozat, mondjuk x és y, amely az ellenautomatát mindkét esetben a P állapotba, a minimálautomatát azonban két különböz, mondjuk, A és B állapotba viszi át. A minimálautomata állapotai azonban megkülönböztethetek, hiszen különböz ekvivalenciaosztályhoz tartoznak. Így szükségképpen található olyan z jelsorozat, amelyre a minimálautomata az A, illetve a B állapotból indítva eltéren viselkedik, egyszer elfogad, másszor visszautasít. Ebbl viszont következik, hogy a két automata nem fogadhatja el ugyanazt a nyelvet. Az xz és az yz jelsorozatokra ugyanis az ellenautomata azonosan, a minimálautomata pedig eltéren reagál. Ezek szerint az ellenautomata egy állapotához a minimálautomatának csakis egy állapota tartozhat. Ez a megállapítás természetesen az ellenautomata minden állapotára helytálló.

minimálautomata
x y

ellenautom ata
y

x

A
z

B
z

P
z

?
2.9. ábra Ha az ellenautomata több különböz állapotához ugyanaz a minimálautomata állapot tartozna, akkor az ellenautomata állapotainak a száma, ellentétben

2. Reguláris nyelvek

49

feltételezésünkkel, felülmúlná a minimálautomata állapotainak számát. Ezt csak úgy kerülhetjük el, ha az ellenautomata különböz állapotainak a minimálautomata más-más állapota felel meg. Ezek szerint az ellenautomata és a minimálautomata állapotai között kölcsönösen egyértelm leképezés definiálható, más szóval a két automata izomorf, vagyis az állapotok elnevezésétl eltekintve azonos. Ezzel a minimálautomata unicitására vonatkozó állításunkat igazoltuk. Felhívom az olvasó figyelmét arra, hogy a minimálautomata nem a nyelvtanhoz, nem az azt megvalósító véges automatához, hanem a nyelvhez tartozik. Mindig hangsúlyoztam, hogy míg minden nyelvtanhoz és így automatához is egyetlen nyelv tartozik, addig egy nyelvnek számtalan nyelvtana illetve automatája lehet. A minimálautomatával más a helyzet. Minden reguláris nyelvhez ­ izomorfiától eltekintve ­ egy és csakis egy minimálautomata tartozhat. Legyen adva két reguláris nyelvtanunk. Szeretnénk eldönteni, hogy a két nyelvtan ekvivalens-e, ugyanazt a nyelvet generálja-e vagy sem. Ennek a problémának egyik lehetséges megoldása, hogy megszerkesztjük a két automatát, azokból a két miniálautomatát, és ha a minimálautomaták izomorfak, a két nyelv azonos. A késbbiekbl kiderül, hogy két nyelvtan ekvivalenciáját általánosságban csak akkor lehet eldönteni, ha a két nyelvtan reguláris.

2.4. A két irányban mozgó véges automata
Nem hangsúlyoztuk ki külön, de természetesnek vettük, hogy a véges automata olvasáskor olyan ,,fizikai" mozgást végez, amelynek eredményeképpen folyamatosan és balról jobbra olvasunk. A mozgás során így az olvasófej alá egy új, sohasem látott karakter kerül. Ez nem szükségszer. Bonyolultabbá tehetjük az automata mködését, ha megengedjük, hogy az egyes mozgásoknál a lyukszalag továbbítása tekintetében három lehetség legyen. A jobbra lépés helyett balra is léphetünk, vagy esetleg helyben is maradhatunk. Definiáljunk egy háromelem halmazt: { j, h, b} (2.23.) ahol j jobbra, h helyben és b balra jelentés, és az automata mozgása során lehetséges lépéslehetségeket jelöli. A mozgási szabályok így az állapothalmaz és a karakterhalmaz direkt szorzatát az állapothalmaz és a mozgási lehetségeket kifejez fenti halmaz direkt szorzatára képezik le: Q x Q x { j, h, b } (2.24.)

50

2.4. A két irányba mozgó véges automata

Természetes, hogy az eddig tárgyalt egyszer, egy irányban mozgó véges automaták a két irányban mozgók speciális esetei. Ha a mozgási irány tekintetében mindig a j lehetséget választjuk, vagyis mindig az olvasottól jobbra álló lesz a következ karakter, akkor kapjuk az egyszer véges automatákat. Minthogy az egyszer véges automaták a két irányban mozgók részhalmazát alkotják, az egyszer automaták nyelve, vagyis a 3-as nyelvosztály nyelvei a két irányban mozgó automaták nyelveinek részhalmaza. Ismét felmerül a kérdés valódi-e ez a részhalmaz? A válasz ismét nemleges. A bizonyítás, ha kissé bonyolultabb is, emlékeztet a determinisztikus és nemdeterminisztikus automaták ekvivalenciájának igazolására. Itt is kidolgozunk egy algoritmust, amelynek segítségével minden kétirányú automatához egy vele egyenérték egyszer véges automatát szerkeszthetünk. Mieltt a részletekre térnénk, ez a hely tnik legalkalmasabbnak arra, hogy néhány szót szóljunk az automata fogalmáról. Matematikai értelemben automata alatt mindig egy problémamegoldóképességre gondolunk, amelyet legjobban azzal a feladatosztállyal lehet jellemezni, amelynek megoldására az automata hivatott. A véges automaták esetében ez a feladatosztály a reguláris nyelvek tartalmazási feladata. Egy automataosztály ilyenformán történ definiálása azonban túl elvont, és gyakorlatilag használhatatlan lenne. Ezért általános az a módszer, amely az automatákat matematikai leírásukkal és fizikai modelljükkel adja meg. Kiderült azonban, hogy több hasonló felépítés, de azért mégis különböz automata ereje, feladatmegoldó képessége azonos. A követett eljárás szerint ezen automaták közül egyet -- lényegében önkényesen -- kiválasztunk, és azt mondjuk, ez az automata. A továbbiakban aztán bizonyítjuk, hogy a többi automataváltozat egyenérték a normatívának elfogadott, mintegy kodifikált automatával. A véges automaták világában a matematikai nyelvészet választása szerint ez az automata a nemdeterminisztikus és nem teljesen specifikált automata volt. A mozgási szabályok által definiált leképezésre ugyanis nem tettünk semmilyen megkötést, nem követeltük meg sem az egyértelmséget, sem a teljességet. Megjegyzem a normatíva kiválasztása nem egységes, hiszen például az automataelméletben a determinisztikus és teljesen specifikált automatát tekintik a véges automata mintapéldányának. Most egy új, els látásra feltétlenül nagyobb erejnek látszó automata változatról bizonyítjuk be, hogy nem tud többet, mint a normatívának választott változat. Mindenekeltt az általánosság megsértése nélkül bátran korlátozhatjuk magunkat olyan automatákra, amelyek vagy a jobboldali, vagy a baloldali

2. Reguláris nyelvek

51

karaktert veszik el, helyben azonban nem maradnak. Ezzel a mozgási lehetségek halmaza a {j, b} halmazra szkül. Ezt valóban megengedhetjük, hiszen ha az automata helyben marad, akkor a következ mozgást könnyen megállapíthatjuk. Az új állapot ugyanis ismeretes, a beolvasott karakter, mivel a szalag helyben maradt, a régi. A mozgásokat így addig követhetjük egyszer módon nyomon, amíg a szalag jobbra vagy balra ki nem mozdul. Megtehetjük, hogy a helyben járáshoz tartozó közbens állapotokat kihagyva rögtön a tényleges helyváltoztatással járó mozgás eredményét adjuk meg. Amennyiben elmozdulás nélkül lépve olyan szituáció adódik, amelyre nincs mozgási szabály, vagy a helyben járás végtelen ciklusban folytatódik, akkor már eleve a kiinduló állapot­karakter párhoz sem rendelünk mozgási szabályt, hiszen a fiaskó elre látható. Így minden három mozgási lehetséget figyelembe vev automatához könnyen szerkeszthetünk olyan, csak két irányban mozgó automatát, amely vele egyenérték, vagyis elegend a csupán jobbra-balra mozgó automatákat vizsgálnunk. Helyes, ha tisztázzuk az elfogadás feltételeit. Az automatánknak a szöveget végig kell olvasnia, mégpedig olymódon, hogy azon túlhalad. Az automatának tehát az utolsó olvasott karakter után, attól jobbra kell megállnia. Az elfogadás másik feltétele itt is az elfogadó állapot. Ha megrajzoljuk a szalag mozgását a lépések függvényében, akkor az egyszer automata esetében ez egy egyenes lesz, kétirányú automatánál viszont egy cikkcakkban haladó törtvonal. Itt ugyanis elrelépéseket visszalépések követhetnek, és ez a játék ismétldhet.
Kétirányú automata
p o z í c i ó p o z í c i ó

Egyirányú automata

lépésszám

lépésszám

2

.10. ábra

52

2.4. A két irányba mozgó véges automata

Az általunk szerkesztend egyenérték egyszer automata csak akkor halad együtt a kétirányú automatával, amikor az új, még soha nem olvasott karaktereket tartalmazó szakaszon halad. A visszafelé megtett kerülket, tévutakat az egyszer automata nem követi. A 2.10. ábrán a mozgási görbén azokat a szakaszokat, amelyeket a két automata együtt tesz meg, vastagítva rajzoltuk. Mit csinál az egyszer automata azalatt, amíg a kétirányú automata visszalépés után a már egyszer olvasott szakaszon bolyong? Várakozik. Vár arra, hogy a kétirányú automata újra feltnjön a járt út végén, és ismét eddig nem olvasott karaktereket elemezzen. Ez a helyzet nem áll el teljes bizonyossággal. Elképzelhet, hogy a kétirányú automata megáll, vagy végérvényesen ott bolyong a már elolvasott szövegen. Ha azonban újra elérkezik arra a pontra, ahol vargabetjét elkezdte, akkor fontos tudnunk, milyen állapotot vesz fel a kétirányú automata. Ennek alapján tudjuk ugyanis megítélni, hogy az automata átlépi-e a Rubicont, elolvassa-e a következ karaktert, vagy újabb vargabetbe kezd. Ennek megállapítására minden adat rendelkezésre áll. Ismerjük az automata mozgási szabályait, de ismerjük az elemzett karaktereket is, hiszen olyan szövegrl van szó, amelyet az automata legalább egyszer már elolvasott. Akár azt is megtehetjük, hogy az olvasott szöveget memorizáljuk, és a kétirányú automata mködését gondolatban lejátsszuk. Az olvasott szöveg memorizálása csak elvi lehetség. Az ilyen jelsorozatok hossza ugyanis nem korlátos, és így véges automatával nem memorizálható. Valójában nincs is szükség ennyi, tehát nem korlátos számú információ tárolására, hiszen a potenciálisan végtelen sok jelsorozat csak véges sok különböz viselkedést tanúsíthat. Helyettesítsük ugyanis az éppen olvasandó, az olvasófej alatti karaktert megelz szöveget és a kétirányú automata ennek hatására történ mködését egy fallal, nevezzük ezt visszatérési falnak. Ezen a falon az automata állapotainak megfelel nyílások vannak, mégpedig egy nyíláshalmaz a visszalép, egy pedig a visszatér állapotoknak. Úgy képzelhetjük el, hogy a nyílásokat a rexasztalhoz hasonlóan csatornák kötik össze, olymódon, hogy ezek a csatornák a visszalép állapotokból indulnak ki, és a visszatér állapotokba vezetnek. Például ha az automata a P állapotba lép be az olvasott szövegbe, és ilyen esetben a Q állapotban tér vissza, akkor a visszalépési állapotok P nyílását kell a visszatérési állapotok Q nyílásával összekötnünk, azaz felül a P állapotba bedobott labdát alul a Q állapotban kapjuk vissza. Ezt a helyzetet igyekszik szemléltetni a 2.11. ábra. Természetesen, ha egy adott állapotba visszalépve az automata sohasem tér vissza, akkor ehhez a visszalépési állapothoz egy vak csatornát képzeljünk, az ide bedobott labda sohasem tér vissza, hanem ott marad.

2. Reguláris nyelvek

53

visszalépési állapotok:

P

. . . . . . . . . .

visszatérési állapotok:

Q

2.11. ábra A visszatérési fal ,,bekötése" függ a már elolvasott szövegtl, és jelsorozatról jelsorozatra változhat. A visszatérési fal konfigurációinak száma azonban véges és korlátos, ellentétben az olvasott szöveg változatainak számától. A visszatérési fal ugyanakkor teljesen jellemzi a kétirányú automata mködését az adott olvasott szöveg mellett. Éppen ezért az egyenérték egyszer automata állapottere a kétirányú automata állapotterének és a visszatérési falak halmazának direkt szorzata lesz. Minthogy mindkét halmaz korlátos, direkt szorzatuk is az, tehát megfelel egy véges automata állapotterének. Amennyiben a kétirányú automata egy új karakter olvasásakor elrelép, ugyanezt teszi az egyenérték egyszer automata is, követve a kétirányú automata állapotát, ugyanakkor áttérve az új szöveg esetében érvényes visszatérési falra. Ezt az áttérést, az új érvényes visszatérési fal megállapítását a korábbi visszatérési fal és a beolvasott új karakter ismeretében elemi úton tehetjük meg. Amennyiben a kétirányú automata az új karakter olvasásakor visszalép, akkor az érvényes visszatérési fal alapján megnézzük, milyen állapotban tér majd vissza, ha egyáltalában visszatér, és olvassa el újból ugyanazt a karaktert. Elképzelhet, hogy a kétirányú automata újból visszalép. Ilyenkor újból elvégezzük ezt a vizsgálatot, és így járunk el mindaddig, amíg valamilyen változást nem tapasztalunk. Ilyen jelenség lehet, hogy a kétirányú automata nem tér vissza, akár mert bent a szövegben fennakadt, akár mert bent végtelen ciklusba került. Elfordulhat, hogy a visszalépések alkotnak végtelen ciklust. Végül említsük meg azt az egyetlen kedvez esetet, amikor a kétirányú automata továbblépve elrehalad, és egy új, eddig még nem olvasott karaktert elemez. Az els két változatnál az egyenérték egyszer automata nem lép, hanem megáll, illetve, ha teljesen specifikált automatát készítünk, akkor a csapdaállapotba megy át. A harmadik változatban az egyenérték egyszer automata az utolsó elre történ lépést a kétirányú automatával együtt teszi meg. Mint említettem, az új visszatérési falat az elz falból és az olvasott karakterbl lehet megszerkeszteni. Valahonnan azonban el kell indulnunk, a legels visszatérési falat közvetlenül kell meghatározni.

54

2.4. A két irányba mozgó véges automata

Az els karakter olvasása eltti fal nagyon egyszer és áttekinthet. Minthogy az els karakter eltt nincsen karakter, esetleges visszalépés esetében nincs mit olvasni, és a kétirányú automata kénytelen megállni. Itt minden visszatérési állapot vakon végzdik, az automata sohasem tér vissza. Lássunk most egy példát kétirányú automatára és a vele egyenérték egyszer automata megszerkesztésére. Legyenek a kétirányú automata mozgási szabályai az alábbiak: (A, a) = (A, j) (A, b) = (B, j) (B, a) = (A, j) (B, b) = (B, b) Legyen továbbá a kezdállapot A, és legyen mind az A, mind a B elfogadó állapot. Adott esetben ez persze nem jelenti azt, hogy az automata minden jelsorozatot elfogad, hiszen elfordulhat, hogy a visszalépések miatt bizonyos jelsorozatokat az automata nem tud végigolvasni. Ha most az elrelépéseket folytonos, a visszalépéseket pedig szaggatott nyilakkal jelöljük, a két irányban mozgó automata rajza a 2.12. ábrán látható.

a b

b a
2.12. ábra

A

B

Az egyenérték egyszer automata állapotait jelölje q és egy index, a visszatérési falakat pedig , és itt is indexszel különböztessük meg az egyes falakat. Az induló fal jele így 0. Az egyszer automata kezdállapota a kétirányú automata A kezdállapotából, és az induló 0 visszatérési falból áll: q0 = (A, 0) Vizsgáljuk meg, mi történik akkor, ha a q0 állapotban a karaktert olvasunk be. A kétirányú automata elrelép, és az A állapotba kerül. Milyen visszatérési fal tartozik majd az új állapothoz? Ehhez meg kell vizsgálnunk, hogyan viselkedik az automata, ha a 0 falat egy a karakter követi. Jelölje az új falat 1. Ilyenkor szimbolikusan a helyzetet a következképpen jelölhetjük 0 a 1 Akár az A akár a B állapotban lépünk is be a 1 falba, onnan az A állapotban térünk vissza. Ebbl következik, hogy a 1 fal esetében mind az A, mind a B visszalépési állapotot az A visszatérési állapottal kell összekötni.

2. Reguláris nyelvek

55

Az is érzékelhet, hogy az a karaktert mindig a 1 visszatérési fal követi, hiszen az automata az a karaktert megelz falba sohasem lép vissza, így az nem befolyásolhatja az a karaktert követ falat, annak konfigurációja érdektelen. Ezek szerint a q0 állapotban az a karakter beolvasására a q1 állapot következik, amelyet az alábbi pár alkot: q1 = (A, 1) Ha a q0 állapotban b karaktert olvasunk be, akkor a két automata ismét lép, az egyenérték automata állapotának egyik komponense a B állapot lesz, a másik pedig a 2 fal, amelyet a következ szituációból határozhatunk meg: 0 b 2 Amikor az A állapotban lépünk be a 2 falba, akkor onnan a B állapotba térünk vissza. Ha a visszalépési állapot B, akkor tovább kell visszalépnünk, ezúttal a 0 falba, ahonnan viszont nincs visszatérés. A 2 falnál tehát csak az A visszalépési állapotot kell a B visszatérési állapottal összekötni, a B visszalépési állapotból csak vakvágány vezet. A példa további szerkesztései, amelyek ugyanerre a kaptafára mennek, talán nem igényelnek részletesebb magyarázatot. Az alábbiakban megadjuk az egyenérték automata állapotait és mozgási szabályait. A 2.13. ábrán feltüntettük az egyes visszatérési falak ,,kapcsolását", és az egyenérték automata gráfját is megadtuk. A falak:

0

A A A A

B B B B

1

A A A A

B B B B

2

3

2.13.a. ábra

56

2.4. A két irányba mozgó véges automata

a

Q0
b a

a b

Q1
a

Q2
Az állapotok:

Q3

2.13.b. ábra q0 = ( A, 0) q1 = (A, 1) q2 = (B, 2) q3 = (B, 3)

(q0, b) = q2 (q0, a) = q1 (q1, b) = q3 (q1, a) = q1 (q3, a) = q1 (q2, a) = q1 A kapott automata determinisztikus, de nem teljesen specifikált, hiszen a q2 és q3 állapotokban a b karakter olvasásakor nincsen mozgási szabály. Az automata nyelve azon a és b karakterekbl álló jelsorozatokat tartalmazza, amelyekben nem áll két b karakter egymás mellett. A csapdaállapottal kiegészített, tehát teljesen specifikált egyszer automata minimálautomatáját tünteti fel a 2.14. ábra. a mozgási szabályok:

a

Q0
b a

a b b

Q1
a,b

Q2

T

2.14. ábra Fejtegetéseinkben hallgatólagosan feltételeztük, hogy a kétirányú automata determinisztikus. Ez nem elfeltétel. Az algoritmus kismérték módosítással alkalmazható nemdeterminisztikus két irányban mozgó véges automaták esetében is. Ennek átgondolását az olvasóra bízom. Minthogy ezek szerint minden kétirányú mozgást végz véges automatához szerkeszthet vele egyenérték, vagyis ugyanazt a nyelvet elfogadó egyszer automata, igazoltuk, hogy a két irányban mozgó automaták ereje,

2. Reguláris nyelvek

57

feladatmegoldó képessége nem nagyobb az egyszer véges automatákénál. Mindkét automataosztály ugyanazt a nyelvosztályt fogadja el.

2.5. Mveletek nyelvekkel
A nyelvek, mint tisztáztuk, matematikai objektumok, nevezetesen jelsorozatok halmazai. Mint az a matematikában általános a matematikai objektumokra mveleteket szokás értelmezni. Ez alól a nyelvek sem kivételek. A nyelvekre nagyon sok mvelet értelmezhet. Mi egyelre megelégszünk az öt legfontosabb nyelvi mvelet tárgyalásával. A nyelvek jelsorozatok halmazai. Így vannak olyan mveletek, amelyek forrása a halmazelmélet, és vannak olyanok, amelyeket a jelsorozat jelleg határoz meg. Ezek a mveletek a komplemensképzés, az unió és a metszet mvelete, továbbá a konkatenáció és a tranzitív lezárás. Az els három a halmazelméletbl van átvéve, a további kettben a jelsorozat jelleg érvényesül. Egy nyelv komplemensébe azok a jelsorozatok tartoznak, amelyek nem elemei a nyelvnek. Amikor komplemensrl beszélünk, mindig tudnunk kell milyen halmazra vonatkozó komplemenst keresünk. Ez az alaphalmaz az univerzum. Tudnunk kell tehát, mit tekintsünk adott esetben univerzumnak. Amennyiben alfabeta felett értelmezett nyelvrl van szó, akkor a elemeibl alkotott összes lehetséges jelsorozat adja az univerzumot. Ez nem más, mint a * halmaz. Egy L nyelv L komplemensét tehát azok a * halmazbeli elemek alkotják, amelyek nem mondatai a nyelvnek. Ez a definíció teljes megegyezésben van a komplemens halmazelméleti értelmezésével. Két L1 és L2 nyelv L1L2 uniója azon jelsorozatok összessége, amelyek vagy az L1 vagy az L2 nyelv mondatai. A vagy itt természetesen nem kizáró értelm. Ez a definíció is pontosan követi a halmazelméleti értelmezést. Két L1 és L2 nyelv L1L2 metszete azokat a jelsorozatokat tartalmazza, amelyek mind az L1 mind az L2 nyelv mondatai. Ez is egybevág a halmazelméleti értelmezéssel. Az L1 és L2 nyelv ebben a sorrendben vett L1·L2 konkatenáltján azon jelsorozatok halmazát értjük, amelyeket ketté lehet vágni, fel lehet osztani olymódon, hogy a sorozat eleje az L1, a sorozat második fele az L2 nyelv mondata. Nincs olyan követelmény, hogy a szétvágás unikális legyen. Megjegyzem, hogy míg az unió és a metszet mvelete kommutatív, addig a konkatenáció nem az, de könnyen belátható, hogy asszociatív. A konkatenáció jelölésénél gyakran elhagyjuk a · operátort, és az egymás mellé írt nyelvekre a konkatenáció mveletét értjük. Ez megegyezik az aritmetikában a szorzás mveletének jelölésével, ahol szintén elhagyhatjuk az operátort.
­­­

58

2.5. Mveletek nyelvekkel

A konkatenáció bevezetésével értelmezhetjük egy nyelv önmagával vett konkatenáltját. Ezt az L·L konkatenáltat a szorzási analógia miatt a nyelv négyzetének nevezzük, és az L2 jelölést is használhatjuk. Természetesen nem csak egy nyelv négyzetét értelmezhetjük ily módon, hanem akárhanyadik hatványát is. Így Li a nyelv i-szeres konkatenáltja, amely azokat a jelsorozatokat tartalmazza, amelyeket fel lehet vágni i számú darabra olymódon, hogy mindegyik darab mondata az L nyelvnek. Az aritmetikában, mint ismeretes, bármely szám nulladik hatványát az egységnek értelmezzük. Ez biztosítja ugyanis, hogy azonos alapú hatványok multiplikációját a kitevk addíciójával oldjuk meg. Hasonló módon bármely nyelv nulladik hatványának azt a nyelvet tekintjük, amelynek egyetlen eleme az üres jelsorozat, . Ugyanúgy ahogy bármely számnak az egységgel való szorzata a számot szolgáltatja, bármely nyelvnek ezzel az egységnyelvvel való konkatenációja a kiindulási nyelvet adja vissza. A nyelvek hatványozásának ismeretében definiálhatjuk egy L nyelv L* tranzitív lezártját. A tranzitív lezárt a nyelv valamennyi hatványának uniója, vagyis azokat a jelsorozatokat tartalmazza, amelyeket fel lehet úgy darabolni, hogy minden darab a nyelv mondata legyen. A darabok számára vonatkozóan nincsen megkötés. Formálisan ezt az alábbi összefüggés fejezi ki: L* = U Li
i=0

(2.25.)

Felhívom a figyelmet arra, hogy az unióképzés a nulladik hatványnál kezddik, tehát egy nyelv tranzitív lezártjának mindig eleme , az üres jelsorozat. Fogjuk fel a alfabetát nyelvnek, amelynek elemei az alfabeta karakterei. Régi ismersünk a * tehát nem más, mint a nyelv tranzitív lezártja. Vegyük észre, hogy a csillag kitev alkalmazása a (2.25.) képletben megfelel az eddigi értelmezéseknek. A nyelveken értelmezett mveletek bevezetésekor rögtön felmerül a kérdés, mennyiben zártak az egyes nyelvosztályok a különböz mveletekre? Akkor mondjuk, hogy egy halmaz egy mveletre zárt, vagy más szavakkal a mvelet nem vezet ki a halmazból, ha a mveletet a halmaz tetszleges elemén vagy elemein elvégezve, az eredmény ismét csak a halmaz eleme lesz. A reguláris nyelvek halmaza a fenti mveletekkel szemben igen rokonszenvesen viselkedik, amennyiben valamennyi mveletre nézve zárt. Mieltt mind az öt mveletre külön-külön bebizonyítanánk a reguláris nyelvek zártságát, néhány megjegyzést tennék. Minthogy a reguláris nyelvtanok által generált, és a véges automaták által elfogadott nyelvek halmazának azonosságát már igazoltuk, a zártság feltételeit elegend csupán az egyik területen, akár a nyelvtanok, akár az automaták oldaláról belátnunk. Így élünk azzal a könnyebbséggel, hogy az igazolást ott végezzük el, ahol az érzékletesebb.

2. Reguláris nyelvek

59

Vegyük ezután sorra a már említett mveleteket. A komplemens képzésénél induljunk ki az automatából. Itt az alapgondolat nyilván az lehet, hogy cseréljük fel az állapotok jellegét. Ami eddig elfogadó állapot volt legyen visszautasító, és fordítva, a visszautasító állapotokból legyenek elfogadó állapotok. Ez az ötlet valóban célhoz vezet, csak óvatosan kell alkalmazni. Ha ugyanis az automata a szöveget nem tudja végigolvasni, akkor a definíció szerint ez visszautasítást jelent, az automata a jelsorozatot nem fogadta el. Ezen a körülményen az automata állapotok jellegének megcserélése természetesen nem változtat, így mindkét esetben visszautasítást kapnánk. Ennek elkerülésére az automatát teljesen specifikálni kell, így az a szöveget mindig végigolvassa. Problémát okozhat az automata esetleges nemdeterminisztikus volta. Ilyenkor adódhat egy-egy olyan mozgássorozat, amely közül az egyik elfogadó állapotba, a másik pedig visszautasító állapotba vezet. Definíció szerint ilyenkor az elfogadó állapotba vezet mozgássorozatot kell alapul venni, és ennek megfelelen a jelsorozatot el kell fogadni. Egy ilyen nemdeterminisztikus automatánál pusztán az állapotok jellegének felcserélésével szintén nem érünk célt. A csere után ismét lesz egy elfogadó állapotba és egy visszautasító állapotba vezet mozgássorozat, azzal a megjegyzéssel, hogy a két mozgás szerepe most felcseréldött. Az automata a jelsorozatot mindkét esetben elfogadná. Ennek elkerülésére alakítsuk át az automatát determinisztikussá. Egy teljesen specifikált determinisztikus automata állapotainak jellegét felcserélve valóban a komplemens nyelvét elfogadó automatát nyerünk. Mind a teljes specifikáció, mind a determinisztikus automatára való áttérés az elbbiek szerint megoldott, így tetszleges véges automatához szerkeszthet olyan véges automata, amely az eredeti automata nyelvének komplemensét fogadja el. Így a komplemens is reguláris nyelv, a zártságot igazoltuk. Végül mutassuk be ennek egy alkalmazását.
a b b c c a b b c c

S

a

A

B

C

S

a

A
c

B
a

C

b,c

a,b

T
a,b,c

2.15. ábra A 2.15. ábrán ugyanazt a nyelvet elfogadó két véges automatát tüntettünk fel. Közülük az els nem teljesen specifikált. Ha a teljesen specifikált automata

60

2.5. Mveletek nyelvekkel

állapotainak jellegét cseréljük fel, valóban a komplemenst elfogadó automatát kapunk. Amennyiben a nem teljesen specifikált automatánál tesszük ezt, olyan automatához jutunk, amely a komplemens nyelvnél szkebb halmazt fogad el, lesznek ugyanis olyan jelsorozatok, amelyek sem az eredeti, sem az átalakított automata nem fogad el. Az unió képzésénél elindulhatunk akár a nyelvtanból, akár az automatából. Itt is konstruktív bizonyítást adunk, vagyis megszerkesztjük az unióval elálló nyelv nyelvtanát, illetve az azt elfogadó automatát. Lássuk elször az automatákat érint megoldást. Az alapgondolat nyilván az lehet, hogy egyesítsük a két automata kezdállapotait egyetlen közös kezdállapotba, és az els mozgás döntse el, melyik automata fogadja el a jelsorozatot. Ha az els automatába lépünk be azzal az els nyelv mondatait fogjuk elfogadni, ha a másodikba, akkor a másodikét. Azonban itt is óvatossággal kell eljárnunk. Vannak olyan véges automaták, ahol a kezdállapotba nem vezet nyíl, így az els lépést követen sohasem leszünk újra a kezdállapotban. Más automatáknál nem ez a helyzet. A 2.16. ábra mutatja egy ilyen automata vázlatát. véges automata

S

prefix

posztfix

E

2.16. ábra Az ábrán sematikusan rajzoltunk egy olyan mozgási sorozatot, egy hurkot, amely a kezdállapotból kiindulva visszatér a kezdállapotba. Ugyanez az automata egy másik kellemetlenné válható tulajdonsággal is rendelkezik, nevezetesen van olyan elfogadó állapota, amelybl vissza lehet térni az automatába. Ezt is sematikusan egy az (egyik) elfogadó állapotból kiinduló és oda visszatér kör jelzi. Az elbbi köröket prefix, illetve posztfix névvel jelöltük, hiszen ezek vagy a mondat elején, vagy a mondat végén fordulnak el. Amennyiben az egyesítend két automatának soha vissza nem tér kezdállapotai vannak, akkor a két kezdállapot egyesítése valóan azt az automatát szolgáltatja, amelyik a két nyelv unióját fogadja el. Ha azonban akár csak az egyik automatánál is vissza tudunk térni a kezdállapotba, megtehetjük, hogy ebben az automatában futunk egy kört, és a kezdállapotba visszatérve a másik automatában folytatjuk utunkat. Így olyan jelsorozatokat is elfogadhatunk, amelyek sem az egyik, sem a másik nyelvnek nem mondatai. Ennek a hibának elkerülésére az automatákat, ha visszatér kezdállapotuk van, át kell alakítanunk olymódon, hogy a kezdállapotba ne lehessen visszatérni.

2. Reguláris nyelvek

61

Ezt könnyen megtehetjük. Fosszuk meg az eredeti kezdállapotot ettl a címétl, és vezessünk be egy új kezdállapotot. Az eredeti kezdállapotból kiinduló nyilakat duplikálnunk kell, a másolatot az új kezdállapotból indítsuk. Minthogy a bemen nyilakat nem duplikáljuk, az új kezdállapotnak csak kimen nyilai lesznek, oda visszatérni nem lehet. A módosított automata természetesen ugyanazt a nyelvet fogadja el, hiszen az els mozgást követen a két automata ugyanabba az állapotba kerül, és a továbbiakban már csak az automatának az eredeti automatával megegyez részének van szerepe. Az ily módon átalakított, a kezdállapotba vissza nem lép automaták kezdállapotait most már egyesíthetjük, hiszen az els lépés itt valóban eldönti, melyik automatában folytatjuk le az elemzést, és nincs lehetség a két automata közötti kommunikációra. Ezzel a problémával kissé módosított formában tulajdonképpen már találkoztunk. Amikor a balreguláris nyelvtanokhoz készítettünk automatát, akkor egynél több állapot tarthatott igényt a kezdállapot titulusára. A problémát akkor lényegében ugyanezzel a módszerrel oldottuk meg. A két nyelv uniójának elfogadására szolgáló automatát úgy is elképzelhetjük, hogy a két automatát egyetlen automatának tekintjük, amelynek azonban sajnálatos módon két kezdállapota van. Ennek a ,,betegségnek" a kikúrálására pontosan a fent leírt mveleteket kell elvégeznünk. Induljunk ki most a nyelvtanokból. Legyen tehát a két L1 és L2 nyelv nyelvtanával adott. Annak érdekében, hogy a két nyelvtan szabályait meg tudjuk különböztetni, gondoskodnunk kell arról, hogy a két nyelvtan nemterminális szimbólumainak halmaza diszjunkt legyen. Ha eredetileg nem ez volna a helyzet, akkor ezen átnevezéssel segíthetünk. Amennyiben a mondatszimbólumok sehol sem szerepelnek levezetési szabály jobboldalán, ez annyit jelent, hogy az els levezetési szabály alkalmazása után a mondatszimbólum nem szerepel többet a mondatszer formákban. Ilyenkor a két nyelv mondatszimbólumait közösíthetjük, vagyis egyetlen közös mondatszimbólumot alkalmazva máris elállt a két nyelv unióját generáló nyelvtan. Persze elfordulhat, hogy a mondatszimbólum szerepel a levezetési szabályok jobboldalán is. Ez esetben a mondatszimbólum a mondatszer formában újból felléphet. Ha ilyenkor térünk át a másik nyelvtanra, olyan jelsorozatot generálhatunk, amelyik egyik nyelvnek sem mondata. Vegyük észre, hogy a mondatszimbólum feltnése a levezetési szabály jobboldalán nem más, mint az automaták visszatér kezdállapotának nyelvtani interpretációja. A baj kezelése is analóg az automatáknál alkalmazottal. Át kell térni olyan nyelvtanra, ahol a mondatszimbólum nem szerepel levezetési szabály jobboldalán. Új mondatszimbólumot kell bevezetni, a régi mondatszimbólumot meg kell fosztani ettl a rangjától, végül duplikálni kell azokat a levezetési

62

2.5. Mveletek nyelvekkel

szabályokat, amelynek baloldalán az eredeti mondatszimbólum áll, olymódon, hogy annak helyébe az új mondatszimbólumot írjuk. Annak magyarázatára, hogy az átalakítás a generált nyelvet nem változtatja meg, és ezután a két nyelvtan egyesítése valóban a két nyelv unióját generálja, nem térek ki, hiszen ezt már az automaták ismertetésekor megtettem. Ezek szerint bármilyen legyen is a két automata, illetve a két nyelvtan, a két nyelv uniója véges automatával elfogadható, illetve reguláris nyelvtannal generálható. Ezzel igazoltuk, hogy a reguláris nyelvek zártak az unióképzés mveletére. Lássunk egy példát az unióképzésre. Legyen a két nyelvtan: L1 S aA S bS A aS A bA S S aS S bB B aB B bS S L2 Átnevezéssel érjük el, hogy ne legyen két azonos nev nemterminális a két nyelvtanban. L1 P aA P bP A aP A bA P L2 Q aQ Q bB B aB B bQ Q Sajnos a mondatszimbólumok szerepelnek a produkciós szabályok jobboldalán is. Vezessünk be tehát új mondatszimbólumokat, és két lépést egyesítve rögtön közösítsük is az új mondatszimbólumot. S aA S aQ S bP S bB S P aA P bP A aP A bA P Q aQ Q bB B aB B bQ Q Ezzel megkaptuk a két nyelvtan által generált nyelv unióját generáló nyelvtant. A szerkesztés menetét az automatákon is nyomon követhetjük. A 2.17. ábrán elször a két nyelv automatája van feltüntetve. Mind a nyelvtanból, mind az automatákból könnyen megállapítható, hogy a két nyelv a és b karakterekbl álló jelsorozatokat tartalmaz, mégpedig az els nyelv esetében az a, a másodikban a b karakterek száma páros. a a b b

P

b

A
2.17.a. ábra

Q

a

B

2. Reguláris nyelvek
a a b b b b a a

63

P
a

A

Q
b

B

S
2.17.b. ábra

S

Az automatát olymódon kell átalakítani, hogy a kezdállapotba ne vezessen nyíl, ne térhessünk vissza a kezdállapotba. Ez a feltétel a megfelelje annak a követelménynek, hogy a mondatszimbólum ne szerepeljen produkciós szabály jobboldalán. b b

b

Q
a b

a

B
a

S
b

a

P
b

S
a

P
a

b

A

Q

a

R

2.18. ábra A 2.18. ábra baloldala az így módosított, majd a kezdállapotok egyesítésével kiadódó automatát mutatja. Amennyiben elzetes átalakítás nélkül egyesítenénk a két automata kezdállapotát, úgy megtörténhetne, hogy az egyik nyelv mondatát a másik nyelv prefixuma helytelenül megelzné. Az egyesített automata nemdeterminisztikus. Amennyiben ezt az automatát az ismert módon determinisztikussá alakítjuk, akkor a 2.18. ábra jobboldalán látható automatát kapjuk. Ez az automata csak azokat a jelsorozatokat utasítja vissza, amelyekben mind az a, mind a b karakterek száma páratlan. A metszet mveletérl szólva tulajdonképpen ezek után annak zártságát nem kellene külön igazolnunk, hiszen a halmazelméletbl jól ismert de Morgan szabályok szerint az unió- és metszetképzés mvelete kifejezhet a másik mvelettel, és a komplemens képzéssel. Minthogy a komplemens és unióképzésre már beláttuk a zártságot, a metszet mveletére vonatkozó zártság ebbl már következik.

64

2.5. Mveletek nyelvekkel

Mégis adunk egy konstruktív bizonyítást, mert a vázolt szerkesztés sokkal célratörbb, és sok érdekes szempontra hívja fel a figyelmet. Legyen adott két L1 és L2 nyelv véges automatájukkal. A metszet elfogadására olyan automatát kell szerkesztenünk, amely egyidejen figyelemmel kíséri, mi történik a két eredeti automatában, és a jelsorozatot csak akkor fogadja el, ha mindkét eredeti automata elfogadja azt. Készítsünk egy olyan automatát, amelynek állapothalmaza a két eredeti automata állapotterének direkt szorzata, pontosabban ennek alkalmas részhalmaza. Így az új automatán egyidejen követni tudjuk a két eredeti automata mködését. Az új automata mozgási szabályai ugyanis két eredeti automata mozgási szabályain alapulnak, amennyiben egy induló állapotpárból egy karakter beolvasásának hatására az eredményül kapott állapotpárt az eredeti automaták mozgási szabályai alapján határozzuk meg. A metszet automatájának kezdállapota a két kezdállapot szorzata lesz, míg az elfogadó állapotok azok az állapotpárok lesznek, amelyek két elfogadó állapotból származnak. Példánkban a két nyelvet rögtön automatájukkal adtuk meg.

a

b b

S

P

Q

a,b

R

2.19. ábra A 2.19. ábra els automatája azokat a jelsorozatokat fogadja el, ahol az a karakterek (esetleg üres) sorozatát a b karakterek nem üres sorozata követi. A második automata az olyan a és b karakterekbl álló jelsorozatokat fogadja el, ahol a karakterek száma páros. A 2.20. ábrán a két nyelv metszetét elfogadó automata van feltüntetve.

SQ
b

a

SR
b

PR

b

PQ

2.20. ábra Amennyiben a két eredeti automata determinisztikus volt a szerkesztés menetébl következen az eredményül kapott automata is determinisztikus lesz. Megjegyzem, hogy a metszetképzésnél sem az automaták nemdeterminisztikus volta, sem a máskor ,,illegálisnak" minsített hurkok jelenléte nem zavaró.

2. Reguláris nyelvek

65

A konkatenáció esetében az igazolás egyszer, akár az automatákból, akár a nyelvtanokból indulunk is ki. Az L1 és L2 nyelv ebben a sorrendben vett L1L2 konkatenáltját, pontosabban annak nyelvtanát az eredeti nyelvtanokból a következképpen kapjuk. Szokás szerint itt is el kell érnünk, hogy a két nyelvtan nemterminális szimbólumaiból alkotott két halmaz diszjunkt legyen. Ezután vesszük az els nyelvtan második típusú szabályait, vagyis azokat, ahol a jobboldalon nincsen nemterminális szimbólum. Ezeket átírjuk olymódon, hogy a terminális szimbólum után odaírjuk a második nyelvtan mondatszimbólumát. Példaképpen egy ilyen lehetséges átalakítás formája: Aa A aS2 ahol az els szabály az els nyelvtan levezetési szabálya, az S2 pedig a második nyelvtan mondatszimbóluma. Az ily módon megszerkesztett nyelvtan mondatszimbóluma nyilván az els nyelvtan mondatszimbóluma lesz. Magától értetd, hogy az elbbiek szerint megszerkesztett nyelvtan a konkatenált nyelvet generálja. Az els nyelv mondatainak generálásakor az utolsónak alkalmazott szabály szükségszeren egy második típusú szabály volt. A mondatszer formában ugyanis ilyen szabály ,,távolítja" el a nemterminális szimbólumot, és teszi ezzel a mondatszer formát mondattá. A kapott nyelvtan azonban az els nyelv mondatai után odabiggyeszti a második nyelv mondatszimbólumát, amelybl aztán egy a második nyelvhez tartozó mondat keletkezik. Amennyiben az els nyelvtan tartalmaz A alakú -szabályokat, akkor a fent vázolt átalakítással ezekbl A S2 formájú úgynevezett egyszeres szabályok keletkeznének. A feltételes mód azért indokolt, mert a Chomsky-féle elírás ilyen szabályokat nem ismer. Ezen úgy segíthetünk, hogy az ilyen szabályok helyett a magányos jobboldal, adott esetben a második nyelv mondatszimbólumának helyébe beírjuk azon szabályok jobboldalát, ahol a baloldalon ez a magányos szimbólum szerepel. Ez a mvelet annyira egyszer, hogy végrehajtását az olvasóra bízhatom annál is inkább, mert késbb még lesz szó róla. Lássunk ismét egy példát: L1 S aA S bS A aS A bA S L2 S aA S cS A aS A cA A Az els nyelv az a és b, a második az a és c karakterekbl áll. Ezen kívül az els nyelvben az a karakterek száma páros, a másodikban viszont páratlan. Tegyük a nemterminális szimbólumok halmazait diszjunkttá: L1 S aA S bS A aS A bA S L2 P aQ P cP Q aP Q cQ Q Ezek után el kell érnünk, hogy vagy az els nyelv elenyész S szimbóluma ne szerepeljen a baloldalon, vagy a második nyelv P mondatszimbóluma ne legyen a szabályok jobboldalán. A vagy itt nem kizáró vagy.

66

2.5. Mveletek nyelvekkel Itt az utóbbi megoldást választottuk. L1 S aA S bS A aS A bA S R aQ R cP P aQ P cP L2 Q aP Q cQ Q Ennek alapján a konkatenált nyelv nyelvtana a következ:

S aA S bS A aS A bA S aQ S cP P aQ P cP Q aP Q cQ Q Az eredményt itt már végleges formában adtuk meg, vagyis a szalonképtelen egyszeres szabályokat már kiküszöböltük. L1 L2 A teljesség kedvéért a fenti példát automatákkal is megoldjuk. Itt a nyelvtanok egymásba fzésének az a mvelet felel meg, hogy az els automata elfogadó állapotát ,,összeszegecseljük" a második automata kezdállapotával. Amennyiben az els automatának egynél több elfogadó állapota lenne, akkor vagy minden elfogadó állapothoz hozzászegecselünk egy második automatát, vagy egyetlen elfogadó állapotot hozunk létre. Itt arra kell ügyelnünk, hogy az els automata elfogadó állapotából ne lehessen visszatérni az els automata állapotaiba, és ezzel együtt a második automata kezdállapotába se lehessen lépni a második automata állapotaiból.
b b a c c a

S R
c

A
c

S
b

A
b

a a

Q

S
c

a a a

A

P
c

P
c

Q
c

2.21. ábra Amennyiben mindkét körülmény egyszerre fennáll, akkor a két nyelv fragmensei ­ helytelenül ­ összekeveredhetnek. Elfordulhat ugyanis, hogy elérve az els automata elfogadó állapotát futunk egy kört a második automatában, majd visszatérve a közösített állapothoz visszamegyünk az els automatába, és ott is végzünk egy körüljárást. Ennek elkerülésére vagy az els automatánál kell megakadályoznunk, hogy az elfogadó állapotból visszatérjünk, vagy a második automatánál kell megtiltanunk a kezdállapot újbóli meglátogatását. A vagy itt természetesen nem

2. Reguláris nyelvek

67

kizáró vagy, és pusztán azt érzékelteti, hogy a két intézkedés közül egyik is elegend a helytelen keveredés kiküszöbölésére. Visszatérve példánkra a megoldás menete a 2.21. ábrán látható. Az els két automata az L1 és L2 nyelveket fogadja el. Annak érdekében, hogy a két nyelv fragmensei ne keveredjenek, el kell érnünk, hogy a második automata kezdállapotába ne vezessen nyíl. A második automata módosított változatát mutatja az ábra harmadik része, végül a konkatenált nyelvet elfogadó automata látható, amelyet úgy kaptunk, hogy az els automata elfogadó állapotát egyesítettük a második kezdállapotával. Esetünkben a konkatenált nyelv automatája nemdeterminisztikus. Minthogy ez az algoritmus bármilyen nyelvtanok illetve bármilyen automaták esetében alkalmazható, ezzel igazoltuk a reguláris nyelvek zártságát a konkatenáció mveletére nézve. A tranzitív lezárt nyelvtanának és automatájának megszerkesztésekor eddigi eredményeinket ­ bizonyos óvatossággal ­ alkalmazhatjuk. Nyelvtanok esetében az alapgondolat az lesz, hogy a második típusú, tehát nemterminálist nem tartalmazó szabályok esetében hozzáfzzük a mondatszimbólumot. Ezzel elérhetjük, hogy az eredeti nyelv egy mondatának generálása után hozzákezdhetünk a következ mondat generálásához. Ezt a folyamatot azonban le kell zárnunk, ezért a nyelvtanhoz hozzávesszük az S helyettesítési szabályt is, annál is inkább, mert az üres jelsorozat, az , megbeszélésünk szerint mindig eleme a tranzitív lezártnak. Ez a szerkesztés általában azt a nyelvtant szolgáltatja, amelyik a tranzitív lezárt nyelvet generálja. Óvatosságra azonban itt is szükség van. Ha ugyanis az üres jelsorozat a nyelvnek nem eleme, és ugyanakkor a mondatszimbólum szerepel helyettesítési szabály jobboldalán, akkor a fenti átalakítást kritika nélkül alkalmazva az új nyelvtan ­ helytelenül ­ képes olyan jelsorozatok generálására, amelyek az eredeti nyelvnek prefixumai. Az S helyettesítési szabály bevezetésével a mondatszimbólum megjelenése lezárhatja a generálást, ami korábban lehetetlen volt. Ezen veszély elkerülésére a szerkesztést megelzen a nyelvtant az ismert módon át kell alakítani, hogy a mondatszimbólum ne szerepeljen helyettesítési szabály jobboldalán. Amennyiben az eredeti nyelvtanban lettek volna -szabályok, akkor minden olyan szabályban, ahol a jobb oldalon az elenyész nemterminálisok szerepelnek, ezeket a szabályokat duplikálni kell olymódon, hogy az elenyész nemterminálisok helyett a mondatszimbólumot írjuk. Ezután az eredeti -szabályokat akár el is hagyhatjuk, hiszen a mondatszimbólumnak hivatalból van helyettesítése. Példának válasszuk azt a nyelvet, amely olyan a és b szimbólumokból álló jelsorozatokat tartalmaz, ahol vagy az a, vagy a b szimbólumok száma páratlan. A vagy itt kizáró értelemben szerepel. Ez persze azt jelenti, hogy

68

2.5. Mveletek nyelvekkel

mondhattuk volna egyszerbben is, nevezetesen, hogy a nyelv a páratlan hosszúságú, az a és b szimbólumokból álló jelsorozatokat tartalmazza. A választott fogalmazásnak és tárgyalásmódnak didaktikai okai vannak. Ezzel a nyelvtan: L D aA bB A aD bC B aC bD C aB bA Itt sajnos a mondatszimbólum elfordul a helyettesítési szabályok jobboldalán is, vezessünk be hát egy új mondatszimbólumot. Ennek tartottuk fenn az S jelölést. Ezzel a nyelvtan: L S aA bB D aA bB A aD bC B aC bD C aB bA Végül a tranzitív lezárt nyelvtana: L* S aA bB D aA bB aS bS C aB bA aS bS A aD bC B aC bD A szalonképtelen -szabályokat itt is kiküszöböltük. A 2.22. ábrán megadtuk a szerkesztés lépéseit arra az esetre, amikor az automatából kiindulva határozzuk meg a tranzitív lezárt automatáját.

D
b

a

A
b

S
b

a

D
b

a

A
b

B D
b

a

C
a a,b a b a,b

B A
a,b

a

C

a,b

S
b a

S C

B

2.22. ábra A négy részábra közül az els az eredeti nyelv automatáját mutatja. Els lépésként az automatát át kell alakítani, hogy a kezdállapotba ne mutasson nyíl, ugyanakkor a kezdállapot elfogadó állapot legyen. Ennek eredménye a következ ábra.

2. Reguláris nyelvek

69

A következ mvelettel érjük el, hogy csupán egyetlen elfogadó állapotok legyen. Ez egyébként azért is üdvös, mert az sem engedhet meg, hogy az elfogadó állapotból nyíl induljon ki. Ilyenkor ugyanis az eredeti nyelv bizonyos posztfixumait is elfogadná az automata, így tehát mind a kezdállapotot, mind az elfogadó állapotot meg kell ,,tisztítanunk". Ezt mutatja a harmadik ábra. A következ részábra a szerkesztésnek megfelel, a tranzitív lezártat elfogadó automatát tünteti fel. Jóllehet az eredeti automata determinisztikus volt, a ,,tisztogatási" mvelet során az automata elvesztette determinisztikus jellegét. Így az eredményül kapott automata sem determinisztikus. Vegyük észre, az elfogadó S állapotból akár a akár b karaktert olvasunk, visszajutunk az S állapotba. Ezek szerint ez az automata minden jelsorozatot elfogad. Ennek automatáját adja az utolsó részábra. Els pillanatra talán meglep, de ez az automata csupán egyetlen állapottal bír, és minden jelsorozatot elfogad. A tranzitív lezárt nyelv ugyanis a *. Ha egy kicsit utánagondolunk ez teljesen természetes. Az üres jelsorozat, mint minden nyelv nulladik hatványa ugyanis ,,hivatalból" eleme minden tranzitív lezártnak. Ami a nem üres jelsorozatokat illeti, vegyük észre, hogy a magányos a illetve b szimbólum is eleme az eredeti nyelvnek. Így legrosszabb esetben az a partíció, amikor minden egyes szimbólum külön jelsorozatot alkot, mindig beválik. Ezt tulajdonképpen kis gondolkodással rögtön az elején is észrevehettük volna, most azonban kivételesen nem a frappáns megoldás, hanem az algoritmus bemutatása volt a cél. Ezzel igazoltuk, hogy a reguláris nyelvek halmaza valamennyi általunk említett mveletre nézve zárt. A reguláris nyelveken értelmezett mveletekhez kapcsolódva szeretném bemutatni a reguláris nyelvek egyik fontos tulajdonságát, a pumpálást. Egy reguláris nyelv minden kell hosszúságú w mondata felbontható három jelsorozat xyz egymásutánjára olymódon, hogy a középs részsorozatot tetszlegesen sokszor ­ esetleg egyszer sem ­ megismételve megint csak a nyelv mondatát kapjuk. Így ha xyz L akkor xyiz L i0 (2.26.) Egy mondat elfogadása során az automata pontosan annyiszor mozog állapotról állapotra, ahány karakterbl áll a mondat. Tételezzük fel, hogy a szóban forgó nyelvet egy n állapotú véges automata fogadja el. Az elbbiek szerit egy n karakterbl álló jelsorozat feldolgozásakor tehát n lépést tesz, és közben n+1 állapotot érint. Az automata ugyanis már az els karakter beolvasása eltt is valamilyen állapotban van, tehát ezt az állapotot is ,,érinti".

70

2.5. Mveletek nyelvekkel

Ez annyit jelent, hogy kell lennie legalább egy olyan állapotnak, amelyet az automata legalább kétszer érint. Az automatán belül megtett úton tehát egy hurok van. Bontsuk fel tehát a mondatot olymódon, hogy a hurok bejárása közben olvasott karakterek alkossanak egy külön részsorozatot. Ez lesz nyilván a középs y részsorozat. Ebbl viszont már következik a (2.26.) állítás igazsága, hiszen ha ezt a hurkot újra és újra bejárjuk, akkor az y részsorozatot tetszlegesen sokszor megismételjük.

x

z

y

2.23. ábra Megjegyzem, hogy akár a hurok eltti x, vagy akár az utáni z, esetleg mindkett üres is lehet. A fentiekbl már nyilvánvaló mit jelent az adott esetben a kell hosszúság. St a (2.26.) állítás még tovább élesíthet. Azt is mondhatjuk, hogy a nyelv egy mondatában bárhol kijelölhetünk egy olyan kell hosszúságú részsorozatot, amelyre a (2.26.) állítás igaz. Így az n hosszúságú részsorozat kijelölése a mi dolgunk, ennek particionálása azonban hurok eltti, a hurkot alkotó, és a hurok utáni darabokra már a nyelvtan illetve az automata dolga. A pumpálás tulajdonsága alapján lehet belátni, hogy az aibi i>0 alakú nyelv nem lehet reguláris nyelv. Tételezzük fel ugyanis, hogy ezt a nyelvet egy n állapotú véges automata fogadja el. Válasszuk most az i kitevt ennél nagyobbra, ekkor az a karakterek sorozatán belül jelölhetjük ki a pumpáló részsorozatot, amivel az a karakterek számát anélkül növelhetjük meg, hogy a b karakterek száma változna. Így a nyelvnek olyan mondata is lenne, amely nem egyforma számú a és b karaktert tartalmaz. Ugyancsak a pumpálás alapján igazolhatjuk, hogy egy nem üres nyelvnek van az automata állapotok számánál rövidebb mondata. Tételezzük ugyanis fel ennek ellenkezjét. Ezek szerint a nyelv minden mondata legalább n hosszúságú. Az ilyen mondatok elemzésekor azonban szükségszeren van hurok a mozgásban. A hurokhoz tartozó részsorozatot elhagyva ismét a nyelv egy mondatát kapjuk. Amennyiben az így lerövidített mondat még mindig túl hosszú, akkor ezt a processzust megismételjük. Nyilvánvaló, hogy elbb-utóbb az állapotok számánál rövidebb mondatot kell kapnunk.

2. Reguláris nyelvek

71

Azt is könny belátni, hogy amennyiben a nyelvnek van az automata állapotainak számánál legalább egy hosszabb mondata, akkor végtelen sok mondata van. Abban a bizonyos kell hosszúságú mondatban kell lennie huroknak. A mondatot a (2.26.) szerint particionálva, a hurkot alkotó részt ismételgetve tetszleges számú mondatot generálhatunk.

2.6. Reguláris halmazok
A reguláris nyelvek leírására, definiálására eddig két módszert ismertünk meg. Egy reguláris nyelvet megadhatunk az azt generáló reguláris nyelvtannal, vagy az azt elfogadó véges automatával. Alábbiakban a reguláris nyelveknek, a jelsorozatokat tartalmazó reguláris halmazok útján egy harmadik meghatározási lehetségével ismerkedünk meg. Legyen tehát egy alfabeta, amely a jelsorozatok karakterkészletét tartalmazza, és legyen a ennek egy eleme. Lássuk ezután mi tekinthet reguláris halmaznak, pontosabban a felett értelmezett reguláris halmaznak. Reguláris az üres halmaz , egyedül az üres jelsorozatot tartalmazó halmaz {}, és egy halmazbeli karaktert, mint egyetlen jelsorozatot tartalmazó halmaz {a}. Legyen most P és Q két reguláris halmaz. Néhány halmazmvelet definíciószeren nem vezet ki a reguláris halmazok világából. Ilyen az unióképzés, amelyet itt a + operátorral jelölünk, a konkatenáció, amelyet egyszeren egymásután írással adunk meg, végül a tranzitív lezárás, amit szokás szerint a * jelöl. Összefoglalva, adott feletti reguláris halmaznak nevezzük azokat és csak azokat a nyelveket (sztringhalmazokat) melyek a fenti módszerrel elállíthatóak. Foglaljuk össze, milyen egyszer halmazokat tekintünk reguláris halmazoknak, és milyen mveletek eredményeznek ismét reguláris halmazt: {} {a} a (2.27.) P+Q P,Q reguláris PQ P,Q reguláris * P P reguláris Az összeadás és a szorzás jelének az unióképzés illetve a konkatenáció mveletére való alkalmazását az indokolja, hogy az aritmetikában érvényes néhány szabály ebben a kontextusban is igaz marad. Ilyen például az operátorok precedencia szabálya. Elbb kell elvégezni a ,,hatványozás" értsd tranzitív lezárás mveletét mint a szorzással jelölt konkatenációt, végül a + operátorral jelölt unióképzést.

72

2.6. Reguláris halmazok

Persze itt is bevezethetjük a zárójelezést, mint a precedencia megtörésének eszközét. A zárójelek felbontásának szabályai is emlékeztetnek az aritmetikából ismertekre. Így például (A+B)(C+D) = AB+AD+BC+BD Ezzel az analógiával azonban óvatosan kell bánnunk. Ha két olyan halmaznak képezzük az unióját, ahol az egyik a másik részhalmaza, akkor az ,,összeadás" már eltér az aritmetikai mvelettl: ha AB akkor A+B = B Vegyük észre, hogy az üres halmaz a zérus, az üres jelsorozatot tartalmazó halmaz pedig az egységelem szerepét játssza. Valóban A+ = +A = A és A = A = A (2.28.) hiszen az üres halmazzal vett unió nem bvíti az eredeti halmazt, ugyanakkor az A halmaz bármely eleme elé vagy mögé az üres jelsorozatot írva nem gyarapítottuk a halmaz elemeinek számát. A tranzitív lezárt, mint ismeretes a következképpen fejezhet ki: A* = U Ai
i=0

(2.29.)
+

Vezessük be ennek mintájára a kitevként alkalmazott alábbi értelmezéssel: A+ = U Ai
i=1

jelölést, az (2.30.)

Ebbl következik, hogy A* = A++ és A*A = A+ (2.31.) illetve ha az üres jelsorozat eleme a reguláris halmaznak (2.32.) A A+ = A* hiszen az üres jelsorozat mindkét halmaznak eleme. A jobboldalon egy tranzitív lezárt van, amely definíció szerint tartalmazza az üres jelsorozatot, míg a baloldalon egy olyan A halmaz áll, amelynek feltételünk szerint eleme az üres jelsorozat. Reguláris halmazokra lényegében ugyanúgy lehet a bevezetett jelölések alkalmazásával összefüggéseket, halmazok közötti kapcsolatokat definiálni, mint például az aritmetikai kifejezések segítségével a számok világában. Felírhatunk halmazegyenleteket, halmazok közötti összefüggéseket, és megkereshetjük azokat a halmazokat, amelyek mellett ezek az összefüggések igazak lesznek, vagyis amely halmazok a halmazegyenlet megoldásai. Vegyük például a következ egyszer összefüggést: X = X+ ­ ahol és adott reguláris halmazok, ­ X pedig ismeretlen halmaz. (2.33.)

2. Reguláris nyelvek

73

Határozzuk meg az X halmazt olymódon, hogy a (2.33.) összefüggés igaz legyen. Az egyenlet megoldása: X = * (2.34.) Állításunk helyességérl könnyen meggyzdhetünk, ha a megoldást behelyettesítjük a (2.33.) egyenletbe. Valóban: * = (*)+ = ++ = (++) =* Megjegyezzük, hogy a (2.34.) megoldás csak abban az esetben unikális, ha az halmaznak nem eleme. Ellenkez esetben ugyanis minden X = *(+) alakú kifejezés megoldás, ahol tetszleges reguláris halmaz. Errl a szorgalmas olvasó egyszer behelyettesítéssel meggyzdhet. A fentiek alapján egyetlen ,,lineáris" összefüggéssel megadott reguláris halmazt könnyen meghatározhatunk. De mi történik azonban, ha több reguláris halmazt egy ,,lineáris egyenletrendszer" útján adunk meg. Ilyenkor a (2.34.) megoldási képletet, és a behelyettesítést felváltva alkalmazva egy a Gauss-eliminációhoz hasonló eljárással kaphatjuk meg az ismeretlen halmazok megoldását. Hogy a megoldás során a részegyenleteknek valóban egyetlen megoldása van, az annak a következménye, hogy a véges automata nem tartalmaz -szabályokat. Lássunk erre egy példát: X1 = bX1+aX2+ X2 = aX1+bX2 Amennyiben a második kifejezést a (2.34.) mintájára megoldjuk, és ezt az els egyenletbe helyettesítjük, akkor a következket kapjuk: X2 = b*aX1 X1 = bX1+a(b*aX1)+ = (b+ab*a)X1+ Ismét a (2.34.) megoldó képletet alkalmazva ezúttal az X1 halmazra, majd a kapott eredményt visszahelyettesítve az egyenletrendszert megoldhatjuk. X1 = (b+ab*a)* X2 = b*a(b+ab*a)* Mint látjuk, mindkét halmazt az a és b karakterekbl álló jelsorozatok alkotják, ahol a b karakterek száma és elhelyezkedése tetszleges, az a karakterek száma az els halmaz esetében páros a másodikéban páratlan. Könny belátni, hogy ez a módszer bár kissé hosszadalmas, az egyenletek illetve ismeretlenek számától függetlenül alkalmazható. Szeretnénk érzékeltetni, hogy a reguláris nyelvtanok éppen a reguláris halmazokat generálják. Ehhez elször azt lássuk be, hogy a halmazokra felírt olyan ,,lineáris" egyenletrendszer megoldásai, amelynek ,,együtthatói" reguláris halmazok, szintén reguláris halmazok lesznek. Ez valóban így van, hiszen a megoldás során a (2.34.) összefüggés felhasználásakor és a behelyettesítéskor csupa olyan mveletet ­ unióképzés,

74

2.6. Reguláris halmazok

konkatenáció, tranzitív lezárás ­ végzünk a reguláris halmazokon, amely nem vezet ki a reguláris halmazok világából. Ugyanakkor minden reguláris halmaz felírható mint egy halmazegyenlet megoldása, ha másképpen nem megy egyenlség formájában. Ezek szerint az említett egyenletrendszerek megoldásaiból alkotott halmaz, és a reguláris halmazok alkotta halmaz azonos. Egy reguláris nyelvtan által generált nyelv megadható, mint egy egyenletrendszer megoldása. Ez azonnal kiadódik, ha a nyelvtan nemterminális szimbólumainak nyelvi értelmezést adunk. Minden nemterminális szimbólum jelentse azon jelsorozatok halmazát, amelyeket a szóban forgó nemterminális szimbólumból a nyelvtani szabályok segítségével levezethetünk. Itt most visszaköszön az a felfogás, amikor a véges automaták állapotaihoz egy nyelvet rendeltünk, nevezetesen azt a nyelvet, amelyet az automata az adott állapot mint kezdállapot mellett elfogad. Ebben a szellemben a helyettesítési szabályoknak új értelmezést adhatunk. Az S aA átírási szabály azt mondja, hogy minden olyan jelsorozat beletartozik az S nemterminális szimbólumból levezethet jelsorozatok halmazába, amely az a terminális szimbólummal kezddik, és azt egy az A nemterminális szimbólumból levezethet jelsorozat követ. Ez az interpretáció teljesen korrekt, és megegyezésben van eddigi értelmezésünkkel. Világos, hogy ebben a felfogásban a nyelvet a mondatszimbólum reprezentálja. Amennyiben egy nemterminális szimbólum több szabály baloldalán szerepel, akkor a szóban forgó nemterminálisból származtatott jelsorozatok bármely szabály alapján generálhatóak. Nyilvánvaló, hogy a teljes nyelvet az egyes szabályok alapján generált jelsorozatok uniója szolgáltatja. Példaként vegyük a következ nyelvtant: S bS S aA S A aS A bA Jelöljük az unió mveletét itt is a + operátorral, akkor az S és A nemterminálisok által reprezentált nyelvek az alábbiak szerint írhatók fel: S = bS+aA+ A = aS+bA Nem kell különösebb éleslátás ahhoz, hogy felismerjük ezekben az összefüggésekben a korábban már tárgyalt egyenleteket. Az eltérés csupán annyi, hogy ott az ismeretlenek jelölése X1 és X2 volt. Azt sem nehéz felismerni, hogy ez a nyelvtan a páros számú a karaktert tartalmazó jelsorozatokat generálja. A módszer, amely a nemterminális szimbólumok új értelmezésébl következik, közvetlenül szolgáltatja azt az algoritmust, amellyel bármely reguláris nyelvtanból reguláris halmazokra felírt egyenletrendszer származtatható. Ebbl következik, hogy minden reguláris nyelvtan által generált nyelv reguláris halmaz.

2. Reguláris nyelvek

75

Amennyiben a reguláris halmazt meghatározó egyenletrendszer együtthatói puszta karakterek, akkor triviális, hogy ezek a reguláris halmazok egyúttal reguláris nyelvek. Amennyiben ezek az együtthatók bonyolultabb kifejezések más utat követhetünk. A (2.27.) meghatározta, milyen halmazokat tekintsünk reguláris halmazoknak. Tételezzük fel, hogy P és Q reguláris nyelvek, ekkor P-hez is, Q-hoz is tartozik olyan véges automata, amely ezeket a halmazokat elfogadja. A 2.24. ábra tünteti fel a (2.27.) összefüggésekben definiált reguláris halmazokhoz tartozó automatákat.
a Ø {}

{a}

P Q
P+Q



P



Q



PQ

P


P*

2.24. ábra Az els három automata értelmezése triviális. A továbbiakban a P és Q betkkel jelöltük szimbolikusan azokat az automatákat, amelyek a P illetve Q reguláris halmazokat elfogadják. Minthogy a P és Q automaták szintén reguláris halmazokat elfogadó automaták, ezek tovább felbonthatóak, és ezt az eljárást rekurzíve folytatva végül a három els automatához kell jutnunk. Ha tehát sikerül megmutatnunk, hogy ezek az automaták megvalósíthatóak, akkor igazoltuk, hogy minden reguláris halmaz véges automatával elfogadható, és a reguláris nyelvek halmaza azonos a reguláris halmazok halmazával. Az ábrákban az feliratú nyilak ezekben az automatákban úgynevezett -mozgásokat reprezentálnak. Az unióképzésnél a kezd- és elfogadó állapotokat csak akkor lehet közvetlenül egyesíteni, ha a kezdállapotokba nem térhetünk vissza, és az elfogadó állapotokból nem vezet ki nyíl. Ellenkez esetben ugyanis, mint azt már megbeszéltük, az egyik automatában egy kört futva fordulhatunk át a másik

76

2.6. Reguláris halmazok

automatába, és így egyik nyelvhez sem tartozó jelsorozatokat is elfogadhatunk. Hasonló probléma léphet fel a konkatenáció és a tranzitív lezárás esetében is. Könny belátni, hogy az -mozgások illetve az -nyilak alkalmazása segít ezen a bajon. Az ilyen -mozgások, illetve -nyilak használata az automataelméletben teljesen legális. A matematikai nyelvészet apostola Chomsky azonban nem engedélyezte az ilyen mozgásokat a 3-as nyelvosztályban. Itt rögtön felmerül az a kérdés, hogy az -szabályok számzése nem csökkenti-e az automaták erejét. A válasz most is negatív. Minden olyan -szabályokat is tartalmazó automatához szerkeszthet olyan, ilyen eretnekséget nem mutató automata, amely ugyanazt a nyelvet fogadja el. A bizonyítás ismét konstruktív lesz, vagyis megszerkesztjük az eredeti automatával egyenérték, de -szabályt nem tartalmazó automatát. A 2.25. ábrán egy automata olyan részletét tüntettük fel, amely -nyilat is tartalmaz.
x z w y

x x z

y

x

y w

w

z

w

2.25. ábra Az ábrán ügyeltünk arra, hogy mind az -nyíl kiinduló mind célállapotánál legyenek befutó és kimen nyilak is. Az ábra két lehetséget is mutat az -nyíl elhagyására. Mindkét ábrán kiemeltük az -nyilat. Az els részábrán azokat a nyilakat multiplikáltuk, amelyek az -nyíl kiinduló állapotába vezettek. A multiplikált nyilak a célállapotba mutatnak.

2. Reguláris nyelvek

77

Világos, hogy minden valódi, nem -mozgást itt is végre tudunk hajtani. Ezen túlmenen egyetlen mozgással tudjuk megoldani azoknak a mozgáspároknak modellezését, ahol egy valódi mozgást egy -mozgás követ. A második megoldásnál azokat a nyilakat multiplikáltuk, amelyek az -mozgás célállapotából indulnak ki. Minden ilyen nyílhoz tartozik egy olyan nyíl, amely az -mozgás induló állapotából ered. A valódi mozgások itt is megmaradnak, de egyetlen mozgással modellezzük azokat a mozgáspárokat is, amelyeknek els eleme az -mozgás. Nyilvánvaló, hogy az eredeti és a módosított automata ugyanazt a nyelvet fogadja el. Ha az automatában több -nyíl van, akkor ezeket külön-külön ezzel a módszerrel kiemelhetjük az automatából. A két lehetség közötti választás általában rajtunk áll. Ha kedvünk úgy tartja azokat a mozgáspárokat modellezzük egyetlen mozgással, amelyeknek els eleme az -mozgás, de dönthetünk másképpen is. Általános esetben. Ha azonban az -nyíl az automata kezdállapotából indul ki, akkor természetesen csakis olyan modellezést választhatunk, ahol az els mozgás az -mozgás. Ugyanígy ha az -mozgás egy elfogadó állapotba vezet, akkor éppen ellenkezleg azokat a párokat kell egyetlen valódi mozgással modelleznünk, ahol a második mozgás az -mozgás. Ilyenkor tehát nem rajtunk, hanem az automatán áll a választás. Most már úgyszólván minden esetet megvizsgáltunk. Egy eset azonban még hátra van. Mit tegyünk akkor, ha az -nyíl kezdállapotból elfogadó állapotba vezet. Sajnos ilyenkor elbb el kell érnünk, hogy a kezdállapotba ne vezessen, és az elfogadó állapotból ne induljon ki nyíl. Erre már ismeretes a módszer, amely itt is, tehát -nyilakat is tartalmazó automatáknál is alkalmazható. Itt persze elfordulhat az a kellemetlen eset, amikor az átalakítás során mi hozunk létre új -nyilakat. Feltételezve, hogy ezt a munkát elvégeztük, van egy automatánk, amelynek kezdállapotából csak kiindulnak, elfogadó állapotába viszont csak befutnak nyilak. Ezen nyilak között van egy -nyíl, amely a kezdállapotból az elfogadó állapotba vezet. Vizsgáljuk meg, mikor kerülhet sor ennek a nyílnak felhasználására. Minthogy a kezdállapotba visszatérni nem lehet, egyetlen lehetség, hogy evvel a nyíllal kezdjük a mozgássorozatot. Amint azonban megérkezünk az elfogadó állapotba, a sorozat befejezdik, hiszen az elfogadó állapotnak csak befutó nyilai vannak. Ez a mozgássorozat tehát csak egyetlen mozgásból áll, és azt dokumentálja, hogy az üres jelsorozat eleme a nyelvnek. Ezt az -nyíl elvétele után úgy modellezhetjük, hogy a kezdállapotot is elfogadó állapottá nyilvánítjuk.

78

2.6. Reguláris halmazok

Miután a kényes, a kezdállapotot elfogadó állapottal összeköt nyilat kiküszöböltük, a megmaradt illetve az átalakítások során keletkezett nyilakat az ismert módon szüntethetjük meg. Ezt a folyamatot szemlélteti a 2.26. ábra.

x z w z z y x

y y

w



x z z

y y w z z x x x y

y

w w

2.26. ábra Így bármilyen legyen is az -nyilak helyzete, mindig tudunk egy olyan véges automatát szerkeszteni, amely ugyanazt a nyelvet fogadja el, és nem tartalmaz -nyilat. Ezzel igazoltuk azt az állításunkat, hogy az -mozgások megtiltása nem csökkenti az automata erejét.

3. Környezetfüggetlen nyelvek
3.1 A levezetési fa
Mint már említettük azokat a nyelveket nevezzük környezetfüggetlen nyelveknek, amelyeket a 2-es nyelvosztályba tartozó nyelvtanok generálnak. Az ilyen nyelvtanoknak csak A (3.1.) alakú levezetési szabályai lehetnek. Adott esetben a környezetfüggetlen jelz arra utal, hogy egy mondatszer formában a (3.1.) mintájú helyettesítési szabály az A nemterminális környezetétl függetlenül, bárhol alkalmazható. A helyettesítési szabályok formáját tekintve a környezetfüggetlen nyelveket generáló nyelvtanok nagyobb szabadságot élveznek, mint a reguláris nyelveket generálóak. Ez egy sereg új, eddig el sem adódó problémát vet fel, amelyeket megpróbálunk az alábbiakban bemutatni, és ha lehet megválaszolni. Lássunk ezért egy példát környezetfüggetlen nyelvre: E E+T T T TF F F (E) a (3.2.) Engedtessék meg, hogy ehhez a nyelvtanhoz, amellyel még sokszor lesz dolgunk, néhány megjegyzést fzzek. Ez annál is inkább indokolt, mert a fenti nyelvtan jelentsége messze túlmutat a példán. Ami a leírás formalizmusát illeti, konvencióinkat csak részben tartottuk be. A nemterminális szimbólumokat elírásszeren latin nagybetkkel jelöltük, kis jóindulattal még azt is mondhatjuk, hogy az ábécé elejérl. A terminális szimbólumok közé azonban az a szimbólum mellett konvenciónkkal ellentétben a +, , ( és ) szimbólum is bekerült. Vigyázat! Itt tehát a zárójel nem a nyelvtant leíró metanyelv szimbóluma, hanem a generált nyelv egy, pontosabban egy-egy karaktere. Annak oka, hogy jelen esetben feladtuk a latin kisbetk alkalmazására vonatkozó megállapodásunkat az, hogy ezeknek a szimbólumoknak ebben a nyelvben konvencionális jelentésük van, nevezetesen az összeadás illetve szorzás operátora, továbbá a kezd- és végzárójel. A mondatszimbólum jele itt nem S, mint azt megszoktuk. A nemterminális szimbólumok jele ugyanis szintén jelentést hordoz, adott esetben a számítástechnikában széltében-hosszában használt angol nyelven (E ­ expression, T ­ term, F - factor). A nyelvtan felírásánál éltünk azzal az egyszersít jelölésmóddal, hogy az azonos baloldalakat csak egyszer írtuk le, a jobboldalakat pedig a vagy olvasatú jellel választottuk el egymástól. Tételezzük fel, hogy az a terminális szimbólum egy azonosító, vagy egy szám helyett áll. Ekkor világossá válik a nyelv ,,értelme", a nyelvtan egy additív + és egy multiplikatív * operátort tartalmazó, és a zárójelezést megenged aritmetikai kifejezéseket generálja.

80

3.1. A levezetési fa

Megjegyzem, hogy pontosan a fenti mintára be lehetne vezetni a -, / és operátorokat a kivonás, osztás és hatványozás mveletére, de nem okozna számottev nehézséget a + és - monadikus operátorok, eljelek bevezetése sem. Természetesen egy igazi számítástechnikai nyelv aritmetikai kifejezéseket generáló CF nyelvtana tartalmazza mindezeket. Mondanivalónk demonstrálására azonban elegend, ha a nyelv összesen két különböz precedenciájú operátort tartalmaz, és lehetség van a precedencia zárójelezés útján való megtörésére. Éppen ezért részben az áttekinthetség növelése érdekében, részben papírtakarékossági okokból megelégszünk a (3.2.) nyelvtannal. A nyelvnek nyilvánvalóan eleme az a+aa jelsorozat. Ezt az alábbi levezetés igazolja: E E+T T+T F+T a+T a+TF a+FF a+aF a+aa Ez tehát a mondat levezetése. Pontosabban egy levezetése, hiszen a mondatot másképpen is le lehet vezetni. Demonstráljuk ezt ennek a mondatnak egy másik levezetésével. E E+T E+TF E+Ta E+Fa E+aa T+aa F+aa a+aa Amennyiben egy mondatszer formában egynél több nemterminális szimbólum van, akkor szükségszeren egynél több levezetés létezik, hiszen a következ mondatszer formát különböz nemterminálisokat helyettesítve kaphatjuk meg. Rögtön felmerül a kérdés, okoz-e zavart, és ha igen mikor az a tény, hogy egy mondatnak egynél több levezetése van. Erre a választ a levezetési fák bevezetése adja meg. Ábrázoljuk a levezetést egy rendezett, irányított fával. A rendezettség itt annyit jelent, hogy az egy csomópontból kiinduló élek sorrendje kötött, és nem változtatható meg. Így például a 3.1. ábrán feltüntetett két gráf nem egyenérték.

a

b

c
3.1. ábra

a

c

b

Mint említettük a levezetési gráf fa lesz, innen a levezetési fa elnevezés. A fa csomópontjainak a nemterminális, leveleinek pedig a terminális szimbólumok felelnek meg. A fa gyökere, ­ irányított gráfról van szó, ­ a mondatszimbólum. Minden csomópontból annyi él és abban a sorrendben fut ki, amennyi a szabály jobboldalán található szimbólumok száma és a kifutó élek végén sorban a jobboldal megfelel szimbólumai helyezkednek el.

3. Környezetfüggetlen nyelvek

81

Minden levezetésnek egy és csakis egy levezetési fa felel meg, ugyanakkor egy levezetési fához egynél több levezetés is tartozhat. Vegyük például nyelvtanunkat és mondatunkat. A 3.2. ábra tünteti fel a levezetési fát, amely mindkét levezetésre azonos.

E E T F
a +

T * F
a

T F
a
3.2. ábra

A levezetési fában az egyes csomópontokhoz tartozó részfákat szintaktikai egységeknek nevezzük. Minden levél, minden terminális szimbólum önmagában szintaktikai egységet alkot. Azokat a levezetéseket, amelyek levezetési fája azonos, tehát ahol a jelsorozat felbontása szintaktikai egységekre megegyez, nem tekintjük lényegesen különböz levezetéseknek. Vegyük észre, hogy a fenti nyelvtan ismeri az operátorok precedenciáját. Elbb kell ugyanis a szorzást elvégezni, az alkot egy szintaktikai egységet, és a szorzatot kell az els terminális szimbólumhoz hozzáadni, pontosan úgy, ahogy azt az iskolai tanulmányainkban tanultuk. Azonos precedenciájú operátorok esetében a nyelvtan az úgynevezett balról-jobbra szabályt alkalmazza. Ez annyit jelent, hogy két azonos precedenciájú, tehát adott esetben két + vagy két * operátor esetében elször mindig a baloldali operátorral meghatározott mveletet ,,hajtja végre". Fentiekbl következik, hogy amennyiben az aritmetikai kifejezéseket a (3.2.) nyelvtannal illetve annak kibvített változatával generáljuk, akkor a

82

3.1. A levezetési fa

szintaktikai egységek minden külön beavatkozás nélkül követik a precedenciákat, és a balról-jobbra szabályt. Az olyan nyelvtanokat, ahol minden mondathoz egy és csakis egy levezetési fa tartozik, egyértelm nyelvtanoknak mondjuk. Természetesen ez nem zárja ki, hogy egy mondatnak több levezetése legyen, ezek azonban nem lehetnek lényegesen különbözek. Egyértelm nyelvtanok esetében, minthogy a levezetési fa unikális, a szintaktikai felbontás egyértelm. A (3.2.) nyelvtan egyértelm nyelvtan. Mint említettük, és mint a példa is mutatja, egy mondatnak egyértelm nyelvtanok esetében is lehet több levezetése. A levezetések között vannak nevezetesek. Amikor a levezetés során mindig a mondatszer forma legbaloldalibb nemterminális szimbólumát helyettesítjük, baloldali levezetésrl beszélünk. Ugyanígy a jobboldali levezetés esetében mindig a mondatszer forma legjobboldalibb nemterminális szimbólumát bontjuk fel a következ lépésben. A példánkban éppen a baloldali és jobboldali levezetéseket demonstráltuk. Egyszersítsük most kissé nyelvtanunkat: E E+E EE (E) a (3.3.)

Ez a nyelvtan ugyanazt a nyelvet generálja, mint a (3.2.) szabályokkal megadott nyelvtan. Így a példaként megadott mondatot ezzel a nyelvtannal is lehet generálni: E E+E E+EE a+EE a+aE a+aa Próbálkozzunk most, mint elbb, egy másik levezetéssel: E EE Ea E+Ea E+aa a+aa A 3.3. ábrán megrajzoltuk a két levezetés levezetési fáit. Mind a két fát, ugyanis itt a fák nem azonosak, a két levezetés lényegesen különbözik.

E E
a +

E E * E
a

E E
a +

* E
a

E
a

E
a

3.3. ábra

3. Környezetfüggetlen nyelvek

83

Amennyiben csak a tartalmazás problémájára szorítkozunk, vagyis csak azt vizsgáljuk, generálható-e valamely jelsorozat egy adott nyelvtannal, akkor a (3.2.) és (3.3.) nyelvtanok egyenértékek. Lényegében ez a matematikai nyelvészet megközelítése. A számítástechnikai nyelvészeté szükségképpen más. A számítástechnikai nyelvészet szempontjából messzemenen nem közömbös, milyen szintaktikai egységeken keresztül jutottunk el a levezetés során a mondathoz. Példánkra gondolva létkérdés tudnunk, melyik mveletet kell elbb elvégeznünk, az összeadást vagy a szorzást. Éppen ezért a számítástechnika szempontjából a nem egyértelm nyelvtanok használhatatlanok. Az eddigi tapasztalatokat összegezve egy sereg a számítástechnika szempontjából nézve alapvetnek tekinthet kérdés vetdik fel. Az egy- illetve többértelmséget nyelvtanhoz és nem nyelvhez kapcsoltuk. Példánkban ez nyilván helyes volt, hiszen ugyanannak a nyelvnek egy egyértelm és egy többértelm nyelvtanáról volt szó. Vajon mindig ez a helyzet, vagy lehet-e a többértelmség nyelvi tulajdonság is? Ki lehet-e mutatni, hogy egy nyelvtan egyértelm-e, és ha nem, meg lehet-e állapítani, hogy létezik-e a nyelvnek egyértelm nyelvtana. Az els kérdésre a válasz megadható. Léteznek olyan nyelvek, amelyrl bizonyítható, hogy nem lehet egyértelm nyelvtannal generálni. Ez esetben tehát a többértelmség nyelvi tulajdonság. Más szóval nincsen minden környezetfüggetlen nyelvnek egyértelm nyelvtana. Ugyanakkor példánkra gondolva, ahol a többértelmség nyelvtanhoz volt kötve, rögzíthet, hogy a többértelmség egyszer nyelvhez másszor nyelvtanhoz kapcsolható tulajdonság. Lássunk példát nem egyértelm nyelvre. S aAbX YbCc A aAb ab C bCc bc X cX c Y aY a Ez a nyelvtan az L = aibicj ajbici nyelvet generálja. Az triviális, hogy az adott nyelvtan az aibici alakú mondatot két lényegesen különböz levezetéssel állíthatja el. Ezen túlmenen igazolható, hogy nincsen olyan egyértelm környezetfüggetlen nyelvtan, amely a szóban forgó nyelvet generálná. Itt tehát a többértelmség nyelvhez kapcsolható tulajdonság. A második kérdéscsoportra a válasz negatív. Sajnos nincs olyan módszer, amelynek segítségével általánosan, minden esetben alkalmazhatóan meg lehetne állapítani egy nyelv vagy egy nyelvtan egyértelm voltát. Ez is az algoritmikusan eldönthetetlen problémák sorába tartozik.

84

3.1. A levezetési fa

Mint említettük, az a tény, hogy egy kérdés algoritmikusan eldönthetetlen, vagyis a probléma megoldására nincs általános módszer, nem jelenti azt, hogy egyes konkrét, ebbe a feladatosztályba tartozó feladatra ne lehetne adott esetben választ adni. Persze nem minden egyedi feladatra, hiszen akkor a probléma algoritmikusan eldönthet lenne. Példaképpen igazoljuk, hogy a (3.2.) nyelvtan egyértelm. A mondatot alkotó jelsorozatot szintaktikai egységekre osztjuk, majd ezeket újabb, kisebb egységekre mindaddig, amíg a szintaktikai egységek egyetlen terminális szimbólumból nem állanak. Be kell látnunk, hogy ez a felosztás egyértelm. Induláskor a teljes jelsorozatot tekintjük szintaktikai egységnek, amelyet az E mondatszimbólumnak le kell generálnia. Két lehetségünk van, vagy az E E+T vagy az ET szabályt alkalmazhatjuk. Amennyiben a jelsorozat tartalmaz zárójelen kívüli additív operátort, + szimbólumot nyilván az els szabályt kell alkalmaznunk. Ellenkez esetben ugyanis a T nemterminális szimbólumot kapnánk, amely nem tud + operátort tartalmazó jelsorozatot generálni. Ha a jelsorozat nem tartalmaz + operátort akkor viszont a második szabály a helyes, hiszen az elst alkalmazva nem tudnánk mit kezdeni a generált + terminálissal. Tételezzük fel, hogy az els szabály kellett felhasználnunk. Ilyenkor a szabály + terminális szimbólumát megfeleltetjük a jelsorozat egyik + operátorának, az operátor eltti jelsorozat alkot egy szintaktikus egységet, amelyet a szabály E nemterminálisa generál majd, az operátort követ rész másik szintaktikus egység lesz, amelyet viszont a szabály T nemterminális szimbóluma állít el. Ezt vázolja a 3.4. ábra.

E E T

~~~~~~+~~~~~~+~~~+~~~~~~~~~~ 3.4. ábra Amennyiben jelsorozatban több zárójelen kívüli + operátor található szükségszer, hogy a szabály + szimbólumát az utolsó + operátorral azonosítsuk, hiszen ellenkez esetben a megfeleltetett + operátortól jobbra is maradna még + operátor, amit viszont a T nemterminális nem képes generálni. Így tehát csak egyetlen megfeleltetési lehetségünk van a jelsorozat levezetésében.

3. Környezetfüggetlen nyelvek

85

A baloldali szintaktikus egység felbontásánál, amelyet az E nemterminális generál, és amely tartalmazhat + operátorokat, az elbbi gondolatmenet rekurzív alkalmazásával érünk célt. Végül sikerül a jelsorozatot olyan szintaktikus egységekre bontani, amelyek már nem tartalmaznak zárójelen kívüli additív operátort, és amelyeket a T nemterminális szimbólumok generálnak. Itt a multiplikatív operátorok játszzák ugyanazt a szerepet, amelyet az elbb az additívak játszottak. Ha van zárójelen kívüli * operátor, akkor a T T *F szabályt kell alkalmaznunk, mégpedig úgy, hogy a szabály * terminálisát a szintaktikus egység utolsó * operátorának feleltetjük meg. Ellenkez esetben a T F szabály kerül sorra. Ezután csak olyan szintaktikus egységek maradnak, amelyek vagy zárójeles kifejezések, vagy egyedül az a terminális szimbólumból állanak. Az elbbi esetben az F (E) szabály után a zárójelen belüli kifejezésre alkalmazzuk a fenti algoritmust, az utóbbiban az F a szabállyal befejezzük az elemzést. A fentiekbl kitnik, hogy a (3.2.) nyelvtan alapján minden mondatot egyértelmen lehet csak felbontani, így csak egy levezetési fa tartozik hozzá, a nyelvtan egyértelm. A másik (3.3.) nyelvtan esetében találtunk olyan mondatot, és a mondathoz két különböz levezetést, amelyhez két különböz levezetési fa tartozik. Ezzel a nyelvtan többértelmségét demonstráltuk. Sajnos a gyakorlatban nem mindig sikerül vagy a nyelvtan egyedi tulajdonságait, vagy egy szerencsés ötletet felhasználva a nyelvtan egy- vagy többértelmségét bizonyítanunk. Ilyenkor a kérdés megválaszolatlan marad. Tekintsünk most egy pillanatra vissza, és vizsgáljuk meg, vajon felmerül-e egyáltalában az egyértelmség többértelmség kérdése reguláris nyelveknél! A levezetési fát természetesen reguláris nyelveknél is megrajzolhatjuk. Itt ez a fa nagyon egyszer lesz. Csupán egy szárból áll, amelynek jobb- vagy baloldalán vannak levelei attól függen, hogy bal- vagy jobbreguláris nyelvtanról van szó. Egy levezetési fához itt csak egy levezetés tartozik, ami abból nyilvánvaló, hogy minden mondatszer formában csak egyetlen nemterminális szimbólum szerepel. Nemdeterminisztikus nyelvtanok esetében elfordulhat, hogy egy mondatnak több, szükségszeren lényegesen eltér, különböz levezetési fája van. Korábban igazoltuk, hogy minden reguláris nemdeterminisztikus nyelvtanhoz található egy vele egyenérték, determinisztikus nyelvtan. Algoritmust is adtunk, amely a nemdeterminisztikus véges automata alapján megszerkeszti ezt a determinisztikus automatát. Ennek alapján rögzíthetjük, hogy minden reguláris nyelv egyértelm, és szerkeszthet hozzá egyértelm nyelvtan.

86

3.2. Nyelvtanok átalakítása

3.2. Nyelvtanok átalakítása
A környezetfüggetlen nyelvtanokkal kapcsolatosan eddig egyetlen megkötést említettünk. A nyelvtan levezetési szabályainak alakja a (3.1.) szerinti kell legyen. Célszerségi és esztétikai szempontból azonban további igényeket is támaszthatunk a nyelvtan külalakjával, a helyettesítési szabályok formájával kapcsolatosan. Az alábbiakban néhány ilyen többlet követelményt ismertetünk, és megadjuk azokat az algoritmusokat, amelyek segítségével az ezen követelményeket nem kielégít nyelvtanból egy, az eredetivel egyenérték és az új követelményeket is teljesít nyelvtan származtatható. Természetesen mindkét nyelvtan, az eredeti, az igényeket nem kielégít, és az ebbl kialakított szebb és célszerbb nyelvtan is környezetfüggetlen. Ha szabad klasszikusokra hivatkozni azt mondhatjuk, hogy mindkét nyelvtan környezetfüggetlen, de az utóbbi még környezetfüggetlenebb. Szóljunk elször a felesleges szimbólumokról! Egy terminális szimbólum akkor felesleges, ha nincs a nyelvnek olyan mondata, amelyben a szóban forgó szimbólum szerepelne. Egy nemterminális szimbólum akkor felesleges, ha nincs a nyelvnek olyan mondata, amelynek levezetésében található mondatszer formák legalább egyikben az illet nemterminális elfordulna. Legyenek valamely nyelvtanban érvényesek a következ levezetések: S w = xay
* * *

(3.4.)

SAw (3.5.) Amennyiben a (3.4.) és (3.5.) levezetések lehetségesek, akkor sem az a terminális, sem az A nemterminális szimbólum nem felesleges. A felesleges szimbólumok kiszrésére szolgáló algoritmus lényegében a szimbólumok nem felesleges voltát állapítja meg, és ezeket a nem felesleges szimbólumokat összegyjti. Ami marad, az felesleges. Legyen adott egy G grammatika. Képezzünk egy halmazsorozatot az alábbi szabályszerség szerint. Bi+1 = Bi { A A , Bi* } (3.6.) Ezek szerint a következ halmazt úgy kapjuk, hogy az elz halmazhoz hozzávesszük azokat a nemterminális szimbólumokat, amelyeknek létezik olyan levezetési szabálya, ahol a jobboldalon minden szimbólum az elz halmaz eleme. A halmazsorozat számossága egy határig monotonon növekszik. Nyilvánvaló, hogy amennyiben egy lépés alkalmával nem találunk új, a (3.6.) összefüggés értelmében az eredeti halmazhoz hozzáfzhet elemet, akkor a továbbiakban a halmaz számossága nem növekszik, a sorozat képzését abbahagyhatjuk.

3. Környezetfüggetlen nyelvek

87

Jelölje B az ily módon kapott legnagyobb számosságú halmazt. Amennyiben kiindulásul a terminális szimbólumok halmazát választjuk, B0 = akkor a B halmaz a terminális szimbólumokon kívül azokat és csakis azokat a nemterminális szimbólumokat fogja tartalmazni, amelyekbl kiindulva a helyettesítési szabályok alkalmazásával egy pusztán terminális szimbólumokból álló jelsorozat állítható el. Ezzel mintegy alulról felfelé bottom-up ­ innen adódik a B jelölés ­ fésüljük végig a grammatika szabályait, és csakis azokat a szimbólumokat vesszük be a halmazunkba, amelyekre nézve van remény, hogy nem feleslegesek. Vegyünk ismét egy halmazsorozatot, de válasszunk most más képzési szabályt. Ti+1 = Ti { X A X, A Ti } (3.7.) Új halmaz képzésekor tehát az eredeti halmazhoz hozzá kell venni azon helyettesítési szabályok jobboldalán található terminális és nemterminális szimbólumokat, amely szabályok baloldala az eredeti halmazhoz tartozó nemterminális szimbólum. A halmazsorozat számossága itt is monotonon növekszik, és itt is akkor áll meg a növekedés, ha egy lépésben nem tudunk az eredeti halmazhoz egy szimbólumot sem hozzáfzni. Jelölje itt a legnagyobb elemszámú halmazt T. Legyen a kiindulásként választott halmaz egyedül a mondatszimbólumot tartalmazó halmaz: T0 = { S } akkor a T halmaz azokat és csakis azokat a terminális és nemterminális szimbólumokat tartalmazza majd, amelyek egy, a mondatszimbólumból kiinduló levezetés mondatszer formáiban szerepelhetnek. Ezzel az algoritmussal felülrl lefelé top down ­ innen a T jelölés ­ fésüljük meg a grammatika szabályait. Lássunk egy példát. Legyen a grammatika: S a S B B BC C b A nyelvtant alulról felfelé megfésülve a következ halmazsorozatot kapjuk: B0 = { a,b } B1 = B = { a,b,S,C } A halmaz számossága tovább nem növelhet. Mint látható a B nemterminális szimbólum nem került bele a halmazba, így feleslegesnek bizonyult. Ezt a szimbólumot tehát, és minden olyan helyettesítési szabályt, amelyben ez a szimbólum szerepel, kihagyhatunk a nyelvtanból. Ez most így megkurtítva mindössze egy tartalmaz: Sa Cb

88

3.2. Nyelvtanok átalakítása

Ezt a nyelvtant felülrl lefelé fésülve a következ halmazsorozatot kapjuk: T1 = T = { S,a } T0 = { S } Végeredményben tehát a nyelvtan egyetlen helyettesítési szabályt tartalmaz, S a és egyetlen mondatot generál. Amennyiben a fésülést fordított sorrendben végeztük volna el, vagyis elször alkalmaztuk volna a top down és utána a bottom-up vizsgálatot, akkor az elbbitl eltér eredményt kaptunk volna. A nyelvtannak helytelenül két szabálya, nevezetesen S a és C b is megmaradt volna. Így tehát a kígyó a fejétl a farkáig nem ugyanolyan hosszú, mint a farkától a fejéig. Ennek a látszólagos ellentmondásnak a forrását azok a nemterminális szimbólumok képezik, amelyekbl nem vezethet le terminális jelsorozat. Ilyen példánkban a B nemterminális. Ha egyszer ilyen nemterminálisok bekerülnek egy mondatszer formába, akkor azokat onnan hosszabb távon sem lehet kiebrudalni, az ilyen nemterminálisokat nem lehet agyonütni. Az ilyen agyonüthetetlen nemterminálisok természetesen felesleges szimbólumok, hiszen bellük nem vezethet le csupa terminálisból álló jelsorozat. Ezeket a szimbólumokat az alulról felfelé történ fésüléskor felismerjük, de nem detektáljuk felesleges voltukat, ha lefelé fésülünk. Vizsgáljuk meg, miért nem lehet ezeket a nemterminálisokat, ha egyszer belekerültek a mondatszer formába, onnan kiirtani. Ha valamely szimbólumhoz nem tartozik olyan levezetési szabály, amelynek éppen a szimbólum lenne a baloldala, akkor triviális, hogy ez a szimbólum onnan el nem távolítható, örökre benne marad a mondatszer formában. A B szimbólum esetében nem ez a helyzet, mégsem tudunk megszabadulni tle, nem kaphatunk belle terminális jelsorozatot. Ennek jobb megértésére célszer megismerkednünk a rekurzivitás fogalmával. Egy nemterminális szimbólumot rekurzívnak mondunk, ha származtatható belle olyan jelsorozat, amely az eredeti szimbólumot tartalmazza. A A (3.8.) Egy nyelvtan akkor rekurzív, ha tartalmaz rekurzív nemterminálist. Nem rekurzív nyelvtanok csak véges mondatot generálnak. Minden véges nyelv reguláris nyelvtannal generálható. Ezek igazolását az olvasóra bízom. A fentiekbl következik, hogy minden végtelen sok mondatot generáló nyelvtan rekurzív. Természetesen a rekurzív nyelvtanoknál mindig kell találnunk egy egérutat, egy olyan levezetési lehetséget, amikor a rekurzivitást elidéz nemterminális szimbólum többet nem fordul el. Pontosan ugyanúgy, ahogy egy rekurzív eljáráshívást alkalmazó program esetében, itt is kötelez egy olyan alternatíva, amikor az eljárást nem hívjuk meg rekurzív módon.
*

3. Környezetfüggetlen nyelvek

89

Így például az alábbi formálisan helyes, a szintakszis szabályait kielégít ALGOL 60 nyelven írt programfragmens nem rekurzív eljárást tartalmaz, hanem egyszeren badarság. integer procedure FACT (N); value N, integer N; FACT := N * FACT(N-1); Nyilvánvaló, ha egyszer meghívtuk ezt az eljárást, akkor az ­ elvben ­ soha az életben nem hagyja abba a számolást. Nevezzük ezt az ostobaságot álrekurzivitásnak. Mieltt továbbmennénk, mutassuk meg az elbbi, a faktoriális kiszámítására hivatott program helyes változatát: integer procedure FACT (N); value N, integer N; FACT := if N=0 then 1 else N * FACT(N-1); Mint látható az N=0 esetre van egérutunk. Itt persze feltételeztük, hogy az eljárást csak nem negatív számokkal mint aktuális paraméterekkel hívjuk meg. Ha ez a feltétel nem biztosítható, akkor valamilyen ellenrzést, védelmet kell a programba beépítenünk. Az álrekurzió ugyanúgy fenyeget minket nyelvtanok esetében. Itt is elfordulhat, hogy egy alkalmas nemterminális szimbólum, ha egyszer bekerült a mondatszer formába, ott is ragad, nem tudunk tle szabadulni. Pontosan ez a helyzet a B szimbólummal. Minthogy ez álrekurziót okoz nincsen olyan mondat, amelynek levezetésében a B szerepelhetne, így természetesen felesleges szimbólum. Példánkban a rekurzivitás közvetlen volt, a levezetési szabály baloldalán található szimbólum szerepelt ugyanazon szabály jobboldalán is. Ez persze nem szükségszer. Lehetséges, hogy a szimbólum csak több levezetési lépés után tér vissza. Ebben az esetben álrekurzióról akkor beszélünk, ha ebbl az ördögi körbl nem tudunk kilépni, az egyszer már elfordult nemterminális újabb felbukkanása elkerülhetetlen. Vegyük észre, hogy az álrekurzióval szemben a két fésülés, a felülrl lefelé és az alulról felfelé történ, másképpen viselkedik. Alulról fésülve az ilyen szimbólumok átcsúsznak a fés fogain, és feleslegesnek minsülnek. Felülrl lefelé azonban az álrekurzió ténye nem detektálható, az ilyen szimbólumok benne maradnak a nyelvtanban. Amennyiben a fésülést az álrekurziót kiszr módon alulról kezdjük, akkor két fésüléssel valóban minden felesleges szimbólumtól megszabadulunk. Ezt beláthatjuk, ha meggondoljuk, hogy a bottom-up fésülés eltünteti mindazokat a nemterminálisokat, amelyekbl nem vezethet le terminális jelsorozat. Így a (3.5.) összefüggésben az A nemterminális nyilván nem ilyen szimbólum, ha egyszer fennakadt a fésn.

90

3.2. Nyelvtanok átalakítása

A második top down fésülésnél viszont csak azok a szimbólumok maradnak meg, amelyek elérhetek az S mondatszimbólumból. Amennyiben az A nemterminális túlélte mindkét fésülést, akkor az SA w * alakú (3.5.) összefüggésben mind az els, mind a második operátorral jelzett levezetése helytálló, ugyanis a fenti gondolatmenet nem csak az A nemterminálisra, hanem az és jelsorozatokban esetleg található nemterminálisokra is alkalmazható. A következkben az A alakú úgynevezett -szabályok kiküszöbölésérl szólunk. Már említettük, hogy a környezetfügg, vagyis 1-es osztályú nyelveket nem csökkent nyelvtanok generálják. Az -szabályok, ahol a baloldal hossza 1, a jobboldalé viszont 0 természetesen csökkent szabályok. Minthogy a reguláris és környezetfüggetlen nyelvek a környezetfügg nyelvek részhalmazai, hogyan engedhet meg -szabályok alkalmazása ezekben a nyelvosztályokban? Az a helyzet, hogy majd finomítanunk kell a nyelvosztályok definícióján, de elbb vizsgáljuk meg az -szabályok kiküszöbölési lehetségeit. Fésüljük most meg ismét alulról az eredeti nyelvtant, válasszuk azonban most induló halmaznak az üres jelsorozatot! B0 = { } Nyilvánvaló, hogy most a záróhalmazban azok a nemterminális szimbólumok találhatóak, amelyek elenyészhetnek, vagyis amelyek az -szabályok alkalmazása révén közvetlenül vagy közvetve utód és nyom nélkül eltnhetnek a mondatszer formából. Itt különbséget kell tennünk két eset között, eleme-e ennek a halmaznak a mondatszimbólum vagy sem? Amennyiben a mondatszimbólum benne van ebben a halmazban, akkor a mondatszimbólum is elenyészhet, belle kiindulva le tudjuk vezetni az üres jelsorozatot, az eleme a nyelvnek. Ellenkez esetben, tehát amikor a mondatszimbólum nem eleme a halmaznak, a mondatszimbólum nem enyészhet el, az üres jelsorozat nem eleme a nyelvnek. Az els esetben, amikor a nyelv tartalmazza az üres jelsorozatot, állítsuk el a nyelvet két nyelv uniójaként. Az els komponensnek egyetlen eleme lesz, az üres jelsorozat, míg a másodiknak mondatai az üres jelsorozat kivételével megegyeznek az eredeti nyelv mondataival. Jelölje, mint eddig, Le azt a nyelvet, amelynek egyetlen mondata az üres jelsorozat. Az L nyelvet tehát, amely feltételezésünk szerint tartalmazza az üres jelsorozatot, a következképpen állítjuk el
* *

3. Környezetfüggetlen nyelvek L = (L ­ Le) Le

91 (3.9.)

Az L - Le formalizmus az üres jelsorozattól megfosztott eredeti nyelvet jelenti. Az Le nyelvtana csak egyetlen szabályt tartalmaz: Q ahol itt azért jelöltük a mondatszimbólumot Q betvel, mert feltételezésünk szerint S már le van foglalva az eredeti nyelv mondatszimbólumának. A (3.9.) nyelv mondatszimbólumát jelöljük P betvel, akkor az eredeti nyelv szabályait a következ szabályokkal kell kiegészítenünk: PQ Q PS Ha most újra elvégezzük az eredeti nyelvtan vizsgálatát, akkor ugyanazt az eredményt másképpen kell interpretálnunk. A régi mondatszimbólum, amely bekerült az elenyész nemterminálisok közé, mondatszimbólum rangját elvesztette, így ennek az új nyelvnek nem eleme az üres jelsorozat, ugyanakkor valamennyi ettl eltér mondat legenerálható. Ez megfelel a fentebb vázolt koncepciónknak. Hogyan lehet egy nyelvtanból, amely nem generálja az üres jelsorozatot, az -szabályokat eltávolítani? Hagyjuk el az összes -szabályt, de ugyanakkor az olyan levezetési szabályoknál, ahol a jobboldalon szerepelnek elenyész nemterminálisok, az összes lehetséges konfigurációban hagyjuk el ezeket a nemterminálisokat. Az elhagyottakról feltételezzük, hogy elenyésznek, a megmaradt többirl éppen ellenkezleg azt tesszük fel, hogy bellük nem üres jelsorozatok származnak. Azzal modellezzük tehát az -szabályokat, hogy amennyiben feltételezésünk szerint egy nemterminális elenyészik, akkor azt be sem írjuk a levezetési szabályba. Persze ez nagyon megnövelheti a nyelvtant, így ha egy levezetési szabály jobboldalán k elenyész szimbólum van, akkor ebbl az egyetlen helyettesítési szabályból 2k új szabály származhat. Visszatérve a nem csökkent nyelvtanok problémájára definiáljuk újra az els nyelvosztály nyelveit. Minden olyan nyelvet 1-es osztálybelinek tekintünk, amely, ha nem tartalmazza az üres jelsorozatot, akkor elállítható nem csökkent nyelvtan segítségével, ha tartalmazza, akkor viszont elállítható két nyelv uniójaként, ahol az els nyelvnek egyetlen mondata van, az üres jelsorozat, a második pedig az eredeti nyelv valamennyi az üres jelsorozattól eltér mondatát tartamazza, és nem csökkent nyelvtannal generálható. Ez az új felfogás feloldja az ortodox értelmezés miatt jelentkez ellentmondásokat. Ezek szerint, ha van egy olyan környezetfüggetlen nyelvtanunk, amelyben vannak -szabályok, akkor a fentiek szellemében át kell a nyelvtant alakítanunk, hogy a nyelv a környezetfügg, tehát nem csökkent nyelvek részhalmazába tartozzék? Szó sincs róla. Az osztályba sorolás nyelveket és nem nyelvtanokat

92

3.2. Nyelvtanok átalakítása

említ. Ha meggyzdtünk róla, hogy a nyelvnek van a csökkentés tekintetében enyhített kritériumokat kielégít nyelvtana, akkor ebben megnyugodhatunk, és rajtunk áll, hogy eltávolítjuk-e az -szabályokat vagy sem. Lássunk egy példát az -szabályok kiküszöbölésére. Legyen a nyelvtan: S SaSb A nyelvtan, mint arról könnyen meggyzdhetünk, olyan azonos számú a és b karakterekbl álló jelsorozatokat generál, ahol a mondatok bármely prefixumában legalább annyi a karakter van, mint b karakter. Elemezzük ezt a nyelvtant. A fésülés során keletkezett halmazsorozat: B0 = { } B1 = B = { , S } A mondatszimbólum benne van a záróhalmazban, minthogy a nyelvnek eleme. Az ismertetett módon új mondatszimbólumot, legyen ez , és új levezetési szabályokat kell bevezetnünk S Az eredeti nyelvtanból az -szabályt elhagyva mindössze egy szabályunk marad. Ennek jobboldala viszont két elenyész szimbólumot tartalmaz. Így helyette 22 = 4 új szabályt kell bevezetnünk: S SaSb S aSb S Sab S ab A teljes nyelvtan: S S SaSb S aSb S Sab S ab Minthogy az eredeti nyelv tartalmazta az üres jelsorozatot, az átalakítás eredményeképpen két nyelv unióját kaptuk. Az els nyelvnek csak egyetlen eleme van, az üres jelsorozat, a másik nyelv nyelvtana nem tartalmaz -szabályt, és generálja az eredeti nyelv minden mondatát az kivételével. Míg az eredeti nyelvtan alapján nem túl nagy fáradtsággal a nyelv felismerhet volt, a módosított nyelvtanról már ez kevésbé állítható. Ezzel az átalakítással az áttekinthetséget feláldoztuk az ortodoxia oltárán. Általában gyakori, hogy egy nyelvtan világosabb és áttekinthetbb, mint -szabályokat nem tartalmazó egyenértékese. Ez is egyik oka annak, hogy az irodalom meglehetsen nagyvonalú ezen a területen. Meghagyja a régi nyelvtant és megelégszik azzal a megnyugtató tudattal, hogy ki lehetne küszöbölni az -szabályokat. A nyelvtanok csinosságának növelésére szolgáló következ lépés az úgynevezett egyszeres szabályok kiküszöbölése lesz. Mint már említettük egyszereseknek nevezzük az AB (3.10.) alakú szabályokat. Rögtön felmerül a kérdés, miért nem szeretjük ezeket a szabályokat, miért zavarnak minket?

3. Környezetfüggetlen nyelvek

93

Valójában az egyszeres szabályok léte csak akkor zavaró, ha ciklicitás van bennük, mint például az AB BC CA szabályok esetében. Általában egy mondat levezetésére korlátos számú véges lépés szükséges. Amennyiben azonban ciklicitás van az egyszeres szabályok között, akkor levezetési lépésekkel vissza tudunk térni ugyanahhoz a mondatszer formához, más szóval lesznek olyan mondatok, amelyeket nem korlátos számú lépésben is le lehet vezetni. Ez valóban nem szimpatikus jelenség. Persze egyszeres szabályok jelenléte még nem jelent szükségszeren ciklicitást, ennek veszélyét viszont legegyszerbben és legdrasztikusabban az egyszeres szabályok kiirtása útján lehet elhárítani. Ha nincs egyszeres szabály, akkor bizonyosan nincs ciklicitás. Kiküszöbölésük algoritmusa a következ lehet. Emeljük ki a nyelvtanból az egyszeres szabályokat, és a továbbiakban azt a nyelvtant vizsgáljuk, amely csak ezekbl az egyszeres szabályokból áll. Megnézzük, hogy ebben a nyelvtanban, tehát az egyszeres szabályokban hány nemterminális szimbólum van. Ez után alkalmazzuk a felülrl lefelé való fésülést olymódon, hogy kiinduló halmazként rendre egy-egy ilyen nemterminálist választunk. Az egyes fésülések eredményként kapott záróhalmaz nyilván azokat a nemterminálisokat tartalmazza, amelyek a kiindulásul választott nemterminális szimbólumból az egyszeres szabályok útján elérhetek. Az egyszeres szabályok elhagyásakor ennek megfelelen a nyelvtant új szabályokkal kell kiegészíteni. Ezen szabályok baloldala a kiindulásul választott nemterminális szimbólum lesz, jobboldala pedig megegyezik azon szabályok jobboldalával, amelyeknek baloldala a záróhalmazban található valamelyik nemterminális. Így állíthatjuk el egyetlen lépésben azt a mondatszer formát, amelyet az egyszeres szabályok esetleges alkalmazásának befejezése után kapunk. Állításaink nyilvánvalóak, így további magyarázatra nincsen szükség. Lássunk erre is egy példát. Legyen a nyelvtan a jól ismert aritmetikai kifejezéseket generáló nyelvtan: E E+T E T T TF T F F (E) F a Az egyszeres szabályok létét kiemelend itt most nem éltünk az azonos baloldalak nyújtotta egyszersít jelöléssel. Nyelvtanunk két egyszeres szabályt tartalmaz: ET TF

94

3.2. Nyelvtanok átalakítása

Az egyszeres szabályok három nemterminális szimbólumot tartalmaznak. Ennek megfelelen a felülrl való fésülést három ízben, az E, T és F szimbólumokból kiindulva kell elvégezni. Megállapodás szerint minden szimbólumból saját maga mindig elérhet, ha másképp nem, az egyszeres szabályok nullaszor való alkalmazásával. A három vizsgálat záróhalmazait úgy különböztetjük meg, hogy indexként a kiinduló nemterminálisokat használjuk. TE = { E, T, F } TT = { T, F } TF ={ F } Ennek megfelelen az egyszeres szabályok elhagyásával egyidejen a következ új szabályokat kell bevezetni: E TF E (E) Ea T (E) Ta Így az új, egyszeres szabályokat most már nem tartalmazó nyelvtan: E E+T TF (E) a T T+F (E) a F (E) a Ezzel megkaptuk az ismert nyelvtanunkkal egyenérték, de egyszeres szabályt nem tartalmazó nyelvtant. szintén szólva, az egyszeres szabályok kiirtása nem emelte az áttekinthetséget. Ráadásul ez a nyelvtan ,,ártatlan" volt, amennyiben itt az egyszeres szabályokban nem volt ciklicitás. Éppen ezért nem kell feltétlenül ragaszkodnunk az egyszeres szabályok eltávolításához. Az angol irodalom az olyan nyelvtant, amely mentes a felesleges szimbólumoktól, nem, vagy csak az ismert korlátozással tartalmaz -szabályt, végül nincsen benne egyszeres szabály, proper grammar névvel illeti. Ennek a szóhasználatnak a magyar nyelven nincsen pontos egyenértékese, talán igazándi vagy tisztességes nyelvtan elnevezés volna megfelel. Engedtessék meg, hogy javaslatot tegyek a jólfésült nyelvtan megnevezés bevezetésére. Az eddigiekbl következik, hogy minden környezetfüggetlen nyelvtannak, bármilyen összegubancolódott legyen is, mindig van jólfésült egyenértékese.

3. Környezetfüggetlen nyelvek

95

3.3. Nyelvtanok normálalakjai
Az elbbiekben láttuk, hogyan lehet egy nyelvtanból az anomáliás, vagy legalábbis annak tartott struktúrákat kiiktatni. A továbbiakban megkötéseket teszünk az alkalmazható helyettesítési szabályok formája tekintetében. Azokat a nyelvtanokat, amelyek csak ezeket, a bizonyos szempontból egységes formájú szabályokat tartalmazzák a nyelv normálalakjainak, vagy normálformáinak nevezzük. Az els ilyen normálalakot még Chomsky javasolta. Az irodalomban használatos erre a CNF (Chomsky Normal Form) jelölés. Ebben a normálalakban csak kétféle alakú helyettesítési szabály engedélyezett: A BC Aa (3.11.) Az els formájú szabálynak az a lényege, hogy a jobboldalon két nemterminális áll. Természetesen a szabály három nemterminálisa közül bármelyik kett, st akár mindhárom is azonos lehet. Az alábbiakban igazoljuk, hogy minden jólfésült nyelvtannak van CNF egyenértékese. Bizonyításunk szokás szerint konstruktív lesz, vagyis addig alakítgatjuk az eredeti nyelvtant, persze ügyelve arra, hogy az átalakítások során a generált nyelv ne változzék, amíg végül egy Chomsky normálalakot nem kapunk. Az eredeti nyelvtannak persze lehetnek olyan szabályai is, amelyek eleve eleget tesznek a (3.11.) követelményeknek. Tekintsünk ezeket a szabályokat véglegesnek. Vezessünk be a többi, tehát a követelményeket nem teljesít szabályokban a terminális szimbólumok helyett nemterminálisokat, álnemterminálisokat. Amennyiben például az a terminálist akarjuk kiváltani, akkor vezessünk be helyébe egy  nemterminálist, és ezt írjuk minden elfordulási helyére. Ugyanakkor egészítsük ki szabályainkat egy Âa alakú szabállyal, amely szerencsés, de egyáltalán nem véletlen módon eleget tesz a Chomsky-féle követelményeknek, tehát véglegesíthet. Nyilvánvalóan ez az átalakítás nem érinti a generált nyelvet, hiszen az így bevezetett nemterminálist végül ­ más szabály nem lévén ­ az eredeti terminálissá kell átírni. Ezzel a Chomsky megkötéseknek eleget nem tev helyettesítési szabályok alakja csakis a következ lehet C C1 C2. . . Cn (3.12.) Itt n szükségképpen nagyobb kettnél, hiszen az eredeti nyelvtan jólfésült volt, tehát nem tartalmazott egyszeres szabályokat, ha viszont a jobboldalon két nemterminális állt, akkor eleget tett a követelményeknek, és így ,,véglegesítésre" került. Bontsuk fel most egy új nemterminális szimbólum bevezetésével a (3.12.) szabályt például a következképpen: C C11 1 C2C3. . . Cn (3.13.)

96

3.3. Nyelvtanok normálalakjai

A (3.12.) szabályt elhagyva, és helyette a fenti két új levezetési szabályt beiktatva látható, hogy az els rögtön kielégíti a követelményeket, míg a második szabály jobboldalának hossza eggyel rövidebb, mint eldjéé volt. Az a tény, hogy a módosítás nem érinti a generált nyelvet, nem igényel magyarázatot. A fenti vagy ezzel egyenérték felbontással tehát csökkenteni lehet a jobboldalak hosszát. Ezt kell kitartással folytatva a leghosszabb jobboldalt is kettre tudjuk redukálni. Ezzel viszont a kijelölt célt teljesítettük is, létrehoztunk egy az eredeti nyelvtannal egyenérték Chomsky normálalakot. Megjegyzem, hogy az S alakú szabály, ahol S a mondatszimbólum, mint egyetlen olyan -szabály, amely jólfésült nyelvtanokban elfordulhat, szintén Chomsky szabálynak minsül. Nélküle ugyanis nem lehetne olyan nyelv nyelvtanát Chomsky alakra hozni, amely az üres jelsorozatot tartalmazza. A fenti konstruktív bizonyítás alapján rögzíthet, hogy minden környezetfüggetlen nyelvtannak van egyenérték Chomsky normálalakja. Ez a normálforma nem unikális, hiszen az átalakításnál leválaszthattuk volna, például az utolsó két nemterminálist, vagyis a szalámit nem az elején, hanem a végén kezdtük volna szeletelni. De ez csak két lehetség a sok közül. Példaképpen hozzuk Chomsky normálalakra az alábbi nyelvtant: S aSb S ab A nyelvtan nyilvánvalóan az aibi i>0 nyelvet generálja. Írjuk át a terminális szimbólumokat nemterminálisokká. Szerencsére itt nem kell jelölési konfliktustól tartani, így a vesszzés elmaradhat. S ASB S AB Aa Bb Szerencsére a négy új szabály közül három rögtön megfelel a követelményeknek. Egyedül az els helyen álló szabályt kell tovább bontanunk: S AC C SB Ezzel a nyelv teljes Chomsky nyelvtana: S AC C SB S AB Aa Bb Mieltt az itt tárgyalt másik normálalak, a Greibach normálalak részleteiben elmerülnénk, szólnunk kell néhány szót a balrekurzióról, illetve annak megszüntetésérl. Már korábban tisztáztuk, mikor mondjuk egy nyelvtanról, hogy rekurzív. Az is kiderült, hogy a rekurzivitás a nyelv és nem a nyelvtan sajátja. Ebbl következik, hogy ha egy nyelvet generáló nyelvtan rekurzív, akkor minden, ezt a nyelvet generáló nyelvtan is szükségképpen rekurzív lesz. A rekurzivitást tehát nem lehet megszüntetni, egy rekurzív nyelvtannal csakis egy rekurzív nyelvtan lehet egyenérték.

3. Környezetfüggetlen nyelvek

97

Balrekurzívnak mondunk egy nyelvtant akkor, ha van olyan a rekurzivitásért felels nemterminális szimbólum, amelybl kiinduló levezetés során a szóban forgó nemterminális a legbaloldalibb pozícióban jelenik meg újból. A baloldali rekurzióra tehát a következ összefüggés írható fel: A A (3.14.) A balrekurzivitást alkalmas átalakításokkal meg lehet szüntetni. Természetesen a nyelvtan továbbra is rekurzív marad, csak ez a tulajdonság nem a baloldali rekurzió formájában jelentkezik. Itt rögtön felmerül az a kérdés, miért van erre szükség? Ha egyszer a rekurzió nem küszöbölhet ki, akkor nem mindegy, hogy ez milyen formában, hol jelentkezik? Messzemenen nem mindegy! Mint látni fogjuk, bizonyos egyszer szintaktikus elemz módszerek nem alkalmazhatóak, ha a nyelvtan balrekurzív. Így ennek megszüntetése nagyon is lényeges. Elöljáróban az úgynevezett közvetlen balrekurzió megszüntetését ismertetem. Közvetlen balrekurzióról beszélünk akkor, ha van a nyelvtanban A A (3.15.) alakú szabály, vagyis a balrekurzió már egyetlen helyettesítési lépés után jelentkezik. A (3.15.) alakú szabályok léte szembeszökvé teszi a balrekurzió tényét, hiányuk azonban nem biztosíték arra, hogy nincsen balrekurzió. Legyen A egy közvetlen balrekurziót okozó nemterminális. Soroljuk az A levezetési szabályait két halmazba aszerint, hogy közvetlen balrekurziót okoznak-e vagy sem. A A1 A2 . . . An (3.16.) (3.17.) A 1 2 . . . m Itt persze a jelsorozatok nem kezddhetnek az A nemterminálissal. Sem n sem m nem lehet zérus, hiszen akkor vagy az A szimbólum nem okozna közvetlen balrekurziót, vagy az álrekurziónak nevezett badarsággal volna dolgunk. Vezessük be a reguláris halmazoknál már alkalmazott jelöléseket, és legyen = 1 + 2 + . . . + n (3.18.) (3.19.) = 1 + 2 + . . . + m Ezzel a (3.16.) és (3.17.) egyenlet a következ alakot ölti: A = A + (3.20.) Könnyen belátható, hogy ebbl a kifejezésbl levezethet A * (3.21.) Az A nemterminális ugyanis csak akkor tnik el a jobboldal els helyérl, ha az A szabályt alkalmazzuk. Eltte viszont tetszlegesen sokszor
* *

98

3.3. Nyelvtanok normálalakjai

beleértve a nullaszoros lehetséget is, felhasználhattuk az A A szabályt. Ezt fejezi ki az * faktor. Alakítsuk át nyelvtanunkat a következk szerint: A=+  = +  (3.22.) A második egyenletbl  = + és ebbl már következik, hogy a (3.22.) egyenletek ugyanazt az eredményt adják, mint a (3.20.) egyenlet. A két egyenlet tehát egyenérték, és mivel a (3.22.) kifejezés nem tartalmaz közvetlen balrekurziót, feladatunkat megoldottuk, a közvetlen balrekurziót sikerült kiküszöbölnünk. Térjünk most át a környezetfüggetlen nyelvtanok másik nevezetes normálalakjára, a Greibach-féle normálalakra. Az irodalom GNF néven is emlegeti (Greibach Normal Form). A Greibach normálalakban a helyettesítési szabályok engedélyezett alakja: A aW (3.23.) ahol W tetszleges, csak nemterminálisokból álló sorozat. A tetszleges számban természetesen a zérus is beleértend, hiszen ellenkez esetben egyetlen mondatot sem lehetne levezetni, mindig maradna a mondatszer formában nemterminális. Az S alakú -szabály ugyanúgy, ahogy a Chomsky normálalaknál, itt is engedélyezett Greibach szabály. Vegyük észre, hogy a Greibach normálalakban felírt nyelvtanok nem balrekurzívak. Ez magától értetd, ha meggondoljuk, hogy minden helyettesítési szabály jobboldalának els szimbóluma terminális. A következkben a Greibach normálalak elállítását megoldva, elvégezzük a balrekurzió kiküszöbölését is. Azt kell elérnünk, hogy csak olyan levezetési szabályok legyenek a nyelvtanban, amelyek terminálissal kezddnek. Ha ezt megvalósítottuk, akkor már nyert ügyünk van, hiszen a levezetési szabályok belsejében található terminális szimbólumok eltávolításában már a Chomsky normálalak szerkesztésekor bizonyos gyakorlatra tettünk szert. Legyen adott egy jólfésült nyelvtan. Definiáljunk a nyelvtan nemterminális szimbólumai között egy szigorú, de egyébként teljesen tetszleges rendezést. Ennek szemléltetésére valamennyi nemterminális szimbólumot egyetlen betvel és egy indexszel jelöljük, ahol az index sorszáma határozza meg a rendezést. A rendezés tetszleges abban az értelemben, hogy semmiféle feltételezést nem teszünk majd a sorrend mikéntjére, így például azt sem kötjük ki, hogy a mondatszimbólum hányadik ­ els vagy utolsó ­ legyen ebben a sorban. A sorrend tehát elvben tetszleges, a gyakorlatban persze lehet, hogy egy ügyetlenül megválasztott sorrend az átalakítási munkát megnöveli, ez azonban a megvalósíthatóságot nem érinti.

3. Környezetfüggetlen nyelvek

99

Els lépésben azt kívánjuk elérni, hogy az Ai nemterminálishoz tartozó valamennyi levezetési szabály vagy terminálissal kezddjék, vagy els karaktere magasabb sorszámú nemterminális legyen. Formálisan: Ai aX vagy Ai Aj Y j>i (3.24.) ahol X és Y tetszleges szimbólumokat tartalmazhat. Ezt a mveletet a legalacsonyabb index nemterminális szimbólumnál kezdjük el, és innen haladunk felfelé a nagyobb indexek felé. Az A1 nemterminális esetében, minthogy ennél alacsonyabb sorszámú nemterminális nincsen, csak az okozhat problémát, ha a jobboldal els szimbóluma szintén A1. Ez viszont a közvetlen balrekurzió esete, amelynek kiküszöbölésére már van algoritmusunk. Ezt alkalmazva elérhetjük, hogy a (3.24.) feltételei erre a nemterminálisra teljesüljenek. Ha most áttérünk az A2 nemterminális szimbólumra, akkor elször azokat a levezetési szabályokat keressük meg, amelyek jobboldala az A1 nemterminálissal kezddik. Ha vannak ilyen szabályok, akkor ezekben az élen álló A1 szimbólumot levezetési szabályainak jobboldalával kell helyettesíteni, mégpedig minden lehetséges kombinációban. Így ha az A2 levezetési szabályai között k olyan van, amelynek jobboldala az A1 szimbólummal kezddik, és az A1 szimbólumhoz tartozó levezetési szabályok száma j, akkor az eredeti k szabály helyébe kj szabályt kell írni. Ezzel garantáljuk, hogy A2 szabályai között nem lesz olyan, amelyiknek a jobboldala az A1 szimbólummal, vagyis a baloldalinál alacsonyabb sorszámú nemterminálissal kezddne. Ennek következtében itt most csakis azok a szabályok okozhatnak problémát, amelyeknek els jobboldali szimbóluma A2, függetlenül attól, hogy az ilyen szabályok eredetileg is benne voltak a nyelvtanban, vagy az átalakítások során kerültek bele. Ez viszont megint a közvetlen balrekurzió esete, így az annak megszüntetésére szolgáló algoritmusunkat kell mozgósítanunk. Így elérjük, hogy csak vagy terminálissal, vagy nagyobb sorszámú nemterminálissal kezdd szabályaink lesznek, a (3.24.) követelmények teljesülnek. Általánosságban, ha fenti célunkat az Ai nemterminális szimbólumnál kívánjuk elérni, akkor feltételezhetjük, hogy ezt az algoritmust az i-1 indexig bezáróan már sikerrel alkalmaztuk. Elször itt is az A1 kezdet levezetési szabályokat ­ ha vannak ilyenek ­ szüntetjük meg helyettesítéssel. Ezzel a minimális kezdeti sorszámot eggyel feljebb vittük. Ekkor jön a következ sorszámú nemterminális, ismét csak helyettesítés, és ezt alkalmazzuk mindaddig, amíg az i indexhez nem érünk. Itt, ha szükséges, ismét a közvetlen balrekurzió elhárítására bevezetett módszert vetjük be. Már a leírásból is látszik, hogy ez az algoritmus, bár biztosan célhoz ér, meglehetsen hosszadalmas.

100

3.3. Nyelvtanok normálalakjai

Vegyük észre, ha átrágtuk magunkat az összes indexen, akkor az utolsó nemterminális szimbólum esetében a Greibach normálalak elírásainak megfelel levezetési szabályokat kapunk, amennyiben valamennyi szabály jobboldala terminális szimbólummal kezddik. Ez abból következik, hogy az utolsó nemterminális esetében, az utolsónál nem lévén magasabb sorszámú nemterminális, csak az a lehetség marad, hogy a levezetési szabályok terminálissal kezddnek. Itt persze feltételeztük, hogy az esetleges bels terminális szimbólumokat a szokott módon ,,nemterminálosítottuk". Ezekkel az átalakításokkal elértük, hogy a nyelvtan nem lehet balrekurzív. Minden szabály ugyanis vagy terminálissal, vagy magasabb sorszámú nemterminálissal kezddik, így nincs lehetség arra, hogy egy nemterminális a jobboldal legels pozíciójába visszatérjen, hiszen nem lehet önmagánál magasabb indexe. Most viszont visszafordulhatunk, és az átalakítás második lépéseként fáradságos utunkat nem kevésbé fáradságos módon lefelé is végigjárjuk. Az utolsó eltti nemterminálisról ugyanis tudjuk, hogy ha vannak is nemterminálissal kezdd levezetési szabályai, akkor azok csakis az utolsó nemterminálissal kezddhetnek. Ezen szabályoknál az utolsó nemterminális helyébe levezetési szabályainak jobboldalát helyettesítve elérhetjük, hogy az utolsó eltti nemterminális valamennyi szabályának jobboldala terminálissal kezddjék. Ezek szerint ez a nemterminális is ki fogja elégíteni a Greibach-féle szabályokat. Ezt az algoritmust a sorszámok csökken sorrendjében folytatva, mire az els nemterminálist is túlhaladtuk, az egész nyelvtanban nem lesz olyan levezetési szabály, amely ne terminális szimbólummal kezddne. Minthogy a fent ismertetett algoritmus bármely jólfésült nyelvtanra alkalmazható, igazoltuk, hogy minden környezetfüggetlen nyelvnek létezik Greibach normálalakja. Lássunk erre is egy példát. Legyen a nyelvtan: A BC B CA b C AB a Válasszuk a három nemterminális sorrendjének az A ­ B ­ C sorrendet. Elször azt az állapotot kell elállítanunk, amikor az egyes nemterminálisokhoz tartozó levezetési szabályok csak vagy terminálissal, vagy sorrendben késbbi nemterminálissal kezddnek. Szerencsére az A és B nemterminális szimbólumokra ez eleve teljesül. A C levezetési szabályainál a kezd A szimbólumot helyettesítéssel el kell távolítani. Sajnos erre az új szabály jobboldalának elején megjelenik a B nemterminális, így újabb helyettesítésre van szükség. C AB a BCBa CACB bCB a Ezzel sajnos nem vagyunk készen, hiszen a C nemterminális levezetési szabályaiban önmaga sem szerepelhet a jobboldal els helyén. Most a közvetlen balrekurzivitást megszüntet algoritmust kell alkalmaznunk.

3. Környezetfüggetlen nyelvek C bCB a bCB a ABC ACB

101

Ezzel megkaptuk azt az egyenértékes nyelvtant, amelynek levezetési szabályai vagy terminálissal, vagy magasabb sorszámú nemterminálissal kezddnek: A BC B CA b C bCB a bCB a ACB ACB Ami a kalapos szimbólumokat illeti, azokat úgy kezelhetjük, mintha sorrendben megelznék az összes eredeti szimbólumot. Példánkban csak egy ilyen szimbólum van . Ha több ilyen volna egymás közötti sorrendjük közömbös. Most visszafelé kell az utat bejárnunk. A sorrendben legutolsó nemterminális esetünkben C volt. Ennek levezetési szabályai már teljesítik a Greibach feltételeket, amennyiben terminális szimbólummal kezddnek. Azokba a levezetési szabályokba, ahol C a kezdszimbólum a jobboldalakat behelyettesítjük. Ezt kell tennünk a B nemterminális egyik levezetési szabályánál. Ezzel a B szimbólum valamennyi levezetési szabálya is terminálissal fog kezddni. Ezután a B szimbólumot kell az A egyetlen szabályában átírnunk, végül az A szimbólumra kapott eredményt a szabályaiba beírnunk. Mindezek után a nyelvtan a következ lesz. A szabályokat célszeren a származtatás sorrendjében adom meg. C bCB a bCB a B bCBA aA bCBA aA b A bCBAC aAC bCBAC aAC bC bCBACCB aACCB bCBACCB aACCB bCCB bCBACCB aACCB bCBACCB aACCB bCCB Itt említem meg, hogy más rendezés például a C­A­B sorrend esetén talán még szövevényesebb, de mindenesetre más nyelvtant kaptunk volna. Természetesen bárhogyan is származtatjuk a Greibach normálalakot a kapott nyelvtanok egyenértékek. Mint látható az eredeti egyszernek tn nyelvtanból készített Greibach normálalak ijeszt bonyolultságú. Felmerülhet ezzel kapcsolatban a kérdés, van-e a normálalakoknak az esetleges elvi jelentségen túlmenen gyakorlati fontossága. Gyakran az áttekinthet nyelvtan alapján nehéz elemzt szerkeszteni. A normálalakok erre sokkal jobb kiindulást adhatnak. Minthogy az elemzést a fordítóprogramot futtató számítógép végzi, ez esetben az elemezhetség szempontja nagyobb prioritású, mint az olvashatóságé.

102

3.4. Veremautomaták

3.4. Veremautomaták
Mint említettük, minden nyelvosztályhoz tartozik egy automataosztály, amely alkalmas a nyelvosztálynak megfelel nyelvtan által generált nyelvek felismerésére. A környezetfüggetlen nyelvek esetében ez az automataosztály a veremautomaták osztálya. A veremautomaták ,,szerkezeti" felépítését a 3.5. ábra tünteti fel. Ha a már jól ismert véges automatát egy LIFO ­ Last In First Out ­ diszciplínájú memóriával, veremmel kiegészítjük, a veremautomatát kapjuk.

Periféria (lyukszalagolvasó-egység)

Véges állapotú vezérlés

Verem

3.5. ábra Mint ismeretes a verem memória LIFO szervezés, vagyis mindig csak az utoljára betett objektum hozzáférhet. Ez pontosan megfelel a verem mindennapi szóhasználatának, amennyiben például egy krumplisverembl is csak az utoljára bevermelt krumplit lehet kivenni. A veremautomata veremmemóriája pontosan ezt a diszciplínát követi. Betenni vagy írni ­ ezek ez esetben szinonimák ­ csakis a verem tetejére lehet, és ugyanígy csak a verem legfels elemét lehet elolvasni, kivenni. Definíciószeren az olvasás egyben a verembl való kivételt is jelenti. Itt sajnos néhány szót kell szólni egy elég szerencsétlen terminológiai balfogásról. Azt az automatát ugyanis, amirl beszélünk, az angol nyelv szakirodalom push-down automaton néven illeti. A push-down ,,nyomd le" kitétel arra utal, hogy az új információt mindig a régi tetejére írjuk, és ezzel a memória régi tartalmát mintegy lenyomjuk.

3. Környezetfüggetlen nyelvek

103

A LIFO szervezés, a magyar irodalomban veremmemóriának nevezett memória angol neve ugyanakkor stack memory. A magyar számítástechnikai tolvajnyelvben is gyakran említünk a veremmemória helyett stack-memóriát. Az a tény, hogy az angol nyelv szakirodalom a veremmemóriát használó automata elnevezésére nem a verem szó angol megfeleljét használja, bocsánatos bn volna. A problémát az okozza, hogy ezzel egyidejen egy nem verem, vagyis nem stack szervezés memóriát tartalmazó automatának a stack automaton nevet adták. Az automataelmélet szakemberei, akik nem ismerve vagy tudomásul sem véve a számítástechnika szóhasználatát ezzel komoly konfúziót okoztak. A stack automaton nem szerepel tanulnivalóink között, így itt csak tájékoztatásul jegyzem meg, hogy ennél az automatánál ugyanúgy csak legfelülre lehet beírni, és csak a legfels elemet lehet kivenni, mint a veremmemóriánál ­ ennyiben valóban stack szervezés a memória ­ de lehet kivétel nélkül is olvasni belle, st ezt a mveletet nem csak a verem tetején, hanem bárhol bent a memóriában meg lehet tenni. Így olvasásra a memória egésze hozzáférhet. Ezek szerint a push-down automaton a stack automaton azon különleges esete, amikor a kivétel nélküli olvasás nem megengedett. A magyar irodalomban az elnevezés tekintetében bizonyos habozás tapasztalható. Vannak, akik az automata funkcióját tekintik mértékadónak, és a veremmemóriával ellátott automatát veremautomatának hívják. Mások az angol eredetibl kiindulva a veremautomata elnevezést az angolban stack automaton elnevezés automatának tartják fenn. Jómagam szintén bizonyos hezitálás után a memória szervezését tekintettem perdöntnek. Tettem ezt már csak azért is, mert az egyébként használatos push-down automata elnevezést nem tartottam elég magyarosnak, másrészt az ily módon kisemmizett stack automata jelentsége sokkal kisebb. A ma használatos terminológiát szemlélve úgy tnik nem volt rossz döntés. A terminológiáról szóló ezen hosszabb eszmefuttatást nem csak a magam mentségére írtam, hanem tájékoztatásul arra az esetre, ha valaki más terminológiát használó magyar szakirodalmat olvas. A veremautomata formális leírására egy hetes szolgál. P ( Q, , , , q0, Z0, F ) (3.25.) ahol ­ Q az automata állapotainak véges halmaza ­ az elemzend nyelv alfabetája ­ a verem alfabetája, vagyis azon szimbólumok véges halmaza, amelyek a veremben szerepelhetnek ­ a mozgási szabályok véges halmaza, amelyrl még részletesen szólunk ­ q0 az automata kezdállapota ­ Z0 a memória kezdeti tartalma ­ F az elfogadó állapotok halmaza

104

3.4. Veremautomaták

A P jelölés nem véletlen, ezt az automata a push-down elnevezéstl örökölte. Valamennyi említett halmaz véges, hiszen egyébként nem lehetne véges módon a nyelvet leírni. A definícióból következik, hogy : q0 Q Z0 FQ (3.26.) A veremautomata csak akkor mozgásképes, ha verme nem üres. Ezért szükséges már induláskor a vermet egy karakterrel feltölteni, ez Z0. A veremautomata mozgását az automata állapota, az olvasott karakter és a verem tetején található szimbólum határozza meg. A mozgás hatására az automata új, esetleg az eredetivel megegyez állapotot vesz fel, és a verem tetejére egy véges jelsorozatot ír be. Úgy tekintjük, hogy mozgás következtében az olvasó egy szimbólummal tovább lép, tehát az olvasófej alatt már a következ szimbólum található, ugyanakkor a verem tetején lév, és a mozgás során figyelembe vett szimbólum kivételre kerül, megsemmisül. Amennyiben az a szándékunk, hogy a verem tetején lév szimbólum a veremben maradjon, akkor ezt azzal a fogással érjük el, hogy a szimbólumot visszaírjuk a verembe. A mozgási szabályok száma véges, így a mozgás során a verembe beírt jelsorozatok hossza korlátos. Egyes mozgásoknál a verembe beírt jelsorozat hossza zérus is lehet, ilyenkor azt mondjuk, hogy az karaktert írtuk a verembe. Ebben az esetben a mozgás következtében a verem tartalma csökken. A veremautomatának az elbb ismertetett úgynevezett valódi mozgásain kívül van egy másik mozgási lehetsége is. Ennél az -mozgásnak nevezett mozgásnál a mozgást csak az automata állapota és a veremtet határozza meg. Az olvasófej alatti karakter itt nem játszik szerepet, el sem olvassuk, és így természetesen a szalag sem továbbítódik. St, -mozgás akkor is lehetséges, ha az olvasófej alatt már nincs is karakter. Az -mozgást jelképesen az karakter beolvasásával szokás jelölni. Ezzel a mozgási szabályok a következ leképezést definiálják: Q x ( ) x Q x k (3.27.) ahol ­ k a verembe beírt jelsorozatok hosszának korlátja. Úgy képzelhetjük el, hogy az üres jelsorozat eleme a halmaznak, és így a k jelölés a legfeljebb k hosszúságú jelsorozatok halmazát jelöli. A ( ) jelölés arra utal, hogy a valódi mozgások esetében a alfabeta egy elemét olvassuk, -mozgások esetében az ,,olvasott" karakter , tehát valójában nem történik olvasás. Még a részletek eltt néhány általános megjegyzés.

3. Környezetfüggetlen nyelvek

105

A jelsorozat elfogadásának feltételei hasonlóak a véges automaták esetében alkalmazotthoz. Egy jelsorozatot akkor fogadtunk el, ha az automata a jelsorozatot végigolvasta, és ezt követen elfogadó állapotba került. A véges automata az utolsó karakter elolvasása után megállt, és aszerint, hogy elfogadó vagy visszautasító állapotban állt meg, fogadtuk el, vagy utasítottuk el a jelsorozatot. A veremautomatáknál a helyzet nem ilyen egyszer. Az elemzend szöveg elolvasása után ugyanis egyáltalában nem szükségszer, hogy az automata megálljon. Persze csakis -mozgás jöhet szóba, hiszen a valódi mozgáshoz már nincsen karakter az olvasófej alatt. Felhívnám a figyelmet az elfogadás kritériumának óvatos megfogalmazására. Akkor fogad el, ha az elolvasás után elfogadó állapotba kerül. Teljességgel megengedett tehát, hogy az automata az elolvasás után -mozgásokkal kísérelje meg az elfogadó állapot elérését. Az elfogadásnak nem feltétele a mozgásképtelenség. Olyan eset is elképzelhet, amikor az -mozgásokban ciklus van, és így a mozgás tetszlegesen hosszú ideig folytatódhat. Ennek ellenére, ha az elfogadó állapotot keres -mozgások ciklusában van elfogadó állapot, akkor az automata érvényesen elfogadta a jelsorozatot. Egy fontos észrevétel az automata memóriájával kapcsolatosan. A memória véges, de nem korlátos hosszúságú. Ezzel a fogalommal nem elször találkozunk. Ebben a kontextusban ez a következket jelenti. Egy adott jelsorozat elemzésekor az automata memóriájának legnagyobb kiterjedése valamilyen véges, az elemzett jelsorozat és az automata által meghatározott érték. Általános korlátot azonban nem adhatunk meg. Bármekkora lenne is ez a korlát, mindig találhatnánk olyan jelsorozatot, amelynek elemzésére a korlátozott memóriaméret nem elegend. Ezt az állítást intuitíve igen könnyen beláthatjuk. Amennyiben volna a memória hosszára ilyen korlát, akkor ez azt jelentené, hogy csak véges sok különböz memóriatartalom lenne lehetséges. Vegyük figyelembe ugyanakkor, hogy az automata állapotainak száma is véges. Ebbl viszont az következik, hogy az automatát teljesen leíró, az automata állapotának és memória tartalmának direkt szorzatából álló halmaz is véges. Ha viszont az automata teljes jellemzésére egy véges halmaz elegend, akkor ez az automata egyenérték egy véges automatával. Ugyanakkor, mint látni fogjuk, a veremautomata ereje nagyobb a véges automatáénál, így a memória korlátosságára vonatkozó feltevésünk szükségképpen helytelen. Az irodalom a memóriának ezt a tulajdonságát, véges de nem korlátos voltát azzal a szóhasználattal is jellemzi, hogy a memória potenciálisan végtelen hosszúságú.

106

3.4. Veremautomaták

Mieltt egy példa kapcsán közelebbi ismeretséget kötnénk a veremautomatával, állapodjunk meg néhány konvencióban. Az automata leírására elegend a mozgási szabályok és az elfogadó állapotok halmazának megadása. Itt azzal a megállapodással élünk, hogy legelsnek olyan szabályt adunk meg, amelyben az állapot a kezdállapot, és a verem tetején az induló veremszimbólum van. Ilyen szabálynak kell lennie, hiszen különben az automata el sem tudja kezdeni az elemzést. A mozgási szabályok leírásánál a következ sorrendet használjuk: automata állapot, olvasott szimbólum és a verem teteje, illetve új állapot és a verembe beírt jelsorozat. Amennyiben -mozgásról van szó az olvasott karakter helyén áll. Amennyiben egynél több szimbólumot írunk be a verembe, akkor a sorozat legbaloldalibb eleme kerül a verem legeslegtetejére. Lássunk ezek után egy veremautomata-leírást: ( q0, a, Z0 ) = ( q1, aZ0) ( q0, b, Z0) = (q1, bZ0 ) ( q1, a, a ) = ( q1, aa ) ( q1, b, a ) = (q1, ba ) ( q1, a, b ) = ( q1, ab ) ( q1, b, b ) = ( q1, bb ) ( q1, c, a) = (q2, a ) ( q1, c, b ) = ( q2, b ) ( q2, b, b ) = (q2, ) ( q2, a, a ) = (q2, ) ( q2, , Z0) = (q3, Z0 ) F = { q3 } Ez a veremautomata a wcw-1 jelsorozatokat fogadja el, ahol w tetszleges az a és b karakterekbl álló nem üres jelsorozat. A -1 hatványkitev a sorozat inverzét jelenti, ami az eredeti jelsorozat fordított sorrendben. Az angol irodalomban szokásos még az inverzre az R kitev (reverse) használata is. Az elemzés alapgondolata a következ. Az automata veremmemóriájában elraktározza a sorozat els felét, majd a mondat közepétl kezdve, amit a c karakter beolvasása jelez, ellenrzi, hogy a mondat második fele megegyezik-e az els fél inverzével. A verem LIFO diszciplínája miatt ,,szerencsére" a mondat els felének szimbólumai fordított sorrendben kerülnek a verem tetejére. Sajnos a veremautomatának nincs olyan szép és egyszer ábrázolási módja, mint volt a véges automatának, így az automata mködésének nyomon követése, áttekintése nem olyan egyszer. Az automata mködésének pillanatnyi állapotát, mint említettük, az automata konfigurációja jellemzi. A veremautomata esetében az automata további viselkedésének megállapításához a következ információk szükségesek: a jelsorozat még be nem olvasott része, az automata állapota, a verem tartalma. K = ( w, q, ) (3.28.) ahol - w a még el nem olvasott jelsorozat, - q az automata állapota - a verem tartalma

3. Környezetfüggetlen nyelvek

107

Itt tehát az automata konfigurációja ez a hármas, amelyeket a fent leírt sorrendben adunk meg, azzal a konvencióval, hogy a még elolvasásra váró jelsorozat legbaloldalibb eleme van az olvasófej alatt, és a verem tartalmának legbaloldalibb eleme a verem teteje. A konfiguráció segítségével formálisan is felírhatjuk, mi lesz az automata nyelve: (3.29.) L (P) = { w ( w, q0, Z0) a (, p, ) p F } Az összefüggés szerint azok a w jelsorozatok lesznek az automata nyelvének mondatai, amelyek a kezdállapottal és a verem kezd tartalmával olyan konfigurációt alkotnak, amelybl tetszleges számú lépésben elérhet egy olyan konfiguráció, ahol a még elolvasásra váró jelsorozat az üres jelsorozat, és az állapot az elfogadó állapotok halmazának eleme. A verem tartalma érdektelen. A veremautomata mködését tehát konfigurációk sorozatán keresztül követhetjük. Tegyük most ezt az elbbi automatával, amikor az aabacabaa mondatot elemzi. Az induló konfiguráció: ( aabacabaa, q0, Z0 ) A továbbiakban kommentár nélkül adjuk meg a konfigurációk sorozatát. { aabacabaa, q0, Z0 } a { abacabaa, q1, aZ0 } a { bacabaa, q1, aaZ0 }a a { acabaa, q1, baaZ0 } a { cabaa, q1, abaaZ0 } a { abaa, q2, abaaZ0 }a a { baa, q2, baaZ0 } a {aa, q2, aaZ0 } a { a, q2, aZ0 } a { , q2, Z0 } a a { , q3, Z0 } Az automata a jelsorozatot elfogadta, hiszen a bemenet valamennyi szimbólumát feldolgozta, és azt követen elfogadó állapotba került. Így a fenti jelsorozat az automata nyelvének egy mondata. Az elemzés adott esetben igen egyszernek mutatkozik, hiszen az automatának minden szituációjában csak egy mozgási lehetsége kínálkozik, az automata determinisztikus. Ez nem mindig van így. Lássunk most egy példát a nemdeterminisztikus veremautomatákra. Legyenek az automata mozgási szabályai a következk: ( q0, a, Z0 ) = ( q1, aZ0 ) ( q0, b, Z0 ) = ( q1, bZ0 ) ( q1, b, a ) = ( q1, ba ) ( q1, a, a ) = ( q1, aa ) ( q2, ) ( q1, a, b ) = ( q1, ab ) ( q1, b, b ) = ( q1, bb ) (q2, ) ( q2, b, b ) = ( q2, ) ( q2, a, a ) = ( q2, ) ( q2, , Z0 ) = ( q3, Z0 ) F = { q3 } Ennek az automatának két olyan szabálya van, ahol egyetlen baloldalhoz két jobboldal tartozik. Itt is éltünk azzal az egyszersít jelölési konvencióval, hogy az azonos baloldalhoz tartozó jobboldalakat a vagy jelentés szimbólummal
*

108

3.4. Veremautomaták

választottuk el. Ez annyit jelent, hogy ebben a szituációban két mozgásra van lehetség, és közülük az automata bármelyiket választhatja. Az automata nemdeterminisztikus. Egy veremautomata hasonlóan a véges automatákhoz, akkor determinisztikus, ha minden szituációhoz legfeljebb egy mozgás tartozik. Más szavakkal ez annyit jelent, hogy minden automata állapot, olvasott szimbólum és veremtet hármashoz legfeljebb egy mozgás rendelhet. Ezen túlmenen, gondolva az -mozgásokra is, kikötjük, hogy ha valamely automata állapot és veremtet pár esetében lehetséges -mozgás, akkor csakis ez a mozgás legyen lehetséges, és a fenti párt bármilyen olvasott szimbólummal egészítsük is ki, valódi mozgás nem engedhet meg. Így az egyértelmség nem csak a valódi és -mozgásokon belül igaz, hanem a két mozgásfajta között is fennáll. A két példának választott automata, a determinisztikus és nemdeterminisztikus, nagyon hasonlít egymásra. Valóban ez utóbbi nyelve is emlékeztet a korábban tárgyalt determinisztikus automata nyelvére. Ez ugyanis: ww-1 ahol w az a és b szimbólumokból álló tetszleges jelsorozat. A két nyelv között ,,mindössze" az a különbség, hogy míg az els nyelv szájbarágósan közli, hol van a mondat közepe, addig a második nyelv esetében úgy kell fáradságos munkával megtalálnunk, hol végzdik a mondat els fele, és kezddik annak inverze. Valahányszor két azonos szimbólum követi egymást, mindig felmerül a gyanú, nem éppen a mondat közepén állunk-e. Ennek a dilemmának ­ közép vagy nem közép ­ felel meg a kétféle mozgási lehetség. Elemezzük most az abbaabba mondatot, vagyis írjuk le a konfigurációk sorozatát: { abbaabba, q0, Z0 } a { bbaabba, q1, aZ0 } a { baabba, q1, baZ0 } a ? Itt most egy válaszúthoz érkeztünk. Legyünk optimisták, és válasszuk azt az alternatívát, hogy elértük már a mondat közepét. { aabba, q2, aZ0 } a { abba, q2, Z0 } a ? Ez a levezetés befuccsolt, sajnos ilyen módon nem sikerült a mondatot levezetnünk. Ennek két oka lehet. Vagy a jelsorozat valójában nem mondata a nyelvnek, vagy a válaszúton rossz irányban indultunk el. Térjünk tehát vissza arra a helyre, ahol a dilemma felmerült, és most azzal feltételezéssel éljünk, hogy még nem értük el a mondat közepét. Folytassuk ennek megfelelen az elemzést: a { aabba, q1, bbaZ0 } a { abba, q1, abbaZ0 } a ?

3. Környezetfüggetlen nyelvek

109

Ismét válaszút eltt állunk. Legyünk konzekvensek és ismét reménykedjünk abban, hogy már elértük a mondat közepét. Az ennek megfelel folytatás: a {bba, q2, bbaZ0 } a { ba, q2, baZ0 } a { a, q2, aZ0 } a a { , q2, Z0 } a { , q3, Z0 } Az automata most elfogadta a jelsorozatot, tehát az az automata nyelvének egy mondata. Emlékeztetek arra, hogy veremautomaták esetében is akkor tekintjük a jelsorozatot elfogadottnak, ha létezik olyan mozgássorozat, amely mellett az automata a szóban forgó jelsorozatot elfogadja. Így nemdeterminisztikus automaták esetében az összes lehetséges mozgássorozatot végig kell tanulmányoznunk. Az a korábbi állításunk, hogy CF nyelvet nem lehet korlátos memóriával elemezni, adott esetben triviális, éspedig mindkét automatát tekintve az. Bármilyen nagyra választjuk is a memóriát, ha olyan mondatot kívánunk elemezni, amelynek fele hosszabb, mint a memória hossza, akkor memória mérete nem teszi lehetvé az elemzést. Persze felmerül a kérdés, az adott nyelvet nem lehet-e valamilyen más, de korlátos automatával elfogadni. Ilyen automatát nem lehet szerkeszteni. Ahhoz, hogy a mondat két felét összevessük, nyilván memorizálni kell a mondat els felét. Márpedig egy korlátos memóriában nem lehet tetszleges mennyiség információt tárolni. Mint azt a véges automatáknál említettük, egy automataosztály definiálására több hasonló ,,szerkezet" automata közül bármelyiket választhatjuk. A veremautomatákra fentebb megadott specifikáció sem az egyetlen lehetség az ilyen automaták meghatározására. A veremautomata elfogadási feltételét köthetjük ugyanis a verem üres voltához. Az ilyen üres veremmel elfogadó automata állapotai között nem disztingválunk, hiszen az elfogadás nem az automata állapotától, hanem a verem üres voltától függ. Persze az üres veremmel elfogadó automatának is végig kell olvasnia a jelsorozatot. Ennek megfelelen az üres veremmel elfogadó veremautomatát egy hatos írja le, a korábbi automata leírásból most ugyanis kiesik az elfogadó állapotok halmaza. Pe ( Q, , , , q0, Z0 ) (3.30.) Az e index itt az angol empty ­ üres ­ szó rövidítése. Az elfogadóállapotok hiánya még azzal az elnnyel is jár, hogy a már ismert konvenciókat alkalmazva, pusztán a mozgási szabályok megadása teljesen specifikálja az automatát. A két automataosztály, az állapottal illetve üres veremmel elfogadó automaták osztálya egyenérték. Bármely egyik osztályba tartozó automatához szerkeszthet ugyanis egy másik osztálybeli, vele ekvivalens, vagyis ugyanazt a nyelvet elfogadó automata.

110

3.4. Veremautomaták

Legyen adott egy állapottal elfogadó veremautomata. Vezessünk be egy új qe veremürít állapotot, és egészítsük ki az eredeti automata szabályait két szabályhalmazzal: (qi, , X) = ( qe, X ) (3.31.) qi F és X amely mozgási szabályt valamennyi elfogadó állapotra és valamennyi veremszimbólumra felírunk, míg az alábbi szabály: ( qe, , X) = ( qe, ) (3.32.) valamennyi veremszimbólumra érvényes lesz. Nyilvánvaló, hogy az eredeti automata bármely elfogadó állapotában át tudunk térni a (3.31.) szabállyal a veremürít állapotra. Ezután a (3.32.) szabályok segítségével szép sorjában ki tudjuk üríteni a vermet. Itt felmerülhet az a veszély, hogy az eredeti automata kiüríti a vermét. Ez az j automata esetében elfogadást jelent. Ha ez az eredeti automata visszautasító állapotában következik be, akkor az új automata olyan jelsorozatot is elfogad, amelyet az eredeti visszautasít. Ezen úgy segíthetünk, hogy egy új q0' kezdállapotot és egy új Z0 veremszimbólumot vezetünk be. A q0' állapot egyetlen mozgási szabályával ( q0', , Z0 ) = ( q0, Z0 Z0 ) (3.33.) kibéleljük a vermet a Z0 szimbólummal. Ez a szimbólum akkor is a veremben marad, ha az eredeti automata a vermet kiüríti. Ha ez elfogadó állapotban következik be, akkor a (3.31.) szabállyal áttérhetünk a qe veremürít állapotba, és a Z0 szimbólumot eltávolítjuk. Ha viszont visszautasító állapotban vagyunk, további lépésekre nincs lehetség, a Z0 szimbólum a veremben marad, így a jelsorozatot az új automata sem fogadja el. Könny belátni, hogy az új, üres veremmel elfogadó automata azokat és csakis azokat a jelsorozatokat fogadja el, amelyeket az eredeti automata is elfogadott. Az üres veremmel elfogadó automatából állapottal elfogadó automatát a következképpen készíthetünk. Vezessünk be most is, egy új Z0 verembélel szimbólumot és egy q0' új kezdállapotot, valamint egy qa egyetlen elfogadó állapotot. Az elemzés itt is a (3.33.) szabállyal kezddik, amely az eredeti Z0 induló veremszimbólum alá dugja a Z0' újonnan bevezetett szimbólumot. Ezután az eredeti, üres veremmel elfogadó automata mozgási szabályai érvényesülnek. Amennyiben az eredeti automata kiüríti a vermet, akkor a módosított automata vermében csak az aládugott Z0 szimbólum marad. Ekkor térünk át egy új szabály segítségével az egyetlen qa elfogadó, akceptáló állapotra. Elfogadó állapotba így csak akkor kerülhetünk, ha az eredeti automata kiürítette a vermét. ( qi , Z0 ) = ( qa, ) qi Q (3.34.)

3. Környezetfüggetlen nyelvek

111

Az, hogy a két automata, az eredeti és a módosított ugyanazt a nyelvet fogadja el, nem igényel magyarázatot. Kíséreljük meg az automata erejének növelését azzal, hogy a verembl nyerhet információt ne korlátozzuk csupán a verem legfels szimbólumára. Engedjük meg, hogy a mozgás eldöntésénél az automata bizonyos mélységig figyelembe vegye a verem tartalmát. A belelátási mélység mozgási szabályról mozgási szabályra változhat, és a mozgás során figyelembe vett valamennyi szimbólum eltnik a verembl. Ez tulajdonképpen megfelel a korábbi konvenciónak, csak ott mindig egyetlen szimbólumot veszünk figyelembe, és ezért csak egyetlen szimbólumot emeltünk le a verembl. Minthogy a mozgási szabályok száma itt is véges, így a belelátási mélység korlátos. A véges számú szabályok között ugyanis nyilván van olyan, amelyik legmélyebben lát bele a verembe, és ez a mélység korlátot szolgáltat az automata belelátási mélységére. Legyen a legmélyebbre látó szabály belelátási mélysége i. Ezzel formálisan leírhatjuk a mozgási szabályok által definiált leképezést: Q x ( ) x i Q x k (3.35.) ahol ­ i és k itt is, mint elbb, a alfabetából alkotott és legfeljebb i, illetve k hosszúságú jelsorozatokat jelöli. A mélybelátó automata ereje nem lehet kisebb az eredeti, mondjuk klasszikus automatáénál. Ugyanis, ha i értéke egy, akkor a klasszikus automatát kapjuk. Az alábbiakban konstruktív bizonyítást adunk arra, hogy az i mélységbe belelátó automata ereje nem nagyobb a klasszikus, csupán egyetlen szimbólumot figyelembe vev automatánál. Konstruálunk ugyanis egy, a belelátóval ekvivalens klasszikus veremautomatát. Az algoritmus azon a meglátáson alapszik, hogy a belelátás mélysége korlátos, feltevésünk szerint i. A legfels i veremszimbólum ezért korlátos információt hordoz. Tároljuk ennek alapján a legfels i szimbólum által képviselt információt az új automata állapotaiban, vagyis legyen az új automata állapottere az eredeti automata állapotterének, és az i veremszimbólumnak direkt szorzata: Q' = Q x i (3.36.) Az eredeti automata mozgásához szükséges valamennyi információt az automata állapota, az olvasott karakter, és a verem els, legfeljebb i számú szimbóluma hordozta. Ezeket az információkat mind megtalálhatjuk az új automata állapotában és az olvasott szimbólumban. Két megjegyzés. Egy veremszimbólumot a klasszikus veremautomata is figyelembe tud venni. Így tulajdonképpen elegend lenne az eredeti verem els i-1 szimbólumát az új automata állapotában tárolni. Az egységesebb tárgyalás miatt suvasztottuk bele mind az i szimbólumot az új állapotba.

112

3.4. Veremautomaták

Az új automata verme így az eredeti veremnek csak a fels i szimbólumnál mélyebben elhelyezked szimbólumait tárolja. Elfordulhat, hogy az eredeti automata vermében kevesebb, mint i szimbólum van. Ilyen esetekben egyrészt az új automata állapotában hiányozni fognak egyes szimbólumok, másrészt az új automata vermébe már nem jut szimbólum. Ezen úgy segíthetünk, hogy az eredeti, belelátó automata veremtartalma alá i számú, eddig nem szerepelt szimbólumot, az irodalomban szokásos választással mondjuk a $ szimbólumot tesszük. Persze a halmazt ezzel a szimbólummal ki kell bvítenünk. Most már az új klasszikus automata vermébl csak akkor fogyhatnak el a szimbólumok, ha az eredeti, belelátó automata verme kiürült. Ilyenkor az új automata állapotterében tárolt i szimbólum mindegyike a most bevezetett $ szimbólum lesz. Nagyon lényeges, hogy az új és régi automata vermei egyszerre ürülnek ki, hiszen ez elfeltétele annak, hogy egy üres veremmel elfogadó belelátó automatát egy üres veremmel elfogadó klasszikus automatával modellezzünk. Nyilvánvaló, hogy az eredeti belelátó és új klasszikus automatáknak az automata állapotával és a verem tartalmával meghatározott szituációi között egyegy megfeleltetés van. Az egyik automata állapotával és vermének tartalmával jellemzett szituációhoz kölcsönösen egyértelmen hozzárendelhet a másik automata egy adott szituációja, vagyis állapota és veremtartalma. Az új automata mozgási szabályainak megállapításánál a fenti kapcsolatot kell szem eltt tartani. Amennyiben az eredeti automatát egy mozgás az A B szituáció átmenetet hozza létre, akkor az ennek az új automata esetében egy olyan mozgás vagy mozgássorozat feleljen meg, amely a hozzárendelt szituációk közötti átmenetet biztosítja. Amennyiben az eredeti, belelátó automata olyan mozgási szabályait tekintjük, ahol a verembe beírt jelsorozat hossza nem rövidebb a mozgás során figyelembe vett, és ezért a verembl kitörölt jelsorozat hosszánál, akkor a két automata mozgásai között az egy-egy megfeleltetés könnyen megvalósítható. Legyen ugyanis az eredeti, belelátó automata egy ilyen mozgási szabálya: ( q, a, ) = ( p, ) (3.37.) A fenti szabálynak megfelel új szabály aszerint, hogy a verembe beírt jelsorozat hossza nagyobb-e vagy sem a maximális betekintési mélységnél, a következ lesz: ( q-, a, X ) = ( p -1, 2X ) ha i (3.38.) ( q -, a, X) = ( p -1, 2 X ) ha > i (3.39.) A kötjellel az új automata direkt szorzatként elálló állapotainak két összetevjét kapcsoltuk össze.

3. Környezetfüggetlen nyelvek A fenti képletekben = 1 2 illetve = 1 2 továbbá + = + 1 = i illetve 1 = i

113

(3.40.)

Határesetben, ha = i akkor 1, illetve ha = akkor 2 az üres jelsorozat lesz. Minthogy valamennyi releváns szimbólumot belevettünk az új állapotba, a verem teteje itt nem játszik szerepet, ezért X tetszleges veremszimbólum. Az a tény, hogy a két megfeleltetett mozgási szabály valóban teljesíti a kikötött feltételeket, nem igényel magyarázatot. Kissé bonyolultabb a helyzet, ha a verembe beírt jelsorozat rövidebb a kitöröltnél. Tételezzük most fel, hogy > A nehézséget most az okozza, hogy az eredeti automata vermének els i szimbóluma a mozgás után nem áll rendelkezésre, hiszen többet töröltünk ki a verembl, mint amennyit beírtunk. Átmeneti megoldásként feleltessünk meg az eredeti automata (3.37.) szerint, tehát ( q -, a, X ) = ( p, ) alakú mozgási szabályának a ( q -, a, X ) = ( p - . . ., ) (3.41.) mozgási szabályt. Természetesen most is + = i A (3.41.) összefüggésben a halmazhoz most hozzácsatolt, egyébként sohasem volt szimbólumból helykitöltés céljából annyit suvasztunk be az állapotban tárolt els szimbólumok közé, hogy a szükséges mennyiség, i darab kiteljék. Ezen kívül az új automata mozgási szabályaihoz hozzáveszünk még egy -mozgásokból álló halmazt, a következk szerint: ( p -. . . , , X ) = ( p -X . . . , ) (3.42.) Mint látható, a (3.42.) mozgások a klasszikus veremautomata vermének tetejét hozzáveszik az állapotban tárolt szimbólumokhoz, és a helykitölt szimbólumokból egyet elhagynak. A fenti szabályt kell türelemmel alkalmazva elérhet, hogy valamennyi helykitölt szimbólumot igazándival helyettesítsünk. Ezzel a következ mozgás megállapításához szükséges valamennyi információ rendelkezésre áll. Abban az esetben tehát, amikor a beírt jelsorozat hossza rövidebb a kitöröltnél, csak egy kis vargabetvel érünk célt. Ilyenkor a (3.42.) típusú szabályok ismételt alkalmazásával biztosítjuk, hogy az új klasszikus automata végül is abba a szituációba kerüljön, amely az eredeti automata mozgás utáni szituációjához van rendelve.

114

3.4. Veremautomaták

Itt feltételeztük, hogy az eredeti automata valódi mozgást végez. -mozgás esetén ugyanez a módszer ugyanígy célra vezet. Végeredményben, ha egy jelsorozat elemzésekor figyelemmel kísérjük mind az eredeti belelátó, mind az új klasszikus automata sorsát, akkor azt tapasztaljuk, hogy azok egymáshoz rendelt szituációpárokon át haladnak. Ebbl viszont következik, hogy a két automata ugyanazt a nyelvet fogadja el.

3.5. A környezetfüggetlen nyelvek és veremautomaták ekvivalenciája
Említettük már, hogy a környezetfüggetlen nyelvtanok éppen azokat a nyelveket generálják, amelyeket a veremautomaták elfogadnak. A két halmaz, a környezetfüggetlen nyelveké, és a veremautomaták által elfogadottaké azonos. Ennek igazolásával még adósak vagyunk. Bizonyításunk ismét konstruktív lesz. Elször egy környezetfüggetlen nyelvtanhoz készítünk olyan veremautomatát, amely pontosan a nyelvtan által generált nyelvet fogadja el. Ebbl következik, hogy a veremautomaták által elfogadott nyelvek halmaza nem lehet szkebb, mint a környezetfüggetlen nyelvtanok által generáltaké. Ezután csináljuk meg a fenti szerkesztés visszáját, vagyis egy veremautomatához egy olyan környezetfüggetlen nyelvtant konstruálunk, amely éppen az automata nyelvét generálja. Ebbl viszont már következik az ekvivalencia. Nézzük elször a nyelvtan automata átalakítást. Legyen adott egy környezetfüggetlen nyelvtan levezetési szabályaival. Definiáljunk egy üres veremmel elfogadó automatát a következképpen. A verem alfabetája a nyelvtan terminális és nemterminális szimbólumainak uniója lesz. A verem kiinduló tartalma legyen a mondatszimbólum. Az egyszerség kedvéért az automata állapothalmaza egyetlen elemet tartalmaz, jelölje ezt q, így abban nem tárolunk információt. Az automata mozgási szabályai kétfélék. Az egyik fajta mozgási szabályhalmaz független a nyelvtan szabályaitól, a másik természetesen függ tle. Az els csoportba tartozó szabályok alakja a következ: ( q, a, a ) = ( q, ) (3.43.) Ezek szerint, ha a verem tetején terminális elem van, és az megegyezik az éppen beolvasottal, akkor az a verem tetejérl leemelhet. Arra az esetre, amikor a verem tetején lév terminális nem azonos a beolvasott karakterrel nincs kádencia, az elemzés ­ legalábbis ezen az úton ­ zsákutcába jutott. A szabályok másik fajtája, amelyek a nyelvtant és így a nyelvet tükrözik, -mozgásokat határoznak meg.

3. Környezetfüggetlen nyelvek

115

Alakjuk a következ: ( q, , A ) = ( q, ) (3.44.) ahol ­ A a nyelvtan egy nemterminális szimbóluma, és létezik egy A (3.45.) alakú levezetési szabály. Minden levezetési szabálynak megfelel egy ilyen szabály. Szavakban ez annyit jelent, hogy valahányszor egy nemterminális kerül a verem tetejére, azt egy olyan szabály jobboldalával helyettesítjük, amelynek baloldala éppen a szóban forgó nemterminális. Könny belátni, hogy ez az automata éppen a baloldali, a top-down vagyis felülrl lefelé történ levezetést illetve elemzést hajtja végre. Vegyük észre, ha a már elolvasott jelsorozathoz a verem tartalmát hozzáfzzük, éppen a baloldali levezetés mondatszer formáit kapjuk. Induláskor, amikor még egyetlen szimbólumot sem olvastunk be, a verem tartalma a mondatszimbólum. Ez tehát levezetésünk els mondatszer formája. Az elemzés során a (3.44.) típusú szabályok alkalmazásakor a baloldali levezetés egy újabb mondatszer formáját állítjuk el. A (3.43.) mintájú mozgási szabályok nem váltanak mondatszer formát, csupán a következ nemterminálist keresik. Minthogy a verem tetejére mindig a legbaloldalibb nemterminális kerül, következésképpen az automata a baloldali levezetést hajtja végre. A gondolatmenetbl következik, hogy minden sikeres baloldali levezetéshez tartozik egy olyan automata mozgássorozat, amely a levezetett mondat elfogadásához vezet, és fordítva, minden az automata által elfogadott mondatnak van a nyelvtanban baloldali levezetése. Természetesen a fenti algoritmussal származtatott automata nem unikális, nem az egyetlen, amely a nyelvtani szabályok alapján generált mondatokat elfogadja. Mint ahogy a baloldali levezetés sem az egyetlen üdvözít módszer. Ennek dokumentálására környezetfüggetlen nyelvtanunkhoz most egy olyan veremautomatát szerkesztünk, amely a jobboldali bottom-up elemzést végzi. A jobboldali elemzés a jobboldali levezetést követi, csak éppen fordított sorrendben. Így a generált mondatból indul ki, és a levezetési szabályok jobboldalát megkeresve, azokat a baloldallal helyettesítve halad mondatszer formáról mondatszer formára visszafelé, mindaddig, amíg a végén az eredeti mondatot a mondatszimbólumra nem redukálta. A jobboldali elemzést modellez veremautomata üres veremmel elfogadó, belelátó automata lesz. Kényelmi okokból a belelátó automatánál a verem tartalmát nem a megszokott módon balról jobbra, hanem fordítva írjuk. Itt tehát a verem teteje nem a legbaloldalibb, hanem a legjobboldalibb szimbólum. Hogy ez mennyiben jelent kényelmet az a késbbiekbl derül ki. Az automata állapothalmaza itt is egyetlen elemet tartalmaz.

116

3.5. A környezetfüggetlen nyelvek és veremautomaták

Ebben az esetben is a mozgási szabályoknak két csoportját definiálunk. Az egyik csoport itt is független a nyelvtani szabályoktól, és csak a másik csoport tükrözi a nyelvtan sajátosságait. A nyelvtantól független szabályok alakja a következ : ( q, a, X ) = ( q, Xa ) a és X (3.46.) ahol ­ X tetszleges verembeli szimbólum. Ezen szabály szerint az olvasott szimbólumot minden esetben beírhatjuk a verem tetejére ­ vigyázat, a verem teteje most a jobboldalon van ­ anélkül, hogy a verem korábbi tartalmát törölnénk. A nyelvtantól függ szabályok alakja, amelyek ez esetben is -szabályok lesznek, a következ: ( q, , ) = ( q, A ) (3.47.) ha létezik egy A alakú levezetési szabály. Ez annyit jelent, hogy ha a verem tetején kialakul egy levezetési szabály jobboldala ­ fordított sorrendben, ­ akkor helyette beírhatjuk a megfelel baloldalt. Amikor ugyanis a (3.46.) szabályok segítségével szép sorjában az olvasott szimbólumokat a verembe beírjuk, akkor azok ott fordított sorrendben jelennek meg. Amikor a szokástól eltéren a verem tetejét a jobboldalra írjuk, akkor ebben az a kényelem, hogy ilyenkor a levezetési szabályok fordított sorrendben elhelyezked jobboldalai a megszokott betképpel olvasmányosan láthatóak. A fenti két megadott típusú mozgási szabályokon kívül még egy mozgási szabályra van szükségünk : (3.48.) ( q, , Z0S ) = ( q, ) ahol ­ Z0 a verem kiindulási szimbóluma, amely nem azonos egyik nemterminális szimbólummal sem, ­ S a nyelvtan mondatszimbóluma. Amennyiben a veremben a kiindulási szimbólumon kívül csak a mondatszimbólum marad, akkor a vermet kiürítve az elemzett jelsorozatot elfogadjuk. Az elemzés gondolatmenete megegyezésben korábbi megjegyzésünkkel a következ: A kész mondatból indulunk ki és keressük azokat a fragmenseket, amelyek egy nemterminális helyettesítése útján kerülhettek be a mondatba vagy mondatszer formába. Ezek nyilván azonosak a levezetési szabályok jobboldalával. Ezeket a jobboldalakat nyeleknek nevezzük. Az ilyen nyelek helyébe írhatjuk be azt a nemterminálist, amelybl származott. Ezt a mveletet a szakmai zsargon a nyelek letörésének nevezi. Minthogy balról jobbra olvasunk, elsként mindig a legbaloldalibb nyelet fogjuk letörni. Ennek alapján nem nehéz belátni, hogy ez az elemzés fordított sorrendben végzi el a jobboldali levezetést, tulajdonképpen jobboldali «felvezetést» hajt végre.

3. Környezetfüggetlen nyelvek

117

A teljes mondatból indul ki, és a nyelek letörésével a jobboldali levezetés mondatszer formáinak sorozatán visszafelé haladva siker esetén egészen a mondatszimbólumig jut. Ügyelnünk kell arra, hogy nem minden fragmens, amely megegyezik egy szabály jobboldalával, bizonyul nyélnek. Lehet, hogy nem igazándi nyél, hanem csak nyélnek látszó nyelvi tünemény. Ha azután egy ilyen álnyelet törünk le, akkor az elemzés elbb utóbb kátyúba kerül. Az a probléma, hogy egy jobboldallal megegyez fragmens valódi nyél-e vagy csak álnyél, a formális nyelvek elméletének egyik igen fontos kérdése. A késbbiekben ezzel még mélyrehatóbban foglalkozunk. Szerencsére pillanatnyilag nincsen problémánk, hiszen automatánk nemdeterminisztikus. Ha a verem tetején nyelet, pontosabban annak fordítottját találjuk, akkor mind a nyél letörését jelent (3.47.) típusú szabályt, mind annak negligálásával egyenérték (3.46.) szabályt alkalmazhatjuk. A nemdeterminisztikus automaták esetében tudjuk, hogy valamennyi lehetséges lépést figyelemmel kell kísérnünk. Így tehát a nyél letörését is, meg negligálását is ki kell próbálnunk. Ha a jelsorozat eleme a nyelvnek, akkor valamelyik út szükségképpen eredményre vezet. Abból, hogy az automata a jobboldali levezetést állítja el, ­ az, hogy fordított sorrendben, az ebbl a szempontból közömbös ­ következik, hogy a nyelvtan által generált nyelv azonos az automata nyelvével. Ha ugyanis a mondat generálható, akkor a jobboldali levezetés szerint az automata el tudja fogadni. Fordítva, ha az automata a jelsorozatot elfogadta, akkor létezik annak az adott nyelvtan szerinti jobboldali levezetése, vagyis a jelsorozat generálható, tehát mondat. Mieltt a bizonyítás második lépését megtennénk, vagyis egy veremautomatához készítenénk környezetfüggetlen nyelvtant, lássunk példát az eddigiekre: Legyen a környezetfüggetlen nyelvtan: S aSa bSb aa bb Ez a nyelvtan, mint már tudjuk, a ww-1 nyelvet generálja. Itt w tetszleges a és b karakterekbl álló jelsorozat. Írjuk fel a baloldali levezetést elállító veremautomata mozgási szabályait. Elbb a nyelvtantól független mozgási szabályok: ( q, a, a ) = ( q, ) ( q, b, b ) = ( q, ) A nyelvtan levezetési szabályaitól függ mozgási szabályok : ( q, , S ) = ( q, aSa ) ( q, bSb ) ( q, aa ) ( bb ) Itt az egyszersítés kedvéért ismét éltünk a vagy jelentés jel használatával. Az automata nemdeterminisztikus, hiszen az egyetlen nemterminális szimbólum négyféleképpen írható át.

118

3.5. A környezetfüggetlen nyelvek és veremautomaták

Elemezzük most az abbaabba mondatot. A mondat természetesen az adott nyelvtan segítségével generálható, de ennek demonstrálását a szorgos olvasóra bízom. Az egyszerség és papírtakarékosság okából a nemdeterminisztikus automatának ­ bölcs elrelátással ­ mindig csak azokat a lépéseit vesszük, amelyek célra vezetnek. Az olvasó persze ellenrizheti, hogy a negligált lépések valóban zsákutcát eredményeznek. Kövessük konfigurációról konfigurációra az elemzés menetét: { abbaabba, q, S } a { abbaabba, q, aSa } a { bbaabba, q, Sa } a a { bbaabba, q, bSba } a { baabba, q, Sba } a { baabba, q, bSbba } a a { aabba, q, Sbba } a { aabba, q, aabba } a { abba, q, abba } a a { bba, q, bba } a { ba, q, ba } a { a, q, a } a { , q, } Az automata a jelsorozatot elfogadta, hiszen azt végigolvasta, és verme kiürült. A másik esetre, amikor belelátó automata segítségével végzünk jobboldali elemzést, válasszuk példának az aritmetikai kifejezéseket generáló nyelvtant. E E+T T T TF F F (E) a Talán most engedjük meg magunknak azt a lazaságot, hogy mellzzük a nyelvtantól nem függ mozgási szabályok leírását. A nyelvtantól függ szabályok alakja: ( q, , E+T ) = ( q, E ) ( q, , T ) = ( q, E ) ( q, , TF ) = ( q, T ) ( q, , F ) = ( q, T ) ( q, , (E) ) = ( q, F ) ( q, , a ) = ( q, F ) Remélem, hogy a két különböz funkciójú zárójel jelenléte nem zavaró. Mindenesetre a mozgási szabályokat leíró metanyelv zárójeleit egyszeren, a generált nyelvét pedig vastagítva írtuk. A záróaktusként használt mozgási szabály most: ( q, , Z0 E ) = ( q, ) hiszen esetünkben a mondatszimbólum E. Elemezzük az alábbi mondatot: a*(a+a) Ez alkalommal készítsük el a jobboldali levezetést is, egyrészt, mert ilyet még úgy sem csináltunk, másrészt, hogy összevessük a jobboldali ,,felvezetéssel", pontosabban a felvezetés során kapott mondatszer formákkal. Ezeket a mondatszer formákat majd úgy állíthatjuk össze, hogy a verem tartalmához hozzáfzzük a még el nem olvasott jelsorozatot. A jobboldali levezetés: E T TF T(E) T(E+T) T(E+F) T(E+a) T(T+a) T(F+a) T(a+a) F(a+a) a(a+a)

3. Környezetfüggetlen nyelvek

119

Az elemzés során itt is csak a valódi nyeleket törjük le. Elvben minden nyélnek látszó fragmenst le kellene törnünk, és csak fiaskó esetén térni át a még reményt kelt ágakra. Minden olyan helyen, ahol a nyélnek látszó fragmenst nem törtük le, a a származtatási jelet követ felkiáltó jellel hívjuk fel erre a körülményre az olvasó figyelmét. Az elemzés: { a(a+a), q, Z0 } a { (a+a), q, Z0a } a { (a+a), q, Z0F } a a { (a+a), q, Z0T } a ! { (a+a), q, Z0T } a { a+a ), q, Z0T( } a a { +a), q, Z0T(a } a { +a ), q, Z0T(F } a { +a ), q, Z0T(T } a a { +a), q, Z0T(E } a { a), q, Z0T(E+ } a { ), q, Z0T(E+a } a a { ), q, Z0T(E+F } a { ), q, Z0T(E+T } a !{ ), q, Z0T(E } a a { , q, Z0T(E) } a { , q, Z0TF } a { , q, Z0T } a a { , q, Z0E } a { , q, } A felkiáltójellel azokat a helyeket jelöltük meg, ahol a T nemterminális letörése helyett a következ karaktert csúsztattuk be a verembe. A jelzett helyen kívül volt olyan eset is, amikor ,,nyéltúltengésben" szenvedtünk. Például amikor a verem fels három szimbóluma E+T volt, persze fordított sorrendben. Ekkor a T, de az E+T is potenciális nyél volt. Természetesen itt is csak az eredményre vezet változatot vettük figyelembe. Nyelvtanból tudunk már veremautomatát készíteni, de hogyan szerkesszünk egy veremautomatához környezetfüggetlen nyelvtant? Elre kell bocsátanunk, hogy a tárgyalás itt kissé terjedelmesebb lesz. Eddigi eredményeinket ugyanis nem tudjuk közvetlenül megfordítani, felhasználni. Ha a fentiek szerint egy nyelvtanhoz akár a baloldali levezetést, akár a jobboldali ,,felvezetést" modellez automatát készítünk is, az automatánknak csak egy állapota lesz. Ez annyit jelent, hogy a kidolgozott, a nyelvtanból automatát szerkeszt algoritmus megfordítása csak akkor használható, ha az automatának csak egy állapota van. Szándékunk szerint viszont olyan módszerre, olyan algoritmusra van szükségünk, amely bármely veremautomatához, így a több állapottal bíró automatához is rendel egy környezetfüggetlen nyelvtant. Kiindulásul tételezzük fel, hogy automatánk üres veremmel fogad el. Ez nem jelent korlátot, hiszen mint láttuk, minden veremautomatához szerkeszthet egy vele egyenérték üres veremmel elfogadó automata. Az az alapötlet, hogy az elemzés automata szituációihoz a nyelvtani levezetés mondatszer formái tartozzanak, itt is gyümölcsöz lesz. Vizsgáljunk meg egy ­ az elemzés során elálló ­ szituációt. Tételezzük fel, hogy az automata a jelsorozatot végül el fogja fogadni. A már olvasott szimbólumokat az automata már feldolgozta. Ennek a feldolgozásnak az eredménye a verem tartalmában tükrözdik. A siker feltétele az, hogy a verem tartalma lehetvé tegye a még el nem olvasott szimbólumok feldolgozását,

120

3.5. A környezetfüggetlen nyelvek és veremautomaták

mégpedig olymódon, hogy mire az utolsó szimbólumot is elolvassuk, a verem éppen kiürüljön. Amennyiben egy ilyen szituációhoz megpróbáljuk a nyelvtani levezetés egy mondatszer formáját hozzárendelni, akkor a következképpen járhatunk el. Az elemzés során elolvasott szimbólumok kiléte már kiderült. A mondatszer forma célszeren ezekkel a már elolvasott szimbólumokkal kezddjék. Ezt követi a verem tartalmának megfelel nemterminálisok sorozata. A megfeleltetés nyilván akkor helytálló, ha ezekbl a nemterminálisokból akkor és csak akkor generálható a még el nem olvasott jelsorozat, ha azt az automata elfogadja, a teljes jelsorozat az automata nyelvének mondata. Vizsgáljuk most meg, hogyan lehet az automata egy mozgási szabályának a nyelvtan egy levezetési szabályát megfeleltetni. Rendeljünk a verem minden szimbólumához a mondatszer forma egy nemterminálisát. Az automata mozgása során megállapodásunk szerint töröljük a verem legfels szimbólumát, és helyébe egy ­ esetlegesen üres ­ jelsorozatot írunk. Ezen túlmenen, ha valódi mozgásról van szó, akkor még egy karaktert is elolvasunk. Az automata mozgási szabályához rendelt levezetési szabály baloldala a verem tetején lév, a mozgás során kitörölt szimbólumnak megfelel nemterminális lesz. Valódi mozgás esetén a jobboldal az elolvasott terminális szimbólummal kezddik. Ez biztosítja, hogy a mondatszer forma mindig a már elolvasott jelsorozattal kezddjék. A levezetési szabály jobboldalának többi eleme a verem tetejére most beírt jelsorozat szimbólumainak feleljen meg. Ha például semmit sem írunk a verembe, akkor a jobboldal nem tartalmaz nemterminális szimbólumot. Els látásra kézenfekvnek tnik az a megoldás, hogy amikor a veremszimbólumokhoz olymódon rendelünk nemterminálisokat, hogy különböz szimbólumhoz különböz, azonos szimbólumhoz azonos nemterminálist feleltetünk meg. Ezzel a mondatszer formában azt az információt tároltuk, amit az automata verme hordoz. Ezzel tulajdonképpen célt is érnénk, ha az automatának csupán egy állapota lenne. Ebben az esetben ugyanis az automatában tárolt információt egyedül a veremtartalom szolgáltatja. Amennyiben az automatának több állapota van, ezt az információt is érvényre kell juttatnunk a mondatszer formában. Ilyenkor az elolvasott jelsorozat nyújtotta információ nem csak a verem tartalmában testesül meg, hanem az automata állapotában is. Éppen ezért az egyes nyelvtani szabályok alkalmazhatóságának függenie kell az automata állapotától. A megoldást az adja, hogy az automata állapotait is beépítjük a nyelvtan nemterminális szimbólumaiba. A verem minden szimbólumához két, az adott szimbólum életében fontos szerepet játszó állapotot társítunk.

3. Környezetfüggetlen nyelvek

121

Az els állapot az, amikor a szimbólum a verem tetejére kerül, és befolyásolja az automata következ mozgását, amelynek során azután kitörldik. A másik nevezetes állapot az az állapot, amikor a szóban forgó verembeli szimbólum és összes utódai kihalnak. Amikor a verem tetejérl a szimbólumot kitöröljük, szimbólumok sorozatát írjuk be a helyére. Ezeket kis fantáziával a szimbólum gyerekeinek tekinthetjük. A verem tetején a legidsebb gyermek, a sorozat utolsó eleme a legfiatalabb gyermek. Itt szigorú hierarchia van. Elször a legidsebb gyermek hal ki, majd az azt követ, legvégül a legfiatalabb gyermek kihalásával sznik meg a család. Persze ezt a kihalást rekurzíve kell értelmezni, hiszen a gyermekeknek is lehetnek gyermekei, és így tovább. Kérdés, valóban kihal-e mindegyik veremszimbólum családostul. Igen, mondatok elemzésekor ez szükségszer, hiszen az automata üres veremmel fogad el, így végül egy szimbólum sem marad a veremben. Ezt másképpen úgy is fogalmazhattuk volna, hogy a második állapot az az állapot, amikor a szóban forgó alatti veremszimbólum kerül a verem tetejére. Természetesen a két megfogalmazás egyenérték. A nyelvtan nemterminális szimbólumainak tehát tartalmazniuk kell ezt a két állapotot is, így tulajdonképpen egy hármast alkotnak. Jelölésük: [pAr] (3.49.) A félreértések elkerülése végett szeretném ismét hangsúlyozni, hogy a (3.49.) alakú fragmensek a nyelvtan egy nemterminális szimbólumát jelölik. A leírt nemterminális megfelel az automatában egy olyan A verembeli szimbólumnak, amely a p állapotban kerül a verem tetejére, és az r állapotban hal ki, közvetlenül vagy utódaiban. Így természetesen a verem alfabetájának egy szimbólumához a nyelvtan több nemterminális szimbóluma tartozhat, hiszen annak különböz példányai különböz nevezetes állapotokat vehetnek fel. Persze ez azzal jár, hogy a nyelvtan nemterminálisainak száma jelentsen nagyobb lehet a verem alfabetájának számosságánál. Tekintsük most az automata lehetséges mozgási szabályait, és feleltessünk meg ezeknek nyelvtani levezetési szabályokat. Aszerint, hogy az automata valódi vagy -mozgást végez, illetve, hogy történik-e beírás a verembe vagy sem, négy szabályváltozatot fogunk megkülönböztetni. ( p, a, A ) = ( r, ) (3.50.) ( p, , A ) = ( r, ) (3.51.) ahol ­ a veremszimbólumok nem üres sorozata: = X 1 X 2 . . . Xk k1 (3.52.)

122

3.5. A környezetfüggetlen nyelvek és veremautomaták

A másik két szabályváltozat arra az esetre érvényes, amikor nem történik beírás a verembe: ( p, a, A ) = ( r, ) (3.53.) ( p, , A ) = ( r, ) (3.54.) Most rendre megadjuk az egyes változatoknak megfelel nyelvtani szabályokat: [pAsk] a [rX1s1] [s1X2 s2] . . . .[sk-1Xksk] (3.55.) [pAsk] [rX1s1] [s1X2s2]. . . . [sk-1Xksk] (3.56.) Itt természetesen a (3.55.) levezetési szabály a (3.50.) mozgásnak, míg a (3.56.) szabály a (3.51.) mozgásnak felel meg. Az összefüggések bizonyos magyarázatot igényelnek. Az s1,s2, . .sk szimbólumok nem szükségszeren különböz automata állapotokat jelölnek. A szabályok megértéséhez próbáljuk meg összefoglalni, mi mindent tudunk az egyes verembeli szimbólumok megjelenési és kihalási állapotáról. A (3.50.) és (3.51.) mozgási szabályból következik, hogy az A szimbólum a p állapotban, míg az jelsorozat els eleme az X1 szimbólum az r állapotban jelenik meg a verem tetején. Az, hogy a többi szimbólum milyen állapotban tnik fel és milyen állapotban hal ki, arra az automata mozgási szabályai nem adnak felvilágosítást. Pusztán azt tudjuk, hogy amikor valamely szimbólum akár önmagában, akár utódaiban kihal, akkor jelenik meg az t sorrendben követ szimbólum. Így egy szimbólum kihalási állapota meg kell egyezzen a következ szimbólum megjelenési állapotával. Az automata mozgási szabályaiból következik, hogy az A veremszimbólum utódaiban hal ki. Pontosan akkor, amikor annak legkisebb gyermeke, a most beírt sorozat utolsó eleme Xk kihal. Ezek szerint az A és Xk szimbólum kihalása ugyanaz az esemény, így természetesen ugyanaz az állapot tartozik hozzájuk. Ezeket a megfontolásokat a (3.55.) és (3.56.) kifejezések felírásánál már érvényre juttattuk. A két szabály között csak annyi a különbség, hogy az egyik valódi, a másik -mozgást feltételez, így az els szabály jobboldala az elolvasott terminálissal kezddik. Az összes rendelkezésünkre álló információ tehát be van építve a levezetési szabályokba. Mit kezdjünk azonban azokkal, az egyelre szabadon hagyott állapotokkal, amelyekrl közelebbi információnk nincsen. A válasz: írjuk be az összes lehetséges változatot. További ismeret hiányában akkor járunk el biztonságosan, ha valamennyi lehetséges helyzetre felkészülünk. Ha ­ mint esetünkben ­ egy mozgás során k számú szimbólumot írunk be a verembe, és az automata állapotainak száma i, akkor az automata egyetlen

3. Környezetfüggetlen nyelvek

123

ilyen mozgási szabályához i k osztályú ismétléses variációjának megfelel számú, vagyis ik levezetési szabály tartozik. Sajnos ez kétségbe ejten megnöveli a levezetési szabályok számát, és felduzzasztja a nyelvtant. Szerencsére az automata mködése során nem minden állapotpár realizálódhat, ami annyit jelent, hogy a nyelvtanban sok lesz a felesleges szimbólum. Egy alapos fésülés tehát jelentsen megritkíthatja a nyelvtant. Adósok vagyunk még a (3.53.) és (3.54.) mozgási szabályoknak megfelel levezetési szabályokkal. [pAr] a (3.57.) [pAr] (3.58.) Itt egy olyan pillanatnak vagyunk szemtanúi, amikor az A veremszimbólum kihal. A korábban elmondottak alapján talán felesleges a további magyarázat. Szerencsére itt minden mozgási szabályhoz csak egy levezetési szabály tartozik. Amikor egy környezetfüggetlen nyelvtanhoz szerkesztettünk veremautomatát, akkor a nyelvtan levezetési szabályai, és az automata mozgási szabályai között egy-egy értelm kapcsolat volt. Itt sajnos nem ez a helyzet. Ennek alapvet oka az, hogy míg a mondatszer formák, illetve a levezetési szabályok messzemenen predeterminálják az automata állapotváltozásait, hiszen a nemterminálisokban egy állapotsorozat van rögzítve, addig a mozgási szabályok csak a következ automataállapotot írják el. Ezek szerint, míg egy levezetési szabály alkalmazásakor a nyelvtannak el kell döntenie, hogy az automata a jövben milyen állapotokat vegyen fel, addig az automata mozgási szabályai még nagymértékben szabad kezet biztosítanak az automatának. Bárhogyan ,,dönt" is azonban a késbbiekben az automata az állapotok sorozatát illeten, a mozgási szabályból származtatható levezetési szabályok között biztos lesz olyan, amely pontosan ezt az állapotsorozatot írja el. Vagyis a mozgást követ valamennyi állapot-egymásutánhoz tartozik levezetési szabály. Elbbi megállapításunk triviális, ha meggondoljuk, hogy a levezetési szabályok származtatásánál az állapotok sorrendjének összes lehetséges kombinációját figyelembe vettük. Bármi legyen is tehát az állapotok sorrendje, van rá levezetési szabály. St a veremautomata általában nem is tud minden elképzelhet állapot sorrendet létrehozni, így a kombinációk között elfordulhatnak lehetetlenek is. Természetesen, ha az így kiadódó környezetfüggetlen nyelvtanból kiirtjuk a felesleges szimbólumokat, akkor a lehetetlen állapotkombinációknak megfelel levezetési szabályok kiesnek. Amennyiben a nyelvtan képes valamely mondat generálására, akkor ez az állítás egyenérték azzal, hogy csakis lehetséges állapotsorozatnak megfelel levezetési szabályt használtunk fel. Ez annyit jelent, hogy az automata mindig

124

3.5. A környezetfüggetlen nyelvek és veremautomaták

képes mködését olyan értelemben folytatni, hogy a levezetési szabály által megszabott állapotsorozat korrekt legyen. Így, ha van egy szituáció sorozatunk, amely egy jelsorozat elfogadásához vezet, akkor mindig található a mondatszer formáknak olyan egymásutánja, amely az automata által elfogadott mondat levezetését szolgáltatja. Fordítva, ha a nyelvtan képes valamely mondat generálására, akkor az automata a mozgási szabályok alkalmazásával el fogja fogadni a kérdéses jelsorozatot. Egy dologgal még adósak vagyunk. Ha már van egy mondatszer formánk, és vele együtt egy kompatibilis automata szituációnk, akkor a továbbiakban már tudjuk, mit kell tennünk. Ezt az állapotot azonban el kell állítanunk, mert különben nem indulhatunk el a levezetéssel. Ennek érdekében egy új levezetési szabálycsoportot hozunk létre. Legyen az automata kezdállapota q0, és az induló veremtartalom Z. A veremtartalomnál az eddig szokásos indexet a késbbiekre tekintettel elhagytuk. Jelölje itt is S a nyelvtan mondatszimbólumát. Ekkor a következ levezetési szabályokat kell bevezetnünk: S [q0Zsi] (3.59.) ahol ­ si végigfut az összes lehetséges automata állapotokon. Valóban. Induláskor még egyetlen szimbólumot sem olvastunk el, így a mondatszer forma elején nem lehetnek terminális szimbólumok. A verem tartalma csak egyetlen szimbólum, így a mondatszer forma is csak egyetlen nemterminálisból állhat. Tudjuk, a Z verembeli szimbólum megjelenésekor az automata a q0 állapotban van, arról azonban nincs információnk, milyen állapot lesz érvényes akkor, amikor a Z szimbólum kihal. Minthogy a Z szimbólum alatt nincs semmi, ez a verem kiürülését, vagyis a mondat elfogadását jelenti. Fogalmazhattunk volna tehát úgy is, hogy nincs tudomásunk arról, milyen állapotban lesz az automata akkor, amikor elfogadja a jelsorozatot. A jól bevált módszer szerint az összes lehetséges állapotra írunk egy-egy szabályt, valamelyik majd csak eltalálja. Lássunk erre is egy példát. Legyenek a veremautomata mozgási szabályai: (q0, b, Z) = (q1, B) (q0, a, Z) = (q1, A) (q1, a, A) = (q1, AA) (q2, ) (q1, b, A) = (q1, BA) (q1, a, B) = (q1, AB) (q1, b, B) = (q1, BB) (q2, ) (q2, a, A) = (q2, ) (q2, b, B) = (q2, ) Ez az automata régi ismersünk, bár kicsit át lett alakítva annak érdekében, hogy üres veremmel fogadjon el. Nyelve a nem szájbarágós palindrom, azaz ww-1 ahol w az a és b szimbólumokból alkotott tetszleges nem üres jelsorozat. Kezdjük elször a (3.59.) szerinti szabályokkal: S [q0Zq0] [q0Zq1] [q0Zq2]

3. Környezetfüggetlen nyelvek

125

Egy megjegyzés és egy megállapodás. Megbeszélésünk szerint felkészültünk arra, hogy a verem bármilyen állapotban kiürülhet. Ha azonban jobban megvizsgáljuk a nyelvtant, kiderül, hogy a jelsorozat elfogadása, a verem kiürülése csakis a q2 állapotban következhet be. Ebbl következen a fent leírt három szabály közül csak a harmadik, az utolsó vezethet eredményre. Pontosan az, ahol az az állapot szerepel a verem legalsó szimbólumának halála, magyarán a verem kiürítése esetére, amelyben a verem a valóságban kiürül. A másik két szabályban található hármas nemterminálisok nem fordulhatnak el, így feleslegesek. Errl azonban ne vegyünk tudomást, ennek a fésülésnél ki kell derülnie. Az áttekinthetség növelésére, egyszersítés céljából a nemterminális szimbólumokat alkotó hármast jelöljük egy ketts indexszel ellátott nagybetvel. Így például az A12 lesz a [q1Aq2] nemterminális egyszersített jelölése. A kapott eredmények átírása az új jelölésre nyilván nem okozhat gondot. Az automata tíz mozgási szabálya közül négy szabály két-két szimbólumot, két szabály egy-egy szimbólumot végül további négy semmit sem ír be a verembe. Minthogy az állapotok száma három, ezekhez a szabályokhoz rendre 32 = 9, 31 = 3 és 30 = 1 levezetési szabály tartozik. Ha még ezekhez hozzávesszük az induláshoz szükséges három szabályt, akkor kiadódik a levezetési szabályok száma, ami 49. Kétségbe ejten nagy szám, különösen, ha meggondoljuk, hogy ezt a nyelvet egyszer már sikerült leírnunk egy négy szabályból álló nyelvtannal. Csak reménykedni lehet, hogy a fésülés majd jelentsen redukálja a szabályok számát. Ehhez azonban le kell írnunk ezeket a szabályokat. Már csak papírtakarékossági okokból is alkalmazzunk egy jelöléstechnikai huszárvágást. Ott, ahol fel kell venni minden lehetséges állapotot, vezessünk be indexváltozókat azzal, hogy ezeknek végig kell futni a {0,1,2} indexhalmazon. Írjuk le ezzel a konvencióval a levezetési szabályokat, a kiinduló szabályokkal kezdve, egyébként a mozgási szabályok leírásának sorrendjét követve. S Z0i Z0i aA1i Z0i bB1i A1i aA1kAki A12 a A1i bB1kAki B1i aA1kBki B1i bB1kBki B12 b A22 a B22 b Azok a szabályok, ahol két futó index szerepel, 9 levezetési szabályt reprezentálnak, ahol csak egy futó index van, azok hármat. Kezdjük el a nyelvtan fésülését alulról: B0 = { a, b } B1 = { a, b, A22, B22, A12, B12 } B2 = { a, b, A22, B22, A12, B12, Z02 } B3 = B = {a, b, A22, B22, A12, B12, Z02, S } A fésülés hatására valóban sok felesleges szimbólum kihullott. Az is kiadódott, hogy a verem a q2 állapotban ürül ki. A nyelvtan leírásának további

126

3.5. A környezetfüggetlen nyelvek és veremautomaták

egyszersítése érdekében vegyük észre, hogy az A22 és B22 szimbólumoknak csak egyetlen levezetési szabálya van, így azzal egyszersíthetünk, hogy ennek jobboldalát írjuk be mindenüvé, ahol ezek a nemterminálisok levezetési szabályok jobboldalán szerepelnek. Persze ezzel a két érintett szabály el is hagyható. Amint azonban a fenti két nemterminálist kiküszöböltük, valamennyi indexes nemterminálisnak csak egyetlen állapotpárja, indexkettse van. Ezért az indexek nélkül is azonosítani tudjuk ezeket a nemterminálisokat. Végül az S Z02 egyszeres szabályt is elhagyhatjuk, ha a jobboldalon szerepl nemterminális helyébe ezen nemterminális levezetési szabályainak jobboldalát írjuk. Mindezeket a rövidítéseket és egyszersítéseket végrehajtva nyelvtanunk a következ lesz: S aA bB A a aAa bBa B b aAb bBb Ami azt illeti, a nyelvtan valóban megkarcsúsodott.

3.6. Determinisztikus veremautomata Mveletek környezetfüggetlen nyelvekkel
Mieltt a környezetfüggetlen nyelvekre a nyelvi mveleteket sorra vennénk, ismerkedjünk meg a környezetfüggetlen nyelvek egy fontos tulajdonságával, amelyre egyébként a továbbiakban szükségünk is lesz. Ez a ketts pumpálás, amely remélem, minthogy a reguláris nyelvek pumpálásához hasonló jelenség, mint elnevezés polgárjogot fog nyerni. A szakirodalom nem túl nagy találékonysággal vwxyz tételnek nevezi. A tétel állítása a következ: Legyen adott egy környezetfüggetlen nyelvtan. Amennyiben sikerül ezen nyelvtan segítségével egy kell hosszúságú q mondatot generálni, akkor ez a mondat felbontható öt részsorozatra q = vwxyz (3.60.) olymódon, hogy az alábbi jelsorozat vw ixyiz (3.61.) is mondata a nyelvnek. Ennek igazolására tegyük fel, hogy a nyelvtan nemterminális szimbólumainak száma n. Vegyünk egy olyan mondatot, amelynek levezetési fájában van olyan út, amely a gyökértl a levélig több mint n csomópontot tartalmaz. Ez a feltétel adja a kell hosszúság ismérvét.

3. Környezetfüggetlen nyelvek

127

Emlékeztetve arra, hogy a levezetési fában a csomópontok a nemterminális szimbólumoknak felelnek meg, kell hogy legyen olyan nemterminális, amely ezen az úton legalább kétszer elfordul A 3.6. ábrában feltüntettük egy ilyen kell hosszúságú mondat levezetési fáját. Bejelöltük azt az A nemterminális szimbólumot is, amely a fa egyik útján egynél többször elfordul. Megadtuk ezen kívül az egész mondat felosztásának módját.
S

A

A

v

w

x

y

z

3

.6. ábra Természetesen semmi akadálya sincsen annak, hogy az alsóbb szinten helyet foglaló A nemterminális ne csak az x jelsorozatot generálja, hanem ugyanazt, mint magasabb emeleten helyet foglaló ikertestvére, vagyis a wxy jelsorozatot. Más szavakkal megtehetjük, hogy az alsó A nemterminálisra ugyanazt a részfát akasztjuk, amilyen pillanatnyilag a fels, hasonló szimbólumon függ. Ezt a mveletet kell türelemmel folytatva elérhetjük, hogy a w és y jelsorozat annyiszor ismétldjék, amennyiszer csak jónak látjuk. Az igazolás feltételezte, hogy a nyelvtanból az egyszeres szabályokat kiküszöböltük. Az olvasó ezt ­ gondolom ­ minden magyarázat nélkül érzékeli. Ez persze nem korlátozza a tétel érvényességét, hiszen korábban láttuk, hogy minden nyelvtanból készíthetünk egy vele egyenérték, de egyszeres szabályt nem tartalmazó nyelvtant. A két w és y részsorozat közül bármelyik, de egyidejen nem mindkett az üres jelsorozat is lehet.

128

3.6. Determinisztikus veremautomata

Legyen a nyelvtan levezetési szabályainak leghosszabb jobboldala s hosszúságú. Ahhoz, hogy a levezetési fában szükségszeren találjunk olyan utat, amelyben egy nemterminális legalább kétszer elfordul, n különböz szinten kell helyettesítési szabályt alkalmaznunk. Amennyiben csak n-1 emeletünk van, akkor nem biztos, hogy van a fában olyan út, amely valamelyik nemterminálist kétszer tartalmazza. Ezek szerint n-1 emeletes fával még nem generáltunk kell hosszúságú mondatot. Ha most feltételezzük, hogy minden alkalmazott szabály jobboldala s hosszúságú volt, akkor ily módon egy sn-1 (3.63.) mondatot kapunk. Az ennél hosszabb mondatok levezetési fája már biztosan tartalmaz olyan utat, amelyben valamely nemterminális legalább kétszer elfordul, tehát kell hosszúságú. Emlékeztetnék arra, hogy az a ibi nyelvrl éppen a pumpálási képesség hiánya miatt ismertük fel, hogy az nem reguláris nyelv. A nyelv ugyanakkor ­ ahogy az egy környezetfüggetlen nyelvhez illik ­ teljesíti a ketts pumpálás feltételeit, kielégíti a vwxyz tételt. A legels nyelv, amellyel találkoztunk, az aibici i>0 nyelv volt. Az erre a nyelvre megadott nyelvtan, mint az késbb kiderült, nem csökkent, azaz els nyelvosztályba tartozó volt. Mostani ismereteink tükrében ez teljesen korrekt lépés volt, hiszen ez a nyelv nem képes ketts pumpálásra, tehát nem lehet környezetfüggetlen nyelv. Ennek a megállapításnak a késbbiekben hasznát vesszük. Térjünk most át a környezetfüggetlen nyelveken végzett mveletekre, és azok zártságára. Most is, mint a véges automatáknál kezdjük el a komplemensképzéssel. Az univerzum persze itt is a * halmaz lesz. A véges automaták esetében alkalmazott alapgondolat, az állapotok minsítésének felcserélése itt is jó ötletnek látszik. Ennek kapcsán persze olyan veremautomatát kell szem eltt tartanunk, amely állapottal fogad el. Ez a nyelvre nem jelent korlátozást, hiszen minden nyelvhez szerkeszthet állapottal elfogadó veremautomata. A véges automatáknál végzett vizsgálatokból kitnt, hogy nemdeterminisztikus automaták esetében problémák merülhetnek fel. Ezért aztán, ha nemdeterminisztikus automatával volt dolgunk, akkor munkánkat azzal kezdtük, hogy egy, az eredeti automatával egyenérték determinisztikus automatát készítettünk. Tehettük, mert volt erre algoritmusunk.

3. Környezetfüggetlen nyelvek

129

A veremautomatáknál, mint kitnik nem ez a helyzet. Mint késbb igazoljuk, nem készíthet olyan algoritmus, amely tetszleges nemdeterminisztikus veremautomatából determinisztikusat szerkeszt. Ugyanis, mint arról már említést tettünk, a veremautomaták világában is definiálhatunk determinisztikus automatát. Emlékeztetül álljon itt ismét ennek meghatározása. Egy veremautomata akkor determinisztikus, éspedig mind a valódi, mind az -mozgásokra nézve, ha minden esethez, tehát állapot, beolvasott karakter, veremtet hármashoz, illetve -mozgások esetében állapot­veremtet párhoz legfeljebb egy mozgási szabály tartozik. Ezen túlmenen a valódi és -mozgások között sem lehet átfedés, így ha valamely állapot­veremtet párosra -mozgás van definiálva, akkor ez a páros semmilyen beolvasott karakterrel sem alkothat olyan hármast, amelynél valódi mozgás lehetséges. Ez annyit jelent, hogy nem csak a valódi mozgásokon belül, illetve -mozgások között nem jöhet létre konfliktushelyzet, de a valódi és -mozgások között sem. Sajnos a fentiek értelmében vannak olyan nemdeterminisztikus veremautomaták, amelyek nem alakíthatóak át. Az ilyen automatáknál a véges automatáknál bevált módszer nem alkalmazható a komplemens nyelv automatájának megszerkesztésére. Ennek a problémának a megkerülésére tételezzük fel, hogy veremautomatánk eleve determinisztikus volt. Persze itt tudomásul kell vennünk, hogy ez egy lényeges korlátozást jelent, a továbbiakban csak determinisztikus környezetfüggetlen nyelveket vizsgálunk, vagyis olyanokat, amelyek determinisztikus veremautomatával elfogadhatóak. A veremautomatáknál gondot okozott az is, ha az automata nem volt teljesen specifikálva. Ezt a betegséget itt is tudjuk kezelni. Vezessünk be itt is egy nem elfogadó csapdaállapotot, és ha valamelyik szituációra nincsen mozgási szabály, akkor erre az esetre hozzunk létre egy olyan mozgási szabályt, amely a csapdaállapotba viszi át az automatát. Ha egyszer beleestünk a csapdába, akkor onnan nem lehet kimászni, hiszen az ismert módszer szerint a csapdában mindent el tudunk olvasni, ezért lesz az automata teljesen specifikált, de ugyanakkor benne maradunk a csapdaállapotban. A véges automatáknál ennyi elkészület után már megcserélhettük az állapotok minsítését, és ezzel megkaphattuk a komplemens nyelvet elfogadó véges automatát. Sajnos a veremautomaták esetében a helyzet bonyolultabb. Itt kétféle veszéllyel is szembe kell néznünk. Az egyik a végtelen -ciklus. A teljes specifikáció ugyanis nem zárja ki, hogy az automata -mozgások végtelen ciklusába kerüljön. Ilyenkor persze több valódi mozgást, olvasást nem végez, és a jelsorozatot nem tudja végigolvasni, jóllehet az automata állandóan mozgásban van. Az átminsítés ezen nem

130

3.6. Determinisztikus veremautomata

változtat, a jelsorozatot sem az eredeti, sem az átminsített veremautomata nem fogadja el. A másik zavart az okozhatja, hogy a jelsorozat végigolvasása után az automata -mozgásokkal bolyongásba kezd, és ezalatt mind elfogadó, mind visszautasító állapotokat érint. Ez a helyzet az átminsítéssel sem változik meg, csupán az elfogadó és visszautasító állapotok cserélnek szerepet. A jelsorozatot mind az eredeti, mind az átminsített automata elfogadja. Az alábbiakban ezeken a nehézségeken igyekszünk majd eredménnyel úrrá lenni. Az els esetben a végtelen ciklus tényét, bekövetkezését próbáljuk detektálni. Ha ez sikerül, akkor nyert ügyünk van. Ilyenkor ugyanis a ciklusból kilépve csapdaállapotba vihetjük át az automatát, ahol a jelsorozatot végigolvassuk, és visszautasítjuk. A második esetben, az utólagos -bolyongások alkalmával külön kell választanunk azokat a mozgássorozatokat, amikor az automata érintett, illetve nem érintett elfogadó állapotot. Kezdjük a végtelen ciklussal. Amennyiben a veremautomata végtelen -ciklusba kerül, akkor a verem tartalma vagy minden határon túl növekszik, vagy egy minimum és maximum között lélegzik. A két szindróma különböz gyógykezelést igényel. Tekintsük elször azt az esetet, amikor a verem tartalma minden határon túl növekszik. Bár ebben az esetben is akadhat olyan -mozgás, amikor a verem tartalma csökken, magyarán szólva a leemelt szimbólum helyébe nem írunk semmit, összességében a verem növekedik. Lesznek tehát szükségképpen olyan -mozgások, amelyet követen a verem a jelenlegi mélységénél mindig nagyobb lesz, az automata sohasem tér vissza a verem ezen pontjára. Ez annyit jelent, hogy ilyen mozgásoknál a veremnek a veremtet alatti része örök idkre el van temetve, így annak tartalma az automata további mködését nem befolyásolhatja. Az ilyen mozgások esetén tehát az egész folyamat további menetét csakis a mozgást kiváltó automata állapot és veremtet alkotta pár határozza meg. A végtelen mozgássorozat egy ciklusát két ilyen, azonos állapotveremtet párossal kiváltott, soha vissza nem tér veremtartalmú -mozgás által határoltnak tekintjük. Az a feltételezés, hogy a verem tartalma minden határon túl növekszik annyit jelent, hogy egy ilyen ciklus alatt a verem tartalma valamelyest n. Felmerül a kérdés, hány -mozgás lehetséges, és mekkora lehet a verem tartalmának növekedése egy ilyen ciklusban. Legyen az automata állapotok száma n, és a verem alfabetájának számossága pedig m. Nyilvánvaló, hogy a ciklust alkotó -mozgások számának fels korlátja n x m.

3. Környezetfüggetlen nyelvek

131

Ez természetesen az összes lehetséges mozgások száma. Persze ha az -mozgások kihasználnának valamennyi lehetséget, akkor ­ minthogy az automata determinisztikus, ­ valódi mozgásokra már nem jutna szabály. Így az elbb megadott érték durva fels becslés. Legyen az egy mozgás következtében elálló maximális veremtartalom növekedés s. Ez a legszószátyárabb szabály által beírt szimbólumok számánál eggyel kevesebb. Ezzel az egy ciklus során mutatkozó tartalom növekedés fels korlátja nxmxs (3.64.) Ha azt tapasztaljuk, hogy a veremtartalom növekedése ennél az értéknél nagyobb, akkor bizonyosak lehetünk abban, hogy a vermet egy végtelen -ciklus tölti túl. A fenti eredmény kezünkbe adja annak kulcsát is, hogyan lehet a két széls állás között ingadozó veremtartalom esetét detektálni. Az ingadozó verem változó hosszára ugyanis a (3.64.) összefüggés korlátot jelent. A lélegz veremrészlet nagysága így nem lehet tetszlegesen hosszú. A legfeljebb (3.64.) szerinti hosszúságú verem viszont csak véges sok különböz tartalmat vehet fel. Ennek számossága az eddigi jelölésekkel: m( n x m x s) (3.65.) Ezzel a nagyon durva becsléssel általában igen nagy, de azért véges számot kapunk. Ha most figyelembe vesszük, hogy ugyanaz a veremtartalom és ugyanaz az automataállapot határol egy ciklust, akkor megadhatjuk azt a legnagyobb lépésszámot, amelybl egy ciklus állhat. Ennek értéke: n x m( n x m x s) (3.66.) Ezek szerint az -mozgások okozta végtelen ciklus, ha az túltölti a vermet, akkor a növekedés mértékével, ha a verem korlátos marad, akkor a lépésszámmal detektálható. Éppen ezért az automata állapotába iktassunk be két indikátort, az egyik a verem hosszát, a másik a lépésszámot vigyázza. Minthogy ez az ellenrzés csak az -mozgásokra terjed ki, minden valódi mozgás nullázza ezeket az indikátorokat. Ez az információ beiktatható az automata állapotterébe, hiszen a két indikátor legfeljebb a (3.64.) illetve (3.66.) összefüggésekkel megszabott értékeket veheti fel. Így az eredeti állapottér és a két indikátor direkt szorzata is véges halmazt, állapotteret alkot. Készítsünk tehát egy olyan veremautomatát, amelynek állapothalmaza az eredeti automata állapothalmazának, és a két indikátor értékkészletének direkt szorzata. Egészítsük ki ezt még egy csapdaállapottal, és detektált végtelen ciklus esetében ebbe a csapdába essünk bele. Az eredeti és az új automata, mint látjuk,

132

3.6. Determinisztikus veremautomata

ugyanazt a nyelvet fogadja el, azzal a lényeges különbséggel, hogy míg az elbbi bizonyos jelsorozatok esetén végtelen ciklusba kerül, és a jelsorozatot el sem tudja olvasni, addig az új a végtelen ciklusból kitör, és minden jelsorozatot végigolvas. Az elbbi kényes jelsorozatoknál persze visszautasítja az elolvasott jelsorozatot. Ezzel az egyik betegségre már megtaláltuk a gyógyszert. A másik problémát, az elolvasás után az elfogadó és visszautasító állapotok között kószáló automata kérdését a következképpen oldhatjuk meg. Készítsünk az eredeti automatából származtatott olyan új veremautomatát, ahol az eredeti automata mindegyik állapotának az új automata négy állapota felel meg. Tekintsük ezeket az eredeti állapot alállapotainak, és a 0, 1, 2 és 3 indexekkel különböztessük meg azokat. Egy valódi mozgás során az automata vagy a 0 vagy az 1 alállapotot veszi fel, aszerint, hogy az állapot visszautasító vagy elfogadó állapot. Természetesen a ,,fállapot" vagyis az az állapot, amelynek alállapotairól beszélünk, minden esetben megegyezik az eredeti automata állapotával. Ha most az automata a valódi mozgást követen -mozgásokba kezd, akkor a 0 index alállapot addig lesz érvényes, amíg az automata -mozgása során csakis visszautasító állapotokat érint. Ha közben egyszer is elfogadó állapotba került, azonnal átvált az 1 index alállapotokra, és azt többet az -mozgások során nem hagyja el. Ily módon az alállapot memorizálja, érintett-e az utolsó valódi mozgás óta az automata az -mozgások során elfogadó állapotot. Itt az elfogadó illetve visszautasító állapot az eredeti automata állapotainak minsítését jelenti. Ha most az -mozgássorozat végén valódi mozgásra kerül sor, akkor ezt megelzen az új automata még egy -mozgást végez, nevezetesen alállapotot vált. Ha az alállapot 0 volt, akkor a 2 alállapotra, ha 1 volt, akkor a 3 alállapotra vált át. Ha most bekövetkezik a valódi mozgás, akkor az egész folyamat a maga alállapotaival újra kezddik. A módszer értelme akkor tnik ki, amikor ­ bár az automata felkészült a valódi mozgás végrehajtására, ­ erre nem kerül sor. Ez akkor következik be, amikor az automata a teljes jelsorozatot már elolvasta, és hiába van meg a szándék a valódi mozgás végrehajtására, nincs hozzá karakter az olvasófej alatt. Ilyenkor az automata mozgásképtelenné válik, és ott marad, ahol van, vagyis a 2 alállapotban, ha az utolsó valódi mozgás óta nem érintett elfogadó állapotot, vagy a 3 alállapotban, ha elfogadó állapotot érintett. Nyilvánvaló, hogy az új automatában a 3 alállapotokat kell elfogadó állapotoknak tekinteni, míg a 2 alállapot visszautasító. A komplemens nyelvet elfogadó automatánál persze a 2 lesz az elfogadó alállapot, a 3 pedig a visszautasító. A 0 és 1 alállapotok mindkét automatánál visszautasítanak. Ez nem okoz

3. Környezetfüggetlen nyelvek

133

gondot, hiszen a jelsorozat elolvasása után az automatának mindent el kell követnie, hogy elfogadó állapotba kerüljön. Két megjegyzés. Azt állítottuk, hogy az eredeti automata minden állapotához négy alállapotot rendelünk. A helyes szöveg legfeljebb négy lett volna, hiszen az elfogadó fállapothoz nem tarozik 0 alállapot, és ennek következtében 2 alállapot sem. A vázolt megoldással mellékeredményként azt is elérjük, hogy elfogadást követen az automata már nem végezhet több mozgást. Mint láttuk bár kissé nyögvenyelsen, és nagy árat fizetve, de sikerült a determinisztikus veremautomaták minden betegségét kikúrálnunk, és a komplemens nyelvre egy determinisztikus veremautomatát szerkesztenünk. Definíció szerint determinisztikusak azok a környezetfüggetlen nyelvek, amelyekre determinisztikus veremautomatát lehet szerkeszteni. Ennek alapján ezt az eredményt úgy is fogalmazhatjuk, hogy a determinisztikus környezetfüggetlen nyelvek zártak a komplemens képzés mveletére. A többi nyelvi mvelettel nem lesz ennyi gondunk. Nézzük két nyelv unióját. Legyen adott két környezetfüggetlen nyelv nyelvtanával. Amennyiben a két nyelvtan nemterminális szimbólumai nem alkotnak diszjunkt halmazokat, akkor ezt a nemterminálisok átnevezésével érjük el. Legyenek S1 és S2 a két nyelvtan mondatszimbólumai. A két nyelvtan valamennyi levezetési szabályából alkossunk egy új nyelvtant, fosszuk meg az eredeti mondatszimbólumokat ettl a rangjuktól, végül vezessünk be egy új S mondatszimbólumot, és két új levezetési szabályt: S S1 S S2 Vegyük észre, hogy az így kiadódó nyelvtan akkor sem determinisztikus, ha az eredeti két nyelvtan determinisztikus volt. Triviális, hogy az így konstruált új környezetfüggetlen nyelvtan a két nyelv unióját generálja. A környezetfüggetlen nyelvek tehát zártak az unióképzésre. Vegyük most két nyelv metszetét. Definiáljunk két nyelvet. Az els mondatainak alakja: aibick a másiké aibkck Minkét nyelv determinisztikus környezetfüggetlen nyelv. Errl az olvasó is meggyzdhet, ha szerkeszt hozzájuk determinisztikus veremautomatát. A feladat nem túl nehéz.

134

3.6. Determinisztikus veremautomata

Könny belátni, hogy a két nyelv metszete aibici amirl nemrég láttuk be, hogy nem környezetfüggetlen nyelv, hiszen nem tud kettsen pumpálni. Ezek szerint a környezetfüggetlen és ezen belül a determinisztikus környezetfüggetlen nyelvek nem zártak a metszet mveletére. Az a tény, hogy a környezetfüggetlen nyelvek nem zártak a metszés mveletére persze nem jelenti azt, hogy két környezetfüggetlen nyelv metszete minden esetben kilép a környezetfüggetlen nyelvek halmazából. Például, ha egy környezetfüggetlen nyelvet önmagával mint másik környezetfüggetlen nyelvvel elmetszünk, akkor az eredmény nyilván az eredeti nyelv lesz, amely definíciószeren környezetfüggetlen. Egy másik triviális példa. Ha két környezetfüggetlen nyelv diszjunkt, akkor metszete az üres nyelv, amely nem csak környezetfüggetlen, hanem reguláris is. Az az állítás, hogy a környezetfüggetlen nyelvek nem zártak a metszésre, úgy értelmezend, hogy biztosan lehet találni két olyan környezetfüggetlen nyelvet, amelyeknek a metszete nem környezetfüggetlen. Ami azt illeti mi találtunk ilyet. Azt nehezen, de igazoltuk, hogy a determinisztikus környezetfüggetlen nyelvek zártak a komplemens képzésre. Nem lehetne ezt az állítást általánosítani, más szóval nem zártak-e a környezetfüggetlen nyelvek általában a komplemens képzésre. Nem lehet. Azt ugyanis tudjuk, hogy a környezetfüggetlen nyelvek zártak az unióképzésre. Ha a komplemens képzésre is zártak lennének, akkor a de Morgan szabályok alapján ­­­­­­­­­­­­­ ­­­­­­­­­­­­­ ( A B ) = (A B ) ( A B ) = (A B ) zártaknak kellene lenniök a metszet képzésre is. Errl viszont tudjuk, hogy nem igaz, következésképpen az a feltételezésünk, hogy a környezetfüggetlen nyelvek zártak a komplemens képzésre hamis. Hasonló módon lehet belátni, hogy a determinisztikus környezetfüggetlen nyelvek nem zártak az unióképzésre. Azt tudjuk, hogy ezek a nyelvek a komplemens képzésre zártak, ha zártak lennének az unióképzésre is, akkor zártak volnának a metszet mveletére is, ami viszont nem helytálló. Ebbl viszont az is következik, hogy a csak nemdeterminisztikus veremautomatával elfogadható környezetfüggetlen nyelvek halmaza nem üres, hiszen kell, hogy legyen két olyan determinisztikus környezetfüggetlen nyelv, amelynek az uniója nemdeterminisztikus. Így a determinisztikus környezetfüggetlen nyelvek halmaza a környezetfüggetlen nyelven halmazának valódi részhalmaza. Két környezetfüggetlen nyelv konkatenáltja. Legyen a két nyelv nyelvtanával adott. Gondoskodjunk arról, hogy a két nyelvtan nemterminálisai diszjunkt halmazt alkossanak. Fosszuk meg

3. Környezetfüggetlen nyelvek

135

mondatszimbólum címétl a két nyelv S1 és S2 eredeti mondatszimbólumait, vezessünk be egy új S mondatszimbólumot, egyesítsük a két nyelvtan levezetési szabályait, végül adjuk hozzá az S S1S2 (3.67.) levezetési szabályt. Magyarázat nélkül is érthet, hogy ez a nyelvtan valóban a konkatenált nyelvet generálja. Ezek szerint a környezetfüggetlen nyelvek zártak a konkatenáció mveletére. Környezetfüggetlen nyelv tranzitív lezártja. Legyen a környezetfüggetlen nyelv nyelvtanával adott, és mondatszimbóluma legyen S. Egészítsük ki a nyelvtan levezetési szabályait két új szabállyal: S S SS (3.68.) Az els szabály gondoskodik arról, hogy az üres jelsorozat eleme legyen a nyelvnek, a második szabály segítségével viszont olyan hosszú csak a mondatszimbólumból álló mondatszer formát generálhatunk, amilyen hosszút csak jólesik, Ezek mindegyikébl pedig generálható az eredeti nyelvnek egy mondata. Azonban itt is szükség van óvatosságra. Ha az eredeti nyelvnek az üres jelsorozat nem volt eleme, vagyis nem volt levezethet az S mondatszimbólumból, ugyanakkor a mondatszimbólum szerepel levezetési szabályok jobboldalán, vagyis újra megjelenhet mondatszer formákban, akkor az S szabály bevezetésével olyan jelsorozatokat is elfogadhatunk, amelyek sem az eredeti nyelvnek, sem tranzitív lezártjának nem mondatai. Ennek elkerülésére el kell érnünk, hogy a mondatszimbólum ne szerepeljen levezetési szabály jobboldalán. A módszer - új mondatszimbólum bevezetése, és a régihez tartozó szabályok multiplikálása - betre megegyezik a reguláris nyelvtanoknál követettel. Ebbl következen a környezetfüggetlen nyelvek zártak a tranzitív lezárt képzésre. Térjünk vissza még egyszer a metszet mveletére. Azt tudjuk, hogy két reguláris nyelv metszete reguláris. Az is ismert, hogy két környezetfüggetlen nyelv metszete általában nem környezetfüggetlen. Kérdés mit állíthatunk egy reguláris és egy környezetfüggetlen nyelv metszetérl. A metszet nyelv környezetfüggetlen lesz. A bizonyítás persze itt is konstruktív, vagyis készítünk egy olyan veremautomatát, amely a metszet nyelvét fogadja el. A véges automaták esetében láttuk, hogyan lehet két automatát összekapcsolni olymódon, hogy az új automata a két automata nyelvének metszetét fogadja el. Ezt az ötletet itt is alkalmazhatjuk, hiszen a veremautomata magja egy véges automata. Bizonyos óvatossággal egyesíthetjük ezt a magot a reguláris nyelvet elfogadó automatával.

136

3.6. Determinisztikus veremautomata

Ha a véges automata illetve veremautomata állapottere QM és QP akkor a szerkesztett veremautomata állapottere a két állapottér direkt szorzata QM x QP lesz. Amennyiben a környezetfüggetlen nyelv veremautomatája valódi mozgást végez, vagyis olvas, az új automata mozgási szabálya a két mozgás összekapcsolásából adódik. Legyenek az eredeti mozgási szabályok: (3.69.) ( p, a ) = q ( s, a, X ) = ( t, ) p, q QM és s, t Q P Ebbl a két szabályból az új automata következ mozgási szabálya származik: ( p-s, a, X ) = ( q-t, ) (3.70.) Amikor a veremautomata -mozgást végez, akkor a véges automata ,,pihen", nem változtatja állapotát ( s, , X ) = ( t, ) így ennek a szabálynak az átírása: (3.71.) ( x-s, , X ) = ( x-t, ) x QM A szerkesztett automata kezdállapota természetesen a két automata kezdállapotainak ,,direkt" szorzata lesz, míg a kezd veremszimbólum megegyezik a környezetfüggetlen nyelv veremautomatájának kezd veremszimbólumával. Amennyiben az eredeti veremautomata állapottal fogadott el, akkor már készen is vagyunk, a szerkesztett automata is állapottal fogadjon el, és az elfogadó állapotok halmaza a két automata elfogadó állapotainak direkt szorzatából adódik. Amennyiben az eredeti veremautomata üres veremmel fogadott el óvatosan kell eljárnunk, hiszen ha az eredeti veremautomata kiürítette a vermét, akkor a szerkesztett is ezt teszi, függetlenül attól, hogyan viselkedik az eredeti véges automata. Ha a véges automata nem elfogadó állapotban fejezte be vándorlását, akkor hiába üres a verem, a jelsorozatot nem szabad elfogadni. Ha az új szerkesztett automatát is üres veremmel elfogadónak képzeljük, akkor a következképpen járhatunk el. Induláskor a vermet kibéleljük. Amennyiben az eredeti veremautomata elfogadott, vagyis kiürítette a vermét, akkor az új automata vermében már csak ez a bélés marad. Ha ezzel egyidejen a véges automata is elfogadást mutat, akkor egy -mozgással kiemeljük a bélést a verembl, és teljesen kiürítjük azt. Ezzel az automata a jelsorozatot elfogadja. Ez lényegében megegyezik azzal a módszerrel, amelyet az állapottal elfogadó veremautomatával egyenérték üres veremmel elfogadó automata szerkesztésekor alkalmaztunk. Ezekhez a módosításokhoz szükséges mozgási szabályok a következk: ( q0 - s0', , Z0 ) = ( q0 - s0, Z0 Z0') (3.72.) illetve ( x-y, , Z0' ) = ( x - y, ) x FM y QP (3.73.) ahol ­ FM a véges automata elfogadó állapotainak halmaza. Az összefüggések megértéséhez magyarázat nem szükséges.

4. Fordító automaták
4.1. Véges fordítók
Mieltt a fordító automatákról szót ejtenék, definiálnunk kell mit értünk fordítás alatt. Mint azt korábban megszokhattuk, erre a fogalomra is egy teljesen formális meghatározást adunk, amelynek természetesen mégis van kapcsolata a fordítás köznapi fogalmával. Legyen adott két véges alfabeta és . Jelölje most is * illetve * a fenti alfabetákból alkotott véges, de nem korlátos jelsorozatok halmazát. Képezzük most ezen két megszámlálhatóan végtelen számosságú halmaz direkt szorzatát: * x * (4.1.) A fordítás ennek az egyébként szintén megszámlálhatóan végtelen számosságú halmaznak egy részhalmaza. Ezen részhalmaz elemei jelsorozatpárok lesznek, ahol az els jelsorozat a *, a második pedig a * halmaz eleme. Ha a T részhalmaz (T mint translation ) tartalmazza az - párt, vagyis ( , ) T (4.2.) akkor az jelsorozat az jelsorozat fordítása. Vegyük észre, hogy sem az egyértelmségre, sem a teljességre nem tettünk semmiféle kikötést. Ez megegyezésben van a fordításról alkotott eddigi nézeteinkkel. Gondoljunk például egy angol ­ magyar fordításra. Ebben az esetben a , illetve alfabeta az angol illetve magyar ábécé jelkészlete. Nyilvánvaló, hogy nem minden jelsorozat képvisel értelmes, és ezért fordítható angol mondatot, így a * nem minden elemének van fordítása. Ugyanakkor egy angol mondatnak több magyar egyenértékese lehet, és fordítva különböz angol mondatoknak felelhet meg ugyanaz a magyar mondat. Ez a talán túlzottan absztrakt definíció, amely valóban lefed minden elképzelhet fordítási esetet, éppúgy teljesen használhatatlan, mint a nyelv teljesen általános meghatározása volt. Persze vannak nagyon egyszer fordítások, amelyek formális eszközökkel kezelhetek. A legegyszerbb az izomorfizmus, amikor az egyes szimbólumokat külön-külön írjuk át az egyik alfabetáról a másikra. Ez a helyzet például akkor, amikor valamilyen mondjuk cirill vagy görög betkkel leírt szöveget írunk át latin bets alakra. Egy görög példa ( , Thessalia ) T

138

4.1. Véges fordítók

A fordítás egyszersége nem ad semmilyen felvilágosítást a fordítandó nyelv bonyolultságáról. Adott esetben ez a görög nyelv, amelynek leírásához bizonyára legalábbis 0-ás osztályú nyelvtan lenne szükséges. A legegyszerbb fordítóautomata a véges fordító. Ez csak néhány részletben tér el a véges automatától. A fordító automatáknak nem csak bemeneti, hanem kimeneti berendezésük is van. Így itt az olvasó mellett egy nyomtatót, vagy szalaglyukasztót kell elképzelnünk. Ami a véges fordító formális leírását és ábrázolását illeti, ez nagyon hasonlít a véges automatáéhoz. Természetesen az állapotok száma itt is véges. A bemen alfabeta mellett azonban itt egy kimen alfabeta is van. Az automata mködése során ugyanis a bemeneti szöveg olvasásával egyidejen kiadja a kimeneti berendezésen az olvasott szöveg fordítását. A mozgási szabályok annyiban bvebbek, hogy a mozgás eredménye kapcsán nem csak az automata vesz fel egy új állapotot, hanem kiadhat egy korlátos hosszúságú jelsorozat fragmenst is. Ha egy véges fordító egy mozgás során kiírt jelsorozatainak maximális hossza k, akkor a mozgások az alábbi leképezést adják: (4.3.) Q x Q x k ahol ­ Q az állapotok halmazát, ­ és a bemen illetve kimen alfabetát, ­ k a alfabeta feletti, legfeljebb k hosszúságú jelsorozatok halmazát jelenti. A fordító automatának nincsenek megkülönböztetett elfogadó állapotai. Nem a fordító automata feladata ugyanis a fordítandó szöveg helyességének ellenrzése. Az elbbi, a görög ábécérl latinra átíró, és véges fordítóval magától értetden megoldható fordítás esetében nem az automata feladata a bemeneti szöveg görög voltának megállapítása. A 4.1. ábra egy véges fordítót tüntet fel, amely a és b szimbólumokból álló jelsorozatokat alakít át c és d szimbólumokat tartalmazó jelsorozatokká. Az eredeti a és b szimbólumokból álló jelsorozatot kettesével párosítva foglalja össze, és ha a pár azonos szimbólumokat tartalmaz, d, ellenkez esetben c szimbólumot ad ki.

a/c

a/d

B

b/ b/d

S
4.1. ábra

a/ b/c

A

4. Fordító automaták

139

Az ábrában a mozgásnak megfelel nyilakon most nem csak az olvasott, hanem a kiírt szimbólumot is feltüntettük. A két szimbólumot a / jel választja el. Természetesen, ahol szerepel akár mint olvasott, akár mint kiírt szimbólum, ott nem történik olvasás, illetve kiírás. Ha például a bemen nyelvnek azt a nyelvet használjuk, amelyben mind az a mind a b karakterek száma páros, akkor olyan nyelvet kapunk, ahol a c szimbólumok száma páros, a d szimbólumoké tetszleges. Ez esetben mind a bemen, mind a kimen nyelv reguláris nyelv. A 4.2. ábrán egymás mellett tüntettük fel a bemen, illetve kimen nyelvet elfogadó automatákat.

S
b

a

A
b

d

d c

S

P

B

a

C

4.2. ábra Az, hogy a fordítás eredménye is reguláris nyelv nem véletlen. A fordító automatákkal végzett mvelet egy nyelvbl egy másikat készít, a kimenet nyelvét. Ezt felfoghatjuk úgy, mint nyelvi mveletet, amely egy nyelvhez egy másikat rendel. Amennyiben a fordító automata egy véges fordító, akkor az automatával végrehajtott transzformációra mind a reguláris, mind a környezetfüggetlen nyelvek zártak. Így, ha a bemenet nyelve reguláris illetve környezetfüggetlen volt, az lesz a kimenet nyelve is. Igazoljuk ezt az állításunkat a környezetfüggetlen nyelvek esetére. A bizonyítás ­ mint megszokhattuk, ­ ismét konstruktív lesz, vagyis a bemen nyelv automatájából és a véges fordítóból megszerkesztjük a kimenet nyelvét elfogadó automatát. Esetünkben, minthogy környezetfüggetlen nyelvrl van szó a bemenet és a kimenet nyelvét elfogadó automaták veremautomaták. Legyen tehát adott a bemen nyelvet elfogadó veremautomata, és a véges fordító. Alakítsuk át a fordító automatát, ha szükséges, olymódon, hogy egy mozgás során vagy csak egyetlen szimbólumot olvas, vagy csak egyetlen szimbólumot ír ki. Így a módosított fordító mozgási szabályai vagy a/ vagy /x alakúak. Ez nem okoz problémát. Ha az eredeti automata egy mozgása során egy szimbólumot olvasott, és i szimbólumot írt ki, akkor ennek hatását i+1 sorba kapcsolt olyan mozgással tudjuk leképezni, amelybl egy csak olvas, i pedig egy-egy karaktert kiír.

140

4.1. Véges fordítók

Tételezzük fel, hogy a fordítónak van a/x mozgása, ahol x=b1b2...bi . Az átalakítást a 4.3. ábra szemlélteti.

a/x

A
a/ /b1 /b2 /b3

B
/bi

A
4.3. ábra

B

Persze ez az átalakítás azzal jár, hogy a fordító automatát óvatosabban kell kezelnünk. Tételezzük fel, hogy az eredeti fordító automatában egyik él az a/x feliratot viselt, ahol x egy i hosszúságú jelsorozat volt. Ennek a mozgásnak végrehajtása során az automata beolvasta az a karaktert, és a teljes x sorozatot kiírta. Az új automata sem viselkedhet másként, annak ellenére, hogy ezt az egyetlen mozgást itt i+1 mozgás sorozataként végezzük el. Ez annyit jelent, hogy ha az automata egyszer elindult ezen a soros mozgásláncon, akkor azt végig kell járnia, nem állhat meg útközben. A számítástechnikában az olyan mveletsorozatot, amelyet vagy nem hajtunk végre, vagy ha igen, akkor teljes egészében, mégpedig úgy, hogy közben más mveletet nem kezdünk el, primitívnek nevezik. Az a/x mvelet tehát primitív. Ezek szerint lesznek az új automatának olyan állapotai, ahol befejezheti mködését, más állapotokban viszont nem állhat le. A kétféle állapotot meg kell különböztetnünk. Kézenfekvnek látszik az a megoldás, amikor a megállásra engedélyezett állapotokat ketts körrel emeljük ki. Az automata rajza szerint tehát mégis lesznek elfogadó, és visszautasító állapotok, pontosabban itt ezt úgy kell értelmezni, hogy bizonyos állapotokban abba lehet hagyni a mködést, másokban viszont végig kell menni a következ megállóhelyig. Tételezzük fel, hogy a véges fordító automatán elvégeztük ezt a beavatkozást, tehát az a mozgások során egyetlen karaktert vagy olvas, vagy ír, és a megállás tekintetében különbséget teszünk az állapototok között. Ami a bemen nyelv veremautomatáját illeti, feltesszük, hogy az egyetlen állapottal bíró, és üres veremmel elfogadó automata. Ha eredetileg nem ilyen lett volna, átalakítjuk. Emlékeztetül az ilyen automatát a nyelvtanból úgy lehet származtatni, hogy a bemeneti alfabeta minden a szimbólumára létesítünk egy ( q, a, a ) = ( q, ) a mozgási szabályt, míg minden A alakú levezetési szabályának egy ( q, , A ) = ( q, ) A alakú szabályt.

4. Fordító automaták

141

Az utóbbi szabályokkal generáljuk a mondatot, míg a nyelvtantól független szabályokkal ellenrizzük, hogy a generált szöveg megegyezik-e a bemenettel. Az új veremautomata állapothalmaza a véges fordító állapothalmaza lesz. Pontosabban a két automata állapotainak direkt szorzatát kellene vennünk, de minthogy szerencsénkre az eredeti veremautomatának csak egyetlen állapota van, megengedhetjük magunknak azt a lazaságot, hogy a veremautomata állapotát egyszeren elhagyjuk. A véges fordítónak az átalakítás után lesznek olvasó és kiíróállapotai. Legyenek a véges fordító állapotai p0, p1, p2, . . . pn P . A veremautomata mondatgeneráló mozgási szabályait megtartjuk azzal a kiegészítéssel, hogy ezek a szabályok minden állapotban alkalmazhatóak: ( pi , , A ) = ( pi ,) pi P (4.4.) A koncepció szerint az új veremautomata is generálja ezekkel a szabályokkal a veremben a fordítandó szöveget. Ha a verem tetején terminális szimbólum található, akkor ez a fordítandó szöveg következ karaktere. Ezt kell tulajdonképpen elolvasnia a véges fordítónak, és ennek során állapotot váltania. Ezt úgy képezhetjük le, ha a véges fordító nem a bemenetrl, hanem a verem tetejérl olvas. Figyelembe véve, hogy az új veremautomata állapotai követik a véges fordító állapotváltozásait, az eredetileg olvasó mozgások átírása a következ lesz: (4.5.) ( pi , a ) = ( pk , ) ( pi , , a ) = ( pk , ) A véges fordító másik szabályrendszere eredetileg a kimenetet, a fordítást írta le. Minthogy ilyenkor az automata nem olvas ezek tulajdonképpen -szabályok. (4.6.) ( pu , ) = ( pv , b ) A véges fordító eredetileg a fordított, kimeneti nyelv egy mondatát adta ki. Minthogy feladatunk a kimeneti nyelvet elfogadó automata készítése, az automatának éppen ezt a mondatot, amelyet a véges fordító kiad, kell elfogadnia. Vagyis azt kell biztosítanunk, hogy az olvasófej alatt azok a karakterek jelenjenek meg, amelyeket a véges fordító kiadna. Ebbl már látható az átírás metodikája. Az új veremautomata persze nem ír ki semmit, nem is tudna, hiszen nincs is kiíró berendezése, Viszont össze kell vetni az olvasófej alatti és a véges automata által kiadni szándékozott szöveget. Ennél a mveletnél a verem tetejének értéke, amely a fordítandó szöveget tartalmazza, közömbös. ( pu , ) = ( pv , b ) ( pu , b, X ) = ( pv, X ) (4.7.) Végül is sikerült elérnünk, hogy az új veremautomata azokat a jelsorozatokat fogadja el, amelyet a véges fordító a bemeneti, fordítandó nyelv mondatainak fordításaként kiad. Még egy veszélyt kell elhárítanunk. Az algoritmusból következik, hogy amikor a véges fordító elolvasta a bemenetet, akkor az új veremautomata verme kiürül. Ez bajt okoz. Ilyenkor ugyanis az automata már nem tud lépni, és ha a

142

4.1. Véges fordítók

véges fordító éppen megállni tilos állapotban van, akkor el kellene jutnia az els megállóig, különben a fordított szöveg végét nem olvassa el. A már korábban is alkalmazott módszerrel induláskor kibéleljük a vermet, így amikor a verem egyébként kiürülne, a bélés még benne marad. Az automata tehát tovább folytatja munkáját addig, amíg egy megállóhelyhez nem ér. Ezekben az állapotokban a bélés eltávolítható, és a verem teljesen kiüríthet. Ezért van szükség erre a bélelésre: ( p0', , Z0 ) = ( p0 , Z0Z0 ) (4.8.) A megállóhelyeken a következ mozgási szabályokkal üríthetjük ki a vermet: ( pi, , Z0 ) = ( pi, ) p i PS (4.9.) ahol ­ PS a véges fordító megállásra engedélyezett állapotainak halmaza. Ezzel igazoltuk, hogy környezetfüggetlen nyelv véges fordítása veremautomatával elfogadható, tehát szintén környezetfüggetlen nyelv. Foglaljuk még egyszer össze a gondolatmenetet. A veremben most is a fordítandó szöveget generáljuk. Ezt azonban nem a bemenettel vetjük össze, hanem követjük, milyen állapot változásokon megy át ezt olvasva a véges fordító, hiszen veremautomatánk állapottere azonos a véges fordító állapotterével. Amikor a véges fordító a fordított mondat valamilyen szimbólumát készülne kiírni, akkor ezt összevetjük a bemeneten található szimbólummal. Ha a bemeneten lév jelsorozat megegyezik a fordításként kiadni szándékolt jelsorozattal, akkor az automata elfogadja azt. Reguláris nyelvekre csupán egy példát adunk, amelybl a teljesen hasonló gondolatmenet bizonyítás rekonstruálható.

S
b

a

A
b

Q1
a/

b/ /c a/

Q3 B
a

a/ /d b/

Q0 Q2

Q4

C

b/

4.4. ábra

4. Fordító automaták

143

A 4.4. ábra a bemen nyelv véges automatáját, és a véges fordítót mutatja. A nyelv az olyan a és b karakterekbl álló jelsorozatokból áll, ahol mind az a mind a b karakterek száma páros. A fordító is régi ismersünk. A bemen nyelv szimbólumait párosával összefogja, és ha két szimbólum különbözik c, ha megegyezik d szimbólumot ír ki. Minthogy az eredeti véges fordító néhány oszthatatlan, primitív mvelete itt fel van aprózva, a megállásra engedélyezett és tiltott állapotokat meg kellett különböztetni. Az új szerkesztett véges automata állapothalmaza a véges automata és véges fordító állapothalmazának direkt szorzata lesz. A már megismert elvnek megfelelen az eredeti véges automata szimbólumait párosítjuk össze a véges fordító bemeneti szimbólumaival, míg a fordításként kiadódó szöveg lesz az új automata bemenete. Az így megszerkesztett, és a véges automata éleihez megtévesztésig hasonló párosított élekhez természetesen nem kapcsolódik valódi mozgás. Hasznuk csupán annyi, hogy általuk követhet a fordítandó nyelvet elfogadó, és a fordítást végz automaták együttmködése. A 4.5. ábra ezt az egyesített automatát tünteti fel.

A1
(a)

(b) (a)

C4
c (a) c

B1
(b)

(a) (a) d

C3
(b)

S0
d (b) (b)

C0
(b) (a)

S3

B2
d d c

S4

A2

S0

C0

4.5. ábra Az ábrában a zsúfoltság elkerülésére az állapotokat indexelt betvel jelöltük. A bet a fordítandó nyelvet elfogadó automatára, az index pedig a fordítóra utal. Elfogadó csak az az állapot lehet, amely elfogadó illetve megállásra engedélyezett állapot direkt szorzataként jön létre. Ilyen állapot csupán az S0.

144

4.1. Véges fordítók

A párosított éleken zárójelben feltüntettük a bemen nyelvnek azt a karakterét, amelyet az azt elfogadó véges automata és a véges fordító egyidejen elemez. Mint tisztáztuk, ezen élek mentén nem történik olvasás. Az ilyen lényegében -mozgásokkal összekötött állapotokat összevonhatjuk. Ekkor viszont ­ mi más történhetne ­ megkapjuk a 4.2. ábrán már egyszer amúgy ösztönösen felrajzolt véges automatát.

4.2. Szintakszisvezérelt fordítási sémák
A fordításoknak a véges fordítónál lényegesen nagyobb osztálya jellemezhet szintakszisvezérelt fordítási sémákkal. Itt nem a kész szöveg alapján készül el a fordítás, hanem a két mondat, fordítandó és fordított, egyidejen generálódik. Ez annyit jelent, hogy a levezetés során a mondatszimbólumból kiindulva párhuzamosan lépünk mondatszer formáról mondatszer formára, pontosabban mondatszer formapárról mondatszer formapárra. A szintakszisvezérelt fordítási sémák elemei a helyettesítési szabályoknak megfelel, és tulajdonképpen két ilyen szabályból álló konstrukciók. A szabályok környezetfüggetlen jellegek, vagyis baloldaluk egyetlen nemterminális szimbólum. Alakjuk: A 1,2 (4.10.) Ez lényegében az A 1 és az A 2 alakú helyettesítési szabály egyesítése. Az ilyen szabálypárokat úgy alkalmazzuk, hogy a párt alkotó mondatszer formák els, a fordítandó szöveget szolgáltató tagjában az A 1, a másik tagban pedig, amely a fordított szöveget generálja, az A 2 helyettesítést végezzük el. Természetesen a sémaelemeknek olyanoknak kell lenniök, hogy ez a párhuzamos helyettesítés elvégezhet legyen. Ennek az a feltétele, hogy a két mondatszer formában ugyanazok a nemterminálisok és ugyanannyiszor szerepeljenek. Ennek a megkötésnek minden mondatszer formapárra teljesülnie kell. Ez csak úgy biztosítható, ha a sémák elemeihez tartozó két jobboldalban a nemterminálisok nemben és számban megegyeznek. Egy további megkötést is figyelembe kell venni a szintakszisvezérelt fordítási sémák használatánál. A párt alkotó mondatszer formában minden nemterminálisnak egy és csakis egy párja lehet a másik mondatszer formában. Ha a mondatszer formában minden nemterminális különböz, akkor ez a megkötés további intézkedés nélkül teljesül. Amennyiben vannak azonos nemterminálisok, akkor azokat úgy kell párosítani, hogy az egy idben keletkezettek alkossanak egy párt.

4. Fordító automaták

145

Ha a szintakszisvezérelt fordítási sémának van olyan eleme, ahol valamelyik nemterminális egynél többször szerepel a jobboldalon, akkor egyértelmen definiálni kell, hogyan állnak párba az azonos nemterminálisok. Lássunk egy példát a szintakszisvezérelt fordítási sémákra. Ismeretes az aritmetikai kifejezések, a megszokott infixnél sok szempontból szerencsésebb prefix illetve posztfix lengyel jelölése. Itt nincsen precedencia az operátorok között, így zárójelek sincsenek, hiszen ezek a precedencia felülbírálására lennének hivatottak. Amennyiben itt is csak az összeadás és szorzás mveletére szorítkozunk, akkor az alábbi nyelvtan az aritmetikai kifejezéseket posztfix lengyel alakban generálja. E EE+ E EE Ea Készítsünk olyan szintakszisvezérelt fordítási sémát, amely az aritmetikai kifejezéseket infix jelölésben generáló kedvenc nyelvtanunk mondatait posztfix lengyel jelölésbe írja át. Íme a séma: E E+T ET+ ET T T T F TF TF F F (E) E Fa a Sajnos itt kénytelenek voltunk a posztfix lengyel jelölés nyelvtanát kissé komplikáltabbá tenni. Ugyanis ­ mint tisztáztuk ­ a fordítási sémák két jobboldalán azonos nemterminális elemeknek kell lenniök. Hasonló szabály a terminálisokra természetesen nem vonatkozik. Minthogy az elzek szerint a lengyel jelölésben nincsenek zárójelek, az infix jelölés zárójeleit nemes egyszerséggel elhagytuk. Állapítsuk meg mi az alábbi infix jelölésben megadott aritmetikai kifejezés posztfix lengyel alakja. (a+a)a Felhasználva a szintakszisvezérelt fordítási sémát, állítsuk el a fenti infix jelölés aritmetikai kifejezést. A párhuzamos generálás következtében ezen mvelet közben óhatatlanul megkapjuk a kifejezés posztfix lengyel formáját is. Induljunk ki az { E, E } mondatszimbólumpárból. A példa kidolgozása során a nemterminális szimbólumokat ­ néhol feleslegesen is ­ indexszel láttuk el. Ezt kizárólag annak érdekében tesszük, hogy ettl a párosítás mindig követhet legyen.

146

4.2. Szintakszisvezérelt fordítási sémák

Ugyancsak indexszel láttuk el az azonosító értelm a terminális szimbólumot, hogy az aritmetikai mveletekben szerepl mennyiségek nyomon követhetek legyenek. { E1, E1 } { T1, T1 } { T2F1, T2F1 } { F2F1, F2F1 } { (E2)F1, E2F1 } { (E3+T3)F1, E3T3+F1 } { (T4+T3)F1, T4T3+F1 } { (F3+T3)F1, F3T3+F1 } { (a1+T3)F1, a1T3+F1) } { (a1+F4)F1, a1F4+F1 } { (a1+a2)F1, a1a2+F1 } { (a1+a2)a3, a1a2+a3 } Az infix kifejezés fordítása, vagyis ugyanazon aritmetikai kifejezés posztfix alakja ­ ahogy illik ­ kiadódott. A fordítási sémák végrehajthatóságának elemzése kapcsán egy sereg elég szigorú megkötést tettünk az azokban szerepl nemterminális szimbólumokra vonatkozóan. Egy szót sem szóltunk azonban a terminális szimbólumokról. Nyilvánvaló, hogy ezekre semmiféle megkötést sem kell tennünk. Azonosságuk vagy különbözségük, meglétük vagy hiányuk nem befolyásolja a szintakszisvezérelt fordítási sémák végrehajthatóságát. A szintakszisvezérelt fordítási sémák között megkülönböztetett figyelmet érdemelnek azok a sémák, ahol a párt alkotó mondatszer formákban a nemterminális szimbólumok nem csak nemben és számban egyeznek meg, hanem a két összetartozó mondatszer formában még sorrendjük is azonos. Az ilyen tulajdonságú sémák neve egyszer szintakszisvezérelt fordítási séma. Visszatérve példánkra látható, hogy az infix jelölést posztfix jelöléssé átalakító fordítás egyszer szintakszisvezérelt fordítási sémával valósítható meg. Az egyszer szintakszisvezérelt fordítási sémák jelentsége abban van, hogy ezek mködését automatával lehet realizálni. Ezt majd a következ pontban tárgyaljuk. Vizsgáljuk meg most azt a kérdést, hogy hogyan lehet leírni egy mondat levezetését. Számozzuk meg a helyettesítési szabályokat, és írjuk le abban a sorrendben ezeket a sorszámokat, amelyben az egyes szabályok alkalmazásra kerültek. Tekintsük ezt a számsorozatot a szintaktikus elemzés leírásának. Az egyértelmség kedvéért itt azt is meg kell mondanunk, hogy milyen elemzésrl van szó. Bár vannak más elemzési módok, itt csak kétféle elemzésre szorítkozunk. Amikor a mondatszimbólumból kiindulva, a baloldali levezetés lépéseit követve jutunk el az elemzend mondathoz, akkor felülrl lefelé történ, topdown elemzésrl, illetve balelemzésrl beszélünk. A másik elemzési módnál a mondatból indulunk ki, és a nyelek már bemutatott letörése útján redukáljuk a mondatot, illetve a mondatszer formát, ha lehet a mondatszimbólumig. Ilyenkor ­ mint azt megmutattuk a 107.-108.

4. Fordító automaták

147

oldalon ­ a jobboldali levezetést követjük, csak fordított sorrendben. Ebben az esetben alulról felfelé, vagy bottom-up elemzésrl, jobbelemzésrl van szó. A jobbelemzés kifejezésben tehát a jobb eltag nem az olvasás irányára utal, amely egyébként mindkét elemzési módnál a nekünk megszokott irányban balról jobbra történik, hanem az így kapott mondatszer formákból álló sorozat jellegére. Az eljárás demonstrálására számozzuk helyettesítési szabályait. 1 E E+T 2 3 T TF 4 5 F (E) 6 Legyen a mondat ismét: (a+a)a be ismert nyelvtanunk

ET TF Fa

Ennek a mondatnak a baloldali levezetését, vagyis a balelemzés eredményét a következ számsorozat jellemzi: 23451246466 Ugyanígy a jobbelemzés eredménye: 64264154632 Az elbbiek szerint ez a jobboldali redukálást, vagyis fordított sorrendben a jobboldali levezetést adja. Az els eredmény azonnal kiadódik, ha az elbbi példát áttekintjük. Ott ugyanis a baloldali levezetés alapján nyertük a fenti mondatot. A jobboldali redukálás helyességének ellenrzése sem okozhat túl nagy gondot, és a szorgalmas olvasónak kifejezetten kellemes feladat. Mivel mindkét levezetésnél a levezetési fa azonos ­ ugyanazokat a levezetési szabályok kerültek alkalmazásra, csak különböz idpontokban ­ a két levezetés leírásában ugyanazok a számok szerepelnek, csak más sorrendben. Ezeket az eredményeket mechanikusan is megkaphatjuk, a szintakszisvezérelt fordítási séma felhasználásával. Tekintsük ugyanis fordításnak azt a transzformációt, amelyik egy mondatból annak szintaktikus elemzését állítja el, és szerkesszünk ehhez egy szintakszisvezérelt fordítási sémát. Legyen adott egy nyelvtan, és legyenek helyettesítési szabályai számozottak. Keressünk most minden szabályhoz egy párt, amivel a szintakszisvezérelt fordítási séma elemei kiadódnak. Legyen ez egyszer szintakszisvezérelt fordítási séma. Ezzel eldlt, hogy a szabályok párjaiban milyen sorrendben szerepeltessük a nemterminális szimbólumokat. Minthogy végeredményben a levezetést leíró számsorozatot kívánjuk megkapni, terminális szimbólumként ezek a sorszámok szerepeljenek, mégpedig olymódon, hogy minden helyettesítési szabály ,,fordítási" felében a saját sorszáma áll terminálisként.

148

4.2. Szintakszisvezérelt fordítási sémák

Ezek a sorszámok alkotják terminálisként az adott sorrend nemterminálisokkal együtt a helyettesítési szabálypárját. Azt kell csak meggondolnunk, hová írjuk ezt a sorszámot. Két önmagát kínáló lehetségünk van, eléje írjuk, vagy utána. Maradjunk továbbra is kedvenc nyelvtanunknál. Ez a két lehetség az alábbi szintakszisvezérelt fordítási sémákat szolgáltatja: E E+T 1ET ET 2T T TF 3TF TF 4F F (E) 5E E a 6 Ha nincsen a jobboldalon nemterminális, akkor a párban csakis a sorszám szerepel. E E+T ET1 E T T2 T TF TF3 TF F4 F (E) E5 Ea 6 Ha most ezekkel a szintakszisvezérelt fordítási sémákkal generáljuk az aritmetikai kifejezéseket, akkor az els séma esetében a baloldali, a második használatakor a jobboldali elemzést, pontosabban annak leírását kapjuk meg. Ennek igazolása érdekes idtöltést jelenthet az olvasónak.

4.3. Veremfordító
A véges fordítóval való megismerkedés után aligha okoz nagy meglepetést az a tény, hogy a veremautomatának is van fordító változata. Vegyük sorra ismét, miben tér el a veremfordító a jól ismert veremautomatától Természetesen a bemeneti egységen kívül itt is szükség van egy kimeneti egységre, mondjuk nyomtatóra. A veremfordító mozgásainál, éppúgy, mint a véges fordító esetében, az automata egy korlátos jelsorozatot adhat ki ezen a kimeneten. Minthogy csak véges számú mozgás van, a kiadott jelsorozat hosszának van fels korlátja, a legbbeszédbb mozgás által nyomtatott szöveg hossza, legyen ennek mérete i. Legyen a fordító bemen alfabetája és a kimeneté , és az ismert módon tekintsük az üres jelsorozatot is a alfabeta elemének, akkor a veremfordító mozgási szabályai az alábbi leképezést jelentik: Q x ( ) x Q x k x i (4.11.) ahol a megszokott jelölésekkel Q az automata állapothalmaza, , és pedig rendre a bemenet, a verem és a kimenet alfabetája, míg k illetve i a mozgások során a verembe beírt, illetve a kimeneten megjelen jelsorozat legnagyobb hossza. Ezzel egy valódi illetve -mozgást leíró szabály: ( q, a, X ) = ( p, , ) ( q, , X ) = ( p, , ) (4.12.) ahol a k az pedig a i halmaz eleme.

4. Fordító automaták

149

A következkben kimutatjuk, hogy az egyszer szintakszisvezérelt fordítási sémák, és a veremfordítók által definiált fordítások ugyanazt a fordítási osztályt alkotják. A bizonyítás ­ ez már nem meglepetés ­ konstruktív. Legyen adott egy egyszer szintakszisvezérelt fordítási séma. Szerkesszünk hozzá egy vele egyenérték, vagyis ugyanazt a fordítást realizáló veremfordítót. Legyen az egyszer szintakszisvezérelt fordítási séma egy eleme, szabálypárja: A x0B1x2B2x3 . . . Bnxn , y0B1y1B2y2 . . .Bnyn (4.13.) Minthogy a szintakszisvezérelt fordítási séma egyszer, a B1,B2 . . .Bn nemterminálisok szimbólumok mindkét jobboldalban ugyanabban a sorrendben követik egymást. Az x0, x1, . . xn illetve y0, y1, . . yn jelsorozatok a bemeneti illetve kimeneti alfabeták karaktereibl álló, esetleg üres jelsorozatok. Amennyiben a bemenet és kimenet alfabetája, tehát a és a halmaz nem diszjunkt, akkor definiáljunk egy olyan ' halmazt, amely egyrészt diszjunkt a halmazzal, másrészt a és a ' halmaz elemei között kölcsönösen egyértelm megfeleltetés áll fenn. Ekkor a (4.13.) szerinti szabálypárhoz a következ mozgási szabályt rendeljük: (4.14.) ( q, , A ) = ( q, x0y0'B1x1 y1'B2x2y2'. . . Bnxn yn' ) ahol az y0',y1' . . . yn' jelsorozatok a ' halmaz elemeibl képzett, és rendre a y0,y1, . . . yn jelsorozatoknak megfelel jelsorozatok. A (4.14.) szabály szerint tehát, ha a verem tetején nemterminális szimbólum van, akkor a szintakszisvezérelt fordítási séma szabálypárjainak valamilyen kombinációját írjuk a verembe. Itt messzemenen felhasználtuk azt a körülményt, hogy a két jobboldalon a nemterminális szimbólumok sorrendje azonos, vagyis egyszer szintakszisvezérelt fordítási sémánk van. Megjegyzem ez nem az egyetlen lehetség a mozgási szabályra, ugyanis az xiyi' jelsorozatpárok bármelyike felcserélhet, st szimbólumaik össze is keverhetek azzal a megkötéssel, hogy az xi és az yi' jelsorozatok szimbólumai külön-külön tartsák meg sorrendjüket. Persze elegend a sok lehetség közül egyet, például a (4.14.) szabályban leírtat alkalmazni. Arra az esetre, amikor a verem tetejére halmazbeli szimbólum kerül, a következ mozgási szabály lesz érvényes: ( q, a, a ) = ( q, , ) (4.15.) vagyis a verem tetején található szimbólum ,,rekombinálódik" a beolvasottal, és sem a verembe, sem a kimenetre nem írunk sem be, sem ki semmit.

150

4.3. Veremfordító

Amennyiben a verem tetejére egy ' halmazbeli szimbólum kerül, akkor az ennek megfelel szabály a következ lesz: ( q, , b' ) = ( q, , b ) (4.16.) vagyis egy -mozgás során a ' halmazbeli szimbólum halmazbeli párját írjuk ki a kimenetre. Ez a megoldás nem tartalmaz sok új gondolatot. A (4.14.) típusú szabályok mind a fordítandó, mind a fordított szöveg terminálisait beírják a verembe. Persze a megfelel nemterminálisok elé, közé illetve mögé. A legels, tehát legbaloldalibb nemterminális eltt álló terminális szimbólumokat aztán a (4.15.) és (4.16.) alakú szabályok dolgozzák fel. A bemen alfabeta szimbólumainál ellenrzik, hogy valóban a várt jelsorozat van-e a bemeneten, a kimen alfabeta esetében pedig a megfelel szimbólum kinyomtatódik. A mködésmódból az is világos, hogy ez a veremfordító éppen a kiindulásul választott szintakszisvezérelt fordítási sémával meghatározott fordítást realizálja. Gyakorlásképpen írjuk fel az infix jelölésbl posztfix lengyel jelölésbe fordítást leíró egyszer szintakszisvezérelt fordítási sémából származtatott veremfordító mozgási szabályait. Kezdjük most a szintakszisvezérelt fordítási séma elemeitl függ szabályokkal: ( q, , E ) = ( q, E+T+', ) ( q, , E ) = ( q, T, ) ( q, , T ) = ( q, TF', ) ( q, , T ) = ( q, F, ) ( q, , F ) = ( q, (E) . ) ( q, , F ) = ( q, aa', ) Következzenek azok a szabályok, amelyeket akkor alkalmazunk, ha bemen terminális van a verem tetején: ( q, +, + ) = ( q, , ) ( q, , ) = ( q, , ) ( q, (, ( ) = ( q, , ) ( q, ), ) ) = ( q, , ) ( q, a, a ) = ( q, , ) Végül adjuk meg azokat a szabályokat, amelyek akkor érvényesek, amikor a verem tetején ' halmazbeli szimbólum jelenik meg: ( q, , +' ) = ( q, , + ) ( q, , ' ) = ( q, , ) ( q, , a' ) = ( q, , a ) Az eredmény annyira áttekinthet, hogy a példa kidolgozását bátran az olvasóra bízhatom. A bizonyítás visszája, vagyis annak igazolása, hogy minden veremfordítóhoz szerkeszthet egy egyszer szintakszisvezérelt fordítási séma, már korántsem ilyen könny. Lényegében ezzel a problémával egyszer már megszenvedtünk, amikor igazoltuk, hogy minden veremautomatához rendelhet egy környezetfüggetlen nyelvtan.

4. Fordító automaták

151

Még egyszer ne keveredjünk ilyen részletekbe, hanem csupán lényegében a korábbival azonos gondolatmenetet ismertetjük. A nehézséget persze itt is az jelenti, hogy a veremfordítónak több állapota is lehet, így itt a nyelvtan, pontosabban az egyszer szintakszisvezérelt fordítási séma nemterminálisaiban nem csak a veremszimbólumokra, hanem a veremfordító állapotaira vonatkozó információt is tárolnunk kell. Az elgondolás és megoldás, és sajnos a munka terjedelme ugyanaz, mint volt a veremautomatánál. A verem tartalmát, és az abból készített nemterminálisokat most is minden állapot kombinációban el kell állítani. Mégpedig két példányban, hiszen a szintakszisvezérelt fordítási sémának két jobboldala van. A megfeleltetett nemterminálisok nem csak azonos veremszimbólumra vonatkoznak, hanem a hozzájuk rendelt állapotpár is azonos kell legyen. Ha valamely mozgási szabályban olvasunk, akkor a fordítandó szöveget generáló jobboldal elé kell írni a szimbólumot. Ez betre megegyezik a veremautomatánál követett eljárással. Amennyiben a mozgási szabály kiírásról intézkedik, akkor a fordított szöveget generáló jobboldal elé írjuk a kiírandó jelsorozatot. Ha történetesen valamelyik szabály olvas is meg ki is ír, akkor a neki megfelel fordítási séma szabálypárjának mindkét tagja prefixálva lesz, az els az olvasott, a második a kiírt szöveggel.

4.4. Jellemz nyelvtanok
A szintakszisvezérelt fordítási sémák kapcsán tulajdonképpen két összekapcsolt nyelvtannal határoztunk meg egy fordítást. Felmerülhet a kérdés nem lehet-e a fordítást egyetlen nyelvtannal, egyetlen nyelvvel jellemezni? Kis segítséggel, két homomorfizmus alkalmazásával, ez a kérdés sokszor megoldható. A homomorfizmus, mint eddigi tanulmányainkból ismeretes, egy halmaz elemeihez egy másik halmaz elemeit rendeli. A mi speciális esetünkben ez annyit jelent, hogy egy alfabeta, egy jelkészlet elemeihez egy másik alfabeta elemeit rendeli. Ez a hozzárendelés adja az els alfabeta elemeinek homomorf képét. Egy jelsorozat homomorf képét úgy kapjuk, hogy a jelsorozat karaktereinek homomorf képébl alkotunk egy jelsorozatot. Amennyiben ez a leképezés kölcsönösen egyértelm, akkor izomorf leképezésrl beszélünk, ami egyszersmind persze homomorfizmus. A homomorfizmust két oldalán álló alfabetának nem kell diszjunktnak lennie, st az is megengedett, hogy a két alfabeta azonos legyen. Ha ilyen esetben a homomorfizmus minden karakternek önmagát felelteti meg, akkor ez az identikus leképezés, a homomorfizmus, pontosabban izomorfizmus speciális esete.

152

4.4. Jellemz nyelvtanok

A görög ábécé átírása például olyan homomorfizmus, amely egyúttal izomorfizmus. Jelölje h a homomorfizmus által definiált függvényt, akkor a példánkban említett görög-latin átírás felírható: h() = a h() = b h() = g . . . . A jellemz nyelvtan meghatározása az eddigi fogalmak felhasználásával a következ. Legyen adott G grammatikájával egy L nyelv, és két homomorfizmus: h1 és h2. Az L akkor jellemzi a T fordítást, ha a nyelv minden w mondatának a fenti két homomorfizmussal történ leképezése éppen a fordítás egy elemét adja, ugyanakkor a fordítás valamennyi eleméhez található a nyelvnek olyan z mondata, hogy a fordítandó és fordított jelsorozat éppen a z mondatnak a két homomorfizmussal való leképezése. T = { h1(w), h2 (w) ) w L } (4.17.) Amennyiben a fenti feltételek teljesülnek, akkor a G grammatika, illetve az L nyelv a T fordítás jellemz nyelvtana, illetve nyelve. Ha az L nyelv alfabetája , míg a fordítandó illetve fordított nyelv alfabetája illetve , akkor h1 és h2 homomorfizmus a alfabetát képezi le a , illetve alfabetára. h2 : (4.18.) h1 : Mint látható, a nyelvtan illetve nyelv, és a két homomorfizmus nem választható el egymástól. Egy adott nyelvtan csakis az adott homomorfizmus pár alkalmazásával lesz jellemz nyelvtan. Lássunk erre egy példát. Legyen a fordítás a következ szintakszisvezérelt fordítási sémával meghatározott: S xS, yS S yS, xS S x, y S y, x A fordítás ezek szerint az x és y szimbólumokból álló jelsorozatokat viszi át az ugyancsak x és y karakterekbl szimbólumokat tartalmazó olyan jelsorozatokba, ahol a két szimbólum szerepe az eredetihez képest meg van cserélve. Feltéve, hogy a két választott homomorfizmus h1( a ) = x h1(b) = y h2(a) = y h2( b) = x akkor az alábbi nyelvtan jellemzi a fordítást: S aS bS a b Az is megengedett továbbá, hogy a homomorfizmus valamely szimbólumot az üres jelsorozatba vigyen át. Ilyenkor a leképezés során ez a szimbólum nyom nélkül eltnik. Amennyiben a két homomorfizmus olyan, hogy a nyelv terminálisait vagy az egyik, vagy a másik leképezés az üres jelsorozatba viszi át, akkor az ilyen homomorfizmusok mellett érvényes jellemz nyelvtant a fordítás szigorúan jellemz nyelvtanának mondjuk.

4. Fordító automaták

153

Az elbbi megfogalmazásban a vagy kitételt kizáró értelemben illik felfogni, ha ugyanis egy terminálist mindkét homomorfizmus eltüntet, akkor minek szerepel a nyelvben egyáltalában. Az elbbi példában megadott homomorfizmusok nem ilyen szigorú homomorfizmusok. Ennek következtében nyelvtanunk csak úgy közönségesen, és nem szigorúan jellemzi a fordítást. Persze választhattunk volna másik, szigorú jellemzést biztosító homomorfizmust is. Például: h1(a) = x h1(b) = y h1(c) = h1(d) = h2(b) = h2(c) = y h2(d) = x h2(a) = Ezek mellett a homomorfizmusok mellett az alábbi nyelvtan jellemzi, és mást már szigorúan jellemzi a fordítást: S acS bdS ac bd Amennyiben egy fordításnak van jellemz nyelvtana, akkor van szigorúan jellemz nyelvtana is. Ezt könny belátni, és igen egyszer egy jellemz nyelvtanból és a hozzátartozó két homomorfizmusból két más, alkalmas homomorfizmust, és egy most már szigorúan jellemz nyelvtant konstruálni. Legyen adott egy jellemz nyelvtan homomorfizmusaival. Keressük meg azokat a terminális szimbólumokat, amelyek egyik homomorfizmus esetében sem tnnek el. Ilyen biztosan akad, hiszen ellenkez esetben már eleve szigorúan jellemz nyelvtannal lett volna dolgunk. Ezen terminálisok helyébe írjunk két új terminálist, amelyek közül az els leképezése az els homomorfizmussal az eredeti eredményt adja, míg a második homomorfizmus ezt a terminálist megsemmisíti. A második terminálisnál pont fordítva járunk el. Itt az els homomorfizmus tünteti el a terminálist. A jellemz nyelvtanok bevezetésével két fontos megállapítást tehetünk. Amennyiben egy fordítást egy reguláris nyelvtan jellemez, akkor ez a fordítás véges fordítóval megvalósítható, és viszont, minden véges fordítóval megadott fordításnak van reguláris jellemz nyelvtana. Ha egy fordítást egy környezetfüggetlen nyelvtan jellemez, akkor ez leírható egy egyszer szintakszisvezérelt fordítási sémával, és következésképpen megvalósítható veremfordítóval. Itt is igaz az állítás megfordítása, vagyis minden veremfordítóval megadott fordításnak van környezetfüggetlen jellemz nyelvtana. Nézzük elször az els tételt. Jellemezze a fordítást egy reguláris nyelvtan, és legyen h1 és h2 a fordítandó, illetve fordított szövegre leképez homomorfizmus. Szerkesszük meg a véges fordítót olymódon, hogy a nyelvtan minden nemterminálisának a véges fordító egy állapota feleljen meg. A mondatszimbólumnak a kezdállapot a megfelelje. Minthogy a jellemz nyelvtan csak egész mondatok fordítását értelmezi,

154

4.4. Jellemz nyelvtanok

ezek az állapotok ,,non stop", vagyis lényegében visszautasító állapotok lesznek. Vezessünk be ezeken kívül egyetlen elfogadó állapotot is. Legyen a jellemz nyelvtan egy szabálya: A aB Ekkor kössük össze az automata A és B állapotait egy az utóbbi állapotba mutató, és h1(a ) / h2 (a) (4.19.) jelzés nyíllal. A jellemz nyelvtan A a alakú szabályainak átírásánál ugyanezt a módszert alkalmazzuk, csak most a második állapot szerepét az egyetlen elfogadó állapot játssza. Ennek alapján gondolom, nem okoz problémát annak belátása, hogy az ily módon kialakított véges fordító éppen a jellemz nyelvtan és a homomorfizmusok által meghatározott fordítást valósítja meg. Szerkesszünk most jellemz nyelvtant egy véges fordítóhoz. Elbb alakítsuk át a véges fordítót olymódon, hogy az egyes mozgások során az automata csak egyetlen szimbólumot olvasson, vagy írjon. Ennek részleteit már megbeszéltük. Legyen illetve a fordítandó, illetve fordított nyelv alfabetája. Amennyiben ezek nem diszjunktak, akkor ­ szintén ismert módon ­ vezessük be a ' halmazt, amely a halmazra nézve diszjunkt, és amelybl a halmaz izomorfizmussal származtatható. A véges fordító olvasó illetve kiíró éleinek egy-egy helyettesítési szabály felel meg, amelynek alakja: A aB illetve A b'B ahol A és B az él induló illetve érkez állapota, míg a az olvasott szimbólum, és b' pedig a kiírtnak megfelel ' halmazbeli szimbólum. Rendeljünk ezen kívül még minden ,,stop" állapothoz egy-egy A alakú -szabályt. Legyen a két homomorfizmus: h1(a) = a h1(b') = h2(a) = h2(b') = b A jellemz nyelvtan és a homomorfizmusok által definiált, illetve a véges fordítóval megvalósított fordítás azonossága itt is nyilvánvaló. Második állításunk, amely a környezetfüggetlen nyelvtanok és a veremfordítók közötti megfeleltetésrl szól, még könnyebben belátható. A fordító veremautomaták és az egyszer szintakszisvezérelt fordítási sémák megfeleltetésérl már beszéltünk. Így elegend, ha itt csak a környezetfüggetlen nyelvtanok és az egyszer szintakszisvezérelt fordítási sémák közötti kapcsolatról szólunk.

4. Fordító automaták

155

Megegyezésben a (4.13.) és (4.14.) összefüggésekben foglaltakkal, a szintakszisvezérelt fordítási séma elemeihez tartozó levezetési szabály a következ lesz: A x0B1x1B2 . . . Bnxn, y0B1y1B2 . . . Bnyn A x0y'0B1x1y'1B2 . . . Bnxny'n (4.20.) * ahol az y'0,y'1 . . .y'n jelsorozatok az y0,y1 . . yn halmazbeli jelsorozatok '* halmazbeli párjai. Fordítva, ha adott a jellemz nyelvtan, és vele együtt a homomorfizmusok, akkor a nyelvtan egy szabályát a következ módon kell az egyszer szintakszisvezérelt fordítási séma elemévé átírni: A z0B1z1B2 . . . Bnzn A h1(z0)B1h1(z1)B2 . . .Bnh1(zn), h2(z0)B1h2(z1)B2 . . .Bnh2(zn) (4.21.) A megfeleltetés helyessége itt sem igényel bvebb magyarázatot. Befejezésül egy megjegyzés. A fentiekbl következik, hogy nem egyszer szintakszisvezérelt fordítási sémákkal meghatározott fordítást általában nem lehet veremfordítóval megvalósítani.

5. Szintaktikus elemzk
5.1. Általános elemzk, bal- és jobbelemezhetség
Szintaktikus elemz tágabb értelemben minden olyan automata, amelynek feladata a mondat, pontosabban minden mondatnak vélt jelsorozat levezetési fájának elállítása. Így szintaktikus elemzk azok a veremfordítók, amelyek a mondatra mint bemenetre a levezetési fa leírását adják meg, mint fordítást. Szkebb értelemben csak azokat az automatákat tekintjük szintaktikus elemzknek, amelyeknek mködése determinisztikus. A szintaktikus elemzés igénye majd mindig egyértelm nyelvtanok esetében lép fel. Legtöbbször a szintaktikus elemz szerkesztésekor feltételezzük, és megköveteljük, hogy a nyelvtan egyértelm legyen. Vannak azonban olyan elemzk, amelyek nem támasztanak a nyelvtannal szemben semmiféle követelményt. Mieltt az egyértelm nyelvtanokra szorítkoznánk, két ilyen, általánosan használható elemzt ismertetnénk. Az egyik az Earley algoritmus, a felülrl lefelé, a másik a CokeYounger-Kasami módszer az alulról felfelé elemzés elvét követi. Az Earley algoritmus alapgondolata a következ. A mondatszimbólumból indulunk ki, és valamennyi lehetséges levezetést vizsgálat tárgyává teszünk. Amennyiben a levezetés során a mondatszer forma elejére egy terminális szimbólum generálódik, akkor ellenrizzük, hogy ez a terminális szimbólum megegyezik-e az elemzett mondatjelölt els terminális szimbólumával. Eltérés esetén nyilvánvaló, hogy ezen az úton a szóban forgó jelsorozatot nem lehet levezetni, éppen ezért ezeket a levezetési próbálkozásokat abbahagyjuk. Csak abban az esetben érdemes továbbvinni az elemzést, ha a generált terminális megegyezik a mondatjelölt megfelel helyén álló terminálisával. Ekkor viszont a levezetéseket minden lehetséges módon tovább kell folytatnunk. Újabb és újabb terminálisokat generálva egyre több szimbólumát vesszük figyelembe az elemzett jelsorozatnak, miközben egyes levezetési utakat mint reményteleneket abbahagyunk, másokat viszont több útra ágaztatunk szét. Ha sikerül eljutnunk a jelsorozat utolsó szimbólumáig, akkor találhatunk olyan levezetést, amely ezt a jelsorozatot generálja. Ez esetben a jelsorozatról bebizonyosodott, hogy mondat, és annak levezetését, esetleg levezetéseit megállapíthatjuk. Az algoritmus gyakorlati megvalósításakor úgynevezett elemekbl ­ angol nevük item ­ csoportokat alakítunk ki. A csoportok számozottak, és sorszámuk azt fejezi ki, hogy a mondatjelöltbl már hány szimbólumot vettünk figyelembe. Amennyiben a jelsorozat n karakterbl áll, akkor a csoportok számozása 0 és n között változik. A 0 sorszámú csoport azt az állapotot tükrözi, amikor még egyetlen karaktert sem vettünk figyelembe.

158

5.1. Általános elemzk, bal- és jobbelemezhetség Egy elem alakja a következ: { A 1·2, i }

(5.1.)

Feltételezve, hogy ez az elem a k sorszámú csoportban van, az elem jelentése, szemantikája a következ. Az elem alakjából következik, hogy a nyelvtanban kell lennie egy A 12 alakú levezetési szabálynak. Ez a szabály felhasználható a jelsorozat levezetésekor, mégpedig olymódon, hogy a jelsorozatnak az i sorszámú szimbólumától a k sorszámúig terjed fragmense, ­ nem beleértve az i, de beleértve a k sorszámút, ­ a levezetési szabály 1 részébl levezethet. Az elem nem zárja ki az A 12 szabálynak a levezetés során máshol és másképp történ alkalmazását. Fontos, hogy az elemek szemantikáját pontosan megértsük, mert ennek alapján lesz világos az a mechanizmus, amellyel a már ismert csoportokból az újabb csoportok elemeit megszerkeszthetjük. Új elemeket háromféle módon származtathatunk. Tekintsük a k-1 sorszámú csoportot, és vizsgáljuk azokat az elemeket, amelyekben a pont után terminális szimbólum áll. Ha ezek között van olyan, ahol a pont után álló terminális megegyezik a jelsorozat következ, tehát k sorszámú karakterével, akkor ezt a szimbólumot a pont elé helyezve a születend k sorszámú csoport egy elemét kapjuk. Formálisan, ha a { B 1·b2 , i } elem a k-1 sorszámú csoport tagja, és a mondatjelölt k sorszámú karaktere b, akkor a { B 1 b·2 , i } tagja, mondhatni alapító tagja az új k sorszámú csoportnak. A származtatás jogosultsága eléggé nyilvánvaló. Ha a 1 jelsorozat valamely szimbólumtól kezdve egészen a k-1 sorszámú karakterig generálja az elemzett mondatjelöltet, akkor ehhez hozzávéve a mondatjelölt k sorszámú karakterét, a kett együtt nyilván a k szimbólumig generál. A k-1 sorszámú csoportnak azok az elemei tehát, amelyekben a pont után a mondatjelölt k sorszámú terminálisa áll, alkotják az elbbi kismérték átalakítással az új csoport alapító tagjait, elemeit. Ez adja az új elemek származtatásának els, idben is els módszerét. Amennyiben a pont mögött ,,rossz" terminális áll, úgy azok a levezetések, amelyeket ezek az elemek képviselnek, fiaskónak bizonyulván, a további játékban nem vesznek részt. Az így kapott ,,alapító" tagok sorsa más és más, aszerint, hogy most a pont után terminális szimbólum, nemterminális szimbólum vagy semmi sem áll. (5.2.)

5. Szintaktikus elemzk

159

Amennyiben az alapító elemekben a pont után terminális található, akkor pillanatnyilag ezen elemek szerepe befejezdött. Rájuk majd akkor kerül újra sor, ha a következ, k+1 sorszámú csoport alapító tagjait keressük. Nem bizonyos azonban, hogy az elemzett jelsorozat következ eleme ezek közül a pont után álló terminálisok közül kerül ki. Lehet, hogy ezt a karaktert egy olyan nemterminális generálja, amely egy másik elemben a pont mögött áll, és a levezetés folytatásakor egy terminálist, pontosabban egy terminálissal kezdd részsorozatot generál. Éppen ezért mindegyik pont után álló nemterminálisból származtatható karaktert figyelembe kell vennünk. Tételezzük most fel, hogy a k sorszámú csoport alapító tagjai között szerepel a következ elem: { C 1·D2, i } (5.3.) és a nyelvtannak van egy D alakú helyettesítési szabálya. Ekkor az alábbi elemet is be kell vennünk ebbe a csoportba: { D ·, k } (5.4.) Ennek szemantikája a következ. Az (5.4.) elem pont eltti jelsorozata ­ minthogy a pont eltt semmi sem áll, ez természetesen az üres jelsorozat ­ alkalmas arra, hogy a mondatjelöltnek a k sorszámú karakter után kezdd, és a k sorszámú karakterrel bevégzd fragmensét, amely nyilvánvalóan az üres jelsorozat, generálja. Ez más szavakkal azt állítja, hogy az üres jelsorozat alkalmas az üres jelsorozat generálására. Tulajdonképpen ez nem meglep. Ennek ellenére a fenti megállapítás nem tautológia, és nem olyan trivialitás, mint aminek az els pillanatban látszik. Ugyanis nem minden levezetési szabály jobboldala eltt álló üres jelsorozat alkalmas arra, hogy ott, azon a helyen egy üres jelsorozatot generáljon, hanem csak azok, amelyek az adott helyen bekapcsolódhatnak a mondat levezetésébe. Amennyiben az új csoportba így bevezetett új elemekben a pont után megint csak nemterminális áll, ­ magyarán a szabály jobboldalának els szimbóluma nemterminális, ­ akkor a fenti származtatást rekurzív módon mindaddig folytatni kell, amíg új, eddig nem szerepelt elemeket fzhetünk hozzá a csoporthoz. Ez annak az esetnek felel meg, amikor az alapító elemben a pont után álló nemterminális nem egyetlen lépésben, hanem egy lépéssorozattal generálja a következ terminális szimbólumot. Ez az új elemek hozzáfzésének második lehetsége. Vegyük végül azt az esetet, amikor a pont után már nem áll semmi, vagyis egy levezetési szabály jobboldalát teljesen felhasználtuk.

160

5.1. Általános elemzk, bal- és jobbelemezhetség

Legyen például az újonnan kapott k csoportbeli elem { A ·, j } (5.5.) Ekkor vissza kell mennünk ahhoz a csoporthoz, ahol a szóban forgó helyettesítési szabály bekapcsolódott a mondat levezetésébe. Ez nyilván a j sorszámú csoport lesz, hiszen az említett levezetési szabály a j sorszámú szimbólumtól kezdve generálja a mondat egy fragmensét. Könny belátni, hogy a j sorszámú csoportban kell legyen legalább egy olyan elem, amelyik az (5.5.) összefüggésben szerepl helyettesítési szabályt inicializálta, vagyis ahol a pont után az A nemterminális szerepel. Legyen a j sorszámú csoport egy ilyen elemének alakja: { B 1·A2, i } (5.6.) Ennek alapján az új, k sorszámú csoportba a következ elemet kell felvennünk: (5.7.) { B 1A·2, i } A származtatás jogosságát itt is könny belátni. Ha ugyanis a 1 jelsorozat képes a mondat i és j sorszámú szimbólumai közötti fragmens generálására, ugyanakkor az A nemterminálisból levezethet a mondat j és k sorszámú karakterei közötti részsorozat, akkor a 1A alkalmas az i és k közötti teljes jelsorozat generálására. Ezzel az új elemek létrehozásának alapját képez mindhárom szabályrendszert ismertettük. Így ha már van valamennyi csoportunk, a következ csoport elemeit már létre tudjuk hozni. Hogyan induljunk azonban el, hogyan hozzuk létre az els csoportot? Az els, sorszám szerint 0 csoport alapító elemeit azok a levezetési szabályok alkotják, amelynek baloldala a mondatszimbólum, hiszen minden levezetésnek ebbl kell kiindulnia. Így az összes S alakú helyettesítési szabály a { S · , 0 } (5.8.) formában jelenik meg a legels csoport elemei között. Az alapító elemek birtokában aztán meg kell kezdeni a csoport felépítését az ismertetett módon. Ezzel az Earley algoritmus valamennyi formális szabályát megtárgyaltuk. Meg kell még beszélnünk, mikor fogadjunk el egy jelsorozatot. Természetesen akkor, ha az a mondatszimbólumból teljes egészében generálható. Ezt úgy ismerhetjük fel, hogy az utolsó csoportban kell legyen egy { S ·, 0 } (5.9.) alakú elem. Minthogy ez az elem az utolsó csoportban van, ennek az elemnek a szemantikája a következ: az S szabály segítségével a jelsorozat 0 sorszámú karakterétl kezdden az utolsó karakterig generálható, más szóval a jelsorozat a mondatszimbólumból levezethet, tehát mondat.

5. Szintaktikus elemzk

161

Lássunk erre egy példát. Szándékosan balrekurzív nyelvtant választottunk, hogy a módszer erre érzéketlen voltát kihangsúlyozzuk. Generálja a nyelvtan az egyszersített hátsó lengyel jelölést E EE+ EE a Elemezzük a következ mondatot: aaa+a+ Az áttekinthetség növelése érdekében az egyes csoportok fejlécén megadtuk a mondat megfelel szimbólumát. A 0 sorszámú csoporthoz természetesen az szimbólum tartozik. 0- 1-a 2-a ~{ E ·EE+, 0 } ~{ E a· , 0 } ~{ E a·, 1 } { E ·EE, 0 } ~{ E E·E+, 0 } { E EE·+, 0 } ~{ E ·a, 0 } { E E·E, 0 } { E EE·, 0 } ~{ E ·EE+, 1 } ~{ E E·E+, 1 } ~{ E ·EE, 1 } { E E·E, 1 } ~{ E ·a, 1 } { E ·EE+, 2 } { E ·EE, 2 } { E ·a, 2 } 3­a ~{ E a·, 2 } ~{ E EE·+, 1 } { E EE·, 1 } { E E·E+, 2 } { E E·E, 2 } { E ·EE+, 3 } { E ·EE, 3 } { E ·a, 3 } 4-+ ~{ E EE+·, 1 } { E EE·+, 0 } { E EE·, 0 } { E E·E+, 1 } ~{ E E·E, 1 } { E ·EE+, 4 } { E ·EE, 4 } ~{ E ·a, 4 } 5-a ~{ E a·, 4 } { E EE·+, 1 } ~{ E EE·, 1 } { E E·E+, 4 } { E E·E, 4 } { E ·EE+, 5 } { E ·EE, 5 } { E ·a, 5 }

6- 7-+ ~{ E EE·, 1 } ~{ E EE+·, 0 } ~{ E EE·+, 0 } { E E·E+, 0 } { E EE·, 0 } { E E·E, 0 } { E E·E+, 1 } { E ·EE+, 7 } { E E·E, 1 } { E ·EE, 7 } { E ·EE+, 6 } { E ·a, 7 } { E ·EE, 6 } { E ·a, 6 } Az adott nyelvtan egyértelm, így a mondatnak csak egy levezetése van. Az a tény, hogy az utolsó csoportban van (5.9.) alakú elem arra utal, hogy a vizsgált jelsorozat valóban mondat. Ezen a körülményen természetesen az sem változtat, hogy itt a mondatszimbólum jelölése nem S, mint a (5.9.) kifejezésben, hanem E.

162

5.1. Általános elemzk, bal- és jobbelemezhetség

Néhány megjegyzés, amely megkönnyítheti az algoritmus kezelését és megértését. Az els és második, sorszám szerint a 0 és 1 sorszámú csoportban a pont mögött csak egyetlen terminális szimbólum található, az a terminális. Ez annyit jelent, hogy a nyelv valamennyi mondatában, ebben a pozícióban, vagyis az els két helyen csak az a terminális állhat. Valóban a nyelv ilyen tulajdonságú. A 2 sorszámú csoportban már mindhárom terminális a +, és a szerepel a pont mögött. Ez megegyezésben van azzal, hogy ebben a pozícióban már mindhárom terminális elfordulhat. Persze egy adott mondat esetében mindig csak egyik válik be, ­ jelen esetben az a ­ a másik kett elvetél. Az algoritmus eredménye alapján a vizsgált mondat levezetése megszerkeszthet. A jelsorozat elfogadásáról a 7 csoport {E EE+·, 0} eleme informál. A különböz csoportok elemei közül azokat kell kiválasztanunk, amelyek a végeredményként kiadódó említett elem létrehozásában szerepet játszottak. Ezen elemek által reprezentált levezetési szabályok szolgáltatják a mondat levezetését. A megértés megkönnyítésére ezek az elemek bajusszal vannak ellátva. Az elemzés balelemzés, így a kapott eredmény a baloldali levezetést szolgáltatja E EE+ aE+ aEE+ aEE+E+ aaE+E+ aaa+E + aaa+a+ A nyelvtan egyértelm, és ez abból is látszik, hogy mindegyik csoportnak csak egy alapító tagja van. Az egyértelmség biztosítására elegend lenne, ha csak azoknak a csoportoknak volna unikális alapító tagjuk, amelyek úgynevezett lezárt elemmel kezddnek. Az ilyen elemeknél a pont az utolsó szimbólum után helyezkedik el. Esetünkben minden alapító elem ilyen, ami természetes, ha meggondoljuk, hogy az alapító tagok a pontnak egy terminálison való átugratásával keletkeznek. Itt pedig a levezetési szabályoknak csak az utolsó szimbóluma terminális, tehát ha ezt átugrottuk, akkor már a szabály végére értünk. A másik általános elemz módszer, a Coke-Younger-Kasami eljárás megköveteli, hogy a nyelvtan Chomsky normálalakban legyen felírva. Ez megkötést jelent a nyelvtannal, de nem a nyelvvel szemben, hiszen minden környezetfüggetlen nyelvtanhoz rendelhet egy vele egyenérték Chomsky normálformában adott nyelvtan. A problémát az jelentheti, hogy az elemzés a levezetést természetesen nem az eredeti nyelvtan szabályai szerint adja meg, hanem az átalakított, már Chomsky normálalakban megadottnak megfelelen. Amennyiben minket az eredeti nyelvtan szolgáltatta levezetés érdekel ­ és általában ez a helyzet ­ akkor meg kell vizsgálnunk, hogyan lehet a normálalakban érvényes levezetésbl az eredeti nyelvtan levezetését elállítani. A Chomsky normálalak elállításánál úgy jártunk el, hogy az eredeti nyelvtan helyettesítési szabályainak alkalmazását egy sorozat Chomsky szabály

5. Szintaktikus elemzk

163

végrehajtásával modelleztük. A levezetési fa leírása céljából most is adjunk a helyettesítési szabályoknak sorszámot. Mind az eredeti, mind a Chomsky normálforma esetében. Ha most az eredeti nyelvtan szabályának sorszámát adjuk az t modellez Chomsky sorozat egyik szabályának, a sorozat többi szabályának pedig nagyobb, az eredeti nyelvtanban nem szerepl sorszámokat adunk, akkor lehetség van arra, hogy a normálforma szabályaival felírt levezetésbl megkapjuk az eredeti nyelvtan levezetését. Ezt úgy érhetjük el, ha a ,,túlzottan" magas sorszámokat egyszeren kihagyjuk a leírásból. Ha ezt a balelemzés illetve a jobbelemzés leírásánál el tudjuk érni, akkor azt mondjuk, hogy a normálalak, pontosabban a sorszámozott normálalak balról illetve jobbról lefedi az eredeti nyelvtant. Amennyiben egy eredeti levezetési szabályt leképez Chomsky szabálysorozat els tagjának adjuk az eredeti nyelvtan szóban forgó szabályának sorszámát, akkor balról, ha az utolsónak, akkor jobbról fedtük le a normálalakkal az eredeti nyelvtant. Mint említettem ez az elemzés alulról felfelé halad. Az elemzés során kapott eredmények egy alsó háromszögként rajzolt mátrix mezit töltik ki. A mezkbe a Chomsky normálforma nemterminális szimbólumai kerülnek. A mátrix tjk mezejébe akkor kerül egy nemterminális, ha a szóban forgó nemterminális képes a vizsgált mondat j számú konzekutív karakterének generálására, mégpedig éppen a k sorszámú szimbólummal kezdve. A mátrix azért háromszög mátrix, mert míg egy n szimbólumot tartalmazó mondatban éppen n darab egyetlen szimbólumot tartalmazó részsorozat található, addig a kételem részsorozatok száma már csak n-1, végül n elem, tehát valamennyi szimbólumot magában foglaló sorozat már csak egy akad, maga a mondat. A mátrixot alulról felfelé haladva kell kitölteni, vagyis a legalsó, tehát a fenti konvenció értelmében els sorral kell kezdenünk. Ide az elbbiek szerint olyan nemterminálisok kerülnek, amelyek egyetlen karakterbl álló jelsorozatokat képesek generálni. Itt tehát a Chomsky normálalakban engedélyezett két szabály, A a és A BC közül az elbbi típusúakat kell alkalmaznunk. Most és a késbbiekben elképzelhet, hogy egy mezbe egynél több nemterminális kerül, st utóbb még az is elfordulhat, hogy egy nemterminális több okból írható be ugyanabba a mezbe. A második és az azt követ sorok megszerkesztésekor már a második szabálytípus szerinti levezetési szabályokat kell figyelembe venni. A második sor kitöltésekor azt vizsgáljuk, hogy van-e olyan levezetési szabály, amelynek jobboldala két, az els sorban szomszédos szimbólumból áll. Ha igen, akkor annak baloldalát kell beírnunk a második sor megfelel mezejébe. A generált részsorozat hosszának növekedésével az eljárás mind bonyolultabbá válik. Míg ugyanis egy két szimbólumból álló részsorozatot csak

164

5.1. Általános elemzk, bal- és jobbelemezhetség

egyféleképpen partícionálhatunk, addig egy hosszabb részsorozat már többféleképpen osztható fel. Így például ha a t43 mezt kívánjuk kitölteni, ahová definíciónk szerint azok a nemterminálisok kerülnek, amelyek a 3 pozícióval kezdd, és a 6 pozícióval végzd sorozat négy szimbólumát generálják, akkor a t13-t34, a t23-t25 és a t33-t16 mezpárokat kell megvizsgálnunk, ami megfelel a négy szimbólumból álló jelsorozat 1-3, 2-2 illetve 3-1 arányban történ felosztásának. Példának válasszunk most egy nem egyértelm nyelvtant. E E+E 1 E EE 2 E (E) 3 Ea4 Minthogy itt csak Chomsky normálformában megírt nyelvtan használható, végezzük el a nyelvtan átírását. A terminálisokból kialakított nemterminálisokat vesszvel különböztettük meg, és a sorszámozást úgy állapítottuk meg, hogy a normálalak balról fedje le az eredeti nyelvtant. E EA 1 E EM 2 E ('P 3 Ea4 A +'E 5 M 'E 6 P E )' 7 +' + 8 ' 9 (' ( 10 )' ) 11 Legyen a vizsgálandó mondat, helyesebben mondatjelölt a+aa+a Az eddigiek alapján a háromszögmátrix megszerkeszthet. E3 A 2 E E2 A M E E E A M A +' +' E E E E ' Az a tény, hogy a legfels kockában szerepel a mondatszimbólum, arra utal, hogy belle kiindulva a teljes jelsorozat levezethet, vagyis ez esetben a jelsorozat mondat. A hatványkitevben jeleztük, hányféleképpen kaphatjuk meg az adott nemterminálist az adott mezben. Így például a teljes mondatot generáló E mondatszimbólum háromféle módon bontható fel: E1-7 E1A2-7 E1-3M4-7 E1-5A6-7 Itt az index pozíciójában jeleztük, hogy az egyes nemterminális szimbólumok a mondat mely részét generálják. Minthogy vannak további alternatívák ez a mondat öt lényegesen különböz módon vezethet le. Adjuk itt meg az egyik ilyen levezetést: E1-7 E1-3M4-7 E1A2-3M4-7 aA2-3M4-7 a+'E3M4-7 a+E3M4-7 a+aM4-7 a+a'E5-7 a+aE5-7 a+aE5A6-7 a+aaA6-7 a+aa+'E7 a+aa+E7 a+aa+a

5. Szintaktikus elemzk

165

Adjuk meg most ezt a levezetést a szabályok sorszámával: 2145846914584 Minthogy minket az eredeti nyelvtan alapján készült levezetés érdekel, hagyjuk el ebbl a sorozatból a ,,túlságosan" nagy sorszámokat: 2144144 Ez a számsorozat valóban az eredeti nyelvtan levezetését írja le. E EE E+EE a+EE a+aE a+aE+E a+aa+E a+aa+a Ezzel azt is bemutattuk, hogyan fedi le a Chomsky normálalak az eredeti nyelvtant. Az általános elemzk tárgyalása után áttérve a szkebb értelemben vett, tehát determinisztikus elemzkre, meg kell állapodnunk néhány terminológiai kérdésben. Egy nyelvtant balelemezhetnek illetve jobbelemezhetnek mondunk, ha szerkeszthet hozzá determinisztikus, a baloldali levezetést illetve a jobboldali redukciót szolgáltató szintaktikus elemz. Vizsgáljuk meg ebbl a szempontból az alábbi két nyelvtant, amelyrl könny belátni, hogy ugyanazt a nyelvet generálják: 1 S BAb 1 S BAb 2 S CAc 2 S CAc 3 A BA 3 A AB 4Aa 4Aa 5Ba 5Ba 6Ca 6Ca n+2 n+2 A generált nyelv: L = a b a c Talán említenem sem kell, hogy a példa illusztratív jelleg, hiszen ez a nyelv reguláris nyelvtannal is generálható. Vizsgáljuk elször az els, baloldalon álló nyelvtant. A nyelv egy mondatának baloldali levezetése 15 (35)n 4 illetve 26 (35)n 4 aszerint, hogy az utolsó szimbólum b illetve c karakter. Erre az alábbi módon szerkeszthet determinisztikus elemz. A dolognak az a bibéje, hogy a legels alkalmazott szabály kérdése csak az utolsó karakter beolvasásakor dl el. A mondat elemzésekor tehát semmilyen részeredmény sem adható ki addig, amíg a teljes mondatot el nem olvastuk. Ez nem jelent leküzdhetetlen akadályt. Persze meg kell jegyeznünk a beolvasott a szimbólumok számát, célszeren úgy, hogy elraktározzuk azokat az automata vermében. Az utolsó karakter beolvasása után már kiadhatjuk a beolvasott karaktertl függen a 15 vagy 26 eredményt, majd a 35 kombináció következik, a tárolt a szimbólumok számának megfelelen, ezt követi végül a 4 sorszám. Az a körülmény, hogy a beolvasott a szimbólumok száma kettvel több, mint ahány kombinációt ki kell nyomtatni, nem jelenthet problémát.

166

5.1. Általános elemzk, bal- és jobbelemezhetség

Ismét csak az els, baloldali nyelvtannál maradva, a jobboldali elemzés egészen más eredményt ad: 55n43n1 illetve 65n43n2 újra a beolvasott utolsó szimbólumtól függen. Az világos, hogy az utolsó karakter beolvasása eltt itt sem adható ki semmilyen eredmény. A teljes mondat beolvasása után természetesen itt is kinyomtathatjuk az 5, illetve 6 szabály sorszámát. Annak sincs akadálya, hogy az a karakterek számát valamilyen formában megjegyezzük. Amikor azonban az 5n kiadására kerül sor, akkor ezt az információt destruktívan, vagyis az információ megsemmisítésével együtt járó módon fel kell használnunk. Ennek következtében aztán a 3n sorozat kiadására nincsen mód, hiszen hiányzik a kitev értékére vonatkozó információ. A fentiek alapján az els, baloldali nyelvtan balelemezhet, de nem jobbelemezhet. A második, a jobboldalon álló nyelvtan esetében a helyzet pont fordított. Itt a baloldali elemzés lesz problematikus. Ennek eredménye ugyanis: 153n45n illetve 263n45n Itt nyilván ugyanazzal a nehézséggel kell, pontosabban kellene megbirkóznunk, mint elbb a jobboldali elemzés esetében. Ugyanakkor a jobboldali elemzés eredménye itt is lehetséget ad determinisztikus elemz készítésére. A szóban forgó számsorozat ugyanis 54 (54)n 1 illetve 64 (53)n 2 A már alkalmazott receptúra szerint persze itt is meg kell várnunk az utolsó karakter beolvasását, miközben memorizáljuk a beolvasott a szimbólumok számát. Ezzel a fogással jobboldali determinisztikus elemz szerkeszthet. Ennek alapján rögzíthet, hogy a balelemezhet illetve jobbelemezhet nyelvtanok inkommenzurábilisak, összemérhetetlenek, vagyis egyik sem részhalmaza a másiknak. Valójában az els nyelvtan balelemzje, illetve a második nyelvtan jobbelemzje egy szerencsés gondolatnak, mondhatni ügyes trükknek köszönheti létét. Való igaz, hogy az a szimbólumokat a 35 illetve 53 levezetési szabályok kombinációja generálja. Ezt a tényt használjuk fel akkor, amikor a verembl elszedett információ alapján a kell számú 35 illetve 53 kombinációt kiírjuk. A turpisság abban áll, hogy amikor a legels ilyen kombinációt kiírjuk, amely szabályok szükségképpen a legels szimbólumot generálták, akkor azt a legutoljára beolvasott szimbólumból nyert információ alapján tesszük. Egy ilyen megoldású elemzt egy szerencsés ötletet felhasználva megvalósíthatunk, de egy algoritmus segítségével, vagyis lényegében mechanikus úton származtatva aligha. Az ilyen elemz kialakítása nem ,,szabályos".

5. Szintaktikus elemzk

167

Szabályosnak mondjuk az olyan elemzket, ahol a szabály sorszámok kiadása azon szimbólumok vizsgálatakor történik meg, amely szabályok ezeket a szimbólumokat generálják. Példánkban, mint tisztáztuk nem ez a helyzet. A fenti két nyelvtanra készíthet balelemz illetve jobbelemz ezek szerint nem szabályos. Ezt a disztinkciót azért lényeges megtennünk, mert amennyiben csak a szabályos elemzkre szorítkozunk, akkor a balelemezhet nyelvtanok halmaza a jobbelemezheteknek valódi részhalmaza lesz. Erre az állításunkra még visszatérünk.

5.2. A balelemzés, LL(k) nyelvtanok
Baloldali elemzésnél mindig a mondatszimbólumból indulunk ki, és mindig a mondatszer forma legbaloldalibb nemterminálisát bontjuk fel a következ lépésben. A mondatszer forma elején található esetleges terminális jelsorozat természetesen meg kell egyezzen az elemzett mondat els terminálisaival. Ha nem így lenne, akkor már korábban be kellett volna dobnunk a törülközt. Ezt felfoghatjuk úgy is, hogy a mondatot az elemzés során addig olvastuk el, ameddig az élen álló terminálisokat generálni tudtuk. A következ lépésben a legbaloldalibb nemterminálist úgy kell felbontanunk, hogy a mondat további terminálisai kiadódjanak. Általában az a helyzet, hogy a felbontandó nemterminális szimbólum több levezetési szabály baloldalán állhat, vagyis a felbontásnak több alternatívája van. Ezek közül kell a megfelelt kiválasztani, hiszen egyértelm nyelvrl lévén szó, csak egyetlen felbontás vezethet eredményre. Ennek érdekében az LL(k) elemz úgy jár el, mint a fegyelmezetlen olvasó a krimivel. Ha kíváncsi a folytatásra, akkor egy kicsit elrelapoz. Ez itt úgy történik, hogy az olvasás helyétl az elemz k szimbólumot elre néz, és ezekbl a terminálisokból igyekszik eldönteni, melyik alternatívát kell választania, melyik a helyes folytatás. Az elemz elnevezésében els L ­ left ­ arra utal, hogy az olvasás balról jobbra történik. Ez tehát csak a latin bets és mondjuk héber bets írásmód közötti különbséget jelöli. A második L ­ left ­ az elemzés baloldali voltát jelenti. Végül a k azt mondja meg, hány szimbólumot nézünk elre, amikor a felbontás alternatívái között döntünk.

168

5.2. A balelemzés, LL(k) nyelvtanok

A gondolat magvát az 5.1. ábra szemlélteti. A már kiadódott mondatszer forma wA, ahol w a már megkapott terminális jelsorozat, A a legbaloldalibb nemterminális, míg a mondatszer forma további része. Amennyiben a w sorozatot követ k számú szimbólumot tartalmazó x jelsorozat elegend információt szolgáltat arra, hogy a lehetséges alternatívák közül a helyeset kiválasszuk, dönteni tudjunk, akkor az adott nyelvtan LL(k) nyelvtan.
S k=|X|

A

w

x

5.1. ábra A szabatos leírás lehetvé tételére vezessük be az alábbi formalizmust. Legyen adott egy G grammatika, és legyen adott egy tetszleges jelsorozat. Jelölje FIRSTGk() (5.10.) azt a terminálisokból álló és legfeljebb k hosszúságú jelsorozatokat tartalmazó véges nyelvet, amelyet úgy kapunk, hogy vesszük az jelsorozatból a G grammatika segítségével nyerhet összes jelsorozatot, illetve ha azok hosszabbak, mint k, akkor azok els k szimbólumát. Ha speciálisan az terminális jelsorozat, akkor a FIRSTGk() vagy , vagy annak els k szimbóluma. Ha nem okozhat félreértést, a grammatikára utaló megkülönböztet kitevt elhagyjuk. Legyen a felbontandó nemterminális A, és legyen A illetve A két lehetséges felbontás. A nyelvtan akkor LL(k) nyelvtan, ha minden nemterminálisra és minden alternatívapárra igaz a következ állítás. Legyen adott két levezetés: * * S wA w wx és akkor S wA w wy FIRSTk(x) = FIRSTk(y)
* *

(5.11.) (5.12.)

5. Szintaktikus elemzk azonosságból következik a =

169

azonosság is. Ez nem más, mint formális megfogalmazása annak, amit az elbb verbálisan már elmondtunk, nevezetesen a mondat következ k szimbóluma egyértelmen eldönti a helyes lebontást. Vizsgáljuk meg, mi a feltétele annak, hogy egy nyelvtan LL(k) nyelvtan legyen. Valamely nyelvtan egyik A nemterminálisának összes lehetséges levezetési szabálya legyen A 1 2 . . . n A nyelvtan csakis akkor lehet LL(k) nyelvtan, ha a FIRSTk(i) véges nyelvek diszjunktak: FIRSTk(i) FIRSTk(j) = i j (5.13.)

Ellenkez esetben, vagyis ha a metszet páronként nem üres elfordulhat, hogy az elemz elretekintve éppen a metszet halmazába es jelsorozatot olvas, és ennek alapján nem tud dönteni, melyik levezetési szabályt alkalmazza. Ez tehát szükséges feltétel. Az (5.13.) megkötés nem csak szükséges, hanem elégséges is abban az esetben, ha az A nemterminális utódai mindenkor legalább k szimbólumot generálnak. Lássunk erre egy példát. Nyelvként válasszuk a prefix lengyel jelölést: 1 E +EE 2 E *EE 3Ea

Ez LL(1) nyelvtan. Az (5.13.) feltétel teljesülése k = 1 mellett nyilvánvaló, ugyanakkor az E valamennyi leszármazottja generál legalább egy hosszúságú jelsorozatot. Az úgynevezett elemzési táblát a nyelvtan alapján könnyen felírhatjuk. A vízszintes fejléc az elretekintés során kapható, esetünkben egy hosszúságú jelsorozatokat tünteti fel. A függleges fejléc a verem tetejére kerül szimbólumokat adja. A tábla mezi a szükséges intézkedésekre tartalmaznak utasításokat. E + * a + +EE, 1 pop * *EE, 2 pop pop acc a a, 3

170

5.2. A balelemzés, LL(k) nyelvtanok

A táblázat rovatainak jelentése a következ. A pop az a már eddig is alkalmazott mvelet, amikor a verem legfels szimbólumát, az olvasott, és a veremben találhatóval azonos szimbólummal együtt megsemmisítjük. Gondolom, magyarázatot nem igényel, mikor kerül sor erre a mveletre. A k mérték elretekintést mindig úgy kell értelmezni, hogy a még fel nem dolgozott jelsorozat k hosszúságú prefixumát vesszük. Rövidebb elretekint jelsorozatot csak akkor kaphatunk, ha a megmaradt jelsorozat hossza kisebb, mint k. Az jelsorozatot, mint egy hosszúságú jelsorozatot tehát csak akkor láthatjuk elretekintve, ha a teljes jelsorozatot már beolvastuk. Amennyiben a teljes jelsorozatot beolvastuk, és ezzel egyidejen a verem is kiürült, akkor a jelsorozatot, mint a nyelv mondatát elfogadjuk. Ezt fejezi ki az alkalmas mezben az acc (accept) rövidítés. Az üresen maradt mezk, ha a jelsorozat valóban a nyelv egy mondata, sohasem fordulhatnak el. Ha mégis eladódnának, ez azt jelenti, hogy az elemzett jelsorozat nem mondata a nyelvnek, és így hibát kell jeleznünk. A táblázatnak az a része, amely azokat az eseteket tünteti fel, amikor terminális van a verem tetején, vagy a verem üres, mindig azonos, és semmiféle a nyelv vagy nyelvtan specifikumára vonatkozó információt nem tartalmaz. Éppen ezért a továbbiakban a táblázatnak ezt a részét elhagyjuk. Természetesen, ha az elemzt számítógépen kívánjuk megvalósítani, akkor az ehhez a részhez kapcsolódó tevékenységek programját ugyanúgy meg kell írnunk, mint a releváns információt hordozó részét. Az adott esetben érdemleges információt csak a táblázat els sora hordoz. Az egyes mezk megmondják, mit kell beírnunk a nemterminális helyébe, és milyen levezetési szabály sorszámát kell kiadnunk, mint eredményt. Nézzünk a táblázat alapján egy elemzést. A konfiguráció egy hármassal jellemezhet, az elemzend jelsorozat még el nem olvasott részével, a verem tartalmával, és a kiadott eredménnyel. Legyen a vizsgált mondat: +a*aa { +a*aa, E, } a { +a*aa, +EE, 1}a { a*aa, EE, 1} a a { a*aa, aE, 13} a { *aa, E, 13} a { *aa, *EE,132} a a { aa, EE, 132} a{ aa, aE, 1323 } a{ a, E, 1323} a a { a, a, 13233} a{ , , 13233} a acc Visszatérve az (5.13.) kifejezés szükséges, de nem elégséges voltára baj akkor adódhat, ha az A nemterminális utódai nem minden esetben alkotnak kell hosszúságú, vagyis az elretekintés k hosszánál nem rövidebb jelsorozatot. Az elemz ugyanis nem a FIRSTk(i) jelsorozatokat vizsgálja, hanem az els k szimbólumot. Ha a nemterminális derivátuma nem tölti ki teljesen a kívánt hosszat, akkor az elemz a mögötte található szimbólumokból hozzámarkol annyit, hogy kiteljék a teljes méret.

5. Szintaktikus elemzk

171

Elfordulhat, hogy a rövid jelsorozat éppen valamelyik másik csoport egyik elemének prefixuma, és a hozzámarkolással történ kiegészítés szerencsétlen módon éppen egy másik csoport valamelyik elemét szolgáltatja. Ilyenkor megint csak nem lehet megkülönböztetni a két jelsorozatot, és nem lehet dönteni a két lehetséges folytatás között. Ez az eset nem annyira valószíntlen és hajánál fogva elráncigált, mint azt els pillanatban hisszük. Mint késbb látni fogjuk, gyakran célszer a nyelvtanokat olymódon átalakítani, hogy abban -szabályok keletkezzenek. Így viszonylag gyakran van olyan nyelvtannal dolgunk, amelyben -szabályok vannak, és az epszilon bármely jelsorozat prefixumaként felfogható. A probléma szabatos tárgyalására vezessük be a követ nyelv fogalmát. Legyen A a nyelvtan egyik nemterminális szimbóluma. Ekkor FOLLOWGk(A) (5.14.) jelentse azon, legfeljebb k hosszúságú jelsorozatok halmazát, amelyet az adott grammatika az A nemterminális utódait követve generálhat. Ezt a nyelvet nevezzük az A nemterminális követ nyelvének. Amennyiben az A nemterminális szkmarkúan generálja a jelsorozatot, és nem ad ki kell számú szimbólumot, akkor az elemz azt a követ nyelvbl egészíti ki. Végül is az elemz által vizsgált jelsorozatok az alábbi összefüggéssel írhatóak le: FIRSTk( FIRSTk(i) · FOLLOWk(A)) (5.15.) Itt i ismét az A nemterminális egyik lehetséges felbontása, · pedig a konkatenálás operátora. Az (5.15.) kifejezés magyarázata a következ. A küls zárójelen belül az i jobboldalból származtatható, illetve az A nemterminálist követ, külön-külön legfeljebb k hosszúságú jelsorozatok konkatenáltja áll. Ezen konkatenáltnak vesszük az els k szimbólumát. Amennyiben i egymagában generálja a megfelel számú szimbólumot, akkor a követ nyelv jelenléte nincs hatással az eredményre. Ha viszont az i által generált jelsorozat rövidebb, akkor a hiányzó szimbólumokat a követ nyelv szolgáltatja. A fentiekbl nyilvánvaló, hogy az (5.15.) összefüggés éppen azokat a jelsorozatokat adja, amelyeket az elemz vizsgálat tárgyává tesz. Amennyiben az (5.15.) szerinti kifejezések a különböz alternatívákra diszjunktak, akkor ez elegend feltétel arra, hogy ennek alapján a helyes felbontás egyértelmen eldönthet legyen. A nyelvtan tehát LL(k) nyelvtan, mégpedig ersen LL(k) nyelvtan. Annak magyarázatára, hogy az (5.15.) feltétel miért nem szükséges, és mikor gyengén LL(k) egy nyelvtan, késbb kerítünk sort. Lássunk most egy olyan példát, ahol az (5.13.) összefüggéseken túlmenen az (5.15.) típusú kifejezéseket is meg kell vizsgálnunk.

172

5.2. A balelemzés, LL(k) nyelvtanok

Válasszuk a már jól ismert, az aritmetikai kifejezéseket generáló nyelvtant. Sajnos ez a nyelvtan balrekurzív, és így nem balelemezhet. Tegyünk talán egy kis kitért, hogy a fenti, és többször is hivatkozott állításunkat igazoljuk. Az egyszerség kedvéért vegyünk egy közvetlen balrekurzív nyelvtant. A bizonyítás menetébl kitnik, hogy a gondolatmenet éppígy alkalmazható nem közvetlenül, hanem csak közönségesen balrekurzív nyelvtanok esetében is. Legyen a balrekurzivitás forrása az A nemterminális, és vonjuk össze két helyettesítési szabályba a lehetséges levezetéseket. A A Mint ismeretes, a felbontás eredménye abban a pillanatban, amikor az A nemterminális eltnik a baloldalról * Nyilvánvaló, hogy elretekintve a jelsorozatot, illetve az abból származtatott terminálisokat fogjuk látni. Ez lesz a helyzet annak ellenére, hogy az A levezetést megelzte, pontosabban megelzhette az A A produkciós szabály tetszleges számú alkalmazása. Az alkalmazások számát pedig semmilyen elretekintés sem mondhatja meg. Vegyük például az alábbi, nem túl bonyolult, de balrekurzív nyelvtant: S Sa Ez a nyelv nyilván az a szimbólumokból álló, és tetszleges hosszúságú jelsorozatokat tartalmazza. A nyelv egy mondatát úgy generáljuk, hogy elször az els szabályt alkalmazzuk annyiszor, ahány karakter van a mondatban. Az így kiadódó mondatszer formák els szimbóluma az S nemterminális, amelyet egy sereg a karakter követ. Ezután kell alkalmazni egy ízben a második szabályt, amivel ,,agyonütjük" a nemterminálist. Sajnos a veremben található szimbólumok mindaddig nem távolíthatóak el pop mvelettel, ameddig a nemterminálist el nem tüntettük. Erre szolgál a második szabály, amelyet azonban csak akkor alkalmazhatunk, ha már pontosan annyi a szimbólumot generáltunk, amennyi az elemzend mondatban van. Ennek megállapítására azonban el kell, pontosabban el kellene látnunk a mondat végéig. Bármekkorára választanánk is azonban a betekintési mélységet, kapásból tudnánk ennél hosszabb mondatot generálni. Így tehát a fenti nyelvtan balrekurzivitása miatt nem balelemezhet. Térjünk ez után a kis kitér után vissza eredeti célkitzésünkhöz, az aritmetikai kifejezéseket generáló nyelvtan balelemzéséhez. Az eredeti nyelvtan, mint ismeretes: E E+T T T T*F F F (E) a A balrekurzivitás megszüntetésére használjuk a korábban megadottól kissé eltér, de áttekinthetbb eredményt adó alábbi átírást: A A A Â Â Â

5. Szintaktikus elemzk

173

Ezzel az átalakított nyelvtan a következ alakú lesz: 1 E TÊ 2 Ê +TÊ 3Ê 4 T F 5 *F 6 7 F (E) 8Fa Az új levezetési szabályokat sorszámmal is elláttuk. Sajnos az átalakított nyelvtan nem fedi le a kiindulási nyelvtant, így az átalakított nyelvtan szerinti levezetés alapján nehezebb elállítani az eredeti nyelvtan szerinti levezetést. Tegyünk kísérletet egy LL(1) elemz készítésére. Minthogy két olyan nemterminálisunk is van, amely -szabály alkalmazása kapcsán eltnhet, és így egyetlen szimbólumot sem generál, szükségünk lesz ennek a két nemterminálisnak a követ nyelvére. Az Ê nemterminális az 1 produkciós szabály alkalmazásával kerülhet be a mondatszer formába. Minthogy ilyenkor az E nemterminális helyébe lép, nyilván ugyanaz követheti, mint ami eldjét az E nemterminálist követte. Az E szimbólum a mondatszimbólum. Így induláskor a mondatszer forma egyedül ebbl a szimbólumból áll. Ilyenkor semmi sem, pontosabban az jelsorozat követi. Az E nemterminális a 7 szabály révén kerülhet ismét a mondatszer formába. Ekkor azt végzárójel követi. Ezzel a követ nyelv: FOLLOW1(Ê) = { , ) } Kissé bonyolultabb a másik eltn nemterminális, a követ nyelvének megállapítása. A a 4 sorszámú szabály alkalmazásával lesz eleme a mondatszer formának. Ilyenkor a T nemterminális helyébe lép, így ugyanaz követheti, ami a T nemterminálist követte. Ez utóbbit, akár az 1, akár a 2 sorszámú szabály kapcsán tnt fel a mondatszer formában, utána az Ê szimbólum áll. Ez a nemterminális fogja tehát generálni a T és így a követ szimbólumait. Amennyiben az Ê felbontására a 2 szabályt alkalmazzuk, akkor a helyére beírt jelsorozat els karaktere a + szimbólum lesz. Elfordulhat azonban, hogy a 3 szabály nyom nélkül eltnteti az Ê szimbólumot. Mi követi ilyenkor a szimbólumot? Nyilván az, ami a mögüle eltntetett Ê szimbólum után állt, vagyis ami eredetileg az Ê szimbólumot követte. Ennek alapján a követ nyelve: FOLLOW1() = { +, , )} Ezzel már el tudjuk dönteni, hogy a szóban forgó nyelvtan ersen balelemezhet-e, vagyis diszjunktak-e az (5.15.) szerinti kifejezések. Ezt a vizsgálatot természetesen csak azokra a szabályokra kell elvégezni, amelyek alternatívát jelentenek, amelyek egymás konkurensei. Ilyenek a 2-3, az 5-6 és a 7-8 szabálypárok. Nos ezekre az (5.15.) szerinti kifejezések, amelyek mint láttuk, az elretekintést szolgáltatják a következk lesznek: 2-3 {+} { , ) } 5-6 {*} { +, , ) } 7-8 {(} {a}

174

5.2. A balelemzés, LL(k) nyelvtanok

Mint látható, az alternatívaként szóba jöhet párokra nézve a halmazok mind diszjunktak, így a nyelvtan ersen LL(1) nyelvtan. Szerkesszük meg ezek után az elemz táblát, megállapodásunk szerint elhagyva a függleges fejlécbl a terminális szimbólumokat. ( ) + * a E TÊ,1 TÊ,1 +TÊ,2 Ê ,3 ,3 T F,4 F,4 *F,5 ,6 ,6 ,6 (E),7 F a,8 A táblázat segítségével a nyelv egy mondatának szintaktikus elemzését könnyen elvégezhetjük. Példaképpen legyen az elemzend mondat: a+a*a Az elemzés menete: { a+aa, , } a { a+aa, Ê, 1} a { a+aa, FÊ, 14 } a a { a+aa, aÊ, 148 } a { +aa, Ê, 148 } a { +aa, Ê, 1486 } a a { +aa, +Ê, 14862 } a { aa, Ê, 14862 } a { aa, FÊ, 148624 } a a { aa, aÊ, 1486248 } a { a, Ê, 1486248 } a a { a, FÊ, 14862485 } a { a, FÊ, 14862485 } a a { a, aÊ, 148624858 } a { , Ê, 148624858 } a a { , Ê, 148628586 } a { , , 1486285863 } a accept Az a tény, hogy az (5.15.) szerinti halmazok nem diszjunktak nem jelenti szükségképpen azt, hogy a nyelvtan nem balelemezhet. Legcélszerbb ezt elször egy példán bemutatni, ennek okait majd ezt követen vizsgálhatjuk meg. Az alábbi nyelvtan, mint késbb kitnik LL(2) nyelvtan. 1 S aAbaS 2 S bAabS 3S 4Aa 5Ab 6A Érzékelheten az A nemterminális felbontása a kritikus. Állapítsuk meg az A nemterminális követ nyelvét: FOLLOW2(A) = { ab, ba } Ezzel a 4, 5 és 6 szabályhoz tartozó (5.15.) szerinti kifejezések: 4 - { aa, ab } 5 - { ba, bb } 6 - { ab, ba } A halmazok nem diszjunktak, így amennyiben az elretekintéssel kapott jelsorozat ab illetve ba, akkor az els esetben a 4 és 6, második esetben az 5 és 6 szabály között nem tudunk választani. Segíthetünk azonban ezen a problémán, ha a nyelvtanon egy apró, jelentéktelennek tn módosítást hajtunk végre. 2 S bA2abS 3S 1 S aA1baS 4 A1 a 5 A1 b 6 A1 4 A2 a 6 A2 b 6 A2

5. Szintaktikus elemzk

175

Itt tulajdonképpen semmi mást nem tettünk, mint megkülönböztettük az 1 és 2 levezetési szabályban szerepl A nemterminálist. Természetesen a helyette bevezetett két új nemterminális produkciós szabályaikat az eredeti A nemterminálistól öröklik, így ezeket ugyanazzal a számozással láttuk el. A fenti nyelvtanhoz viszont már könnyen szerkeszthetünk egy LL(2) elemzt. Íme a táblázat: S A1 A2 aa aA1baS, 1 a, 4 ab aA1baS, 1 a, 4 , 6 ba bA2abS, 2 , 6 b, 5 bb bA2abS, 2 b, 5 a b , 3

Természetesen most két karaktert tekintünk elre, a táblázat vízszintes fejléce tehát ennek megfelelen alakul. Jóllehet van olyan szituáció, amikor a jelsorozat még el nem olvasott része már csak egy karaktert tartalmaz, ilyen esetekben mindig a pop mvelet következik, vagyis a tennivalókat a táblázatnak azon részei szabják meg, amelyeket korábbi megállapodásunknak megfelelen elhagytunk. Emlékeztetek arra, mi volt az LL(k) tulajdonság szabatos megfogalmazása. Az áttekinthetség miatt megismételjük az (5.11.) és (5.12.) alatti állításokat. Egy nyelvtan akkor LL(k) nyelvtan, ha minden nemterminálisának ­ jelölje itt A ­ bármely szabálypárjára ­ legyen ez itt A és A ­ igaz, hogy ha adott két levezetés S wA w wx S wA w wy azonosságból következik az alábbi azonosság is: az alábbi azonosság is: FIRSTk (x) = FIRSTk (y) =
* * * *

és

A különböz jobboldalak által létrehozott terminális jelsorozatokból, pontosabban azok els k szimbólumából alkotott halmazok nyilvánvalóan diszjunktak kell legyenek. Amennyiben A utódai, tehát jelen esetben és mindig generálnak kell számú karaktert, akkor ez nem csak szükséges, hanem elégséges feltétel is, és az, hogy az A szimbólum mögött álló milyen terminális jelsorozatot hoz létre érdektelen, hiszen az elemz úgy sem veszi figyelembe. Amennyiben a produkciós szabályok jobboldalai nem képesek minden esetben generálni a szükséges k karaktert, akkor figyelembe kell venni, milyen terminális jelsorozat származhat a mondatszer formának az A nemterminálist követ részébl. Ennek egyszer módja, ha számításba vesszük mindazokat a jelsorozatokat, amelyek az A derivátumai után állhatnak. Ezt fejeztük ki a FOLLOW függvénnyel, és ezt tükrözi a (5.15.) összefüggés.

176

5.2. A balelemzés, LL(k) nyelvtanok

Ez a sommás elintézési mód azonban túl nagyvonalú, mert nem veszi figyelembe azt az információt, amelyet a már elolvasott szövegbl, jelöléseinkkel a w jelsorozatból nyerhetünk. Egy adott levezetésnél ugyanis az A nemterminális eltt álló szöveg egy olyan kontextust jelent, amelyik korlátozhatja az A nemterminális derivátumai után álló jelsorozatokat. Ha ezt figyelembe vesszük, pontosabb disztinkciót biztosíthatunk. Szó szerint ezt tettük akkor, amikor finomítottuk az elbbi LL(2) nyelvtanunkat. Felismertük ugyanis, hogy ha megkülönböztetjük az 1 és 2 szabály generálta A nemterminálist, akkor csatát nyerhetünk, hiszen a két úton nyert kontextus a kettéhasítással született két nemterminálishoz két különböz úgynevezett lokális követ nyelvet, két különböz FOLLOW függvényt rendel. Amennyiben az eredeti nyelvtan valamely nemterminális szimbólumát fel tudjuk bontani olymódon több nemterminálisra, hogy a születésükkor meghatározott követ nyelvek, a lokális FOLLOW függvények eltérek legyenek, és ennek segítségével a FIRSTk(FIRSTk(Ai)·FOLLOWk(Ai)) FIRSTk(FIRSTk(Aj)·FOLLOWk(Aj)) = kifejezéseket diszjunkttá tudjuk tenni, akkor gyengén LL(k) nyelvtanról beszélünk. Itt Ai és Aj az eredeti nyelvtan A nemterminálisának különböz lokális FOLLOW függvényekkel bíró példányai. Megjegyzem, hogy ezeknek az újonnan született nemterminálisoknak a FIRSTk függvénye természetesen megegyezik a FIRSTk (A) függvénnyel, hiszen az, hogy mi áll egy nemterminális derivátumai után az függhet attól, hogyan került bele a nemterminális a mondatszer formába, de az, hogy mit vezetünk le belle az nyilván ettl független. Annak érdekében, hogy gyenge LL(k) nyelvtanokra, tehát olyanokra, ahol a lokális FOLLOW függvény szerinti disztinkció szükséges, készíthessünk elemzt, célszer, ha ezt a különbségtételt már az induláskor megtesszük. Ez annyit jelent, hogy egy nemterminális két vagy több elfordulását megkülönböztetjük, a táblázatot finomítjuk, ha a kontextus alapján különböz követ nyelv tartozik hozzájuk. Így az elemz tábla rovatai a nemterminálisoknak a hozzájuk tartozó lokális követ nyelvvel együtt felelnek meg. Persze ez a disztinkció bonyolultabbá teszi az elemz tábla elkészítését. A nagy elemz tábla minden rovatát egy kisebb táblácska alapján szerkesztjük meg. Ennek a táblácskának három oszlopa lesz. Megadjuk az adott szituációban az elretekintéssel kapható jelsorozatokat, feljegyezzük az egyes esetekben szükséges intézkedéseket, végül, ha a verembe új nemterminálist írunk be, akkor megadjuk annak követ nyelvét.

5. Szintaktikus elemzk

177

Az eredetileg azonos, de különböz lokális követ nyelvük miatt megkülönböztetett nemterminálisokat indexszel sorszámozzuk. Amennyiben egy nemterminálishoz olyan követ nyelv kombináció adódik, amely eddig még nem fordult el, akkor az indexet eggyel növelve, erre is elkészítjük ezt a táblácskát. Induláskor a legels mondatszer formára kell gondolnunk. Ez egyedül a mondatszimbólum, amelyet semmi sem követ, Ennek következtében az els nemterminális ­ lokális követ nyelv párosításunk a mondatszimbólum, és egyedül az üres jelsorozatot tartalmazó követ nyelv lesz. Ezt elemezve találjuk meg a nyelvtan többi nemterminális ­ lokális követ nyelv párjait. Végezzük el ezt a párosítást a már ismert, az aritmetikai kifejezéseket generáló nyelvtanra. Emlékeztetül álljon itt a nyelv módosított nyelvtana: 1 E TÊ 5 *F 2 Ê +TÊ 6 3Ê 7 F (E) 4 T F 8Fa

A táblácskák struktúrája olyan, hogy a harmadik oszlopban egymás után sorban szerepelnek a második oszlop nemterminálisainak követ nyelvei. Adott esetben, minthogy LL(1) elemzt készítünk, ezen követ nyelvek mondatai legfeljebb egy karakterbl állanak. A táblácskák kitöltése megér néhány szó magyarázatot. A kiindulás, mint azt megbeszéltük, a mondatszimbólum és az {} követ nyelv. Számítva arra, hogy a mondatszimbólum más követ nyelvvel is elfordul majd, elrelátóan 1 indexszel láttuk el ezt a változatot. Az els táblácska szerint, miután Ê kerül az E1 nemterminális helyére, Mindkettnek azonos lesz a követ nyelve. Itt is 1 indexet adtunk ennek a változatnak. A T nemterminális követ nyelvét az utána álló Ê1 nemterminális generálja. Amennyiben valóban generál valamit, akkor annak els karaktere a + szimbólum lesz. Elfordulhat azonban, hogy az Ê1 szimbólum a 3 szabály szerint eltnik. Ilyenkor az válik láthatóvá, ami eredetileg mögötte állt, adott esetben az üres jelsorozat. Így a T1 nemterminális követ nyelve { +, } lesz. Hasonló gondolatmenettel adódik ki a többi táblácskában is a lokális követ nyelv. Ha valamelyik nemterminálishoz eddig nem szerepelt követ nyelv kerül, akkor azt új indexszel mint önálló nemterminálist tüntetjük fel a nagy táblázatban. A lokális követ nyelvek figyelembe vétele, a nemterminális szimbólumok finomítása ebben a példában pontosan kétszeresére növelte az elemz tábla méretét.

178

5.2. A balelemzés, LL(k) nyelvtanok

E1 ( a Ê1 + T1 ( a 1 * + F1 ( a ,3

{} T1Ê1,1 T1Ê1,1 {} {+,},{} + ) {+,} F11,4 F11,4 {+,} *F11,5 ,6 ,6 {*,+,} (E2),7 a,8 {)} ( a {*,+,},{+,} * + ) {*,+,},{+, } {*,+,},{+,} ( a {+,},{} {+,},{} ( a

E2

{)} T2Ê2,1 T2Ê2,1 {+,)},{)} {+,)},{)}

Ê2

{)} +T2Ê2,2 ,3 {+,)},{)}

+T1Ê1,2

T2

{+,)} F22,4 F22,4 {*,+,)},{+,)} {*,+,)},{+,)}

2

{+,)} *F22,5 ,6 ,6 {*,+,)},{+,)}

F2

{*,+,)} (E2),7 a,8 {)}

Ennek alapján az elemz tábla elkészíthet: E1 E2 Ê1 Ê2 T1 T2 1 2 F1 F2 ( T1Ê1,1 T2Ê2,1 a T1Ê1,1 T2Ê2,1 ) + *

,3 F11,4 F22,4 F11,4 F22,4 ,6 (E2),7 (E2),7 a,8 a,8

+T1Ê1,2 +T2Ê2,2

,3

,6 ,6

*F11,5 *F22,5

,6

5. Szintaktikus elemzk

179

Látható, hogy az F nemterminális kivételével minden esetben van valamelyes különbség az 1 és 2 indexszel jelölt nemterminálisok sorai között. Ennek ellenére a két sor között nincsen konfrontáció, vagyis nem tartalmaznak ellentétes utasítást. Ez arra utal, hogy az azonos nemterminálisból származtatott új nemterminálisok sorait össze is lehetne vonni, vagyis a nyelvtan ers LL(k) nyelvtan. Ez természetes, hiszen mint kiderült, a nyelvtan ers LL(1) nyelvtan, és így nincs szükség a nemterminálisok lokális követ nyelv szerinti finomítására. Emlékeztetek arra, hogy a gyengén balelemezhet nyelvtanok esetében a kétféle kontextusban más és más tennivaló áll, a két sor között konfrontáció van. Éppen ezért az ilyen nyelvtanok esetében a nemterminálisok lokális követ nyelv alapján történ szétválasztása létkérdés. Ez a finomítás teszi ugyanis lehetvé az ellentmondásmentes elemz elkészítését. Felmerül a kérdés, van-e értelme az ersen balelemezhet nyelvtanok esetében ennek a finomításnak. Erre a kérdésre egy olyan jelsorozat elemzése ad választ, amely nem a nyelv mondata. Ugyanis ha összevetjük a szétbontott nemterminálisokhoz tartozó sorokat, akkor konfrontációt ugyan nem találunk, olyan helyzet azonban adódik, amikor az egyik sor határozott utasítást ad, a másik sorban viszont a mezben nem áll semmi, ami konvenciónk szerint hibára utal. Ezért lesz tanulságos egy hibás jelsorozat vizsgálata. Legyen ez a jelsorozat: a+a)a Lássuk az elemzés menetét. { a+a)a, 1, } a { a+a)a, 1Ê1, 1 } a { a+a)a, F11 Ê1, 14 } a a { a+a)a, a1Ê1, 148 } a{ +a)a, 1Ê1, 148 } a a { +a)a, Ê1, 1486 } a { +a)a, +T1Ê1, 14862 } a a { a)a, T1Ê1, 14862 } a { a)a, F11Ê1, 148624 } a a { a)a, a1Ê1, 1486248 } a { )a, 1Ê1, 1486248 } Az elemzés eddig ugyanúgy halad akár az eredeti, akár a finomított elemz táblát használjuk. Most azonban, amikor a hibát okozó szimbólum kerül sorra, a két elemz magatartása eltér. A finomabb felosztású elemz hibát jelez, hiszen a 1 nemterminális szimbólum esetében az elretekintés nem eredményezhet ) szimbólumot. Az eredeti elemz elbb alkalmazza a 3 majd a 6 szabályt, és csak azután jelez hibát. Ez magától értetd, hiszen csak a finomabb felosztású elemz tesz különbséget a zárójelen kívüli és zárójelen belüli nemterminálisok között. Két szintaktikus elemzt ersen ekvivalensnek mondunk, ha bármely jelsorozatnál az esetleges hibát ugyanannál az elemzési lépésnél fedezik fel. Két szintaktikus elemz gyengén ekvivalens, ha a jelsorozatnak ugyanannál a szimbólumánál állanak meg, de ebben a helyzetben különböz számú elemzési lépést tesznek meg.

180

5.2. A balelemzés, LL(k) nyelvtanok

Két szintaktikus elemz nem ekvivalens, ha van olyan ­ szükségképpen hibás ­ jelsorozat, ahol a két elemz a hibát más-más karakternél detektálja. A mi két példánkban szerepl két elemz gyengén ekvivalens. Természetesen a lokális követ nyelv figyelembe vételével készített elemz nagyobb terjedelm, és kezelése is nehézkesebb. Gondoljuk meg azonban, hogy a fordítóprogram futása során hány ízben eredményez hibajelzést és hányszor ad hibátlan kódot. Talán els hallásra kissé bizarr, de alapveten sokatmondó az az állítás, hogy a fordítóprogram elsdleges funkciója a hibajelzés, és a fordítás csak mint mellékhatás jelentkezik. Ennek fényében pedig a jó hibadetektálási képesség megkülönböztetett fontosságú. Nyilvánvaló, hogy az összes rendelkezésre álló információt feldolgozó, tehát a lokális követ nyelveket is tekintetbe vev elemz adja balelemzés esetén a legpontosabb hibajelzést. Hogyan lehet egy nyelvtanról kideríteni, hogy balelemezhet. Sajnos sehogyan. Csupán azt lehet megállapítani, hogy egy nyelvtan egy adott rögzített k esetében LL(k) nyelvtan-e. Ennek az a módja, hogy elkezdjük az ismertetett táblácskák elkészítését. Amennyiben nem tapasztalunk konfliktus helyzetet, akkor ellentmondásmentes elemz tábla szerkeszthet, a nyelvtan LL(k) nyelvtan. Felmerül a kérdés, hogy a balelemezhetség nyelvhez, vagy nyelvtanhoz köthet tulajdonság. A tárgyalás során találkoztunk olyan nyelvvel, amelynek egyik nyelvtana nem volt balelemezhet, de találtunk ugyanakkor egy másik balelemezhet nyelvtant. Ebben az esetben a balelemezhetség nyilván nyelvtanhoz kötött tulajdonság. Ez általában is igaz, ezért rendszerint balelemezhet nyelvtanról és nem balelemezhet nyelvrl beszélünk. Vannak azonban nem balelemezhet nyelvek is. Az ilyen nyelveknek nincsen balelemezhet nyelvtanuk. Balelemzés esetén nagyon kedvez, ha az elretekintés hossza, a k minél kisebb. Vannak módszerek a nyelvtanok olyan átalakítására, amellyel az elretekintés hosszát csökkenteni lehet. Ilyen módszer az úgynevezett faktorizálás. Ez az eljárás akkor alkalmazható, ha valamelyik nemterminális két vagy több levezetési szabályának jobboldala azonosan kezddik. Legyen például az A nemterminális két levezetési szabálya: A A Ilyenkor a két szabály között csak olyan elretekintéssel tehetünk különbséget, amely túlmutat az prefixum derivátumán. Amennyiben ,,kiemeljük" az prefixumot a két levezetési szabályból, akkor sokkal kedvezbb nyelvtant kapunk: A B B

5. Szintaktikus elemzk

181

Ennél a megoldásnál nem kell még az feldolgozása eltt a illetve folytatás fell döntenünk, hanem erre ráérünk akkor, amikor az már elkerülhetetlen, az felszámolása után. Kérdés mikor lehet a nyelvtant úgy átalakítani, hogy faktorizálással az elretekintés mértéke k csökkenjen? Minden környezetfüggetlen nyelvtannak megszerkeszthet a Greibach normálalakja. Mostani szándékaink szerint fontos tudnunk, hogy ha az eredeti nyelvtan LL(k) nyelvtan volt, akkor a mvelet végrehajtható olymódon, hogy annak során k értéke ne növekedjék. Ennek ellenkezje persze elfordulhat, hiszen például egy nem balelemezhet balrekurzív nyelvtan Greibach normálalakja rögtön LL(k) elemezhetvé válik. Ha megkaptuk a Greibach normálalakot, akkor vizsgáljuk meg, hogy az egyes nemterminálisokhoz tartozó produkciós szabályok milyen terminális szimbólummal kezddnek. Ha ezek a terminális szimbólumok valamennyi nemterminális esetében mind különbözek, akkor nyilván LL(1) nyelvtannal van dolgunk, és így az elretekintés hosszában elértük az optimumot. Amennyiben van olyan nemterminális, ahol két levezetési szabály ugyanazzal a terminálissal kezddik, akkor faktorizálással segíthetünk a dolgon. Ha most az új, most már a Greibach alaktól kissé eltér nyelvtant újra Greibach normálalakra hozzuk, ezt a játékot folytatva tovább csökkenhetjük az elretekintés hosszát, a k paramétert. Ebben a folyamatban nincsen megállás, mindig szerkeszthetünk LL(1) nyelvtant? Nem, mint alább kiderül, van megállás. Ugyanis, ha az átalakítások során -szabály kerül a nyelvtanba, akkor nem minden esetben folytatható ez az eljárás, a k paraméter csökkentését nem tudjuk továbbfolytatni. Ehhez a gondolathoz kapcsolódik a következ kérdés. Azt már tudjuk, hogy vannak LL(k) nyelvtanok. Vannak-e LL(k) nyelvek? Vannak. Egy nyelvet akkor nevezünk LL(k) nyelvnek, ha a nyelvnek van LL(k) elemezhet nyelvtana, de nincsen k-1 elretekintéssel elemezhet grammatikája. Vizsgáljuk a következ nyelvet: a i ( b b k c )i Ennek egy lehetséges grammatikája: 1 A aAB 2 A aB 3Bb

4 B bkc

Ha ennek a nyelvnek a mondatait elemezzük, akkor nincsen semmi gondunk, amíg az a karakterek vannak soron. A b karakterek esetében már problémás a helyzet. Annak érdekében, hogy a 3 és 4 szabály között dönteni tudjunk, meg kell tekintenünk a vizsgálat helyétl számított k+1 sorszámú karaktert. Amennyiben az b, akkor a 3, ha viszont c, a 4 szabályt kell választanunk. Ez k+1 hosszúságú elretekintést jelent.

182

5.2. A balelemzés, LL(k) nyelvtanok

Minthogy azonban a nyelvtanban nincsen -szabály, bizonyosak lehetünk abban, hogy az elretekintés mértéke csökkenthet. Valóban itt alkalmazható a faktorizálás, és ennek eredményeképpen megkapjuk az LL(k) nyelvtant: 1 A aAB 2 A aB 3 B bC 4 C bk-1c 5C Ezzel nem csak azt demonstráltuk, hogy a nyelvek a balelemezhetség szerint az elretekintési hossz nagysága szerint egy végtelen egyre szkül halmazsorozatot alkotnak, hanem arra is láttunk példát, hogyan lehet mindaddig faktorizálni, ameddig egy -szabály ezt meg nem akadályozza. Még egy megjegyzés. Amikor a FIRST függvények diszjunkt voltát mint szükséges, de nem elégséges feltétel említettük, akkor kicsit erltetettnek tnt az a félelem, hogy egy nem kellen hosszú FIRST mondat éppen úgy folytatódik, hogy egy másik FIRST függvény elemét szolgáltatja. Ott említettük, hogy ha van -szabály, akkor ez nem is annyira valószíntlen. Most viszont látjuk, hogy a k elretekintés csökkentése érdekében gyakran célszer az -szabályok bevezetése, ez a probléma tehát igenis gyakorlati szempontból is fontos.

5.3. A jobbelemzés, LR(k) nyelvek
Idézzük fel pár szóval az alulról felfelé történ, vagy másképp jobbelemzést. A mondatjelölt szimbólumait olvasva azokat rendre a veremben helyezzük el. Közben minden alkalommal megvizsgáljuk, nem alakult-e ki a veremben egy olyan fragmens, amely egy levezetési szabály jobboldala, és így egy potenciális nyél. Amennyiben ez a fragmens valóban nyélnek bizonyul, akkor letörjük, vagyis helyébe a szabály baloldalán álló nemterminálist írjuk. Az alulról felfelé történ elemzésnek tulajdonképpen ez az egész tudománya. A következ szimbólumot átcsúsztatjuk a verembe, megvizsgáljuk keletkezett-e nyél, ha igen, letörjük, redukáljuk, ha nem, akkor áttérünk a következ szimbólumra. Az algoritmus angol elnevezése shift-reduce elég világosan és tömören fejezi ki ezt a stratégiát. Az egész algoritmus kritikus pontja a nyél létének megállapítása. A korábbi példákból ugyanis már tudjuk, hogy egy jobboldallal való azonosság még nem jelenti feltétlenül azt, hogy nyél az illet. Ezen kívül, ha több levezetési szabálynak azonos a jobboldala, vagy jobboldaluk azonosan végzdik, akkor azt is el kell döntenünk, melyik szabály szerint végezzük el a letörést. Ezen kérdések eldöntésében segít, ha kissé elre lapozunk, elretekintünk, és ezt az információt is felhasználjuk. Az LR(k) nyelvtanok esetében k szimbólummal elretekintve döntünk a nyéljelölt ügyében. A gondolatot az 5.2. ábra szemlélteti

5. Szintaktikus elemzk
S k=|x|

183

A



x

5.

2. ábra Az ábrán a wx mondat jobbodali levezetésének egy állapota van feltüntetve. S Ax x wx Mint ismeretes, a jobboldali elemzés fordított irányban halad végig a jobboldali levezetésen. Adott esetben azt, hogy az A levezetési szabály jobboldalával azonos fragmenst nyélnek tekintsük-e vagy sem, és azt az A nemterminálissá törjük-e le, a FIRSTk (x) alapján döntjük el. Egy nyelvtan akkor LR(k) nyelvtan, ha a vélelmezett nyél után álló k terminális szimbólum alapján egyértelmen eldönthet, hogy valódi nyélrl vane szó, és ha igen, melyik szabályt alkalmazva kell azt letörni. Az elnevezésben az els bet L most is a left rövidítése, hiszen ebben az esetben is balról jobbra olvasva elemzünk. Az R ­ right természetesen a jobbelemzésre utal. Legyen egy nyelvtan két levezetési szabálya A és B legyen továbbá két lehetséges jobboldali levezetés, S Ax x S By y (5.19.) melyekben az utolsó lépést megelzen azonos helyettesítéseket tettünk, tehát = akkor LR(k) nyelvtan esetében a FIRSTk (x) = FIRSTk (y) azonosságból következnek az = , = és az A = B (5.20.) azonosságok is.
* * * *

184

5.3. A jobbelemzés, LR(k) nyelvtanok

A vázlatos ábrából még az is kitnik, hogy a jobboldali levezetés mondatszer formái a verem tartalmából és a jelsorozat még el nem olvasott részébl rakhatóak össze. A verem tartalma tehát ezen mondatszer formák prefixuma. Ebben a prefixumban valódi nyél csakis a jobboldali szélen lehet. Az elemzés során ugyanis nem megyünk el szótlanul a valódi nyelek mellett, hanem azonnal letörjük azokat. Ez persze nem jelenti azt, hogy a prefixum belsejében ne lehetne olyan fragmens, amely megegyezik egy jobboldallal. Errl a fragmensrl azonban annak idején az elretekintés figyelembe vételével lefolytatott részletes vizsgálatnak ki kellett mutatnia, hogy az nem valódi nyél. Az elemzés mindaddig sikerrel kecsegtet, amíg szerkeszthet a prefixumhoz egy olyan folytatás, amely azt egy jobboldali levezetés mondatszer formájává egészíti ki. Az ilyen prefixumokat életképes prefixumoknak nevezzük. Az elemzés során egy adott szituációban a követend eljárás a prefixumtól és az elretekintéssel nyert jelsorozattól függ. Ennek megfelelen az elemz tábla vízszintes fejlécében ­ éppúgy, mint a balelemz táblában ­ az elretekintéssel kapott jelsorozatok állanak. Az egyes rovatok, vagyis a függleges fejléc bejegyzései az életképes prefixumoknak felelnek meg. Az óvatos fogalmazás mindenképpen helyénvaló, mert vannak olyan nyelvtanok, ahol az életképes prefixumok száma nem korlátos. Ilyen például az S aS a nyelvtan, ahol az aaa . . . a és az aaa . . . aS alakú jelsorozatok mind életképes prefixumok. Persze ,,szerencsére" lehetnek olyan különböz prefixumok, amelyek esetében az elemzés során követend eljárás azonos. Tekintsük ezeket az életképes prefixumokat ekvivalenseknek. Könny belátni, hogy ez a reláció valóban ekvivalencia reláció. Ennek megfelelen az életképes prefixumokat ekvivalenciaosztályokba sorolhatjuk, és ekvivalenciaosztályonként csak egy rovatot alkalmazunk. Késbb látni fogjuk, hogy az ekvivalenciaosztályok száma mindig véges, így elemz táblánknak is mindig véges rovata lesz. Minden életképes prefixumhoz ­ pontosabban ekvivalenciaosztályhoz ­ elemeket fogunk rendelni. Ezek az elemek mind szintakszisukat, mind szemantikájukat tekintve emlékeztetnek az Earley algoritmusnál alkalmazott elemekre, jóllehet az ottani meg az itteni elemek nem azonosak. Valamely életképes prefixumhoz, illetve ekvivalenciaosztályhoz tartozó elem alakja: { A 1·2, L } (5.21.) ahol az A 12 a nyelvtan egy produkciós szabálya, L pedig egy legfeljebb k hosszúságú jelsorozatokból álló véges nyelv.

5. Szintaktikus elemzk

185

Az elem értelmezése, szemantikája a következ. Az adott prefixum néhány utolsó, közelebbrl meg nem határozott számú szimbóluma az 1 jelsorozatból generálódik, és a mondatban az A 12 szabály által generált fragmenst követ els k terminális az L nyelv valamelyik szava. Tételezzük most fel, hogy egy adott életképes prefixumhoz valamilyen módon sikerült megszerkesztenünk az összes hozzátartozó elemet. Két kérdést kell megvizsgálnunk. Miképpen állapíthatjuk, meg milyen életképes prefixumokat kell még figyelembe vennünk, és hogyan következtethetünk az elemekbl az elemzés során követend lépésekre. Ami az els kérdést illeti, a prefixum csakis olyan szimbólummal folytatódhat, lett légyen az terminális vagy nemterminális, amely a prefixumhoz tartozó elemekben közvetlenül a pont után áll. Ez megadja, milyen új prefixumot kell számításba vennünk. Az új prefixumokhoz rendelt csoportoknak éppen ezek az elemek lesznek alapító tagjai, természetesen azzal az eltéréssel, hogy itt a pont eggyel tovább kerül, vagyis átugorja a pontot követ szimbólumot. Ez a lépés önmagáért beszél, és külön magyarázatot nem igényel. Amennyiben az így származtatott elemekben a pont után nemterminális áll, ­ és ebben a követend eljárás megegyezik az Earley algoritmusban követettel, ­ akkor ezen nemterminálisok valamennyi levezetési szabályából új elemet kell képeznünk, a pontot a jobboldal elé helyezve, és megállapítva a követ nyelvet. Egy prefixumot követen azokat a terminálisokat csúsztathatjuk ­ számítástechnikai argóban siftelhetjük, ­ amely a prefixumhoz tartozó csoport elemeiben a pont után áll. Ez annyit jelent, hogy csak akkor csúsztathatunk, ha az ily módon kialakuló prefixum továbbra is életképes marad. Amennyiben a pontot sikerült áttuszkolnunk a teljes jobboldalon, és így az most már a levezetési szabály után áll, akkor ez annyit jelent, hogy a prefixum nyélben végzdik, ami letörhet, feltéve, hogy az elretekintéssel nyert jelsorozat eleme a L követ nyelvnek. Ennek alapján a leírt módon haladhatunk prefixumról prefixumra. Az eljárás garantálja, hogy a prefixumok mindig életképesek lesznek. Amennyiben két különböz prefixum csoportja megegyezik, akkor ez annak a jele, hogy a két prefixum azonos ekvivalenciaosztályba tartozik, és nem kell az elemz táblában új rovatot nyitnunk. A csoport elemei azt is megmondják, milyen terminálisokat van jogunk a verembe átcsúsztatni, és mikor és milyen szabály alapján lehet az adott nyelet letörni. A gondot itt is az indulás jelenti. Szerencsére van egy olyan prefixum, az üres jelsorozat, , amely minden nyelvtan minden mondatszer formájának prefixumaként felfogható. Nos, mindenkor ezzel az életképes prefixummal kezdjük a vizsgálatot.

186

5.3. A jobbelemzés, LR(k) nyelvtanok

Gondot jelenthet még az elfogadás, az akceptálás felismerése. Ennek érdekében vezessünk be egy új mondatszimbólumot, és egy új 0 sorszámú produkciós szabályt: 0 S (5.22.) ahol S az eredeti, míg az új mondatszimbólum. Ezzel természetesen a generált nyelv nem változik, pusztán annyi történik, hogy minden levezetés a fenti (5.22.) szabállyal kezddik, de egyébként változatlan. Minthogy ez a szabály áll minden levezetés elején, ha a jobboldali felvezetés során eljutunk ehhez a szabályhoz és letörjük, akkor ez annyit jelent, hogy a jelsorozatot el kell fogadnunk. Ezen szabály szerinti letörés lesz tehát az akceptálás jele. Most akár el is kezdhetjük a különböz életképes prefixumhoz tartozó csoportok kialakítását. Az els, vagyis a 0 sorszámhoz tartozó, csoport els, alapító eleme az új mondatszimbólum egyetlen produkciós szabálya lesz, végül az L követ nyelv nyilván szintén az üres jelsorozat, , hiszen induláskor semmi sem áll a mondatszimbólum után. A világ kezdete tehát minden nyelvtannál: { ·S, } (5.23.)

A jelölés egyszersítése érdekében engedjük meg azt a lazaságot, hogy a követ nyelvet ne tegyük az ismert ,,halmazzárójelek" közé, és a nyelv mondatait a vagy jelentés jellel válasszuk el. Úgy hiszem, most már kell ismerettel rendelkezünk ahhoz, hogy egy LR(k) elemz táblát megszerkesszünk. Próbálkozzunk LR(1) elemzvel, és válasszuk most a posztfix lengyel jelölést generáló nyelvtant. Ez azt is demonstrálja, hogy balrekurzív nyelvtanok is jobbelemezhetek. E EE+ EE a Az életképes prefixumokat az irodalomban ­ ki tudja miért ­ a T betvel, és megkülönböztet indexszel jelölik. Ezek szerint els prefixumunk T0 A többi prefixum, pontosabban prefixum osztály esetében azt a jelölést alkalmazzuk, hogy a származtató prefixumhoz hozzáfzzük az új szimbólumot. A T0 prefixumhoz tartozó csoport alapító eleme: { Ê ·E, } Minthogy az E nemterminális eltt pont áll, ehhez hozzá kell fznünk az alábbi elemeket: { E ·EE+, } { E ·EE, } { E ·a, } Minthogy ezek az elemek az els alapító elem utolsó szimbóluma, az E nemterminális helyére kerülnek, így követ nyelveik megegyeznek.

5. Szintaktikus elemzk

187

Ezekben az új elemekben azonban az E nemterminális eltt ismét pontot találunk, így további elemeket fzhetünk hozzá a csoporthoz. Persze ezekben az új elemekben is ugyanazok a levezetési szabályok szerepelnek majd, más lesz azonban a követ nyelv. Itt ugyanis a felbontandó nemterminális, vagyis az els E után egy második E áll, amely végs soron az a terminális szimbólumot generálja. { E ·EE+, a } { E ·EE, a } { E ·a, a } Ezekben az elemekben megint találhatunk a pont után nemterminálist. Természetesen rekurzívan ismét új elemeket vezethetünk, illetve csak vezethetnénk be, hiszen kiderül, hogy a bevezetend elemek már benne vannak a csoportban. Tovább egyszersíthetjük a jelölést, ha azokat az elemeket, amelyek ugyanabból a levezetési szabályból származnak, és ráadásul a pont helyzete is azonos, összevonjuk. Az összevont elemben természetesen a követ nyelv a két nyelv uniója lesz. Ennek szellemében megszerkeszthetjük a prefixum osztályokhoz tartozó csoportokat, és ennek alapján az elemz táblát. T0 T 0 E T1 T1 E T3 { Ê ·E, } { Ê E·, } { E EE·+, a } { E ·EE+, a } { E E·E+, a } { E EE·, a } { E ·EE, a } { E E·E, a } { E E·E+, + a } { E ·a, a } { E ·EE+, + a } { E E·E, + a } { E ·EE, + a } { E ·EE+, + a } { E ·a, + a } { E ·EE, + a } T0a T2 { E a·, a} { E ·a, + a } T1 a T4 { E a·, + a} T3 a T4 T3 E T5 { E EE·+, + a } T3 + T 6 T 3 T7 { E EE·, + a } { E EE+·, a } { E EE·, a } { E E·E+, + a } { E E·E, + a } T5 a T 4 T 5 E T5 { E · EE+, + a } { E · EE, + a } T5 + T 8 T 5 T9 { E ·a, + a } { E EE+·, + a } { E EE·, + a } Minthogy a T3 és a T5 prefixummal az a terminális olyan csoportot eredményez, amely egy már elfordult prefixuméval azonos, ezt újólag nem írtuk le. Hasonló a helyzet abban az esetben, amikor a T5 prefixumot az E nemterminális követi.

188

5.3. A jobbelemzés, LR(k) nyelvtanok

Valójában az így kialakuló prefixumok viselkedésükben megegyeznek más, már korábban szerepelt prefixumokkal. Ez az els két prefixum esetében a T4, a harmadikéban pedig a T5 életképes prefixum. Mint említettük, az életképes prefixumok ekvivalenciaosztályokat alkothatnak, és az említett prefixumok egyegy életképes prefixum osztály reprezentánsai. Nyelvtanunknak ­ könnyen beláthatóan ­ végtelen sok életképes prefixuma lehet. Minthogy a prefixumokhoz tartozó csoportokban véges számú produkciós szabály hozhat létre elemeket, ezekben a pont véges számú helyzetet vehet fel, végül a lehetséges követ nyelvek száma is véges, csak véges számú különböz csoport képzelhet el. Ennek következtében a prefixum ekvivalenciaosztályok száma véges. Az életképes prefixumokhoz tartozó elemek alapján az elemz tábla megszerkeszthet. Ez két részbl áll. Az els, az úgynevezett tevékenységi tábla ­ action table ­ mondja meg, hogy egy adott szituációban, adott életképes prefixum és adott elretekintés mellett mi a teend. Négyféle tevékenység lehetséges, csúsztatás, letörés, akceptálás és hibajelzés. A csúsztatást és az elfogadást az S és A betk ­ shift, accept ­ a letörést a levezetési szabály sorszáma, míg a hibajelzést az üres mez jelöli. A tábla második fele az úgynevezett ugró tábla ­ go to table. Ez megmondja, hogy az érvényes életképes prefixumhoz egy újabb szimbólumot fzve milyen sorszámú prefixumot kapunk. Az elemzés következ lépését aztán ezen prefixum sora alapján kell megállapítanunk. Mindezek elrebocsátása után az adott nyelvtan jobboldali elemz táblája a következ: a S S 3 S 3 S 1 2 1 2 Tevékenységi tábla + * A 3 S 3 S S 3 S 1 2 1 2 1 2 E T1 T3 T5 T5 a T2 T4 T4 T4 Ugró tábla + *

T0 T1 T2 T3 T4 T5 T6 T7 T8 T9

T6 T8

T7 T9

A korábbiak alapján remélem, nem okoz gondot az elemzési tábla származtatása.

5. Szintaktikus elemzk

189

Használatát mutassuk be egy példán. Legyen az elemzend mondat aaa+ Az elemzés során beírjuk az eredménybe az életképes prefixumokat is, hiszen ezek ismeretére szükség van a tevékenység megállapítására. Természetesen ezek a szimbólumok csak tájékoztatásra szolgálnak, és valójában nem részei a verem tartalmának. Az induló prefixum, mint tisztáztuk, az üres jelsorozat, vagyis T0 { aaa+, T0, } a { aa+, T0aT2, } a { aa+, T0ET1, 3} a a { a+, T0ET1aT4, 3 } a { a+, T0ET1ET3, 33} a a { +, T0ET1ET3aT4, 33 } a { +, T0ET1ET3ET5, 333 } a a { , T0ET1ET3ET5+T8, 333 } a { , T0ET1ET3, 3331 } a a { , T0ET1ET3T7, 3331} a { , T0ET1, 33312 } a accept Annak megállapítása, hogy létezik-e olyan k, amivel egy nyelvtan LR(k) nyelvtan, algoritmikusan eldönthetetlen feladat. Rögzített k esetében viszont kaphatunk választ. Az ismert módon elkezdjük az életképes prefixumokhoz tartozó elemek felírását, és ha ezek alapján az elemz tábla megszerkeszthet, más szóval nincsen benne ellentmondás, akkor a nyelvtan LR(k) nyelvtan.

5.4. Egyszersített jobbelemzés
Az LR(k) elemzk nagyon hatásosak abból a szempontból, hogy az esetleges hibát azonnal észlelik. Amennyiben ugyanis egy ,,rossz" szimbólum következik, ez azonnal életképtelenné teszi a prefixumot, és így a hiba napfényre kerül. Az ilyen elemzk kedveztlen velejárója viszont, hogy eléggé terjedelmesek. Még az olyan egyszer nyelvtannak is, mint amilyen a posztfix lengyel jelölést generáló, tíz soros táblája kerekedett. Ennek megfelelen az ilyen elemzk memória igénye és futási idtartama viszonylag nagy. Ennek a hely- és idigénynek a csökkentésére egy sereg egyszersít eljárás született, ami bizonyos esetekben elnyösen alkalmazható. Gyors és kis helyigény módszer a precedencia elemzés. Lényege abban áll, hogy a csúsztatás vagy letörés hamleti kérdésére nem a teljes életképes prefixum alapján kíván válaszolni, hanem megelégszik annak néhány utolsó karakterével. Legegyszerbb ez az elemz akkor, ha csak egyetlen karaktert veszünk a prefixumból figyelembe. Ha ugyanakkor az elretekintés is egyetlen karakter, akkor egyszer precedencia elemzrl beszélünk. Tételezzük fel, hogy egyszer precedencia elemzt kívánunk szerkeszteni. Vizsgáljuk meg a prefixum utolsó és az el nem olvasott szöveg els karakterébl álló szimbólumpárokat. Állapítsuk meg, hogy a csúsztatás vagy letörés tekintetében milyen kapcsolatban, milyen Wirth­Weber precedencia relációban vannak egymással.

190

5.4. Egyszersített jobbelemzés

Négy ilyen reláció képzelhet el. Az els szimbólummal záródik egy nyél, a két szimbólum egy nyél két szomszédos eleme, a második szimbólum egy nyél kezd karaktere, míg végül nem keletkezhet olyan mondatszer forma a jobboldali elemzés során, amelyben a két szimbólum egymás mellett állna. Adott nyelvtan esetében, jobboldali elemzést feltételezve, ezeket a relációkat kis gyakorlattal igen gyorsan és könnyen megállapíthatjuk. Ezeket a precedencia relációkat egy mátrixban szokás ábrázolni. A mátrix sorai és oszlopai a nyelvtan szimbólumainak felelnek meg. Sor-oszlop sorrendet feltételezve a mátrix megfelel mezejébe írjuk az érvényes precedencia jelét. A nyél eleje, nyél közepe és nyél vége relációkat rendre a kissé módosított, <· , · és ·> reláció jelek jelölik, míg inkompatibilitás esetén a mez üresen marad. Lássunk egy példát. Legyen a nyelvtan S aSc ac bSd bd Ennek a nyelvtannak a következ precedencia mátrixa van: S a b c d S · · a · <· <· · b · <· <· · c ·> ·> ·> d ·> ·> ·> <· <· Természetesen mind a vízszintes, mind a függleges fejlécen szerepel az mint szimbólum. Ha a veremben nincs még, vagy már átcsúsztatott szimbólum, akkor ezt az üres szimbólummal azonosítjuk. Ugyanakkor, amikor a jelsorozatot teljesen elolvastuk, a még el nem olvasott jelsorozat szintén az üres jelsorozat lesz. Magától értetd, hogy az - szimbólumpár az elfogadást, akceptálást jelöli. Ilyenkor ugyanis a vermet kiürítettük, és a teljes jelsorozatot is elolvastuk. Az ilyen precedencia mátrix használata, a precedencia elemz mködése roppant egyszer. A jelsorozat olvasásakor állandóan figyeljük a szimbólumpároknak megfelel precedencia relációkat. Ha a reláció nyél eleje vagy nyél közepe, akkor csúsztatunk. A nyél vége reláció esetében a nyelet le kell törni. A nyelet, pontosabban potenciális nyelet nagyon könnyen ki tudjuk választani. Hiszen az csak egy nyél eleje és nyél vége közötti jelsorozat lehet, amely természetesen tartalmazhat nyél közepe relációkat is. Ha ugyan nyél ez a potenciális nyél! Sajnos elfordulhat ugyanis, hogy az így kijelölt jelsorozat éppenséggel nem azonos egyik levezetési szabály jobboldalával. Ez esetben hibajelzést kell adnunk.

5. Szintaktikus elemzk

191

Zavarban lennénk akkor is, ha a megtalált nyél egynél több levezetési szabály jobboldalára illik. Ez persze csak akkor fordulhat el, ha a nyelvtanban vannak azonos jobboldalak, ilyenkor azt mondjuk, hogy a nyelvtan nem egyértelmen invertálható. Az ilyen nyelvtanokat nem lehet a precedencia módszerrel elemezni. Akkor sem lehet a nyelvtant precedencia elemezni, ha -szabályt tartalmaz. Ha a mez üres, tehát a szimbólumpár inkompatibilis, hibajelzést adunk. Gyakorlásképpen elemezzük az elbbi nyelv egy mondatát. Precedencia elemzés esetén a konfigurációt célszer más sorrendben ­ veremtartalom, elemzend szöveg, eredmény ­ megadni, ilyenkor ugyanis, ha ráadásul a verem legfels elemét a jobboldalra írjuk, a kérdéses szimbólumpár éppen egymás mellé kerül. abdc { , abdc, } a { a, bdc, } a { ab, dc, } a { abd, c, } a a { aS, c, 4 } a { aSc, , 4} a { S, , 41} a accept A levezetési szabályok sorszámát a megadás sorrendjében használtuk. A precedencia mátrix felhasználásával kapcsolatosan egy sereg kérdés merülhet fel. Az adott esetben, példánkban, a mátrix minden mezejébe legfeljebb egy relációjel került. Szükségszer ez? Sajnos egyáltalában nem. Ha egy nyelvtan egyértelmen invertálható, nem tartalmaz -szabályt, és a precedencia relációk diszjunktak, akkor a nyelvtan precedencia nyelvtan. Amennyiben, mint esetünkben, elegend egy-egy szimbólumot vizsgálnunk, akkor egyszer precedencia nyelvtanról, illetve elemzrl beszélünk. Nyilvánvaló, hogy az egyszer precedencia nyelvtanok az LR(1) nyelvtanoknak valódi részhalmazát képezik. Ami az elretekintést illeti, mindkét elemz ugyanazt az információt használja fel. Azonban míg az LR(k) elemzk, és így az LR(1) elemzk is a múltról, az életképes prefixumról minden lehetséges információt figyelembe vesznek, addig a precedencia elemzk megelégszenek a prefixum utolsó k szimbólumának vizsgálatával, egyszer precedencia elemz esetén pedig a prefixum utolsó szimbólumának vizsgálatával. Olykor ez elegend az elemzéshez, máskor viszont nem. Mint említettük, a precedencia elemzk elnye egyszerségükben van. A példánkban szerepl, és bonyolultnak éppen nem mondható nyelvtannak 26 életképes prefixum osztálya van. Az LR(k) elemz ezért összehasonlíthatatlan terjedelmesebb és lassúbb, mint a precedencia elemz. Semmi sem tökéletes azonban, Vegyük például a következ jelsorozatot: abdd Ez nyilván nem eleme a nyelvnek. Az LR(1) elemz ezt azonnal észreveszi, mihelyt a ,,hibás" szimbólum, a második d látótávolságon belül kerül. Nem így a precedencia elemz. Ez szó nélkül átcsúsztatja ezt a karaktert is, és csak akkor eszmél rá a hibára, amikor a precedencia relációk alapján kiadódó potenciális nyelet nem találja a levezetési szabályok jobboldala között.

192

5.4. Egyszersített jobbelemzés Vegyük azonban ebbl a szempontból még érzékenyebb nyelvtant: S ab bc cd Itt a precedencia elemz az abcd

jelsorozat elemzésekor szemrebbenés nélkül elgyalogol egészen az utolsó karakterig, és csak akkor ad hibajelzést. Mint említettük az általános precedencia elemz esetén mind a visszatekintés, mind az elretekintés hossza egynél nagyobb lehet. Így beszélhetünk (m,n) precedencia nyelvtanokról illetve elemzkrl, ahol m a visszatekintés, n pedig az elretekintés hossza. Magától értetd, hogy az (m,n) precedencia nyelvtanok az LR(n) nyelvtanok általában valódi részhalmazát alkotják. Lássunk erre az általánosított, tehát nem egyszer precedencia nyelvtanra egy példát. Legyen ez a prefix lengyel jelölés: E +EE EE a Ha megpróbálkozunk az egyszer, vagyis (1,1) precedencia mátrix felírásával, akkor azt tapasztaljuk, hogy például az E-a szimbólumpárnál konfliktus helyzet adódik. Ha ugyanis a szóban forgó E szimbólum az operátor utáni els szimbólum, akkor itt nyél eleje van, hiszen itt az a terminális mint nyél majdani letörésével keletkezett E szimbólum egészíti ki az eddigieket nyéllé. Más a helyzet akkor, ha már két E szimbólum követi az operátort. Ilyenkor a mondott helyen nyilván a nyél vége reláció érvényes. A prefix lengyel jelölés nyelvtana tehát nem egyszer precedencia nyelvtan. Próbálkozzunk most (2,1) precedencia elemzéssel, amely az elbbiekbl sejtheten eredményre vezet. A precedencia mátrix függleges fejléce most a legfeljebb két szimbólumból álló jelsorozatokat tartalmazza. Amennyiben a veremben még nincs két szimbólum, akkor a jelsorozat rövidebb. A fejlécen nem szerepel az összes lehetséges legfeljebb két karakterbl álló jelsorozat, hanem csak azok, amelyek az elemzés során valóban elfordulhatnak. A táblázatból kitnik, hogy a precedencia relációk diszjunktak, tehát a nyelvtan (2,1) precedencia nyelvtan, és így nincs akadálya a (2,1) precedencia elemzésnek. Természetesen nemterminális szimbólum nem lehet az elretekintés tárgya, a táblázatban mégis megjelöltük azokat a párokat is, ahol az E nemterminális áll a jobboldalon. Erre azért van szükség, mert a veremben a nyél megállapításánál ismernünk kell azokat a precedencia relációkat is, ahol nemterminális áll a jobboldalon.

5. Szintaktikus elemzk E + * a

193

<· <· <· + · <· <· <· * · <· <· <· a ·> ++ · <· <· <· +* · <· <· <· +a ·> ·> ·> +E · <· <· <· *+ · <· <· <· ** · <· <· <· *a ·> ·> ·> *E · <· <· <· E+ · <· <· <· E* · <· <· <· Ea ·> ·> ·> ·> EE ·> ·> ·> ·> Átgondolva a precedencia elemzés folyamatát kiderül, hogy akár nyél eleje, akár nyél belseje relációt találunk, mindkét esetben csúsztatnunk kell. Felmerül a kérdés, miért ragaszkodunk a precedencia relációk diszjunktságához, ha egyszer van két olyan reláció, ahol a teendk azonosak. Természetesen a nyél vége és bármelyik másik reláció esetében ilyen meggondolásnak nincs helye, hiszen itt konfliktus helyzetet okozna a két különböz reláció egyidej jelenléte. Visszatérve a nyél eleje, és nyél belseje egyidej jelenlétére, valóban, a disztinkcióra csak késbb, akkor lesz szükség, amikor egy nyelet letörünk. Általában a nyél eleje reláció mondja meg, hol kezddik a nyél. Ha diszjunktak a precedencia relációk, akkor a nyél eleje és nyél vége között csak nyél belseje relációk lehetnek. Ilyenkor egyértelm, mit kell nyélnek, pontosabban potenciális nyélnek tekinteni. Amennyiben megengedjük a nyél eleje és nyél belseje relációk egyidej jelenlétét, akkor a letörés alkalmával találkozhatunk olyan szimbólumpárokkal, amelyre mind a nyél belseje, mind a nyél eleje reláció ráillik. Ilyenkor nem tudhatjuk mi a helyes. Számítsuk-e innen a nyél kezdetét, vagy menjünk tovább nyél eleje relációt keresni? Egyébként a helyzetet bonyolultabbá teheti, ha ez a reláció is ketts, vagyis nyél eleje és nyél belseje is lehet. A helyzet azért általában nem ennyire kritikus. Gyakran, mint említettem, és mint példánkban is látható volt, a relációkkal kihasított jelsorozat nem egyezik meg egyik levezetési szabály jobboldalával sem. Az ilyen, a

194

5.4. Egyszersített jobbelemzés

precedencia relációk szabályai szerint nyélnek mutatkozó, de ilyen jobboldal hiányában a nyél szerepét betölteni képtelen fragmensek mint alternatívák szóba sem jöhetnek. Amennyiben a nyél eleje és nyél belseje relációk nem diszjunkt volta miatt kiadódó potenciális nyelek közül legfeljebb egy egyezik meg egy jobboldallal, így csak egy jelent valódi alternatívát, akkor ez nem okoz zavart az elemzésben. Ilyen esetekben gyenge precedencia nyelvtanokról beszélünk, szemben az ers precedencia nyelvtanokkal, ahol a precedencia relációk diszjunktak. A gyenge precedencia nyelvtanok esetében tehát a három reláció közül a nyél eleje és nyél belseje esetében bizonyos feltételek mellett nem követeljük meg a két halmaz diszjunkt voltát. A gyenge precedenciának tett engedmények még tovább bvíthetek. Tételezzük fel ugyanis, hogy az A és B szimbólumok között mind a nyél eleje, mind a nyél belseje relációk érvényesek. Ez esetben a verem tartalmazhat egy olyan AB fragmenst, hogy az fragmens eltt a nyél eleje, a jelsorozat után a nyél vége reláció áll. Ráadásul lehet a nyelvtannak C AB és D B alakú levezetési szabálya is. Itt tehát nem teljesül az a megkötés, hogy a potenciális nyelek közül legfeljebb egy jelent valóságos alternatívát. Amennyiben azonban az A és D szimbólumok között semmilyen reláció sem érvényes, akkor ez a tény megoldja dilemmánkat. Minthogy az A és D között nincsen reláció, a rövidebb nyél letörésével olyan jelsorozat alakulna ki, amely nem lehet része egyetlen jobboldali levezetéssel elálló mondatszer formának sem, és így szükségképpen zsákutca. Ha egy nyelvtan esetében a fenti feltételek teljesülnek, és mindig csak a hosszabb nyéljelölt letörése vezethet eredményre, akkor ezt a nyelvtant is gyenge precedencia nyelvtannak tekintjük. Ilyenkor persze tudnunk kell, hogy dilemma esetében mindig a hosszabb nyelet kell letörni. A gyenge precedencia nyelvtanra jó példa az ismert és oly gyakran hivatkozott, az infix jelölés aritmetikai kifejezéseket generáló nyelvtan. Mint a megadott precedencia mátrixból kitnik, a nyél eleje és nyél belseje relációk két helyen is ütköznek. Valóban, a ( és az E szimbólum között mindkét reláció elképzelhet. Eladódhat ugyanis (E) és (E+T) konstrukció is. Hasonló a helyzet a + operátor és a T nemterminális esetében. Itt is megadjuk azt a két esetet, amikor különböz relációk lesznek érvényesek: E+T és E+TF

5. Szintaktikus elemzk A teljes precedencia mátrix a következ: ( E T F a E T F ) a ( + * <· <· · <· <· · <· <· <· · <· <· <· <· <· <· <· <· <·

195

) · ·> ·> ·> ·>

+ · ·> ·> ·> ·>

* · ·> ·> ·>

acc ·> ·> ·> ·>

Közelebbrl megvizsgálva a két konfliktus helyzetet azt tapasztaljuk, hogy mindkett, ha másképpen is, de eleget tesz a gyenge precedencia követelményeinek. A kezdzárójel ( és E páros esetében, ahol a két reláció a (E) illetve a (E+ esetekben fordulhat el, a relációjelekkel leválasztott potenciális nyelek közül legfeljebb egy lehet egy levezetési szabály jobboldala, így csak egyetlen letörési lehetség jöhet szóba. A + T párosnál más a helyzet. Minthogy a T szimbólum egymagában is egy levezetési szabály jobboldalát képviseli, az E+T jelsorozat esetén elvben akár a teljes kifejezés, akár a T nemterminális egyedül is letörhet. Ha azonban a rövidebb lehetséget választanánk, akkor két olyan szimbólum, a + és az E nemterminális kerülne egymás mellé, amelyek között ebben a sorrendben semmiféle reláció nem érvényes. Így a rövidebb nyéljelölt letörése útján nyert jelsorozat nem lehet egyetlen mondatszer formának sem része. Ennek következtében itt mindig a hosszabb nyéljelöltet kell letörnünk annak érdekében, hogy egyáltalában reményünk legyen a jobboldali levezetés megtalálására. Ez megfelel a gyenge precedencia nyelvtanok elírásainak. A gyenge precedencia nyelvtanok mindig átalakíthatóak ers precedencia nyelvtanokká, pontosabban fogalmazva, mindig szerkeszthet egy olyan ers precedencia nyelvtan, amely ugyanazt a nyelvet generálja. Legyen G egy gyenge precedencia nyelvtan, és képezzünk belle egy G' nyelvtant az alábbiak szerint. Errl a nyelvtanról majd kimutatjuk, hogy ers precedencia nyelvtan. Feleljen meg az eredeti nyelvtan minden produkciós szabályának az új nyelvtan egy produkciós szabálya az alábbiak szerint: A helyett A [] (5.24.)

196

5.4. Egyszersített jobbelemzés

ahol a szögletes zárójelbe tett jelsorozat ­ a szögletes zárójellel együtt ­ az új nyelvtanban egyetlen nemterminális szimbólumnak minsül. Ezen újonnan bevezetett nemterminálisok felbontására definiáljuk a következ szabálytípust: [X] X[] (5.25.) ahol az X az eredeti nyelvtan tetszleges, terminális vagy nemterminális szimbóluma, míg az eredeti nyelvtan szimbólumaiból alkotott tetszleges, akár üres jelsorozat. Természetesen a szögletes zárójelbe zárt jelsorozat itt is az új nyelvtan egyetlen nemterminális szimbóluma. Amennyiben az üres jelsorozat, akkor ezt a szögletes zárójellel együtt elhagyjuk. Ilyenkor az új nyelvtan szimbóluma visszaváltozik az eredeti nyelvtan szimbólumává. Könny belátni, hogy az új nyelvtan és a régi nyelvtan ugyanazt a nyelvet generálja. A különbség pusztán annyi, hogy míg a régi nyelvtan egy nemterminálist egyetlen lépésben bonthatott fel egy hosszabb jelsorozattá, addig itt egy kicsit nyögvenyelsen megy, minden karaktert egy külön levezetési szabállyal kell elállítanunk. Igaz, az átalakítás kissé munkaigényes, és helytakarékosnak sem mondható, de látni fogjuk, hogy páronként diszjunkttá teszi a három precedencia relációt. Elöljáróban szögezzük le, hogy a nyél vége reláció második szimbóluma itt is, mint eddig mindig, terminális szimbólum. Ugyanakkor az új nyelvtanban a nyél belseje reláció második eleme szükségképpen szögletes zárójellel képzett új nemterminális. Ez magától értetd, ha meggondoljuk, hogy az új nyelvtanban csak az (5.25.) alakú szabályokban szerepel a jobboldalon egynél több, pontosan két szimbólum. Ebbl rögtön következik, hogy az X·Y és az X ·> Y (5.26.) relációk egyidejen nem állhatnak fenn. Az Y szimbólum ugyanis nem lehet egyidejen terminális és új nemterminális szimbólum. Ezzel a nyél belseje és a nyél vége relációk diszjunkt voltát igazoltuk. A nyél eleje és a nyél vége relációk diszjunkt voltát a következképpen láthatjuk be. Tegyük fel, hogy egyidejen fennáll az X <· Y és az X ·> Y (5.27.) reláció. Azt már beláttuk, hogy az Y szükségképpen terminális szimbólum, hiszen nyél vége reláció jobboldalán áll. Ugyanakkor az X szimbólumnak is hagyományos szimbólumnak kell lennie, hiszen az új, szögletes zárójellel szerkesztett nemterminálisok csakis a nyél belseje reláció jobboldalán, és a nyél vége reláció baloldalán szerepelhetnek. Itt viszont az X szimbólum a nyél eleje reláció baloldalán is áll.

5. Szintaktikus elemzk

197

Az els, tehát a nyél eleje reláció csak akkor lehet igaz, ha létezik egy A [ BC ] (5.28.) alakú levezetési szabály, amelyet az eredeti nyelvtan A BC szabályából származtattunk. Ezen kívül legyen B X és
* *

C Y

*

(5.29.)

levezetési sorozat, ahol a jelölés, mint ismeretes, arra utal, hogy a fenti levezetések tetszleges számú, tehát akár zérus lépésben is történhetnek. Ez utóbbi esetben természetesen helytállóak lehetnek az alábbi összefüggések: B=X = C=Y = Az (5.28.) kifejezésekben szerepl valamennyi szimbólum ,,hagyományos" szimbólum, így az összefüggések mind az eredeti, mind a módosított nyelvtan alapján levezethetek. Az (5.28.) és (5.29.) összefüggésekbl következik, hogy az eredeti nyelvtanban az X és az Y szimbólumok között vagy a nyél eleje, vagy a nyél belseje relációnak fenn kell állnia. Ez utóbbinak akkor, ha az (5.29.) mindkét összefüggés zérus lépésben levezethet. A nyél vége reláció érvényessége az új nyelvtanban viszont megkövetelné, hogy legyen egy A [ BD] (5.30.) alakú levezetési szabály, és ugyanakkor legyen lehetséges az alábbi két levezetés ahol a jelölés, mint elbb, a tetszleges számú, míg a pedig a legalább egy lépésben történ levezetést jelenti. Ha viszont ez mind igaz, akkor az eredeti nyelvtanban is fennáll a két szimbólum között a nyél vége reláció. Ez azonban lehetetlen, hiszen az eredeti nyelvtan gyenge precedencia nyelvtan volt, ahol a nyél eleje és nyél vége illetve a nyél belseje és nyél vége relációk nem ütközhetnek. Ennek alapján az (5.27.) feltevésünk hamis. Ez tulajdonképpen természetes, hiszen eddig csak azt bizonyítottuk, hogy ami igaz volt az eredeti nyelvtanban, igaz marad a módosítottban is. Most azonban igazoljuk, hogy az új nyelvtanban a nyél eleje és nyél belseje relációk is diszjunktak. Tegyük fel ugyanis ennek ellenkezjét, vagyis hogy az X <· Y és X·Y (5.32.) relációk egyidejen fennállnak.
*

B X

+

és

DY

*

+

(5.31.)

198

5.4. Egyszersített jobbelemzés

Az eddigiekbl következik, hogy Y az új nyelvtan szögletes zárójellel konstruált nemterminálisa, Y = [ ]. A nyél belseje reláció viszont megköveteli, hogy az új nyelvtanban legyen egy A [X] (5.33.) alakú levezetési szabály. Amennyiben a jelsorozat els szimbóluma Z, akkor az eredeti nyelvtanban az X és a Z szimbólumok között fennáll a nyél belseje reláció. A nyél eleje relációhoz viszont az szükséges, hogy létezzék egy A XC (5.34.) levezetési szabály, és ugyanakkor lehetséges legyen a következ levezetés: C D [] (5.35.) Ez a feltételezés csak akkor igaz, ha az eredeti nyelvtanban van egy D levezetési szabály, továbbá az X és D szimbólumok között vagy nyél eleje, vagy nyél belseje reláció áll fenn. Ez utóbbi akkor, ha az (5.35.) összefüggésben az els származtatás zérus lépésben történik. Ilyenkor persze az X és Z szimbólumok között igaz a nyél eleje reláció is, hiszen Z a D szimbólumból levezetett jelsorozat els tagja. Ez azonban ellentmond annak, hogy az eredeti nyelvtan gyenge precedencia nyelvtan volt. A gyenge precedencia megengedi ugyan, hogy két szimbólum, adott esetben X és Z között a nyél eleje és a nyél belseje reláció egyidejen igaz legyen, és ezzel a letörend nyélre látszólag két alternatívát adjon. Ezt a dilemmát azonban feloldja az a megkötés, hogy a rövidebb nyél letörésével nyert szimbólum, és az eltte álló szimbólum között semmiféle reláció nincsen. Itt azonban az adódott, hogy a letöréssel nyert D szimbólum, és az eltte álló X szimbólum között valamilyen, vagy nyél eleje, vagy nyél belseje reláció fennáll. Ez viszont ellentmond a gyenge precedencia nyelvtan szabályainak. Ezzel az (5.24.) és (5.25.) alapján konstruált új nyelvtanról bebizonyítottuk, hogy ers precedencia nyelvtan. Ha arra kényszerülünk, hogy egy gyenge precedencia nyelvtant erssé tegyünk, akkor nem kell a nyelvtant szögletes zárójelekkel teletzdelnünk, elegend, ha néhány helyen, a nyelvtan ,,gyenge" pontjain segítünk. Ismert és gyengének bizonyult nyelvtanunk esetében például csupán három szabály változtatásával megoldható a nyelvtan megersítése. Az ilyen szabályokat persze ott alkalmazzuk, ahol szorít a diszjunkció. Legyenek a megváltoztatott szabályok: E E+[T] E [T] F ([E)] Ezen kívül persze két új szabályt is be kell vezetni: [T] T ([E)] E)
*

5. Szintaktikus elemzk

199

Az új nyelvtan, amint errl a szorgalmas olvasó meggyzdhet valóban ers precedencia nyelvtan. Az egyszersített jobboldali elemzés további kiterjesztését jelentik a korlátos környezetet vizsgáló elemzk. Ezek a BRC ­ Bounded Right Context ­ elemzk a feltételezett nyél jobb- és baloldalán néhány szimbólumot vesznek figyelembe, és ennek alapján állapítják meg azt, hogy a szóban forgó fragmens valóban nyél-e, és ha igen, akkor melyik levezetési szabály szerint kell azt letörni. A módszer elnevezése nem túl szerencsés, hiszen a döntéshez mindkét oldali kontextusra szükség van. A BRC elemzk alkalmazásával kiküszöbölhetjük a precedencia elemzknek azt a hátrányát, hogy segítségükkel csak egyértelmen invertálható nyelvtanok elemezhetek. A BRC(m,n) elemz a nyéltl balra m, jobbra pedig n szimbólumot vizsgál. Minden nemterminálishoz tartozik egy halmaz, amely tartalmazza azokat az m szimbólum ­ nyél ­ n szimbólum alkotta hármasokat, amely esetekben a nyelet éppen arra a nemterminális szimbólumra kell letörni. Egy nyelvtan akkor elemezhet BRC(m,n) elemzvel, ha ezen halmazoknak nincsen összetéveszthet, tehát azonos jelsorozatot tartalmazó eleme. A jobboldali és baloldali kontextus még akkor is disztingválhat két szabály között, ha azok jobboldala azonos. Éppen ez az egyik célja ennek az elemzésnek. A nemterminális szimbólumokhoz tartozó halmazokon kívül meg kell még adni azokat a kombinációkat is, amikor csúsztatnunk kell. Ezen jelsorozatokat olyan hosszban adjuk meg, mint amilyen a leghosszabb halmazelem. Ez viszont nem más, mint a két kontextus és a leghosszabb jobboldal hosszának összege. Legyen az egyértelmen nem invertálható nyelvtan: S AB A 0A1 B 1B0 Próbálkozzunk a lehet legrövidebb kontextussal, legyen az elemz BRC(1,0). Ez annyit jelent, hogy jobbról nem igénylünk semmiféle információt, és balról is csak egyetlen szimbólumot veszünk figyelembe. Ennek megfelelen a halmazok felírásánál a jobboldali környezet helyét üresen hagyjuk. Ezzel a nemterminálisokhoz tartozó halmazok: K(S) = { [ , AB, ] } K(A) = { [ , 0A1, ], [ 0, 0A1, ], [ , , ], [ 0, , ] } K(B) = { [ 1, 1B0, ], [ 1, , ], [ A, 1B0, ], [ A, , ] } A csúsztatóképes jelsorozatok a következk: S = {, 0, 1, A, 00, 0A, 11, 1B, A1, 000, 00A, 111, 11B, A11, A1B, 0000, 000A, A111, A1B, 1111, 111B, A11B } Mint látható, nincs két összetéveszthet szituáció, tehát a minimális információ is elegend volt arra, hogy két azonos jobboldallal bíró levezetési szabály között különbséget tegyünk.

200

5.4. Egyszersített jobbelemzés

Példaképpen elemezzük a 00 1110 jelsorozatot. { , 00 111 0, } a { 0, 0111 0, } a { 00, 111 0, } a a { 00, 1110, } a { 00A, 111 0, 3} a { 00 A1, 11 0, 3} a a { 0A, 11 0, 32} a { 0A1, 1 0, 32} a { A, 1 0, 322} a a { A1a, 0, 322} a { A1, 0, 322} a { A 1B, 0, 3225} a a { A1B0, , 3225} a { AB, , 32254} a { S, , 322541} a accept Természetesen a BRC elemzk bonyolultabbak, nagyobb hely- és idigények, mint a precedencia elemzk. A két módszer elnyeinek ötvözését jelentik a kevert stratégiájú precedencia elemzk, angol rövidítéssel MSP ­ Mixed Strategy Precedence elemzk. Ezek olyan precedencia elemzk, amelyek általában a precedencia relációk felhasználásával vizsgálják a jelsorozatot, kivéve a nem egyértelm invertálhatóság okozta vitás helyeken. Erre, de csakis erre az esetre vagy esetekre egy csökkentett környezetet felhasználó elemz is be van építve, amely ilyenkor kisegíti a precedencia elemzt. Eddig az egyszersített alulról felfelé elemzk tárgyalásakor a precedencia grammatikából kiindulva egyre többet tudó, de ennek megfelelen egyre bonyolultabb elemzési eljárásokat ismertünk meg. Most visszafelé teszünk egy nagy ugrást, amennyiben egy, a precedencia elemznél is gyorsabb és kisebb hely- és idigényes módszert tárgyalunk. Ez az igen hatásos módszer az operátor precedencia elemzés. Természetesen ez az eljárás csak speciális, úgynevezett operátor grammatikák esetében alkalmazható. Egy nyelvtan akkor operátor nyelvtan, ha a levezetési szabályok jobboldalán sehol sem áll két nemterminális szimbólum egymás mellett. Valóban, általában az olyan kifejezések leírására kimunkált nyelvtanok esetében teljesül ez a megkötés, amelyek monadikus és diadikus operátorokat alkalmaznak, a monadikusoknál prefix, illetve a diadikusoknál infix jelölésmóddal. Ha a jól ismert és unos-untig elkoptatott, az aritmetikai kifejezéseket infix jelöléssel generáló nyelvtanra gondolunk, nos ez is operátor nyelvtan. Elvben nem szükségszer, hogy az operátor nyelvtan valóban operátorokat tartalmazzon, hiszen a terminális szimbólumok szemantikáját a környezetfüggetlen nyelvtan alapján nem lehet megállapítani, az elnevezés azonban nem minden alap nélkül való, az operátor nyelvtan többnyire valóban operátorokat tartalmaz. Az elemzés alapgondolata abban áll, hogy a precedencia relációkat csak a terminális szimbólumok között értelmezzük. A terminálisok közé beékeld esetleges egyetlen nemterminális szimbólumot egyszeren nem vesszük tudomásul, úgy tekintjük, mintha ott sem lenne, és a bal- illetve jobboldalán álló terminálisokat mint szomszédokat kezeljük. A továbbiakban szabályszer precedencia elemzést végzünk, csupán az igényel néha megfontolást, hogy letörés esetén a széls nemterminálist beleértsük-e a nyélbe vagy sem.

5. Szintaktikus elemzk Példának vegyük az éppen kéznél lév operátor grammatikát: E E+T T T TF F F (E) a Lássuk a precedencia mátrixot: ( ) + * a ) ·> ·> ·> ·> a ·> ·> ·> ·> ( <· <· · <· <· + <· <· ·> ·> <· ·> * <· <· ·> ·> ·> ·> <· <· <· <·

201

Ez a tábla az eredeti, a nemterminális szimbólumokat is tartalmazó precedencia mátrixtól sok relációt örökölt. Azonban most olyan helyeken is találunk relációkat, ahol korábban semmiféle reláció nem volt érvényes. Így például relációban áll az additív és multiplikatív operátor. Valójában két operátor között mindig van valamilyen szimbólum, itt az a terminális. Mihelyt azonban ezt letörjük, belle nemterminális lesz, amelyet megállapodásunk szerint figyelmen kívül kell hagynunk. Így a két operátor szomszédságba kerül, és relációt értelmezünk közöttük. Az operátor precedencia mátrixot áttanulmányozva kitnik, hogy abban mindaz az információ benne foglaltatik, amit a nyelvtan hordoz. Kiolvasható belle az operátor precedencia ­ lám jogosan nevezzük precedencia elemzésnek, ­ és a balról jobbra szabályt is tartalmazza. A nyelvtannak ezeket a vonásait annak idején több nemterminális alkalmazásával sikerült biztosítanunk. Minthogy mindezt most már az operátor precedencia mátrix szavatolja, nincsen szükség különböz nemterminálisok alkalmazására. Valóban, amennyiben az operátor precedencia elemzés megvalósítható, akkor elegend egyetlen nemterminális szimbólum. Egyszersítsük hát a nyelvtant: 1 E E+E 2 E EE 3 E (E) 4Ea A levezetési szabályokat szokás szerint sorszámoztuk. Elemezzük az alábbi jelsorozatot: a+aa A konfigurációt kényelmi okokból most is veremtartalom ­ elemzend jelsorozat ­ eredmény sorrendben adjuk meg. { , a+a *a, } a { a, +a*a, } a { E, +a*a, 4} a { E+, a*a, 4} a a { E+a,*a, 4} a { E+E, *a, 44} a { E+E, a, 44} a {E+E*a, , 44} a a { E+E*E, , 444} a { E+E, , 4442} a { E, , 44421} a Accept Az elemz, mint látjuk, ügyel az operátor precedenciára.

202

5.5. Nyelvek és nyelvtanok

5.5. Nyelvek és nyelvtanok
A nyelvek és nyelvtanok közötti pontos disztinkció mindig is egyik kényes pontja volt a számítástechnikai nyelvészetnek. A különbségtétel nem triviális voltára már Chomsky els alapvet munkája is rámutatott. Nyelvosztályokról beszél, de azokat nyelvtani szabályokkal definiálja. Az alábbiakban néhány kérdésben megpróbálok tiszta vizet önteni ez esetben a nyelvekre. Minthogy az itt közölt eredmények elssorban elméleti jelentségek, egyes esetekben csak a bizonyítás gondolatmenetét közlöm. Még mieltt a nyelvtanokról a nyelvekre áttérnénk, egy fontos tételt érzékeltetnék. Az LL(k) nyelvtanok az LR(k) nyelvtanok valódi részhalmazát képezik. Ennek belátására elegend a balelemzést illetve jobbelemzést szemléltet 5.1 és 5.2. ábrákat együttesen megvizsgálni. Az áttekinthetség biztosítására az 5.3. ábrán ezek egymás mellett láthatóak.
S S

A A

w

x

x

5.3. ábra Milyen információ alapján ismerjük fel, hogy a mondat levezetésében szerepel egy A helyettesítés? Ennek eldöntésére nyilván rendelkezésre áll az elemzend jelsorozatnak már elolvasott része, továbbá az elretekintés. Ne feledjük, a két elemzési mód jelölésére alkalmazott L bet mindkét esetben az angol left szót takarja, vagyis mindkét esetben balról jobbra olvasunk, és elemezünk. Mint látható, a jobbelemzés éppen az A nemterminális által generált terminális jelsorozat hosszával több szimbólumot használ. Így ugyanannak a kérdésnek az eldöntésére a balelemzésnél felhasznált információ csupán része a jobbelemzésnél felhasználtnak. Határesetben a két elemzési mód számára hozzáférhet információ csak akkor azonos, ha az A nemterminális végül is az üres jelsorozatot generálja. Ebbl következik, hogy mindazt a felismerést, amit a balelemzés során általában kisebb, de semmiképpen nem nagyobb információ birtokában megteszünk, a jobbelemzés során is bizonyosan felismerjük. Ezért az LL(k) nyelvtanok az LR(k) nyelvtanoknak részhalmazát alkotják. A részhalmaz valódi részhalmaz, hiszen például vannak balrekurzív LR(k) nyelvtanok, amelyek viszont nem balelemezhetek.

5. Szintaktikus elemzk

203

A faktorizálás kapcsán említettük, hogy k > 1 esetén az LL(k) nyelvtanok elretekintését mindaddig biztosan lehet csökkenteni, ameddig a nyelvtannak nincs -szabálya. Az LL(k) nyelvek is, és nem csak az LL(k) nyelvtanok alkotnak hierarchiát. Ami a jobbelemezhet nyelveket illeti igazolható, hogy minden determinisztikus CF nyelvhez szerkeszthet LR(1) elemz. Ennek az elssorban elméleti szempontból nagy jelentség eredménynek szabatos bizonyítása messzire vezetne, éppen ezért ennek csak gondolatmenetét adom meg. Mindenekeltt egy definíció. Amennyiben egy nyelv esetében a nyelv mondatai és azok prefixumai különbözek, a halmazok diszjunktak, akkor ezt a nyelvet prefix tulajdonságú nyelvnek mondjuk. Az általunk megismert nyelvek közül csak néhány bír ezzel a tulajdonsággal. Így például az aritmetikai kifejezéseket infix alakban generáló nyelv nem prefix tulajdonságú. Valóban, például az (a+a) jelsorozatról nem dönthet el, hogy önmaga alkot egy mondatot, vagy csupán egy hosszabb mondat prefixuma. Mindkét eset elfordulhat. Ugyanígy nem prefix tulajdonságú nyelv az aritmetikai kifejezéseket posztfix lengyel formában generáló nyelv sem. Ezzel szemben a prefix lengyel jelölést generáló nyelv rendelkezik a prefix tulajdonsággal. Valójában bármelyik nyelvbl kis módosítással készíthetünk egy prefix tulajdonságú nyelvet. Egészítsük ki ezt a nyelvet egy sohasem volt terminális szimbólummal, és biggyesszük ezt a szimbólumot valamennyi mondat után. Jelölje az eredeti nyelvet L, és legyen a sohasem volt szimbólum , akkor az L nyelv nyilván prefix tulajdonságú. Amennyiben egy jelsorozat az új szimbólummal végzdik, akkor a jelsorozat mondat, ellenkez esetben csak prefixum lehet. Vegyük észre, hogy a prefix tulajdonság nyelvhez és nem nyelvtanhoz kötött tulajdonság. Az is triviális, hogy ha az eredeti nyelv CF nyelv volt, az lesz a megpatkolt nyelv is. A prefix tulajdonságú determinisztikus környezetfüggetlen nyelvekre készíthet LR(0) elemz. Ez annyit jelent, hogy az elemz elretekintés nélkül el tudja dönteni a helyes folytatást. Az igazolás gondolatmenete szerint a nyelvhez elbb egy úgynevezett normál veremautomatát, majd egy kanonikusnak mondott nyelvtant szerkesztünk. Minden determinisztikus környezetfüggetlen nyelvnek van determinisztikus veremautomatája. Még azt is feltételezhetjük, hogy ez a veremautomata mentes a végtelen -mozgásciklustól, és elfogadó állapotban már nem végez -mozgást. Amennyiben nem ez lenne a helyzet, akkor a már ismert módszerekkel az automata átalakítható.

204

5.5. Nyelvek és nyelvtanok

Általában egy mozgás során az automata három funkciót hajthat végre. Elolvashat egy szimbólumot a bemen szalagról, kitörölheti a verem legfels szimbólumát, végül beírhat néhány új szimbólumot a verem tetejére. Persze nem szükségszer, hogy egy mozgás során mindhárom tevékenységre sor kerüljön, mert például -mozgás alkalmával nem történik olvasás. Változtassuk meg kissé a verem kezelésével kapcsolatos szemléletünket. Eddig úgy tekintettük, hogy a verem legfels szimbólumát mindenképpen kitöröljük, legfeljebb ha szükségünk lesz rá, visszaírjuk. Most, ha a verem tartalma nem változik, vagy csak növekedik, ezt fogjuk fel olymódon, hogy nem végeztünk törlést a veremben. Ezzel a szemlélettel megeshet, hogy egyes mozgásoknál nem végzünk törlést a veremben. Egy mozgást eddig három tényez határozott meg, az olvasott szimbólum, az automata állapota, végül a verem tetején található szimbólum. Ez sem volt minden esetben így, hiszen például -mozgáskor nem is volt olvasott karakter, így az nem is játszhatott szerepet. Alakítsuk át az automatát olymódon, hogy a mozgás funkcióit válasszuk külön. Egy mozgás során vagy olvasás, vagy törlés, vagy beírás történhet, de mindig csak egy a három funkció közül. További korlátozás, hogy beíráskor a verem tartalma csak egyetlen szimbólummal növelhet, végül megköveteljük, hogy a törlési mvelet kivételével a mozgás ne függjön a verem legfels szimbólumától. Ezek a követelmények egyszeren teljesíthetek. Az utolsó, a verem legfels szimbólumától való függetlenséget például úgy érhetjük el, hogy az eredeti automata vermének legfels szimbólumát leemeljük, és az automata állapotterébe olvasztjuk. Ezt a fogást, mint emlékezhetünk, már alkalmaztuk a mélybelátó automatával egyenérték egyszer automata szerkesztésekor. Az új automata állapottere tehát az eredeti állapottér, és a legfels veremszimbólum direkt szorzata lesz, így a verem tetejére a második veremszimbólum kerül, amitl már valóban nem függ semmi. Az új állapot tartalmazza tehát mind az eredeti állapotra, mind a verem legfels szimbólumára vonatkozó valamennyi információt. Amennyiben egy mozgás több funkciót hajt végre, úgy azt fel lehet bontani több mozgásra olymódon, hogy egy-egy mozgás az eredeti mozgásnak csak egy funkcióját hajtsa végre. Az így kapott automatát nevezzük normál automatának. Minden determinisztikus nyelvnek van normál automatája. A normál automata alapján, lényegében az ismert módszerekkel készített nyelvtant nevezzük kanonikus nyelvtannak, pontosabban kanonikus alakú nyelvtannak. Egy nyelvnek ugyanis több kanonikus nyelvtana lehet.

5. Szintaktikus elemzk

205

Errl a kanonikus nyelvtanról igazolható, hogy precedencia grammatika. Az igazolás gondolatmenete megfelel annak a bizonyításnak, amikor a gyenge precedencia nyelvtanból alkalmas módon származtatott nyelvtanról igazoltuk, hogy ers precedencia nyelvtan. Felhasználva a kanonikus nyelvtanok tulajdonságait, itt is igazolni lehet, hogy a precedencia relációk diszjunktak. Persze elképzelhet, hogy a nyelvtan nem egyértelmen invertálható. Erre ugyanis a nyelvtan kanonikus volta nem ad útmutatást. Ekkor természetesen nem készíthet a nyelvtanra egyszer precedencia elemz. Ilyenkor viszont ugyancsak a kanonikus grammatika tulajdonságaiból következen igazolható, hogy az (1,0) környezet elegend információt hordoz a lehetséges alternatívák közül a helyes kiválasztására. Így a nyelvtan BRC(1,0) nyelvtan. Ebbl viszont már következik, hogy a nyelvtan LR(0) nyelvtan. Az itt csak gondolatmenetében ismertetett bizonyítás alapján állítható, hogy minden prefix tulajdonságú determinisztikus környezetfüggetlen nyelvnek létezik LR(0) elemezhet grammatikája. Nézzünk most egy prefix tulajdonságot nem mutató környezetfüggetlen nyelvet. Mint láttuk, egy sohasemvolt szimbólum hozzátoldásával persze ebbl is készíthetünk prefix tulajdonságú változatot. Erre az utóbbira természetesen igaz, hogy van LR(0) elemezhet nyelvtana. Milyen megállapításokat tehetünk azonban az eredeti nyelvvel kapcsolatosan? Mi a lényeges különbség a prefix tulajdonságokat mutató, és az ilyen tulajdonsággal nem rendelkez nyelvek között? Míg az elbbi esetben a pusztán az olvasott jelsorozat vizsgálata alapján eldönthet az a kérdés, hogy a jelsorozat mondat-e vagy prefixum, addig az utóbbi nyelveknél van olyan jelsorozat, ahol ez nem válaszolható meg. Rögtön választ kapunk azonban, ha elretekintünk, ha megnézzük a következ szimbólumot. Ha létezik következ szimbólum, akkor a jelsorozat prefixum, ha nincs, akkor mondat. Nincs mit tennünk tehát, egy karaktert elre kell tekintenünk. Az LR(1) elemz tehát alkalmas lesz ennek a dilemmának a feloldására, amelyre a nem prefix tulajdonságú nyelvek esetében az LR(0) elemz nem volt képes. Ezek szerint minden determinisztikus környezetfüggetlen nyelvnek van LR(1) elemezhet nyelvtana. Ismét szeretném hangsúlyozni, hogy ez dönten elvi jelentség eredmény. Valójában egy kanonikus nyelvtan általában túl terjedelmes ahhoz, hogy gyakorlati felhasználásra igényt tarthatna. A determinisztikus környezetfüggetlen nyelvek valódi részhalmazát alkotják azok, amelyeknek kanonikus nyelvtana egyértelmen invertálható. Ezek egyszer precedencia elven elemezhetek.

206

5.5. Nyelvek és nyelvtanok

Ezen részhalmaz egy további részhalmazát alkotják az operátor precedencia elven elemezhet nyelvek. Az LL(k) nyelvek halmaza az elbbi két halmazzal inkommenzurábilis.

Környezetfüggetlen, CF nyelvek

Determinisztikus CF, BRC(1,1), LR(1) nyelvek LL(k) nyelvek

Precedencia nyelvek operátor nyelvek

5.4. ábra A determinisztikus környezetfüggetlen nyelvek kapcsolatát tünteti fel az 5.4. ábra. Természetesen az LL(k) nyelvek nem egyetlen halmazt alkotnak, hanem, mint tisztáztuk, a k értékének változtatásával egy végtelen egymásba ágyazott halmazsorozatot. Minél nagyobb a k értéke annál nagyobb a halmaz, és természetesen magába foglalja az összes, nála rövidebb elretekintéssel elemezhet nyelveket.

6. Az automataelmélet alapjai
6.1. A Turing-gép
Az eddig tárgyalt ismeretanyag a matematikai nyelvészet, vagy ha úgy tetszik számítástechnikai nyelvészet fogalomkörébe tartozott. Ez a tudomány ­ mint említettük ­ Chomsky 1956-ban megjelent cikkeivel vette kezdetét. Az automataelmélet jó húsz évvel idsebb fiatalabb rokonánál, ugyanis mint kitnik, a két diszciplína nagyon szorosan kapcsolódik egymáshoz. Turing 1936-ban alkotta meg azt a matematikai objektumot, a róla elnevezett automatát vagy gépet, mint olyan ,,szerkezetet", amellyel matematikai problémák megoldhatók. Az ebben a fejezetben ismertetett más automataelméleti eredmények is jórészt ebbl az idbl származnak. A Turing-gép ,,mindössze" abban különbözik a kétirányú mozgást végz véges automatától, hogy nem csupán olvasó-, hanem író-olvasó perifériája van. Ennek megfelelen az automata mozgása során az éppen elolvasott szimbólumot felülírja. Amennyiben a Turing-gép valamilyen realizálásában gondolkodunk, akkor a véges automatához képest az a különbség, hogy míg az utóbbinál bemeneti berendezésként egy lyukszalag olvasó is megtette, addig itt mágnesszalagos író-olvasó perifériára van szükség. Itt rögtön említsük meg, hogy mint minden automatát, a Turing-gépet is tulajdonképpen a vele megoldható feladatok osztálya jellemez. Gondolom, most már nem lepi meg az olvasót, hogy a Turing-gép erejét nagyon sokféle, látszólag eltér képesség automatával realizálhatjuk. Tulajdonképpen ízlés kérdése, hogy egy szerz melyik automatáról, melyik realizációról jelenti ki: ez a Turing-gép. A Turing-gép bemenete természetesen egy jelsorozat, amely a szalag egy véges darabjára van felírva. Induláskor a bemenet legels szimbólumát helyezzük az író-olvasófej alá. A mágnesszalag többi, induláskor információt nem hordozó része az üres ­ angolul blank ­ szimbólummal van teleírva. A mágnesszalag potenciálisan végtelen hosszú. A Turing-gépnél a többi automatához képest kissé eltér az elfogadás kritériuma. A Turing-gép egy jelsorozatot akkor fogad el, ha a jelsorozattal, mint bemenettel elindítva a Turing-gép elfogadó állapotban megáll. Pontosabban ­ gondolva a nemdeterminisztikus automatákra is ­ ha az adott bemenet mellett létezik olyan mozgássorozat, amelyet követen az automata elfogadó állapotban áll meg. Egy Turing-gép ­ hasonlóan a többi automatához ­ akkor áll meg, ha egy olyan szituációba kerül, amelyre nézve nincs mozgási szabály. Ha csak olyan mozgássorozat található, amelynek során az automata vagy nem elfogadó állapotban áll meg, vagy meg sem áll, akkor a Turing-gép a jelsorozatot visszautasította. Matematikailag a Turing-gépet egy hetes írja le: T = (Q, , , {l,r} , q0, F) (6.1.)

208

6.1. A Turing-gép

Itt a Q, , q0, és F értelmezése a szokásos, vagyis az állapothalmaz, a bemen alfabéta, az induló állapot, végül az elfogadó állapotok halmaza. A a szalag szimbólumainak alfabétája. Minthogy induláskor a szalagon a bemeneti jelsorozat található, amely természetesen a bemeneti alfabéta szimbólumaiból áll, így a bemeneti alfabéta a szalag alfabétájának részhalmaza:



(6.2.)

A részhalmaz valódi részhalmaz, hiszen az üres szimbólum (blank) eleme a nak, de nem eleme a halmaznak. Az üres szimbólumot jelölje . Az {l,r} halmaz a mozgás irányát adja meg. Elvben a szalag az automata mködése során helyben is maradhat, de ­ mint ezt a véges automatáknál tisztáztuk ­ ez nem növeli az automata erejét, így ezt a lehetséget joggal kihagyhatjuk. A mozgási szabályok most is egy leképezést reprezentálnak. A mozgás csakis az automata állapottól és az olvasott szimbólumtól függ. A mozgás következményeképpen megváltozik az automata állapota, az olvasott szimbólum felülíródik, végül az író-olvasófej vagy jobbra, vagy balra elmozdul. A leképezés tehát a következképpen szemléltethet: Q x Q x (- {}) x {l,r} (6.3.) Míg a mozgás meghatározásakor bármely szimbólum, így a is szerepelhet, addig felülírásra általánosan elfogadott konvenció szerint ez a szimbólum nem használható. A (6.3.) összefüggésben ezért szerepel a baloldalon a , a jobboldalon pedig a (-{}) halmaz. A leképezés nem zárja ki, hogy legyenek olyan mozgási szabályok is, ahol az olvasott szimbólum a . Ebbl következik, hogy az író-olvasó fej elkalandozhat a szalag szz, a bemeneti jelsorozattal nem érintett részére is. Minthogy megállapodásunk szerint a szalag mindkét irányban potenciálisan végtelen hosszú, az író-olvasófej tetszlegesen messzire távozhat kiindulási helyzetétl. Ugyanakkor mindig pontosan lehet tudni, melyek a szalag még érintetlen részei, hiszen itt, és csakis itt hordoz a szalag szimbólumot. Az természetesen teljesen legális, hogy egy a szimbólum szemantikájával azonos szemantikájú szimbólumot használunk. Ilyen értelemben informálisan mindenképpen mondhatjuk, hogy egy karaktert a szimbólummal írtunk felül. Egyébként vannak szerzk, akik szemrebbenés nélkül használják a szimbólumot felülírásra is. Persze egy Turing-gép specifikálásakor itt sem kell megadni a teljes leírást. Elegend, ha csak a mozgási szabályokat soroljuk fel, ügyelve arra, hogy a leírás egy q0 állapotból kiinduló szabállyal kezddjék, és megadjuk az elfogadó állapotok halmazát. Végül, ha ez nem egyértelm, külön fel kell tüntetni a bemeneti alfabetát.

6. Az automataelmélet alapjai

209

Lássunk egy példát a Turing-gépre: Legyen a nyelv, amelyet a Turing-géppel el kívánunk fogadtatni: L = wcw {w w = (a b)+} vagyis a nyelv olyan jelsorozatokat tartalmaz, ahol egy tetszleges nem üres az a és b szimbólumokból álló jelsorozat a c szimbólum után megismétldik. A Turing-gép mködésének alapgondolata az lesz, hogy az eredeti és az ismétl jelsorozatot szimbólumonként összehasonlítjuk. Az automata mozgási szabályai a következek lesznek: (q0,a) = (qa1,X, r) (q0, b) = (qb1, X,r) (qa1, a) = (qa1, a, r) (qa1, b) = (qa1, b,r) (qb1, a) = (qb1, a, r) (qb1, b) = (qb1, b,r) (qa1, c) = (qa2, c, r) (qb1, c) = (qb2, c,r) (qa2, X) = (qa2, X, r) (qb2, X) = (qb2, X,r) (qa2, a) = (q3, X, l) (qb2, b) = (q3, X,l) (q3, X) = (q3, X, l) (q3, c) = (q4, c,l) (q4, a) = (q5, a, l) (q4, b) = (q5, b,l) (q5, b) = (q5, b,l) (q5, a) = (q5, a, l) (q5, X) = (q0, X, r) (q4, X) = (q6, X,r) (q6, X) = (q6, X, r) (q6, c) = (q6, c,r) (q6,) = (q7, , r) Az automata egy szimbólum elolvasásával kezdi munkáját. A szimbólumot az automata állapotában memorizálja, ugyanakkor a szalagról törli. Ilyen memorizálást már alkalmaztunk, amikor a mélybelátó veremautomatával egyenérték automatát konstruáltuk. Akkor a teljes belelátási mélységben található információt az automata állapotában tároltuk. Ezután az automata végighalad az eredeti szöveg még el sem olvasott, illetve a vízválasztóként szerepl c szimbólum után az ismétl szöveg már elolvasott részén. Amennyiben az ismétl szöveg els még el nem olvasott szimbóluma megegyezik az állapotban tárolttal, akkor ezt is törli, és visszafordul. Amikor az automata visszaérkezett az eredeti szöveg utolsó, már elolvasott szimbólumához, az egész folyamat újra kezddik. Ha már nincsen olvasatlan szimbólum, amit az automata úgy detektál, hogy nem talál a c szimbólum eltt ki nem törölt szimbólumot, akkor meggyzdik arról, hogy az ismétl szöveg szimbólumai is elfogytak. Ezt úgy érzékeli, hogy az olvasott szimbólumokat követi. Ebben és csakis ebben az esetben kerül az automata az elfogadást jelent q7 állapotba. Az automata minden szituációhoz csak egy, pontosabban legfeljebb egy mozgást rendel. Az automata determinisztikus. Könny belátni, hogy ez adott esetben a két jelsorozatot elválasztó c szimbólum jelenlétének köszönhet.

210

6.1. A Turing-gép

Említettük már, hogy ­ mint minden automata, ­ a Turing-gép is egy számítási potenciált képvisel. Vajon milyen mérték a Turing-gép számítási képessége? Erre vonatkozóan Church deklarált egy feltételezést, amelyet Church-tézis néven emlegetnek. Ez nem tétel, amely bizonyítható, hanem állítás, amiben hinni kell. Teljes megegyezésben Church nevével ­ angol jelentése egyház, templom ­ ez a tézis bizonyos értelemben hittételnek tekinthet. A Church-tézis azt állítja, hogy minden probléma, amelyre eljárás, procedúra szerkeszthet, Turing-géppel megoldható. Ez nagyon súlyos kijelentés, hiszen ez annyit jelent, hogy a Turing-gép a matematikai értelemben vett megismerhetség határa. Ebbl következen az ember azokra és csakis azokra a kérdésekre tud választ adni, amelyekre a Turing-gép is képes. Korábban már szóltunk az algoritmus és a procedúra közötti különbségrl, és az algoritmikusan eldönthetetlen problémákról. Ezeknek a kérdéseknek megfogalmazása, tisztázása, és egyáltalában ezen fogalmak definiálása is ennek az idszaknak az eredménye. Ismeretelméleti szempontból a fenti felismerésnek a jelentségét lehetetlen túlértékelni. Mióta az emberiség egzakt tudományokkal foglalkozik ­ és ez az idszak jóval több, mint kétezer év ­ az volt az általánosan elfogadott vélelem, hogy minden szabatosan megfogalmazott probléma megoldható. A lehetséges megoldások halmazába persze bele kell érteni azt az esetet is, amikor bizonyíthatóan nincs megoldás. Ilyen probléma például a kör négyszögesítése. Ha valamelyik kérdésre ez id szerint nem ismerjük a választ, akkor a régi felfogás szerint ez annak tudható be, hogy ismereteink még nem eléggé pallérozottak, a válasz kimunkálása majd az utókor feladata lesz. Valóban, sok korábban válasz nélkül maradt kérdésre adta meg a tudomány késbb a feleletet. Ez volt az álláspont egészen az 1930-as évekig. Addig a legnagyobbak is, így kora matematikus fejedelmének tekintett David Hilbert is hasonlóan gondolkoztak. Amikor a századfordulón ­ te jó ég, már specifikálni kell, hogy a XIX. és XX. század fordulóján ­ megfogalmazta, mintegy megjósolta azokat a feladatokat, amelyeket a XX. század matematikusai majd megoldanak, akkor fekete fehér alapon, tehát vagy a megoldás, vagy a megoldhatatlanság bizonyítása gondolkodott. Az, hogy bizonyos feladatokat elvileg sem lehet megoldani, fel sem merült. Talán kissé patetikus, de szerintem igaz az az állítás, hogy az algoritmikusan eldönthetetlen feladatok létének felismerése alapjában változtatta meg a világ felismerhetségével kapcsolatos nézeteinket. Visszatérve a Church-tézis mondanivalójára, meglep lehet, hogy egy csak elfogadás és visszautasítás között választani képes, tehát csak igen-nem válaszra alkalmas gép minden kiszámítható probléma megoldására felhasználható. Ez praktikus szempontból valóban hátrány, de nem elvi akadály.

6. Az automataelmélet alapjai

211

Gondoljunk csak a barkochba játékra. Az információt tehát igen-nem válaszok útján is megkaphatjuk, csak kissé bonyolultabban. Egyébként más szaktudományok sokkal rokonszenvesebb formában definiálják a Turing-gépet. Van, amelyik a szalagra kiírja a választ, esetleg a mködés gyorsítására, és áttekinthetbbé tételére több szalagot használ. Ezek valóban kényelmesebben adnak választ a feltett kérdésre. Valamennyi ilyen Turing-géprl bebizonyítható, hogy ereje, megoldási képessége nem nagyobb a mi barkochbázni kényszerül Turing-gépünknél. Ne higgyenek tehát a definícióknak. Nem az a Turing-gép, az is egy Turing-gép. A Church-tézis tétellé való élesítésének lényegében az az akadálya, hogy az algoritmus fogalmának nincs formális, vagyis matematikai szempontból szabatos leírása. Megfogalmazása óta, vagyis több mint 60 éve nem merültek fel kételyek igazságát illeten. St. A 80-as években Zohar Manna bebizonyította, hogy mindaz, ami a legbonyolultabb függvények, a parciális rekurzív függvények segítségével megoldható, az Turing-géppel is kiszámítható. Az elbb említett függvények azért parciálisak, mert értelmezési tartományuknak csak egy részében adnak eredményt, és azért rekurzívak, mert a függvényt definiáló kifejezésben rekurzív módon szerepelhet önmaga a függvény is. Természetesen minden függvény, ha történetesen nem parciális vagy nem rekurzív, felfogható, mint az elbbi függvényosztály speciális esete. Mindenesetre az elmúlt évek új eredményei csak megersíthettek minket a Church-tézis igazságába vetett hitünkben. A Church-tézis alapján a Turing-gépet úgy tekinthetjük, mint a procedúra, vagyis eljárás formális definícióját.

6.2. A Turing-gép lehetségei
Nem kell hozzá különleges fantázia, hogy a számítógépet a Turing-gép realizációjának tekintsük. Valóban a közvetlen hozzáférés memória állapotát feleltethetjük meg a Turing-gép állapotainak, míg a háttér memóriák játszhatják a Turing-gép szalagjának szerepét. Az egyetlen különbség az absztrakt Turing-gép és a valóságos számítógép között az, hogy az utóbbi háttér memóriája csak korlátos információ tárolására képes. A Church-tézisre gondolva ebbl az is következik, hogy bármely algoritmikusan eldönthet kérdés számítógépes megoldásának nincs elvi, hanem csak a számítógép méretét illeten gyakorlati akadálya. Fordítva, mindazokat a jól ismert és bevált fogásokat, amelyeket számítógéppel meg tudunk valósítani, Turing-géppel is megtehetjük. Így például a Turing-gép szubrutinként használható.

212

6.2. A Turing-gép lehetségei

Definiáljunk ugyanis egy Turing-gépet, amely a szubrutintól várt funkciót valósítja meg. Legyen adott egy másik Turing-gép, amely az elbbi Turing-gép szolgáltatásait szubrutinhívás formájában kívánja igénybe venni. A két Turing-gép állapotai alkossanak diszjunkt halmazokat, és egyesítsük a két gépet egyetlen géppé. Ha ezt az egyesített gépet a hívó gép kezdállapotából indítjuk el, akkor nyilván csakis a hívó Turing-gép állapotai érvényesülhetnek. A szubrutinként szolgáló Turing-gép mintha ott sem lenne. Ha a szubrutint aktivizálni akarjuk, akkor olyan mozgási szabályt kell bevezetnünk, amely az egyesített gépet a szubrutin-gép kezdállapotába viszi át. Most viszont a szubrutin Turing-gép állapotain történik mozgás, és a gép végrehajtja a kívánt funkciót. Amikor ez a szubrutin-gép befejezte munkáját, tehát megállna, akkor megállás helyett egy új mozgási szabály ismét a hívó gép alkalmas állapotába viszi át az egyesített Turing-gépet. A hívó Turing-gép ezután folytatja munkáját. Persze itt is, éppúgy mint a számítógépek esetében, szubrutin hívásakor gondoskodnunk kell arról, hogy híváskor a hívott, visszatéréskor pedig a hívó hozzáférhessen a mködéséhez szükséges valamennyi információhoz. Ez azonban ­ mint érzékelhet ­ csupán technikai és nem elvi nehézséget okozhat. Nagyon könnyen szerkeszthetünk például olyan szubrutint, illetve azt realizáló Turing-gépet, amely beszúr, vagy olyat, amely kitöröl egy szimbólumot a szalag alkalmas helyén. Ennek megvalósítása érdekében célszer az eredeti Turing-gépet kissé feltupírozni. Állapotterét bvítsük ki annyira, hogy képes legyen egy szimbólum memorizálására, szalagját pedig szélesítsük ki annyival, hogy azon még egy markerjel elférjen. Beszúrás esetén tételezzük fel, hogy a beszúrandó szimbólum a kibvített állapotban van tárolva. Markerrel megjegyezzük a beszúrás helyét, és valamelyik irányba, például jobbra lépünk. Ezután a kiolvasott szimbólumot az állapotban tárolttal felülírva, az állapotban a most kiolvasott szimbólumot memorizáljuk. Minden ilyen operáció után jobbra lépve elsétálunk a szalag azon darabjának végéig, amely információt hordoz, vagyis amíg szimbólumot vagy ezzel egyenérték jelet nem találunk. Ezután ha szükséges, a szalag tartalmát változatlanul hagyva visszamegyünk a markerjelig, és azt töröljük. Ha törölni akarunk egy szimbólumot, akkor megjegyezzük a törlés helyét, majd elgyalogolunk a szalag információt hordozó részének végéig. Ezután a jellel egyenérték szimbólumot helyezünk el a kibvített állapotban, és ugyanazt a mveletet hajtjuk végre, mint elbb, vagyis a kiolvasott szimbólumot az állapotban tárolttal felülírjuk, miközben a kiolvasott szimbólumot memorizáljuk. Az eltérés csupán annyi, hogy most nem balról jobbra, hanem jobbról balra lépegetünk. Ha elértünk a markerjelig, akkor azt kitöröljük és megállunk.

6. Az automataelmélet alapjai

213

Igaz, ezek a funkciók nem túl bonyolultak, de remélem, ez a két demonstratív példa is érzékelteti, hogy bonyolultabb, de egyértelmen definiált feladatokra kisebb-nagyobb gonddal, de szerkeszthet szubrutinként mköd Turing-gép. Említettük, hogy az általunk megadott definíció a Turing-gépnek csak egyik lehetséges megadási módja. Így Turing-gép például az a gép is, amelynek író-olvasófeje alatt nem egy szalag, hanem egy mágneses sík helyezkedik el. Itt tehát nem kétirányú ­ jobbra, balra ­ hanem négyirányú ­ jobbra, balra, fel, le ­ mozgás képzelhet el. Amennyiben hiszünk a Church-tézisben, akkor igazolás nélkül el kell fogadnunk azt az állítást, hogy ennek az automatának az ereje sem lehet nagyobb a Turing-gépnél. Egyébként nem nehéz belátni, hogy ez a gép sem tud többet, mint szalag mentén mozgó kisöccse. Foglaljuk ugyanis téglányba a síknak azt a részét, amely információt hordoz. Az így kialakított téglánymátrixot tároljuk a szalagon sorfolytonosan, a sorokat egy új, eddig nem szerepelt szimbólummal elválasztva. A kezdsor elejét, és a zárósor végét két ilyen szimbólummal jelöljük. Amennyiben a síkbeli automata jobbra vagy balra mozog, akkor az t szimuláló szalag automata mozgása megegyezik a síkbeli automatáéval. Kínosabb a helyzet, ha a síkbeli automata például felfelé mozog. Ilyenkor a szalagos automata író-olvasófejének természetesen az elz sor ugyanolyan sorszámú szimbóluma fölé kell kerülnie. Ennek megvalósítására például a következ módszert használhatjuk. Egy markerrel megjegyezzük a kiindulási helyet, és egy másik markert helyezünk el az elz sor elején. Ezután az író-olvasófej ingajáratot végez a két marker között, miközben az eredeti markert mindig egy hellyel balra, az újat pedig egy hellyel jobbra csúsztatjuk. Nyilvánvaló, hogy amikor az eredeti marker a sor elejére ér, a másik marker éppen a kívánt pozícióban lesz. Amennyiben a síkbeli automata felségterületét felfelé vagy lefelé elhagyná, akkor a mozgás megkezdése eltt a szalagos automata a szalag elejére vagy végére új sort kell írjon. Ha az automata jobbra vagy balra lépne ki az eredeti téglánymátrixból, akkor a szimulálás eltt minden sor elejére illetve végére egy a szimbólummal egyenérték szimbólumot kell beszúrnunk. Nem vitás, a szalagautomata sokkal lassabban mködik, mint síkbeli testvére, de ettl függetlenül alkalmas annak szimulálására. Egy másik kísérlet az általunk megadott definíció szerinti Turing-gépnél nagyobb erej automata megszerkesztésére, ha a gépet nem egy, hanem n szalaggal látjuk el. A szalagoknak egymástól független író-olvasófejük van. Az ilyen gép mozgását a gép állapota és valamennyi szalagról leolvasott szimbólum együttesen határozza meg. A mozgás hatására a gép új állapotba megy át, valamennyi olvasott szimbólumot felülírja, végül mindegyik szalag egymástól függetlenül vagy jobbra, vagy balra lép, illetve helyben marad.

214

6.2. A Turing-gép lehetségei

Ezzel az n szalagos és író-olvasófejes géppel egyenérték Turing-gépet a következ módon szerkeszthetünk. Az új gép szalagját válasszuk olyan szélesre, hogy rajta mind az n szalagon tárolt információ egymás alatt elférjen. Ezen túlmenen legyen hely sávonként egy-egy marker számára is. A szimulált gép író-olvasófejeinek helyzetét a szalagon markerekkel jelöljük. Így minden sávban található egy marker. Az egyszalagos gép megkeresi valamennyi markert, kiolvassa az ott található információt, és tárolja azt a megfelelen kibvített, és véges sok információ memorizálására alkalmas állapotterében. Ha minden információ rendelkezésre áll, akkor kiderül, melyik mozgási szabályt kell szimulálni. Az író-olvasófej megint végiglátogatja az összes marker helyét, a szimulált szabálynak megfelelen felülírja a szimbólumot, és a markert jobbra vagy balra csúsztatja. Ennek során célszeren rögtön ki is olvashatja az új szimbólumot, így az új állapot beállításával egyidejen összegyjtheti a következ lépés megtételéhez szükséges információt. Az állapottérben meglehetsen sok információt kell tárolnunk. Minden szalagról egy szimbólumot memorizálunk. Tudnunk kell, hogy ez a szimbólum még a felülírásra használandó, vagy már az újonnan kiolvasott szimbólum-e. Minden sávra külön meg kell adni, hogy jobbra vagy balra történik-e a csúsztatás, esetleg helyben marad az író-olvasófej. Végül tudnunk kell, melyik szalagon helyezkedik el a baloldali, illetve jobboldali széls marker. Kétségtelen munkás dolog egy szalaggal egy n szalagos gépet szimulálni, de lehetséges. A gondolatmenetet ellentétes irányban is megpróbálhatjuk, kereshetünk egy a definiáltnál egyszerbb, de az eredeti Turing-géppel azonos erej automatát. Így például az a gép, amelynek szalagja csak egyik irányban tartalmazhat tetszlegesen hosszú információt szintén Turing-gép erej. Vegyünk ugyanis egy Turing-gépet, ahol a szalag természetesen mindkét irányban tetszleges hosszban felülírható. Féloldalas gépünknek legyen dupla széles a szalagja. Az eredeti Turing-gép szalagját hajtsuk ketté, és egyik felének információját az új szalag fels sávján, a másikat pedig az alsó sávján tároljuk. A kettéhajtás helyére írjunk egy új, fordítókorong szemantikájú szimbólumot. A féloldalas automata állapotában memorizálni kell, hogy a fels vagy az alsó sávon dolgozunk-e. Felülírásnál természetesen a nem használt sáv szimbólumai változatlanok maradnak. A fels sávban az eredeti és az új gép mozgási szabályai azonosak, az alsó sávban az új gép az eredetivel ellenkez irányban lép. Ha a fordítókorongra lépünk, sávot változtatunk, és egyet visszamegyünk. Amennyiben egy veremautomatát nem egy, hanem két veremmel látunk el, akkor képességei a Turing-géppel lesznek azonosak. A ketts verm automatával egy Turing-gép úgy szimulálható, hogy az egyik verem az íróolvasófejtl balra, a másik a jobbra es tartalmat tárolja. A fej alatti szimbólumot valamelyik verem tetejére rakjuk.

6. Az automataelmélet alapjai

215

Induláskor a szalag tartalmát betöltjük az egyik verembe, majd annak érdekében, hogy a sorrend helyes legyen, áttöltjük a másikba. Ezek után a szalaghoz hozzá sem nyúlunk, csupán -mozgásokkal szimuláljuk a Turing-gép mozgását. Ebben a fázisban az eredeti Turing-gép és a ketts verm automata szituációi egy-egy értelm megfeleltetésben vannak. A Turing-gép szalagján lév információ megváltoztatása triviális módon vihet át a két verem tartalmának megváltoztatására. Számláló automatának hívják az olyan automatát, amelynek szalagján csak egyetlen helyen van a többitl megkülönböztet jel. Az információt az olvasófejnek ettl a jeltl lépésekben mért távolsága szolgáltatja. Könny belátni, hogy egy verem mindössze két ilyen szalaggal szimulálható. Az információ tárolására tulajdonképpen elegend volna egyetlen szalag, a másik szalagra csak a két mvelet, a beírás és a kiolvasás miatt van szükség. Legyen ugyanis a veremautomata vermének alfabetája k-1 számosságú. Jelöljük az egyes szimbólumokat az 1 ... k-1 intervallumba es számokkal. Legyen a veremben m szimbólum, az els szimbólum van a verem legalján, az m sorszámú a verem tetején. Ezek után a verem tartalmát egyetlen számmal jellemezhetjük: im + im-1k+ im-2 k2 + . . . + i1km-1 Itt ij a j sorszámú verembeli szimbólumnak megfeleltetett számértéket jelöli. Minthogy ez az érték mindig kisebb, mint k, a megadott szám valóban egyértelmen jellemzi a verem tartalmát. A kiolvasás mechanizmusa a következ. Kiinduláskor az egyik szalag olvasója ezt a számot memorizálja, vagyis az olvasófej éppen ennyi lépéssel távolodott el a jeltl, míg a másik szalag olvasófeje éppen a jelen áll. Az automatában van egy számláló, amely a megtett lépéseket számolja. A számot tároló szalag olvasófejét léptessük vissza egészen a jelig. Közben, amikor az olvasófej k lépést megtett, eggyel léptejük a másik szalagot, és a számlálót nullázzuk. Mire az információt eredetileg tartalmazó szalagon az olvasófej a jelhez ér, a számláló értéke adja a verem tetején lév szimbólum értékét, míg a másik szalag a verem új tartalmát memorizálja. A két szalag szerepe tehát felcseréldött. Beíráskor a kiinduló állapot ugyanaz, mint elbb, hiszen ez a számláló automata alaphelyzete. Most is visszaléptetjük az olvasófejet a jelig, de közben minden visszalépésnél a másik szalag k lépést tesz meg. Amikor ezzel végeztünk, akkor a beírandó szimbólum kódjának megfelel számú lépéssel megtoldjuk a szalag lépésszámát. Könny belátni, hogy a tárolt érték ismét a verem új tartalmának felel meg. Azt már megmutattuk, hogy egy Turing-gép egy ketts verm automatával egyenérték. Azt is láttuk, hogy két számláló szalaggal egy verem információ tartalma kezelhet. Ebbl következik, hogy négy számlálószalaggal egy Turing-gépet lehet szimulálni. Ez magától értetd.

216

6.2. A Turing-gép lehetségei

Mint az alábbiakból kitnik, nem kell bkezen négy szalaggal ellátni a számláló gépet, mert kétszalagos változata is ugyanolyan számítási képesség, mint a Turing-gép. Az igazolás gondolatmenetébl csak azt a kritikus elemet érzékeltetjük, amely megmutatja, hogyan lehet két számláló szalaggal két, illetve akárhány verem tartalmát kezelni. Azt a korábbi eredményünket, hogy egy verem tartalmát hogyan lehet egyetlen számmal jellemezni, itt is felhasználjuk. Legyen a két verem tartalmat jellemz két szám p és q. Amennyiben az egyik szalagon a 20·3p·5q számot tároljuk, akkor ezzel mindkét számot és így mindkét verem tartalmát hozzáférheten ismerjük. Itt · szorzás jele. A kívánt információ kinyerése csak technikai kérdés. Példaképpen azt az esetet részletezzük, amikor valamelyik, mondjuk, a második verembl akarjuk kiolvasni a verem tetején található szimbólumot. Elször a számlálószalag tartalmát öttel osztjuk, vagyis az olvasófejet ötösével visszaléptetjük. A másik szalagot az els szalag minden öt lépése után eggyel továbbítjuk. Amennyiben a szám osztható volt öttel, vagyis az utolsó lépésnél éppen a jelhez értünk, akkor az automata állapotában tárolt számlálón egyet számlálunk, és a két szalag szerepének felcserélésével újból osztunk öttel. Ha bekövetkezik az az állapot, amikor a kapott szám már nem osztható öttel, akkor a szalagon rekonstruáljuk az osztási kísérlet eltti állapotot. Az állapotban tárolt számláló természetesen nem képes tetszleges szám tárolására, hiszen az állapothalmaz véges kell legyen. Ez nem is következik be, mert valahányszor a számláló elérte a k értéket ­ k mint emlékezünk, a verembeli alfabeta számosságánál eggyel nagyobb szám ­ a szalag tartalmát megszorozzuk kettvel, és az állapotban elhelyezett számlálót nullázzuk. Az egész hosszadalmas mvelet után a számláló szalagon rzött szám. 2r·3p·50 alakú lesz, ahol r értéke megfelel a második verem kiolvasás utáni tartalmának, míg az állapotban tárolt számláló állása megadja a kiolvasott szimbólumot. Az ebben a játékban bizonyos gyakorlatra szert tett olvasó számára nem jelenthet problémát, hogy a 2 kitevjét az 5 kitevjének írják át. Minthogy a prímszámok megszámlálhatóan végtelen sokan vannak, ezzel a módszerrel tetszleges számú verem információja kezelhet egy két szalaggal bíró számláló automatával. A Turing-gép lehetségeirl szólva külön ki kell emelnünk a szimulációs képességét. Készíthet ugyanis olyan Turing-gép amellyel egy másik Turing-gép mozgási szabályait közölve az a továbbiakban ezen mozgási szabályok szerint viselkedik, vagyis szimulálja a megadott Turing-gépet. Az ilyen, más tetszleges Turing-gépet szimulálni képes gép neve univerzális Turing-gép.

6. Az automataelmélet alapjai

217

A fenti állításban tulajdonképpen semmi meglep sincsen. A számítógépeknél ezt a trükköt széles körben alkalmazzák. Minden számítógépnek ugyanis megvan a maga gépi utasítás rendszere, az adott számítógép anyanyelve. Ez a Turing-gép mozgási szabályainak analogonja. Ez a gépi utasításkészlet azonban nagyon nehezen kezelhet, és éppen ezért egy másik utasításkészletet, egy számítógépes nyelv leírását tápláljuk be valamilyen formában a számítógépbe, és ennek hatására a számítógép úgy viselkedik, mintha a számítástechnikai nyelv lenne a számítógép anyanyelve. Az itt használt terminológiával azt a tényt, hogy a gép nem saját nyelvének, hanem a számítástechnikai nyelvnek az utasításait érti meg, úgy interpretálhatjuk, hogy a gép egy másik gép mozgási szabályai szerint mködik. Az univerzális Turing-gép realizálásának egyik lehetséges módja, hogy a szimulálandó gép mozgási szabályainak kódolt leírását a szalagon hagyjuk, és egy szimbólum olvasásakor az univerzális Turing-gép a szalagon található specifikációval konzultálja meg a teendket. Az alábbiakban vázlatosan ismertetjük az univerzális Turing-gép egyik ilyen elv megvalósítását. Kódoljuk mind a szimulálandó Turing-gép, mind a bemen adatok leírását ugyanabban a kódrendszerben. Legyen ez az egyes számrendszer. Ebben csak két szimbólumot használunk, például az egyest és a nullát. Ez utóbbit csak mint elválasztó karaktert alkalmazzuk. Számozzuk meg sorjában mind az automata állapotait, mind a szalag alfabetájának szimbólumait, és kódoljuk azokat számozásuknak megfelel számú egyessel. Az egyesek ilyen sorozatának végét mindig az elválasztó szimbólum, esetünkben a nulla jelzi. A Turing-gép mozgási szabályainak baloldalán egy állapotból és egy olvasott szimbólumból álló ketts, míg jobboldalán egy hármas áll. Ez utóbbi egy állapotot, egy szimbólumot és egy jobbra vagy balra léptetési utasítást tartalmaz. A szabályok leírásánál azoknak csak jobboldalát adjuk meg, a baloldalt pozícionálisan kódoljuk. Egy mozgási szabály jobboldalát három, egyesekbl álló, és egymástól egyetlen nullával elválasztott sorozattal jellemezzük. Az els az új állapot, a második a felülírásra használt szimbólum sorszámát adja, míg a harmadik a léptetés irányát jelzi. Például egy egyes jobbra, két egyes balra léptetést jelent. Az ugyanahhoz az állapothoz tartozó mozgási szabályokat egymás után, az olvasott szimbólum sorszámának megfelel sorrendben, de most már két nullával elválasztva adjuk meg. Itt ügyelnünk kell arra, hogy a legels, tulajdonképpen a 0 sorszámhoz tartozó helyet az szimbólumnak kell fenntartanunk.

218

6.2. A Turing-gép lehetségei

Természetesen, mivel a mozgási szabályok baloldalát a pozíció határozza meg, nem hagyhatunk ki egyetlen kombinációt még akkor sem, ha erre nincsen mozgási szabály. Ilyenkor valamilyen jobboldalként nem értelmezhet jelsorozatot alkalmazhatunk. Ugyanígy jeleznünk kell, ha valamely állapothoz nem tartozik egyetlen jobboldal sem, tehát egy egész sor marad el. Ez esetben a teljes sor helyett alkalmazhatunk egy másképpen nem értelmezhet jelölést. Kivételt képez az az eset, amikor a jobboldal utolsó a sorban, illetve a sor utolsó a felsorolásban. Ilyenkor ugyanis a mozgási szabály hiánya detektálható. Az egyes állapotokhoz tartozó információt három-három nullával elválasztva fzzük egymáshoz, míg a teljes leírást négy nullával kezdjük és zárjuk. A mozgási szabályokat követen meg kell adnunk az elfogadó állapotok halmazát egymás után felsorolva az elfogadó állapotok sorszámát. Ezzel az automata egyértelmen specifikálva van. Itt azzal az egyszersít feltételezéssel éltünk, hogy az automata determinisztikus, hiszen az elbbi leírás szerint egy állapot­olvasott karakter párhoz legfeljebb egy mozgási szabályt vettünk figyelembe. Nemdeterminisztikus automaták ilyen leképezése kissé bonyolultabb, de ez csak technikai és nem elvi problémát jelent. Egyébként ­ mint késbb kitnik ­ minden nemdeterminisztikus Turinggéphez szerkeszthet egy vele ekvivalens, ugyanazt a nyelvet elfogadó determinisztikus Turing-gép. A szalagnak alkalmasnak kell lennie markerjelek befogadására is. Az ilyen univerzális Turing-gép mködési elve a következ. Induláskor a specifikáció legelején és a bemen adat els szimbólumánál található marker. Az els feladat az aktuális mozgási szabály megtalálása. Az állapotot ismerjük, hiszen az a kezdállapot, amelyik markerrel van megjelölve. Az olvasott szimbólum sorszáma szabja meg a keresett jobboldal helyzetét. Egyenként az adatszimbólum markerének odébb csúsztatásával leolvassuk az adatszalagon az egyesek számát, miközben minden egyesnél visszamegyünk a specifikációhoz, és az ott található markert addig léptetjük jobbra, amíg egy ketts nullán át nem halad. Világos, hogy mire az olvasott szimbólum egyesei elfogynak, a specifikáció markere éppen az aktuális szabály jobboldalának elején áll, feltéve persze, hogy ilyen szabály létezik. Következik az új állapot kijelölése. Ebbl a célból visszamegyünk a specifikáció elejére, amelyet egy újabb markerrel látunk el. A megfelel állapot megtalálására ugyanazt a technikát alkalmazzuk, mint elbb, csak most a már ismert aktuális jobboldalban számoljuk le az állapotokat jelz egyeseket, és most nem két, hanem három nullából álló sorozatokat kell átlépnünk. A mvelet végén a marker az új állapot indulási helyén lesz.

6. Az automataelmélet alapjai

219

Ezután kerülhet sor az olvasott szimbólum felülírására. Az aktuális jobboldal második elemét ­ ide-oda vándorolva ­ összehasonlítjuk az olvasott szimbólum sorszámával. Ha az új szimbólumnak más a sorszáma, akkor az egyeseket beszúró, illetve kitörl szubrutint hívjuk segítségül. Utolsó lépésként az adatszalagon kell a markert az aktuális jobboldal harmadik elemének megfelelen, egy szimbólummal jobbra vagy balra léptetnünk. Vegyük észre, hogy az egész nem túl bonyolult, de meglehetsen hosszadalmas mveletsorozat végén a markerek a helyükön állanak, tehát hozzákezdhetünk a következ mozgás szimulálásához. Ha valamelyik kombinációhoz nem tartozik mozgási szabály, akkor az automata megáll. Ilyenkor meg kell állapítani, hogy a megállás állapota elfogadó állapot-e vagy sem. Az állapotot a marker helye jelzi. A specifikáció végén szerepel az elfogadó állapotok listája, ennek alapján az elbbiekhez hasonló technikával kideríthetjük, hogy a szimulált gép a jelsorozatot elfogadta-e vagy sem. A fent vázolt módszerrel persze csak az egyik irányban korlátlan hosszúságú szalaggal bíró Turing-gépet modellezhetjük, hiszen a szalag egy része, az, ahol a specifikáció van, tabu, amelyet nem írhatunk felül. Ez azonban nem jelent korlátozást, mert mint láttuk, minden Turing-géphez szerkeszthet egy ilyen, szalagját csak az egyik irányban korlátlan hosszban használó, és az eredeti Turing-géppel ekvivalens, vagyis ugyanazt a nyelvet elfogadó Turing-gép. Egy ilyen, a fent vázolt megoldású univerzális Turing-gép nagyságrendileg 60 mozgási szabállyal megoldható. A szabályok nem bonyolultak, inkább az okozhat problémát, hogy az egyébként egyszer mködésmódot aprólékosan át kell gondolni. Példaképpen megadjuk egy Turing-gép olyan leírását, amelyet a fenti univerzális Turing-gép a szimuláció céljaira felhasználhat. Legyenek a szimulálandó Turing-gép mozgási szabályai a következek: (q1, a) = (q1, a, r) (q1, b) = (q2, b, r) (q2, a) = (q1, a, r) (q2, b) = (q2, b, l) Azt hiszem az olvasó felismerte, hogy ez a Turing-gép ugyanazt a feladatot látja el, mint amit a kétirányú mozgást végz véges automata példájában adtunk meg. A példa demonstratív jelleg, és az egyszersítésre való törekvés céljából használtunk Turing-gépet olyan probléma kezelésére, amely véges automatával is megoldható. A fenti gép specifikációjának leírása a következ: 0000 1 00 10101 00 1101101 000 1 00 10101 00 11011011 0000 1 0 11 0000

220

6.2. A Turing-gép lehetségei Talán helyes ehhez a specifikációhoz néhány magyarázó szót hozzáfzni.

A szóközök természetesen nem szignifikánsak, és csakis az áttekinthetség növelése érdekében szerepelnek. Minthogy csak két állapot van, az állapotokat elválasztó hármas nulla csak egyszer fordul el. Bár könnyen belátható, hogy az automata sohasem téved szimbólumokkal jelzett területre, a leírásban erre is fel kell készülni. Ezért áll a nulladik szimbólum helyén az 1 00 jelsorozat. Minthogy mindkét állapot elfogadó állapot, sorszámuk szerepel az elfogadó állapotok listáján. Vegyük észre, hogy csupa elfogadó állapota ellenére ez az automata sem fogad el minden jelsorozatot. A visszautasítás módja itt azonban a végtelen ciklus, vagyis az automata sohasem áll meg.

6.3. A megállási probléma
Az elbbi példánk Turing-gépérl szinte ránézésre meg tudjuk állapítani, hogy bizonyos bemeneti jelsorozatokra végtelen ciklusba megy, sohasem fog megállni. Felvetdik a gondolat, vajon ez a kérdés általánosságban megválaszolható-e vagy sem? Legyen adott egy Turing-gép és egy jelsorozat. Eldönthet-e bármely Turing-gép, és tetszleges jelsorozat esetében, hogy ez a gép az adott jelsorozatra valaha is megáll. A nemdeterminisztikus gépekre is gondolva fogalmazzunk szabatosabban. Adott a gép, és adott a bemeneti jelsorozat. A kérdés így hangzik: létezik-e olyan mozgássorozat, amelyre a Turing-gép megáll. A probléma alapvet ismeretelméleti elveket érint, és jelentsége messze túlmutat azon a feladaton, amelynek kapcsán a kérdést megfogalmaztuk. Mieltt ennek tárgyalásába belefognánk, tekintsük át azokat az explicite ki nem mondott eredményeket, amelyeket az univerzális Turing-gép vizsgálata során kaptunk. A lehetséges Turing-gép specifikációk, vagyis azok a jelsorozatok, amelyek egy gép specifikációjának tekinthetek, egy nyelvet, mégpedig környezetfüggetlen nyelvet alkotnak. Minthogy minden Turing-géphez szerkeszthet ilyen specifikáció, ez a nyelv valamennyi Turing-gép leírását tartalmazza. Ebbl viszont következik, hogy az összes Turing-gép száma megszámlálhatóan végtelen, és így beszélhetünk els, második, stb. Turing-géprl. Egy másik fontos tanulság, hogy a gép leírása és bemeneti adatai ugyanabban a kódban jeleníthetek meg. Szeretném itt felhívni a figyelmet a számítógépek híres neumanni elvére, amely szerint a számítógép nem tesz különbséget program jelleg és adat jelleg információ között.

6. Az automataelmélet alapjai

221

Valóban, itt sincs semmiféle akadálya annak, hogy egy gép leírását adatnak tekintsük, és feldolgoztassuk egy Turing-géppel. Nyilvánvaló, hogy a gép semmi módon nem érzékeli, hogy a beadott jelsorozat akár egy Turing-gép leírása is lehet, hiszen az információ funkcióját nem az információ jellege, hanem a felhasználás módja szabja meg. Itt pedig az információ adatként szerepel. Megtehetjük azt is, hogy egy Turing-gépnek saját leírását adjuk be adatként. Vegyük sorra a Turing-gépeket, és bemenetként kapják meg saját specifikációjukat. Kérdés, hogyan reagálnak erre a bemenetre a gépek? Nyilván lesznek olyanok, amelyek elfogadják, de olyanok is, amelyek visszautasítják ezt a bemenetet. Azok a leírások, amelyeket saját gépük elfogad, de azok is, amelyek visszautasításban részesülnek, egy-egy nyelvet alkotnak. Legyen a két nyelv neve L01 és L02. A 0 index itt arra utal, hogy a Turing-gépek a 0-ás nyelvosztály nyelveit fogadják el, bár ennek igazolásával még adós vagyok. Az L01 nyelv tehát azon Turing-gépek specifikációit tartalmazza, amelyek elfogadják saját leírásukat. Vajon készíthet-e olyan Turing-gép, amely ezt a nyelvet fogadja el? Erre a kérdésre a válasz pozitív. Egyszer eszközökkel készíthetünk olyan gépet, amely éppen ezt a nyelvet fogadja el. Elször is szrjük ki azokat a jelsorozatokat, amelyek nem tekinthetek Turing-gép leírásnak. Minthogy a Turing-gép leírásokat egy környezetfüggetlen nyelvtan generálja, ezt a feladatot egy veremautomata is elláthatja. A továbbiakban már csak olyan jelsorozatokkal foglalkozunk, amelyek gépek leírásai, a többit a veremautomata kiszrte. Másoljuk le ezután a szalagon található specifikációt még egy példányban, és azt tápláljuk be bemenetként egy univerzális Turing-gépnek. Az univerzális gép a leírás els példányát valóban leírásnak, a másodikat azonban adat fogja tekinteni. Így az univerzális Turing-gép a specifikációban szerepl gépet szimulálva, feldolgozza annak leírását. Nyilvánvaló, hogy az ily módon konstruált gép éppen az L01 nyelvet fogja elfogadni. Mi a helyzet a másik, az L02 nyelvvel, amely a saját specifikációjukat visszautasító Turing-gépek leírását tartalmazza? Vajon erre a nyelvre is szerkeszthet Turing-gép? Sajnos nem. Tételezzük fel ugyanis az ellenkezjét, vagyis azt, hogy létezik egy az L02 nyelvet elfogadó Turing-gép. Ez a gép persze szükségképpen egyike a megszámlálhatóan sok Turing-gépnek. Természetesen ennek is van specifikációja, és ennek a gépnek is odaadható a saját leírása. Kérdés, hogyan reagál ez a gép a saját leírására? Ha elfogadja, az hiba, mert ekkor a leírás nem mondata az L02 nyelvnek, és így a gép nem fogadhatná el. Viszont az is baj, ha nem fogadja el, hiszen ilyenkor ez egy olyan Turing-gép

222

6.3. A megállási probléma

leírása, amelyet saját gépe nem fogadott el, tehát mondata az L02 nyelvnek, és így ezt el kellene fogadnia. Mindkét esetben ellentmondásra jutottunk, így ezek szerint eredeti feltevésünk volt helytelen, Nincsen tehát az L02 nyelvet elfogadó Turing-gép, ez a nyelv nem generatív nyelv. Az ilyen feloldhatatlan dilemmák kérdése már régóta, az antik görög korból is ismeretes. Had említsek meg egy ismert, késbbi esetet, a katonai borbély problémáját. A borbély azt a parancsot kapja, hogy borotváljon meg mindenkit, aki nem maga borotválkozik. Ki borotválja a katonai borbélyt? Emlékeztetnék arra, hogy minden nyelvtannal generálható nyelvre, vagyis generatív nyelvre készíthet Turing-gép. Annak idején a formális nyelvek definiálásakor megállapítottuk, hogy egy adott alfabeta felett kontinuum számosságú nyelv létezik. A generatív nyelvek ennek a halmaznak egy megszámolhatóan végtelen számosságú részhalmazát képezik. Eddig mindig olyan nyelvekkel volt dolgunk, amelyek ebbe a megszámlálható számosságú halmazba estek. Az L02 nyelv nem tartozik bele ebbe a sokaságba, nem generatív nyelv. Felhívnám a figyelmet, hogy ezzel egy Rubicont léptünk át. Minthogy többet ilyen, nem generatív nyelvvel nem lesz dolgunk, talán helyesebb úgy mondani, hogy átnéztünk a Rubicon túlsó oldalára. Ez után az eltanulmány után, térjünk vissza eredeti kérdésünkhöz. Eldönthet-e a Turing-gép megállási problémája, vagyis meg tudjuk-e állapítani, hogy egy adott Turing-gép egy adott bemenetre megáll-e vagy sem? A válasz negatív. Tételezzük fel ugyanis az ellenkezjét. Ez esetben szükségképpen létezik egy olyan algoritmus, amellyel közölve a Turing-gép leírását, és a bemenetet, mindenkor megállapíthatjuk, megáll-e a gép vagy sem. Minthogy hiszünk a Church-tézisben, erre az algoritmusra Turing-gépet is szerkeszthetünk. Becézzük ezt a hipotetikus gépet szuperokos Turing-gépnek. Ha létezik ilyen szuperokos Turing-gép, akkor viszont könnyen szerkeszthetünk egy olyan Turing-gépet, amely az L02 nyelvet fogadja el. Legyen adott egy tetszleges Turing-gép specifikációja. Adjuk ezt át két példányban a szuperokos Turing-gépnek, egyszer mint gépleírást, egyszer mint adatot. A szuperokos gép megmondja megáll-e a specifikált gép a bemeneti adatra, vagyis jelen esetben megáll-e a gép saját leírását elemezve. Ha nem áll meg, ez visszautasítást jelent, ez a leírás tehát mondata az L02 nyelvnek. Éppen ezért a szuperokos géptl nyert információ alapján a nyelv elfogadására szerkesztett gépünket elfogadó állapotban állítjuk meg. Más a helyzet, ha a szuperokos gép vizsgálata szerint a gép megáll az adott bemenetre. Ekkor az univerzális gépet hívjuk segítségül, és a gép leírását ennek adjuk át két példányban.

6. Az automataelmélet alapjai

223

A szimuláció során az univerzális gépnek meg kell állnia, hiszen erre kötelezi t a szuperokos gép ítélete. Megállás után el tudjuk dönteni, elfogadná-e vagy sem a gép saját leírását. Ha elfogadja, akkor a jelsorozat nem mondata az L02 nyelvnek, míg ha visszautasítja, akkor a nyelv egy mondatát kaptuk. Ennek megfelelen az L02 nyelvre szerkesztett Turing-gép az els esetben visszautasít, a másodikban elfogad. Persze ezek mind csak feltételezések. Mi más okokból már tudjuk, hogy az L02 nyelvre nem lehet Turing-gépet szerkeszteni. Az az okoskodás, amely ilyen gép kialakítására vezet, valahol hibázik. Adott esetben ez a szuperokos Turing-gép létének feltételezése volt. Nincs tehát szuperokos gép, a megállási problémára nem készíthet algoritmus. Az a tény, hogy valamely problémára, pontosabban problémaosztályra nem készíthet algoritmus annyit jelent, hogy erre a feladattípusra nem adható meg olyan módszer, amely általános, vagyis minden ebbe a kategóriába es feladatnál alkalmazható. Ez nem zárja ki, hogy egyes konkrét feladatokat egy szellemes ötlet, vagy heurisztika igénybevételével meg ne oldjunk. Így például ismeretes, hogy negyedfokúnál magasabb kitevj polinomokra nem szerkeszthet megoldó képlet. Ezzel együtt bizonyos polinomok megoldása ügyeskedéssel vagy akár ránézésre is megadható. Így az x5 = 32 egyenletnek egyik megoldása nyilván 2. Visszatérve a Turing-gép megállási problémájához, azt már láttuk, hogy vannak olyan gépek, amelyek nem állnak meg bizonyos bemenetekre. Ilyen volt például az az univerzális géppel szimulált Turing-gép is, amely minden visszautasított jelsorozat esetén végtelen ciklusba került. Az adott nyelvnél a végtelen ciklus nem szükségszer. Habkönnyen szerkeszthetnénk olyan, ugyanezt a nyelvet elfogadó gépet, amely minden bemenetre megáll, persze nem mindig elfogadó állapotban. Itt tehát nem a probléma természete, hanem a Turing-gép szerkesztjének felületessége vagy ügyetlensége miatt kaptunk egy nem minden esetben megálló gépet. Felmerül a kérdés, elkerülhetetlen a megállni képtelen Turing-gépek tárgyalása, nem lehet-e minden feladatra mindig megálló Turing-gépet szerkeszteni. Sajnos nem. Vannak olyan nyelvek, amelyeket elvben sem lehet egy minden bemenetre megálló Turing-géppel elfogadtatni. Ilyen nyelv például az elbb tárgyalt L01 nyelv. Tételezzük fel ugyanis, hogy létezik egy minden bemenetre megálló és ezt a nyelvet elfogadó automata. Mint tisztáztuk azokat a jelsorozatokat, amelyek nem egy Turing-gép leírását adják, könny kiszrni. Ha most csak az olyan jelsorozatokra szorítkozunk, amelyek egy gép specifikációját adják, akkor az L01 nyelv mondataira a gép elfogadó, az L02 nyelv mondataira pedig visszautasító állapotban fog megállni.

224

6.3. A megállási probléma

Ha most egy olyan Turing-gépet szerkesztünk, amely a fenti, feltételezésünk szerint mindig megálló gépnek a válaszait megfordítja, vagyis ha az visszautasít, mi elfogadunk, ha elfogad, mi visszautasítunk, akkor ez a gép éppen az L02 nyelvet fogadja el. Minthogy ­ mint tudjuk ­ erre a nyelvre Turing-gép nem szerkeszthet, feltételezésünk nem állja meg a helyét. Nincs tehát olyan az L01 nyelvet elfogadó Turing-gép, amely minden bemenetre megállna. A Turing-gép megállása híres, nevezetes probléma. Ez volt ugyanis az els olyan feladat, amelynek algoritmikusan eldönthetetlen voltát felismerték. Ez volt a kérdés, amely az addig kétpólusú igen-nem válaszokon alapuló, megoldható, nem megoldható lehetségeket ismer világunkat megzavarta. Tehát most már három lehetségben kell gondolkoznunk, megoldható, nem megoldható és eldönthetetlen. Sajnos nem, világunk nem hárompólusú. Vannak ugyanis olyan problémák, amelyeknek az eldönthetetlen voltát sem tudjuk megállapítani. St ez a gondolatmenet folytatható. Elképzelhet olyan feladat, amelynél az eldönthetetlenség kimutatásának lehetségét sem vagyunk képesek megállapítani. És ezt vég nélkül tovább lehet folytatni. A megismerhetség horizontja végtelen. Elnézést, hogy itt kissé patetikus, st talán szentimentális szólamokra ragadtattam el magam, de megpróbáltam érzékeltetni, milyen hatással volt rám ennek a diszciplínának a megismerése.

6.4. A Turing-gép és a 0-ás osztályú nyelvek
Régi becsületbeli adósságunkat rójuk le akkor, amikor igazoljuk a Turing-gépek és a 0-ás osztályú nyelvek ekvivalenciáját. Ehhez két dolgot kell belátnunk. Egyrészt be kell bizonyítanunk, hogy minden 0-ás osztályú nyelvhez szerkeszthet egy olyan Turing-gép, amely pontosan a nyelvtan által generált mondatokat, és csakis azokat fogadja el. Másrészt viszont igazolnunk kell, hogy minden Turing-gépnek megfeleltethet egy olyan 0 osztályú nyelvtan, amely éppen a gép által elfogadott jelsorozatokat, és csakis azokat generálja. Ami az állítás els részét illeti, ez számunkra, akik hiszünk a Churchtézisben, trivialitás. A generatív nyelvtanok segítségével egy mondat generálása algoritmizálható feladat, és így hivatalból létezik a megszámlálhatóan végtelen sok Turing-gép között egy olyan Turing-gép, amely éppen az adott nyelvre pontosan ezt a feladatot végzi el. Pusztán annak érdekében, hogy az olvasót egy ilyen Turing-gép feltalálásának fáradságos munkájától megkíméljük, az alábbiakban megadjuk egy ilyen gép szerkesztésének lehetséges megoldását, helyesebben annak vázlatát. Elször azt kell elképzelnünk, hogyan képezhetek le egy nyelvtan levezetési szabályai Turing-gép segítségével. Tételezzük fel, hogy a gép

6. Az automataelmélet alapjai

225

egy mondatszer forma van. Az automata elolvassa ezt a mondatszer formát, és megkeresi azokat a fragmenseket, amelyek valamely levezetési szabály baloldalán állnak. Ezek közül egyiket ­ a választás rajtunk áll ­ a szabály jobboldalával, pontosabban ­ ha netán több szabály baloldalán szerepelne ugyanaz a fragmens ­ egyik jobboldalával felülírjuk. Ez a mvelet, vagyis a baloldal felismerése, és annak a jobboldallal való felülírása az automata állapothalmazától bizonyos memorizáló képességet követel meg. Ez azonban csak technikai probléma, lévén a levezetési szabályok száma és hosszúsága is véges, tehát véges a memorizálandó információ mennyisége is. Ennek egyik lehetséges megoldása, ha a helyettesítési szabályokat kódolt formában szalagra írjuk, és olyan gépet szerkesztünk, amely ­ hasonlóan az univerzális Turing-géphez ­ a szalagon található információ alapján teszi meg lépéseit. Természetesen, amennyiben a levezetési szabály baloldala és jobboldala nem egyforma hosszú, akkor a felülírási mvelet még szimbólumok törlésével, illetve beszúrásával járhat, de ez már megoldott kérdés. Az a tény, hogy egy adott mondatszer forma esetében az alkalmazható levezetési szabályok közül csak egyet helyettesítünk, azt jelenti, hogy automatánk nemdeterminisztikus automata lesz. Nyilvánvaló, hogy egy ilyen automata a nyelvtan bármely mondatát elállíthatja. Egy tetszleges 0-ás osztályú nyelvtannal ekvivalens Turing-gép felépítése ennek alapján a következ lehet. Induláskor a szalagon természetesen az a jelsorozat van, amelyet a szóban forgó nyelv egy mondatának hiszünk. Írjunk a jelsorozat után egy minden nyelvtani szimbólumtól különböz elválasztó jelet, majd a mondatszimbólumot. Ezek után adjuk át a teret a levezetési szabályokat leképez automatának, amely a mondatszimbólumból kiindulva mondatszer formák sorozatán keresztül egy mondatot generál, ha generál. Elképzelhet ugyanis, hogy a mondatszer formák sorozata sohasem eredményez mondatot. Amennyiben a generálás eredménye egy mondat, akkor összevetjük a bemenetként megadott jelsorozattal. Ha a két jelsorozat azonos, az automata elfogadó, ha eltér, visszautasító állapotban áll meg. Amennyiben olyan mondatszer formához érünk, amely tartalmaz ugyan nemterminális szimbólumokat, de tovább nem deriválható, más szóval a levezetés fiaskóval végzdött, az automata akkor is visszautasító állapotban áll meg. Világos, hogy az így definiált Turing-gép csakis azokat a jelsorozatokat fogadja el, amelyek a nyelvtan által generált mondatok. A fentiekben leírt Turing-gép nemdeterminisztikus automata. Kis módosítással azonban elkészíthetjük ennek determinisztikus változatát. Ez a lépés nagy horderej, mert igazolja a nemdeterminisztikus és determinisztikus Turing-gépek ekvivalenciáját, és megmutatja, hogy minden 0-ás

226

6.4. A Turing-gép és a 0-ás osztályú nyelvek

osztályú nyelvhez szerkeszthet determinisztikus automata. Ilyen élményben mióta elhagytuk a reguláris nyelveket nem volt részünk. A determinisztikus változat mködését éppen úgy kezdi, mint a nemdeterminisztikus megfelelje. Induláskor a bemeneti jelsorozat után odaírja, persze elválasztva a mondatszimbólumot. Ezt követen azonban a vizsgált mondatszer formából ­ jelen esetben induláskor a mondatszimbólumból ­ az egy levezetési lépésben származtatható valamennyi mondatszer formát sorban, egymástól elválasztva felírja a szalagra, majd továbblép a következ mondatszer formára, és megismétli ezt a mveletet. Így a szalag egy sereg, a késbbiekben elemzend mondatszer formát tartalmaz, amelyek aztán sorban vizsgálatra kerülnek. Amint az aktuálisan vizsgált mondatszer formában egy levezetési szabály baloldalát fedezzük fel, akkor a lista végére írjuk azt a mondatszer formát, amely az eredetibl a megtalált baloldal helyettesítésével keletkezik. Amennyiben a szóban forgó baloldal többször szerepel az elemzett mondatszer formában, akkor a szabály valamennyi alkalmazásával elálló mondatszer formát sorban leírjuk, majd visszatérve az aktuális mondatszer formához, abban újabb baloldalakat keresünk. Ha már valamennyi deriválási lehetséget kimerítettünk, vagyis nincs már több felderítetlen baloldal a mondatszer formában, akkor továbblépünk a következ elemzend mondatszer formára. Így a szalagra kerül a mondatszimbólumból egy lépésben, majd két lépésben, stb. elérhet valamennyi mondatszer forma, illetve ha az nem tartalmaz nemterminális szimbólumot, akkor mondat. Így folytatva a procedúrát egyetlen mondatszer forma sem marad ki. Ha a derivátum mondatnak bizonyul, akkor összevetjük a bemenetként megadott jelsorozattal. Ha a két jelsorozat azonos, akkor elfogadó állapotban megállunk. Eltérés esetén folytatjuk az elemzést. Ezzel nem csak állításunk els részét tettük érzékletesebbé, hanem mint mellékterméket, egy fontos tételt is igazoltunk a nemdeterminisztikus és determinisztikus gépek ekvivalenciájáról. Ami állításunk második részének igazolását illeti bizonyításunk konstruktív lesz. Egy tetszleges Turing-gépbl kiindulva kialakítjuk annak a 0-ás osztályú nyelvtannak a szabályait, amely éppen az automata által elfogadott nyelvet generálja. Mieltt a tárgyalás részleteiben elmerülnénk, ismerkedjünk meg a Turing-gép konfigurációjának leírására használt egyszer és szellemes jelöléssel, amelyet nem csak most, de késbb is alkalmazni fogunk.

6. Az automataelmélet alapjai

227

Valamely automata konfigurációja definíció szerint tartalmazza mindazokat az információkat, amelyek alapján az automata további mködését egyértelmen el lehet dönteni. A Turing-gép esetében a konfiguráció leírásának tartalmaznia kell az automata állapotát, a szalagon található érdemi, tehát a szimbólumtól eltér szimbólumok sorozatában megtestesített információt, végül meg kell mondania, hol áll az automata író-olvasófeje a szalagon. Ezt a hármas információt egyetlen jelsorozattal is megadhatjuk. Írjuk le ugyanis a szalag tartalmát, és szúrjuk be ebbe a jelsorozatba az automata állapotát jelz, a szalagbeli szimbólumoktól természetesen eltér, szimbólumot. Ha most azzal a konvencióval élünk, hogy az automata író-olvasófeje mindig az állapotot jelz szimbólum jobboldali szomszédja felett áll, akkor ezzel az egyetlen jelsorozattal a teljes konfigurációt jellemezni tudtuk. Példaképpen, ha egy Turing-gép kezdállapota q0 és a bemeneti jelsorozat w, akkor az induló konfigurációt leíró jelsorozat q0 w amely nem csak a szalag tartalmát és az automata állapotát mondja meg, de azt az információt is közli, hogy az író-olvasófej a legels szimbólum felett van. Ennek alapján egy Turing-gép mködését konfigurációk sorozataként is megadhatjuk, ahol a konfigurációkat a nekik megfelel jelsorozatokkal fogjuk azonosítani. Egy ilyen konfigurációt jellemz jelsorozatból a következ konfiguráció jelsorozatát úgy kapjuk, hogy az olvasott szimbólum helyébe a felülíró szimbólumot írjuk, míg az új állapotnak megfelel szimbólumot ­ a mozgás irányától függen ­ az eredeti szimbólum helyétl eggyel jobbra vagy balra szúrjuk be. Erre a leírási módra gondolva a Turing-gép mködési szabályait felfoghatjuk úgy is, mint jelsorozatok átírására szolgáló szabályokat. Az eredeti és az új átírási szabályok között a megfeleltetés triviális. Az átírási szabályokra a grammatikák leírásánál alkalmazott jelöléseket használva: (q, a) = (p, b, r) qa bp (6.4.) (q, a) = (p, b, l) Xqa pXb (6.5.) ahol X tetszleges szalagbeli szimbólum, beleértve a szimbólumot is. Most, hogy a Turing-gép specifikációját grammatikai szabályokkal tudjuk megadni, vázolhatjuk a Turing-gép nyelvét generáló 0 osztályú nyelvtan szerkesztésének elvét. Elször is módosítsuk a Turing-gépet olymódon, hogy csak egyetlen elfogadó állapota legyen. Ennek megoldása nem okozhat gondot. Vezessünk be ugyanis egy új, elfogadó állapotot, és amikor az automata elfogadó állapotában

228

6.4. A Turing-gép és a 0-ás osztályú nyelvek

nincs mozgási szabály, tehát a gép megállna, tegyünk még egy lépést, és menjünk át az új elfogadó állapotba. Hogy ennél a lépésnél mivel írjuk felül az olvasott szimbólumot, és merre lépünk teljesen közömbös, az a lényeges, hogy az új elfogadó állapothoz nem tartozik mozgási szabály, vagyis az automata megáll. Ezzel a megoldással a régi állapotok átminsítését is megtakaríthatjuk, hiszen ezekben az állapotokban a Turing-gép sohasem fog megállni, így az állapotok hovatartozása ki sem derül. A mondatok generálása három részre osztható, és ennek megfelelen a nyelvtani szabályok is három részre partícionálhatóak. A nyelvtan elször egy a Turing-gép kezdeti konfigurációjának megfelel jelsorozatot generál. Ennek a jelsorozatnak az els szimbóluma természetesen a kezdállapot, de a bemeneti jelsorozat tetszleges, attól a nyilvánvaló megkötéstl eltekintve, hogy szimbólumai a alfabeta elemei lesznek. Ezt a funkciót megvalósító szabályok univerzálisak, vagyis függetlenek a leképezend Turing-gép specifikációjától. A következkben a kezdeti konfigurációból mint mondatszer formából kiindulva, a Turing-gép mozgását tükröz (6.4.) és (6.5.) típusú szabályok segítségével lépünk mondatszer formáról mondatszer formára. A mondatszer formáknak ez a sorozata lényegében a Turing-gép konfigurációinak sorozatát adja. A levezetésnek ez az a része, amely a leképezend automata specifikumától függ. Amennyiben a Turing-gép mködésének szimulálása során a gép elfogadó állapotban áll meg, akkor a bemenetként beadott jelsorozatot a gép elfogadta. A folyamat harmadik részének lefutására csak ebben az esetben kerül sor, tehát akkor, ha a bemenetet a Turing-gép elfogadta. A nyelvtan ilyenkor elállítja az eredeti jelsorozatot, mint a nyelv egy mondatát. Az ezt a célt szolgáló nyelvtani szabályok is univerzálisak, függetlenek a konkrét Turing-géptl. Ezen áttekinthet és világos módszer alkalmazásánál problémát okoz az a körülmény, hogy a Turing-gép mködésének szimulálásakor meg kell változtatnunk azt a jelsorozatot, amelyet késbb esetleg mondatként generálnunk kell. A megoldás kulcsa az, hogy a bemeneti jelsorozatot két példányban generáljuk. A szimuláció alkalmával csak az egyik példányt módosítjuk, a jelsorozat másik példánya változatlan marad. Így képesek leszünk, ha úgy hozza a sors, hogy az eredeti bemenetet rekonstruáljuk. Nyelvtanunk nemterminális szimbólumai így két részbl tevdnek össze. Lesznek a Turing-gép állapotát tükröz szimbólumok, és lesznek két-két szalagbeli jelet tartalmazók. Ezeken kívül lesz még néhány magától értetd funkciójú nemterminális is.

6. Az automataelmélet alapjai

229

A levezetési folyamat els fázisában csakis olyan nemterminálisokat használunk, amelyeknek két szimbóluma azonos. Ez felel meg annak, hogy a jelsorozatot két példányban generáljuk. A folyamat második részében a szimbólumpárok közül csak az egyik, mondjuk a jobboldali a mértékadó. A Turing-gép szimulálásakor ezek játszzák a konfiguráció szerepét, a baloldaliak megtartják értéküket. Ha sor kerül a folyamat harmadik részére, akkor az viszont csak a baloldali szimbólumokat érinti, hiszen azok alapján kell rekonstruálnunk az eredeti jelsorozatot. Most már felírhatóak a nyelvtani szabályok. Íme az els csoport S [, ] A1 A1 [, ] A1 q0 A2 A2 [x, x] A2 A3 x A3 [, ] A3 Itt q0 a kezdeti állapot, x pedig a alfabeta tetszleges eleme. Mint látható a kiindulási jelsorozat eltt és után bizonyos számú szimbólumot helyeztünk el. Az itt közölt nyelvtan ugyanis megköveteli, hogy a Turing-gép által igénybe vett szalag teljes hosszában szerepeljen a kiindulási mondatszer formában. Így célszer nagyvonalúan bánni a [, ] szimbólumok elhelyezésével. Amennyiben a Turing-gép lelépne a mondatszer formáról, a levezetés nem volna folytatható. Persze lehetne olyan, kissé bonyolultabb nyelvtant szerkeszteni, ahol nincs szükség elzetesen valamennyi, pontosabban hasra ütéssel becsült számú szimbólum generálására. A fenti szabályok valósítják meg a folyamat els részét, készen áll a Turing-gép induló konfigurációja. A Turing-gép mozgási szabályainak helyettesítési szabályokká való átírását, tekintettel a szimbólumpárokból alkotott nemterminálisokra, megismételjük: (q, a) = (p, b, r) q [x, a] [x, b] p (6.7.) (q, a) = (p, b, l) [y, Y] q [x, a] p[y, Y] [x, b] (6.8.) Itt x és y a alfabeta tetszleges eleme, míg Y tetszleges szalagbeli szimbólum. Az új szabályok, ha a szimbólumpárokban csak a jobboldali elemet nézzük, megegyeznek a korábban felírt szabályokkal. Ezeket a szabályokat alkalmazzuk a folyamat második részében, amikor a Turing-gép mködését szimuláljuk.

(6.6.)

230

6.4. A Turing-gép és a 0-ás osztályú nyelvek Az eredeti bemenet rekonstruálására a következ szabályok szolgálnak. q E A4 A4 A4 [x, Y] xA4 [x, Y] A4 A4 x (6.9.) A4 [, Y] A4 [, Y] A4 A4 A4

Itt qE a Turing-gép elfogadó állapota, x a alfabeta egy tetszleges eleme, míg Y a szalag tetszleges szimbóluma. Minden további magyarázat nélkül gondolom világos, hogy ezekkel a szabályokkal a nyelvtan kihámozza az eredeti bemenetet, és a felesleges sallangokat lenyesegeti. Így végül valóban az eredeti jelsorozatot állítja el mondatként. Ezzel a Turing-gépek és a 0-ás osztályú nyelvek ekvivalenciáját igazoltuk.

6.5. Lineárisan korlátos automata Rekurzíve felsorolható és rekurzív halmazok
A négy nyelvosztály közül három esetben már megtaláltuk a hozzá tartozó automataosztályt. A még hiányzó 1-es osztályú, vagyis környezetfügg nyelvekre ez a lineárisan korlátos automata. A lineárisan korlátos automata nagyon hasonlít a Turing-gépre. Van egy véges állapothalmaza, van egy író-olvasófejjel ellátott szalagja, a különbség csupán annyi, hogy a szalag korlátos, pontosabban olyan terjedelm, amilyen a bemeneti jelsorozat. A lineárisan korlátos automata tehát nem kalandozhat el a szalag szz területére ­ amely tulajdonképpen nem is létezik ­ illetve ha ezt mégis megkísérelné, akkor az automata megáll, és a bemenetet nem fogadja el. Ez a korlátozás nagyon természetesnek tnik, ha meggondoljuk, hogy az 1-es nyelvosztályt éppen a nem csökkentés jellemzi. Mindenekeltt igazoljuk a nem csökkent nyelvtanok és a lineárisan korlátos automaták ekvivalenciáját. Egy adott nem csökkent nyelvtanhoz a következképpen szerkeszthetünk egy lineárisan korlátos automatát. Alkalmazzunk az automatán olyan széles szalagot, amelyen egymás alatt két szimbólum is elfér. Induláskor a szalag fels felén helyezkedik el a bemeneti jelsorozat, a szalag alsó fele üres. Az automata ezután a szalag alsó felének els helyére beírja a mondatszimbólumot, majd a már ismert módon a mondatszer formákban levezetési szabályokat keresve, azok egyikét behelyettesíti. Így nemdeterminisztikus módon játssza le a nyelvtan levezetéseit.

6. Az automataelmélet alapjai

231

Mindezeket a mveleteket csak a szalag alsó felén végzi el, a szalag fels felének tartalma változatlan marad. A Turing-gép hasonló rendeltetés mködtetéséhez képest itt annyi a különbség, hogy törlésre soha sincs szükség csak beszúrásra, ugyanakkor ha a mondatszer forma kiszaladna a rendelkezésre álló szalag területrl, akkor az elemzés negatív eredménnyel leáll. Amennyiben a levezetés csupa terminálisból álló jelsorozatot eredményez, akkor azt összevetjük az eredeti bemenettel, és ha a két jelsorozat azonos, akkor elfogadó állapotban megállunk. Egyébként nem elfogadó állapotban maradunk. Az ily módon kialakított lineárisan korlátos automata a nyelvtan által generált nyelvet fogadja el. Az eddigiek alapján nem jelent problémát a másik irányú megfeleltetés sem. A Turing-gépnél alkalmazott megoldással itt is célt érünk. A lineárisan korlátos automatával egyenérték nyelvtan megszerkesztésénél csupán néhány dologra kell ügyelnünk. Elször is itt nincs szükség a bemenet körülbástyázására szimbólumokkal, hiszen az automata nem léphet szz területre. Bonyolultabbá teszi a megoldást az a körülmény, hogy a nyelvtan nem tartalmazhat -szabályokat, hiszen nem csökkent nyelvtanról van szó. Éppen ezért az állapot jelzésére használt szimbólumok nem szerepelhetnek külön nemterminális szimbólumként a nyelvtanban, mert nincs mód egy különálló szimbólum megsemmisítésére. A megoldás például az lehet, hogy az állapotot jelz szimbólumot az író-olvasófej alatti szimbólummal egyetlen nemterminálissá olvasztjuk össze. Ez viszont rontja az áttekinthetséget, ezért is nem éltünk ezzel a lehetséggel a Turing-gép tárgyalásánál. Hasonló okok miatt még néhány kisebb változtatásra van szükség a bemenet rekonstruálására szolgáló szabályoknál is. Ez után az elzetes magyarázkodás után minden további indoklást mellzve adjuk meg a nyelvtani szabályokat. S [x, q0 x] [x, q0 x] A1 A1 [x, x] [x, x] A1 [x, qa] [y, Y] [x, b] [y, pY] [y, Y] [x, qa] [y, pY] [x, b] [x, qEX] [x, A2] [y, Y] [x, A2] [y, A2] x [x, A2] [y, Y] x [y, A2] [x, A2] x x

(q, a) = (p, b, r) (q, a) = (p, b, l)

(6.10.)

Ezzel igazoltuk a lineárisan korlátos automaták és a nem csökkent, vagyis az 1-es nyelvosztályba tartozó nyelvtanok ekvivalenciáját.

232 6.5. Lineárisan korlátos automata - Rekurzíve felsorolható és rekurzív halmazok Azokat a gondolatkísérleteket, amelyeket a Turing-géppel annak idején elvégeztünk, megtehetjük a lineárisan korlátos automatával is. Az automata leírását és a bemeneti jelsorozatot itt is elállíthatjuk ugyanabban a kódban. Persze a lineárisan korlátos automaták száma is megszámlálhatóan végtelen, mint volt a Turing-gépeké. A lineárisan korlátos automaták halmaza természetesen a Turing-gépek halmazának valódi részhalmaza. Mivel a lineárisan korlátos automaták megszámolhatóak, itt is adhatunk minden ilyen automatának egy sorszámot. Most is megvizsgálhatjuk, hogy az automata elfogadja-e saját leírását. Nyilván lesznek, amelyek elfogadják, és lesznek olyanok, amelyek nem. Így a lineárisan korlátos automaták leírásait itt is két halmazba sorolhatjuk aszerint, hogy elfogadják, vagy visszautasítják saját specifikációjukat. Az így kialakított két nyelvet jelölje L11 és L12. Az els index a nyelvosztályra utal. Emlékezzünk arra a gondolatmenetre, amelynek segítségével beláttuk, hogy a saját specifikációjukat visszautasító Turing-gépek leírásából alkotott nyelv nem lehet egy Turing-gép nyelve. Ezt az érvelést szóról szóra megismételve juthatunk arra a következtetésre, hogy az L12 nyelv, a saját leírásukat visszautasító lineárisan korlátos automaták specifikációinak halmaza nem lehet egy lineárisan korlátos automata nyelve. Turing-gép azonban készíthet erre a nyelvre. Emlékeztetek arra, hogy korábbi eredményünk szerint a tartalmazás problémája az 1-es nyelvosztályra nézve algoritmizálható, vagyis véges sok lépésben megoldható feladat. Ezen túlmenen vegyük figyelembe, hogy a lineárisan korlátos automaták szituációinak száma, egy konkrét jelsorozat elemzésekor korlátos. Így ha egy ilyen automata ,,ügyetlen" konstrukciója következtében végtelen ciklusba kerülne, az detektálható. Ebbl következik, hogy minden lineárisan korlátos automatához szerkeszthet egy vele egyenérték olyan automata, amely minden bemenetre megáll. Amennyiben az univerzális Turing-géppel szimuláljuk a lineárisan korlátos automatákat, illetve azok minden bemenetre megálló egyenértékeseit, akkor az univerzális Turing-gép is minden esetben meg fog állni, természetesen abban az esetben is, ha bemenetére a saját leírásukat adjuk. Ha most a megálláskor érvényes állapotot változatlanul hagyjuk, akkor gépünk éppen az L11 nyelvet fogadja el. Változtassuk meg azonban a megállási állapot értelmét, és akkor fogadjunk el, ha a szimulált automata visszautasít, és fordítva, akkor a gép nyelve az L12 nyelv lesz. Persze ugyanúgy, mint a Turing-gép esetében, itt is elzetesen ki kell szrnünk azokat a jelsorozatokat, amelyek nem lineárisan korlátos automata leírásai.

6. Az automataelmélet alapjai

233

A halmazelméletben rekurzíve felsorolható halmaznak nevezik az olyan halmazokat, amelyek elemeit valamilyen algoritmus segítségével rendre fel lehet sorolni. A generatív nyelvek rekurzíve felsorolható halmazok. Ezt azonnal beláthatjuk, hiszen a felsorolást szolgáltató algoritmust már kialakítottuk. Amikor ugyanis a 0-ás osztályú nyelvtanhoz szerkesztettünk Turing-gépet, akkor elbb levezettük a mondatszimbólumból egy lépésben levezethet mondatszer formákat, majd az ezekbl egy lépésben, tehát a mondatszimbólumból két lépésben levezetheteket, és így tovább. A levezetés során adódnak olyan mondatszer formák, amelyek csakis terminális szimbólumokat tartalmaznak. Ezek a mondatok. Ez adja a felsorolást. Minthogy egy generatív nyelv valamennyi mondata véges számú lépésben levezethet, ezzel a módszerrel a nyelv összes mondatát, a halmaz minden elemét felsoroljuk. Természetesen csak legfeljebb megszámlálhatóan végtelen számosságú halmaz lehet rekurzíve felsorolható. Rekurzív az olyan halmaz, ahol nem csak a halmaz, hanem komplemense is rekurzíve felsorolható. A definícióból következik, hogy ez esetben mindkét halmaz, az eredeti is meg a komplemense is rekurzív. Rekurzív halmazoknál a tartalmazás feladata mindig algoritmizálható. Soroljuk fel ugyanis felváltva a halmaznak és a halmaz komplemensének elemeit. Ha most arra vagyunk kíváncsiak, hogy az univerzum egy eleme eleme-e a halmaznak, akkor meg kell várnunk, amíg ebben a felsorolásban ez az elem el nem fordul. Ha mint a halmaz eleme került el, akkor a vizsgált elem beletartozik a halmazba, ha viszont a komplemens elemeként, akkor a válasz nemleges. Abban biztosak lehetünk, hogy a kérdésre választ kapunk. A halmaz elemeit ugyan itt is fel tudjuk sorolni, de akkor nem tudhatjuk, hogy azért hiányzik, mert nincs benne a halmazban, vagy azért, mert még nem jutottunk el a felsorolásban a keresett elemhez. Az 1-es nyelvosztály nyelvei rekurzív halmazok. Ugyanakkor azt is tudjuk, hogy a 0-ás nyelvosztály nyelvének mondatai felsorolhatók, vagyis ezek a nyelvek legalábbis rekurzíve felsorolhatók. Kérdés, vajon bvebb-e a rekurzív halmazok osztálya az 1-es nyelvosztály nyelveinél? Van-e olyan ­ szükségképpen 0-ás nyelvosztályba tartozó nyelv, amelyik rekurzív, és nem csupán rekurzíve felsorolható. A válasz pozitív. Az imént definiált L12 nyelv, amelyrl beláttuk, hogy nem fogadható el egy lineárisan korlátos automatával, rekurzív, hiszen komplemense is rekurzív. Uggyanakkor az L01 nyelv, amely a saját leírásukat elfogadó Turinggépek specifikációit tartalmazza, és amelyre Turing-gépet szerkesztettünk, tehát

234 6.5. Lineárisan korlátos automata - Rekurzíve felsorolható és rekurzív halmazok 0 osztályú nyelv, csak rekurzíve felsorolható. Amennyiben ugyanis a nyelv rekurzív lenne, akkor arra a bizonyos ominózus L02 nyelvre is lehetne Turinggépet készíteni. A rekurzív halmazok határa így valahol a 0-ás nyelvosztály tartományán belül halad, és természetesen teljes mértékben magába foglalja az 1-es nyelvosztályt.

6.6. A számítástechnikai nyelvészet algoritmikusan eldönthetetlen feladatairól
Az els olyan probléma, amelyrl beláttuk, hogy algoritmikusan eldönthetetlen a Turing-gép megállási problémája volt. Kiderült ugyanis, hogy amennyiben létezne erre a kérdésre algoritmus, akkor egy korábban már megoldhatatlannak bizonyult feladatra is volna megoldás, nevezetesen az L02 nyelvre szerkeszthetnénk Turinggépet. Ebbl az ellentmondásból következett, hogy a Turing-gép megállási problémája szükségszeren algoritmikusan eldönthetetlen kérdés. A számítástechnikában egy sereg nagyon kézenfekv, és a gyakorlat szempontjából nagyon fontos feladatról derült ki, hogy algoritmikusan eldönthetetlen. Az algoritmikus eldönthetetlenség tényét rendszerint indirekt bizonyítással igazoljuk. Kimutatjuk, ha létezne az adott feladatra algoritmus, akkor egy másik korábban más okokból algoritmikusan eldönthetetlennek bizonyult feladatra is volna algoritmus. Az alábbiakban egy sor problémáról fogjuk belátni, hogy algoritmikusan eldönthetetlen. Kezdjük a Post problémával. Post problémáját még a Turing-gép bevezetésekor, tehát 1936-ban fogalmazta meg, és mutatta ki, hogy az algoritmikusan eldönthetetlen. Els látásra a Post probléma kissé hajánál fogva elráncigált problémának tnik, de mint látni fogjuk, segítségével sok más, gyakorlati szempontból fontos és lényeges feladatról lehet kimutatni, hogy algoritmikusan eldönthetetlen. Post problémája a következ: Legyen adott valamely alfabeta, és legyen (xi, yi) ezen alfabeta szimbólumaiból alkotott jelsorozatpárok véges halmaza. A kérdés a következ: összeállítható-e ezen jelsorozatpárok mondjuk baloldali elemeibl konkatenációval, vagyis egymás után írással olyan ered jelsorozat, amelyben minden elemet jobboldali párjával kicserélve ugyanazt a jelsorozatot kapjuk. Az ered jelsorozat kialakításánál teljes szabadságunk van, egyes elemeket megismételhetünk, másokat meg kihagyhatunk a felsorolásból. (6.11.)

6. Az automataelmélet alapjai

235

Amennyiben ez lehetséges, vagyis sikerül az xi elemekbl egy olyan sorozatot összehozni, hogy a megfelel yi elemek ugyanazt a sorozatot adják, akkor az adott Post problémának van megoldása, ha ez lehetetlen, akkor nincsen. Ahogy az ilyenkor lenni szokott, egyes Post problémáknak van megoldása, másoknak meg nincsen. Lássunk egy példát a Post problémára. Legyen négy jelsorozatpárunk: x y 1 101 1 110 101 1 110 011 Ennek a Post problémának van megoldása. Ha ugyanis az indexek sorrendjét a 34123 sorozatnak megfelelen választjuk, akkor akár a baloldalakból, akár a jobboldalakból állítjuk is össze az ered jelsorozatot, ugyanazt kapjuk. Valóban x3x4x1x2x3 = y3y4y1y2y3 = 10111011101 Az alábbi Post problémának viszont nincs megoldása. Ezt azonnal beláthatjuk, ha meggondoljuk, hogy már az els elemet sem tudjuk úgy kiválasztani, hogy a két sorozat azonosan kezddjék: x y 10 01 110 010 00 111 Ebben a két esetben a megoldhatóság illetve megoldhatatlanság mintegy ránézésre eldönthet volt. Vajon létezik-e algoritmus, amely általános esetben, tehát tetszleges Post probléma esetében képes választ adni erre a kérdésre. Bizonyára nem hat a meglepetés erejével az az állítás, hogy ilyen algoritmus nem létezik, a Post probléma algoritmikusan eldönthetetlen feladat. Ezt a megállapításunkat az alábbiakban bebizonyítjuk. Elöljáróban egy újabb feladatot definiálunk, amelyet súlyosbított Post problémának nevezhetünk. Ez egy olyan Post probléma, ahol még azt is kikötjük, hogy melyik párral kezddjék az ered jelsorozat. Els pillanatra úgy tnik, hogy ezzel egy új, az eredeti Post problémánál nehezebben megoldható feladatosztályt hoztunk létre. A valóságban nem ez a helyzet. Minden súlyosbított Post problémához szerkeszthet ugyanis egy egyszer, tehát nem súlyosbított, de az eredetivel egyenérték Post probléma. Az egyenértékség jelen esetben azt jelenti, hogy az egyszer Post problémának akkor, és csakis akkor van megoldása, ha a súlyosbítottnak is van. Vezessünk be ugyanis két új szimbólumot. Legyenek ezek # és &. Szúrjuk be az els szimbólumot a baloldali elemeknél minden szimbólum elé, a jobboldaliaknál minden szimbólum után.

236 6.6. A számítástechnikai nyelvészet algoritmikusan eldönthetetlen feladatairól Ezen kívül egészítsük ki a problémát két új párral. Az egyik a súlyosbítás tárgyát képez, vagyis a kezdésül kijelölt párból keletkezik az elbbi módon, de azzal az eltéréssel, hogy itt mind a baloldali, mind a jobboldali elem az új els szimbólummal kezddik. A másik új pár a sorozat lezárására szolgál. Tételezzük fel, hogy az els példánkban szerepl Post problémát azzal súlyosbítottuk, hogy a harmadik párt jelöltük ki kezd párként. Az ehhez a súlyosbított Post problémához tartozó egyszer Post probléma a következ lesz: x y #1 1#0#1# #1 1#1#0# #1#0#1 1# #1#1#0 0#1#1# #1#0#1 #1# #& & Az egyenértékség nem igényel magyarázatot. Egyetlen olyan pár van, amelyik ugyanazzal a szimbólummal kezddik, és ez éppen a kezdésre kijelölt pár. Így ­ tetszik, nem tetszik ­ csakis ezzel az elempárral kezdhetünk. A továbbiakban a keresést nem befolyásolja, hogy az eredeti, súlyosbított probléma jelsorozataihoz képest itt a szimbólumok között mindig van egy # szimbólum. Amikor az eredeti probléma megoldásához érünk, akkor itt a két jelsorozat között egy # szimbólumnyi különbség van. Ennek pótlására hivatott az utolsó elempár. A fenti eredmények birtokában az általánosság csorbítása nélkül használhatunk a jövben súlyosbított Post problémát. A Post probléma algoritmikus eldönthetetlenségét a következ gondolatmenet alapján bizonyítjuk. Legyen adott egy tetszleges Turing-gép, és annak valamilyen tetszleges bemenete. Ehhez a tetszleges Turing-géphez, és tetszleges bemenethez szerkesszünk egy olyan Post problémát, amely a Turing-gép mozgása során felvett konfigurációk leírásának sorozatát tartalmazza. Ennek az adott Turing-géphez és adott bemenethez illesztett Post problémának akkor és csak akkor van megoldása, ha a Turing-gép megáll. Amennyiben a Post problémáról el tudnánk dönteni, hogy van-e megoldása vagy nincsen, akkor ezzel együtt azt is eldöntjük, hogy a Turing-gép az adott bemenetre megáll-e vagy sem. Minthogy az ismertetend eljárással bármely Turing-gépre és bármely bemenetre szerkeszthetünk egy illeszked Post problémát, ha létezne algoritmus a Post problémára, akkor a Turing-gép megállási problémájára készíthetnénk algoritmust.

6. Az automataelmélet alapjai

237

A tetszleges Turing-géppel szemben támasszuk az alábbi speciális követelményeket. A csak két olyan állapota legyen, amelyben megáll, egy elfogadó qE és egy visszautasító qN. Ezekben az állapotokban viszont már ne végezzen mozgást. Ha valamelyik Turing-gép eredetileg nem teljesítené a fenti feltételeket, mint ismeretes, könnyen szerkeszthetünk egy vele egyenérték olyan automatát, amely már tudja ezeket a követelményeket. Így, bár nem illend egy tetszleges automatával szemben bármilyen követelményt támasztani, ez a feltétel az automata általános voltát nem csorbítja. A Post probléma jelsorozatpárjai három csoportra oszthatóak. Az els csoportba azok az elempárok tartoznak, amelyek biztosítják a konfigurációk sorozatos leírását. Ezen elempárok alakja független a Turing-gép mozgási szabályaitól. Az elempárok másik része éppen a Turing-gép mozgási szabályait tükrözi. A harmadik csoportba tartozó elempárok alkalmazására akkor kerül sor, amikor a mozgásban követett Turing-gép megállt. Feladatuk, hogy ebben az esetben biztosítsák a Post probléma megoldását. Funkciójuk hasonló ahhoz, amikor egy sakkozó már nyert állást ért el, de hátra van még a lebonyolítás, a szerzett elny érvényesítése. A Post probléma alfabetája bvebb, mint a Turing-gép szalagjáé. Ezen az alfabetán kívül tartalmazza az állapotok leírására szolgáló szimbólumokat, valamint még egy elválasztójelet, legyen ez #, végül egy, a megoldás kialakításában fontos szerepet játszó szimbólumot. Legyen ez &. Az els csoportba három elempár típus tartozik: x y # #q0w# X X X # # Mint említettük, egy súlyosbított Post problémát szerkesztünk. Az els elempár éppen a súlyosbító körülményt jelenti, ez a kezdésre kijelölt elempár. Az elempár jobboldali eleme egy kezd konfiguráció, míg baloldala gyakorlatilag üres. A további két elempárcsoport lehetvé teszi a Turing-gép szalagján található szimbólumok meg az elválasztó jel másolását. Vegyük észre, hogy a Turing-gép állapotainak jelzésére használt szimbólumok ezen szabályok segítségével nem másolhatóak. Ez utóbbi szimbólumokat a Turing-gép mozgási szabályait tükröz második csoportbeli elempárok kezelik. Ezek az elempárok ,,illesztik" a Post problémát az adott Turing-géphez.

238 6.6. A számítástechnikai nyelvészet algoritmikusan eldönthetetlen feladatairól A kétféle, jobbra illetve balra lép szabálytípusnak két-két elempártípus felel meg. Legyenek az ismert mozgási szabályok: (q, a) = (p, b, r) (q, a) = (p, b, l) Ezeknek a mozgási szabályoknak a következ elempárok felelnek meg: x y qaX bpX qa# bp# Xqa pXb #qa #pb ahol - X tetszleges szalagbeli szimbólum. Természetesen itt is elempárok halmazáról van szó, hiszen minden mozgási szabályhoz tartozik egy elempárketts. A második és negyedeik szabálytípus arra szolgál, hogy a Turing-gép író-olvasófeje ne fusson le a szalagról. Az adott kezdés mellett csak akkor reménykedhetünk abban, hogy a Post problémát megoldjuk, ha ezt a kezd konfigurációt ­ mintegy futva a pénzünk után ­ beírjuk a baloldali elemek által generált jelsorozatba is. A szalag szimbólumait és az elválasztó jelet egyszeren átmásolhatjuk. Az állapotnak megfelel szimbólumot viszont csakis a második csoport elempárjaival tudjuk átírni. Azt hiszem további magyarázat nélkül is érzékelhet, hogy amikor nagy gonddal beírjuk a baloldalra a jobboldalon szerepl konfigurációt, akkor a jobboldalon a Turing-gép új, következ konfigurációja generálódik. A Post probléma megoldását keresve persze ezt a konfigurációt is le kell másolnunk, és így kerül a Post probléma jelsorozatába mindig újabb és újabb konfiguráció. Ez a folyamat, ha a Turing-gép nem áll meg, vég nélkül folytatódik. Más a helyzet, ha a Turing-gép akár a qE elfogadó, akár a qN visszautasító állapotban megáll. Ekkor kerül sor a harmadik elempár csoport felhasználására. x y & qE qN & &X & X& & &## # Els lépésben az állapotot jelz szimbólum helyébe egy új, a szimbólumok törlésére hivatott & szimbólum kerül. A megállás pillanatában ugyanis a jobboldali jelsorozat egy teljes konfigurációval ,,vezet" a baloldali eltt.

6. Az automataelmélet alapjai

239

Nos a törl szimbólum minden egyes másolásnál egy szimbólummal lerövidíti az eredeti konfiguráció leírását. A végén az egész konfigurációból már csak a törl szimbólum marad. Ekkor alkalmazhatjuk az utolsó elempárt, amely behozza a baloldal lemaradását. Így végül is sikerült a Post problémára egy megoldást összehoznunk, persze akkor és csakis akkor, ha a Turing-gép megáll. Ezzel egy olyan Post problémát konstruáltunk, amelynek megoldási feladata nyilván algoritmikusan eldönthetetlen, hiszen ellenkez esetben a Turing-gép megállási problémáját is el tudnánk dönteni. Ebbl következik, hogy a Post probléma megoldási feladata általánosságban algoritmikusan eldönthetetlen. Egyes konkrét Post problémák esetében persze ­ mint láttuk ­ adhatunk választ, éppúgy, mint egyes Turing-gépek megállását is el tudtuk dönteni. Mint említettem, maga a Post probléma számítástechnikai szempontból nem túl izgalmas kérdés. Segítségével azonban egy sor nagyon is húsbavágó feladat eldönthetetlenségét tudjuk tisztázni. Lássunk rögtön egy alapvet problémát. Az a kérdés, hogy egy környezetfüggetlen nyelv egyértelm-e algoritmikusan eldönthetetlen. Legyen adott egy tetszleges Post probléma: (xi, yi) Legyen CF nyelvtanunk a következ: SXY X xiX i xi i Y yjY j yj j Itt i és j a Post probléma indexhalmazának elemei, míg xi és yj a Post probléma megfelel jelsorozatai. Itt persze megköveteljük, hogy az indexhalmaz és a Post probléma alfabetája diszjunkt legyen. Könnyen belátható, hogy a nyelvtan a Post probléma baloldali illetve jobboldali jelsorozatait generálja, hozzáfzve a választott elemek indexeit fordított sorrendben. Nyilvánvaló, hogy a nyelvnek csak akkor lehet olyan mondata, amelynek két lényegesen különböz levezetése, vagyis különböz levezetési fája van, ha a Post probléma megoldható. Ekkor ugyanis a baloldali és jobb oldali elemeken alapuló levezetés ugyanazt a jelsorozatot, mondatot eredményezi. Annak érdekében, hogy az adott nyelvtan egyértelm voltát megállapíthassuk, az alapul szolgáló Post probléma megoldhatóságát kell megmondanunk. Ez viszont algoritmikusan elédönthetetlen. Hasonlóan nem dönthet el, hogy egy CF nyelvtan generálja-e a * teljes univerzumot.

240 6.6. A számítástechnikai nyelvészet algoritmikusan eldönthetetlen feladatairól A feladatot ismét a Post problémára vezetjük vissza. Definiáljunk a Post probléma alapján két nyelvet az alábbi nyelvtanokkal: S xiS i xi i LX LY S jSyj-1 jyj-1 A -1 hatványkitev ­ mint korábban ­ az inverzet, vagyis a fordított sorrend jelsorozatot jelöli. A konstrukció hasonlít az elbbihez, itt is az elemek és indexeik szerepelnek. A különbség csupán annyi, hogy míg a baloldali elemeknél elbb jönnek az elemek és utána az indexek, addig a jobboldali elemeknél a sorrend minden tekintetben fordított. Definiáljunk további két nyelvet: LP = LXcLY LQ = wcw-1 Az LP nyelv mondatai így a Post probléma baloldali elemeibl és indexeibl, illetve a jobboldali elemek indexeibl és az elemek inverzeibl alkotott jelsorozatok, ahol a két komponenst egy c szimbólum választ el. Itt nem követelmény, hogy a baloldali, illetve jobboldali elemek ugyanahhoz az indexhez tartozzanak, st az is lehetséges, hogy baloldalon és jobboldalon az elemek száma sem azonos. Az LQ nyelvben w tetszleges jelsorozat, amelynek alfabetája a Post probléma alfabetájának és az indexek jelkészletének uniója. A jelsorozatot és inverzét itt is a c szimbólum választja el. Itt biztosak lehetünk abban, hogy a c szimbólumtól balra és jobbra es sorozatok egymásnak tükörképei. További magyarázat nélkül belátható, hogy mind az LP, mind az LQ nyelv determinisztikus környezetfüggetlen nyelv. Ebbl következen negáltjaik is determinisztikus környezetfüggetlen nyelvek lesznek. St emiatt negáltjaik uniója is környezetfüggetlen nyelv lesz: ­ ­ L R = LP LQ A negáltak uniója azonban a de Morgan összefüggések alapján nem más, mint a metszet negáltja. Gondoljuk csak át, mit tartalmaz a fenti két nyelv, LP és LQ metszete. Az LP nyelv definíciója szerint a baloldal a Post probléma valamelyik baloldali jelsorozatából, és a hozzátartozó indexekbl áll, míg a jobboldal ugyanannak a Post problémának szintén valamelyik, esetleg ugyanahhoz az indexsorozathoz tartozó jobboldali jelsorozat és a neki megfelel indexsorozat, azzal az eltéréssel, hogy itt a sorrend fordított. Az LQ nyelv definíciója szerint viszont a mondat baloldal és jobboldala egymás tükörképe. Amennyiben egy mondat mindkét nyelvben elfordul, vagyis eleme a két nyelv metszetének, akkor az elbbiek szerint ez csakis a Post probléma megoldása lehet.

6. Az automataelmélet alapjai

241

Amennyiben a Post problémának nincs megoldása, akkor a két nyelv metszete üres, így negáltja a teljes univerzum. Így az _ _ ______ LR = LP L Q = LP LQ nyelvtana attól függen generálja vagy nem generálja a teljes univerzumot, hogy a Post problémának van-e megoldása vagy nincsen. Ez utóbbi azonban nem dönthet el. Egy másik lényeges, de sajnos algoritmikusan eldönthetetlen feladat: Adott két környezetfüggetlen nyelvtan, kérdés ugyanazt a nyelvet generálják-e. Ennek a feladatnak egy szigorúbb változata is igaz, nevezetesen ha az egyik nyelvtan reguláris, akkor sem lehet erre a kérdésre választ adni. Az igazolást tulajdonképpen már el is végeztük, hiszen mi sem egyszerbb, mint a teljes univerzumot generáló reguláris nyelvtant szerkeszteni. Íme: S xS x ahol - az x alfabeta tetszleges szimbóluma. Miután errl a nyelvtanról tudjuk, hogy a teljes univerzumot generálja, összevetve ezt azzal az elbbi nyelvtannal, amely vagy generálja, vagy sem az univerzumot, állításunkat igazoltuk.

Szószedet
acceptance by empty stack acceptance by final state accepting state algorithm alphabet ambiguous grammar automaton Baar­Hillel lemma Backus­Naur form Backus­Naur notation bottom-up BNF Bounded Right Context characterizing CF Chomsky language classes Chomsky normal form Church thesis closure CNF Coke­Younger­Kasami method complement computational linguistics concatenation configuration containment context free üres veremmel elfogadó állapottal elfogadó elfogadó állapot algoritmus alfabeta, ábécé többértelm nyelvtan automata pumping lemma Backus­Naur jelölés Backus­Naur jelölés alulról felfelé Backus­Naur form BRC jellemz context free Chomsky-féle nyelvosztályok Chomsky normálalak, Chomsky normálforma Church tézis, Church tétel zártság Chomsky normal form Coke­Younger­Kasami módszer komplemens, kiegészít számítástechnikai nyelvészet konkatenáció, egymás után fzés konfiguráció tartalmazás környezetfüggetlen

244 context sensitive CS counter machine deterministic finite automaton deterministic push-down automaton DFA distinguishable states DPDA Earley algorithm empty language empty stack empty string FA final state finite (state) automaton finite (state) transducer FSA FST FT grammar Greibach normal form GNF halting of a Turing-machine homomorphism initial state intersection Kleene closure LBA környezetfügg context sensitive számláló automata determinisztikus véges automata determinisztikus veremautomata deterministic finite automaton megkülönböztethet állapotok deterministic push-down automaton Earley algoritmus üres nyelv üres verem üres jelsorozat empty string finite (state) automaton elfogadó állapot véges (állapotú) automata véges (állapotú) fordító finite (state) automaton finite (state) transducer finite (state) transducer nyelvtan Greibach normálalak Greibach normal form a Turing gép megállási problémája homomorfizmus kezdállapot metszet transitive closure linear bounded automaton

Szószedet

Szószedet leaf leftmost derivation linear bounded automaton minimal automaton NFA NFSA nondeterministic finite (state) automaton nondeterministic push-down automaton nonterminal symbol NPDA palindrome parser PDA Polish notation Post problem push-down automaton procedure proper grammar pumping lemma recursive language regular expression regular language rightmost derivation sentence sentential form sink state string levél baloldali levezetés lineárisan korlátos automata empty string minimálautomata nondeterministic finite (state) automaton nondeterministic finite (state) automaton nemdeterminisztikus véges automata nemdeterminisztikus veremautomata nemterminális szimbólum, nyelvtani szimbólum nondeterministic push-down automaton palindróma, palindrom szintaktikus elemz push-down automaton lengyel jelölés Post probléma veremautomata procedúra, eljárás jólfésült nyelvtan pumpálási lemma rekurzív nyelv reguláris kifejezés reguláris nyelv jobboldali levezetés mondat mondatszer forma csapdaállapot jelsorozat, karakterfüzér

245

recursively enumerable language rekurzíve felsorolható nyelv

246 substate substitution terminal symbol TM Trap Turing-machine universal Turing-machine UTM useless symbol wcw ww
-1 -1

Szószedet alállapot helyettesítés terminális szimbólum Turing-machine csapdaállapot Turing-gép univerzális Turing-gép universal Turing-machine felesleges szimbólum palindrome palindrome

Név- és tárgymutató
0-ás nyelvosztály, generatív nyelv 1-es nyelvosztály, környezetfügg nyelv 2-es nyelvosztály, környezetfüggetlen nyelv 3-as nyelvosztály, reguláris nyelv ábécé, alfabeta alállapot, 132-133 Alfabeta, 13-14, 29, 40, 57-58, 71, 103, 104, 111, 114, 121, 130, 137-138, 140, 148-152, 154, 215-217, 222, 228-229, 230, 234, 237 algoritmikus eldönthetetlenség, 24-25, 83-84, 189, 210, 224, 234-241 algoritmus, 23-26, 39, 41, 50, 56, 60, 69, 74, 84, 93, 99-100, 111, 115, 119, 128-129, 141, 182, 184, 210-211, 222-223, 233-236 állapotekvivalencia, 45-49 állapottal elfogadó, veremautomata állapottér, 29, 40-41, 53, 64, 111-112, 131, 136, 142, 204, 212, 214 alulról felfelé elemzés, jobbelemzés automata minimál~, 43-49, 56, 99, 199 normál ~, 204 Backus­Naur alak, Backus­Naur jelölés Backus­Naur jelölés, 18 balelemezhet, 165-167, 172-174, 179 ersen ~, 173, 179 gyengén ~, 179 balelemzés, 146, 147, 162, 163, 165, 166, 167-182, 184, 202 baloldali levezetés, 82, 115, 117, 119, 146, 147, 162, 165 balreguláris, 21, 35-37, 61, 85 balrekurzivitás, 96-100, 161, 172, 181, 186, 202 bottom-up levezetés, jobbelemzés BRC elemzk, 199-200, 205 CF nyelv környezetfüggetlen nyelv determinisztikus ~, determinisztikus ~ CF nyelvtan, környezetfüggetlen nyelvtan Chomsky normálforma, Chomsky normálalak Chomsky normálalak, 95-96, 98, 162-165 Chomsky, Noam, 11, 202 Chomsky-féle nyelvosztályok, 20-23 Church tétele, Church tézis Church-tézis, 210, 213, 221, 224 ciklicitás, 93, 94

248 Coke­Younger­Kasami módszer, 157, 162-167 CS nyelv, környezetfügg nyelv csapdaállapot, 43, 53, 56, 129-131 de Morgan azonosság, 63, 134, 240 determinisztikus elemzés, 165-166, 203, 204, 240

Név- és tárgymutató

Earley algoritmus, 157-162, 184-185, 56, 59, egyértelm nyelvtan, 82-85, 103, 157, 161, 162, 164 egyszeres szabályok, 65, 126 ~ kiküszöbölése, 66, 92-95, 127 ekvivalenciaosztályok, 44-46, 48, 188 életképes prefix(um), 184-186, 188-189, 191 elfogadó állapot, 18, 30,-38, 40, 42, 44, 46-47, 51, 54, 56, 59,-60, 62, 64, 66-69, 71, 75, 77, 103, 105-107, 109-110, 130, 132-133, 138, 143, 154, 203, 207-208, 218-220, 222-223, 226-228, 230-231, 237 eljárás procedúra , üres jelsorozat (levezetési) szabály, 30-32, 37, 65, 67-68, 73, 76, 94, 96, 98, 171, 173, 181-182, 192, 203, 231 ~ kiküszöbölése, 32-35, 68, 78, 90, 92 mozgási szabályok, 32-35, 75-78, 104-106, 108, 113-114, 121-122, 129-131, 136, 144, 150, 203-204, 215 nyíl, mozgási szabályok felesleges szimbólumok kiküszöbölése, 86-89, 94, 123, 125 FIRST függvény, 168-171, 175, 176, 182, 183 FOLLOW függvény, 170-171, 173-177, 179, 180, 185-188 generatív nyelv, 20, 21-22, 25, 221, 222, 233-234 grammatika, 14-15 grammatikai szimbólum, nemterminális szimbólum Greibach normálalak, 96, 98-101, 181 helyettesítési szabály, levezetési szabály homomorfizmus, 151-155 i ekvivalencia, 45, 46 induló állapot, kezdállapot infix jelölés, 145-146, 150, 194, 200, 203 Item, 157 jelentéstan, szemantika jellemz nyelvtan, 151-157 szigorúan ~, 152-153

Név- és tárgymutató jobbelemzés, 115, 147, 157, 163, 182-189, 200, 202 egyszersített ~, 189-202 jobblevezetés, jobbelemzés jobboldali elemzés, 82, 115-118, 147, 148, 166, 183, 184, 190, 193, 195, 199, 229, 236, 240 jobboldali levezetés, jobboldali elemzés jobbreguláris, 21, 35, 37, 85 jólfésült nyelvtan, 94, 95, 96, 98, 100

249

karakterfüzér, jelsorozat ketts pumpálás, 126-128 kezdállapot, 26, 29, 31-36, 40, 41, 44, 48, 51, 54, 60, 61, 63, 64, 66-69, 74-77, 78, 103, 106, 107, 110, 124, 136, 153, 208, 212, 215, 218, 227, 228 kiegészít, komplemens kiinduló állapot, kezdállapot komplemens, 57, 59, 60, 63, 128, 129, 132-134, 233 konfiguráció, 30-31, 53, 55, 91, 106-108, 118, 170, 191, 201, 226-229, 236-239 konkatenáció, 57-58, 65-57, 71, 74, 76, 134, 135, 171, 234 konkatenált, konkatenáció környezetfüggetlen nyelv(tan), 21, 23, 79, 83, 86, 90, 91, 94, 96, 98, 100, 102, 114, 115, 117, 119, 123, 126, 128, 129, 133, 135, 136, 139, 142, 144, 150, 153, 154, 162, 181, 200, 203, 205, 206, 220, 221, 239, 240, 241 környezetfügg nyelv(tan), 21-22, 24, 90, 91, 230-234 követ nyelv, FOLLOW(k) lengyel jelölés hátsó ~, postfix ~145, 150, 186, 189, 203 prefix ~, 145, 169, 192, 203 levél, 81, 126 levezetési fa, 79-85, 126-128, 139, 147, 157, 163 levezetési szabály, 15-22, 26, 29, 32-34, 38, 61, 62, 63, 65, 67-68, 74, 79, 86-89, 91, 92, 95-102, 115-117, 120-126, 128, 133, 135, 144, 146, 147, 154, 155, 158-160, 162, 163, 166, 167, 169, 170, 172, 173, 175, 180-188, 190, 191, 193-201, 224-226, 229, 230 lineárisan korlátos automata, 230-234 LL(k) nyelvek, 181 203, 206 LL(k) nyelvtanok, 167-182, 202, 203 ers ~, 171, 179 gyenge ~, 176 LR(k) nyelvtanok, 182-189, 202 matematikai nyelvészet, 20, 22, 26, 50, 76, 83, 207 megkülönböztethet állapotok, 48 metszet, 57, 63, 64, 133, 134, 135, 169, 240, 241

250

Név- és tárgymutató

mondat, 13-20, 24, 33, 34, 35, 43, 57, 58, 60, 61, 63, 65, 67, 69, 70, 71, 80-86, 88-93, 98, 106, 107-109, 115-118, 120, 121, 123, 124, 126- 128, 133, 135, 137, 141, 142, 144-147, 152, 153, 157, 159-166, 169, 170, 172, 174, 177, 179, 181-183, 185, 186, 189, 191, 202, 203, 205, 221-226, 228-230, 233, 239, 240 mondatszer forma, 15, 16, 18, 25, 32, 33, 34, 61, 65, 67, 79, 80, 82, 83, 85-90, 93, 98, 115-120, 123, 124, 135, 144, 146, 147, 157, 168, 172, 173, 175, 176, 184, 185, 190, 194, 195, 225, 226, 228, 229, 231, 233 mondatszimbólum, 15, 16, 17, 32, 33, 35, 61, 62, 63, 65, 68, 74, 79, 84, 87, 90-92, 96, 98, 114-118, 124, 133, 135, 144-146, 153, 157, 159-161, 164, 166, 167, 173, 177, 186, 225, 226, 228, 230, 233 mozgási szabályok, 29-34, 38-40, 43, 49-51, 53-56, 64, 65, 103-104, 106, 107, 109-115, 117, 118, 120-125, 129, 136, 138-142, 148-151, 207-209, 212, 214, 216-219, 228, 229, 237, 238 nemterminális szimbólum, 15, 16-18, 21, 32-35, 61, 62, 65, 67, 74, 79, 80, 82, 84-91, 93-101, 114-128, 133, 134, 144-151, 153, 158-160, 163, 164, 167-177, 179-183, 185-187, 192, 194-196, 198-202, 225, 226, 228, 229, 231 rekurzív ~, 88 nyelvi szimbólum, terminális szimbólum nyelvtan, grammatika nyelvtani szimbólum, nemterminális szimbólum operátor grammatika, operátor nyelvtan operátor nyelvtan, 200 operátor precedencia elemzés, 200-201, 206 palindrom, 124 palindróma, palindrom Post probléma, 236-241 precedencia grammatika, precedencia nyelvtan precedencia nyelvtan, 191-195, 197-198, 200­205 egyszer ~, 191-192, 205 gyenge ~, 194-195, 197-198, 205 prefix tulajdonság, 203, 205 procedúra, 23-25, 210, 211, 226 produkciós szabály, levezetési szabály pumpálás, 69-70 ketts ~, 126-128 ~i lemma, 126-128 reguláris halmaz, 71-79, 97 reguláris kifejezés, 71 reguláris nyelv, 21, 29-79, 85, 88, 126, 128, 135, 139, 153, 165, 226, 241 rekurzív nyelvtan, 88, 96, 97

Név- és tárgymutató rekurzíve felsorolható, 230 rekurzíve felsorolható nyelv, 230-234 számláló automata, 215-216 számláló gép, számláló automata szemantika, 20 szintakszis, 89 szintakszisvezérelt fordítási séma, 144-148, 149-153 egyszer ~, 146, 147, 149-151, 153, 154, 155 szintaktikus elemz, 97, 157-206 ekvivalens ~k, 179-180 ersen ekvivalens ~k, 179 gyengén ekvivalens ~k, 179

251

tartalmazás, 23-26, 27, 29, 83, 232, 233 teljesen specifikált, 30, 43, 44, 47, 50, 53, 56, 59, 60, 109, 129 terminális szimbólum, 15, 16, 17, 19, 21, 65, 74, 79-81, 84-88, 95, 96, 98-101, 114, 120, 122, 124, 141, 145-148, 150, 152, 153, 157-159, 162, 164, 167, 168, 170, 172, 174, 175, 181, 183, 185, 187, 192, 196, 200-203, 231, 233 többértelm nyelvtan, 83, 85, tranzitív lezárt, 57-58, 67-69, 71, 72, 74, 76, 135 Turing-gép, 207-211, 211-234, 236-239 a ~ megállási problémája, 220-224, 234, 236, 239 univerzális ~, 216-223, 225, 228, 232 tükör nyelv, palindrom újraírási szabály, levezetési szabály unikális, 44, 47, 57, 73, 82, 96, 115, 162 unió, 40, 57-58, 60-63, 71-75, 90-92, 114, 133-134, 187, 240 üres jelsorozat, 13, 14, 16, 32, 35, 58, 67, 69, 71, 72, 77, 90-92, 96, 104, 106, 107, 113, 124, 127, 135, 148, 149, 152, 159, 177, 185, 186, 189, 190, 196, 202 üres nyelv, 14, 70, 134, véges állapotú automata, véges automata véges automata determinisztikus ~, 30, 36, 38, 39-45, 47, 50, 63, 65, 69 két irányban mozgó ~, 49-57 nemdeterminisztikus ~, 36, 38-43, 47, 50, 56, 59, 63, 64, 67 véges fordító, 137-144, 148, 153, 154 véges nyelv, 88, 168, 169, 184

252

Név- és tárgymutató

veremautomata állapottal elfogadó ~, 109-110, 128, 136 determinisztikus ~, 85, 107, 109, 127, 129, 131, 133, 134, 203, 204 mélybelátó ~, 111, 204, 209 nemdeterminisztikus ~, 85, 107, 108, 109, 117, 118, 128, 129, 134 röntgenszem ~, mélybelátó ~ üres veremmel elfogadó ~, 109, 110, 112, 114, 115, 119, 121, 124, 136, 140 veremfordító, 148-151, 153-157 visszatérési fal, 52-54 Wirth­Weber precedenciarelációk, 189

Irodalom
Bánkfalvy J., Bánkfalvy Zs., Bolgár : A formális nyelvek szintaktikus elemzése Közgazdasági és Jogi Kiadó 1978 Demetrovics - Denev - Pavlov A számítástudomány matematikai alapjai Tankönyvkiadó 1989 Révész György Bevezetés a formális nyelvek elméletébe Akadémiai Kiadó 1979 Csörnyei Zoltán Bevezetés a fordítóprogramok elméletébe Tankönyvkiadó 1992 E. Horovitz Magasszint programnyelvek Mszaki Könyvkiadó 1987 Zohar Manna Programozáselmélet Mszaki Könyvkiadó 1981 Noam Chomsky Three models for the Description of Language Transactions on Information Theory 1956 John E. Hopcroft - Jeffrey D. Ullman Formal Languages and their Relation to Automata Addison-Wesley 1969 John E. Hopcroft ­ Rajeev Motwani - Jeffrey D. Ullman Itroduction to the Theory, Languages, and Computation Addison Wesley 2001X Harry R. Lewis ­ Christos H. Papamdimitrou Elements of the Therory of Computation Prentice-Hall 1998 Alfred V. Aho - Jeffrey D. Ullman The Theory of Parsing, Translation and Compiling Prentice-Hall 1972 John E. Hopcroft - Jeffrey D. Ullman Introduction to Automata Theory, Languages and Compilation Addison-Wesley 1979

254

Irodalom

David Gries Compiler Construction for Digital Computers John Wiley & Sons Arto Salomaa Formal Languages Academic Press 1973 Arto Salomaa Computation and Automata
Cambridge University Press 1985

Antony J. Davie - Ronald Morrison Recursive Descent Compiling John Wiley & Sons 1981 Anton Nijholt Computers and Languages North Holland 1988 Jean-Paul Tremblay ­ Paul G. Sorensen The Theory and Practice of Compiler Writing McGraw-hill 1985 K. John Gough Syntax Analysis and Software Tools Addison-Wesley 1988 Robert W. Sebesta Concept of Programming Languages Benjamin Cummings 1989 David A. Watt Programming Language Syntax and Semantics Prentice-Hall 1991 William M. Waite - Gerhard Goos Compiler Construction Springer-Verlag 1984 M. Ben-Ari Understanding Programming Languages John Wiley & Sons 1996 Alexander Meduna Automata and Languages Springer Verlag 2000

Hasonló témájú dokumentumok
Egyelőre még egyetlen hasonló témájú file sincs feltöltve a rendszerbe
A mások által feltöltött dokumentumokat értékelheted. Ha úgy ítéled meg, hogy a vizsgára való felkészülés szempontjából hasznos volt egy dokumentum, akkor adj rá sokcsillagos értékelést.
Ha hibákat tartalmaz, vagy egyéb probléma van vele, akkor keveset.
A dokumentumok sorrendje az értékelések alapján adódik. Ami fentebb van a listában, azt hasznosabbnak ítélték társaid. Az új dokumentumok pedig (értékelések hiányában) szintén a lista tetején kezdenek.

Hozzászólások

Ha észrevételed van egy dokumentummal kapcsolatban (például hibát találtál benne), akkor a Hozzászólások részben jelezheted. Az olyan jellegű kérdéseket mint pl.: A 2. feladat 4. sorából milyen átalakítással jutottunk az 5. sorban szereplő képlethez? - szintén ide érdemes írni
Egy tipp az oldalhoz! - Naptári bejegyzéseket vehettek fel egy tantárggyal kapcsolatban, vagy az egész szakotok számára. Például:
  • Zh időpontok
  • Gólyabál időpontja
  • Házi leadási határidő
  • Tanítási szünetek
  • stb ...
Kattints a Naptárra, majd a jobb felső részen levő Új naptári bejegyzés felvétele linkre.

Cimkefelhő

11.12-2 2009. május 21. 3 eloadas 8. állatélettan állatrendszertan általános médiaismeretek arc asdf barta ferenc dm dolgozat elemzés élete épszerk 3 etika etnikai kisebbség eu szakképzési rendszerek fizika fmea gazdaságföldrajz hull inverz és összetett függvény jogi alaptan jogi és államigazgatási alapismeretek kivágó lyukasztó szerszám tervezése kiválasztás konfiguraciokonformacio. kulturális ökológia légzés leon festinger lineáris lm görbe marx matek jegyzet miskolc művészettörténet nemzeti kisebbség növényszervezettan pénzügy pót regterv sűrűség szintay társadalom történet ttk turizmus szak vállalati pénzügyek vezgazd vizsgazárthelyi