date-created: 2024-05-16 10:26:05 date-modified: 2024-09-22 04:03:40

Turing Maschinen | Speicherbasierte Rechenmodelle

For non-deterministic Turing-machines look at: non deterministic turing machine


Overview

Wir wollen uns von deterministischen / nicht deterministischen Automaten entfernen und nun ein mächtigeres - sogar das mächtigste - system bzw. Konstrukt einer Rechenmaschine


Grundlage

Turing-Maschinen operieren auf einem Band welches eine unendliche Länge aufweist und hat. Dabei ist es ähnlich konzipiert, wie ein Automat mit Speicher, welcher hier aber theoretisch unendlich ist.

Ablauf: Wenn wir jetzt den Automaten nutzen, dann beginnt er am linken Ende des Bandes. Dabei ist die Eingabe, die wir tätigen möchten, stets bereits auf dme Band aufgetragen. Wir schauen uns dann also Schritt für Schritt die Eingabe an.

Hierbei ist wichtig, dass bei jedem Schritt die Maschine ein Symbol auf den Band am Schreib-Lesekopf


Beispiel

Betrachten wir die Sprache, die folgende Sprache erkennen kann: (also zweimal der gleiche String mit einem # getrennt)

[!Intuition] Wir wollen immer den ersten Buchstaben einlesen, uns merken, und dann an der rechten Stelle nach dem trennenden Wort wieder schreiben

Wir lesen also den ersten Buchstaben in der Eingabe

setze eine Markierung, damit man später wieder ankommen und weitermachen kann:

gehe jetzt so weit nach rechts, bis wir # überschritten und das erste mal nicht das markierende Wort gelesen haben (ein unberührtes Wort)

Jetzt überschreiben wir es mit und gehen wieder nach links bis zu

Das ist die Grundidee, man kann sie aber auch nochmal formaler mit dem Tupel und der Übergangsfunktion beschreiben:

[!Tip] Stringcomparison als Turing-Maschine Definiere die TM:

Und die Übergangsfunktion können wir folgend beschreiben:

Siehe auch Sipser, EX 3.9

Definition

Wir wollen ferner die Turing-Maschine jetzt formal beschreiben und definieren:

[!Definition] Turing-Maschine

Die Turing Maschine wird mit einem 7-Tupel beschrieben und definiert.

welche Sieben Attribute muss sie demnach aufweisen? #card

Die Turing-Maschine wird folgend beschrieben: Wobei wir die einzelnen Zustände folgend beschreiben wollen:

  • ist eine endliche Menge von Zuständen
  • ist eine endliche Menge, und beschreibt das Eingabealphabet - wie immer
  • ist eine endliche Menge und beschreibt das Arbeits und Bandalphabet, wobei hier und weiterhin beschreiben wir ein neues Symbol Was angibt, ob wir die TM überschreiben
  • Die Übergangsfunktion
  • Ferner beschreibt: den Startzustand
  • ist der akzeptierender Zustand
  • mit ist der verwerfende Zustand!

[!Tip] Bemerkungen und Konzepte der Turing-Maschine Es gibt genau einen akzeptierenden und genau einen verwerfenden Zustand bei Turingmaschinen!

Turing-Maschinen beenden ihre Rechnung sobald sie einen der beiden Zustände - akzeptierend / verwerfend! –> Man nennt das dann halten

Die Turing-Maschine hat hier ein linkes Ende. Wenn die Maschine da steht und durch eine Operation - der Übergangsfunktion - gefordert wird, dass man nach links gehen solle, dann bleibt der Kopf am linken Ende stehen.

Formal definiert bedarf es jetzt noch einer Betrachtung der Berechnung und Konfiguration einer entsprechenden Turing-Maschine.


Konfiguration / Berechnungen

Sprechen wir von der Konfiguration einer Turing-Maschine, dann beschreiben wir hiermit ein 3-Tupel was uns angibt, wo sich der Lesekopf befindet, welchen Zustand wir soeben haben und was der Inhalt des Bandes ist, wobei wir den Wert links und rechts vom Lesekopf beschreiben.

Also kurz definiert:

[!Definition] Konfiguration einer TM Wir beschreiben die Konfiguration einer Turing-Maschine folgend mit einem “Tupel”

was wird mit diesem Tupel beschrieben? #card

beschreibt den Inhalt links vom Lesekopf beschreibt den Inhalt rechts vom Lesekopf ist der aktuelle Zustand

Wir möchten jetzt den Übergang eines Zustandes in einen anderen beschreiben und dabie also zwei Konfigurationen betrachten und evaluieren, wie man von den einen zum anderen kommen kann.

[!Satz] Übergang zwischen Konfigurationen

Wir sagen dann die Konfiguration geht über , wenn die Turing-Maschine folgend von einem Schritt zu einen neuen Schritt wechseln kann. Genauer sei dann demnach und weiter auch und auch ( was der Nachfolge Bereich ist)

was gilt dann für die Übergangsfunktion #card

Wir können damit jetzt die Übergangsfunktion folgend beschreiben / definieren:

Die Startkonfiguration der Turing-Maschine auf einer beliebigen Eingabe ist dabei mit beschrieben!

Ferner nennen wir eine Konfiguration akzeptierende Konfiguration. Das heißt also, dass der derzeitige Zustand jetzt der akzeptierende ist und wir somit abschließen können - die Inhalte / links/rechts davon sind somit nicht mehr relevant. Analog gilt das auch für die verwerfende Konfiguration.

[!Attention] Beide Konfigurationen benennen wir am Ende als haltende Konfigurationen

Berechnung einer Turing-Maschine

Nachdem wir nun die Konfiguration einer Turing-Maschine definiert haben, können wir ferner darauf eingehen, wie man jetzt eine Berechnung - also Ablauf von Konfigurationen und somit Verarbeitung einer Eingabe - darstellen / definieren.

[!Definition] Berechnung einer Turing-Maschine Gegeben ist eine Turing-Maschine und ferner eine Folge von Konfigurationen sodass jetzt folgen wird: wie können wir jetzt eine Berechnung unter Betrachtung der Konfigurationen definieren? #card

  1. -> also die Folge beginnt in der gegebenen Startkonfiguration
  2. geht über in -> also genau der Übergang in der Konfiguration, wie obig definiert und das gilt Konfigurationen

Resultate Falls jetzt akzeptierend ist, heißt dann die Folge von Konfigs eine akzeptierende Berechnung und wir nennen die akzeptierend für Wort ! Falls jetzt verwerfend ist, dann nennen wir die Folge verwerfende Berechnung und wir sagen, dass das Wort verwirft.

Sonderfall Wenn wir jetzt ein Wort betrachten wo wir eine Konfiguration erhalten, welche nicht verwirft oder akzeptiert , dann nennen wir diese Folge nicht-haltend. Wir sagen dann folgend hält nicht auf

Sprachen von Turingmaschinen

Wir möchten wieder definieren, welche Sprachen mit Turingmaschinen beschrieben, erzeugt und erkannt werden können.

Wir werden später sehen, dass es einen Unterschied zwischen entscheidbar und erkennbar gibt, der sehr fundamental und wichtig ist!

[!Definition] Sprachen einer Turingmaschine

Die Menge aller Worter welche von einer Turingmaschine akzeptiert werden, bilden die von erkannte Sprache Wir beschreiben sie also mit :

wann nennen wir eine Sprache jetzt erkennbar, rekursiv aufzählbar oder semi-entscheidbar? #card

Sofern wir eine TM beschreiben können, die eine Sprache erkennt, sprechen wir von Turing-erkennbar, rekursive aufzählbar, oder semi-entscheidbar. Wir beschreiben die Eigenschaft der Erkennbarkeit folgend für Wörter :

  • wenn dann akzeptiert , also nach einer Eingabe wird sie terminieren und in den akzeptierenden Zustand gehen!
  • wenn jetzt dann verwirft oder hält nicht auf (also läuft endlos weiter)

Ferner möchten / müssen wir auch die Charakteristik einer entscheidbaren Sprache definieren.

[!Definition] Entscheidbare Sprachen

Die Menge aller Wörter auf welchen die TM hält (also akzeptiert/verwirft) bilden dann die von M entschiedene Sprache.

wann nennt man eine Sprache jetzt Turing-entscheidbar,rekursiv oder der Länge aufzählbar? #card

Wir nennen eine Sprache turing-entscheidbar, rekursiv, oder der Länge nach aufzählbar, wenn es eine TM gibt, welche sie entscheiden kann (also für jedes Wort hält!)

Die TM ist dann ein Entscheider für . Das heißt es können zwei Zustände eintreten:

  • wenn akzeptiert
  • wenn verwirft

[!Req] Unterschied Entscheidbar / Erkennbar

Wo liegt der Unterschied zwischen einer entscheidabren und erkennbaren Sprache, Was gilt auch aus “Mengenbetrachtung”? #card

Wir sehen hier, dass eine erkennbare Sprache “schwächer” ist, als eine entscheidbare, weil bei letzterer eine Eingabe einfach nicht zum Ende führen kann -> und wir so vielleicht nicht wissen, ob sie das Wort noch akzeptieren kann/wird oder nicht.

Währenddessen werden die Wörter einer entscheidbaren Sprache für eine TM garantiert akzeptiert oder verworfen. (Sie hält also immer!)

Weiterhin ist jede Turing-entscheidbare Sprache natürlich auch Turing-erkennbar.

Die Rückkehr gilt aber nicht: nicht jede erkennbare Sprache ist auch entscheidbar!

Turingmaschinen und Automaten

[!Satz]

Es gilt: Jeder DFA ist ein Spezialfall einer Turingmaschine

Wie können wir das zeigen? #card

Wir konstruieren ferner eine Turingmaschine, die das Tupe; eines DFa konvertiert: wobei wir jetzt folgend anpassen:

Dass wir diese Turingmaschine entsprechend konvertieren können lässt uns auch folgern:

[!Korollar]

Alle DFAs sind Entscheider und alle Sprachen in sind auch entscheidbar 112.03_reguläre_sprachen


Äquivalenz von Turingmaschinen:

[!Definition] Äquivalenz von Turing-Maschinen

Zwei Maschinen heißen äquivalent, falls sie die gleichen Sprachen akzeptieren. Also es muss gelten:

Welche drei Eigenschaften müssen erfüllt werden? Was folgt noch? #card

Hierbei ist wichtig, dass bei der zweiten Ausgabe nicht spezifiziert ist, ob die Maschinen beide das Wort einfach nicht akzeptieren oder nicht terminieren. Also eine Maschine kann terminieren, aber die Eingabe verwerfen und die andere nicht terminieren

Syntaktischer Zucker

Folgend können wir einige Variationen der Turing-Maschine als Konzept betrachten, welche allesamt gleichmächtig/wertig, wie die normale Turingmaschine sind, aber u.U. dabei helfen manche Themen oder Beweise besser zu führen!

Bewegungen des Schreibkopfes

Es ist möglich statt der Urdefinition, die nur Bewegungen nach links/rechts erlaubt, auch eine “verweilende Bewegung (stehen bleiben)” zu begründen.

[!Req] Erlauben des “stehen bleibens”

Wir können erlauben, dass der Schreibkopf nach Einlesen eines Symboles auch einfach stehen bleibt und damit weiterhin richtig funktioniert. Wir wollen also den Übergang folgend um die Bewegung = “still” erweitern: statt also nun

wie können wir das konstruieren? #card

Das können wir erzielen, indem wir die Zustände verdoppeln, also

Ferner erweitern wir dann die Übergangsfunktion folgend:

Falls ferner dann formen wir um zu und weiterhin fügen wir ein: :

Wir haben sie also so erweitert, dass sie bei einem gewollten Übergang immer in den äquivalenten Überstand geht (nach rechts geht) und anschließend zum Ziel (und dabei nach links geht).

Dann ist offensichtlich die TM mit äquivalent zu mit , weil die Konfigurationen von die von mit einem Zwischenschritt ist / sind.

Die Grafik ausgeschrieben ist dann: über, und die angepasste Turingmaschine geht folgend über:

Mehrband-Turingmaschinen

[!Definition] Mehrband-Turingmaschinen

Eine Mehrband-Turing-Maschien ist eine normale TM mit endlich vielen Bändern.

wie definieren wir eine Mehrband-Turingmaschine? #card

Prinzipiell ist es eine normale TM, aber mit mehreren Bändern.

Dadurch ändert sich primär die Definition der Übergangsfunktion!

Jedes Band hat seinen eigenen Lese/Schreibkopf die sie denoch eine gemeinsame Zustandsmenge teilen -> somit bleibt diese Konstruktion gleich.

Zu Beginn, also steht die Eingabe auf dem ersten Band und die anderen sind leer

Formal hat sie dann eine neue Übergangsfunktion der Form: wobei wir mit angeben, wie viele Bänder und somit wie viele weitere Inhalte man betrachten muss, um entsprechend weiterzulaufen

Wir sehen aber trotzdem, dass Parallelismus nicht helfen kann / wird!

Parallelismus hilft nicht

[!Satz]

Zu jeder Mehrband-TM gibt es eine äquivalente Einband-TM

wie können wir das beweisen? #card

Sei jetzt eine -Band TM. Wir konstruieren nun die Einband TM so, dass ist / ergibt.

Die Idee dafür: Speichere den Inhalt aller Bänder hintereinander auf dem Band von . Wir trennen sie durch ein Sonderzeichen voneinander.

-> Wir markieren dann immer die aktuelle Position der verschiedenen Schreibköpfe durch einen “punkt” (oder einer anderen Markierung) –> damit haben wir erweitert. Visuell also:

Formaler Beweis: Wir wollen die Einband TM konstruieren.

Sei dafür eine Eingabe

geht in die Konfiguration:

Wir wollen jetzt einen Schritt von auf simulieren:

  • fährt das ganze band ab - vom ersten um somit alle Symbole unter den Schreibköpfen zu lesen! –> Sie werden durch eine endliche Erweiterung des Zustandraumes gecached (also wir haben extra Zustände, die diese Werte dann “speichern”)
  • macht dann einen zweiten Lauf entlang des Bandes um die -Köpfe Einträge entsprechend der Übergangsfunktion zu aktualisieren
    • –> der nötige “Zwischenspeicher” wird durch eine erweiterte Zustandsmenge realisiert
  • Wir haben ferner einen Spezialfall: Falls in einem Schritt einer der Köpfe von am Ende des -ten Bandes ankommt, also wir danach “leere Elemente treffen würden”, dann fahren wir ans gesamte Ende der TM und verschieben ferner alle Symbole nach diesem Bereich nach rechts (machen also entsprechend Platz)

Dadurch erhalten wir eine valide Reduzierung ( auch wenn sie sehr komplex ist)

Beidseitig offene Bänder

[!Satz]

Sei eine TM, die beidseitig offene Bänder hat ( also man endlos nach links und rechts kann), dann gibt es eine TM mit links abgeschlossenem Band, sodass äquivalent zu ist

was wäre ein Beweisansatz? #card

Man könnte hier abwechselnd ein Feld auf dem Band der “linken Hälfte” und der “rechten Hälfte” zuordnen und somit realisieren

Etwa durch “Gerade => links, Ungerade => rechts”

Nicht-Deterministische Turing-Maschinen

Siehe 112.13_turing_maschinen_nondeterministisch

NTM DTM sind also gleich

[!Definition]

Es gilt: Zu jeder nichtdeterministischen TM gibt es eine äquivalente deterministische TM !

wie können wir das konstruieren? #card Wir konstruieren also eine Mehrband-TM , die NTM auf der Eingabe simuliert (en kann)

Konstruktion von drei Bändern:

  • eins ist Eingabe
  • eins ist RAM –> es speichert uns die soeben passierende Berechnung, also die aktuelle Konfiguration, weil wir ja dann nicht-deterministisch durch diese alle verschiedenen Möglichkeit laufen können und somit simulieren wir den Ablauf der nicht deterministischen Turing Maschine
  • drittes Band gibt an, wo wir uns im Baum befinden.

Berechnung:

  1. Initialisiere mit auf Band 1, und leeren Bändern 2,3
  2. Kopiere auf Band 2, initialisiere 3 mit
  3. Simuliere den Lauf von auf Band 2. Schaue dazu in jedem Schritt auf Band 3 nach, welche Option zu nehmen ist.
  4. Falls auf Band 3 nichts mehr steht oder der Pfad auf Band 3 ungültig ist, gehen wir zum vierten Schritt!
  5. Falls erreicht wurde, gehen wir zum vierten Schritt
  6. Falls erreicht wurde, akzeptieren wird!
  7. Ersetze den Pfad auf Band 3 mit seinem Nachfolger - > in der natürliche Anordnung dieser Strings
  8. Simuliere dann den nächsten Pfad wie zuvor, also von Schritt 2 an

Wir wollen den Baum der Zustände - des Nicht Deterministischen Automaten - nach und nach traversieren und dann Breadth-First durch diesen laufen. Damit decken wir alle Fälle ab und wenn wir in einem Baum einen “accept” finden, dann akzeptieren wir.

Sonst lehnen wir ab!

Was kann eine Turing-Maschine?

[!Bem] Turingmaschinen als abstrakte Operatoren

Bevor wir uns der universellen Darstellung und weiteren Betrachtungen zur Turing-Maschine widmen, möchten wir Zwischenfragen stellen, die beim Verständnis und Betrachten helfen können.

–> weswegen nennen wir Turing-erkennbare Sprachen - rekursiv Aufzählbar?

-> Wie hängen die Konzepte von Erkennbarkeit und Entscheidbarkeit zusammen - gerade im Bezug auf tatsächliche Systeme, die meist nur entscheidabre Informationen bearbeiten/berechnen etc

-> Kann man Turing-Maschinen programmieren?

Warum rekursiv aufzählbare Sprachen?

Dafür möchten wir einen Enumerator (Aufzähler) definieren:

[!Definition] Enumerator ( Aufzähler)

Wir bezeichnen eine TM mit Drucker einen Enumerator ( Aufzähler) mit einem 7-Tupel mit folgender Struktur :

Visuell geht der Enumeator durch alle Wörter der Kleensche-Hülle druckt aber nur die Wort aus, die von der Turing-Maschine erfüllt wird.

Was geben uns die einzelnen Aspekte aus, was ist die Erweiterung zu einer normalen TM? #card

Sie weist folgende Parameter auf:

  • ist eine endliche Menge von Zuständen
  • ist eine endliche Menge, das Ausgabe- oder Druckalphabet
  • ist eine endliche Menge, das Arbeits oder Bandalphabet
  • die Übergangsfunktion ist nun etwas anders: ( bzw sieht gleich aus, aber funktioniert noch anders)
  • ferner der Druckzustand, und der Haltzustand, wobei

Die Konfigurationen und Übergänge von sind die der Turingmaschine, mit dem Zusatz, dass in jedem Schritt ein Zeichen auf das Druckband schreiben kann ( also ausdrucken!). Wir schreiben dann etwa für folgende Konfiguration

ist im Zustand , links vom Kopf steht gerade und unter dem Kopf , ferner rechts davon dann und auf dem Druckband steht

  • Zu Beginn ist in der Konfiguration von
  • falls dann dann geht folgend über:
  • falls nach übergeht, dann druckt E –> damit wird das Druckband geleert
  • falls E nach übergeht, dann stoppt es.

Damit haben wir jetzt einen Enumerator gebaut, der einfach alle möglichen Wörter ausdrucken kann.

[!Tip]

Wie kann mit einem Enumerator eine Sprache beschrieben werden? #card

Die Sprache eines Enumerators ist die Menge alle Strings, die er ausdruck (was gleichzeitig gleichbedeutend damit ist, dass er sie erkennt!)

Enumerator können auch Sprachen erkennen! (mehr aber nicht zwingend)

[!Satz]

Eine Sprache ist Turing erkennbar (semi-entscheidbar) genau dann, wenn es einen Enumerator gibt, der sie aufzählt!

Wie können wir das zeigen, was lässt sich dann im Bezug zu “rekursiv-aufzählbar” sagen? #card

Sei ein Enumerator, der eine Sprache aufzählt. Wir bemerken, dass hierbei eine eingeschränkte Form einer Zweiband-TM ist, die auf dem zweiten Band nie liest.

Daraus können wir jetzt die TM folgend bauen:

  1. Auf Eingabe simuliere ( eine 2-Band TM). Jedes Mal, wenn druckt, vergleichen wir die Ausgabe mit
  2. Falls dann ist, dann akzeptieren –> Wir simulieren sie also, indem wir die Eingabe Schritt für Schritt durchlaufen und jedes mal schauen, ob sie gleich der Eingabe ist –> wenn ja, dann akzeptieren wir und beenden (damit haben wir also erkannt!)

Offensichtlich akzeptiert genau die Strings, die vom Enumerator aufgezählt werden (können).

Beweis : Sei eine TM, die eine Sprache erkennt. Sei eine Liste aller Wörter -> wir können die abzählen, weil abzählbar ist.

Dann bauen wir jetzt einen Enumerator, der entsprechend diese Liste darstellt und angibt, ob etwas in der Ursprungsprache ist oder nicht.

  1. Ignorie den Input
  2. Wiederhole für all (wir simuliern nur eine begrenzte Menge “mal” eine Eingabe, damit uns nicht mit loopenden Worten verhängen)
  3. Simuliere für Schritte auf allen Wörtern -> das können wir machen, weil wir eine TM haben) (Weiterhin brauchen wir die Beschränkung auf Schritte, damit unsere Turing-Maschine nicht endlos läuft und somit das “Halteproblem” verursacht!)
  4. Jedes Mal, wenn ein akzeptiert, dann druckt es der Enumerator! (Damit listen wir alle validen Worte auf, weil wir ja simulieren!)

