Gödelnummer / universelle Turing-maschinen ::
part of [[112.00_anchor_overview]]
Bis dato haben wir nur Turingmaschinen betrachte, welche ein einziges Program ausführen können. –> Entspricht noch lange nicht der Idee einer General Purpose Machine, also einem Konstrukt, dass jegliche Aufgaben und Probleme lösen und bewältigen kann.
Um eine Lösung des Problemes zu finden, suchen wir nun eine Sprache die hilft, eine Codierung zu implementieren:
Codierung einer TM ::
Wir definieren hier eine beispielhafte Codierung, die eine TM beschreiben kann. Diese kann man aber auch nach einem anderen Schemata erstellen, sie muss da aber diverse Bedingungen einhalten, die unten weiter / genauer definiert werden.
Sei eine TM Wir suchen nun eine Möglichkeit, um eine TM mit einem binären String codieren zu können.
Mit dieser Konstruktion haben wir die Möglichkeit diverse Zustände mit einer gegebenen Abfolge zu codieren und somit festzulegen und markieren, wann ein Bereich beginnt / beendet wird.
Sei das Arbeitsalphabet definiert mit :. Wir codieren jetzt jeden Buchstaben durch einen binären String:
- Der Code —> gibt eine Möglichkeit der Identifizierung von bestimmten Abschnitten!
Dieselben Codes werden wir auch füý die Buchstaben des Eingabealphabetes definieren. Das heißt :
-
Weiterhin definieren wir den Zustandsraum wobei hier immer den Startzustand, der akzeptierende, der verwerfende Zustand ist. Wir können einen Zustand folgend codieren::
-
Wir Beschreiben außerdem die Codierung zur Bewegung des Schreibkopfes folgend: –> beschreibt Bewegung nach links –> beschreibt Bewegung nach rechts.
-
Wir benötigen noch die Codierung einer Übergangsfunktion:: eine einzelne Transition wird folgend beschrieben: $Code(\delta (q,a) = ( q^{\sym},a^{\sym},B))$ wobei:
- wird gemäß der oberen Def codiert
- jedes Wort wird durch seine Repräsentation mittels der Funktion bestimmt dargestellt.
-
Wir codieren jetzt eine ganze TM folgend: Wir müssen die TM nun mit folgenden Infos befüllen:
- Globale Daten: Anzahl der Zustände, Anzahl der Buchsten im Arbeitsalphabet
- eine Liste aller möglichen Transitionen, die auftreten können: Beschreiben können wir es nun wie folgt:
also ein langer String, der passend codiert eine ganze Maschine darstellt und eindeutig definiert.
Auf diese Weise haben wir durch einen eindeutigen String über beschrieben. Da wir zuvor angegeben haben, wie etwas zu codieren ist, können wir sie in einen reinen binären String umwandeln:: dafür benötigen wir eine bijektive Abbildung: Daraus folgt folgende Codierung, beispielsweise: …
Unter dieser Prämisse können wir jetzt also eine TM in der Form eines Stringes beschreiben. Die Beschreibung der TM in Form eines Tupels ist so etwas wie die Beschreibung einer höheren Programmiersprachen –> denn wir beschreiben was bei gegebenen EIngaben funktioniert, oder nicht. Der binäre Code ist eher die Beschreibung des Programmes in Maschinensprachen ::
TM : Injektivität der Codierung ::
DIe beschrieben Codierung von Turingmaschinen ist als injektiv zu beschreiben: das heißt, wenn wir zwei TMs haben, die bestimmt Codiert werden, dann sind es auch die gleichen TMs. Daraus folgt:
Jeder Code beschreibt also eindeutig eine TM
TM : Gültige / Ungültige Codes
Manche binäre Strings sind gültige Codes für eine TM. Viele binäre Strings codieren keine TM. Wir müssen irgendwie herausfinden, ob ein gegebener String gültig ist oder nicht. Anders beschrieben folgern wird: Behauptung: Es gibt eine TM die für einen binären String entscheidet, ob dieser eine gültige Codierung einer TM ist, oder nicht ( Sie entspricht also einer Syntaxprüfüng!) Die folgende Sprache ist entscheidbar::
TM : Präfixfreie Codierung ::
Eine Codierung ist präfixfrei, wenn es kein Präfix in der Codierung des Codes gibt, der selbst bereits eine Codierung einer anderen TM ist.
Also ein Teil des Codes ist bereits die Codierung einer anderen TM, und somit haben wir eine Doppeldeutigkeit gefunden!
Diese Betrachtung ist relativ wichtig, denn : Bei einer aneinander gehängten Zeichenkette können wir immer entscheiden, wo aufhört und anfängt. Wir müssen also auf Unterteilungen achten!
TM: Lineare Ordnung von Codierung ::
Durch die Codes können wir eine lineare Ordnung auf der Menge aller Turingmaschinen definieren:: Definition einer Linearen Ordnung: Wir sagen dann , falls die natürlichen Zahlen die durch die jeweiligen Strings repräsentiert werden, folgende Eigenschaft aufweisen: . Dann gilt und es gelte immer .
Wir haben hier somit eine totale Ordnung auf die Menge aller binären String definiert ::
- transitiv:
- anti-symmetrie:
- totale Ordnung: Es gilt nur –> folgend aus den obigen Definitionen
Codierung einer -ten Turingmaschine.
Da wir mit einem binären String unter Umständen eine Turingmaschine definieren können –> indem der String der Syntax entspricht und somit eine gültige Maschine gemäß der Codierung ist, kann man Turingmaschinen mit einem Index versehen und sie so als -te Turingmaschine definieren.
Wir können einfach immer längere binäre-strings erzeugen und schauen, ob sie eine gültige Syntax aufweisen. Also
Unter dieser Betrachtung haben wir nun die Möglichkeit chronologisch alle Kombinationen durchzugehen und die -te gefundene Repräsentation passend zu labeln, als die -te Turingmaschine. Formaler betrachtet:: Sei . Für nennen wir die Codierung der -ten Turingmaschine falls für diese gilt:
- für eine TM
- Die Menge enthält genau Wörter, die Codierungen von Turingmaschine sind. Da unsere Wörter immer länger werden, ist diese Aussage logisch folgend..
Berechenbarkeit der -ten Turingmaschine:
Da wir chronologisch beschreibend Turingmaschinen in Form von Codierungen betrachten, besteht für uns die Möglichkeit diese -te Turingmaschine zu berechen. Wir folgern die Behauptung: Es gibt eine TM , die für ein die Codierung der -ten TM berechnet.
Beweisidee dafür:
Die TM geht die binären Strings in der kanonischen Ordnung durch. Auf jeden String endet sie die um entscheiden zu können, ob die Codierung einer TM ist, oder nicht. Falls ja, erhöht sie den Zähler und wiederholt diesen Prozess, bis sie erreicht hat.
wir haben die i-te Turingmaschine in Code-form gefunden und können diese weiter folgend beschreiben:
Gödelnummer einer TM :
Ein solcher Code einer , wie wir ihn zuvor gefunden haben, wird die Gödelnummer der TM genannt.
- also eine eindeutige Beschreibung für eine bestimmte Turingmaschine
- Es ist wichtig, dass sie existiert, und dabei ist egal, wie sie gebaut wird
- Weiterhin muss sie die Injektivität erfüllen
Die Gödelnummer eienr TM wird of auch mit beschrieben. Intuitiv beschreibt die Gödelnummer das Programm selbst, dass von dieser Maschine durchgeführt wird.
Mann das Ganze auch formaler definieren, wann eine Codierung eine Gödelisierung ist.
Definition Gödelisierung :
Sei die Menge aller Turingmaschinen (bzw eine beliebige Sprache, die von einer TM abgearbeitet werden kann…). Dann definieren wir die Abbildung und nennen sie Gödelisierung, falls folgende Eigenschaften erfüllt werden:
- g ist injektiv
- die Bildmenge ist entscheidbar –> also wir können eine TM konstruieren, die für jedes n entscheidet, ob gilt oder nicht.
- Weiterhin müssen: und berechenbar sein!
Gelten diese Eigenschaften, dann ist für ein beliebiges die Gödelnummer von der Menge .
Wir haben nun diverse Turingmaschinen definiert und betrachtet, die immer nur ein Programm ausführen konnten. Aber am besten würden wir gerne eine universale Sprache definieren, die alle Sprachen verarbeiten kann. Daraus folgt anschließend auch, dass alle Turingmaschinen von dieser dargestellt werden können
Konstruktion Universeller TM ::
Wir möchten nun eine universelle TM definieren, die:
- Als Eingabe die Gödelnummer einer normalen TM und ein Wort erhält, wobei auf die TM angewandt werden soll
Die UTM muss also erkennen können, ob es eine TM gibt, die eine bestimmte Eingabe verarbeiten kann und diese finden.
- U soll nun die Operation von auf simulieren, also M auf anwenden. Dabei müssen folgende Eigenschaften gelten:
- U akzeptiert genau dann, wenn M das Wort w akzeptiert
- U hält mit Ausgabe auf dem Band an, genau dann wenn auf das tut –> also gleiches verhalten aufweist.
- Bei einer inkorrekten Eingabe ( ist kein gültiger Code!) gibt unsere universelle Maschine eine Fehlermeldung aus!
Wir können diese Maschine jetzt als eine -Band-TM konstruieren: Dabei hat jedes Band seine Aufgabe:
- wir simulieren das Band von
- wir schreiben die Gödelnummer
- merkt sich, in welchem Zustand die TM soeben wäre.
Ablauf der UTM :
Eingabe: Am Anfang steht die Eingabe auf dem ersten Band geschrieben. alle anderen Bänder sind leer: ![[Pasted image 20230509142712.png]]
Vorbereitung der Maschine: Wir müssen nun einen Syntaxcheck durchführen. Dafür: U liest die Eingabe auf dem ersten Band und teilt sie in die Teile und auf. –> In diesem Teil ist es dann wichtig, dass die Codierung präfixfrei ist! Falls keien korrekte Codierung ist, bricht die UTM sofort ab –> Ende. Initialisierung der Maschine: Ist die Syntaxprüfung abgeschlossen, kopiert die UTM die Gödelnummer auf das zweite Band und löscht sie vom ersten. Der Schreibkopf des ersten Bandes ist am Anfang von . Auf das dritte Band schreiben wir die Codierung des Startzustandes . ![[Pasted image 20230509142954.png]]
Simulieren eines Rechenschrittes von M::
- U weiß auf Band 3, welchen Zustand wir gerade haben
- U liest den aktuellen Buchstaben von Band 1
- U schaut auf Rand 2 nach dem zugehörigen Übergang
- U führt diesen auf Band 1 durch und merkt sich anschließend den neuen Zustand auf Band 3.
Die Ausgabe stoppt sobald auf Band 3 der akzeptierende oder verwerfende Zustand erreicht wird. Auf Band 1 steht dann die Ausgabe der berechnung, sofern existent.
Ausblick: Wir wollen folgend zeigen, dass es viel mehr Sprachen gibt, als Turingmaschinen. Daran kann man dann anschließend sehen, dass es manche Sprachen gibt, die nicht von einer TM erkannt werden können und somit TM nicht alles berechnen / entscheiden können!
Um dies richtig betrachten zu können, benötigen wir diverse Grundlagen der Mengenlehre Für weitere Informationen, siehe hier[[math1_sets]]