Turing-Vollständigkeit sagt nur eins aus: Ein Berechnungsmodell ist Turing-vollständig, wenn eine Berechnung, die von einer Turing-Maschine modelliert werden kann, auch von diesem Modell modelliert werden kann.
Welche Berechnungen kann eine Turing-Maschine durchführen? Nun, zuallererst waren Alan Turing und alle seine Kollegen immer nur an Funktionen mit natürlichen Zahlen interessiert. Die Turing-Maschine (und der λ-Kalkül, der SK-Kombinator-Kalkül, μ-rekursive Funktionen,…) sprechen also nur über die Rechenbarkeit von Funktionen auf natürlichen Zahlen. Wenn Sie nicht über eine Funktion auf natürlichen Zahlen sprechen, dann ist das Konzept der Turing-Vollständigkeit nicht einmal sinnvoll, es ist einfach nicht anwendbar.
Beachten Sie jedoch, dass wir viele interessante Dinge als natürliche Zahlen kodieren können. Wir können Strings als natürliche Zahlen kodieren, wir können Graphen als natürliche Zahlen kodieren, wir können Boolesche Werte als natürliche Zahlen kodieren. Wir können Turing-Maschinen als natürliche Zahlen kodieren , wodurch wir Turing-Maschinen erstellen können, die über Turing-Maschinen sprechen!
Und natürlich sind nicht alle Funktionen für natürliche Zahlen berechenbar. Eine Turing-Maschine kann nur einige Funktionen für natürliche Zahlen berechnen , der λ-Kalkül kann nur einige Funktionen für natürliche Zahlen berechnen , der SK-Kombinator-Kalkül kann nur einige Funktionen für natürliche Zahlen berechnen ,…. Überraschenderweise (oder auch nicht) stellt sich heraus, dass jeder Rechenmodell (das in unserem physikalischen Universum tatsächlich realisierbar ist) dieselben Funktionen für natürliche Zahlen berechnen kann (zumindest für alle Modelle, die wir bisher gefunden haben). [Anmerkung: Natürlich gibt es schwächere Rechenmodelle, aber wir haben noch kein stärkeres gefunden, außer einigen, die offensichtlich nicht mit unserem physikalischen Universum kompatibel sind, wie zum Beispiel Modelle, die reelle Zahlen oder Zeitreisen verwenden.]
Diese Tatsache, dass wir nach einer langen Zeit der Suche nach vielen verschiedenen Modellen jedes Mal feststellen, dass sie genau die gleichen Funktionen berechnen können, ist die Grundlage für die Church-Turing-These, die (grob) besagt, dass alle Berechnungsmodelle sind gleichermaßen leistungsfähig und erfassen alle die "ideale" Vorstellung davon, was es bedeutet, "berechenbar" zu sein. (Es gibt auch einen zweiten, philosophischeren Aspekt der CTT, nämlich, dass ein Mensch, der einem Algorithmus folgt, genau dieselben Funktionen berechnen kann, die ein TM berechnen kann, und nicht mehr.)
Doch nichts davon sagt nichts über
- wie effizient die verschiedenen Modelle sind
- Wie bequem sie zu bedienen sind
- was sonst können sie tun , außer auf den natürlichen Zahlen Rechenfunktionen
Und das ist genau dort , wo die Unterschiede zwischen den verschiedenen Modellen der Berechnung (und Programmiersprachen) ins Spiel kommen.
O(sizearray)O(size2array)sizearraysizearray Elemente zu kopieren.
Als Beispiel für unterschiedliche Bequemlichkeiten können Sie einfach in einer höheren Sprache geschriebenen Code, in Assembler geschriebenen Code und die Beschreibung eines TM vergleichen, um dasselbe Problem zu lösen.
Und Ihr Lichtschalter ist ein Beispiel für die dritte Art von Unterschied. Dinge, die einige Modelle tun können, funktionieren nicht mit natürlichen Zahlen und haben daher nichts mit Turing-Vollständigkeit zu tun.
Um Ihre spezifischen Fragen zu beantworten:
Aber kann ein Programm, das in einer vollständigen Sprache von Turing geschrieben wurde, in einer anderen Sprache umgeschrieben werden?
Nein. Nur wenn das Programm eine Turing-berechenbare Funktion auf natürlichen Zahlen berechnet. Und selbst dann kann eine komplexe Codierung erforderlich sein. Zum Beispiel hat λ-Kalkül nicht einmal natürliche Zahlen, sie müssen mit Funktionen codiert werden (weil Funktionen das einzige sind, was λ-Kalkül hat).
Diese Codierung der Eingabe und Ausgabe kann sehr komplex sein, ebenso wie das Ausdrücken des Algorithmus. So, während es wahr ist , dass jedes Programm kann neu geschrieben werden, das umgeschriebene Programm kann viel komplexer, viel größer, verwendet viel mehr Speicher und viel langsamer sein.
Was ist, wenn meine Assembly einen LIGHTBUTTON-Opcode hat? Ich kann diese Sprache physisch nicht auf einem System (einer Sprache) ohne eine Glühbirne emulieren.
Eine Glühbirne ist keine nach Turing berechenbare Funktion für natürliche Zahlen. In Wirklichkeit ist eine Glühbirne weder eine Funktion noch eine Berechnung. Das Ein- und Ausschalten einer Glühbirne ist ein E / A-Nebeneffekt. Turing-Maschinen modellieren keine I / O-Nebenwirkungen, und Turing-Vollständigkeit ist für sie nicht relevant.
Auf beliebigen reellen Zahlen.
Die Turing-Vollständigkeit befasst sich nur mit berechenbaren Funktionen auf natürlichen Zahlen, sie befasst sich nicht mit reellen Zahlen.
Turing-Vollständigkeit ist aus zwei Gründen einfach nicht sehr interessant, wenn es um Fragen wie Ihre geht:
- Es ist keine sehr hohe Hürde. Alles , was Sie brauchen , ist
IF
, GOTO
, WHILE
und ein einzelner Integer - Variable (die Variable unter der Annahme , beliebig große ganze Zahlen halten kann). Oder Rekursion. Viele, viele, viele Sachen sind Turing-komplett. Das Kartenspiel Magic: The Gathering ist Turing-complete. CSS3 ist Turing-complete. Die sendmail
Konfigurationsdatei ist vollständig. Die Intel x86 MMU ist Turing-komplett. Die Intel x86- MOV
Anweisung ist vollständig. PowerPoint-Animationen sind Turing-komplett. Excel (ohne Scripting, nur mit Formeln) ist vollständig. Das BGP-Routing-Protokoll ist vollständig. sed
ist Turing-komplett. Apache- mod_rewrite
Regeln sind vollständig. Google für " (aus Versehen ODER überraschenderweise) Turing" abgeschlossen", um einige andere interessante Beispiele zu finden. Wenn fast alles Turing-vollständig ist, hört Turing-vollständig zu sein auf, ein interessantes Eigentum zu sein.
- Es ist eigentlich nicht notwendig, nützlich zu sein. Viele nützliche Dinge sind nicht vollständig. CSS vor der Version 3 ist nicht Turing-vollständig (und die Tatsache , dass CSS3 ist durch jemand nicht wirklich verwendet). SQL vor 1999 war noch nicht vollständig, doch es war selbst dann äußerst nützlich. Die Programmiersprache C ohne zusätzliche Bibliotheken scheint nicht vollständig zu sein . Abhängig eingegebene Sprachen sind mehr oder weniger per Definition nicht vollständig. Sie können jedoch Betriebssysteme, Webserver und Spiele darin schreiben.
Edwin Brady, der Autor von Idris, verwendet den Begriff "Tetris-complete", um über einige dieser Aspekte zu sprechen. Tetris-vollständig zu sein ist nicht streng definiert (außer dem offensichtlichen "kann verwendet werden, um Tetris zu implementieren"), aber es umfasst Dinge, die hoch genug und ausdrucksstark genug sind, um ein Spiel schreiben zu können, ohne verrückt zu werden oder es zu können mit der Außenwelt interagieren (Eingabe und Ausgabe), Nebenwirkungen ausdrücken können, eine Ereignisschleife schreiben können, reaktive, asynchrone und gleichzeitige Programmierung ausdrücken können, mit dem Betriebssystem interagieren können, können mit fremden Bibliotheken interagieren (mit anderen Worten: in der Lage sein, mit C-Code aufzurufen und aufgerufen zu werden) und so weiter. Das sind viel interessantere Merkmale einer Allzweck-Programmiersprache als die Turing-Vollständigkeit.
Vielleicht finden Sie meine Antwort auf die von Ihnen verknüpfte Frage interessant, die einige der gleichen Punkte berührt, obwohl sie eine andere Frage beantwortet.