394 lines
No EOL
14 KiB
TeX
Executable file
394 lines
No EOL
14 KiB
TeX
Executable file
% ..............................................................................
|
|
% 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 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} |