Sunteți pe pagina 1din 2

Masina Turing Informal (asa cum explica si Turing in articolul lui) O persoana care vrea sa calculeze ceva (un

"calculator") are nevoie de o hartie pe care va scrie diverse simboluri in functie de starile lui mintale (state of mind, cum gandeste) si ce se gaseste deja pe hartia respectiva. Faptul ca hartia e bidimensionala nu are importanta, si atunci pentru simplitate putem presupune ca e uni-dimensionala. In plus numarul de simboluri pe care le poate utiliza "calculatorul" este finit (el poate scrie oricate vrea pe hartia uni-dimesionala, dar are un numar limitat de simboluri posibile). De asemenea, numarul de "stari mintale" este din nou limitat, sau finit. Toate astea sunt in concordanta cu bunul simt. Exact asa suntem si noi :). Informal, acest "calculator" este o masina Turing. Formal Masina Turing e un tuplu (K, sigma, delta, si). K - multimea de stari in care se poate afla masina (multimea de "stari mintale") sigma - alfabetul, multimea de simboluri ce pot fi scrise pe banda delta - functia de tranzitie (creierul "calculatorului" care ii spune in functie de starea in care se afla si simbolul pe care il observa pe banda la un moment dat in ce alta stare sa treaca si ce actiune sa efectueze) si - starea initiala. Exista mai multe tipuri de masini Turing, dar toate sunt echivalente intre ele din punct de vedere a ceea ce pot calcula (si numai din punctul asta de vedere). Masina Turing poate fi vazuta ca un program. Ea primeste un anumit input si in functie de starile sale si functia de tranzitie, se va executa si va produce un anumit output (presupunand ca se termina). Este atunci de bun simt sa ne gandim ca masinile Turing pot fi considerate echivalente cu programele. Ne punem astfel urmatoarele intrebari: Din moment ce exista programe ce pot primi ca input alte programe (un compilator, spre exemplu) cum ar arata o masina Turing ce primeste ca input alta masina Turing? Cum am putea codifica o masina Turing astfel incat sa o putem reprezenta prin simboluri pe banda altei masini Turing? Echivalent, cum arata "codul sursa" a unei masini Turing? Din intrebarile astea apare conceptul de Masina Turing Universal (MTU). O MTU e o masina Turing ce primeste ca input codificarea altei masini Turing. Cum arata acea codificare? Scrie in curs :), dar in principiu ideea e ca avand doar 2 caractere (simboluri) 'I' si 'c' putem codifica multimea de stari si functia de tranzitie a unei masini Turing ('c'-ul e folosit ca separator, ca un fel de spatiu, iar 'I'-ul pentru a codifica efectiv stari si tranzitii... spre exemplu stare S0 ar putea fi III, S1 IIII si tot asa). Vazand ca exista o metoda de a codifica o masina Turing in termeni de simboluri din alfabet, rezulta ca masinile Turing pot fi reprezentate ca siruri de simboluri. IIIIcIIIIIcIIIIIIIIc.... -> o masina Turing care face ceva Notatia folosita pentru codificarea unei masini Turing M este rho(M). Observatie: si sirurile date ca input pot fi codificate in acelasi mod si pentru ele avem notatia rho(w). Din moment ce masinile Turing pot fi reprezentate ca siruri, evident ca putem considera limbaje formate numai din codificari de masini Turing. Tineti minte definitia unui limbaj (un limbaj este o multime de siruri). De exemplu fie L = { rho(M) | M masina Turing ce accepta siruri de lungime para }. L e astfel un limbaj ce contine codificari de masini Turing care accepta siruri de lungime para. Ce putem spune despre astfel de limbaje? Pai, folosind MTU le putem clasifica in 3 categorii: 1. Limbaje Turing acceptate (TA) - un limbaj L este Turing acceptat, daca pentru orice sir w din L, exista o masina Turing M cu proprietatea ca M se opreste pentru inputul w. (daca M primeste ca input w, atunci M se opreste si lucrul asta trebuie sa fie valabil pentru ORICE w din L). Limbaje Turing decidabile (TD) - un limbaj L este Turing acceptat, daca pentru orice sir w din L, exista o masina Turing M cu proprietatea ca M se opreste pentru inputul w si afiseaza Y (Yes) SI pentru orice sir w' care NU se gaseste in L, M se opreste si afiseaza N (No). (cu alte cuvinte, M se termina pe orice input posibil, iar pe sirurile care se gasesc in L scrie pe banda Y si pentru cele care nu se gasesc scrie N). Limbaje nedecidabile (ND) - un limbaj L este nedecidabil daca nu este nici TA nici TD.

