Wir lesen $\Gamma\vdash t : \alpha$ als „im Kontext $\Gamma$ hat der Term $t$ den Typ $\alpha$“ und definieren diese Relation wie folgt:
\[
\begin{array}{c c}
\infer* [left=\text{(Ax)}, right=\text{($x : \alpha\in\Gamma$)}]{\;}{\Gamma\vdash x : \alpha}&\infer* [left=\text{($\rightarrow_i$)}] {\Gamma[x\mapsto \alpha]\vdash t : \beta}{\Gamma\vdash\lambda x.t : \alpha\rightarrow\beta}\\
\\
\multicolumn{2}{c}{
\infer* [left=\text{($\rightarrow_e$)}] {\Gamma\vdash t : \alpha\rightarrow\beta\\\Gamma\vdash s : \alpha}{\Gamma\vdash t\;s : \beta}
}
\end{array}
\]
\end{block}
}
\AtBeginSection{}
\section{System F}
\begin{frame}[t, fragile]{System F}
System F ist eine Erweiterung des einfach getypten $\lambda$-Kalküls um Polymorphie. Wir erweitern die Typgrammatik:
\[
\alpha, \beta ::= a\;\vert\;\alpha\rightarrow\beta\;\vert\;\forall a. \alpha\qquad (a \in\mathbf{V})
\]
Die Typisierungsregeln sind:
\[
\begin{array}{c c c}
\infer* [left=\text{(Ax)}, right=\text{($x : \alpha\in\Gamma$)}]{\;}{\Gamma\vdash x : \alpha}&\infer* [left=\text{($\rightarrow_i$)}] {\Gamma[x\mapsto \alpha]\vdash t : \beta}{\Gamma\vdash\lambda x.t : \alpha\rightarrow\beta}
&\infer* [left=($\forall_i$), right=$a \not\in FV(\Gamma)$] {\Gamma\vdash s : \alpha}{\Gamma\vdash s : \forall a. \alpha}
\\\\
\multicolumn{2}{c}{
\infer* [left=\text{($\rightarrow_e$)}] {\Gamma\vdash t : \alpha\rightarrow\beta\\\Gamma\vdash s : \alpha}{\Gamma\vdash t\;s : \beta}
}
&\infer* [left=($\forall_e$)] {\Gamma\vdash s : \forall a.\alpha}{\Gamma\vdash s : (\alpha [\beta / a])}
\end{array}
\]
\end{frame}
% Introduction
\section{Aufgabe 1 - Produkte in System F (a la Curry)}
\begin{frame}[t, fragile]{Aufgabe 1}{Produkte in System F (à la Curry)}
Wir kodieren das kartesische Produkt der Typen $a$ und $b$ in System F unter Verwendung des Typs $(a \times b) :=\forall r. (a \rightarrow b \rightarrow r)\rightarrow r$
\vfill
\begin{enumerate}
\item
Für diese Kodierung ist die ``Konstruktions-Funktion'' $pair$, welche aus zwei Elementen der Typen $a$ bzw. $b$ ein Paar des Typs $(a \times b)$ konstruiert, wie folgt definiert:
\[
pair = \lambda x\;y . (\lambda f.\;f\;x\;y)
\]
Zeigen Sie, dass $\vdash pair : \forall a\;b.\; a \rightarrow b \rightarrow(a \times b)$ in System F gilt.
\pause
\\\;\\
\item
Geben Sie zu jeder der folgenden Funktionssignaturen eine Implementierung der jeweiligen Funktion (d.h. einen $\lambda$-Term) an und zeigen Sie, dass Ihre Implementierung den benötigten Typ hat:
\begin{frame}[t, fragile]{Aufgabe 1}{Produkte in System F (à la Curry)}
Wir kodieren das kartesische Produkt der Typen $a$ und $b$ in System F unter Verwendung des Typs $(a \times b) :=\forall r. (a \rightarrow b \rightarrow r)\rightarrow r$
\vfill
\begin{enumerate}
\item[3.]
Schreiben Sie unter Verwendung der obigen Funktionen eine weitere Funktion
\[
swap : \forall a\;b. (a \times b) \rightarrow (b \times a)
\]
und zeigen Sie, dass sie den korrekten Typ hat. Finden Sie also einen $\lambda$-Term $s$, so dass
$\Gamma\vdash s : \forall a\;b. (a \times b)\rightarrow(b \times a)$, wobei
\begin{align*}
\Gamma := \{&pair : \forall a\;b. a \rightarrow b \rightarrow (a \times b),
\\&fst : \forall a\;b.\; (a \times b) \rightarrow a,
\\&snd : \forall a\;b.\;(a \times b) \rightarrow b \}
\end{align*}
\end{enumerate}
\end{frame}
\begin{frame}[t, fragile]{Aufgabe 2}{Listen in System F (à la Curry)}
Listen können in System F unter Verwendung des folgenden Typs kodiert werden:
\begin{lstlisting}[keywords=List]
List a := $\forall r.\; r\rightarrow(a \rightarrow r \rightarrow r)\rightarrow r$
\end{lstlisting}
In diesem Fall ergeben sich die folgenden ``Konstruktor-Funktionen'':
Für einen gegebenen (und durch \texttt{nil} und \texttt{cons} konstruierten) Term \texttt{t} des Typs \lstinline[keywords=List]|List a|
verhält sich der Term '\lstinline|t u ($\lambda$x l. s)|' also genau so wie eine Funktion \texttt{f} für die für alle x (des Typs a) und alle l (des Typs \lstinline[keywords=List]|List a|) gilt:
&\texttt{length (cons x l)}&&\rightarrow_{\beta\delta}^* \texttt{succ (length l)}
\end{alignat*}
Zeigen Sie, dass \lstinline|$\Gamma_0\vdash$ length : $\forall$ a. List a $\rightarrow$$\mathbb{N}$|, wobei $\Gamma_0 :=\{\texttt{zero} : \mathbb{N}, succ : \mathbb{N}\rightarrow\mathbb{N}\}$.