it-swarm.com.de

Was macht eine Sprache Turing-komplett?

Was sind die minimalen Sprachmerkmale/-strukturen, die es Turing-vollständig machen?

83
Curious Cat

A Turing-Tarpit ist eine Art esoterische Programmiersprache, die sich bemüht, Turing-vollständig zu sein und dabei so wenig Elemente wie möglich zu verwenden. Brainfuck ist vielleicht die bekannteste Plane, aber es gibt viele.

  • Iota und Jot sind funktionale Sprachen mit zwei bzw. drei Symbolen, basierend auf dem SK (I) Kombinator-Kalkül .

  • OISC ( One Instruction Set Computer ) bezeichnet eine Art imperativer Berechnung, die normalerweise nur eine Anweisung mit einem oder mehreren Argumenten erfordert. “ subtrahieren und verzweigen, wenn kleiner oder gleich Null ist “oder„ subtrahieren und überspringen, wenn ausgeliehen “. Die x86-MM implementiert die vorherige Anweisung und ist somit Turing-vollständig.

Im Allgemeinen benötigt eine imperative Sprache, um Turing-vollständig zu sein, Folgendes:

  1. Eine Form der bedingten Wiederholung oder des bedingten Sprungs (z. B. while, if + goto)

  2. Eine Möglichkeit zum Lesen und Schreiben irgendeiner Form von Speicher (z. B. Variablen, Band)

Damit eine Lambda-Rechnung - basierte Funktionssprache TC ist, benötigt sie:

  1. Die Fähigkeit, Funktionen über Argumente zu abstrahieren (z. B. Lambda-Abstraktion, Zitat)

  2. Die Fähigkeit, Funktionen auf Argumente anzuwenden (z. B. Reduktion)

Es gibt natürlich auch andere Betrachtungsweisen für die Berechnung, aber dies sind gängige Modelle für Turing-Tarpits. Beachten Sie, dass echte Computer nichtniverselle Turing-Maschinen sind, da sie keinen unbegrenzten Speicher haben. Genau genommen handelt es sich um „gebundene Speichermaschinen“. Wenn Sie ihnen weiterhin Speicher hinzufügen würden, würden sie sich asymptotisch Turing-Maschinen an der Macht nähern. Für die Berechnung sind jedoch auch begrenzte Speichermaschinen und Finite-State-Maschinen nützlich. sie sind einfach nicht universal.

Genau genommen ist E/A für die Vollständigkeit der Turing nicht erforderlich. TC behauptet nur, dass eine Sprache berechnen die gewünschte Funktion kann, nicht, dass sie zeigen das Ergebnis kann. In der Praxis hat jede nützliche Sprache eine Möglichkeit, irgendwie mit der Welt zu interagieren.

74
Jon Purdy

Aus praktischer Sicht: Wenn Sie alle Programme in einer Turing-vollständigen Sprache in Ihre Sprache übersetzen können, muss Ihre Sprache (soweit ich weiß) Turing-vollständig sein. Wenn Sie überprüfen möchten, ob eine von Ihnen entworfene Sprache Turing-vollständig ist, können Sie einfach einen Brainf *** an den YourLanguage-Compiler schreiben und beweisen/demonstrieren, dass er alle legalen BF-Programme kompilieren kann.

Zur Verdeutlichung meine ich, dass Sie zusätzlich zu einem Interpreter für YourLanguage einen Compiler (in einer beliebigen Sprache) schreiben, der jedes BF-Programm für YourLanguage kompilieren kann (natürlich unter Beibehaltung der gleichen Semantik).

15
Anton Golov

Ein System kann nur dann als vollständig angesehen werden, wenn es alles kann, was eine universelle Turing-Maschine kann. Da die universelle Turing-Maschine in der Lage sein soll, jede berechenbare Funktion zu einem bestimmten Zeitpunkt zu lösen, können Turing-Komplettsysteme dies auch tun.

