Co to jest Turing Complete?

487

Co oznacza wyrażenie „Turing Complete”?

Czy możesz podać proste wyjaśnienie bez wchodzenia w zbyt wiele teoretycznych szczegółów?

dlinsin
źródło
2
Kilka bardzo fajnych linków do tego pytania SO .
Lazer

Odpowiedzi:

324

Oto najkrótsze wyjaśnienie:

System Turing Complete oznacza system, w którym można napisać program, który znajdzie odpowiedź (choć bez gwarancji dotyczących czasu wykonywania lub pamięci).

Jeśli więc ktoś powie „moją nową rzeczą jest Turing Complete”, oznacza to w zasadzie (choć często nie w praktyce), że można go użyć do rozwiązania dowolnego problemu obliczeniowego.

Czasami to żart ... facet napisał symulator maszyny Turinga w vi, więc można powiedzieć, że vi jest jedynym silnikiem obliczeniowym, jakiego kiedykolwiek potrzebowano na świecie.

Mark Harrison
źródło
18
Więcej informacji można znaleźć w Tnotach z adnotacjami. Bardzo przystępny. amazon.com/Annotated-Turing-Through-Historic-Computability/dp/…
i_am_jorf
43
„często nie w praktyce” jest niepoprawne. Żaden system nigdy nie jest kompletny w praktyce Turinga, ponieważ żaden możliwy do zrealizowania system nie ma nieskończonej taśmy. To, co naprawdę mamy na myśli, to fakt, że niektóre systemy mają zdolność przybliżania kompletności Turinga do granic dostępnej pamięci.
Shelby Moore III
22
Ale Vi jest jedynym silnikiem obliczeniowym, jaki kiedykolwiek był potrzebny na świecie ... ;-)
Joe Edgar
4
Czy Emacs też jest tokarką? XD
alem0lars
6
Ktoś ostatnio pokazał, że PowerPoint jest również ukończony przez Turinga.
Tagc
192

Oto najprostsze wyjaśnienie

Alan Turing stworzył maszynę, która może wziąć program, uruchomić ten program i pokazać jakiś wynik. Ale potem musiał stworzyć różne maszyny dla różnych programów. Stworzył więc „Uniwersalną maszynę Turinga”, która może wziąć KAŻDY program i uruchomić go.

Języki programowania są podobne do tych maszyn (choć wirtualne). Biorą programy i je uruchamiają. Teraz język programowania nazywa się „Turing zakończony”, jeśli może on uruchomić dowolny program (niezależnie od języka), który może uruchomić maszyna Turinga, mając wystarczającą ilość czasu i pamięci.

Na przykład: Załóżmy, że istnieje program, który pobiera 10 liczb i dodaje je. Maszyna Turinga może z łatwością uruchomić ten program. Ale teraz wyobraź sobie, że z jakiegoś powodu twój język programowania nie może wykonać tego samego dodania. To sprawiłoby, że „Turing byłby niepełny” (że tak powiem). Z drugiej strony, jeśli można uruchomić dowolny program, który może uruchomić uniwersalna maszyna Turinga, oznacza to, że Turing jest ukończony.

Większość współczesnych języków programowania (np. Java, JavaScript, Perl itp.) Jest w pełni ukończona, ponieważ każdy z nich implementuje wszystkie funkcje wymagane do uruchamiania programów, takie jak dodawanie, mnożenie, warunek if-else, instrukcje zwrotne, sposoby przechowywania / pobierania / usuwania dane i tak dalej.

Aktualizacja: Możesz dowiedzieć się więcej na moim blogu: „JavaScript jest ukończona Turing” - wyjaśnienie

