Mächtigkeit von WHILE-Programmen Prof. Dr. Berthold Vöcking Lehrstuhl Informatik 1 Algorithmen und Komplexität RWTH Aachen 26. November 2009 Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 1 / 20
Maschinenmodelle und Programmiersprachen Maschinenmodelle Turing-Maschine Registermaschine Endliche Automaten Programmiersprachen C, C++, C# Java PHP, JavaScript PostScript SQL Alle (genannten) Programmiersprachen sind nicht mächtiger als TM/RAM. Gibt es Funktionen, die sie nicht berechnen können? Was ist überhaupt ein Algorithmus? Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 2 / 20
Turing-mächtige Programmiersprachen Definition Eine Programmiersprache wird als Turing-mächtig bezeichnet, wenn jede Funktion, die durch eine TM berechnet werden kann, auch durch ein Programm in dieser Programmiersprache berechnet werden kann. Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 3 / 20
Die Programmiersprache WHILE Syntax Elemente eines WHILE-Programms Variablen x 0 x 1 x 2... Konstanten 1 0 1 Symbole ; := + Schlüsselwörter WHILE DO END Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 4 / 20
Die Programmiersprache WHILE Syntax Induktive Definition Induktionsanfang Zuweisung Für jedes c { 1, 0, 1} ist die Zuweisung x i := x j + c ein WHILE-Programm. Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 5 / 20
Die Programmiersprache WHILE Syntax Induktive Definition Induktionsschritte: Hintereinanderausführung Falls P 1 und P 2 WHILE-Programme sind, dann ist auch ein WHILE-Programm. P 1 ; P 2 WHILE-Konstrukt Falls P ein WHILE-Programm ist, dann ist auch ein WHILE-Programm. WHILE x i 0 DO P END Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 6 / 20
Die Programmiersprache WHILE Semantik Ein While-Programm P berechnet eine k-stellige Funktionen der Form f : N k N. Die Eingabe ist in den Variablen x 1,..., x k enthalten. Alle anderen Variablen werden mit 0 initialisiert. Das Resultat eines WHILE-Programms ist die Zahl, die sich am Ende der Rechnung in der Variable x 0 ergibt. Programme der Form x i := x j + c sind Zuweisungen des Wertes x j + c an die Variable x i. In einem WHILE-Programm P 1 ; P 2 wird zunächst P 1 und dann P 2 ausgeführt. Das Programm WHILE x i 0 DO P END hat die Bedeutung, dass P solange ausgeführt wird, bis x i den Wert 0 erreicht. Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 7 / 20
Beispiel eines WHILE-Programms Was berechnet dieses WHILE-Programm? WHILE x 2 0 DO x 1 := x 1 + 1; x 2 := x 2 1 END; x 0 := x 1 + 0 Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 8 / 20
Die Programmiersprache WHILE Mächtigkeit Satz Die Programmiersprache WHILE ist Turing-mächtig. Lemma I (vgl. Übungsaufgabe 2.3) Eine TM kann durch eine RAM mit konstant vielen Registern und eingeschränktem Befehlssatz simuliert werden. Lemma II LOAD, CLOAD, STORE, CADD, CSUB, GOTO, IF c(0) 0 GOTO, END Ein WHILE-Programm kann eine eingeschränkte RAM (s. o.) simulieren. Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 9 / 20
Simulation von TM durch eingeschränkte RAM Beweisidee: Annahme: Σ = {0, 1}, Γ = {0, 1, B} Speicherung von Konfiguration w 1 w j 1 q k w j w n Register 1 Zustand der TM: k Register 2 Bandinschrift links vom Kopf: j 1 i=1 code(w i) 3 j i 1 Register 3 Bandinschrift rechts vom Kopf: n i=j code(w i) 3 i j code(b) = 0 code(0) = 1 code(1) = 2 Zugriff auf das Band mittels CADD, CMULT, CDIV, CMOD (einfach mit vorhandenen Befehlen zu implementieren). Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 10 / 20
Simulation von TM durch eingeschränkte RAM TM Zustand: q 13 Bandinschrift: B B B 1 1 0 1 1 0 1 B B RAM c(1) = 13 c(2) = (000221) 3 c(3) = (002122) 3 Ablauf eines Simulationsschrittes: IF-Abfrage, welcher Zustand, welches Zeichen unter dem Kopf Aktualisierung des Zustands Änderung des Zeichens unter dem Kopf, Verschieben des Kopfes Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 11 / 20
Simulation von TM durch eingeschränkte RAM TM Zustand: q 13 Bandinschrift: 0 0 0 2 2 1 2 2 1 2 0 0 RAM c(1) = 13 c(2) = (000221) 3 c(3) = (002122) 3 Ablauf eines Simulationsschrittes: IF-Abfrage, welcher Zustand, welches Zeichen unter dem Kopf Aktualisierung des Zustands Änderung des Zeichens unter dem Kopf, Verschieben des Kopfes Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 11 / 20
Simulation von TM durch eingeschränkte RAM TM Zustand: q 13 Bandinschrift: 0 0 0 2 2 1 2 2 1 2 0 0 RAM c(1) = 13 c(2) = (00022) 3 c(3) = (0021221) 3 Ablauf eines Simulationsschrittes: IF-Abfrage, welcher Zustand, welches Zeichen unter dem Kopf Aktualisierung des Zustands Änderung des Zeichens unter dem Kopf, Verschieben des Kopfes Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 11 / 20
Simulation von TM durch eingeschränkte RAM TM Zustand: q 13 Bandinschrift: 0 0 0 2 2 2 2 2 1 2 0 0 RAM c(1) = 13 c(2) = (0002) 3 c(3) = (00212222) 3 Ablauf eines Simulationsschrittes: IF-Abfrage, welcher Zustand, welches Zeichen unter dem Kopf Aktualisierung des Zustands Änderung des Zeichens unter dem Kopf, Verschieben des Kopfes Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 11 / 20
Beweis Turing-Mächtigkeit von WHILE-Programmen Lemma II Ein WHILE-Programm kann eine eingeschränkte RAM simulieren. Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 12 / 20
Beweis Turing-Mächtigkeit von WHILE-Programmen Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 13 / 20
Beweis Turing-Mächtigkeit von WHILE-Programmen Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 14 / 20
Beweis Turing-Mächtigkeit von WHILE-Programmen Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 15 / 20
Beweis Turing-Mächtigkeit von WHILE-Programmen Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 16 / 20
Ausblick: Die Programmiersprache LOOP Syntax Änderung im Vergleich zu WHILE-Programmen: Wir ersetzen das WHILE-Konstrukt durch ein LOOP-Konstrukt der folgenden Form: LOOP x i DO P END, wobei die Variable x i nicht in P vorkommen darf. Semantik Das Programm P wird x i mal hintereinander ausgeführt. Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 17 / 20
Ausblick: Die Programmiersprache LOOP Mächigkeit Definition Die durch LOOP-Programme berechenbaren Funktionen werden als LOOP-berechenbar oder primitiv-rekursiv bezeichnet. Vermutung von Hilbert (1926): Die Klasse der primitiv rekursiven Funktionen stimmt mit der Klasse der rekursiven (berechenbaren) Funktionen überein. Ackermann (1929): Diese Vermutung stimmt nicht! Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 18 / 20
Ausblick: Die Ackermann-Funktion Definition Definition Die Ackermannfunktion A: N 2 N ist folgendermaßen definert: A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 19 / 20
Ausblick: Berechenbarkeit der Ackermannfunktion Beobachtung Die Ackermannfunktion ist rekursiv. Begründung? Satz Die Ackermannfunktion ist nicht primitiv rekursiv. Beweis folgt. Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität 26. November 2009 20 / 20