GOTO simuliert Turingmaschinen Wir wissen bisher: LOOP ( GOTO = WHILE TM Jetzt zeigen wir, dass auch WHILE = TM gilt: Die Turingmaschine M =(Z,,,,z 1,, E) berechne f. Wir simulieren M mit einem GOTO-Programm der Form M 1 : P 1 ; M 2 : P 2 ; M 3 : P 3 P 1 soll die Anfangswerte in eine Anfangskonfiguration der Turingmaschine M umwandeln. P 2 macht die eigentliche Arbeit (s.u.) P 3 erzeugt das Ergebnis in x 0. Einheit 9 Folie 9.1
TM-Konfiguration im GOTO-Programm Eine Konfiguration der TM sei z l mit, 2 und z l 2 Z. Es sei Z = {z 1,...,z k }, ={a 1,...,a m } und b > m. Wir repräsentieren durch eine -stellige b-näre Zahl; wenn = a i1 a i2...a ip ist, dann stellen wir das mit der Zahl x dar: x = pp µ=1 i µ b p µ Entsprechend sei = a j1 a j2...a jq dargestellt durch: y = qp =1 j b 1 Der Zustand z l wird durch die Zahl z = l dargestellt. (x,y,z) beschreibt nun eindeutig eine Konfiguration der TM. Einheit 9 Folie 9.2
Aufbau des GOTO-Programms P 1 : Erzeuge Anfangskonfiguration z 1 bin(x 1 )#...#bin(x k ) aus Werten x 1,...,x k, d.h. x = 0, z = 1, y =? P 2 : Führe Schritt-für-Schritt-Simulation der Turingmaschine aus. P 3 : In der Konfiguration z e bin(y) berechne y und speichere den Wert in x 0. Wie funktioniert das alles? Die Programmteile P 1 und P 3 sollten klar sein. Wir kümmern uns nur noch um den mittleren Teil P 2. Einheit 9 Folie 9.3
Schritt-für-Schritt-Simulation M 2 : IF z ist Endzustand THEN GOTO M 3 ; a := y MOD b; IF (z = 1) AND... IF (z = i) AND(a = j) THENGOTOM ij ;... alle Kombinationen! IF (z = k) AND... M 11 : Programmsequenz für (z 1, a 1 ) GOTO M 2 ; M 12 : Programmsequenz für (z 1, a 2 ) GOTO M 2 ; M km : Programmsequenz für (z k, a m ) GOTO M 2 ; Einheit 9 Folie 9.4
Simulation der TM-Übergänge M ij Zuerst der Fall Nun der Fall (z i, a j )=(z i 0, a j 0, N): z := i 0 ; y := b (y DIV b)+j 0 ; (z i, a j )=(z i 0, a j 0, R): z := i 0 ; y := y DIV b; x := b x + j 0 ; WICHTIG: Man sollte sich unbedingt klarmachen, warum die hier angegebenen Berechnungen genau den erwünschten Effekt haben. Und zum Schluss der Fall (z i, a j )=(z i 0, a j 0, L): z := i 0 ; y := b 2 (y DIV b)+b j 0 +(x MOD b); x := x DIV b; Einheit 9 Folie 9.5
Zusammenfassung Satz: Jede Turing-berechenbare Funktion ist auch GOTO-berechenbar. Damit haben wir gezeigt: LOOP ( GOTO = WHILE = TM Einheit 9 Folie 9.6
2.4 Primitive Rekursion Induktive Definition: Konstante Funktionen sind primitiv rekursiv. Projektionen sind primitiv rekursiv. s : N! N mit s(n) =n + 1 ist primitiv rekursiv. Funktionen, die durch Einsetzen aus primitiv rekursiven Funktionen entstehen, sind primitiv rekursiv. Funktionen, die durch primitive Rekursion aus primitiv rekursiven Funktionen entstehen, sind primitiv rekursiv: f (0, x 1,...,x k )=g(x 1,...,x k ) f (n + 1, x 1,...,x k )=h(f (n, x 1,...,x k ), n, x 1,...,x k ) (D.h. g : N k! N, h : N k+2! N, beide prim.rek. =) f : N k+1! N prim.rek.) Einheit 9 Folie 9.7
Das Prinzip der primitiven Rekursion Zeige zum Beispiel, dass add: N 2! N primitiv rekursiv ist: Wähle g(x) =x und h(z, n, x) =s(z) (beide primitiv rekursiv?) Beachte zunächst, dass h(z, n, x) =s( 1 3 (z, n, x)), alsoh = s 3 1 gilt! Also ist h primitiv rekursiv! Für g ist das ohnehin klar... Prüfe dann (z.b. mit Induktion), dass f (y, x) =y + x gilt, d.h. f = add. Welche Funktion erhalten wir im folgenden Beispiel? g(x) =0 und h(z, n, x) =add(z, x) (beide offenbar prim.rek.!) Es gilt f (0, x) =g(x) =0und f (n + 1, x) =h(f (n, x), n, x) =add(f (n, x), x) =f (n, x)+x. Also erhalten wir f (y, x) =y x falls das nicht klar ist, Induktion verwenden! Und nun? g() = 0 und h(z, n) =n (auch hier beide prim.rek.!) Hier erhält man die Dekrement-Funktion (selbst nachprüfen!). Wie schafft man die modifizierte Subtraktion? Benutze Dekrement statt s in der Konstruktion von add (s.o.). Einheit 9 Folie 9.8
Weitere Beispiele Die folgenden Operationen können alle unter geeigneter Verwendung von Projektionen und Einsetzungen primitiv rekursiv realisiert werden: Identifikation von Variablen: Sei f (x 1,...,x k ) primitiv rekursiv. Dann ist auch g prim. rek.: g(x 1,...,x k 1 )=f (x 1,...,x k 1, x k 1 ) Fiktive Variablen: Sei f (x 1,...,x k ) primitiv rekursiv. Dann ist auch g prim. rek.: g(x 1,...,x k, x k+1 )=f (x 1,...,x k ) Vertauschte Variablen: Sei f (x 1,...,x k ) primitiv rekursiv. Dann ist auch g prim. rek.: g(x 1,...,x k )=f (x 1,...,x k 2, x k, x k 1 ) Einsetzen mit verschiedenen Variablen. Einheit 9 Folie 9.9