Raja Rao
źródło
5
Pomysł, że byłby nawet termin na tego rodzaju maszynę, ma o wiele większy sens, gdy pamiętam, że Turing i inni wczesni informatycy budowali konkretną maszynę za każdym razem, gdy chcieli rozwiązać konkretny problem. Jesteśmy przyzwyczajeni do jednej maszyny, którą można na zawsze przeprogramować. Dziękuję za kontekst, Raja.
Jacob Ford
Jak JavaScript może być Turing Complete? Brakuje systemu plików, właściwego wielowątkowego API. Ma mnóstwo ograniczeń, głównie ze względu na charakter piaskownicy bezpieczeństwa przeglądarki. Trudno to nazwać „językiem programowania”. Zobacz, ile istnieje wariantów abstrakcji skryptu (reaguj, pisz na maszynie… jak to nazywasz), wszystko po to, aby zrekompensować to, czego nie ma JS. (należy tutaj wymienić asm.js). Java, Python lub C ++ to prawdziwe przykłady „Turing Complete”. Ale js? Nie wydaje mi się
Michał IV
2
@MichaelIV Maszyna touringowa również nie miała systemu plików / wątków. JS jest absolutnie kompletny.
Bax
@MichaelIV Aby dodać do odpowiedzi Baxa, można by pomyśleć, że nowoczesny komputer składa się z kilku maszyn Turinga, które współpracują ze sobą, aby umożliwić te wszystkie miłe rzeczy, o których wspomniałeś. Np. CPU wytwarza „taśmę” do odczytania przez GPU, aby mógł zapisać „taśmę” dla monitora, aby monitor mógł zapisać „taśmę” do użytkownika. Podobnie procesor może produkować „taśmę” do dysków twardych, kart sieciowych, kart dźwiękowych itp.
86

Z wikipedii :

Kompletność Turinga, nazwana na cześć Alana Turinga, jest znacząca w tym, że każdy wiarygodny projekt urządzenia komputerowego tak zaawansowanego może być naśladowany przez uniwersalną maszynę Turinga - spostrzeżenie, które stało się znane jako teza Kościoła. Zatem maszyna, która może działać jak uniwersalna maszyna Turinga, może w zasadzie wykonać dowolne obliczenia, do których zdolny jest każdy inny programowalny komputer. Nie ma to jednak nic wspólnego z wysiłkiem wymaganym do napisania programu dla maszyny, czasem potrzebnym na wykonanie obliczeń przez maszynę, ani żadnymi zdolnościami, które maszyna może posiadać, niezwiązanymi z obliczeniami.

Chociaż maszyny z pełnym wyposażeniem Turing są najprawdopodobniej fizycznie niemożliwe, ponieważ wymagają nieograniczonej pamięci, kompletność Turinga jest często luźno przypisywana maszynom fizycznym lub językom programowania, które byłyby uniwersalne, gdyby miały nieograniczoną pamięć. Wszystkie nowoczesne komputery są w tym sensie kompletne Turinga.

Nie wiem, jak możesz być bardziej nietechniczny, niż mówiąc: „Turing Complete oznacza„ być w stanie odpowiedzieć na problem obliczeniowy, mając wystarczająco dużo czasu i miejsca ”.

Ran Biron
źródło
4
W tym kontekście czym jest „urządzenie komputerowe”?
dopatraman
30
Podobnie jak w przypadku większości artykułów w Wikipedii, choć ten cytat jest technicznie poprawny, nie zapewnia żadnej wartości osobie, która nie ma wiedzy na ten temat i stara się ją zrozumieć. Umiejętność właściwego wyjaśniania rzeczy jest sama w sobie nauką :)
Lacho Tomov
76

Nieformalna definicja

Kompletny język Turinga to taki, który może wykonywać dowolne obliczenia. The Church-Turinga Thesis stwierdza, że wszelkie wykonalne obliczenia mogą być wykonywane przez maszynę Turinga. Maszyna Turinga to maszyna o nieskończonej pamięci o dostępie swobodnym i „programu” skończonego dyktuje kiedy powinien czytać, pisać i przesuwający się wzdłuż tej pamięci, kiedy powinien wypowiedzieć z pewnym wyniku, a co ma robić dalej. Dane wejściowe do maszyny Turinga są zapisywane w pamięci przed jej uruchomieniem.

