% .............................................................................. % 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{mathpartir} \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 06 - der (ungetypte) $\lambda$-Kalkül II}{Übung 06 - der (ungetypte) Lambda-Kalkül II}} \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=true, 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 } % 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} } \AtBeginSection{} \lstset{ morekeywords={if, then, else} } % Introduction \section{Church-Numerale} \begin{frame}[t, fragile]{Church-Numerale} Wir betrachten erneut die Church-Kodierung natürlicher Zahlen vom vorigen Übungsblatt: $$\ceil{n} := \lambda f\,a.\,\underbrace{f(f(f(\ldots f}_{n}\,a)))$$ mit einheitlicher Kodierung \noindent \begin{minipage}{.45\textwidth} \begin{lstlisting} zero = $\lambda$ f a. a succ n = $\lambda$ f a. f (n f a) \end{lstlisting} \end{minipage} \begin{minipage}{.45\textwidth} \begin{lstlisting} one = succ zero two = succ one three = succ two four = succ three \end{lstlisting} \end{minipage} sowie den Operationen \texttt{add} und \texttt{mult} mit der entsprechenden Semantik. \\\;\\ \textbf{Notation: } Von nun an schreiben wir \texttt{s + t} und \texttt{s * t} anstelle von \texttt{add s t} und \texttt{mult s t} und verwenden die $\beta\delta$-Regeln \[ \ceil{n} + \ceil{m} \betadeltared \ceil{n + m} \qquad\qquad\qquad \ceil{n} * \ceil{m} \betadeltared \ceil{n \cdot m} \] \end{frame} \section{Aufgabe 1 - Church-Kodierung von Booleans} \begin{frame}[t]{Aufgabe 1.1}{Church-Kodierung von Booleans} Boolesche Wahrheitswerte werden als $\lambda$-Terme wie folgt definiert: \begin{alignat*}{2} &true &&= \lambda x\,y.\,x\\ &false &&= \lambda x\,y.\,y\\ &ite &&= \lambda b\,x\,y.\,b\,x\,y \end{alignat*} \,\\ Zeigen Sie, das für alle $\lambda$-Terme $s$ und $t$ gilt: \centering $$ite\,true\,s\,t \betadeltared s\quad\quad\quad\quad\quad\quad ite\,false\,s\,t \betadeltared t$$ \end{frame} \begin{frame}[t]{Aufgabe 1.2}{Church-Kodierung von Booleans} Boolesche Wahrheitswerte werden als $\lambda$-Terme wie folgt definiert: \begin{alignat*}{2} &true &&= \lambda x\,y.\,x\\ &false &&= \lambda x\,y.\,y\\ &ite &&= \lambda b\,x\,y.\,b\,x\,y \end{alignat*} \,\\ Vervollständigen Sie die folgenden Funktionsdefinitionen so, dass sie (unter normaler Reduktion) boolesche Negation, exklusives Oder und Implikation berechnen: \begin{alignat*}{2} ¬\,b &&= \ldots\\ &xor\,b1\,b2 &&= \ldots\\ &imp\,b1\,b2 &&= \ldots \end{alignat*} \,\\ \textbf{Notation: } Von nun an schreiben wir „\textbf{if} $s$ \textbf{then} $t$ \textbf{else} $u$“ anstelle von „$ite\; s\; t\; u$“ \end{frame} \section{Aufgabe 2 - Rekursive Definitionen} \begin{frame}[t]{Aufgabe 2}{Rekursive Definitionen} In den meisten funktionalen Programmiersprachen sind \textit{rekursive} Funktionsdefinitionen zulässig, das heißt, die definierte Funktion darf auf der rechten Seite einer solchen Funktionsdefinition vorkommen. Rekursive Funktionsdefinitionen entsprechen - wie in Übung 2, Blatt 5 - $\delta$-Reduktionen. \\\,\\ \textbf{Hinweis.}\quad Nehmen Sie an, dass die Subtraktion von natürlichen Zahlen (in Form von Church-Numeralen) im $\lambda$-Kalkül darstellbar ist, d.h. für $n \geq 1$ gilt $\ceil{n} - \ceil{1} \betadeltared \ceil{n - 1}$, und dass ebenso die üblichen Vergleichsoperationen möglich sind, d.h. $\ceil{n} \leq \ceil{1} \leftrightarrow_{\beta\delta}^* true$, wenn $n \leq 1$ usw. Siehe dazu Aufgabe 4. \end{frame} \newcommand{\hintone}{ \begin{block}{Hinweis} \centering $\ceil{n} - \ceil{1} \betadeltared \ceil{n - 1}$ für $n \geq 1$ \[ \ceil{n} \leq \ceil{m} \leftrightarrow_{\beta\delta}^* \begin{cases} true & \text{falls } n \leq m\\ false & \text{sonst} \end{cases} \] \[ \ceil{n} == \ceil{m} \leftrightarrow_{\beta\delta}^* \begin{cases} true & \text{falls } n = m\\ false & \text{sonst} \end{cases} \] \end{block} } \begin{frame}[t, fragile]{Aufgabe 2.1}{Rekursive Definitionen} Wir betrachten die folgende rekursive Funktion: \begin{lstlisting} fact n = if n $\leq$ $\ceil{1}$ then $\ceil{1}$ else n * (fact (n - $\ceil{1}$)) \end{lstlisting} \,\\ Zeigen Sie, dass $fact \ceil{3} \betadeltared \ceil{6}$. \\\vfill \hintone \end{frame} \begin{frame}[t, fragile]{Aufgabe 2.2}{Rekursive Definitionen} Schreiben Sie eine rekursive Funktion $odd$, sodass: \[ odd\,\ceil{n} = \begin{cases} true & \text{falls } n \text{ gerade}\\ false & \text{sonst} \end{cases} \] \hintone \end{frame} \begin{frame}[t, fragile]{Aufgabe 2.3}{Rekursive Definitionen} Schreiben Sie eine rekursive Funktion $halve$, sodass: \begin{lstlisting}[] ($\ceil{2}$ * halve $\ceil{n}$) + (if odd $\ceil{n}$ then $\ceil{1}$ else $\ceil{0}$) $\betadeltared$ $\ceil{n}$ \end{lstlisting} \hintone \end{frame} \newcommand{\reductionstrats}{ \noindent\centering \begin{minipage}{.48\textwidth} \begin{block}{Applikative Reduktion $\rightarrow_a$} \begin{itemize} \item $(\lambda x.t)\,s \rightarrow_a t[s/x]$, wenn $t$ und $s$ normal \item $\lambda x.t \rightarrow_a \lambda x.t'$, wenn $t \rightarrow_a t'$ \item $t\,s \rightarrow_a t'\,s$, wenn $t \rightarrow_a t'$\\\,\\ \item $t\,s \rightarrow_a t\,s'$, wenn $s \rightarrow_a s'$ und $t$ normal\\\,\\ \end{itemize} \end{block} \end{minipage} \begin{minipage}{.48\textwidth} \begin{block}{Normale Reduktion $\rightarrow_n$} \begin{itemize} \item $(\lambda x.t)\,s \rightarrow_n t[s/x]$ \item $\lambda x.t \rightarrow_n \lambda x.t'$, wenn $t \rightarrow_n t'$ \item $t\,s \rightarrow_n t'\,s$, wenn $t \rightarrow_n t'$ und $t$ keine $\lambda$-Abstraktion \item $t\,s \rightarrow_n t\,s'$, wenn $s \rightarrow_n s'$ und $t$ normal und keine $\lambda$-Abstraktion \end{itemize} \end{block} \end{minipage} } \section{Aufgabe 3 - Auswertungsstrategien} \begin{frame}[t]{Aufgabe 3}{Auswertungsstrategien} In der Vorlesung haben Sie verschiedene Reduktionsstrategien für den ungetypten $\lambda$-Kalkül kennengelernt. Diese unterscheiden sich hauptsächlich in den Zeitpunkten, zu denen $\beta$-Redexe \textit{kontrahiert} werden, also wann in einem Term die $\beta$-Regel angewandt wird. \vfill \reductionstrats \end{frame} \begin{frame}[t]{Aufgabe 3.1}{Auswertungsstrategien} Welcher Redex im $\lambda$-Term \begin{enumerate} \item[(a)] $(\lambda x.\lambda y.\,y\,(\lambda z.\,x))\,(u\, u)\,(\lambda v.\,v\,((\lambda w.\,w)\,(\lambda w.\,w)))$ \item[(b)] $(\lambda u.\,u\,(\lambda y.\,z))\,(\lambda x.\,x\,((\lambda v.\,v)\,w))$ \end{enumerate} muss nicht kontrahiert werden, um die Normalform zu erreichen? Reduzieren Sie den Term durch $\beta\delta$-Reduktion zur Normalform, ohne diesen Redex zu kontrahieren. \vfill \reductionstrats \end{frame} \begin{frame}[t]{Aufgabe 3.2}{Auswertungsstrategien} Wir schreiben wie aus der Vorlesung bekannt $I = (\lambda x.\,x)$ und $\Omega = (\lambda x.\,x\,x)$. Reduzieren Sie den Term $\lambda f.\,f\,I\,(\Omega\,\Omega)(\lambda x\,y.\,x\,x)$ mittels \begin{enumerate} \item[(a)] applikativer Reduktion, \item[(b)] normaler Reduktion. \end{enumerate} Unterstreichen Sie in jedem Schritt den zu reduzierenden Redex. Betrachten Sie in dieser Aufgabe $\delta$-Reduktion als explizite Schritte! \vfill \reductionstrats \end{frame} \begin{frame}[t, fragile]{Aufgabe 3.3 a)}{Auswertungsstrategien} Man erinnere sich an folgende auf Church-Kodierungen definierten Funktionen: \lstset{ morecomment=[f][\color{greencomments}][0]{--} } \begin{minipage}{.2\textwidth} \begin{lstlisting} -- Allgemein twice = $\lambda$f x. f (f x) \end{lstlisting} \end{minipage} \begin{minipage}{.25\textwidth} \begin{lstlisting} -- Church-Booleans true = $\lambda$ x y. x false = $\lambda$ x y. y \end{lstlisting} \end{minipage} \begin{minipage}{.45\textwidth} \begin{lstlisting} -- Church-Paare pair = $\lambda$ a b select. select a b fst = $\lambda$ p. p ($\lambda$ x y. x) snd = $\lambda$ p. p ($\lambda$ x y. y) \end{lstlisting} \end{minipage} Geben Sie die ersten fünf $\beta\delta$-Reduktionsschritte des Terms \begin{lstlisting} twice fst (pair (pair true false) true) \end{lstlisting} unter \textbf{a) normaler} und b) applikativer Reduktion an. Markieren Sie (durch Unterstreichen) in jedem Schritt den zu reduzierenden Redex. \begin{block}{Normale Reduktion $\rightarrow_n$} \begin{itemize} \item $(\lambda x.t)\,s \rightarrow_n t[s/x]$ \item $\lambda x.t \rightarrow_n \lambda x.t'$, wenn $t \rightarrow_n t'$ \item $t\,s \rightarrow_n t'\,s$, wenn $t \rightarrow_n t'$ und $t$ keine $\lambda$-Abstraktion \item $t\,s \rightarrow_n t\,s'$, wenn $s \rightarrow_n s'$ und $t$ normal und keine $\lambda$-Abstraktion \end{itemize} \end{block} \end{frame} \begin{frame}[t, fragile]{Aufgabe 3.3 b)}{Auswertungsstrategien} Man erinnere sich an folgende auf Church-Kodierungen definierten Funktionen: \lstset{ morecomment=[f][\color{greencomments}][0]{--} } \begin{minipage}{.2\textwidth} \begin{lstlisting} -- Allgemein twice = $\lambda$f x. f (f x) \end{lstlisting} \end{minipage} \begin{minipage}{.25\textwidth} \begin{lstlisting} -- Church-Booleans true = $\lambda$ x y. x false = $\lambda$ x y. y \end{lstlisting} \end{minipage} \begin{minipage}{.45\textwidth} \begin{lstlisting} -- Church-Paare pair = $\lambda$ a b select. select a b fst = $\lambda$ p. p ($\lambda$ x y. x) snd = $\lambda$ p. p ($\lambda$ x y. y) \end{lstlisting} \end{minipage} Geben Sie die ersten fünf $\beta\delta$-Reduktionsschritte des Terms \begin{lstlisting} twice fst (pair (pair true false) true) \end{lstlisting} unter a) normaler und \textbf{b) applikativer} Reduktion an. Markieren Sie (durch Unterstreichen) in jedem Schritt den zu reduzierenden Redex. \begin{block}{Applikative Reduktion $\rightarrow_a$} \begin{itemize} \item $(\lambda x.t)\,s \rightarrow_a t[s/x]$, wenn $t$ und $s$ normal \item $\lambda x.t \rightarrow_a \lambda x.t'$, wenn $t \rightarrow_a t'$ \item $t\,s \rightarrow_a t'\,s$, wenn $t \rightarrow_a t'$ \item $t\,s \rightarrow_a t\,s'$, wenn $s \rightarrow_a s'$ und $t$ normal \end{itemize} \end{block} \end{frame} % input exmple sections %\input{sections/01_Intro_Landscape} \end{document}