\documentclass{bschlangaul-aufgabe} \bLadePakete{mathe,java,wpkalkuel} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 3}, Thematik = {Methode „doubleFac()“: wp-Kalkül und Schleifeninvariante}, Referenz = 66116-2015-H.T2-TA2-A3, RelativerPfad = Examen/66116/2015/09/Thema-2/Teilaufgabe-2/Aufgabe-3.tex, ZitatSchluessel = examen:66116:2015:09, ZitatBeschreibung = {Thema 2 Teilaufgabe 2 Aufgabe 3}, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {wp-Kalkül, Invariante, Terminierungsfunktion}, EinzelpruefungsNr = 66116, Jahr = 2015, Monat = 09, ThemaNr = 2, TeilaufgabeNr = 2, AufgabeNr = 3, } \let\wp=\bWpKalkuelOhneMathe Gegeben Sei folgendes Programm: \footcite[Thema 2 Teilaufgabe 2 Aufgabe 3]{examen:66116:2015:09} \begin{bJavaAngabe} long doubleFac (long n) { /* P */ long df = 1; for (long x = n; x > 1; x -= 2) { df *= x; } /* Q */ return df; } \end{bJavaAngabe} \noindent sowie die Vorbedingung $P \equiv n \geq 0$ und Nachbedingung $Q \equiv (\text{df} = n!!)$ wobei gilt\index{wp-Kalkül} \footcite{sosy:ab:8} \begin{equation*} n!! := \begin{cases} 2^k \cdot k! & n\text{ gerade, }k := \frac{n}{2} \\ \frac{(2k)!}{2^k \cdot k!}& n\text{ ungerade, }k := \frac{n+1}{2} \end{cases} \end{equation*} %% % %% \begin{bExkurs}[Fakultät] Die Fakultät ist eine Funktion, die einer natürlichen Zahl das Produkt aller natürlichen Zahlen (ohne Null) kleiner und gleich dieser Zahl zuordnet. % Für alle natürlichen Zahlen $n$ ist \begin{displaymath} n! = 1 \cdot 2 \cdot 3 \dotsm n=\prod_{k=1}^{n}k \end{displaymath} \end{bExkurs} %% % %% \begin{bExkurs}[Doppelfakultät] Die seltener verwendete „Doppelfakultät“ oder „doppelte Fakultät“ ist für gerade $n$ das Produkt aller geraden Zahlen kleiner gleich $n$. Für ungerade $n$ ist es das Produkt aller ungeraden Zahlen kleiner gleich $n$. % Sie ist definiert als: \begin{equation*} n!! = \begin{cases} n \cdot (n-2) \cdot (n-4) \dotsm 2 & \text{für } n \text{ gerade und } n > 0, \\ n \cdot (n-2) \cdot (n-4) \dotsm 1 & \text{für } n \text{ ungerade und } n > 0, \\ 1 & \text{für } n \in \{ -1, 0\} \end{cases} \end{equation*} \noindent Häufig werden anstelle der Doppelfakultät Ausdrücke mit der gewöhnlichen Fakultät verwendet. Es gilt $(2k)!! = 2^k k!$ und $(2k-1)!! = \frac{(2k)!}{2^k k!}$ \end{bExkurs} \noindent Zur Vereinfachung nehmen Sie im Folgenden an, dass die verwendeten Datentypen unbeschränkt sind und daher keine Überläufe auftreten können. \begin{enumerate} %% % (a) %% \item Welche der folgenden Bedingungen ist eine zum Beweisen der Korrektheit der Methode mittels wp-Kalkül (Floyd-Hoare-Kalkül) sinnvolle Schleifeninvariante? \index{Invariante} \begin{enumerate} \item $\text{df} = n!! - x!! \land x \geq 1$ \item $\text{df} = (n - x)!! \land x \geq 1$ \item $\text{df} \cdot x!! = n!! \land x \geq 0$ \item $(\text{df} + x)!! = n!! \land x \geq 0$ \end{enumerate} \begin{bAntwort} Zunächst wird der Code in einen äquivalenten Code mit while-Schleife umgewandelt: \begin{bJavaAngabe} long doubleFac (long n) { /* P */ long df = 1; long x = n ; while (x > 1) { df = df * x; x = x - 2; } /* Q */ return df; } \end{bJavaAngabe} \begin{enumerate} \item $\text{df} = n!! - x!! \land x \geq 1$ \item $\text{df} = (n - x)!! \land x \geq 1$ \\ Die ersten beiden Bedingungen sind unmöglich, da \zB für $n = 2$ nach der Schleife $x = 0$ gilt und daher $x \geq 1$ verletzt wäre. \item $\text{df} \cdot x!! = n!! \land x \geq 0$ \\ Nach dem Ausschlussprinzip ist es daher die dritte Bedingung: $I \equiv (\text{df} + x)!! = n!! \land x \geq 0$. \item $(\text{df} + x)!! = n!! \land x \geq 0$ \\ Die letzte kann es auch nicht sein, da vor der Schleife $\text{df} = 1$ und $x = n$ gilt, \dh $(\text{df} + x)!! = (1 + n)!!$. Jedoch ist offenbar $(1 + n)!! \not = n!!$. \end{enumerate} $\Rightarrow$ Die Schleifeninvariante lautet: $\text{df} \cdot x!! = n!! \land x \geq 0$ \end{bAntwort} %% % (b) %% \item Zeigen Sie formal mittels wp-Kalkül, dass die von Ihnen gewählte Bedingung unmittelbar vor Beginn der Schleife gilt, wenn zu Beginn der Methode die Anfangsbedingung $P$ gilt. \begin{bAntwort} Zu zeigen $P \Rightarrow \wp{Code vor der Schleife}{I}$ \begin{align*} \wp{Code vor der Schleife}{I} & \equiv \wp{df = 1; x = n;}{(\text{df} \cdot x)!! = n!! \land x \geq 0} \\ & \equiv \wp{df = 1;}{(\text{df} \cdot n)!! = n!! \land n \geq 0} \\ & \equiv \wp{}{(1 \cdot n)!! = n!! \land n \geq 0} \\ & \equiv n!! = n!! \land n \geq 0 \\ & \equiv n \geq 0 \\ & \equiv P \\ \end{align*} Insbesondere folgt damit die Behauptung. \end{bAntwort} %% % (c) %% \item Zeigen Sie formal mittels wp-Kalkül, dass die von Ihnen gewählte Bedingung tatsächlich eine Invariante der Schleife ist. \begin{bAntwort} zu zeigen: $I \land \text{Schleifenbedingung} \Rightarrow \wp{Code in der Schleife}{I}$ Bevor wir dies beweisen, zeigen wir erst $x \cdot (x - 2)!! = x!!$. \begin{itemize} \item Fall $x$ ist gerade ($n!! = 2^k \cdot k!$ für $k := \frac{n}{2}$): $x \cdot (x - 2)!! = x \cdot 2^\frac{x - 2}{2} \cdot (\frac{x - 2}{2})! = x \cdot \frac{1}{2} \cdot 2^\frac{x}{2} \cdot (\frac{x}{2} - 1)! = 2^\frac{x}{2} \cdot (\frac{x}{2})! = x!! $ Nebenrechnung (Division mit gleicher Basis: $x^{a-b} = \frac{x^a}{x^b}$): $2^\frac{x - 2}{2} = 2^{(\frac{x}{2} - \frac{2}{2})} = \frac{2^\frac{x}{2}}{2^\frac{2}{2}} = \frac{2^\frac{x}{2}}{2^1} = \frac{2^\frac{x}{2}}{2} = \frac{1}{2} \cdot 2^\frac{x}{2} $ Nebenrechnung ($n! = (n - 1)! \cdot n$): $x \cdot \frac{1}{2} \cdot (\frac{x}{2} - 1)! = \frac{x}{2} \cdot (\frac{x}{2} - 1)! = \frac{x}{2}! $ \item Fall $x$ ist ungerade: \end{itemize} Dies benutzen wir nun, um den eigentlichen Beweis zu führen: \begin{align*} \wp{Code vor der Schleife}{I} & \equiv \wp{df = df * x; x = x - 2;}{(\text{df} \cdot x)!! = n!! \land x \geq 0} \\ & \equiv \wp{df = df * x;}{(\text{df} \cdot (x - 2)))!! = n!! \land x - 2 \geq 0} \\ & \equiv \wp{}{(\text{df} \cdot x \cdot (x - 2)))!! = n!! \land x - 2 \geq 0} \\ & \equiv (\text{df} \cdot x)!! = n!! \land x \geq 2 \\ & \equiv (\text{df} \cdot x)!! = n!! \land x > 1 \\ & \equiv I \land x > 1 \\ & \equiv I \land \text{Schleifenbedingung} \\ \end{align*} \end{bAntwort} %% % (d) %% \item Zeigen Sie formal mittels wp-Kalkül, dass am Ende der Methode die Nachbedingung $Q$ erfüllt wird. \begin{bAntwort} z.z. $I \land \neg \text{Schleifenbedingung} \Rightarrow \wp{Code nach der Schleife}{Q}$ Wir vereinfachen den Ausdruck $I \land \neg \text{Schleifenbedingung}$: $I \land \neg \text{Schleifenbedingung} \equiv I \land (x \leq 1) \equiv I \land ((x = 0) \lor (x = 1)) \equiv (I \land (x = 0)) \lor (I \land (x = 1)) \equiv (df \cdot 1 = n!!) \lor (df \cdot 1 = n!!) \equiv df = n!!$ Damit gilt: $\wp{Code nach der Schleife}{Q} \equiv \wp{}{df = n!!} \equiv df = n!! \equiv I \land \neg \text{Schleifenbedingung}$ \end{bAntwort} %% % (e) %% \item Beweisen Sie, dass die Methode immer terminiert. Geben Sie dazu eine Terminierungsfunktion\index{Terminierungsfunktion} an und begründen Sie kurz ihre Wahl. \begin{bAntwort} Sei $T (x) := x$. $T$ ist offenbar ganzzahlig. Da $x$ in jedem Schleifendurchlauf um $2$ verringert wird, ist $T$ streng monoton fallend. Aus der Schleifeninvariante folgt $x \geq 0$ und daher ist $x$ auch nach unten beschränkt. Damit folgt $I \Rightarrow T \geq 0$ und $T$ ist eine gültige Terminierungsfunktion. \end{bAntwort} \end{enumerate} \end{document}