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 ![]() ![]() 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 ![]() ![]() ![]() Ha ![]() Ö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 ![]() 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 ![]() 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 ![]() ![]() Ezen infókból ( ![]() ![]() (a) Ha a 2VA előre megy, azaz a (p1,a) párra (r1,j) van, akkor az 1VA-ban a ![]() ![]() ![]() Ha a 2VA hátra megy, azaz a (p1,a) párra (r1,b) van, akkor megnézzük a ![]() Ha a fal azt mondja, hogy nem érünk vissza, akkor felveszünk egy csapda állapotot az 1VA-ban és ez lesz az ![]() 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 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 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 ![]() ![]() ![]() 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 ![]() Ha 2VA a (q1,a) párra (q2,b)-t ad, azaz hátra lép, akkor meg az eddigi fal, a ![]() ![]() ![]() ![]() ![]() ![]() ![]() Így minden 1VA állapotra meg tudjuk határozni a következő állapot mindkét komponensét. A kezdőállapot a ![]() ![]() ![]() 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. |