Rzeczy, które mogą sprawić, że język NIE będzie kompletny

Maszynie Turinga może podejmować decyzje w oparciu o to, co widzi w pamięci - „język”, który obsługuje tylko +, -, *, i /na całkowite Turinga nie jest kompletna, ponieważ nie można dokonać wyboru w oparciu o jego wejściu, ale maszyna Turinga może.

Maszyna Turinga może działać wiecznie - jeśli weźmiemy Java, JavaScript lub Python i usuniemy możliwość wykonywania dowolnego rodzaju pętli, GOTO lub wywołania funkcji, nie będzie to Turing zakończony, ponieważ nie może wykonać dowolnego obliczenia, które nigdy nie kończy. Coq jest twierdzeniem twierdzącym, że nie potrafi wyrazić programów, które się nie kończą, więc nie jest kompletny.

Maszyna Turinga może korzystać z pamięci nieskończonej - język, który byłby dokładnie taki jak Java, ale zakończyłby się, gdyby użył więcej niż 4 gigabajtów pamięci, nie byłby kompletny, ponieważ maszyna Turinga może używać pamięci nieskończonej. Właśnie dlatego nie możemy zbudować maszyny Turinga, ale Java jest nadal kompletnym językiem Turinga, ponieważ język Java nie ma żadnych ograniczeń uniemożliwiających korzystanie z nieskończonej pamięci. Jest to jeden z powodów, dla których wyrażenia regularne nie są kompletne w Turingu.

Maszyna Turinga ma pamięć o swobodnym dostępie - język, który pozwala tylko pracować z pamięcią, pusha popoperacje na stosie nie byłyby kompletne. Jeśli mam „język”, który odczytuje ciąg raz i może używać pamięci tylko poprzez wypychanie i wyskakiwanie ze stosu, może mi powiedzieć, czy każdy (ciąg ma swój własny )później, pchając, gdy widzi, (i wyskakując, gdy widzi ). Jednak nie może mi powiedzieć, czy każdy (ma swój własny )później i każdy [ma swój własny ]później (pamiętaj, że ([)]spełnia te kryteria, ale ([]]nie spełnia). Maszyna Turinga może wykorzystywać swoją pamięć o swobodnym dostępie do śledzenia ()i[]jest osobno, ale ten język z tylko stosem nie może.

Maszyna Turinga może symulować dowolną inną maszynę Turinga - Maszyna Turinga, jeśli otrzyma odpowiedni „program”, może pobrać „program” innej maszyny Turinga i przeprowadzić symulację na dowolnym wejściu. Jeśli posiadasz język, który nie może implementować interpretera Pythona, nie byłby to kompletny Turing.

Przykłady kompletnych języków Turinga

Jeśli twój język ma nieskończoną pamięć o swobodnym dostępie, wykonanie warunkowe i jakąś formę powtarzanego wykonania, prawdopodobnie Turing jest ukończony. Istnieje więcej egzotycznych systemów, które wciąż mogą osiągnąć wszystko, co może zrobić maszyna Turinga, co czyni je również kompletnymi:

  • Rachunek lambda bez typu
  • Gra Conwaya w życie
  • Szablony C ++
  • Prolog
Gordon Gustafson
źródło
11
SQL jest zdecydowanie najbardziej kompletny. Posiada funkcje skryptowe, które pozwalają na dowolne obliczenia.
nzifnab
53
Nie, mylisz SQL z rozszerzeniami, takimi jak T-SQL / PL-SQL. ANSI SQL nie jest kompletny. Ale TSQL / PLSQL - jest.
Agnius Vasiliauskas
15
Najwyraźniej SQL jest turing-complete: stackoverflow.com/questions/900055/…
Newtang
2
Zgodnie z kompletnością Turinga - system jest Turinga kompletny, jeśli można go użyć do symulacji dowolnej maszyny Turinga z pojedynczą taśmą. Ale w powyższym przykładzie, jak zrozumiałem, twórcy zbudowali coś szczególnego, cyclic tag systema nie universal cyclic tag system. Stąd - artykuł nie dowodzi kompletności SQL. (Lub coś źle zrozumiałem)
Agnius Vasiliauskas
2
Nie ma możliwej do zrealizowania implementacji języka pełnego Turinga, ponieważ nie ma nieskończonych taśm. Naprawdę mamy na myśli fakt, że niektóre języki mają możliwość przybliżenia kompletności Turinga do granic dostępnej pamięci komputera-hosta.
Shelby Moore III,
17