Um zu überprüfen, ob etwas Turing vollständig ist, prüfen Sie, ob Sie eine Turing-Maschine darin implementieren können. Mit anderen Worten, prüfen Sie, ob Folgendes simuliert werden kann:

  1. Die Fähigkeit, "Variablen" (oder beliebige Daten) zu lesen und zu schreiben: Ziemlich selbsterklärend.
  2. Die Fähigkeit, das Bewegen des Lese-/Schreibkopfs zu simulieren: Es reicht nicht aus, nur Variablen abzurufen und zu speichern. Es muss auch möglich sein, die Fähigkeit zu simulieren, den Kopf des Bandes zu bewegen, um auf andere Variablen zu verweisen. Dies kann häufig in Programmiersprachen unter Verwendung von Array-Datenstrukturen (oder Äquivalenten) oder bei bestimmten Sprachen wie Maschinencode durch die Möglichkeit, andere Variablen mithilfe von "Zeigern" (oder Äquivalenten) zu referenzieren, simuliert werden.
  3. Die Fähigkeit, eine Finite-State-Maschine zu simulieren: Obwohl nicht oft erwähnt, sind Turing-Maschinen tatsächlich eine Variation der Finite-State-Maschinen, die häufig in der AI-Entwicklung verwendet werden. Alan Turing sagte, der Zweck der Staaten sei es, die "verschiedenen Arten der Problemlösung" einer Person zu simulieren.
  4. Ein "Halt" -Zustand: Obwohl oft erwähnt wird, dass sich eine Reihe von Regeln wiederholen muss, um als Turing vollständig zu gelten, ist dies seit der formalen Definition von was kein wirklich gutes Kriterium Ein Algorithmus ist ein Zustand, den Algorithmen immer irgendwann abschließen müssen. Wenn sie nicht auf irgendeine Weise schließen können, ist entweder Turing nicht vollständig oder der Algorithmus ist keine berechenbare Funktion. Umfassende Systeme, die aufgrund ihrer Funktionsweise technisch nicht abgeschlossen werden können (wie z. B. Spielekonsolen), umgehen diese Einschränkung, indem sie einen Haltezustand auf irgendeine Weise "simulieren" können. Nicht zu verwechseln mit dem "Stopping-Problem", einer unentscheidbaren Funktion, die beweist, dass es unmöglich ist, ein System zu erstellen, das mit 100% iger Zuverlässigkeit erkennen kann, wenn eine bestimmte Eingabe dazu führt, dass ein anderes System nicht zu dem Schluss kommt.

Dies sind die wahren Mindestanforderungen für ein System, das als vollständig angesehen werden soll. Nicht mehr, nicht weniger. Wenn es keines davon auf irgendeine Weise simulieren kann, ist es nicht vollständig. Die von anderen vorgeschlagenen Methoden sind nur Mittel zum Zweck, da es mehrere Turing-Komplettsysteme gibt, die diese Funktionen nicht bieten.

Beachten Sie, dass es keine bekannte Möglichkeit gibt, ein echtes Turing-Komplettsystem zu erstellen. Dies liegt daran, dass es keine bekannte Möglichkeit gibt, die Grenzenlosigkeit des Bandes der Turing-Maschine im physischen Raum wirklich zu simulieren.

8
user3067516

Eine notwendige Bedingung ist eine Schleife mit einer maximalen Iterationszahl, die nicht vor der Iteration bestimmt wird, oder eine Rekursion, bei der die maximale Rekursionstiefe nicht vorab bestimmt wird. Zum Beispiel sind für ... in ... Schleifen, wie Sie sie in vielen neueren Sprachen finden, nicht genug, um die Sprachvervollständigung zu vervollständigen (aber sie haben andere Mittel). Beachten Sie, dass dies nicht eine begrenzte Anzahl von Iterationen oder eine begrenzte Rekursionstiefe bedeutet, sondern dass die maximale Iteration und Rekursionstiefe im Voraus berechnet werden muss.

Beispielsweise kann die Ackermann-Funktion ohne diese Funktionen nicht in einer Sprache berechnet werden. Auf der anderen Seite kann eine Menge hochkomplexer und äußerst nützlicher Software geschrieben werden, ohne dass diese Funktionen erforderlich sind.

Andererseits kann mit jeder Iterationszahl und jeder im Voraus berechneten Rekursionstiefe nicht nur entschieden werden, ob ein Programm angehalten wird oder nicht, sondern es wird anhalten.

4
gnasher729

