Ich überlegte eine Weile, ob ich noch eine Antwort hinzufügen sollte. Die anderen Antworten konzentrieren sich auf die Mitte seiner Frage ("Turing Complete", "Tautology" usw.). Lassen Sie mich den ersten und letzten Teil und damit das größere und leicht philosophische Bild festhalten:
Aber was bedeutet es?
Was bedeutet es, Turing vollständig zu sein?
Gibt es eine Möglichkeit, die Funktionen von Turing Machine zu definieren, ohne nur zu sagen, dass "eine andere Turing Machine simuliert werden kann"?
Informell ausgedrückt bedeutet Turing Complete, dass Ihr Mechanismus jeden erdenklichen Algorithmus ausführen kann , unabhängig davon, wie komplex, tief, rekursiv, kompliziert, lang (in Bezug auf Code) er ist und wie viel Speicherplatz oder Zeit benötigt wird benötigt, um es zu bewerten. Es ist selbstverständlich , dass es gelingt nur , wenn das Problem berechenbar ist, aber wenn es ist berechenbar, es wird (Halt) gelingen.
(NB: Um herauszufinden, warum dies "informell" ist, lesen Sie die Church-Turing-These, die in diesem Sinne verfasst ist. Da es sich um eine These handelt, könnte sie jedoch richtig sein oder auch nicht. Dank an @DavidRicherby für wies in einem Kommentar auf diese kleine Lücke hin.)
"Algorithmus" bedeutet das, was wir heute allgemein als Computeralgorithmus verstehen. dh eine Reihe von diskreten Schritten, die den Speicher manipulieren, wobei eine Steuerlogik eingemischt ist. Es ist jedoch nicht wie eine Oracle-Maschine, dh es kann nicht "erraten".
Beispiel für eine praktische Fremdsprache
Wenn Sie sich selbst programmiert haben, kennen Sie wahrscheinlich reguläre Ausdrücke, mit denen Zeichenfolgen einem Muster zugeordnet werden.
Dies ist ein Beispiel für ein Konstrukt, das nicht vollständig ist. Sie können leicht Übungen finden, bei denen es einfach unmöglich ist, einen regulären Ausdruck zu erstellen, der bestimmten Phrasen entspricht.
Zum Beispiel (und dies hat sicherlich viele Programmierer in der tatsächlichen realen Anwendungen geärgert), ist es theoretisch und praktisch unmöglich , einen regulären Ausdruck zu erstellen , die eine Programmiersprache oder ein XML - Dokument übereinstimmt: Es ist unmöglich für eine regexp die Blockstruktur zu finden ( do ... end
oder { ... }
in Sprachen (Öffnen und Schließen von Tags in XML-Dokumenten), wenn sie beliebig tief sein dürfen. Wenn es dort eine Beschränkung gibt, können Sie beispielsweise nur drei Ebenen der "Rekursion" haben, dann könnten Sie einen regulären Ausdruck finden; aber wenn es nicht begrenzt ist, dann ist es ein No-Go.
Da es offensichtlich möglich ist, ein Programm in einer Turing-vollständigen Sprache (wie C) zu erstellen, um den Quellcode zu analysieren (jeder Compiler tut dies), können reguläre Ausdrücke dieses Programm niemals simulieren, daher sind sie per Definition nicht Turing-vollständig
Motivation
Die Idee der Turingmaschine an sich ist nichts Praktisches; Das heißt, Turing hat es sicherlich nicht erfunden, um einen echten Computer oder so etwas zu erschaffen, im Gegensatz zu zum Beispiel Charles Babbage oder von Neumann. Das Konzept der Turing-Maschine ist äußerst einfach. Es besteht fast aus nichts. Es reduziert mögliche (und tatsächliche) Computer auf ein denkbar geringes Maß.
Der Sinn dieser Vereinfachung besteht wiederum darin, dass es so einfach (ish) ist, über theoretische Fragen nachzudenken (wie das Stoppen von Problemen, Komplexitätsklassen und was auch immer sich die theoretische Informatik selbst stört). Ein besonderes Merkmal ist, dass es normalerweise sehr einfach ist, zu überprüfen, ob eine bestimmte Sprache oder ein bestimmter Computer eine Turing-Maschine simulieren kann, indem einfach die Turing-Maschine (was so einfach ist!) In dieser Sprache programmiert wird.
Zur Unendlichkeit
Beachten Sie, dass Sie niemals unendlich viel Zeit oder Speicherplatz benötigen . aber sowohl Zeit als auch Speicher sind unbegrenzt. Sie haben einen Maximalwert für jeden einzelnen berechenbaren Lauf, aber es gibt keine Begrenzung dafür, wie groß dieser Wert werden kann. Die Tatsache, dass einem echten Computer irgendwann der Arbeitsspeicher ausgeht, wird hier beschönigt. Dies ist natürlich eine Grenze für jeden physischen Computer, aber es ist auch offensichtlich und für die theoretische "Rechenleistung" der Maschine nicht von Interesse. Außerdem interessiert es uns überhaupt nicht, wie lange es tatsächlich dauert. Unsere kleine Maschine kann also beliebig viel Zeit und Raum beanspruchen, was sie absolut unpraktisch macht.
... und darüber hinaus
Ein erstaunlicher letzter Punkt ist, dass so eine einfache Sache alles kann, was ein realer Computer im gesamten Universum jemals erreichen könnte (nur sehr viel langsamer) - zumindest soweit wir heute wissen.