\documentclass{bschlangaul-aufgabe} \bLadePakete{java,wpkalkuel} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 1}, Thematik = {Verifikation}, Referenz = 66116-2020-H.T1-TA1-A1, RelativerPfad = Examen/66116/2020/09/Thema-1/Teilaufgabe-1/Aufgabe-1.tex, ZitatSchluessel = examen:66116:2020:09, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {Verifikation, wp-Kalkül}, EinzelpruefungsNr = 66116, Jahr = 2020, Monat = 09, ThemaNr = 1, TeilaufgabeNr = 1, AufgabeNr = 1, } \let\wp=\bWpKalkuel \let\equivalent=\bWpEquivalent \let\erklaerung=\bWpErklaerung \begin{enumerate} %% % a) %% \item Definieren Sie die Begriffe \emph{„partielle Korrektheit”} und \emph{„totale Korrektheit”} und grenzen Sie sie voneinander ab. \index{Verifikation} \footcite{examen:66116:2020:09} \begin{bAntwort} \begin{description} \item[partielle Korrektheit] Ein Programmcode wird bezüglich einer Vorbedingung $P$ und einer Nachbedingung $Q$ partiell korrekt genannt, wenn bei einer Eingabe, die die Vorbedingung $P$ erfüllt, jedes Ergebnis die Nachbedingung $Q$ erfüllt. Dabei ist es noch möglich, dass das Programm nicht für jede Eingabe ein Ergebnis liefert, also nicht für jede Eingabe terminiert. \item[totale Korrektheit] Ein Code wird total korrekt genannt, wenn er partiell korrekt ist und zusätzlich für jede Eingabe, die die Vorbedingung $P$ erfüllt, terminiert. Aus der Definition folgt sofort, dass total korrekte Programme auch immer partiell korrekt sind. \footcite{wiki:korrektheit} \end{description} \end{bAntwort} %% % b) %% \item Geben Sie die Verifikationsregel für die abweisende Schleife \bJavaCode{while(b) { A }} an. \begin{bAntwort} Eine abweisende Schleife ist eine while-Schleife, da die Schleifenbedingung schon bei der ersten Prüfung falsch sein kann und somit die Schleife abgewiesen wird. Um die schwächste Vorbedingung eines Ausdrucks der Form „\bJavaCode{while(b) { A }}“ zu finden, verwendet man eine \emph{Schleifeninvariante}. Sie ist ein Prädikat für das \begin{displaymath} \{ I \wedge b \} A \{ I \} \end{displaymath} \noindent gilt. Die Schleifeninvariante gilt also sowohl vor, während und nach der Schleife. \end{bAntwort} %% % c) %% \item Erläutern Sie kurz und prägnant die Schritte zur Verifikation einer abweisenden Schleife mit Vorbedingung $P$ und Nachbedingung $Q$. \begin{bAntwort} \begin{description} \item[Schritt 0:] Schleifeninvariante $I$ finden \item[Schritt 1:] $I$ gilt vor Schleifenbeginn,\\ d.h: $P \Rightarrow \wp{Code vor Schleife}{I}$ \item[Schritt 2:] $I$ gilt nach jedem Schleifendurchlauf\\ d.h. $I \land b \Rightarrow \wp{Code in der Schleife}{I}$ \item[Schritt 3:] Bei Terminierung der Schleife liefert Methode das gewünschte Ergebnis,\\ d.h. $I \,\land \neq b \Rightarrow \wp{Code nach der Schleife}{Q}$ \footcite[Seite 31]{sosy:fs:5} \end{description} \end{bAntwort} %% % d) %% \item Wie kann man die Terminierung einer Schleife beweisen? \begin{bAntwort} Zum Beweis der Terminierung einer Schleife muss eine Terminierungsfunktion $T$ angeben werden: \begin{displaymath} T \colon V \rightarrow \mathbb{N} \end{displaymath} \noindent $V$ ist eine Teilmenge der Ausdrücke über die Variablenwerte der Schleife Die Terminierungsfunktion muss folgende Eigenschaften besitzen: \begin{itemize} \item Ihre Werte sind natürliche Zahlen (einschließlich 0). \item Jede Ausführung des Schleifenrumpfs verringert ihren Wert (streng monoton fallend). \item Die Schleifenbedingung ist false, wenn $T = 0$. \end{itemize} $T$ ist die obere Schranke für die noch ausstehende Anzahl von Schleifendurchläufen. \footcite[Seite 33]{sosy:fs:5} Beweise für Terminierung sind nicht immer möglich! \footcite[Seite 38]{sosy:fs:5} \end{bAntwort} %% % e) %% \newpage \item Geben Sie für das folgende Suchprogramm die nummerierten Zusicherungen an. \textcolor{blue}{Lassen Sie dabei jeweils die invariante Vorbedingung $P$ des Suchprogramms weg.} Schreiben Sie nicht auf dem Aufgabenblatt! \index{wp-Kalkül} $P \equiv n > 0 \land a_0 \dots a_{n-1} \in \mathbb{Z}^n \land m \in \mathbb{Z}$ % i = -1; % // (1) % j = 0; % // (2) % while (i == -1 && j < n) // (3) % { // (4) % if (a[j] == m) { % // (5) % i = j; % // (6) % } % else { % // (7) % j = j + 1; % // (8) % } % // (9) % } % \end{minted} \bJavaExamen[firstline=18,lastline=34]{66116}{2020}{09}{Verfikation} $Q \equiv P \land (i = -1 \land \forall \, 0 \leq k < n \colon a_k \neq m) \lor (i \geq 0 \land a_i = m)$ \begin{bAntwort} In dieser Aufgabenstellung fällt die Vorbedingung mit der Invariante zusammen. Es muss kein wp-Kalkül berechnet werden, sondern „nur“ die Zuweisungen nachverfolgt werden, um zum Schluss die Nachbedingung zu erhalten. % markierung \def\m#1{\textcolor{blue}{#1}} \def\tmp{ $\textcolor{blue}{\land \, P}$} { \renewcommand{\labelenumii}{\arabic{enumii}.} \begin{enumerate} \item $(i = -1)$ \tmp % 1 \item $(i = -1) \land (j = 0)$ \tmp % 2 \item $(i = -1) \land (0 \leq j < n)$ \tmp % 3 \item $(i = -1) \land (0 \leq j < n)$ \tmp % 4 \item $(i = -1) \land (a_j = m) \land (0 \leq j < n)$ \tmp % 5 \item $(i \geq 0) \land i = j \land (a_j = m) \land (0 \leq j < n)$ \tmp % 6 \item $(i = -1) \land (\forall \, 0 \leq j < n \colon a_j \neq m)$ \tmp % 7 \item $(i = -1) \land (\forall \, 0 < j \leq n \colon a_j \neq m)$ \tmp % 8 \item $((i = -1) \land (\forall \, 0 \leq k < j \colon a_k \neq m)) \lor ((i \geq 0) \land (a_i = m))$ \tmp % 9 \end{enumerate} } \end{bAntwort} \begin{bAdditum}[Code-Beispiel eingebaut in eine Java-Klasse] \bJavaExamen{66116}{2020}{09}{Verfikation} \end{bAdditum} \end{enumerate} \end{document}