Zasadniczo kompletność Turinga jest jednym zwięzłym wymogiem, nieograniczoną rekurencją.

Nawet nie związany pamięcią.

Myślałem o tym niezależnie, ale oto dyskusja na temat tego twierdzenia. Moja definicja LSP zapewnia większy kontekst.

Pozostałe odpowiedzi tutaj nie definiują bezpośrednio podstawowej istoty kompletności Turinga.

Shelby Moore III
źródło
Automaty stanów skończonych mogą mieć nieograniczoną rekurencję. Sprawa w punkcie: a*.
3
@Rymoidy FSM mają ograniczoną pamięć - skończoną liczbę stanów) - ale nieograniczona rekurencja bez optymalizacji ogona musi mieć nieograniczoną pamięć. Nie ograniczyłem definicji do podzbioru nieograniczonej rekurencji tylko z optymalizacją ogona. Uprzejmie usuń swoją opinię.
Shelby Moore III,
zachowałeś mglistą definicję nieograniczonej rekurencji. Czy masz na myśli „rekurencję” w sensie „prymitywnej rekurencji” i „nieograniczony”, czyniąc ją „częściową” (lub „ogólną” lub „mu-”)? Więc możesz mieć rację. Ale twoje obecne sformułowanie jest zbyt bliskie stwierdzeniom krytykowanym w „Twierdzeniach ludowych” Davida Harela. Ważne jest, aby być surowym w matematyce, a pomijając precyzyjne definicje, ignorujesz to. Nawiasem mówiąc: FSM można uogólnić w celu modelowania interakcji; co odróżnia je od baz TM, jest to, że środowisko tego ostatniego jest również modelowane (jako taśma).
Wyliczanie rymów jest antytezą precyzji, np. Wyliczyć maksymalną precyzję ułamków cala. Nieograniczona rekurencja oznacza każdą możliwą formę rekurencji, która jest niemożliwa bez nieskończonej taśmy. W pełni uogólniona rekurencja (nie tylko ogólna w modelu) jest zawsze zakończona metodą Turinga. Podaję równoważność między uogólnioną rekurencją a możliwością wykonania dowolnego możliwego obliczenia. Jest to ważna równoważność, na którą należy zwrócić uwagę.
Shelby Moore III
„Nieograniczona rekurencja oznacza każdą możliwą formę rekurencji” To jest twoje czytanie. Dla większości użytkowników SO „nieograniczona rekurencja” oznacza while (p) { /* ... */ }. „Podaję równoważność między uogólnioną rekurencją a możliwością wykonania dowolnego możliwego obliczenia”. Teza Kościoła jest zupełnie inną sprawą i naprawdę powinna zostać omówiona osobno.
13

Turing Complete oznacza, że ​​jest co najmniej tak potężny jak Maszyna Turinga . Oznacza to, że wszystko, co można obliczyć za pomocą maszyny Turinga, można obliczyć za pomocą systemu Turing Complete.

Nikt jeszcze nie znalazł systemu o większej mocy niż Maszyna Turinga. Na razie więc powiedzenie, że system jest Turing Complete, jest tym samym, co powiedzenie, że system jest tak potężny, jak każdy znany system komputerowy (patrz teza Churcha-Turinga ).

