Kétirányú véges automaták
Kétirányú automata: (rövidíteni 2VA-nak fogom) ugyanolyan, mint az eddig megszokott véges automata, annyi különbséggel, hogy a átmeneti függvény egy állapotból és egy karakterből álló párhoz egy új állapotot és egy irányt ( ) rendel, az irány szerint lép az automata balra, jobbra vagy semerre (és persze megy át az új állapotba). Az elfogadás feltétele, hogy az automata olvassa végig a bemeneti szót (azaz lépjen le jobbra az utolsó betűről is, ekkor szükségképpen megáll) és az az állapot, amiben megáll, legyen elfogadó. Ha az automata a szalag elején balra menne, akkor belesik a szakadékba, vagyis ekkor hibával megáll. Lehet nem determinisztikus is egy 2VA, mi most azonban feltesszük, hogy determinisztikus. (A nemdeterminisztikus eset hasonlóan menne, ezt gondoljátok meg magatoknak). Állítás: (ezt akarjuk belátni) A kétirányú automaták sem erősebbek mint az egyirányúak, azaz ugyanazokat a nyelveket ismerik fel mint az eddigi 1VA-k. 1. Az s irány, azaz a semerre-se-lépés elhagyása nem gyengíti az automatát. Ez azért igaz, mert ha van egy olyan 2VA, ami tartalmaz s-es átmenetet, akkor ehhez készíthetünk egy olyan, másik 2VA-t, ami ugyanazt fogadja el, csak nincsen benne ilyen s-es átmenet. A következőképpen megy ez: ha van egy átmenet, akkor kövessük az automata működését egészen addig, amíg végre lelép az a-ról. Ha a 2VA eközben a állapotokat érintette és az utolsó állapotban, pt-ben jobbra vagy balra lépett, akkor vegyük be a szabályt, az s-eseket meg hagyjuk el. Ha , akkor biztos van ismétlődés az állpotsorozatban, tehát végtelen ciklusba kerültünk. Ekkor a (p1,a) pár hatására menjünk csapda állapotba. Ötlet: (Az állítás bizonyításához) A 2VA-t egy egyirányúval fogjuk szimulálni a következő módon. Azt akarjuk, hogy az egyirányú automata csak azokat a mozgásait utánozza a 2VA-nak, amik előre visznek. Ezt egyszerű megtenni, ha a 2VA -jában egy (p1,a) párra (r1,j) van. Ekkor az 1VA p1-ből menjen r1-be a hatására. Bonyolultabb a helyzet, ha a 2VA visszafele megy, azaz ha a (p1,a) párra (r1,b) van. Minket az igazából nem érdekel, hogy mit tesz pontosan a 2VA, amikor visszafele mászkál, csak az a fontos, hogy visszajön-e oda, ahonnan elindult hátra (jelen esetben erre a a-ra) és ha igen, akkor milyen állapotban. (Az elfogadáshoz csak az számít, hogy végigolvassa-e a szót és hogy milyen állapotba kerül a végén.) Ezt az infót egy visszatérési falnak nevezett táblázat megadja nekünk, amiről majd látni fogjuk, hogy feltehető, hogy ismert. A 2VA minden helyzetéhez tartozik majd egy visszatérési fal. Ez a visszatérési fal a következőt jelenti: a 2VA minden állapotára megmondja, hogy ha az adott helyzetben visszafele indulunk az adott állapotban, akkor visszatérünk-e és ha igen, milyen állapotban. Ha van |Q| darab állapot a 2VA-ban, akkor legfeljebb (|Q|+1)|Q| darab visszatérési fal lehetséges, hiszen ennyi lehetőség van arra, hogy a |Q| soros táblázatot kitöltsük. (A +1 amiatt van, hogy lehet, hogy nem jövünk vissza, ezt -tel jelöljük.) Mindjárt látjuk, hogy az 1VA tudja szimulálni a 2VA mozgásait, ha az állapotaiba belekódoljuk a 2VA állapotát és az aktuális visszatérési falat. Vagyis az 1VA egy állapota egy alakú pár lesz, ahol p egy 2VA állapot, meg egy fal. A 2VA minden helyzetének egy 1VA állapot felel meg. Ezen infókból ( típusúak) a következőképpen lehet meghatározni az 1VA átmeneteit. Itt azt írom le, hogy hogyan jön ki, hogy mi lesz az 1VA-ban az állapothoz és a karakterhez tartozó új állapot. (a) Ha a 2VA előre megy, azaz a (p1,a) párra (r1,j) van, akkor az 1VA-ban a állapotból állapotba megyünk. (A azt jelöli, hogy még nem tudjuk, mi lesz az új fal, de az állapot biztos r1. Az új fal meghatározásáról később.) Ha a 2VA hátra megy, azaz a (p1,a) párra (r1,b) van, akkor megnézzük a falat, hogy mi tartozik benne az r1-hez, azaz, hogy ha r1-ben indulunk vissza, akkor milyen (2VA) állapotban érünk vissza. Ha a fal azt mondja, hogy nem érünk vissza, akkor felveszünk egy csapda állapotot az 1VA-ban és ez lesz az állapothoz és a karakterhez tartozó új állapot. (Ez ugyanúgy működik, mint a sima VA-nál: elutasító állapot, ahol bármit olvasva önmagába jutunk.) Ha a fal azt mondja, hogy visszatérünk r2 állapotban, akkor ez azt jelenti, hogy r2 állapotban állunk ugyanazon az a-n, ahol kezdtük és az aktuális fal még mindig a . Most ugyanazt csináljuk az párral, amit -val tettünk. Ha a fal r1-re nem ad visszatérő állapotot, akkor csapda, ha ad (mondjuk r2-t), akkor arra (az állapotra) folytatjuk az előbbi eljárást. Így előbb-utóbb vagy elakadunk, mert a fal nem ad visszatérő állapotot (csapda), vagy előre lépünk végre valami q állapotba, ekkor lesz a állapothoz és az a karakterhez tartozó új állapot. Ha egyik eset se következik be |Q|+1 iteráción belül, akkor tutira volt ismétlődő állapot, azaz végtelen ciklusban vagyunk, azaz megint menjünk a csapdába. Ezzel láttuk, hogy az 1VA-ban az új állapot első komponensét hogyan kell meghatározni. (b) Most lássuk, hogy hogyan kell a következő falat kiszámolni! A állapothoz és a karakterhez tartozó új állapot fala, a új fal a és a a ismeretében kiszámolható. Azt kell megmondani minden q1 2VA állapot esetén, hogy ha q1 állapotban megyünk bele, azaz lépünk vissza, akkor visszatérünk-e és milyen 2VA állapotban. Ezt a következőképpen számolhatjuk ki. Ha a -be q1-ben lépünk, akkor az azt jelenti, hogy q1 állapotban a-t olvasunk, hiszen a volt az utolsó karakter a fal előtt. Ha a 2VA a (q1,a) párra (q2,j)-t ad, azaz előre lép, akkor az új falban a q1 bemenő állapothoz a q2 visszatérő állapot tartozik. Ha 2VA a (q1,a) párra (q2,b)-t ad, azaz hátra lép, akkor meg az eddigi fal, a mondja meg, hogy mi lesz. Ha azt mondja, hogy nem tér vissza az automata, akkor a új falban a q1-re lesz. Ha azt mondja a , hogy q3-ban tér vissza, akkor meg kell nézni, hogy a 2VA a (q3,a) párra mit tesz. Ha előre lép q4-be, akkor a -ben q4 lesz a visszatérő állapot, ha visszafele, akkor megint konzultálunk a fallal. Ez így megy max. |Q|+1 lépésig, mert ha addigra se akad el a 2VA, meg nem is mászik vissza teljesen, akkor biztosan lesz két ismétlődő állapot, azaz akkor végtelen ciklusban vagyunk, ekkor menjünk a csapdába. Így minden 1VA állapotra meg tudjuk határozni a következő állapot mindkét komponensét. A kezdőállapot a állapot lesz, ahol q0 a 2VA kezdőállapota, meg az fal, a kezdőfal, ahol minden bemenő állpothoz a tartozik. (Ez azt fejezi ki, hogy függetlenül az állapottól, a szalag elején mindenki leesik a szakadékba.) Elfogadó állapotok azok lesznek az 1VA-ban, akiknek első komponense elfogadó 2VA állapot. Ez azért van így, mert az elfogadáskor már nem számít a fal, az csak addig érdekes, amíg még tovább akarunk lépni. |