Falls jetzt , dann akzeptiert das Wort und w wird dann unendlich oft von gedruckt

Bei dem konstruierten Enumerator ist die Reihenfolge des Ausdruckens der Werte egal, weil in der Simulation irgendwann jedes Wort beliebig oft ausgedruckt wird –> Es folgt aus der Konstruktion der Turing-Maschine.

Die Konstruktion des Enumerators ist nur zum Erkennen von Sprachen gedacht, wenn wir etwa nie ein valides Ende erhalten, wird die konstruierte TM dann einfach für immer warten –> und nicht akzeptieren, weil sie kein valides Wort erhalten hat.

Wir sehen bei Wörtern, die noch nicht akzeptiert wurden - von dem Enumerator - ein Output von 0 ( die Wörter, die akzeptiert werden werden mit 1 notiert ) gesetzt wird ( aaber das können wir noch nicht ganz evaluieren –> Denn es kann sein, dass die Eingabe einfach zu kurz simuliert wurde ( wir machen ja nur Schritte der originalen TM durch!))

Daraus sehen wir schon, dass hier manchmal Dinge auftreten, die womöglich niemals berechnet werden können, einfach weil wir sie bis ins unendliche versuchen auszuführen.

Berechenbarkeit

Gibt uns jetzt eine genauere Definition über das obige Problem, was auftreten kann!