Waylon Flinn
źródło
3
Pamiętaj, że wszystko to nie uwzględnia czasu na ścianie. Mówi tylko „można to zrobić”.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen w rzeczywistości całkowicie pomija obliczenia fizyczne. Może to nie tylko potrwać dłużej niż wiek wszechświata, ale może również zużywać więcej pamięci, niż można by zbudować ze wszystkimi fermionami i bozonami we wszechświecie.
Waylon Flinn
Prawdopodobnie nie ma ograniczeń co do ilości bozonów i fermionów we wszechświecie. Nie wiemy i prawdopodobnie nigdy się nie dowiemy, to rozmiar. Za każdym razem, gdy czytasz o liczbie X w „wszechświecie”, ludzie tak naprawdę mówią o obserwowalnym wszechświecie. Choć interesujące, nie jest to faktyczny limit fizyczny.
Stijn de Witt
9

Mówiąc najprościej, system Turing-complete może rozwiązać każdy możliwy problem obliczeniowy.

Jednym z kluczowych wymagań jest nieograniczony rozmiar scratchpada i możliwe jest przewijanie w celu uzyskania dostępu do wcześniejszych zapisów na scratchpad.

Dlatego w praktyce żaden system nie jest kompletny w Turingu.

Raczej niektóre systemy przybliżają kompletność Turinga, modelując pamięć niezwiązaną i wykonując wszelkie możliwe obliczenia, które mieszczą się w pamięci systemu.

Shelby Moore III
źródło
2

Myślę, że znaczenie pojęcia „Turing Complete” polega na zdolności do identyfikacji maszyny komputerowej (niekoniecznie mechanicznej / elektrycznej „komputera”), której procesy można przekształcić w „proste” instrukcje, złożone z prostszych i prostszych instrukcje, które maszyna Universal może zinterpretować, a następnie wykonać.

Bardzo polecam The Adnotated Turing

@ Mark Myślę, że to, co wyjaśniasz, jest mieszanką opisu Universal Turing Machine i Turing Complete.

Coś, co jest Turing Complete, w sensie praktycznym, byłoby maszyną / procesem / obliczeniem, które można zapisać i przedstawić jako program do wykonania przez maszynę uniwersalną (komputer stacjonarny). Chociaż nie bierze pod uwagę czasu ani miejsca przechowywania, jak wspomniali inni.

Brian Leahy
źródło
2

Co rozumiem w prostych słowach:

Turing Complete: język programowania / program, który może wykonywać obliczenia, jest Turing zakończony.

Na przykład :

  1. Czy możesz dodać dwie liczby za pomocą samego HTML . (Odpowiedź brzmi „ Nie ”, aby wykonać dodawanie, musisz użyć javascript). Dlatego HTML nie jest Turing Complete.

  2. Języki takie jak Java, C ++, Python, JavaScript, Solidity for Ethereum itp. Są Turing Complete, ponieważ możesz wykonywać obliczenia, takie jak dodawanie dwóch liczb za pomocą tych języków.

Mam nadzieję że to pomoże.

Shirish Singh
źródło
0

Jest kompletny, jeśli może testować i rozgałęziać się (ma „if”)

Allan Wrobel
źródło
1
W przypadku tak starego pytania warto sprawdzić, czy inni już wnieśli podobny lub bardziej znaczący wkład
alan ocallaghan
Nie jestem pewien co do poprawności odpowiedzi. Ale to naprawdę proste wytłumaczenie, którego nigdy wcześniej nie widziałem. Zabawne: dawno, dawno temu (po napisaniu pierwszego fragmentu kodu) użyłem tego samego wyjaśnienia, aby zdefiniować najprostszy możliwy procesor.
Victor Yarema
To doskonała pierwsza próba dokładnej, zwięzłej i dokładnej definicji operacyjnej. Jednak gałąź musi zezwalać na zapętlanie i czy nie jest tak, że maszyna musi także zezwalać na wywołania podprogramów (tj. Rekurencję)? Czy istnieje spłaszczony program zagnieżdżonych pętli dla każdego programu z rekurencją?
user3673
0

