% ..............................................................................
% Demo of the fau-beamer template.
%
% Copyright 2022 by Tim Roith <tim.roith@fau.de>
%
% This program can be redistributed and/or modified under the terms
% of the GNU Public License, version 2.
%
% ------------------------------------------------------------------------------
\documentclass[final]{beamer}

% ========================================================================================
% Theme: inner, outer, font and colors
% ----------------------------------------------------------------------------------------
\usepackage[institute=Tech,
			%SecondLogo = template-art/FAUWortmarkeBlau.pdf,
			%ThirdLogo = template-art/FAUWortmarkeBlau.pdf,
			%WordMark=None,
			aspectratio=169,
			fontsize=11,
			fontbaselineskip=13,
			scale=1.
		   ]{styles/beamerthemefau}
% ----------------------------------------------------------------------------------------
% Input and output encoding
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
% ----------------------------------------------------------------------------------------
% Language settings
\usepackage[german]{babel}

% ========================================================================================
% Fonts
% - Helvet is loaded by styles/beamerfonts
% - We use serif for math environements
% - isomath is used for upGreek letters
% ----------------------------------------------------------------------------------------
\usepackage{isomath}
%\usefonttheme[onlymath]{serif}
\usepackage{exscale}
\usepackage{anyfontsize}
\setbeamercolor{alerted text}{fg=BaseColor}
% ----------------------------------------------------------------------------------------
% custom commands for symbols
\usepackage{styles/symbols}
\usepackage{tikz-cd}
\usetikzlibrary{cd, babel}

% ========================================================================================
% Setup for Titlepage
% ----------------------------------------------------------------------------------------
\title[fau-beamer]{Theorie der Programmierung}
\subtitle{\texorpdfstring{Übung 07 - Der einfach getypte $\lambda$-Kalkül}{Übung 05 - Der einfach getypte Lambda-Kalkül}}
\author[L. Vatthauer]{
Leon Vatthauer}
%

% Instead of \institute you can also use the \thanks command
% ------------------------------------------------
%\author[T. Roith]{
%Tim Roith\thanks{Friedrich-Alexander Universität Erlangen-Nürnberg, Department Mathematik}\and%
%Second Author\thanks{Second Insitute}\and%
%Third Author\thanks{Third Insitute}%
%}

\date{\today}


% ================================================
% Bibliography
% ------------------------------------------------
\usepackage{csquotes}
\usepackage[style=alphabetic, %alternatively: numeric, numeric-comp, and other from biblatex
			defernumbers=true,
			useprefix=true,%
			giveninits=true,%
			hyperref=true,%
			autocite=inline,%
			maxcitenames=5,%
			maxbibnames=20,%
			uniquename=init,%
			sortcites=true,% sort citations when multiple entries are passed to one cite command
			doi=true,%
			isbn=false,%
			url=false,%
			eprint=false,%
			backend=biber%
		   ]{biblatex}
\addbibresource{bibliography.bib}
\setbeamertemplate{bibliography item}[text]
\babeltags{en=english}

% ================================================
% Hyperref and setup
% ------------------------------------------------
\usepackage{hyperref}
\hypersetup{
	colorlinks = true,
	final=true, 
	plainpages=false,
	pdfstartview=FitV,
	pdftoolbar=true,
	pdfmenubar=true,
	pdfencoding=auto,
	psdextra,
	bookmarksopen=true,
	bookmarksnumbered=true,
	breaklinks=true,
	linktocpage=true,
	urlcolor=BaseColor,
	citecolor=BaseColor,
	linkcolor=BaseColor,
	unicode = true
}

% ================================================
% Additional packages
% ------------------------------------------------
\usepackage{listings}     
\usepackage{lstautogobble}  % Fix relative indenting
\usepackage{color}          % Code coloring
\usepackage{zi4}            % Nice font

