📚 The CoCalc Library - books, templates and other resources
License: OTHER
%!TEX root = Programmierparadigmen.tex1\chapter{$\lambda$-Kalkül}2Der $\lambda$-Kalkül (gesprochen: Lambda-Kalkül) ist eine formale Sprache.3In diesem Kalkül gibt es drei Arten von Termen $T$:45\begin{itemize}6\item Variablen: $x$7\item Applikationen: $(T S)$8\item Lambda-Abstraktion: $\lambda x. T$9\end{itemize}1011In der Lambda-Abstraktion nennt man den Teil vor dem Punkt die \textit{Parameter}12der $\lambda$-Funktion. Wenn etwas dannach kommt, auf die die Funktion angewendet13wird so heißt dieser Teil das \textit{Argument}:1415\[(\lambda \underbrace{x}_{\mathclap{\text{Parameter}}}. x^2) \overbrace{5}^{\mathclap{\text{Argument}}} = 5^2\]1617\begin{beispiel}[$\lambda$-Funktionen]18\begin{bspenum}19\item $\lambda x. x$ heißt Identität.20\item $(\lambda x. x^2)(\lambda y. y + 3) = \lambda y. (y+3)^2$21\item \label{bsp:lambda-3} $\begin{aligned}[t]22&(\lambda x.\Big (\lambda y.yx \Big ))~ab\\23\Rightarrow&(\lambda y.ya)b\\24\Rightarrow&ba25\end{aligned}$26\end{bspenum}2728In \cref{bsp:lambda-3} sieht man, dass $\lambda$-Funktionen die Argumente29von Links nach rechts einziehen.30\end{beispiel}3132Die Funktionsapplikation sei linksassoziativ. Es gilt also:3334\[a~b~c~d = ((a~b)~c)~d\]3536\begin{definition}[Gebundene Variable]\xindex{Variable!gebundene}%37Eine Variable heißt gebunden, wenn sie der Parameter einer $\lambda$-Funktion ist.38\end{definition}3940\begin{definition}[Freie Variable]\xindex{Variable!freie}%41Eine Variable heißt \textit{frei}, wenn sie nicht gebunden ist.42\end{definition}4344\begin{satz}45Der untypisierte $\lambda$-Kalkül ist Turing-Äquivalent.46\end{satz}4748\section{Reduktionen}\index{Reduktion|(}49\begin{definition}[Redex]\xindex{Redex}%50Eine $\lambda$-Term der Form $(\lambda x. t_1) t_2$ heißt Redex.51\end{definition}5253\begin{definition}[$\alpha$-Äquivalenz]\xindex{Reduktion!Alpha ($\alpha$)}\xindex{Äquivalenz!Alpha ($\alpha$)}%54Zwei Terme $T_1, T_2$ heißen $\alpha$-Äquivalent, wenn $T_1$ durch55konsistente Umbenennung in $T_2$ überführt werden kann.5657Man schreibt dann: $T_1 \overset{\alpha}{=} T_2$.58\end{definition}5960\begin{beispiel}[$\alpha$-Äquivalenz]61\begin{align*}62\lambda x.x &\overset{\alpha}{=} \lambda y. y\\63\lambda x. x x &\overset{\alpha}{=} \lambda y. y y\\64\lambda x. (\lambda y. z (\lambda x. z y) y) &\overset{\alpha}{=}65\lambda a. (\lambda x. z (\lambda c. z x) x)66\end{align*}67\end{beispiel}6869\begin{definition}[$\beta$-Äquivalenz]\xindex{Reduktion!Beta ($\beta$)}\xindex{Äquivalenz!Beta ($\beta$)}%70Eine $\beta$-Reduktion ist die Funktionsanwendung auf einen Redex:71\[(\lambda x. t_1)\ t_2 \Rightarrow t_1 [x \mapsto t_2]\]72\end{definition}7374\begin{beispiel}[$\beta$-Äquivalenz]75\begin{defenum}76\item $(\lambda x.\ x)\ y \overset{\beta}{\Rightarrow} x[x \mapsto y] = y$77\item $(\lambda x.\ x\ (\lambda x.\ x)) (y\ z) \overset{\beta}{\Rightarrow} (x\ (\lambda x.\ x))[x \mapsto y\ z] = (y\ z) (\lambda x.\ x)$78\end{defenum}79\end{beispiel}8081\begin{definition}[$\eta$-Äquivalenz\footnote{Folie 158}]\xindex{Reduktion!Eta ($\eta$)}\xindex{Äquivalenz!Eta ($\eta$)}%82Die Terme $\lambda x. f~x$ und $f$ heißen $\eta$-Äquivalent, wenn $x \notin FV(f)$ gilt.8384Man schreibt: $\lambda x. f~x \overset{\eta}{=} f$.85\end{definition}8687\begin{beispiel}[$\eta$-Äquivalenz\footnote{Folie 158}]%88\begin{align*}89\lambda x.\ \lambda y.\ f\ z\ x\ y &\overset{\eta}{=} \lambda x.\ f\ z\ x\\90f\ z &\overset{\eta}{=} \lambda x.\ f\ z\ x\\91\lambda x.\ x &\overset{\eta}{=} \lambda x.\ (\lambda x.\ x)\ x\\92\lambda x.\ f\ x\ x &\overset{\eta}{\neq} f\ x93\end{align*}94\end{beispiel}95\index{Reduktion|)}9697\section{Auswertungsstrategien}98\begin{definition}[Normalenreihenfolge]\xindex{Normalenreihenfolge}%99In der Normalenreihenfolge-Auswertungsstrategie wird der linkeste äußerste100Redex ausgewertet.101\end{definition}102103\begin{definition}[Call-By-Name]\xindex{Call-By-Name}%104In der Call-By-Name Auswertungsreihenfolge wird der linkeste äußerste Redex105reduziert, der nicht von einem $\lambda$ umgeben ist.106\end{definition}107108Die Call-By-Name Auswertung wird in Funktionen verwendet.109110Haskell verwendet die Call-By-Name Auswertungsreihenfolge zusammen mit \enquote{sharing}. Dies nennt man \textit{Lazy Evaluation}. Ein spezialfall der Lazy-Evaluation ist die sog. \textit{Kurzschlussauswertung}.\xindex{Kurzschlussauswertung}\xindex{Short-circuit evaluation}111Das bezeichnet die Lazy-Evaluation von booleschen Ausdrücken.112113\todo[inline]{Was ist sharing? Vermutlich so etwas wie in folgendem Beispiel:}114115\begin{beispiel}[Sharing]116In dem Ausdruck \texttt{(plus, (fac, 42), (fac, 42))} muss der Teilausdruck117\texttt{(fac, 42)} nicht zwei mal ausgewertet werden, wenn er Seiteneffektfrei118ist.119\end{beispiel}120121\begin{definition}[Call-By-Value]\xindex{Call-By-Value}%122In der Call-By-Value Auswertung wird der linkeste Redex reduziert, der123nicht von einem $\lambda$ umgeben ist und dessen Argument ein Wert ist.124\end{definition}125126Die Call-By-Value Auswertungsreihenfolge wird in C und Java verwendet.127Auch in Haskell werden arithmetische Ausdrücke in der Call-By-Name Auswertungsreihenfolge reduziert.128129\section{Church-Zahlen}\xindex{Church-Zahlen}130Im $\lambda$-Kalkül lässt sich jeder mathematische Ausdruck darstellen, also131insbesondere beispielsweise auch $\lambda x. x+3$. Aber \enquote{$3$} und132\enquote{$+$} ist hier noch nicht das $\lambda$-Kalkül.133134Zuerst müssen wir uns also Gedanken machen, wie man natürliche Zahlen $n \in \mdn$135darstellt. Dafür dürfen wir nur Variablen und $\lambda$ verwenden. Eine Möglichkeit136das zu machen sind die sog. \textit{Church-Zahlen}.137138Dabei ist die Idee, dass die Zahl angibt wie häufig eine Funktion $f$ auf eine139Variable $z$ angewendet wird. Also:140\begin{itemize}141\item $0 := \lambda f~z. z$142\item $1 := \lambda f~z. f z$143\item $2 := \lambda f~z. f (f z)$144\item $3 := \lambda f~z. f (f (f z))$145\end{itemize}146147Auch die gewohnten Operationen lassen sich so darstellen.148149\begin{beispiel}[Nachfolger-Operation]150\begin{align*}151\succ :&= \lambda n f z. f (n f z)\\152&= \lambda n. (\lambda f (\lambda z f (n f z)))153\end{align*}154Dabei ist $n$ die Zahl.155156Will man diese Funktion anwenden, sieht das wie folgt aus:157\begin{align*}158\succ 1&= (\lambda n f z. f(n f z)) 1\\159&= (\lambda n f z. f(n f z)) \underbrace{(\lambda f~z. f z)}_{n}\\160&= \lambda f z. f (\lambda f~z. f z) f z\\161&= \lambda f z. f (f z)\\162&= 2163\end{align*}164\end{beispiel}165166\begin{beispiel}[Vorgänger-Operation]\xindex{pred}\xindex{pair}\xindex{next}\xindex{fst}\xindex{snd}167\begin{align*}168\pair&:= \lambda a. \lambda b. \lambda f. f a b\\169\fst &:= \lambda p. p (\lambda a. \lambda b. a)\\170\snd &:= \lambda p. p (\lambda a. \lambda b. b)\\171\nxt &:= \lambda p. \pair (\snd p)~(\succ (\snd p))\\172\pred&:= \lambda n. \fst (n \nxt (\pair c_0 c_0))173\end{align*}174\end{beispiel}175\begin{beispiel}[Addition]176\begin{align*}177\text{plus} &:= \lambda m n f z. m f (n f z)178\end{align*}179Dabei ist $m$ der erste Summand und $n$ der zweite Summand.180\end{beispiel}181182\begin{beispiel}[Multiplikation]183\begin{align*}184\text{times} :&= \lambda m n f. m~s~(n~f~z)\\185&\overset{\eta}{=} \lambda m n f z. n (m s) z186\end{align*}187Dabei ist $m$ der erste Faktor und $n$ der zweite Faktor.188\end{beispiel}189190\begin{beispiel}[Potenz]191\begin{align*}192\text{exp} :&= \lambda b e. eb\\193&\overset{\eta}{=} \lambda b e f z. e b f z194\end{align*}195Dabei ist $b$ die Basis und $e$ der Exponent.196\end{beispiel}197198\section{Church-Booleans}199\begin{definition}[Church-Booleans]\xindex{Church-Booleans}%200\texttt{True} wird zu $c_{\text{true}} := \lambda t. \lambda f. t$.\\201\texttt{False} wird zu $c_{\text{false}} := \lambda t. \lambda f. f$.202\end{definition}203204Hiermit lässt sich beispielsweise die Funktion \texttt{is\_zero} definieren, die205\texttt{True} zurückgibt, wenn eine Zahl $0$ repräsentiert und sonst \texttt{False}206zurückgibt:207208\[ \text{\texttt{is\_zero}} = \lambda n.\ n\ (\lambda x.\ c_{\text{False}})\ c_{\text{True}}\]209210\section{Weiteres}211\begin{satz}[Satz von Curch-Rosser]212Wenn zwei unterschiedliche Terme $a$ und $b$ äquivalent sind, d.h. mit Reduktionsschritten beliebiger Richtung ineinander transformiert werden können, dann gibt es einen weiteren Term $c$, zu dem sowohl $a$ als auch $b$ reduziert werden können.213\end{satz}214215\section{Fixpunktkombinator}216\begin{definition}[Fixpunkt]\xindex{Fixpunkt}%217Sei $f: X \rightarrow Y$ eine Funktion mit $\emptyset \neq A = X \cap Y$ und218$a \in A$.219220$a$ heißt \textbf{Fixpunkt} der Funktion $f$, wenn $f(a) = a$ gilt.221\end{definition}222223\begin{beispiel}[Fixpunkt]224\begin{bspenum}225\item $f_1: \mdr \rightarrow \mdr; f(x) = x^2 \Rightarrow x_1 = 0$ ist226Fixpunkt von $f$, da $f(0) = 0$. $x_2 = 1$ ist der einzige weitere227Fixpunkt dieser Funktion.228\item $f_2: \mdn \rightarrow \mdn$ hat ganz $\mdn$ als Fixpunkte, also229insbesondere unendlich viele Fixpunkte.230\item $f_3: \mdr \rightarrow \mdr; f(x) = x+1$ hat keinen einzigen Fixpunkt.231\item $f_4: \mdr[X] \rightarrow \mdr[X]; f(p) = p^2$ hat $p_1(x) = 0$ und232$p_2(x)=1$ als Fixpunkte.233\end{bspenum}234\end{beispiel}235236\begin{definition}[Kombinator]\xindex{Kombinator}%237Ein Kombinator ist eine Abbildung ohne freie Variablen.238\end{definition}239240\begin{beispiel}[Kombinatoren\footnotemark]%241Folgende $\lambda$-Funktionen sind Beispiele für Kombinatoren:242\begin{bspenum}243\item $\lambda a.\ a$244\item $\lambda a.\ \lambda b.\ a$245\item $\lambda f.\ \lambda a.\ \lambda b. f\ b\ a$246\item $\lambda x.\ \lambda y.\ x$\\247Diese $\lambda$-Funktion hat nur die gebundene Variable $x$, also248ist es ein Kombinator.249\end{bspenum}250251Folgende $\lambda$-Funktionen sind keine Kombinatoren:252\begin{bspenum}253\item $\lambda x.\ y$254\item $x\ \lambda y.\ y$\\255Der Gesamtausdruck ist kein $\lambda$-Ausdruck, also ist es auch256kein Kombinator. Außerdem ist $x$ eine freie Variable.257\item $(\lambda x.\ x)\ y$\\258Der Ausdruck ist kein $\lambda$-Ausdruck, sondern eine259Funktionsanwendung. Also ist es kein Kombinator.260\end{bspenum}261\end{beispiel}262\footnotetext{Quelle: \url{http://www.haskell.org/haskellwiki/Combinator}}263264\begin{definition}[Fixpunkt-Kombinator]\xindex{Fixpunkt-Kombinator}%265Sei $f$ ein Kombinator, der $f\ g = g\ (f\ g)$ erfüllt. Dann heißt $f$266\textbf{Fixpunktkombinator}.267\end{definition}268269Insbesondere ist also $f \ g$ ein Fixpunkt von $g$.270271\begin{definition}[Y-Kombinator]\xindex{Y-Kombinator}%272Der Fixpunktkombinator273\[Y := \lambda f.\ (\lambda x.\ f\ (x\ x))\ (\lambda x.\ f\ (x\ x))\]274heißt $Y$-Kombinator.275\end{definition}276277Der Y-Kombinator hat einen Paramter. Er nimmt eine nicht-rekursive Funktion278und gibt eine rekursive zurück.279280\begin{behauptung}281Der $Y$-Kombinator ist ein Fixpunktkombinator.282\end{behauptung}283284\begin{beweis}\footnote{Quelle: Vorlesung WS 2013/2014, Folie 175}\leavevmode285286\textbf{Teil 1:} Offensichtlich ist $Y$ ein Kombinator.287288\textbf{Teil 2:} z.~Z.: $Y f \Rightarrow^* f \ (Y \ f)$289290\begin{align*}291Y\ f &=\hphantom{^\beta f\ } (\lambda f.\ (\lambda x.\ f\ (x\ x))\ (\lambda x.\ f\ (x\ x)))\ f\\292&\Rightarrow^\beta\hphantom{f \ (\lambda f.\ } (\lambda x. f\ (x\ x))\ (\lambda x.\ f\ (x\ x))\\293&\Rightarrow^\beta f \ (\hphantom{\lambda f.\ }(\lambda x.\ f\ (x\ x))\ (\lambda x.\ f\ (x\ x)))\\294&\Rightarrow^\beta f \ (\lambda f.\ (\lambda x.\ f\ (x\ x))\ (\lambda x.\ f\ (x\ x))\ f)\\295&=\hphantom{^\beta} f \ (Y \ f)296\end{align*}297$\qed$298\end{beweis}299300\begin{definition}[Turingkombinator]\xindex{Turingkombinator}%301Der Fixpunktkombinator302\[\Theta := (\lambda x. \lambda y. y\ (x\ x\ y)) (\lambda x.\ \lambda y.\ y\ (x\ x\ y))\]303heißt \textbf{Turingkombinator}.304\end{definition}305306\begin{behauptung}307Der Turing-Kombinator $\Theta$ ist ein Fixpunktkombinator.308\end{behauptung}309310\begin{beweis}\footnote{Quelle: Übungsblatt 6, WS 2013/2014}311312\textbf{Teil 1:} Offensichtlich ist $\Theta$ ein Kombinator.313314\textbf{Teil 2:} z.~Z.: $\Theta f \Rightarrow^* f \ (\Theta \ f)$315316Sei $\Theta_0 := (\lambda x.\ \lambda y.\ y\ (x\ x\ y))$. Dann gilt:317\begin{align*}318\Theta\ f &= ((\lambda x.\ \lambda y.\ y\ (x\ x\ y))\ \Theta_0)\ f\\319&\Rightarrow^\beta (\lambda y. y\ (\Theta_0 \ \Theta_0 \ y))\ f\\320&\Rightarrow^\beta f \ (\Theta_0 \Theta_0 f)\\321&= f \ (\Theta \ f)322\end{align*}323$\qed$324\end{beweis}325326\section{Literatur}327328\begin{itemize}329\item \url{http://c2.com/cgi/wiki?FreeVariable}330\item \url{http://www.lambda-bound.com/book/lambdacalc/node9.html}331\item \url{http://mvanier.livejournal.com/2897.html}332\end{itemize}333334