DAP2 Präsenzübung 2 - TU Dortmund, Informatik 2
Transcription
DAP2 Präsenzübung 2 - TU Dortmund, Informatik 2
C. Sohler J. Flake, A. Krivo²ija SoSe 2015 R. Penninger, B. Rudak, V.Volz DAP2 Präsenzübung 2 Besprechung: 22.04.2015 24.04.2015 Präsenzaufgabe 2.1: (Korrektheitsbeweise: Korrektheit eines einfachen Programms) Ulla, begeisterte Informatikstudentin der TU Dortmund, hat in alten Archiven ihres Opas Udo einen Programmentwurf in einer etwas merkwürdigen Programmiersprache, die noch nicht den heutzutage üblichen Standardisierungen entsprach, gefunden: EinfachesProgramm(int 1. 2. 3. 4. 5. 6. 7. k ,int n): s ← plus(0, 0) while ungleich(0, k ) do if ungleich(0, minusminus(k , 2)) s ← stern(s, n) k ← minus(2, k ) n ← plusplus(n, 2) return s; then Neugierig geworden, was in diesem Entwurf programmiert worden ist, wandte sie sich an Opa Udo, der aber seinem Alter geschuldet immer öfter Dinge vergaÿ und ihr daher nicht so recht weiterhelfen konnte. Wohl aber konnte er sich daran erinnern, dass es in dieser Programmiersprache, in der schon if-then Bedingungen formuliert werden konnten und auch while -Schleifen und einfache Zuweisungen (gekennzeichnet durch ←) möglich waren, einige vorimplementierte Funktionen gab, die mit zwei nichtnegativen ganzen Zahlen aufzurufen waren: plus(x,y ): minus(x,y ): stern(x,y ): plusplus(x,y ): minusminus(x,y ): Liefert als Ergebnis Liefert als Ergebnis Liefert als Ergebnis Liefert als Ergebnis Liefert als Ergebnis 2x · y y div x (ganzzahlige x+y x·y x mod y Division) Auch war eine weitere Funktion vorhanden, die einen Wahrheitswert zurück lieferte: ungleich(x,y ): Liefert wahr, wenn x<y ist, und falsch sonst Ulla, mit diesen Informationen ausgestattet, machte sich daran, den gefundenen Programmentwurf zu analysieren. Sie kam zu der Überzeugung, dass das Programm das Produkt der beiden Zahlen k und n berechnet. Verizieren Sie Ullas Ansicht. Gehen Sie dazu in den folgenden Schritten vor: 1. Formulieren Sie zunächst für die while-Schleife eine Invariante. Weisen Sie dann nach, dass diese Formel tatsächlich eine Schleifeninvariante ist. 1 2. Zeigen Sie dann die Korrektheit des Programms, d.h., zeigen Sie, dass das Programm bei Eingabe von zwei nicht negativen ganzen Zahlen k und n k und n das Produkt der beiden Zahlen ausgibt. Präsenzaufgabe 2.2: (Schleifeninvariante und vollständige Induktion) Betrachten Sie den folgenden Algorithmus, der die Variablen a, b, tmp, sum, i und die Eingabevariable n verwendet, die natürliche Zahlen speichern können. FibProduct(int n): 8. ←0 b ← 1 sum ← 0 for i ← 1 to n do tmp ← a a ← b b ← b + tmp sum ← sum + a · 9. return sum 1. 2. 3. 4. 5. 6. 7. a a Beweisen Sie, dass der Algorithmus bei Eingabe einer natürlichen Zahl beiden Fibonacci-Zahlen f ib(n) und f ib(n + 1) 1. Formulieren Sie zunächst für die n das Produkt der berechnet. for-Schleife eine Invariante. Weisen Sie dann nach, dass diese Formel tatsächlich eine Schleifeninvariante ist. 2. Zeigen Sie dann die Korrektheit des Programms, d.h., zeigen Sie, dass das Programm bei Eingabe einer natürlichen Zahl n den Wert des Produktes f ib(n) · f ib(n + 1) Zur Erinnerung: Die Fibonacci-Funktion f ib ist folgendermaÿen deniert: 0 f ib(n) = 1 f ib(n − 1) + f ib(n − 2)) 2 falls falls falls n=0 n=1 n>1 ausgibt.