Maszyna Turinga wymaga, aby każdy program mógł przeprowadzić test warunków. To jest fundamentalne.

Rozważ rzut pianina gracza. Fortepian odtwarzający może odtwarzać bardzo skomplikowane utwory muzyczne, ale w muzyce nigdy nie ma logiki warunkowej. To jest Turing Complete.

Logika warunkowa to zarówno siła, jak i niebezpieczeństwo maszyny, która jest Turing Complete.

Rolka pianina gwarantuje zatrzymanie się za każdym razem. Nie ma takiej gwarancji na TM. Nazywa się to „problemem zatrzymania”.

Richard Riehle
źródło
-1

Jak powiedział Waylon Flinn :

Turing Complete oznacza, że ​​jest co najmniej tak potężny jak Maszyna Turinga.

Uważam, że jest to niepoprawne, system jest kompletnie Turinga, jeśli jest dokładnie tak potężny jak Maszyna Turinga, tzn. Każde obliczenie wykonane przez maszynę może być wykonane przez system, ale również każde obliczenie wykonane przez system może być wykonane przez maszynę Turinga .

ChrisC
źródło
1
Myślę, że zakładasz, że teza Kościoła w Turingu jest prawdziwa, aby dojść do tego wniosku. To jeszcze nie zostało udowodnione. Opisywana właściwość nosi nazwę „Równoważność Turinga”.
Waylon Flinn,
1
@WaylonFlinn Nie, ma rację. „Kompletność” oznacza zarówno, że jest co najmniej tak silna jak rzecz, ale także nie jest silniejsza. Porównaj z „NP-Complete”.
Devin Jeanpierre
3
@DevinJeanpierre Nie chcę tutaj rozpętać wojny z płomieniami, ale jestem prawie pewien, że opisywana klasa obliczeniowa nazywa się „Turing Equivalent”. Turing Complete ma jednak podobny związek z NP-Complete. NP-Complete jest równy NP wtedy i tylko wtedy, gdy P = NP. W ten sam sposób Turing Complete jest równy Turing Equivalent wtedy i tylko wtedy, gdy teza Church-Turinga jest poprawna.
Waylon Flinn
@Waylon Source? Nic, co przeczytałem, nie zgadza się z tym (np. En.wikipedia.org/wiki/Turing_completeness )
Devin Jeanpierre
4
@DevinJeanpierre Mówi o tym właśnie w artykule na Wikipedii, do którego link. Cytując sekcję Definicje formalne: „System obliczeniowy, który może obliczyć każdą funkcję obliczalną Turinga, nazywa się Turing complete”, „System Turinga kompletny nazywa się Turinga ekwiwalentem, jeśli każda funkcja, którą może obliczyć, jest również obliczalna Turinga”
Waylon Flinn
-2

W praktycznych terminach językowych znanych większości programistów, zwykłym sposobem na wykrycie kompletności Turinga jest, jeśli język pozwala lub pozwala na symulację zagnieżdżonych instrukcji niezwiązanych while (w przeciwieństwie do instrukcji w stylu Pascala dla instrukcji z ustalonymi górnymi granicami).

Keith Douglas
źródło
1
Wystarczy jedna nieograniczona pętla while, aby zasymulować maszynę Turinga.
masterxilo
-8

Czy relacyjna baza danych może wprowadzić szerokości i długości geograficzne miejsc i dróg oraz obliczyć najkrótszą drogę między nimi - nie. Jest to jeden problem, który pokazuje, że SQL nie jest ukończony przez Turinga.

Ale C ++ może to zrobić i może zrobić każdy problem. Tak to jest.

Akshay Jain
źródło
10
Możliwość obliczenia najkrótszej ścieżki między punktami nie jest kompletną definicją Turinga. Jest o wiele więcej niż tylko jeden przykład.
Eva,
1
Po prostu umieszczę to tutaj ... hansolav.net/blog/ImplementingDijkstrasAlametermUsingTSQL.aspx
Matthew Whited