====== IN12 Turingovy stroje a jazyky typu 0 ======
(definice, vztah ke gramatikám Chomského hierarchie, rekurzivní a rekurzivně spočetné jazyky, uzávěrové vlastnosti)
===== Vypracovanie =====
==== Definícia ====
Turingov stroj (TM) je 9-tica kde:
* je konečná množina //stavov//
* je konečná množina //vstupných symbolov//
* je konečná množina //páskových (pracovných) symbolov//, obsahujúca ako svoju podmnožinu abecedu
* je //ľavá koncová značka//
* je symbol označujúci //prázdne políčko//
* je //totálna prechodová funkcia//
* je //počiatočný stav//
* je //akceptujúci stav//
* je //zamietajúci stav//
Naviac požadujeme, aby Turingov stroj nikdy neprepísal svoju ľavú koncovú značku iným symbolom a aby nikdy neposunul svoju hlavu vľavo od políčka obsahujúceho ľavú koncovú značku. Formálne, požadujeme aby pre každé existoval stav , taký že:
Množina stavov spolu s prechodovou funkciou sa niekedy súhrnne označuje ako //riadiacia jednotka// Turingovho stroja.
=== Neformálny popis ===
Turingov stroj má konečnú množinu stavov //Q//, pásku, ktorá je rozdelená na jednotlivé políčka, a hlavu, ktorá sa môže po páske pohybovať doľava a doprava, čítať a zapisovať symboly. Na každom políčku pásky je zapísaný práve jeden z konečne mnoho páskových (pracovných) symbolov.
Páska je jednosmerne nekonečná. Na najľavejšom políčku je zapísaný symbol ľavého konca pásky . Na začiatku výpočtu je na prvom až //n//-tom () políčku pásky zapísaný vstupný reťazec. Ostatných nekonečne mnoho políčok napravo od vstupu je prázdnych (znak ).
Výpočet začína v počiatočnom stave , pričom hlava sníma nulté políčko obsahujúce značku . Krok výpočtu spočína v tom, že stroj v závislosti na momentálnom stave a symbolu snímaného hlavou:
- zmení svoj stav (resp. ho môže zmeniť)
- zapíše symbol na políčko snímané hlavou (čím prepíše symbol, ktorý tam bol predtým)
- posunie hlavu o jedno políčko doprava alebo doľava
Spôsob, akým sa má zmeniť stav, prepísať symbol a posunúť hlava, predpisuje prechodová funkcia . teda znamená, že ak stroj v stave //q// sníma symbol //a//, tak prejde do stavu //p//, symbol //a// prepíše symbolom //X// a hlavu posunie o jedno políčko doprava (R - right, L - left). Stroj akceptuje vstupný reťazec, ak prejde do stavu , zamieta, ak prejde do stavu .
Na niektorých vstupoch môže stroj bežať nekonečne dlho bez toho, aby vstupné slovo akceptoval alebo zamietol - v tom prípade stroj //cyklí//. Turingov stroj sa nazýva **//úplný//** práve vtedy, keď pre každý vstup zastaví.
Jazyk akceptovaný Turingovým strojom //M// definujeme ako množinu reťazcov, ktoré //M// akceptuje:
Ak je //M// úpný, hovoríme, že jazyk //L(M)// je //rozhodovaný// strojom //M// alebo že stroj //M rozhoduje jazyk L(M)//.
**Zadanie:** Navrhnete Turingov stroj rozhodujúci jazyk , ktorý nie je bezkontextový.
**Idea riešenia:**((kompletné riešenie, skriptá FJA, str. 108)) Stroj najskôr posúva svoju hlavu až na koniec vstupného reťazca a kontroluje, či je zapísaný na páske v tvare . Pritom nemení obsah pásky (zapíše prečítaný symbol). Keď hlava prečíta prvé prázdne políčko, začne sa posúvať doľava až na ľavý koniec pásky. Nasleduje cyklus, v ktorom hlava "vymaže" (prepíše symbolom X) jeden symbol //a//, jeden //b// a jeden //c// a vráti sa na ľavý koniec pásky. Ak vstupný reťazec patrí do jazyka //L//, stroj nakoniec vymaže na vstupnej páske všetky symboly //a, b, c// a akceptuje. V opačnom prípade zamietne.
==== Rekurzivne a rekurzivne spočetné jazyky ====
Jazyk nazývame
* **rekurzívne spočetný** práve vtedy, keď //L = L(M)// pre nejaký Turnigov stroj //M//
* **rekurzívny** práve vtedy, keď //L = L(M)// pre nejaký úplný Turnigov stroj //M//
Ku každému rekurzívnemu jazyku //L// existuje Turingov stroj, ktorý ho **//rozhoduje//**. Rekurzívne spočetný jazyk musí splňovať slabšiu podmienku: musí existovať Turingov stroj, ktorý ho **//akceptuje//**, t.j. akceptuje každé slovo z //L//, ale výpočet na slove nepatriaceho //L// môže byť buď zamietajúci alebo nekonečný.
Medzi rekurzívne jazyky patria regulárne, bezkontextové, kontextové jazyky a ďalšie jazyky, ktoré spĺňajú podmienku rekurzívneho jazyka. Každý rekurzívny jazyk je aj rekurzívne spočetný (opačne to neplatí). Rekurzívne spočetné jazyky sa dajú generovať gramatikami typu 0. Metódou diagonalizácie sa dá dokázať, že existuje jazyk, ktorý nie je rekurzívne spočetný.
S rekurzívnymi a rekurzívne spočetnými množinami úzko súvisia rozhodnuteľné, nerozhodnuteľné a čiastočne rozhodnuteľné problémy:
**Problém**, kde sa má určiť, či reťazec //w// má vlastnosť //P// nazývame:
* **rozhodnuteľný** práve keď množina všetkých reťazcov, ktorá má vlastnosť //P//, je rekurzívna
* **nerozhodnuteľný** práve keď nie je rozhodnuteľný
* **čiastočne rozhodnuteľný** práve keď množina všetkých reťazcov, ktorá má vlastnosť //P//, je rekurzíve spočetná
==== Uzáverové vlastnosti ====
Triedy rekurzívnych a rekurzívne spočetných jazykov sú uzavrené vzhľadom na operácie
Nech sú jazyky akceptované Turingovými strojmi s disjunktými množinami stavov:
Nedeterminstický stroj akceptujúci dostaneme zjednotením strojov . Stroj bude mať nový počiatočný stav a v prvom kroku výpočtu stroj nedeterministicky prejde buď do počiatočného stavu alebo . V druhom kroku simuluje výpočet zvoleného stroja.
Stroj akceptujúci bude mať pásku s troma stopami. Na prvej je zapísaný vstupný reťazec a jej obsah sa v priebehu výpočtu nemení. Stroj okopíruje svoj vstup //w// na druhú stopu a simuluje na nej výpočet . Ak akceptoval, okopíruje vstup na tretiu stopu a na nej simuluje výpočet . Ak akceptuje, akceptuje aj , v iných prípadoch zamietne.
Nedeterministický stroj akceptujúci bude mať pásku s troma stopami. Na prvej stope je zapísané vstupné slovo. Stroj prekopíruje nejaký (môže byť aj prázdny) prefix vstupného slova na druhú stopu - dĺžku prefixu určí nedeterminsiticky. Okopírované symboly sa na prvej páske označia. Na druhej stope potom simuluje výpočet . Ak akceptuje, prekopíruje na tretiu stopu zvyšnú neoznačkovanú časť slova a simuluje na nej výpočet . akceptuje práve vtedy, keď akceptuje.
Nedeterministický stroj akceptujúci jazyk je zobecnením stroja .
Trieda rekurzívnych jazykov je uzavretá vzhľadom k operácii komplementu.
Ak //L// je jazyk akceptovaný //úplným// TM, stroj akceptujúci //co-L// zosrojíme jednoducho tak, že v definícii prechodovej funkcie zameníme navzájom akceptujúci stav a zamietajúci stav .
Nech jazyk //L// i jeho komplement //co-L// sú rekurzívne spočetné. Potom jazyky //L// a //co-L// sú rekurzívne. Postova veta je známa aj ako tvrdenie:
//L je rekurzívny// //L a co-L sú rekurzívne//
Dôsledkom Postovej vety je, že //trieda rekurzívne spočetných jazykov nie je uzavretá na komplement//. Ak by platil opak, triedy rekurzívnych a rekurzívne spočetných jazykov by sa rovnali.
==== Vzťah TS ku gramatikám Chomského hierarchie ====
Triedy jazykov, ktoré sa dajú generovať gramatikami typu 0, resp. akceptovať Turingovými strojmi sú si rovné a tvoria práve triedu rekurzívne spočetných jazykov.
Dôkaz je možné nájsť v skriptách ((skriptá FJA, str. 123-125)).
Každý rekurzívný jazyk je možné rozhodovať nejakým úplným Turingovým strojom. Z toho bezprostredne vyplýva, že ku gramatikám typu 1-3 (kontextová, bezkontextová, regulárna) vždy existuje úplný Turingov stroj, ktorý //rozhoduje// jazyk generovaný danou gramatikou. Ku gramatike typu 0 existuje TS, ktorý //akceptuje// jazyk generovaný touto gramatikou.
=== Prevod gramatiky typu 0 na TS ===
Nech //L// je jazyk generovaný gramatikou G=(N, Σ, P, S) typu 0. Nedeterministický TS //M// akceptujúci jazyk //L// bude mať 2 stopy. Na prvej stope je zapísaný vstupný reťazec a behom výpočtu sa nemení. Na druhej stope simuluje //M// odvodenie v //G// a je na nej zapísaná (do daného okamihu vygenerovaná) vetná forma α gramatiky //G//. Na zaciatku je obsah druhej stopy //S// a //M// opakovane prevádza tieto kroky:
- nedeterministicky vybere pozíciu //i// v reťazci α na druhej stope.
- nedeterminsticky zvolí pravidlo β → γ gramatiky //G//
- ak je β podreťazcom reťazcu α začínajúcim na pozícii //i//, nahradí β reťazcom γ (ak nie sú rovnako dlhé, tak zvyšok druhej pásky posunie doľava alebo doprava)
- ak sa reťazec na 1.stope rovná reťazcu na 2.stope - akceptuje, inak pokračuje znova krokom 1.
=== Prevod TS na gramatiku typu 0 ===
Odvodenie v gramatike musí nejakým spôsobom simulovať výpočet stroja //M//. V gramatike //G// vygenerujeme dve kópie slova //w// nad abecedou //Σ// a nad druhou z nich v každom kroku odvodenia simulujeme jeden krok výpočtu stroja //M//. Ak stroj //M// neakceptuje, odvodenie nikdy nepovedie k terminálnemu reťazcu. Pravidlá na tvorenie pravidiel gramatiky sú pomerne zložité, nájsť ich môžete v skriptách ((skriptá FJA , str. 125))
===== Predmety =====
* [[https://is.muni.cz/auth/predmety/predmet.pl?fakulta=1433;obdobi=3084;kod=IB005|FI:IB005]] Formální jazyky a automaty I (jaro 2006), prof. RNDr. Mojmír Křetínský, CSc.
===== Použitá literatúra =====
* [[http://www.fi.muni.cz/usr/kretinsky/fja1.html|Skriptá k IB005]]
===== Vypracoval =====
Dušan Katona, ICQ: 426 081 873
hotovo: <99%>
môžete kluďne niečo doplniť alebo opraviť
FIXME Je potřeba ještě zapracovat [[http://statnice.dqd.cz/tmp/turingovy_stroje.pdf|poznámky od Jitky Pospíšilové]].
~~DISCUSSION~~