[!Definition] Berechenbarkeit

Wann bezeichnen wir eine Funktion (Turing-) berechenbar (oder auch totalrekursiv)? #card

Eine Fuktion heißt Turing-berechenbar oder auch totalrekursiv, falls es eine Turing-Maschine gibt, die bei der Eingabe den Funktionswert ausgeben kann

–> Also das Wort wurde auf das Band geschrieben ( war also umsetzbar!) und danach hat sie gestoppt –>

Bemerkung Die obige Definition enthält eine implizite Beschränkung auf abzählbare Werte. Aus der Mathematik gibt es Funktionen, die auf kontinuierliche Mengen operieren (überabzählbare) –> Diese sind im Allgemeinen nicht Turing-berechenbar

Durch diese Definition können wir jetzt ferner schauen, wann eine Sprache entscheidbar - nicht nur erkennbar! - ist oder nicht.

Charakteristische Funktion | Entscheidbarkeit festlegen

[!Definition]

Eine Sprache ist entscheidbar, genau dann wenn ihre charakteristische Funktion folgend gegeben ist:

Was sagt uns die Konstruktion dieser charakteristischen Funktion? Wie beweisen wir das womöglich? #card

Sie geht quasi alle Werte aus der Hülle - also allen Wörtern, die mit dem Alphabet generiert werden können - durch und prüft, ob über eine Simulation einer TM ( die die Sprache darstellt) das Wort akzeptiert wird / oder nicht.

