Kompletność Turinga mówi jedno i tylko jedno: model obliczeniowy jest kompletny Turinga, jeśli dowolne obliczenia, które mogą być modelowane przez maszynę Turinga, mogą być również modelowane przez ten model.
Jakie więc obliczenia może modelować maszyna Turinga? Przede wszystkim Alan Turing i wszyscy jego koledzy byli zawsze zainteresowani funkcjami liczb naturalnych. Tak więc Maszyna Turinga (i rachunek λ, rachunek kombinatoryczny SK, funkcje rekurencyjne μ,…) mówią tylko o obliczalności funkcji na liczbach naturalnych. Jeśli nie mówimy o funkcji na liczbach naturalnych, koncepcja kompletności Turinga nawet nie ma sensu, po prostu nie ma zastosowania.
Zauważ jednak, że możemy zakodować wiele interesujących rzeczy jako liczby naturalne. Możemy kodować ciągi jako liczby naturalne, możemy kodować wykresy jako liczby naturalne, możemy kodować logiczne liczby naturalne. Możemy zakodować Maszyny Turinga jako liczby naturalne, co pozwala nam tworzyć Maszyny Turinga, które mówią o Maszynach Turinga!
I oczywiście nie wszystkie funkcje liczb naturalnych są obliczalne. Maszyna Turinga może obliczyć tylko niektóre funkcje na liczbach naturalnych, rachunek λ może obliczyć tylko niektóre funkcje na liczbach naturalnych, rachunek kombinacyjny SK może obliczyć tylko niektóre funkcje na liczbach naturalnych,… Zaskakujące (lub nie) okazuje się, że każdy model obliczeń (który jest faktycznie możliwy do zrealizowania w naszym fizycznym wszechświecie) może obliczać te same funkcje na liczbach naturalnych (przynajmniej dla wszystkich modeli, które znaleźliśmy do tej pory). [Uwaga: oczywiście istnieją słabsze modele obliczeń, ale nie znaleźliśmy jeszcze takiego, który jest silniejszy, z wyjątkiem niektórych, które są oczywiście niezgodne z naszym fizycznym wszechświatem, takich jak modele wykorzystujące liczby rzeczywiste lub podróże w czasie.]
Fakt, że po długim okresie poszukiwania wielu różnych modeli, za każdym razem odkrywamy, że mogą one wyliczyć dokładnie te same funkcje, jest podstawą tezy Kościoła-Turinga, która mówi (z grubsza), że wszystkie modele obliczeń są równie potężne i że wszystkie zawierają „idealne” pojęcie tego, co to znaczy być „obliczalnym”. (Istnieje również drugi, bardziej filozoficzny aspekt CTT, a mianowicie to, że człowiek podążający za algorytmem może również obliczyć dokładnie te same funkcje, które TM może obliczyć i nie więcej.)
Jednak nic z tego nie mówi
- jak wydajne są różne modele
- jak wygodne są w użyciu
- co jeszcze mogą zrobić oprócz funkcji obliczeniowych na liczbach naturalnych
I że jest dokładnie tam, gdzie różnice pomiędzy różnymi modelami obliczeń (i językach programowania) wchodzą w grę.
Jako przykład innej wydajności zarówno maszyna o dostępie swobodnym, jak i maszyna Turinga mogą kopiować tablicę. Jednak RAM musi operacji do tego, podczas gdy TM musi Ò ( s ı ż e 2 r r y ) operacji, ponieważ musi ona przejść w poprzek y ı Z e r r a y elementy układu do kopiowania każdy element i są y i z eO ( s i zmir r z y)O ( s i zmi2)r r z y)s i zmir r z y elementy do kopiowania.s i zmir r z y
Jako przykład różnej wygody możesz po prostu porównać kod napisany w języku bardzo wysokiego poziomu, kod napisany w asemblerze oraz opis bazy TM do rozwiązania tego samego problemu.
A twój włącznik światła jest przykładem trzeciego rodzaju różnicy, rzeczy, które niektóre modele mogą zrobić, które nie działają na liczbach naturalnych, a zatem nie mają nic wspólnego z kompletnością Turinga.
Aby odpowiedzieć na konkretne pytania:
Ale czy każdy program napisany w pełnym języku Turinga może zostać napisany w innym?
Nie. Tylko jeśli program oblicza funkcję obliczalną Turinga na liczbach naturalnych. I nawet wtedy może wymagać złożonego kodowania. Na przykład rachunek λ nie ma nawet liczb naturalnych, należy je zakodować za pomocą funkcji (ponieważ funkcje są jedyną rzeczą, jaką ma rachunek λ).
To kodowanie danych wejściowych i wyjściowych może być bardzo złożone, podobnie jak wyrażanie algorytmu. Tak więc, chociaż prawdą jest, że każdy program można przepisać, przepisany program może być znacznie bardziej złożony, znacznie większy, zużywać znacznie więcej pamięci i być znacznie wolniejszy.
Co się stanie, jeśli moje Zgromadzenie ma kod operacyjny LIGHTBUTTON? Nie mogę naśladować tego języka w systemie (języku) bez żarówki.
Żarówka nie jest funkcją obliczalną Turinga dla liczb naturalnych. Naprawdę żarówka nie jest ani funkcją, ani obliczeniem. Włączanie i wyłączanie żarówki to efekt uboczny we / wy. Maszyny Turinga nie modelują efektów ubocznych I / O, a kompletność Turinga nie jest dla nich istotna.
Na dowolnych liczbach rzeczywistych.
Kompletność Turinga dotyczy tylko funkcji obliczalnych na liczbach naturalnych, nie dotyczy liczb rzeczywistych.
Kompletność Turinga jest po prostu niezbyt interesująca, jeśli chodzi o pytania takie jak twoje z dwóch powodów:
- To nie jest bardzo wysoka przeszkoda. Wszystko czego potrzebujesz to
IF
, GOTO
, WHILE
, i zmienna jedna liczba całkowita (zakładając, że zmienna może posiadać dowolnie dużych liczb całkowitych). Lub rekurencja. Wiele, wiele, wiele innych rzeczy jest kompletnych w Turinga. Gra karciana Magic: The Gathering jest kompletna. CSS3 jest kompletny w Turingu. Plik sendmail
konfiguracyjny jest kompletny Turinga. Procesor Intel x86 MMU jest kompletny. Instrukcja Intel x86 MOV
jest kompletna. Animacje PowerPoint są kompletne. Program Excel (bez skryptów, tylko przy użyciu formuł) jest kompletny Turinga. Protokół routingu BGP jest kompletny Turinga. sed
jest ukończony przez Turinga. mod_rewrite
Reguły Apache są kompletne. Google dla „ (przypadkowo LUB zaskakująco) zakończone"znaleźć inne ciekawe przykłady. Jeśli prawie wszystko jest kompletne, to bycie kompletnym przestaje być interesującą właściwością.
- W rzeczywistości nie jest konieczne, aby być użytecznym. Wiele przydatnych rzeczy nie jest kompletnych w Turinga. CSS przed wersji 3 nie jest Turing-complete (oraz fakt, że CSS3 to nie jest faktycznie wykorzystywany przez nikogo). SQL przed 1999 rokiem nie był kompletny w Turinga, ale był niezwykle przydatny nawet wtedy. Język programowania C bez dodatkowych bibliotek nie wydaje się być kompletny w Turingu . Języki pisane zależnie, mniej więcej z definicji, nie są pełne Turinga, ale można w nich pisać systemy operacyjne, serwery sieciowe i gry.
Edwin Brady, autor Idris, używa terminu „Tetris-complete”, aby mówić o niektórych z tych aspektów. Bycie kompletnym w Tetris nie jest rygorystycznie zdefiniowane (poza oczywistym „może być użyty do implementacji Tetris”), ale obejmuje takie rzeczy, jak bycie na wysokim poziomie i na tyle ekspresyjnym, że można napisać grę bez szaleństwa, możliwość interakcja ze światem zewnętrznym (wejście i wyjście), zdolność do wyrażania skutków ubocznych, możliwość pisania pętli zdarzeń, zdolność do wyrażania programów reaktywnych, asynchronicznych i współbieżnych, możliwość interakcji z systemem operacyjnym, możliwość do interakcji z bibliotekami obcymi (innymi słowy: możliwość dzwonienia i bycia wywoływanym przez kod C) i tak dalej. Są to o wiele bardziej interesujące cechy języka programowania ogólnego przeznaczenia niż Turinga-kompletność.
Być może moja odpowiedź na pytanie, które połączyłeś, jest interesująca, która dotyczy niektórych tych samych punktów, mimo że odpowiada na inne pytanie.