% .............................................................................. % 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 05 - der (ungetypte) $\lambda$-Kalkül}{Übung 05 - der (ungetypte) 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 % ------------------------------------------------ % ================================================ % 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} } \AtBeginSection{} % Introduction \section{Der (ungetypte) Lambda-Kalkül} \subsection{Terme und Konventionen} \begin{frame}[t]{Der (ungetypte) $\lambda$-Kalkül}{Terme und Konventionen} \begin{block}{$\lambda$-Terme} $$t ::= x\;\vert\;t_1t_2\;\vert\;\lambda x.t \quad\quad (x \in V)$$ \end{block} \pause \begin{block}{Konventionen} \begin{itemize} \item Applikation ist \textit{links-assoziativ}: \quad $x\;y\;z = (x\;y)\;z$ \item Abstraktion reicht so weit wie möglich (Vgl. Quantoren in GLoIn) \item Aufeinanderfolgende Abstraktionen werden zusammengefasst: \quad $\lambda x. \lambda y. \lambda z. y\; x = \lambda x\;y\;z.y\;x$ \end{itemize} \end{block} \end{frame} \subsection{Freie Variablen und Substitution} \begin{frame}[t]{Der (ungetypte) $\lambda$-Kalkül}{Freie Variablen und Substitution} \begin{block}{Freie Variablen} Sei $t$ ein $\lambda$-Term, $FV(t)$ ist dann definiert durch: \begin{alignat*}{2} &FV(x) &&= \{x\} \quad (\text{für } x \in V)\\ &FV(t\;s) &&= FV(t) \cup FV(s)\\ &FV(\lambda x.t) &&= FV(t) \setminus \{x\} \end{alignat*} \end{block} \pause \begin{block}{Substitution} Eine Substitution ist eine Abbildung $\sigma : V_0 \rightarrow T(V)$, wobei $V_0 \subseteq V$ (\textit{endliche} Teilmenge). Die Anwendung einer Substitution auf $\lambda$-Terme ist ebenfalls rekursiv definiert: \begin{alignat*}{2} &x\sigma &&= \sigma (x)\\ &(t\;s)\sigma &&= (t\sigma)\;(s\sigma)\\ &(\lambda x.t)\sigma &&= \lambda y.(t\sigma') \end{alignat*} \centering mit $y$ frisch, also $y \not\in FV(\sigma(z))$ für alle $z \in FV(\lambda x.t)$ und $\sigma' = \sigma [x \mapsto y]$ \end{block} \end{frame} \subsection{Alpha-Äquivalenz und Beta-Reduktion} \begin{frame}[t]{Der (ungetypte) $\lambda$-Kalkül}{$\alpha$-Äquivalenz und $\beta$-Reduktion} \definitionAlphaEq \pause \definitionBetaReduction \end{frame} \section{Aufgabe 1 - Alpha-Äquivalenz und Beta-Reduktion} \begin{frame}[t]{Aufgabe 1.1}{$\alpha$-Äquivalenz und $\beta$-Reduktion} Entscheiden Sie für jedes der folgenden Paare von $\lambda$-Termen, ob die Terme jeweils $\alpha$-Äquivalent zueinander sind: \begin{itemize} \item[(a)] $\lambda x\;y.x\;y \isaeq \lambda u\;v.u\;v$ \item[(b)] $\lambda x\;y.x\;y \isaeq \lambda u\;v.v\;u$ \item[(c)] $(\lambda x.x\;x)(\lambda y.y\;y) \isaeq (\lambda x.x\;x)(\lambda x.x\;x)$ \end{itemize} \vfill \definitionAlphaEq \end{frame} \begin{frame}[t]{Aufgabe 1.2}{$\alpha$-Äquivalenz und $\beta$-Reduktion} Entscheiden Sie in jedem der folgenden Fälle, ob der jeweilige Reduktionsschritt eine zulässige $\beta$-Reduktion darstellt: \begin{itemize} \item[(a)] $(\lambda x\;y\;z.x\;y\;z)(\lambda y.y\;y) \isbr \lambda y\;z.(\lambda y.y\;y)\;y\;z$ \item[(b)] $(\lambda x\;y\;z.x\;y\;z)(y\;y) \isbr \lambda y\;z.(y\;y)\;y\;z$ \item[(c)] $(\lambda x\;y\;z.x\;y\;z)(y\;y) \isbr \lambda y\;z.(u\;u)\;y\;z$ \item[(d)] $(\lambda x\;y\;z.x\;y\;((\lambda u.u\;x) (y\;y)))\;u\;v \isbr (\lambda x\;y\;z.x\;y\;((y\;y)\;x))\;u\;v$ \end{itemize} \vfill \definitionBetaReduction \end{frame} \section{Aufgabe 2 - \foreignlanguage{english}{We Are Not Anonymous (Functions)}} \begin{frame}[t]{Aufgabe 2}{\foreignlanguage{english}{We Are Not Anonymous (Functions)}} Funktionale Programmiersprachen wie zum Beispiel Haskell oder ML erweitern den $\lambda$-Kalkül um verschiedene Konstrukte. Insbesondere werden \textit{Definitionen} verwendet, um Funktionen zu benennen. Beispielsweise können wir die folgenden drei Gleichungen angeben: \begin{center} $flip = \lambda f\;x\;y.f\;y\;x$ \quad\quad $const = \lambda x\;y.x$ \quad\quad $twice = \lambda f\;x.f\;(f\;x)$ \end{center} und sie als - von links nach rechts zu lesende - Reduktionsregeln betrachten, die bei der Auswertung eines $\lambda$-Terms angewendet werden können. Um sie von $\beta$-Reduktionen zu unterscheiden, werden solche Reduktionen als $\delta$-Reduktionen bezeichnet. Beispielsweise ist mit den obigen Definitionen die folgende Reduktion möglich: $$(\lambda f.f\;u)\; const \rightarrow_\beta const\;u \rightarrow_\delta (\lambda x\;y.x)\;u \rightarrow_\beta \lambda y.u$$ \textbf{Hinweis:}\quad Eine derartige Reduktion, bei der sowohl $\beta$- als auch $\delta$-Schritte vorkommen können, bezeichnen wir ab sofort als $\beta\delta$-Reduktion. \end{frame} \begin{frame}[t]{Aufgabe 2.1}{\foreignlanguage{english}{We Are Not Anonymous (Functions)}} Ermitteln Sie die $\beta\delta$-Normalformen der folgenden Terme: \begin{itemize} \item[(a)] $flip\;const\;twice$ \item[(b)] $twice\;flip$ \end{itemize} \vfill \definitionBetaReduction \begin{block}{$\delta$-Reduktion} \begin{align*} &flip = \lambda f\;x\;y.f\;y\;x\\ &const = \lambda x\;y.x\\ &twice = \lambda f\;x.f\;(f\;x) \end{align*} Beispiel: $(\lambda f.f\;u)\; const \rightarrow_\beta const\;u \rightarrow_\delta (\lambda x\;y.x)\;u \rightarrow_\beta \lambda y.u$ \end{block} \end{frame} \begin{frame}[t]{Aufgabe 2.2}{\foreignlanguage{english}{We Are Not Anonymous (Functions)}} Tatsächlich ist es in den angegebenen Programmiersprachen praktischerweise auch möglich, Funktionsargumente auf der linken Seite einer Funktionsdefinition anzugeben. Die obigen Definitionen würden dann beispielsweise wie folgt geschrieben werden: \begin{alignat*}{2} &flip\;f &&= \lambda x\;y. f\;y\;x\\ &const\;x\;y &&= x\\ &twice\;f\;x &&= f\;(f\;x) \end{alignat*} Die mit diesen Definitionen verbundenen Reduktionsregeln sind nun nicht mehr offensichtlich; deshalb verwenden wir Großbuchstaben $F, X, Y$, um Variablen, die in einem Term vorkommen, von Variablen, die durch eine Abstraktion gebunden werden können, zu unterscheiden. Außerdem verwenden wir zur Verdeutlichung explizite Klammerung: \begin{alignat*}{2} &flip\;F &&\rightarrow_\delta (\lambda x\;y.f\;y\;x)[F/x]\\ &(const\;X)\;Y &&\rightarrow_\delta x[X/x, Y/y]\\ &(twice\;F)\;X &&\rightarrow_\delta (f\;(f\;x))[X/x, F/f] \end{alignat*} \end{frame} \begin{frame}[t]{Aufgabe 2.2}{\foreignlanguage{english}{We Are Not Anonymous (Functions)}} Entscheiden Sie, welche der folgenden $\lambda$-Terme bezüglich dieser neuen Definitionen $\beta\delta$-Normalformen sind: \begin{itemize} \item[(a)] $\lambda x.flip\;x$ \item[(b)] $\lambda x.const\;x$ \item[(c)] $const\;flip\;twice$ \end{itemize} \vfill \begin{block}{Neue $\delta$-Reduktion} \begin{alignat*}{2} &flip\;F &&\rightarrow_\delta (\lambda x\;y.f\;y\;x)[F/x]\\ &(const\;X)\;Y &&\rightarrow_\delta x[X/x, Y/y]\\ &(twice\;F)\;X &&\rightarrow_\delta (f\;(f\;x))[X/x, F/f] \end{alignat*} \end{block} \end{frame} \begin{frame}[t]{Aufgabe 3}{Church-Numerale} Funktionale Sprachen fügen weiterhin \textit{eingebaute} Typen (\foreignlanguage{english}{\textit{built-in types}}) zum $\lambda$-Kalkül hinzu und erlauben auch die Definition von benutzerdefinierten Typen (\textit{\texten{user-defined types}}). Diese Typen können jedoch prinzipiell allesamt unter Einsatz der sogenannten \textit{Church-Kodierung} direkt als $\lambda$-Terme kodiert werden. \\\;\\ Eine natürliche Zahl $n$ wird durch einen $\lambda$-Term $\ceil{n}$ kodiert, der eine gegebene Funktion $f$ wiederholt $n$-mal auf einen Startwert $a$ anwendet, was wir informell als $n$ „Iterationen“ von $f$ startend bei $a$ ansehen können: \begin{equation*}\ceil{n} := \lambda f\;a.\underbrace{f(f(f(\ldots f}_n\; a)))\tag{1}\end{equation*} Wir kodieren dies einheitlich wie folgt: \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{frame} \section{Aufgabe 3 - Church-Numerale} \begin{frame}[t]{Aufgabe 3.1}{Church-Numerale} Zeigen Sie, dass für jede natürliche Zahl $n$ gilt: $succ\; \ceil{n} \betadeltared \ceil{n + 1}$ \vfill \churchnumerals \end{frame} \begin{frame}[t]{Aufgabe 3.2}{Church-Numerale} Definieren Sie die Addition und Multiplikation natürlicher Zahlen bezüglich dieser Kodierung. Vervollständigen Sie also die folgenden Definitionen: $$add \;n \;m = \ldots \quad\quad\quad\quad\quad mult\; n\; m = \ldots$$ derart, dass für alle $x$ und $y$ gilt: $$add\;\ceil{x}\;\ceil{y} \betadeltared \ceil{x + y}\quad\quad\quad\quad\quad mult\;\ceil{x}\;\ceil{y} \betadeltared \ceil{x \cdot y}$$ \vfill \churchnumerals \end{frame} % input exmple sections %\input{sections/01_Intro_Landscape} \end{document}