uebung 08 final

This commit is contained in:
reijix 2023-06-19 12:17:19 +02:00
parent afecdc3d44
commit dc416791a3
27 changed files with 1284 additions and 29 deletions

2
.gitignore vendored
View file

@ -284,6 +284,4 @@ TSWLatexianTemp*
main.pdf main.pdf
main-poster.pdf main-poster.pdf
*.pdf
slides
.DS_Store .DS_Store

BIN
slides/ThProgUE4.pdf Executable file

Binary file not shown.

BIN
slides/ThProgUE5.pdf Normal file

Binary file not shown.

BIN
slides/ThProgUE6.pdf Normal file

Binary file not shown.

BIN
slides/ThProgUE7.pdf Normal file

Binary file not shown.

BIN
slides/ThProgUE8.pdf Normal file

Binary file not shown.

BIN
template-art/FAU/FAUKennung.pdf Executable file

Binary file not shown.

Binary file not shown.

BIN
template-art/FAUWortmarkeBlau.pdf Executable file

Binary file not shown.

1186
template-art/FAUWortmarkeWhite.pdf Executable file

File diff suppressed because it is too large Load diff

BIN
template-art/Med/MedKennung.pdf Executable file

Binary file not shown.

Binary file not shown.

BIN
template-art/Nat/NatKennung.pdf Executable file

Binary file not shown.

Binary file not shown.

BIN
template-art/Phil/PhilKennung.pdf Executable file

Binary file not shown.

Binary file not shown.

BIN
template-art/RW/RWKennung.pdf Executable file

Binary file not shown.

Binary file not shown.

BIN
template-art/RW/RechtKennung.pdf Executable file

Binary file not shown.

Binary file not shown.

BIN
template-art/RW/WiSoENKennung.pdf Executable file

Binary file not shown.

Binary file not shown.

BIN
template-art/RW/WiSoKennung.pdf Executable file

Binary file not shown.

Binary file not shown.

BIN
template-art/Tech/TechKennung.pdf Executable file

Binary file not shown.

Binary file not shown.

View file

