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 Programmiersprachen C, C++, C# Maschinenmodelle Turing-Maschine Java Registermaschine PHP, JavaScript Endliche Automaten 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 x0 x1 x2 . . . Konstanten −1 0 1 Symbole ; := + 6= 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 xi := xj + 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 P1 und P2 WHILE-Programme sind, dann ist auch P1 ; P2 ein WHILE-Programm. WHILE-Konstrukt Falls P ein WHILE-Programm ist, dann ist auch WHILE xi 6= 0 DO P END ein WHILE-Programm. 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 : Nk → N. Die Eingabe ist in den Variablen x1 , . . . , xk 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 x0 ergibt. Programme der Form xi := xj + c sind Zuweisungen des Wertes xj + c an die Variable xi . In einem WHILE-Programm P1 ; P2 wird zunächst P1 und dann P2 ausgeführt. Das Programm WHILE xi 6= 0 DO P END hat die Bedeutung, dass P solange ausgeführt wird, bis xi 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 x2 6= 0 DO x1 := x1 + 1; x2 := x2 − 1 END; x0 := x1 + 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 LOAD, CLOAD, STORE, CADD, CSUB, GOTO, IF c(0) 6= 0 GOTO, END simuliert werden. Lemma II 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 w1 · · · wj−1 qk wj · · · wn Register 1 Zustand der TM: k Register 2 Bandinschrift links vom Kopf: Pj−1 j−i−1 code(w i) · 3 i=1 Register 3 Bandinschrift rechts vom Kopf: Pn i−j i=j code(wi ) · 3 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: q13 Bandinschrift: BBB 1 1 0 1 1 0 1 BB 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: q13 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: q13 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: q13 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 xi DO P END , wobei die Variable xi nicht in P vorkommen darf. Semantik Das Programm P wird xi 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 : N2 → N ist folgendermaßen definert: A(0, n) = n+1 A(m + 1, 0) = A(m, 1) A(m + 1, n + 1) = A(m, A(m + 1, n)) Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und Komplexität für n ≥ 0 für m ≥ 0 für m, n ≥ 0 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