% .............................................................................. % Demo of the fau-beamer template. % % Copyright 2022 by Tim Roith % % 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 07 - 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}% %} \usepackage[useregional]{datetime2} \date{\DTMdisplaydate{2023}{6}{12}{-1}} % ================================================ % 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}