@ -227,7 +227,7 @@ Die neue Grammatik für Typen lautet:
Natürlich müssen wir damit auch neue Konstrukte einführen, die zu diesen Typkonstruktoren gehören. Die Termsprache wird also erweitert auf die Grammatik Natürlich müssen wir damit auch neue Konstrukte einführen, die zu diesen Typkonstruktoren gehören. Die Termsprache wird also erweitert auf die Grammatik
\[ \[
t,s ::= x \;\vert\; ts \;\vert\; \lambda x.t \;\vert\; {t, s} \;\vert\; fst\;t \;\vert\; snd\;t t,s ::= x \;\vert\; ts \;\vert\; \lambda x.t \;\vert\; \{t, s\} \;\vert\; fst\;t \;\vert\; snd\;t
\] \]
\;\\ \;\\
Geben Sie die zusätzlich benötigten Typisierungsregeln an und erweitern Sie ebenso die Auswertungsrelation um Grundreduktion für Paare. Geben Sie die zusätzlich benötigten Typisierungsregeln an und erweitern Sie ebenso die Auswertungsrelation um Grundreduktion für Paare.
@ -243,7 +243,7 @@ Geben Sie die zusätzlich benötigten Typisierungsregeln an und erweitern Sie eb
Wir behaupten nun, dass diese Erweiterung uns auch mehr Ausdrucksstärke in der Logik auf der anderen Seite des Curry-Howard-Isomorphismus einbringt. Wir behaupten nun, dass diese Erweiterung uns auch mehr Ausdrucksstärke in der Logik auf der anderen Seite des Curry-Howard-Isomorphismus einbringt.
Genauer gesagt, dass wir das folgende Fragment der intuitionistischen propositionalen Logik erhalten: Genauer gesagt, dass wir das folgende Fragment der intuitionistischen propositionalen Logik erhalten:
\[ \[
\phi, \psi ::= a \;\vert\; \phi \rightarrow \psi \;\vert\; \phi \rightarrow \psi \phi, \psi ::= a \;\vert\; \phi \rightarrow \psi \;\vert\; \phi \land \psi
\] \]
wobei $a$ propositionale Variablen sind. Als Deduktionssystem verwenden wir den Sequentenkalkül minimaler Logik mit folgenden zusätzlichen Regeln: wobei $a$ propositionale Variablen sind. Als Deduktionssystem verwenden wir den Sequentenkalkül minimaler Logik mit folgenden zusätzlichen Regeln:
\[ \[
@ -254,16 +254,57 @@ wobei $a$ propositionale Variablen sind. Als Deduktionssystem verwenden wir den
Sei $\overline{\phi}$ der Typ, der entsteht, wenn man in $\phi$ alle $\land$ durch $\times$ ersetzt. Beweisen Sie: Sei $\overline{\phi}$ der Typ, der entsteht, wenn man in $\phi$ alle $\land$ durch $\times$ ersetzt. Beweisen Sie:
Der Sequent $\vdash \phi$ ist genau dann herleitbar, wenn der Typ $\overline{\phi}$ inhabited ist. Der Sequent $\vdash \phi$ ist genau dann herleitbar, wenn der Typ $\overline{\phi}$ inhabited ist.
\end{frame} \end{frame}
\begin{frame}[t, fragile]{Aufgabe 1.2}{Der Curry-Howard-Isomorphismus}
\begin{frame}[t, fragile]{Aufgabe 1.2}{Überblick Sequenten- und $\lambda$-Kalkül}
\begin{minipage}{.44\textwidth}
\centering\textbf{Sequentenkalkül}
\\mit $\Gamma$ als Formelmenge $\{\phi_1, \ldots, \phi_n\}$
\[
\begin{array}{c c}
\multicolumn{2}{c}{\infer* [left=(AX), right=$\phi \in \Gamma$]{\;} {\Gamma \vdash \phi}}
\\\;\\
\infer* [left=($\rightarrow_I$)] {\Gamma, \phi \vdash \psi} {\Gamma \vdash \phi \rightarrow \psi} & \infer* [left=($\land_I$)] {\Gamma \vdash \phi \\ \Gamma \vdash \psi} {\Gamma \vdash \phi \land \psi}
\\\;\\
\multicolumn{2}{c}{\infer* [left=($\rightarrow_E$)] {\Gamma \vdash \phi \rightarrow \psi \\ \Gamma \vdash \phi} {\Gamma \vdash \psi}}
\\\;\\
\infer* [left=($\land_{E1}$)] {\Gamma \vdash \phi \land \psi} {\Gamma \vdash \phi} & \infer* [left=($\land_{E2}$)] {\Gamma \vdash \phi \land \psi} {\Gamma \vdash \psi}
\end{array}
\]
\end{minipage}
\begin{minipage}{.54\textwidth}
\centering\textbf{Einfach getypter $\lambda$-Kalkül}
\\mit $\Gamma$ als Kontext $\{x_1 : \alpha_1, \ldots, x_n : \alpha_n\}$
\[
\begin{array}{c c}
\multicolumn{2}{c}{\infer* [left=(Ax), right=$x : \alpha \in \Gamma$]{\;} {\Gamma \vdash x : \alpha}}
\\\;\\
\infer* [left=($\rightarrow_i$)] {\Gamma[x \mapsto \alpha] \vdash t : \beta} {\Gamma \vdash \lambda x.t : \alpha \rightarrow \beta} & \infer* [left=($prod$)] {\Gamma \vdash t : \tau \\ \Gamma \vdash s : \sigma} {\Gamma \vdash \{t,s\} : \tau \times \sigma}
\\\;\\
\multicolumn{2}{c}{\infer* [left=($\rightarrow_e$)] {\Gamma \vdash t : \alpha \rightarrow \beta \\ \Gamma \vdash s : \alpha} {\Gamma \vdash ts : \beta}}
\\\;\\
\infer* [left=($proj_1$)] {\Gamma \vdash p : \tau \times \sigma} {\Gamma \vdash fst\;p : \tau} & \infer* [left=($proj_2$)] {\Gamma \vdash p : \tau \times \sigma} {\Gamma \vdash snd\;p : \sigma}
\end{array}
\]
\end{minipage}
\end{frame}
\begin{frame}[t, fragile]{Aufgabe 1.3}{Der Curry-Howard-Isomorphismus}
Benutzen Sie die eben hergestellte Korrespondenz, um zu zeigen, dass folgende Formel eine Tautologie ist: Benutzen Sie die eben hergestellte Korrespondenz, um zu zeigen, dass folgende Formel eine Tautologie ist:
\[ \[
(p \land q) \rightarrow r \rightarrow ((r \land p) \land q) (p \land q) \rightarrow r \rightarrow ((r \land p) \land q)
\] \]
\vfill
\begin{block}{Erweiterte Termgrammatik}
\[
t,s ::= x \;\vert\; ts \;\vert\; \lambda x.t \;\vert\; \{t, s\} \;\vert\; fst\;t \;\vert\; snd\;t
\]
\end{block}
\end{frame} \end{frame}
\section{Aufgabe 2 - Listen und Bäume} \section{Aufgabe 2 - Listen und Bäume}
\begin{frame}[t,fragile]{Aufgabe 2.1}{Listen und Bäume} \begin{frame}[t,fragile]{Aufgabe 2}{Listen und Bäume}
Wir betrachten die folgenden algebraischen Definitionen parametrischer Datentypen von Listen und Binärbäumen über einem Typparameter $a$: Wir betrachten die folgenden algebraischen Definitionen parametrischer Datentypen von Listen und Binärbäumen über einem Typparameter $a$:
\begin{minipage}{.41\textwidth} \begin{minipage}{.41\textwidth}
@ -276,13 +317,41 @@ data List a where
\begin{minipage}{.58\textwidth} \begin{minipage}{.58\textwidth}
\begin{lstlisting}[language=haskell, morekeywords=Tree] \begin{lstlisting}[language=haskell, morekeywords=Tree]
data Tree a where data Tree a where
Leaf $\ \ $: () $\rightarrow$ Tree a Leaf $\ \ $: a $\rightarrow$ Tree a
Inner : a $\rightarrow$ Tree a $\rightarrow$ Tree a $\rightarrow$ Tree a Inner : a $\rightarrow$ Tree a $\rightarrow$ Tree a $\rightarrow$ Tree a
\end{lstlisting} \end{lstlisting}
\end{minipage} \end{minipage}
\;\\ \\\;\\\;\\
Beschreiben Sie in eigenen Worten die durch die folgenden Terme gegebenen Listen und Binärbäume mit natürlichen Zahlen bzw. zeichnen Sie diese. \begin{block}{Einige Annahmen}
\begin{multicols}{2} Wir nehmen Typ \textbf{Nat} von Konstanten $0,1,2,\ldots$ und die üblichen Grundoperationen für \textbf{Nat} als gegeben an.
Weiter nehmen wir den Typ \textbf{Bool} mit den Konstanten $True$ und $False$ sowie den Grundoperationen dazu als gegeben an.
Mit \texttt{()} bezeichnen wir den Typ $unit$; er enthält nur einen einzigen Wert, den wir ebenfalls mit \texttt{()} bezeichnen.
\\\;\\
Weiterhin schreiben wir in Beweisen der Gleichheit zweier gegebener Terme $s$ und $t$ die Aussage $s \leftrightarrow_{\beta\delta}^* t$ abgekürzt als $s = t$.
\end{block}
\end{frame}
\begin{frame}[t,fragile]{Aufgabe 2.1}{Listen und Bäume}
Wir betrachten die folgenden algebraischen Definitionen parametrischer Datentypen von Listen und Binärbäumen über einem Typparameter $a$:
\begin{minipage}{.41\textwidth}
\begin{lstlisting}[language=haskell]
data List a where
Nil $\ $: () $\rightarrow$ List a
Cons : a $\rightarrow$ List a $\rightarrow$ List a
\end{lstlisting}
\end{minipage}
\begin{minipage}{.58\textwidth}
\begin{lstlisting}[language=haskell, morekeywords=Tree]
data Tree a where
Leaf $\ \ $: a $\rightarrow$ Tree a
Inner : a $\rightarrow$ Tree a $\rightarrow$ Tree a $\rightarrow$ Tree a
\end{lstlisting}
\end{minipage}
\vfill
Beschreiben Sie in eigenen Worten die durch die folgenden Terme gegebenen Listen und Binärbäume mit natürlichen Zahlen bzw. zeichnen Sie diese.
\begin{multicols}{2}
\begin{itemize} \begin{itemize}
\item Nil \item Nil
\item Cons 5 Nil \item Cons 5 Nil
@ -293,8 +362,8 @@ Beschreiben Sie in eigenen Worten die durch die folgenden Terme gegebenen Listen
\item Inner 8 (Inner 4 (Leaf 1) (Leaf 20)) (Leaf 8) \item Inner 8 (Inner 4 (Leaf 1) (Leaf 20)) (Leaf 8)
\item Inner 6 (Leaf 99) (Inner 1 (Leaf 4) (Leaf 6)) \item Inner 6 (Leaf 99) (Inner 1 (Leaf 4) (Leaf 6))
\end{itemize} \end{itemize}
\end{multicols} \end{multicols}
\end{frame} \end{frame}
\begin{frame}[t,fragile]{Aufgabe 2.2}{Listen und Bäume} \begin{frame}[t,fragile]{Aufgabe 2.2}{Listen und Bäume}
Wir betrachten die folgenden algebraischen Definitionen parametrischer Datentypen von Listen und Binärbäumen über einem Typparameter $a$: Wir betrachten die folgenden algebraischen Definitionen parametrischer Datentypen von Listen und Binärbäumen über einem Typparameter $a$:
@ -309,7 +378,7 @@ Beschreiben Sie in eigenen Worten die durch die folgenden Terme gegebenen Listen
\begin{minipage}{.58\textwidth} \begin{minipage}{.58\textwidth}
\begin{lstlisting}[language=haskell, morekeywords=Tree] \begin{lstlisting}[language=haskell, morekeywords=Tree]
data Tree a where data Tree a where
Leaf $\ \ $: () $\rightarrow$ Tree a Leaf $\ \ $: a $\rightarrow$ Tree a
Inner : a $\rightarrow$ Tree a $\rightarrow$ Tree a $\rightarrow$ Tree a Inner : a $\rightarrow$ Tree a $\rightarrow$ Tree a $\rightarrow$ Tree a
\end{lstlisting} \end{lstlisting}
\end{minipage} \end{minipage}
@ -328,6 +397,7 @@ size (Leaf x) $\ \ \ \ \ $= 1
size (Inner x l r) = 1 + size l + size r size (Inner x l r) = 1 + size l + size r
\end{lstlisting} \end{lstlisting}
\end{minipage} \end{minipage}
\vfill
\begin{enumerate} \begin{enumerate}
\item[(a)] Welchen Typ hat \texttt{length}? Welchen hat \texttt{size}? \item[(a)] Welchen Typ hat \texttt{length}? Welchen hat \texttt{size}?
\item[(b)] Werten Sie den Term \texttt{length (Cons 4 (Cons 89 (Cons 21 Nil)))} aus. \item[(b)] Werten Sie den Term \texttt{length (Cons 4 (Cons 89 (Cons 21 Nil)))} aus.
@ -347,7 +417,7 @@ size (Inner x l r) = 1 + size l + size r
\begin{minipage}{.58\textwidth} \begin{minipage}{.58\textwidth}
\begin{lstlisting}[language=haskell, morekeywords=Tree] \begin{lstlisting}[language=haskell, morekeywords=Tree]
data Tree a where data Tree a where
Leaf $\ \ $: () $\rightarrow$ Tree a Leaf $\ \ $: a $\rightarrow$ Tree a
Inner : a $\rightarrow$ Tree a $\rightarrow$ Tree a $\rightarrow$ Tree a Inner : a $\rightarrow$ Tree a $\rightarrow$ Tree a $\rightarrow$ Tree a
\end{lstlisting} \end{lstlisting}
\end{minipage} \end{minipage}
@ -366,6 +436,7 @@ size (Leaf x) $\ \ \ \ \ $= 1
size (Inner x l r) = 1 + size l + size r size (Inner x l r) = 1 + size l + size r
\end{lstlisting} \end{lstlisting}
\end{minipage} \end{minipage}
\vfill
Schreiben Sie eine Funktion $\mathtt{element} : \mathbf{Nat} \rightarrow \mathbf{List}\;\mathbf{Nat} \rightarrow \mathbf{Bool}$, so dass \texttt{element a xs = True} wenn \texttt{a} in \texttt{xs} vorkommt, und andernfalls \texttt{element a xs = False}. Schreiben Sie eine Funktion $\mathtt{element} : \mathbf{Nat} \rightarrow \mathbf{List}\;\mathbf{Nat} \rightarrow \mathbf{Bool}$, so dass \texttt{element a xs = True} wenn \texttt{a} in \texttt{xs} vorkommt, und andernfalls \texttt{element a xs = False}.
\end{frame} \end{frame}
@ -374,13 +445,13 @@ size (Inner x l r) = 1 + size l + size r
Der Typ und die Definitionen dieser Fold-Funktionen ergeben sich dabei allein aus den Typen der Konstruktoren. Der Typ und die Definitionen dieser Fold-Funktionen ergeben sich dabei allein aus den Typen der Konstruktoren.
Beispielsweise ist die Fold-Funktion für den Datentyp $\mathbf{Nat}\;a$ aus der vorangegangenen Übung wie folgt definiert: Beispielsweise ist die Fold-Funktion für den Datentyp $\mathbf{Nat}\;a$ aus der vorangegangenen Übung wie folgt definiert:
\begin{lstlisting}[language=haskell] \begin{lstlisting}[language=haskell]
foldL : c $\rightarrow$ (a $\rightarrow$ c $\rightarrow$ c) $\rightarrow$ List a $\rightarrow$ C foldL : c $\rightarrow$ (a $\rightarrow$ c $\rightarrow$ c) $\rightarrow$ List a $\rightarrow$ c
foldL n f Nil = n foldL n f Nil = n
foldL n f (Cons x xs) = f x (foldL n f xs) foldL n f (Cons x xs) = f x (foldL n f xs)
\end{lstlisting} \end{lstlisting}
Hierbei entspricht der Typparameter $c$ einem Ergebnistyp und die beiden Argumente $n$ und $f$ den Konstruktoren $Nil$ und $Cons$, wobei die Typen der Argumente jeweils Operationen Hierbei entspricht der Typparameter $c$ einem Ergebnistyp und die beiden Argumente $n$ und $f$ den Konstruktoren $Nil$ und $Cons$, wobei die Typen der Argumente jeweils Operationen
auf dem Ergebnistyp $c$ beschreiben, mit dem eine Liste $\mathbf{List}\;a$ in einen einzelnen Wert vom Typ $c$ „zusammengefaltet“ werden kann. auf dem Ergebnistyp $c$ beschreiben, mit dem eine Liste $\mathbf{List}\;a$ in einen einzelnen Wert vom Typ $c$ „zusammengefaltet“ werden kann.
\\\;\\ \vfill
Werten Sie den Term \texttt{foldL n f (Cons 2 (Cons 3 (Cons 6 Nil)))} so weit es geht aus. Werten Sie den Term \texttt{foldL n f (Cons 2 (Cons 3 (Cons 6 Nil)))} so weit es geht aus.
\end{frame} \end{frame}
@ -389,13 +460,13 @@ size (Inner x l r) = 1 + size l + size r
Der Typ und die Definitionen dieser Fold-Funktionen ergeben sich dabei allein aus den Typen der Konstruktoren. Der Typ und die Definitionen dieser Fold-Funktionen ergeben sich dabei allein aus den Typen der Konstruktoren.
Beispielsweise ist die Fold-Funktion für den Datentyp $\mathbf{Nat}\;a$ aus der vorangegangenen Übung wie folgt definiert: Beispielsweise ist die Fold-Funktion für den Datentyp $\mathbf{Nat}\;a$ aus der vorangegangenen Übung wie folgt definiert:
\begin{lstlisting}[language=haskell] \begin{lstlisting}[language=haskell]
foldL : c $\rightarrow$ (a $\rightarrow$ c $\rightarrow$ c) $\rightarrow$ List a $\rightarrow$ C foldL : c $\rightarrow$ (a $\rightarrow$ c $\rightarrow$ c) $\rightarrow$ List a $\rightarrow$ c
foldL n f Nil = n foldL n f Nil = n
foldL n f (Cons x xs) = f x (foldL n f xs) foldL n f (Cons x xs) = f x (foldL n f xs)
\end{lstlisting} \end{lstlisting}
Hierbei entspricht der Typparameter $c$ einem Ergebnistyp und die beiden Argumente $n$ und $f$ den Konstruktoren $Nil$ und $Cons$, wobei die Typen der Argumente jeweils Operationen Hierbei entspricht der Typparameter $c$ einem Ergebnistyp und die beiden Argumente $n$ und $f$ den Konstruktoren $Nil$ und $Cons$, wobei die Typen der Argumente jeweils Operationen
auf dem Ergebnistyp $c$ beschreiben, mit dem eine Liste $\mathbf{List}\;a$ in einen einzelnen Wert vom Typ $c$ „zusammengefaltet“ werden kann. auf dem Ergebnistyp $c$ beschreiben, mit dem eine Liste $\mathbf{List}\;a$ in einen einzelnen Wert vom Typ $c$ „zusammengefaltet“ werden kann.
\\\;\\ \vfill
Finden Sie den Typ und die Definition der entsprechenden Fold-Funktion \texttt{foldT} des parametrischen Datentyps $\mathbf{Tree}\;a$. Finden Sie den Typ und die Definition der entsprechenden Fold-Funktion \texttt{foldT} des parametrischen Datentyps $\mathbf{Tree}\;a$.
\end{frame} \end{frame}
@ -404,13 +475,13 @@ size (Inner x l r) = 1 + size l + size r
Der Typ und die Definitionen dieser Fold-Funktionen ergeben sich dabei allein aus den Typen der Konstruktoren. Der Typ und die Definitionen dieser Fold-Funktionen ergeben sich dabei allein aus den Typen der Konstruktoren.
Beispielsweise ist die Fold-Funktion für den Datentyp $\mathbf{Nat}\;a$ aus der vorangegangenen Übung wie folgt definiert: Beispielsweise ist die Fold-Funktion für den Datentyp $\mathbf{Nat}\;a$ aus der vorangegangenen Übung wie folgt definiert:
\begin{lstlisting}[language=haskell] \begin{lstlisting}[language=haskell]
foldL : c $\rightarrow$ (a $\rightarrow$ c $\rightarrow$ c) $\rightarrow$ List a $\rightarrow$ C foldL : c $\rightarrow$ (a $\rightarrow$ c $\rightarrow$ c) $\rightarrow$ List a $\rightarrow$ c
foldL n f Nil = n foldL n f Nil = n
foldL n f (Cons x xs) = f x (foldL n f xs) foldL n f (Cons x xs) = f x (foldL n f xs)
\end{lstlisting} \end{lstlisting}
Hierbei entspricht der Typparameter $c$ einem Ergebnistyp und die beiden Argumente $n$ und $f$ den Konstruktoren $Nil$ und $Cons$, wobei die Typen der Argumente jeweils Operationen Hierbei entspricht der Typparameter $c$ einem Ergebnistyp und die beiden Argumente $n$ und $f$ den Konstruktoren $Nil$ und $Cons$, wobei die Typen der Argumente jeweils Operationen
auf dem Ergebnistyp $c$ beschreiben, mit dem eine Liste $\mathbf{List}\;a$ in einen einzelnen Wert vom Typ $c$ „zusammengefaltet“ werden kann. auf dem Ergebnistyp $c$ beschreiben, mit dem eine Liste $\mathbf{List}\;a$ in einen einzelnen Wert vom Typ $c$ „zusammengefaltet“ werden kann.
\\\;\\ \vfill
Primitiv rekursive Funktionen auf $\mathbf{List}\;a$ können durch geeignete Instantiierung des Typparameters $c$ und der Argumente $n$ und $f$ alternativ Primitiv rekursive Funktionen auf $\mathbf{List}\;a$ können durch geeignete Instantiierung des Typparameters $c$ und der Argumente $n$ und $f$ alternativ
mittels \texttt{foldL} ausgedrückt werden. Drücken Sie die Funktionen \texttt{length} und \texttt{size} jeweils als Folds über Listen und Bäumen aus. mittels \texttt{foldL} ausgedrückt werden. Drücken Sie die Funktionen \texttt{length} und \texttt{size} jeweils als Folds über Listen und Bäumen aus.
\end{frame} \end{frame}