Eine Programmiersprache ist vollständig, wenn Sie damit rechnen können. Es gibt nicht nur eine Reihe von Funktionen, die eine Sprachprüfung vervollständigen. Antworten, die besagen, dass Sie Schleifen benötigen oder dass Sie Variablen benötigen, sind falsch, da es Sprachen gibt, die hat keine , aber vollständig sind.

Alan Turing hat die Universal-Turing-Maschine entwickelt. Wenn Sie ein Programm übersetzen können, das für die Universal-Maschine entwickelt wurde, um in Ihrer Sprache ausgeführt zu werden, ist Turing ebenfalls vollständig. Dies funktioniert auch indirekt, sodass Sie sagen können, dass die Sprache X vollständig ist, wenn alle Programme für die vollständige Sprache Y für X übersetzt werden können, da alle universellen Turing-Maschinenprogramme in ein Y-Programm übersetzt werden können.

Die zeitliche Komplexität, die räumliche Komplexität, das einfache Eingabe-/Ausgabeformat und das einfache Schreiben eines Programms sind nicht in der Gleichung enthalten, sodass eine solche Maschine theoretisch alle Berechnungen durchführen kann, wenn die Berechnungen nicht durch Leistungsverlust oder Verschlucken der Erde durch die Sonne gestoppt werden.

Um die Vollständigkeit der Sprache zu beweisen, stellen sie normalerweise einen Dolmetscher für jede nachweislich vollständige Sprache her. Damit dies jedoch funktioniert, benötigen Sie Eingabe- und Ausgabemittel, zwei Dinge, die für eine vollständige Sprache wirklich nicht erforderlich sind. Es reicht aus, dass Ihr Programm beim Start seinen Status ändern kann und Sie den Speicher überprüfen können, nachdem das Programm angehalten wurde.

Um eine erfolgreiche Sprache zu erstellen, ist jedoch mehr als nur Vollständigkeit erforderlich, und dies gilt auch für Tarpits. Ich glaube nicht, dass BrainFuck ohne , Und . Beliebt gewesen wäre.

4
Sylwester

Sie können nicht sagen, ob es eine Endlosschleife gibt oder aufhört.

-------------

Erläuterung: Bei einigen Eingaben ist es unmöglich, in jedem Fall (unter Verwendung einer anderen Turing-Maschine) zu sagen, ob das Ding eine Endlosschleife ausführen oder schließlich anhalten wird, außer durch Ausführen (was Ihnen eine Antwort gibt, wenn es aufhört, aber nicht) wenn es schleift!).

Dies bedeutet, dass Sie in der Lage sein müssen, eine potenziell unbegrenzte Datenmenge auf irgendeine Weise zu speichern - es muss ein Äquivalent zum unendlichen Band geben, egal wie kompliziert es ist! (Andernfalls gibt es nur eine begrenzte Anzahl von Zuständen, und dann können Sie überprüfen, ob Sie diesen Zustand zuvor durchlaufen haben, und schließlich aufhören). Im Allgemeinen können Turing-Maschinen die Größe ihres Zustands durch steuerbare Mittel vergrößern oder verkleinern.

Da die ursprüngliche universelle Turing-Maschine von Turing ein unlösbares Halteproblem aufweist, muss auch Ihre eigene Turing-Komplettmaschine ein unlösbares Halteproblem aufweisen.

Turing-Komplettsysteme können jedes andere Turing-Komplettsystem emulieren. Wenn Sie also einen Emulator für ein bekanntes Turing-Komplettsystem in Ihrem System erstellen können, zeigt dies, dass Ihr System auch Turing-Komplettsystem ist.

Angenommen, Sie möchten beweisen, dass Snakes & Ladders vollständig ist, wenn Sie ein Board mit einem unendlich wiederholten Gittermuster (mit einer anderen Version oben und links) erhalten. Wenn Sie wissen, dass die 2-Zähler-Minsky-Maschine Turing vollständig ist (mit 2 unbegrenzten Zählern und 1 Zustand aus einer endlichen Zahl), können Sie eine äquivalente Karte erstellen, bei der die X- und Y-Position im Raster der aktuelle Wert der 2 Zähler ist und der aktuelle Pfad ist der aktuelle Zustand. Knall! Sie haben gerade bewiesen, dass Snakes & Ladders vollständig sind.

4