2.

3.

Observatii: 0) Multimea limbajelor TD inclusa in multimea limbajelor TA. (atentie la diferenta intre o multime de limbaje = multime de multimi si un limbaj = multime de siruri. Faptul ca o multime de limbaje e inclusa in alta multime de limbaje nu inseamna ca limbaje din multimea mai "mica" ar fi sau nu incluse in limbaje din multimea mai "mare") 1) Daca un limbaj e TD, implicit e si TA 2) Daca un limbaj e TA si complementul lui e TA, atunci e TD. Daca limbajul L e TA inseamna ca exista M care opreste pentru orice w din L. Complementul lui L e alcatuit din toate sirurile care NU se gasesc in L. Cum si complementul e TA, inseamna ca exista si un M' care se opreste pe sirurile ce NU se gasesc in L. Facand o masina Turing M'' care executa in paralel M si M' si se opreste cand una din ele se opreste obtinem astfel o MT care poate decide daca w e in limbaj sau nu => L e TD 3) Daca un limbaj e TA si nu e TD, complementul lui e ND. 4) Problemele legate de MTU pot fi reduse la probleme de AA, in general, folosind faptul ca masinile Turing sunt echivalente cu programele. Forma uzuala a unei astfel de probleme este ceva de tipul: L = { ... | problema de AA }. Cum e L (TA, TD, ND)? Exemple: L = { rho(M) rho(w) | M se opreste pt input w } -> problema de AA este: Se da un program P, si vrem sa stim daca P se termina pe un input w sau nu. Cum e aceasta problema? (decidabila, semidecidabila, nedecidabila). Identificam imediat ca asta e problema opririi, despre care stim ca e semidecidabila => L este limbaj Turing acceptat. L = { rho(M1) rho(M2) rho(w) | M1 se opreste si M2 nu se opreste } -> problema de AA este: Se dau 2 programe P1 si P2 si vrem sa stim daca P1 se opreste si daca P2 nu se opreste (pentru acelasi input, w). Pai, a verifica daca P1 se opreste e problema opririi, care e semidec, iar a verifica daca P2 nu se opreste este complementul problemei opririi care e nedec -> problema e nedecidabila => L e limbaj nedecidabil 5) Unele probleme nu pot fi reduse atat de usor la o problema de AA, pentru ca se leaga explicit de "implementarea" masinii Turing. Exemplu: L = { rho(M) | M se termina in maxim 10 tranzitii }. Cum e L (TA, TD, ND)? In cazul asta nu putem reduce la problema de AA, pentru ca nu stim exact ce inseamna 10 tranzitii pentru un program. E tot una cu 10 instructiuni? Nu chiar, asa ca nici nu vom incerca sa o rezolvam ca o problema de AA, ci ne vom folosi de "implementarea masinii Turing". Primul instinct ar fi sa spunem ca problema e decidabila. Zicem "pai execut 10 tranzitii si vad daca a ajuns in starea de halt sau nu". Problema e: execut 10 tranzitii PE CE SIR? De data asta nu e dat niciun sir, niciun rho(w), dar masina Turing trebuie sa primeasca un sir ca input, ce sir ii dau? Cum sunt o infinitate de siruri posibile, s-ar parea ca problema e semidecidabila. Totusi sa examinam urmatorul lucru: M porneste dintr-o stare initiala S0. Ea are tranzitii definitie din starea S0 pe orice caracter posibil din alfabet (care e finit). Daca alfabetul are N caractere, sunt N posibilitati pentru prima tranzitie. Le inspectam pe toate. Pentru fiecare posibilitate, facem acelasi lucru. (in noua stare in care ne aflam, vedem unde putem ajunge pe toate tranzitiile posibile). Practic, se face un arbore in care nodurile sunt stari si pe muchii avem caractere pentru diversele tranzitii. Mergem in arborele asta pana la adancimea 10 si vedem daca pana acolo am intalnit starea de halt. Daca da, exista un input pentru care M se termina in maxim 10 tranzitii, altfel nu => putem intotdeauna sa ne dam seama, deci problema e decidabila! In toate exemplele anterioare, se presupune ca am construit o MTU pentru limbajele respective (o MTU care accepta sau nu anumite siruri) si astfel se demonstreaza ca limbajul e TA, TD sau ND.