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.