Universität Duisburg-Essen Fakultät für Ingenieurwissenschaften Abteilung Informatik und Angewandte Kognitionswissenschaften Fachbereich Theoretische Informatik Prof. Dr. Barbara König Übungsblatt 5 Berechenbarkeit und Komplexität/Theoretische Informatik Wintersemester 2014/15, Übungsleitung: H. Kerstan, S. Küpper Abgabe1 : Montag, 24. November 2014, 12:00 Uhr Aufgabe 15: WHILE-Programme (5 Punkte) (a) Geben Sie ein WHILE-Programm an, das den größten gemeinsamen Teiler (ggT(a, b)) zweier natürlicher Zahlen a, b berechnet. (3 P) Benutzen Sie dazu den Euklidischen Algorithmus: 1: Falls a = b gilt, bricht die Berechnung ab und es wird ggT(a, b) = a ausgegeben. Sonst weiter bei 2. 2: Falls a > b gilt, setzte a := a − b und gehe wieder zu 1, sonst zu 3. 3: Falls a < b gilt, setzte b := b − a und gehe zu 1. Hinweis: Definieren Sie sich ein Makro IF x = 0 THEN A ELSE B END. (b) Geben Sie nun ein WHILE-Programm an, das das kleinste gemeinsame Vielfache (kgV(a, b)) zweier natürlicher Zahlen a, b berechnet. Sie dürfen hierzu, auch wenn sie den ersten Aufgabenteil nicht gelöst haben, das Makro ggT(a, b) verwenden. Weiterhin dürfen Sie das Makro a ∗ b verwenden. (2 P) Aufgabe 16: LOOP-Programme (5 Punkte) (a) Beschreiben Sie in eigenen Worten, warum LOOP-Programme immer terminieren. (1 P) (b) Erläutern Sie vor diesem Hintergrund, warum LOOP-Programme nicht Turing-mächtig sind. (1 P) (c) Zeigen Sie, dass (3 P) ( f : N0 → N0 , f (n) = 0 , falls n = 0 dlog2 (n)e , sonst (der Logarithmus von n zur Basis 2 aufgerundet auf die nächste ganze Zahl) LOOPberechenbar ist, indem Sie ein LOOP-Programm für f angeben. Hinweis: Sie dürfen a + b, a − b, a ∗ b, a = b (in IF-Anweisungen), IF . . . THEN . . . END als Makros benutzen. 1 Abgabemöglichkeiten für Ihre Lösungen: Briefkasten neben LF 259 (Campus Duisburg) oder per Moodle https://moodle2.uni-due.de/course/view.php?id=4805 BeKo/TI, WiSe 14/15 Übungsblatt 5, Seite 2 Aufgabe 17: primitiv-rekursive Funktionen (5 Punkte) Zeigen Sie, dass die folgenden Funktionen primitiv rekursiv sind. Geben Sie dabei jeweils die verwendeten Regeln und Funktionen zur Bildung der Funktionen an. Sie dürfen in jeder Teilaufgabe die Funktionen aller vorherigen Teilaufgaben benutzen, auch wenn Sie eine Teilaufgabe nicht bearbeitet haben. (a) f1 : N20 → N0 , f1 (x, y) = y − x (modifizierte Subtraktion!) (2 P) ( (b) χ{0} : N0 → N0 , x 7→ , falls x = 0 , falls x > 0 1 0 ( (c) f2 : N20 → N0 , f2 (x, y) = 0 yx (1 P) , falls x = y = 0 , sonst Aufgabe 18: SKIP-Programme (2 P) (5 Punkte) Sie haben in der Vorlesung LOOP- WHILE- und GOTO-Programme kennengelernt. Natürlich gibt es noch andere Programmiersprachen. Hier sollen nun die SKIP-Programme vorgestellt und anschließend gezeigt werden, dass sie die gleiche Mächtigkeit haben wie GOTOProgramme. SKIP − Programm: • Eingabe: Die Sprache SKIP kennt folgende fünf Befehle: – SKIP(k) Überspringt die nächsten k ∈ N0 Programmzeilen – IF xi = c THEN SKIP(k) mit c, k ∈ N0 , überspringt die nächsten k Zeilen, wenn xi = c erfüllt ist – GOTOSTART Springt in die erste Programmzeile – xi := xj + c; mit c ∈ N0 – xi := xj − c; mit c ∈ N0 Die Eingaben für ein Programm werden in den Variablen x1 , . . . , xn übergeben. Jede nicht zugewiesene Variable hat am Anfang des Programmaufrufs den Wert 0. • Ausgabe: Ein SKIP-Programm ist beendet, wenn man am Ende des Programmcodes angekommen ist oder wenn man durch eine SKIP(k)Anweisung über die letzte Zeile des Programms hinausspringt. Das Ergebnis der Berechnung steht in x0 . (a) Zeigen Sie, dass man jedes GOTO-Programm durch ein geeignetes SKIP-Programm simulieren kann. (3 P) Hinweis: Benutzen Sie dazu eine ähnliche Vorgehensweise, wie bei der Simulation von GOTO- mit WHILE-Programmen (b) Zeigen Sie, dass man jedes SKIP-Programm durch ein geeignetes GOTO-Programm simulieren kann. (2 P)