\definecolor{bluekeywords}{rgb}{0.13, 0.13, 1}
\definecolor{greencomments}{rgb}{0, 0.5, 0}
\definecolor{redstrings}{rgb}{0.9, 0, 0}
\definecolor{graynumbers}{rgb}{0.5, 0.5, 0.5}
\lstset{
    %autogobble,
    columns=fullflexible,
    showspaces=false,
    showtabs=false,
    breaklines=true,
    showstringspaces=false,
    breakatwhitespace=true,
    escapeinside={(*@}{@*)},
    commentstyle=\color{greencomments},
    keywordstyle=\color{bluekeywords},
    stringstyle=\color{redstrings},
    numberstyle=\color{graynumbers},
    basicstyle=\ttfamily\normalsize,
	mathescape=true,
    %frame=l,
    framesep=12pt,
    xleftmargin=.1\textwidth,%12pt,
    tabsize=4,
    captionpos=b
}
\usepackage{mathpartir}
\usepackage{enumerate}
% end of listings setup

% ================================================
% Various custom commands
% ------------------------------------------------
%\setbeameroption{show notes on second screen}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname pdfsuppresswarningpagegroup\endcsname\relax
\else
  \pdfsuppresswarningpagegroup=1\relax
\fi
% Change color for cite locally
\newcommand{\colorcite}[3]{{\hypersetup{citecolor=#1}{\cite[#2]{#3}}}} 
% ------------------------------------------------
% ================================================
% The main document
% ------------------------------------------------
\begin{document}
% Title page
\begin{frame}[t, titleimage]{-}
\titlepage%
\end{frame}

\newcommand{\isaeq}{=_\alpha^?}
\newcommand{\isbr}{\rightarrow_\beta^?}

\newcommand{\betared}{\rightarrow_\beta}
\newcommand{\alphaeq}{=_\alpha}
\newcommand{\deltared}{\rightarrow_\delta}
\newcommand{\etared}{\rightarrow_\eta}
\newcommand{\betadeltared}{\rightarrow_{\beta\delta}^*}

\newcommand{\ceil}[1]{\lceil {#1} \rceil}

\newcommand{\definitionAlphaEq}{
	\begin{block}{$\alpha$-Äquivalenz}
		Zwei Terme $t_1, t_2$ heißen $\alpha$-Äquivalent, wenn sie durch Umbenennung gebundener Variablen auseinander hervorgehen. Formal:
		$$\lambda x.t \alphaeq \lambda y.t[y / x]\quad\text{wenn } y \not\in FV(t)$$
	\end{block}
}

\newcommand{\definitionBetaReduction}{
	\begin{block}{$\beta$-Reduktion}
		Die $\beta$-Reduktion modelliert das Ausrechnen einer Funktionsanwendung, z.B: $(\lambda x.3 + x)\; 5 \betared 3 + 5$
		
		Die Einschrittreduktion $\betared$ ist:
		$$C((\lambda x.t)\;s) \rightarrow_\beta C(t[s / x])$$
	\end{block}
}
\newcommand{\churchnumerals}{
	\begin{block}{Church-Numerale}
		\begin{equation*}\ceil{n} := \lambda f\;a.\underbrace{f(f(f(\ldots f}_n\; a)))\tag{1}\end{equation*}
		\noindent
		\begin{minipage}{0.45\textwidth}
			\begin{align*}
				&zero = \lambda f\;a.a\\
				&succ\;n = \lambda f\;a.f\;(n\;f\;a)
			\end{align*}
		\end{minipage}
		\begin{minipage}{0.45\textwidth}
			\begin{alignat*}{2}
				&one &&= succ\;zero\\
				&two &&= succ\;one\\
				&three &&= succ\;two\\
				&four &&= succ\;three
			\end{alignat*}
		\end{minipage}
	\end{block}
}

\newcommand{\typing}{
	\begin{block}{Typisierung}
		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}
}
\newcommand{\inversionlemma}{
	\begin{block}{Inversionslemma}
		\begin{enumerate}
			\item Wenn $\Gamma \vdash x : \alpha$, dann $x : \alpha \in \Gamma$
			\item Wenn $\Gamma \vdash t\;s : \beta$, dann existiert $\alpha$ mit $\Gamma \vdash t : \alpha \rightarrow \beta$ und $\Gamma \vdash s : \alpha$
			\item Wenn $\Gamma \vdash \lambda x.t : \gamma$, dann hat $\gamma$ die Form $\gamma = \alpha \rightarrow \beta$ und $\Gamma[x \mapsto \alpha] \vdash t : \beta$
		\end{enumerate}
	\end{block}
}

\newcommand{\algorithmw}{
	\begin{block}{Algorithmus W nach Hindley/Milner}
		Wir definieren rekursiv eine Menge $PT(\Gamma;t;\alpha)$ von Typgleichungen, so dass der mgu $\sigma = \mathbf{mgu}(PT(\Gamma;t;\alpha))$ die allgemeinste Lösung von $\Gamma \vdash t : \alpha$ liefert (wenn eine Lösung existiert).
		\begin{enumerate}
			\item $PT(\Gamma;\;x;\;\alpha) = \{\alpha \unif \beta \;\vert\; x : \beta \in \Gamma\}$
			\item $PT(\Gamma;\;\lambda x.t;\; \alpha) = PT ((\Gamma[x \mapsto a]);\;t;\;b) \cup \{a \rightarrow b \unif \alpha\}$, mit $a, b$ frisch
			\item $PT(\Gamma;\;t\;s;\;\alpha) = PT(\Gamma;\;t;\;a \rightarrow \alpha) \cup PT(\Gamma;\;s;\;a)$, mit $a$ frisch
		\end{enumerate}
	\end{block}
}

\newcommand{\unif}{\overset{.}{=}}

\AtBeginSection{}

% Introduction
\section{Der einfach getypte Lambda-Kalkül}
\begin{frame}[t, fragile]{Der einfach getypte $\lambda$-Kalkül $(\lambda\rightarrow)$}{Definitionen}
	\begin{block}{Typen}
		Sei $\mathbf{V}$ eine Menge von \textit{Typvariablen} $a,b, $ etc. und $\mathbf{B}$ eine Menge von Basistypen, etwa $\mathbf{Bool, Int}$. Die Grammatik für Typen $\alpha, \beta, \ldots$ ist dann
		$$\alpha, \beta ::= a\;\vert\;\mathbf{b}\;\vert\;\alpha\rightarrow\beta \qquad (\mathbf{b}\in \mathbf{B}, a \in \mathbf{V})$$
	\end{block}
	\begin{block}{Notation}
		Im Gegensatz zur Applikation von $\lambda$-Termen, welche links-assoziativ ist (also $add\;5\;3 = (add\;5)\;3$),
		ist der Funktionspfeil rechts-assoziativ, also $\alpha \rightarrow \beta \rightarrow \gamma = \alpha \rightarrow (\beta \rightarrow \gamma)$
	\end{block}
	\begin{block}{Kontext}
		Ein \textit{(Typ-)Kontext} ist eine Menge
		$$\Gamma = \{x_1 : \alpha_1;\ldots ; x_n : \alpha_n\}$$
	\end{block}
\end{frame}
\begin{frame}[t, fragile]{Der einfach getypte $\lambda$-Kalkül $(\lambda\rightarrow)$}{Definitionen}
	\typing
	\inversionlemma
\end{frame}

\section{Aufgabe 1 - Typprüfung einfach getypter Terme}

\begin{frame}[t, fragile]{Aufgabe 1}{Typprüfung einfach getypter Terme}
	Zeigen Sie, dass die folgenden Aussagen zutreffen, indem Sie jeweils eine korrekte Typherleitung angeben.
	\begin{enumerate}
		\item $ x : \texttt{int}, add : \texttt{int} \rightarrow \texttt{int} \rightarrow \texttt{int} \vdash \lambda y.add\;x\;(add\;x\;y) : \texttt{int} \rightarrow \texttt{int}$
		\item $\vdash \lambda xy.x : \alpha \rightarrow \beta \rightarrow \alpha$, für alle Typen $\alpha, \beta$
	\end{enumerate}

	\vfill
	\typing
\end{frame}

\section{Prinzipaltyp}

\begin{frame}[t, fragile]{Algorithmus W nach Hindley/Milner}
	\begin{block}{Prinzipaltyp}
		Es sei $t$ ein $\lambda$-Term und $\Gamma$ ein Kontext; wir sagen, dass $\alpha$ der \textit{Prinzipaltyp} (engl. \textit{principal type}) von $t$ ist, 
		wenn 
		\begin{enumerate}
			\item $\Gamma \vdash t : \alpha$
			\item $\alpha$ allgemeiner ist als jeder Typ $\beta$ mit $\Gamma \vdash t : \beta$
		\end{enumerate}
		d.h. wenn jedes solche $\beta$ sich durch Substitution von Typvariablen aus $\alpha$ erzeugen lässt. Beispielsweise ist $a \rightarrow b \rightarrow a$ (für Typvariablen $a$ und $b$) der Prinzipaltyp von $\lambda xy.x$.
	\end{block}

	\algorithmw

\end{frame}

\section{Aufgabe 2 - Inferenz von Prinzipaltypen}

\begin{frame}[t, fragile]{Aufgabe 2}{Inferenz von Prinzipaltypen}
	Leiten Sie den Prinzipaltyp der folgenden $\lambda$-Terme in dem jeweils gegebenen Kontext her
	\begin{enumerate}
		\item $\Gamma = \emptyset, t = \lambda x y z.x\;(y\;z)$
		\item $\Gamma = \{add : \texttt{int} \rightarrow \texttt{int} \rightarrow \texttt{int}, length : \texttt{string} \rightarrow \texttt{int}\}, t = \lambda x. add\;(length\; x)$
	\end{enumerate}

	\vfill
	\algorithmw
\end{frame}

\section{Aufgabe 3 - Type Inhabitation und untypisierbare Terme}
\begin{frame}[t, fragile]{Aufgabe 3.1}{Type Inhabitation und untypisierbare Terme}
	Das zur Typinferenz symmetrische Problem ist das Problem der \foreignlanguage{english}{\textit{type inhabitation}}, 
	d.h. das Problem, einen $\lambda$-Term eines gegebenen Typs zu finden, falls ein solcher Term existiert.
	\\Im Folgenden bezeichnen $p$, $q$ und $r$ Typvariablen.
	\\\;\\
	Finden Sie für jeden der folgenden Typen $\alpha$ einen $\lambda$-Term $s$, sodass $\vdash s : \alpha$.
	\begin{enumerate}[(a)]
		\item $p \rightarrow p$
		\item $p \rightarrow (q \rightarrow p)$
		\item $(p \rightarrow (q \rightarrow r)) \rightarrow (p \rightarrow q) \rightarrow p \rightarrow r$
		\item $((p \rightarrow q) \rightarrow r) \rightarrow q \rightarrow r$
	\end{enumerate}
\end{frame}
\begin{frame}[t, fragile]{Aufgabe 3.2}{Type Inhabitation und untypisierbare Terme}
	Im Gegenzug dazu gibt es auch Terme, denen man keinen Typ zuordnen kann. 
	Verwenden Sie das Inversionslemma aus der Vorlesung, um zu zeigen, dass:
	\begin{enumerate}[(a)]
		\item $\not\vdash \lambda x.x\;x : \alpha$, für jeden Typ $\alpha$.
		\item $y : \texttt{char} \not\vdash \lambda x.y\;x : \alpha$, für jeden Typ $\alpha$.
	\end{enumerate}
	\vfill
	\inversionlemma
\end{frame}
% input exmple sections
%\input{sections/01_Intro_Landscape}
\end{document}