Maszyna Turinga, ang. Turing Machine (TM) Alan Turing wybitny angielski matematyk, logik i kryptolog, jeden z najważniejszych twórców informatyki teoretycznej, któremu zawdzięczamy pojęcie maszyny Turinga i rozważania na temat nierozstrzygalności problemów obliczeniowych. Głównym modelem wykorzystywanym w opracowanej przez Turinga teorii informatyki był abstrakcyjny, prosty matematyczny model obliczeniowy, analog komputera, nazwany potem na cześć jego wynalazcy Maszyną Turinga (MT). Maszyna Turinga jest pierwszą historycznie, szeroko rozważaną formalizacją komputera, jako urządzenia realizującego algorytmy. Innymi słowy, jeżeli jesteśmy w stanie podać efektywną procedurę realizacji jakichkolwiek obliczeń, to jest to równoważne możliwości podania Maszyny Turinga wykonującej te same obliczenia. Maszyna Turinga MT składa się ze skończonego zbioru stanów i skończonego zbioru przejść między tymi stanami Działanie MT opisuje funkcja przejścia, którą można reprezentować w postaci tabeli przejść lub w sposób graficzny za pomocą diagramu przejść (grafu skierowanego) MT pobiera kolejne symbole z ciągu wejściowego (taśmy) MT rozpoczyna działanie od stanu początkowego i odczytania pierwszego symbolu z ciągu wejściowego Po przeczytaniu każdego kolejnego symbolu z taśmy, MT przechodzi do innego stanu lub pozostaje w tym samym stanie Po odczytaniu znaku z taśmy MT na podstawie tego znaku i swojego bieżącego stanu (dwie informacje), zastępuje ten znak innym, zmienia swój stan na inny bądź ten sam i przesuwa głowicę o jedną pozycję w prawo lub w lewo (trzy informacje). Takie działanie opisuje właśnie funkcja przejścia. Taśma MT zawierająca ciąg danych wejściowych jest obustronnie nieskończona. W trakcie działania MT realizuje algorytm MT może znajdować się w jednym z m stanów, a każda komórka taśmy może zawierać jeden z k symboli. Gdyby liczba komórek taśmy była skończona (n), to MT miałaby skończoną liczbę konfiguracji (nazywanych opisem chwilowym) i wynosiłaby ona mk n. Ponieważ liczba komórek jest nieskończona to liczba różnych konfiguracji MT jest także nieskończona. MT można traktować jako komputer, na którym uruchomiono jeden, konkretny program (algorytm) opisany diagramem przejść. Praktyczną realizacją jednej Maszyny Turinga jest program komputerowy, a zbioru Maszyn Turinga komputer.
W informatyce teoretycznej MT wykorzystuje się do udowadniania nierozstrzygalności, bądź niepodatności różnych problemów. Zapotrzebowanie na czas i pamięć wykorzystywane podczas obliczeń przez Maszynę Turinga nie różnią się zasadniczo od zapotrzebowania jakie posiadają rzeczywiste realne komputery. Formalna definicja Maszyny Turinga Maszyna Turniga jest uporządkowaną siódemką (Q,,,,q 0,B,F) gdzie: Q jest skończonym zbiorem stanów jest skończonym zbiorem symboli wejściowych jest skończonym zbiorem dopuszczalnych symboli taśmowych q 0 jest stanem początkowym (q 0 Q) B jest symbolem pustym F jest zbiorem stanów akceptujących (FQ) jest funkcją przejścia odwzorowującą Qx w Qx x{l,p} Funkcja przejścia ma postać: (q,x) = (p,y,k) gdzie q,pq X,Y K{L,P} W pojedynczym ruchu MT odczytuje kolejny symbol z alfabetu znajdujący się na taśmie w pozycji wskazywanej przez głowicę czytająco-zapisującą, zmienia swój stan zgodnie z opisem zawartym w diagramie przejść, zapisuje nowy symbol na aktualnej pozycji na taśmie (nadpisując poprzedni), i przesuwa głowicę o jedną pozycję w prawo lub w lewo. MT rozpoczyna działanie dla głowicy znajdującej się nad pierwszym symbolem z lewej strony taśmy różnym od symbolu pustego B. Przykłady: 1) MT sprawdzająca czy dany ciąg binarny jest palindromem, tzn. akceptująca język: L={w(0 1 ε)w R ; w= *, ={0,1}} M=({q 0,q 1,q 2,q 3,q 4,q 5,q 6,q 7 },{0,1},{0,1,B},,q 0,B,{q 3 })
2) MT akceptująca język: L={0 n 1 n ; n 1} M=({q 0,q 1,q 2,q 3,q 4,q 5 },{0,1},{0,1,X,Y,B},,q 0,B,{q 4 }) Druga MT akceptująca ten sam język: M=({q 0,q 1,q 2,q 3,q 4,q 5,q 6,q 7,q 8,q 9 },{0,1},{0,1,B},,q 0,B,{q 8 }) Opis chwilowy MT Jeden ruch MT oznaczamy symbolem Jeżeli (q,x i ) = (p,y,l) to ruch głowicy w lewo X 1 X 2 X 3 X i-1 qx i X i+1 X n-2 X n-1 X n X 1 X 2 X 3 X i-2 px i-1 YX i+1 X n-2 X n-1 X n Jeżeli (q,x i ) = (p,y,p) to ruch głowicy w prawo X 1 X 2 X 3 X i-1 qx i X i+1 X n-2 X n-1 X n X 1 X 2 X 3 X i-1 YpX i+1 X n-2 X n-1 X n Dla oznaczenia jednego lub więcej ruchów MT używamy symbolu Opis chwilowy MT dla przykładu 1: q 0 0110 Bq 1 110 B1q 1 10 B11q 1 0 B110q 1 B B11q 2 0B B1q 5 1BB czyli q 0 0110 Bq 3 BBB
Definicja języka maszyny Turinga języka rekurencyjnie przeliczalnego (JRP) Jeżeli M = (Q,,,,q 0,B,F) jest maszyną Turinga to język tej maszyny oznaczamy jako L(M) i definiujemy następująco: L(M) = {w * ; q 0 w p, pf,, * } Języki rekurencyjnie przeliczalne (JRP) języki, które są akceptowane przez maszynę Turinga, przy założeniu, że MT zatrzymuje się, gdy znajdzie się w stanie akceptującym, natomiast nie musi się wcale zatrzymywać, gdy nie akceptuje. Języki rekurencyjne (JR) języki takich MT, które się w końcu zatrzymują bez względu na to czy akceptują ciąg wejściowy, czy nie. MT, które zawsze się zatrzymują stanowią poprawny model algorytmu. Oznacza to, że postawiony problem posiada rozwiązujący go zawsze algorytm, a więc problem taki to problem rozstrzygalny. Dowolny możliwy do opracowania algorytm obliczeniowy ma zawsze swoją reprezentację w postaci Maszyna Turinga. Teza Churcha-Turinga (Alonzo Church amerykański logik i matematyk) Maszyna Turinga potrafi rozwiązać każdy efektywnie rozwiązywalny problem algorytmiczny, dla którego możemy znaleźć algorytm dający się opisać w pewnym dowolnym języku programowania (nawet takim, którego jeszcze nie wymyślono), wykonujący się na pewnym, dowolnym komputerze (nawet na takim jakiego jeszcze nie skonstruowano, ale w przyszłości można skonstruować). rozwiązywalny przez MT = efektywnie rozwiązywalny Inne sformułowanie tezy Churcha-Turinga Każde praktycznie stosowane techniki obliczeniowe mogą być przetłumaczone na równoważne im obliczenia realizowane na MT. Oznacza to, że wszystkie podane poniżej modele obliczeniowe są sobie równoważne: 1) Maszyna Turinga 2) Gramatyka kombinatoryczna (gramatyka klasy 0) 3) Maszyna typu RAM (rejestry, pamięć, instrukcja warunkowa i skoku) 4) Języki programowania z instrukcjami iteracyjnymi (instrukcje podstawienia, warunkowe, pętle, struktury danych, tablice) 5) Rachunek funkcji rekurencyjnych Teza Churcha-Turinga jest tezą a nie twierdzeniem, dlatego nie można przeprowadzić dla niej dowodu matematycznego wykazującego jej poprawność.
Co wynika z tezy Church-Turinga? Każdy rzeczywisty komputer od najprostszego do najbardziej skomplikowanego, a także każdy inny teoretyczny model komputera potrafi obliczyć dokładnie to samo co MT. Co jeszcze wynika z tezy Churcha-Turinga? Czy istnieje równoważność pod względem obliczeniowym MT i dowolnego komputera? Maszyna Turinga i dowolne urządzenie obliczeniowe (komputer) są wielomianowo równoważne Oznacza to, że klasa problemów mających rozsądne czasowo rozwiązanie (problemy podatne wykonywane w czasie wielomianowym) jest taka sama dla obu modeli. Rozwiązując wybrany problem algorytmiczny MT może potrzebować na jego wykonanie dwa razy, sto razy, n razy, n 2 razy a nawet n 10 razy więcej czasu niż potrzebuje komputer, lecz nigdy wykładniczo więcej (2 n razy, 10 n razy, n! razy). Zmienna n oznacza rozmiar problemu (danych wejściowych). Dlatego jeżeli jakiś komputer rozwiązuje problem algorytmiczny w czasie O(f(n)), to MT rozwiązuje ten sam problem w czasie O(p(f(n))), gdzie p jest funkcją wielomianową. W rzeczywistości większość redukcji złożoności obliczeniowej algorytmów wykonywanych na komputerach w stosowanych aktualnie językach programowania do poziomu MT wiąże się z wielomianami względnie niskiego rzędu, na ogół nie większego niż n 5. Niedeterministyczna Maszyna Turinga (NMT) W NMT istnieją stany (co najmniej jeden), w których co najmniej dwa przejścia opisane są tym samym symbolem X. W NMT funkcja przejścia ma postać: (q,x) = {(q 1,Y 1,K 1 ), (q 2,Y 2,K 2 ),, (q n,y n,k n )}; gdzie nn q,q 1,q 2,, q n Q X,Y 1,Y 2,, Y n, K 1, K 2,, K n {L,P} Oznacza to, że istnieją rozwidlenia działania algorytmu na kilka możliwych ścieżek jego realizacji. NMT poprawnie wykonuje algorytm, gdy podczas jego wykonywania możliwe są takie kolejne wybory niedeterministyczne, które na co najmniej jednej ze ścieżek doprowadzą nas do poprawnego zrealizowania tego algorytmu. NMT nie realizuje poprawnie algorytmu, gdy żadna z możliwych ścieżek działania nie zapewni nam poprawnego jego wykonania. Działanie NMT można interpretować jako tworzenie wielu kopii Maszyny Turinga dla każdego z możliwych wariantów, lub zdolność zgadywania, które przejście należy wybrać aby rozwiązać problem algorytmiczny.
Rozszerzone i ograniczone wersje Maszyny Turinga oraz języki akceptowane przez te maszyny 1) Wielotaśmowa MT Wielotaśmowa MT korzysta z więcej niż jednej taśmy. W każdym ruchu głowica może wykonać jedną z trzech czynności (a nie dwóch jak w klasycznej MT): L ruch w lewo o jedna pozycję, P ruch w prawo o jedna pozycję, S głowica nie przesuwa się w żadnym kierunku. Na początku realizacji algorytmu dane wejściowe znajdują się tylko na taśmie pierwszej, a pozostałe są puste. Funkcja przejścia uzależnia kolejny ruch od symboli znajdujących się na wszystkich taśmach, w miejscach wskazywanych przez wszystkie głowice. Funkcja przejścia wielotaśmowej MT o n taśmach ma postać: (q,x 1,X 2,, X n ) = (p,y 1,K 1,Y 2,K 2,, Y n,k n ) K{L,P,S} Wielotaśmowe MT akceptują te same języki co jednotaśmowe MT czyli JRP. Tw: Jednotaśmowa MT symuluje n ruchów k-taśmowej MT w O(n 2 ) ruchach. 2) MT o taśmie tylko jednostronnie nieograniczonej MT o taśmie jednostronnie nieograniczonej akceptuje te same języki co klasyczna MT o taśmie obustronnie nieograniczonej, czyli JRP.
3) Maszyna dwustosowa Maszyna dwustosowa akceptuje te same języki co MT, czyli JRP. Dwa stosy mogą symulować jedną taśmę maszyny Turinga. Jeden stos przechowuje komórki znajdujące się na lewo od głowicy, a drugi stos na prawo. 4) Maszyna dwulicznikowa Liczniki mogą zawierać dowolną liczbę naturalną lub zero, ale ML przy wykonywaniu kolejnego ruchu może wykonywać tylko test polegający na sprawdzaniu tylko czy licznik zawiera liczbę większą od zera, czy równą zero. W jednym ruchu ML zmienia stan lub pozostaje w tym samym, zwiększa lub zmniejsza o jeden wartość jednego z dwóch liczników, ew. pozostawia go bez zmian (liczniki zawierają wartości dodatnie, a dekrementacja wartości 0 pozostawia ją bez zmian). Maszyna licznikowa może być uważana za ograniczoną maszyną wielostosową z dwoma symbolami stosowymi: Z 0 (znacznik spodu stosu) i X. Maszyna dwulicznikowa akceptuje te same języki co MT JRP. Maszyna jednolicznikowa akceptuje te same języki co automat ze stosem (AZS), czyli języki bezkontekstowe (JBK).
Uniwersalna Maszyna Turinga Tak jak Maszyna Turinga jest reprezentacją jednego konkretnego algorytmu, tak Uniwersalna Maszyna Turinga jest równoważna komputerowi, który może realizować różnorodne algorytmy. UMT = (M,w) gdzie M jest słowem kodującym funkcję przejścia danej MT, a w jest słowem analizowanym przez tą MT. Przykładowe kodowanie MT na taśmie czytanej przez UMT MT = (Q,,,,q 0,B,F) = {0,1}, = {0,1,B} kolejne elementy definiujące MT oddzielamy $ kolejne przejścia funkcji oddzielamy # Funkcję przejścia opisujemy następującymi łańcuchami tekstowymi: (q i,x j ) = (q k, X l, K m ) K m = {L,P} i * X j * k * X l * K m pięć elementów opisujących jedno przejście w funkcji oddzielamy * czyli dla przykładowej MT:
uzyskujemy następujące kodowanie tej maszyny na taśmie: (q 0,1) = (q 2,0,P) (q 2,0) = (q 0,1,P) (q 2,1) = (q 1,0,P) (q 2,B) = (q 2,1,L) 0*1*2*0*P# 2*0*0*1*P# 2*1*1*0*P# 2*B*2*1*L 3$01$01B$ $0$B$1 czyli powyższą MT reprezentuje następujący łańcuch tekstowy: k 1 k n = 3$01$01B$0*1*2*0*P#2*0*0*1*P#2*1*1*0*P#2*B*2*1*L$0$B$1 Przykład Rozważmy problem polegający na rozstrzyganiu czy dany ciąg wejściowy składa się z ciągu liter a o długości m, po którym jest drugi ciąg składający się z takiej samej ilości liter b. Problem ten można inaczej sformułować jako pytanie czy słowo w wczytywane w ciągu wejściowym należy do języka L = {a m b m, m1}. Chcemy wyznaczyć pesymistyczną złożoność obliczeniową algorytmu rozstrzygającego, czy dane słowo w należy do języka L. Instrukcją podstawową jest jeden ruch głowicy, rozmiarem danych wejściowych długość n badanego słowa. a) Algorytm 1 Maszyna Turinga 1 Opis działania MT rozstrzygającej przynależność w do języka L 1. Sprawdź czy słowo składa się z ciągu symboli a po którym jest ciąg symboli b (a ab b) 2. Dopóki na taśmie są symbole a i b, wykreślaj parami po jednym symbolu a i b 3. Jeżeli na taśmie nie ma ani jednego symbolu a i ani jednego symbolu b to zaakceptuj, w przeciwnym razie odrzuć Rozwiązanie (omawiane wcześniej, tylko dla innego alfabetu) M=({q 0,q 1,q 2,q 3,q 4,q 5,q 6,q 7,q 8,q 9 },{a,b},{a,b,b},,q 0,B,{q 8 })
Analiza złożoności obliczeniowej: w kroku 1 MT przechodzi przez taśmę w n ruchach głowicy (n długość słowa) w kroku 2 MT przesuwa głowicę od jednego końca do drugiego i z powrotem, usuwając po jednym skrajnym symbolu najpierw b, a potem a; w każdym kolejnym wykonaniu kroku 2 słowo jest krótsze o dwa symbole Złożoność pesymistyczna wynosi: W(n) = n + (n+1 + n) + (n-1 + n-2) + (n-3 + n-4) + (3 + 2) + 1 = n + i = 1 5 n n 1 2 2 i1 Złożoność oczekiwana: A(n) = O(n 2 ), LTime(n 2 ) b) Algorytm 2 szybszy Maszyna Turinga 2 Opis działania MT rozstrzygającej przynależność w do języka L 1. Sprawdź czy słowo składa się z ciągu symboli a po którym jest ciąg symboli b (a ab b) 2. Dopóki na taśmie są symbole a i b: a. Sprawdź czy sumaryczna ilość symboli a i b jest nieparzysta. Jeżeli tak to odrzuć b. Zamień co drugi symbol a na inny (np. X) i co drugi symbol b na inny (np. Y) 3. Jeżeli na taśmie nie ma ani jednego symbolu a i ani jednego symbolu b to zaakceptuj, w przeciwnym razie odrzuć Rozwiązanie (fragment Maszyny Turinga z początkowymi ruchami głowicy) M=({q 0,q 1, },{a,b},{a,b,x,y,b},,q 0,B,{ }) n 1 2 Analiza złożoności obliczeniowej: w kroku 1 MT przechodzi przez taśmę w n ruchach głowicy w krokach 2a i 2b MT przesuwa głowicę od jednego końca do drugiego i z powrotem w 2(n+1) ruchach. Kroki te wykonuje w najgorszym przypadku log 2 (n) razy w kroku 3 MT w n+2 ruchach sprawdza, czy na taśmie nie ma już żadnych symboli a ani b
Złożoność pesymistyczna wynosi: W(n) = n + 2(n+1) log 2 (n) + n+2 = 2(n+1)(1+log 2 (n)) Złożoność oczekiwana: A(n) = O(nlog(n)), LTime(nlog(n)) c) Algorytm 3 najszybszy Dwutaśmowa Maszyna Turinga 3 Opis działania MT rozstrzygającej przynależność w do języka L 1. Dla każdego symbolu a na taśmie 1 zapisz symbol a na taśmie 2 2. Dla każdego symbolu b na taśmie 1 sprawdzaj czy na taśmie 2 jest odpowiadający mu symbol a 3. Jeżeli na taśmie 1 skończyły się symbole b, a na taśmie 2 odpowiadające im symbole a to zaakceptuj, w przeciwnym razie odrzuć Rozwiązanie (fragment Maszyny Turinga z prawie wszystkimi ruchami głowicy) M=({q 0,q 1, },{a,b},{a,b,b},,q 0,B,{ }) Analiza złożoności obliczeniowej: w kroku 1 MT przechodzi przez taśmę w k ruchach (k jest ilością symboli a) w kroku 2 MT przechodzi przez taśmę w k+1 ruchach Złożoność pesymistyczna wynosi: W(n) = k+k+1 = n+1 Złożoność oczekiwana: A(n) = O(n), LTime(n) d) A teraz dowolny język programowania - Algorytm 4 Opis działania algorytmu rozstrzygającego przynależność w do języka L 1. Przeglądaj tablicę zliczając najpierw symbole a, potem symbole b 2. Porównaj oba liczniki, jeżeli zawierają taką samą wartość to zaakceptuj, w przeciwnym razie odrzuć Analiza złożoności obliczeniowej: Instrukcją podstawową jest inkrementacja licznika. Złożoność pesymistyczna wynosi: Złożoność oczekiwana: W(n) = n A(n) = O(n), LTime(n)