\documentclass{bschlangaul-aufgabe} \bLadePakete{java,mathe,wpkalkuel} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 3}, Thematik = {ASCII}, Referenz = 46116-2015-H.T2-TA1-A3, RelativerPfad = Examen/46116/2015/09/Thema-2/Teilaufgabe-1/Aufgabe-3.tex, ZitatSchluessel = examen:46116:2015:09, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {Formale Verifikation, wp-Kalkül}, EinzelpruefungsNr = 46116, Jahr = 2015, Monat = 09, ThemaNr = 2, TeilaufgabeNr = 1, AufgabeNr = 3, } \let\wp=\bWpKalkuel \let\equivalent=\bWpEquivalent \let\erklaerung=\bWpErklaerung % markierung \def\m#1{\textcolor{blue}{#1}} % kommentar \def\k#1{\hfill{\scriptsize(#1)}} Sei \text{wp}(A, Q) die schwächste Vorbedingung (weakest precondition) eines Programmfragments $A$ bei gegebener Nachbedingung $Q$ so, dass $A$ alle Eingaben, die \text{wp}(A,Q) erfüllen, auf gültige Ausgaben abbildet, die $Q$ erfüllen.\index{Formale Verifikation}\index{wp-Kalkül} \footcite{examen:46116:2015:09} Bestimmen Sie schrittweise und formal (mittels Floyd-Hoare-Kalkül) jeweils \text{wp}(A, Q) für folgende Code-Fragmente $A$ und Nachbedingungen $Q$ und vereinfachen Sie dabei den jeweils ermittelten Ausdruck so weit wie möglich. Die Variablen $x$, $y$ und $z$ in folgenden Pseudo-Codes seien ganzzahlig (vom Typ int). Zur Vereinfachung nehmen Sie bitte im Folgenden an, dass die verwendeten Datentypen unbeschränkt sind und daher keine Überläufe auftreten können. \footcite{sosy:pu:5:4} \begin{enumerate} %----------------------------------------------------------------------- % %----------------------------------------------------------------------- \item Sequenz: \begin{minted}{java} x = -2 * (x + 2 * y); y += 2 * x + y + z; z -= x - y - z; \end{minted} $Q :\equiv x = y + z$ \begin{bAntwort} Code umformulieren: \begin{minted}{java} x = -2 * (x + 2 * y); y = y + 2 * x + y + z; z = z - (x - y - z); \end{minted} \wp{x=-2*(x+2*y);y=2*y+2*x+z;z=z-(x-y-z);}{x = y + z} \erklaerung{$z$ eingesetzen} \equivalent{\wp{x=-2*(x+2*y);y=2*y+2*x+z;}{x = y + (z - (x - y - z))}} \erklaerung{Innere Klammer auflösen} \equivalent{\wp{x=-2*(x+2*y);y=2*y+2*x+z;}{x = y + (- x + y - 2z)}} \erklaerung{Klammer auflösen} \equivalent{\wp{x=-2*(x+2*y);y=2*y+2*x+z;}{x = - x + 2y + 2z}} \erklaerung{$-x$ auf beiden Seiten} \equivalent{\wp{x=-2*(x+2*y);y=2*y+2*x+z;}{0 = -2x + 2y + 2z}} \erklaerung{$\div 2$ auf beiden Seiten} \equivalent{\wp{x=-2*(x+2*y);y=2*y+2*x+z;}{0 = -x + y + z}} \erklaerung{$y$ einsetzen} \equivalent{\wp{x=-2*(x+2*y);}{0 = -x + (2y + 2x + z) + z}} \erklaerung{Term vereinfachen} \equivalent{\wp{x=-2*(x+2*y);}{0 = x + 2y + 2z}} \erklaerung{$x$ einsetzen} \equivalent{\wp{}{0 = (-2(x + 2y)) + 2y + 2z}} \erklaerung{wp weglassen} \equivalent{0 = (-2(x + 2y)) + 2y + 2z} \erklaerung{ausmultiplizieren} \equivalent{0 = (-2x - 4y) + 2y + 2z} \erklaerung{Klammer auflösen, vereinfachen} \equivalent{0 = -2x - 2y + 2z} \erklaerung{$\div 2$ auf beiden Seiten} \equivalent{0 = -x - y + z} \erklaerung{$x$ nach links holen mit $+ x$ auf beiden Seiten} \equivalent{x = -y + z} \erklaerung{$y$ ganz nach links schreiben} \equivalent{x = z - y} $x = -2 \cdot (x + 2 \cdot y)$ \end{bAntwort} %----------------------------------------------------------------------- % %----------------------------------------------------------------------- \item Verzweigung: \begin{minted}{java} if (x < y) { x = y + z; } else if (y > 0) { z = y - 1; } else { x -= y -= z; } \end{minted} $Q :\equiv x > z$ \begin{bAntwort} \begin{description} \item[1. Fall:] $x < y$ \item[2. Fall:] $x \geq y \land y > 0$ \item[3. Fall:] $x \geq y \land y \leq 0$ \end{description} Code umformulieren: \begin{minted}{java} if (x < y) { x = y + z; } else if (x >= y && y > 0) { z = y - 1; } else { y = y - z; x = x - y; } \end{minted} \wp{if(x=y\&\&y>0)\{z=y-1;\}else\{y=y-z;x=x-y;\}} {x > z} $\equiv$ \k{In mehrere kleinere wp-Kalküle aufsplitten} \begin{align*} \Bigl( (x < y) & \land \wp{x=y+z;}{x > z} \, \Bigr) \lor \\ \Bigl( (x \geq y \land y > 0) & \land \wp{z=y-1;}{x > z} \Bigr) \, \lor \\ \Bigl( (x \geq y \land y \leq 0) & \land \wp{y=y-z;x=x-y;}{x > z} \Bigr) \\ \end{align*} $\equiv$ \k{Code einsetzen} \begin{align*} \Bigl( (x < y) & \land \wp{}{\m{y + z} > z} \, \Bigr) \lor \\ \Bigl( (x \geq y \land y > 0) & \land \wp{}{x > \m{y - 1}} \Bigr) \, \lor \\ \Bigl( (x \geq y \land y \leq 0) & \land \wp{y=y-z;}{\m{x - y} > z} \Bigr) \\ \end{align*} $\equiv$ \k{wp-Kalkül-Schreibweise weg lassen, Code weiter einsetzen} \begin{align*} \Bigl( (x < y) & \land y + z > z \, \Bigr) \lor \\ \Bigl( (x \geq y \land y > 0) & \land x > y - 1 \Bigr) \, \lor \\ \Bigl( (x \geq y \land y \leq 0) & \land \wp{}{x - \m{(y - z)} > z} \Bigr) \\ \end{align*} $\equiv$ \k{Terme vereinfachen, wp-Kalkül-Schreibweise weg lassen} \begin{align*} \Bigl( x < y & \land \m{y > 0} \, \Bigr) \lor \\ \Bigl( \m{x \geq y}\footnote{$x > y - 1 \land x \geq y$ ergibt $x \geq y$} &\land y > 0 \Bigr) \, \lor \\ \Bigl( (x \geq y \land y \leq 0) & \land x - (y - z) > z \Bigr) \\ \end{align*} $\equiv$ \k{letzten Term vereinfachen} \begin{align*} \Bigl( x < y & \land y > 0 \, \Bigr) \, \lor \\ \Bigl( x \geq y & \land y > 0 \Bigr) \, \lor \\ \Bigl( (x \geq y \land y \leq 0) & \land \m{x - y > 0} \Bigr) \\ \end{align*} $\equiv$ \k{ein $\land$ eleminieren} \begin{align*} \Bigl( x < y & \land y > 0 \, \Bigr) \, \lor \\ \Bigl( x \geq y & \land y > 0 \Bigr) \, \lor \\ \Bigl( y \leq 0 & \land \m{x > y} \Bigr) \\ \end{align*} \end{bAntwort} %----------------------------------------------------------------------- % %----------------------------------------------------------------------- \item Mehrfachauswahl: \begin{minted}{java} switch (z) { case "x": y = "x"; case "y": y = --z; break; default: y = 0x39 + "?"; } \end{minted} $Q :\equiv \texttt{'x'} = y$ Hinweis zu den ASCII-Codes \begin{itemize} \item $\texttt{'x'} = 120_{(10)}$ \item $\texttt{'y'} = 121_{(10)}$ \item $\texttt{0x39} = 57_{(10)}$ \item $\texttt{'?'} = 63_{(10)}$ \end{itemize} \end{enumerate} \begin{bAntwort} Mehrfachauswahl in Bedingte Anweisungen umschreiben. Dabei beachten, dass bei fehlendem \bJavaCode{break} die Anweisungen im folgenden Fall bzw. ggf. in den folgenden Fällen ausgeführt werden: \begin{minted}{java} if (z == "x") { y = "x"; y = z - 1; } else if (z == "y") { y = z - 1; } else { y = 0x39 + "?"; } \end{minted} \noindent Da kein \bJavaCode{break} im Fall \bJavaCode{z == "x"}. \bJavaCode{--z} bedeutet, dass die Variable erst um eins verringert und dann zugewiesen wird. \begin{minted}{java} if (z == 120) { y = 120; y = 120 - 1; } else if (z == 121) { y = 121 - 1; } else { y = 57 + 63; } \end{minted} \noindent Vereinfachung / Zusammenfassung: \begin{minted}{java} if (z == 120) { y = 120; y = 119; } else if (z == 121) { y = 120; } else { y = 120; } \end{minted} \wp{if(z==120)\{y=120;y=119;\}else if(z==121)\{y=120;\}else\{y=120;\}} {120 = y} \bigskip $\equiv$ \k{In mehrere kleinere wp-Kalküle aufsplitten} \begin{align*} \Bigl( (z = 120) & \land \wp{y=120;y=119;}{120 = y} \Bigr) \lor \\ \Bigl( ((z \neq 120) \land (z = 121)) & \land \wp{y=120;}{120 = y} \Bigr) \, \lor \\ \Bigl( ((z \neq 120) \land (z \neq 121)) & \land \wp{y=120;}{120 = y} \Bigr) \\ \end{align*} $\equiv$ \k{Code einsetzen} \begin{align*} \Bigl( (z = 120) & \land \wp{y=120;}{120 = \m{119}} \Bigr) \lor \\ \Bigl( ((z \neq 120) \land (z = 121)) & \land \wp{}{120 = \m{120}} \Bigr) \, \lor \\ \Bigl( ((z \neq 120) \land (z \neq 121)) & \land \wp{}{120 = \m{120}} \Bigr) \\ \end{align*} $\equiv$ \k{vereinfachen} \begin{align*} & \m{\text{false}} \, \lor\\ \Bigl( (z = 121) & \land \m{\text{true}} \, \Bigr) \lor \\ \Bigl( ((z \neq 120) \land (z \neq 121)) & \land \m{\text{true}} \Bigr) \\ \end{align*} $\equiv \text{false} \lor (z = 121) \lor ((z \neq 120) \land (z \neq 121))$ $\equiv (z = 121) \lor (z \neq 121)$ $\equiv z \neq 121$ Alle Zahlen außer 120 sind möglich bzw. alle Zeichen außer ’x’. \end{bAntwort} \end{document}