Zastanawiałem się przez chwilę, czy dodać jeszcze jedną odpowiedź. Pozostałe odpowiedzi koncentrują się na środku jego pytania (o „całkowitym turingu”, „tautologii” i tak dalej). Pozwól mi uchwycić pierwszą i ostatnią część, a zatem większy i nieco filozoficzny obraz:
Ale co to oznacza?
Co oznacza bycie kompletnym Turinga?
Czy istnieje sposób na zdefiniowanie możliwości maszyny Turinga, nie mówiąc tylko „o możliwości symulacji innej maszyny Turinga”?
Mówiąc nieformalnie, bycie Turingem kompletnym oznacza, że Twój mechanizm może uruchomić dowolny algorytm, o którym możesz pomyśleć, bez względu na to, jak skomplikowany, głęboki, rekurencyjny, skomplikowany, długi (pod względem kodu) i bez względu na to, ile miejsca lub czasu by to zajmowało potrzebne do oceny. Jest rzeczą oczywistą, że tylko udaje, czy problem jest obliczalny, ale jeśli to jest obliczalny, to będzie sukces (halt).
(Uwaga: aby dowiedzieć się, dlaczego jest to „nieformalne”, zapoznaj się z tezą Kościoła Turinga, która idzie w tym kierunku, z bardziej złożonym brzmieniem; będąc tezą, może być lub nie może być poprawna. Dzięki @DavidRicherby za wskazując to małe pominięcie w komentarzu).
„Algorytm” oznacza to, co dzisiaj powszechnie rozumiemy jako algorytm komputerowy; tj. szereg dyskretnych kroków manipulujących pamięcią, z domieszką pewnej logiki sterowania. Nie jest jednak podobny do maszyny Oracle, tzn. nie może „zgadnąć”.
Przykład praktycznego języka innego niż tc
Jeśli sam się zaprogramowałeś, prawdopodobnie znasz wyrażenia regularne, używane do dopasowania ciągów znaków do jakiegoś wzorca.
To jest jeden przykład konstrukcji, która nie jest ukończona przez Turinga. Możesz łatwo znaleźć ćwiczenia, w których niemożliwe jest utworzenie wyrażenia regularnego pasującego do określonych fraz.
Na przykład (a to z pewnością drażni wielu programistów w rzeczywistych rzeczywistych aplikacjach), teoretycznie i praktycznie niemożliwe jest utworzenie wyrażenia regularnego pasującego do języka programowania lub dokumentu XML: wyrażenie regularne nie może znaleźć struktury bloku ( do ... end
lub { ... }
w językach; otwieranie i zamykanie znaczników w dokumentach XML), jeśli dopuszcza się ich dowolną głębokość. Jeśli istnieje limit, na przykład możesz mieć tylko 3 poziomy „rekurencji”, możesz znaleźć wyrażenie regularne; ale jeśli nie jest to ograniczone, to nie da się.
Ponieważ jest oczywiście możliwe stworzenie programu w języku kompletnym Turinga (jak C) do parsowania kodu źródłowego (robi to dowolny kompilator), wyrażenia regularne nigdy nie będą w stanie symulować tego programu, dlatego z definicji nie są kompletne Turinga
Motywacja
Sam pomysł maszyny Turinga nie jest niczym praktycznym; tzn. Turing z pewnością nie wynalazł go, aby stworzyć prawdziwy komputer lub coś takiego, w przeciwieństwie na przykład do Charlesa Babbage'a lub von Neumanna. Koncepcja maszyny Turinga jest niezwykle prosta. Składa się prawie z niczego. Redukuje liczbę możliwych (i rzeczywistych) komputerów do najgorszego możliwego do wyobrażenia minimum.
Z kolei to uproszczenie polega na tym, że ułatwia to (ish) zastanawianie się nad pytaniami teoretycznymi (takimi jak zatrzymanie problemów, klasy złożoności i cokolwiek, na co przeszkadza sobie informatyka teoretyczna). Jedną z cech jest w szczególności to, że zazwyczaj bardzo łatwo jest zweryfikować, czy dany język lub komputer może symulować Maszynę Turinga, po prostu programując maszynę Turinga (która jest taka łatwa!) W tym języku.
Do nieskończoności
Pamiętaj, że nigdy nie potrzebujesz nieskończonego czasu lub pamięci; ale zarówno czas, jak i pamięć są nieograniczone. Będą miały maksymalną wartość dla każdego pojedynczego obliczalnego przebiegu, ale nie ma ograniczenia, jak duża może być ta wartość. Fakt, że w prawdziwym komputerze ostatecznie zabraknie pamięci RAM, został tutaj opisany; jest to oczywiście ograniczenie dla dowolnego komputera fizycznego, ale jest również oczywiste i nie interesuje teoretycznej „mocy obliczeniowej” maszyny. Nie jesteśmy też wcale zainteresowani tym, ile to faktycznie zajmuje. Dzięki temu nasza mała maszyna może wykorzystywać dowolną ilość czasu i przestrzeni, co czyni ją absolutnie niepraktyczną.
... i nie tylko
Jeden zdumiewający ostatni punkt, to jest to, że takie proste, proste rzeczy można zrobić wszystko, każdy wyobrażalny prawdziwy komputer może nigdy , w całym wszechświecie, osiągnąć (po prostu bardzo dużo wolniej) - co najmniej tak daleko jak wiemy dzisiaj.