Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

132930 views
License: OTHER
1
%!TEX root = Programmierparadigmen.tex
2
\chapter{$\lambda$-Kalkül}
3
Der $\lambda$-Kalkül (gesprochen: Lambda-Kalkül) ist eine formale Sprache.
4
In diesem Kalkül gibt es drei Arten von Termen $T$:
5
6
\begin{itemize}
7
\item Variablen: $x$
8
\item Applikationen: $(T S)$
9
\item Lambda-Abstraktion: $\lambda x. T$
10
\end{itemize}
11
12
In der Lambda-Abstraktion nennt man den Teil vor dem Punkt die \textit{Parameter}
13
der $\lambda$-Funktion. Wenn etwas dannach kommt, auf die die Funktion angewendet
14
wird so heißt dieser Teil das \textit{Argument}:
15
16
\[(\lambda \underbrace{x}_{\mathclap{\text{Parameter}}}. x^2) \overbrace{5}^{\mathclap{\text{Argument}}} = 5^2\]
17
18
\begin{beispiel}[$\lambda$-Funktionen]
19
\begin{bspenum}
20
\item $\lambda x. x$ heißt Identität.
21
\item $(\lambda x. x^2)(\lambda y. y + 3) = \lambda y. (y+3)^2$
22
\item \label{bsp:lambda-3} $\begin{aligned}[t]
23
&(\lambda x.\Big (\lambda y.yx \Big ))~ab\\
24
\Rightarrow&(\lambda y.ya)b\\
25
\Rightarrow&ba
26
\end{aligned}$
27
\end{bspenum}
28
29
In \cref{bsp:lambda-3} sieht man, dass $\lambda$-Funktionen die Argumente
30
von Links nach rechts einziehen.
31
\end{beispiel}
32
33
Die Funktionsapplikation sei linksassoziativ. Es gilt also:
34
35
\[a~b~c~d = ((a~b)~c)~d\]
36
37
\begin{definition}[Gebundene Variable]\xindex{Variable!gebundene}%
38
Eine Variable heißt gebunden, wenn sie der Parameter einer $\lambda$-Funktion ist.
39
\end{definition}
40
41
\begin{definition}[Freie Variable]\xindex{Variable!freie}%
42
Eine Variable heißt \textit{frei}, wenn sie nicht gebunden ist.
43
\end{definition}
44
45
\begin{satz}
46
Der untypisierte $\lambda$-Kalkül ist Turing-Äquivalent.
47
\end{satz}
48
49
\section{Reduktionen}\index{Reduktion|(}
50
\begin{definition}[Redex]\xindex{Redex}%
51
Eine $\lambda$-Term der Form $(\lambda x. t_1) t_2$ heißt Redex.
52
\end{definition}
53
54
\begin{definition}[$\alpha$-Äquivalenz]\xindex{Reduktion!Alpha ($\alpha$)}\xindex{Äquivalenz!Alpha ($\alpha$)}%
55
Zwei Terme $T_1, T_2$ heißen $\alpha$-Äquivalent, wenn $T_1$ durch
56
konsistente Umbenennung in $T_2$ überführt werden kann.
57
58
Man schreibt dann: $T_1 \overset{\alpha}{=} T_2$.
59
\end{definition}
60
61
\begin{beispiel}[$\alpha$-Äquivalenz]
62
\begin{align*}
63
\lambda x.x &\overset{\alpha}{=} \lambda y. y\\
64
\lambda x. x x &\overset{\alpha}{=} \lambda y. y y\\
65
\lambda x. (\lambda y. z (\lambda x. z y) y) &\overset{\alpha}{=}
66
\lambda a. (\lambda x. z (\lambda c. z x) x)
67
\end{align*}
68
\end{beispiel}
69
70
\begin{definition}[$\beta$-Äquivalenz]\xindex{Reduktion!Beta ($\beta$)}\xindex{Äquivalenz!Beta ($\beta$)}%
71
Eine $\beta$-Reduktion ist die Funktionsanwendung auf einen Redex:
72
\[(\lambda x. t_1)\ t_2 \Rightarrow t_1 [x \mapsto t_2]\]
73
\end{definition}
74
75
\begin{beispiel}[$\beta$-Äquivalenz]
76
\begin{defenum}
77
\item $(\lambda x.\ x)\ y \overset{\beta}{\Rightarrow} x[x \mapsto y] = y$
78
\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)$
79
\end{defenum}
80
\end{beispiel}
81
82
\begin{definition}[$\eta$-Äquivalenz\footnote{Folie 158}]\xindex{Reduktion!Eta ($\eta$)}\xindex{Äquivalenz!Eta ($\eta$)}%
83
Die Terme $\lambda x. f~x$ und $f$ heißen $\eta$-Äquivalent, wenn $x \notin FV(f)$ gilt.
84
85
Man schreibt: $\lambda x. f~x \overset{\eta}{=} f$.
86
\end{definition}
87
88
\begin{beispiel}[$\eta$-Äquivalenz\footnote{Folie 158}]%
89
\begin{align*}
90
\lambda x.\ \lambda y.\ f\ z\ x\ y &\overset{\eta}{=} \lambda x.\ f\ z\ x\\
91
f\ z &\overset{\eta}{=} \lambda x.\ f\ z\ x\\
92
\lambda x.\ x &\overset{\eta}{=} \lambda x.\ (\lambda x.\ x)\ x\\
93
\lambda x.\ f\ x\ x &\overset{\eta}{\neq} f\ x
94
\end{align*}
95
\end{beispiel}
96
\index{Reduktion|)}
97
98
\section{Auswertungsstrategien}
99
\begin{definition}[Normalenreihenfolge]\xindex{Normalenreihenfolge}%
100
In der Normalenreihenfolge-Auswertungsstrategie wird der linkeste äußerste
101
Redex ausgewertet.
102
\end{definition}
103
104
\begin{definition}[Call-By-Name]\xindex{Call-By-Name}%
105
In der Call-By-Name Auswertungsreihenfolge wird der linkeste äußerste Redex
106
reduziert, der nicht von einem $\lambda$ umgeben ist.
107
\end{definition}
108
109
Die Call-By-Name Auswertung wird in Funktionen verwendet.
110
111
Haskell 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}
112
Das bezeichnet die Lazy-Evaluation von booleschen Ausdrücken.
113
114
\todo[inline]{Was ist sharing? Vermutlich so etwas wie in folgendem Beispiel:}
115
116
\begin{beispiel}[Sharing]
117
In dem Ausdruck \texttt{(plus, (fac, 42), (fac, 42))} muss der Teilausdruck
118
\texttt{(fac, 42)} nicht zwei mal ausgewertet werden, wenn er Seiteneffektfrei
119
ist.
120
\end{beispiel}
121
122
\begin{definition}[Call-By-Value]\xindex{Call-By-Value}%
123
In der Call-By-Value Auswertung wird der linkeste Redex reduziert, der
124
nicht von einem $\lambda$ umgeben ist und dessen Argument ein Wert ist.
125
\end{definition}
126
127
Die Call-By-Value Auswertungsreihenfolge wird in C und Java verwendet.
128
Auch in Haskell werden arithmetische Ausdrücke in der Call-By-Name Auswertungsreihenfolge reduziert.
129
130
\section{Church-Zahlen}\xindex{Church-Zahlen}
131
Im $\lambda$-Kalkül lässt sich jeder mathematische Ausdruck darstellen, also
132
insbesondere beispielsweise auch $\lambda x. x+3$. Aber \enquote{$3$} und
133
\enquote{$+$} ist hier noch nicht das $\lambda$-Kalkül.
134
135
Zuerst müssen wir uns also Gedanken machen, wie man natürliche Zahlen $n \in \mdn$
136
darstellt. Dafür dürfen wir nur Variablen und $\lambda$ verwenden. Eine Möglichkeit
137
das zu machen sind die sog. \textit{Church-Zahlen}.
138
139
Dabei ist die Idee, dass die Zahl angibt wie häufig eine Funktion $f$ auf eine
140
Variable $z$ angewendet wird. Also:
141
\begin{itemize}
142
\item $0 := \lambda f~z. z$
143
\item $1 := \lambda f~z. f z$
144
\item $2 := \lambda f~z. f (f z)$
145
\item $3 := \lambda f~z. f (f (f z))$
146
\end{itemize}
147
148
Auch die gewohnten Operationen lassen sich so darstellen.
149
150
\begin{beispiel}[Nachfolger-Operation]
151
\begin{align*}
152
\succ :&= \lambda n f z. f (n f z)\\
153
&= \lambda n. (\lambda f (\lambda z f (n f z)))
154
\end{align*}
155
Dabei ist $n$ die Zahl.
156
157
Will man diese Funktion anwenden, sieht das wie folgt aus:
158
\begin{align*}
159
\succ 1&= (\lambda n f z. f(n f z)) 1\\
160
&= (\lambda n f z. f(n f z)) \underbrace{(\lambda f~z. f z)}_{n}\\
161
&= \lambda f z. f (\lambda f~z. f z) f z\\
162
&= \lambda f z. f (f z)\\
163
&= 2
164
\end{align*}
165
\end{beispiel}
166
167
\begin{beispiel}[Vorgänger-Operation]\xindex{pred}\xindex{pair}\xindex{next}\xindex{fst}\xindex{snd}
168
\begin{align*}
169
\pair&:= \lambda a. \lambda b. \lambda f. f a b\\
170
\fst &:= \lambda p. p (\lambda a. \lambda b. a)\\
171
\snd &:= \lambda p. p (\lambda a. \lambda b. b)\\
172
\nxt &:= \lambda p. \pair (\snd p)~(\succ (\snd p))\\
173
\pred&:= \lambda n. \fst (n \nxt (\pair c_0 c_0))
174
\end{align*}
175
\end{beispiel}
176
\begin{beispiel}[Addition]
177
\begin{align*}
178
\text{plus} &:= \lambda m n f z. m f (n f z)
179
\end{align*}
180
Dabei ist $m$ der erste Summand und $n$ der zweite Summand.
181
\end{beispiel}
182
183
\begin{beispiel}[Multiplikation]
184
\begin{align*}
185
\text{times} :&= \lambda m n f. m~s~(n~f~z)\\
186
&\overset{\eta}{=} \lambda m n f z. n (m s) z
187
\end{align*}
188
Dabei ist $m$ der erste Faktor und $n$ der zweite Faktor.
189
\end{beispiel}
190
191
\begin{beispiel}[Potenz]
192
\begin{align*}
193
\text{exp} :&= \lambda b e. eb\\
194
&\overset{\eta}{=} \lambda b e f z. e b f z
195
\end{align*}
196
Dabei ist $b$ die Basis und $e$ der Exponent.
197
\end{beispiel}
198
199
\section{Church-Booleans}
200
\begin{definition}[Church-Booleans]\xindex{Church-Booleans}%
201
\texttt{True} wird zu $c_{\text{true}} := \lambda t. \lambda f. t$.\\
202
\texttt{False} wird zu $c_{\text{false}} := \lambda t. \lambda f. f$.
203
\end{definition}
204
205
Hiermit lässt sich beispielsweise die Funktion \texttt{is\_zero} definieren, die
206
\texttt{True} zurückgibt, wenn eine Zahl $0$ repräsentiert und sonst \texttt{False}
207
zurückgibt:
208
209
\[ \text{\texttt{is\_zero}} = \lambda n.\ n\ (\lambda x.\ c_{\text{False}})\ c_{\text{True}}\]
210
211
\section{Weiteres}
212
\begin{satz}[Satz von Curch-Rosser]
213
Wenn 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.
214
\end{satz}
215
216
\section{Fixpunktkombinator}
217
\begin{definition}[Fixpunkt]\xindex{Fixpunkt}%
218
Sei $f: X \rightarrow Y$ eine Funktion mit $\emptyset \neq A = X \cap Y$ und
219
$a \in A$.
220
221
$a$ heißt \textbf{Fixpunkt} der Funktion $f$, wenn $f(a) = a$ gilt.
222
\end{definition}
223
224
\begin{beispiel}[Fixpunkt]
225
\begin{bspenum}
226
\item $f_1: \mdr \rightarrow \mdr; f(x) = x^2 \Rightarrow x_1 = 0$ ist
227
Fixpunkt von $f$, da $f(0) = 0$. $x_2 = 1$ ist der einzige weitere
228
Fixpunkt dieser Funktion.
229
\item $f_2: \mdn \rightarrow \mdn$ hat ganz $\mdn$ als Fixpunkte, also
230
insbesondere unendlich viele Fixpunkte.
231
\item $f_3: \mdr \rightarrow \mdr; f(x) = x+1$ hat keinen einzigen Fixpunkt.
232
\item $f_4: \mdr[X] \rightarrow \mdr[X]; f(p) = p^2$ hat $p_1(x) = 0$ und
233
$p_2(x)=1$ als Fixpunkte.
234
\end{bspenum}
235
\end{beispiel}
236
237
\begin{definition}[Kombinator]\xindex{Kombinator}%
238
Ein Kombinator ist eine Abbildung ohne freie Variablen.
239
\end{definition}
240
241
\begin{beispiel}[Kombinatoren\footnotemark]%
242
Folgende $\lambda$-Funktionen sind Beispiele für Kombinatoren:
243
\begin{bspenum}
244
\item $\lambda a.\ a$
245
\item $\lambda a.\ \lambda b.\ a$
246
\item $\lambda f.\ \lambda a.\ \lambda b. f\ b\ a$
247
\item $\lambda x.\ \lambda y.\ x$\\
248
Diese $\lambda$-Funktion hat nur die gebundene Variable $x$, also
249
ist es ein Kombinator.
250
\end{bspenum}
251
252
Folgende $\lambda$-Funktionen sind keine Kombinatoren:
253
\begin{bspenum}
254
\item $\lambda x.\ y$
255
\item $x\ \lambda y.\ y$\\
256
Der Gesamtausdruck ist kein $\lambda$-Ausdruck, also ist es auch
257
kein Kombinator. Außerdem ist $x$ eine freie Variable.
258
\item $(\lambda x.\ x)\ y$\\
259
Der Ausdruck ist kein $\lambda$-Ausdruck, sondern eine
260
Funktionsanwendung. Also ist es kein Kombinator.
261
\end{bspenum}
262
\end{beispiel}
263
\footnotetext{Quelle: \url{http://www.haskell.org/haskellwiki/Combinator}}
264
265
\begin{definition}[Fixpunkt-Kombinator]\xindex{Fixpunkt-Kombinator}%
266
Sei $f$ ein Kombinator, der $f\ g = g\ (f\ g)$ erfüllt. Dann heißt $f$
267
\textbf{Fixpunktkombinator}.
268
\end{definition}
269
270
Insbesondere ist also $f \ g$ ein Fixpunkt von $g$.
271
272
\begin{definition}[Y-Kombinator]\xindex{Y-Kombinator}%
273
Der Fixpunktkombinator
274
\[Y := \lambda f.\ (\lambda x.\ f\ (x\ x))\ (\lambda x.\ f\ (x\ x))\]
275
heißt $Y$-Kombinator.
276
\end{definition}
277
278
Der Y-Kombinator hat einen Paramter. Er nimmt eine nicht-rekursive Funktion
279
und gibt eine rekursive zurück.
280
281
\begin{behauptung}
282
Der $Y$-Kombinator ist ein Fixpunktkombinator.
283
\end{behauptung}
284
285
\begin{beweis}\footnote{Quelle: Vorlesung WS 2013/2014, Folie 175}\leavevmode
286
287
\textbf{Teil 1:} Offensichtlich ist $Y$ ein Kombinator.
288
289
\textbf{Teil 2:} z.~Z.: $Y f \Rightarrow^* f \ (Y \ f)$
290
291
\begin{align*}
292
Y\ f &=\hphantom{^\beta f\ } (\lambda f.\ (\lambda x.\ f\ (x\ x))\ (\lambda x.\ f\ (x\ x)))\ f\\
293
&\Rightarrow^\beta\hphantom{f \ (\lambda f.\ } (\lambda x. f\ (x\ x))\ (\lambda x.\ f\ (x\ x))\\
294
&\Rightarrow^\beta f \ (\hphantom{\lambda f.\ }(\lambda x.\ f\ (x\ x))\ (\lambda x.\ f\ (x\ x)))\\
295
&\Rightarrow^\beta f \ (\lambda f.\ (\lambda x.\ f\ (x\ x))\ (\lambda x.\ f\ (x\ x))\ f)\\
296
&=\hphantom{^\beta} f \ (Y \ f)
297
\end{align*}
298
$\qed$
299
\end{beweis}
300
301
\begin{definition}[Turingkombinator]\xindex{Turingkombinator}%
302
Der Fixpunktkombinator
303
\[\Theta := (\lambda x. \lambda y. y\ (x\ x\ y)) (\lambda x.\ \lambda y.\ y\ (x\ x\ y))\]
304
heißt \textbf{Turingkombinator}.
305
\end{definition}
306
307
\begin{behauptung}
308
Der Turing-Kombinator $\Theta$ ist ein Fixpunktkombinator.
309
\end{behauptung}
310
311
\begin{beweis}\footnote{Quelle: Übungsblatt 6, WS 2013/2014}
312
313
\textbf{Teil 1:} Offensichtlich ist $\Theta$ ein Kombinator.
314
315
\textbf{Teil 2:} z.~Z.: $\Theta f \Rightarrow^* f \ (\Theta \ f)$
316
317
Sei $\Theta_0 := (\lambda x.\ \lambda y.\ y\ (x\ x\ y))$. Dann gilt:
318
\begin{align*}
319
\Theta\ f &= ((\lambda x.\ \lambda y.\ y\ (x\ x\ y))\ \Theta_0)\ f\\
320
&\Rightarrow^\beta (\lambda y. y\ (\Theta_0 \ \Theta_0 \ y))\ f\\
321
&\Rightarrow^\beta f \ (\Theta_0 \Theta_0 f)\\
322
&= f \ (\Theta \ f)
323
\end{align*}
324
$\qed$
325
\end{beweis}
326
327
\section{Literatur}
328
329
\begin{itemize}
330
\item \url{http://c2.com/cgi/wiki?FreeVariable}
331
\item \url{http://www.lambda-bound.com/book/lambdacalc/node9.html}
332
\item \url{http://mvanier.livejournal.com/2897.html}
333
\end{itemize}
334