Beweis dafür:

  1. L entscheidbar berechenbar Wir haben eine TM , die genau dann akzeptiert, wen . Wir erweitern die TM jetzt zu Falls jetzt akzeptiert, schreibe wir anschließend eine auf das Band und löschen alle anderen Werte. (danach stoppen wir)

Falls verwirft, schreiben wir eine 0 aufs Band und löschen alles andere –> danach stoppen wir auch

  1. ist berechenbar L ist entscheidbar Wir haben die TM die berechnet. Wir erwietern sie jetzt zu folgender TM: Falls akzeptiere, Falls verwerfe (das wird dann über jeden Inhalt gemacht und somit entschieden, ob das Wort enthalten ist oder nicht!)

Da wir wissen, dass diese Enumerator bzw. charakteristische Funktion entscheidbar ist, können wir dann also bestimmen welche Wörter enthalten sind und welche nicht. Damit wissen wir, dass man irgendwie herausfinden kann, ob das Wort enthalten ist oder nicht –> es muss eine Regel geben und die können wir mit einer TM darstellen!

[!Attention] der Attribut entscheidbar gibt an, dass die garantiert terminiert

Berechenbarkeit als Entscheidbarkeit

[!Definition] Berechenbarkeit als Entscheidbarkeit

Eine Funktion ist berechenbar, genau dann, wenn es eine TM gibt, welche die folgende Sprache entscheidet: $$$L_{f}: { w# g \mid w \in \Sigma^{}, g \in \Gamma^{}, f(w) = g }$$

Warum ist das ausschlaggebend, um das zu bestimmen? Wie können wir das etwa beweisen? #card

Wir wollen das Beweisen:

  1. Sei berechenbar Dann heißt das, dass es eine TM gibt, die bei der Eingabe von die Ausgabe berechnet! (Das haben wir zuvor gesehen!) Wir bauen dann jetzt . Sie bekommt ein Wort der Form als Eingabe und ruft dann auf die Eingabe auf (berechnet sie anschließend). -> Wir wissen, dass terminieren wird, weil berechenbar ist! Dann wartet einfach auf das Ergebnis von und vergleicht es dann mit der Eingabe

–> Wenn die Werte gleich sind (wie erwartet), dann akzeptieren wir! sonst verwerfen wir.

  1. Sei eine TM, welche entscheidet. Wir konstruieren welche dann berechnet:
  • Eingabe für ist Wort
  • Nun probiert nacheinander alle (Alle Wörter die aus dem Band-Alphabet erzeugt werden können!)
  • Also folgend: $w\3 \varepsilon \in L_{f}, w#0 \in L_{f}, w#1 \in L_{f}, w#10 \in L_{f}, w#11\in L_{f}? \dots$
  • Dabei läuft die TM jetzt so lange, bis sie eine richtige Antwort trifft -> das passiert in endlicher Zeit, weil berechenbar ist und das fordert!.
  • Tritt dieser Fall ein, dann geben wir als Antwort zurück!

[!Attention] Trick: ist abzählbar und Entscheidbarkeit bedeutet, dass immer anhält

( also die, die die Sprache der Funktion entscheidet!)


Motivation für die obige Betrachtung | Äquivalenz

Wir möchten hier bestimmte Äquivalenzen betrachten und sehen, dass die Berechenbarkeit einer Funktion im Kontext von mathematischen Funktionen gleich der Frage der Entscheidbarkeit einer Sprache ist / sein kann.

Bei diophantischen Gleichungen hat man etwa gehofft, dass es einen Algorithmus / oder ein Verfahren gibt, dass entscheiden kann ob eine solche Gleichung lösbar ist.

Warum das nicht geht: -> Wenn sie lösbar ist, dann wird sie etwa nach beliebigem Probieren auch resultiert und wir haben etwa eine TM, die dann akzeptiert. –> Wenn Sie nicht lösbar ist, werden wir es dennoch probieren und schauen, ob es für beliebige Werte funktioniert.

[!Tip] Wie lange werden wir diesen Ablauf dann betrachten, bei welchen Eingaben wird nicht mehr probiert? -> Man sieht hierbei, dass man also nicht wirklich beenden wird, weil es ja vielleicht doch noch akzeptieren könnte ( das ist im Kerne das Halteproblem, wir wissen nicht, ob sie jeweils beenden wird oder ob die Antwort noch kommt)

Dafür gibt es also maximal einen Erkenner, aber keinen Berechner!

Gödel zur Berechenbarkeit | Entscheidbarkeit:

[!Satz] Folgerung für Berechenbarkeit

Was können wir über diverse Wörter aussagen, die von einer berechenbaren Funktion bestimmt werden? Was folgt für Turing-Maschinen? #card

  1. Die Werte einer berechenbaren Funktionen definieren eine entscheidbare Sprache, und jede entscheidbare Sprache definiert eine berechenbare Funktion

  2. Deshalb heißen Sprachen die Turing semi-entscheidbar sind auch rekursiv aufzählbar.

  3. Unser Beweis benutzte eine “brute-force” Methode, die funktioniert, weil man berechenbare Sprachen rekursiv “durchtesten” kann.

[!Idea]

Wir werden nun den gleichen Trick auf einer höheren Abstraktionsebene verwenden, um alle Turingmaschinen zu enumerieren. Dieser Prozess ist ein Fall von Gödelisierung (der rekursive Aufzählung einer formalen Sprache).

Das Ergebnis dieses Prozesses ist eine neue Turing-Maschine, die die natürlichen Zahlen surjektiv auf den Raum aller Turing-Maschinen abbildet. Eine Programmiersprache für Turing-Maschinen. Die universelle Turing-Maschine.


Codierung einer Turing-Maschine

Statt jetzt die Sprache einer Turing-Maschine rekursiv aufzählen zu können, möchten wir jetzt ferner einfach den Raum aller Turing-Maschinen rekursiv aufzählen.

Dadurch können wir alle Turing-Maschinen so codieren, dass wir später eine Eingabe tätigen und diese Codierung dann die entsprechend benötigte Turing-Maschine ausgibt, die wir brauchen, um das zu berechnen!

Hierbei sehen wir dann, dass es abzählbare unendliche Turing-Maschinen geben wird / kann.

Wir wollen jetzt die Codierung durchführen

[!Definition] Codierung einer Turing-Maschine

Angenommen wir haben eine gegegeben TM und möchten sie quasi in eine Codierung übersetzen, sodass eine Turing-Maschine dann beim bearbeiten einer Eingabe eventuell auf diese Codierung akzeptiert und das Wort an diese TM weitergibt. Ferner wollen wir sie mit folgendem Alphabet kodieren/darstellen:

wie gehen wir vor, um diese Turing-Maschine zu kodieren? Was folgt hieraus, in Hinsicht auf Berechenbarkeit als Entscheidbarkeit? #card

Idee: Wir müssen jeden Buchstaben und jeden Zustand kodieren.

Für die Buchstaben nutzen wir einfach ein Präfix - damit wir wissen, dass jetzt ein Buchstabe kommt - in der Struktur wobei der -te Buchstabe ist.

Umsetzung:

  1. Sei jetzt das Bandalphabet . Wir codieren jeden Buchstaben - für alle, die auch sind, nehmen wir die gleiche Kodierung! - mit folgender Struktur: Und können somit eindeutig kodieren, dass jetzt ein Buchstabe beginnt (mit einer 1 am Anfang und Nullen danach)

  2. Sei die Menge der Zustände. Ferner (also die Initialzustände). Wir codieren sie folgend:

  3. Bewegungen des Schreibkopfes codieren wir folgend:

  4. Und die Übergangsfunktion folgend: Wobei wir folgend entfernen, indem wir es auch codieren.

  5. Codiere die ganze TM mit Zuständen, und als:

Da wir jetzt noch drin haben, müssen wir alles so codieren, dass wir im binären 4 (bzw. 3) Zeichen eindeutig darstellen können:

[!Attention]

Wir haben soeben eine Funktion - die berechenbar ist! - definiert, die somit, nach der obigen Aussage, also auch eine entscheidbare Sprache darstellt und definiert –> genau die Sprache, die eine Codierung bekommt und schaut, ob es sich um eine valide Codierung handelt oder nicht –> Sie kann aufzählen, welche Strings eine Turing-Maschine beschreiben und welche nicht!

[!Attention] Es ist nicht die beste Darstellung bzw. Codierung für die TMs

Dennoch haben wir jetzt eine eindeutige also injektive Abbildung konstruiert!

Eigenschaften der Codierung

Wir können aus der obigen Codierung jetzt einige Grundlegende Ideen und Eigenschaften definieren und beziehen:

[!Req] Folgerungen / Eigenschaften

Unter Betrachtung der oberen Codierung einer Turing-Maschine, was können wir über die erzeugte Abbildung aussagen? Lässt sich eine entscheidbare Sprache bilden, warum? #card

  • Wir können aussagen, dass die Codierung injektiv ist, es gilt also:

Jedoch gilt nicht, dass zwei äquivalente TMs zwingend die gleichen Codes haben –> siehe Programmiersprachen und verschiedene Implementierungen einer Funktionalität

  • Es gibt eine TM , die für einen beliebigen, binären String entscheiden kann, ob es eine gültige Codierung ist, oder nicht. Somit kann man die folgende Sprache dann als entscheidbar einstufen ( was Sinn ergibt, weil wir ja oben eine berechenbare Funktion definiert haben, und genau diese anwenden können,um dann zu prüfen, ob ein gegebener String eine Codierung ist, oder nicht)
  • Diese Codierung ist präfix-frei: Kein echtes Präfix einer Codierung von ist selbst eine Codierung einer anderen TM.
  • –> (Das heißt dann, dass bei einer validen Codierung niemals eine andere Codierung inbegriffen und dadurch auftreten kann!
  • Das erzeugen wir durch den Anfang, wo wir die Menge von Einträgen,sowie die Übergangsfunktion definieren –> damit haben wir kein allgemeines Präfix

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!


Da wir eine klare Struktur und Definition zur Codierung der Turingmaschine haben, können wir jetzt ganz gut herausfinden, ob eine Codierung eine valide TM ist oder nicht.

[!Important] lineare Ordnung der Menge aller Turing Maschinen

warum haben wir eine lineare/totale Ordnung von Turing-Maschinen erhalten? Was folgt ferner über die Menge von Turing-Maschinen? #card

Da wir jetzt eine Konstruktion gefunden haben, die jede TM in einen binär-String umschreibt, haben wir also eine Abbildung gefunden, die jede Turing-Maschine im Raum der abbildet –> es gibt also abzählbar-unendlich viele Turing-Maschinen. <–

Ferner können wir eine lineare Ordnung einführen: Sei . Wir sagen jetzt, dass , falls die natürlichen Zahlen die durch die Strings repräsentiert werden, die Eigenschaft haben, dass –> dadurch folgt dann:

Und es ist eine totale Ordnung, weil die Eigenschaften eingehalten werden:

  1. ( Reflexivität)
  2. (Transitivität)
  3. (Antisymmetrie)
  4. (total)

Gödelnummern:

Die obige Darstellung bzw. Konvertierung der Turing-Maschinen ist sehr ineffizient –> viele Darstellungen sind keine wirkliche Turing-Maschine und damit haben wir in dem Raum der Turing-Maschinen viele Lücken. Das es aber eine totale Ordnung ist, können wir hier einfach von “links nach rechts” durchnummerieren und jeder dieser Codierungen eine Nummer zuweisen.

Wir wollen sie ferner definieren, da sie nicht nur für diese Abbildung existiert!

[!Definition] Gödelnummern

Sei Für nenn wir dann die Codierung der ten Turingmaschine, wenn folgend zwei Eigenschaften gelten:

  1. , ist also ein Code für eine Turingmaschine
  2. Die Menge enthält genau Wörter, die Codierungen von Turingmaschinen sind. (Damit stellen wir die richtige Stelle in der Nummerierung sicher)

Wir nennen dann die Gödelnummer von und beschreiben diese Gödelnummer für eine TM mit: –> Intuitiv ist das Programm - in Maschinencode - von

[!Important] Nummerierung ist abhängig der Codierung! Denn je nachdem, wie wir die Turing-Maschinen kodieren, ist die Reihenfolge dieser anders / verschieden.

[!Req] Turingmaschine, die für die Codierung der ten TM berechnet

Was wäre eine Überlegung das umzusetzen und definieren zu können? #card

, was die TM sein wird, könnte die binären Strings in der Ordnung durchlaufen. Auf jeden String wird dann die TM ( zum berechnen, ob ein String eine valide Codierung ist) angewandt, um zu entscheiden ob eine TM definiert. Falls ja, dann erhöhen wir den Zähler ().

Wenn sie jetzt bis gezählt hat - was gefordert war - dann gibt sie diesen String wieder.

Dadurch ist diese TM ein Enumerator für Turing-Maschinen!

Gödelisierung

Es gibt viele verschiedene Codierungen von Turing-Maschinen, und dadurch variiert auch die Art der Gödelnummern - bzw welche TMs sie jeweils kodieren!.

[!Definition]

Sei die Menge aller Turing-Maschinen. Die Abbildung heißt Gödelisierung von , falls drei Eigenschaften erfüllt werden.

welche drei sind das? #card

  1. ist injektiv, also
  2. Die Bildmenge ist entscheidbar, also es gibt eine TM, die für jedes entscheided, ob oder nicht
  3. Die Funktionen und sind berechenbar (weil wir sonst ja nicht abbilden und eine Sprache damit beschreiben können, siehe Berechenbarkeit als Entscheidbarkeit)

Dann gilt für beschreibt die Gödelnummer dieser TM!

Damit ist die Menge aller Turingmaschinen rekursiv aufzählbar –> was auch heißt, dass sie abzählbar unendlich sind!

Wir können dann jetzt wohl auch eine Turing-Maschine beschreiben, die sie erkennen kann!

Universelle Turing Maschinen

112.14_universal_turing_machine