Ubungsblatt 5 - Theoretische Informatik

Werbung
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)
Herunterladen