Lambda-Kalkül
# Lambda-Kalkül

Der Lambda-Kalkül ist eine formale Sprache zur Untersuchung von Funktionen. Er beschreibt die Definition von Funktionen und gebundenen Parametern und wurde in den 1930er Jahren von Alonzo Church und Stephen Cole Kleene eingeführt. Heute ist er ein wichtiges Konstrukt für die Theoretische Informatik, Logik höherer Stufe und Linguistik.

## Geschichte

Alonzo Church benutzte den Lambda-Kalkül, um 1936 sowohl eine negative Antwort auf das Entscheidungsproblem zu geben als auch eine Fundierung eines logischen Systems zu finden, wie es den Principia Mathematica von Bertrand Russell und Alfred North Whitehead zugrunde lag. Mittels des untypisierten Lambda-Kalküls kann man klar definieren, was eine berechenbare Funktion ist. Die Frage, ob zwei Lambda-Ausdrücke (s. u.) äquivalent sind, kann im Allgemeinen nicht algorithmisch entschieden werden. In seiner typisierten Form kann der Kalkül benutzt werden, um Logik höherer Stufe darzustellen. Der Lambda-Kalkül hat die Entwicklung funktionaler Programmiersprachen, die Forschung um Typsysteme von Programmiersprachen im Allgemeinen sowie moderne Teildisziplinen in der Logik wie die Typtheorie wesentlich beeinflusst.
Meilensteine der Entwicklung waren im Einzelnen:
* Nach der Einführung die frühe Entdeckung, dass sich mit dem Lambda-Kalkül alles ausdrücken lässt, was man mit einer Turingmaschine ausdrücken kann. Anders formuliert: Im Sinne des Konzepts der Berechenbarkeit sind beide gleich mächtig.
* Konrad Zuse hat Ideen aus dem Lambda-Kalkül 1942 bis 1946 in seinen Plankalkül einfließen lassen.
* John McCarthy hat sie Ende der 1950er Jahre verwendet und damit die minimalen Funktionen der Programmiersprache Lisp definiert.
* Die typisierten Varianten des Lambda-Kalküls führten zu modernen Programmiersprachen wie ML oder Haskell.
* Als überaus fruchtbar erwies sich die Idee, Ausdrücke des typisierten Lambda-Kalküls zur Repräsentation von Termen einer Logik zugrunde zu legen, den Lambda-Kalkül also als Meta-Logik zu verwenden. Erstmals von Church 1940 in seiner Theory of Simple Types präsentiert, führte sie einerseits zu modernen Theorembeweisern für Logiken höherer Stufe und …
* andererseits in den 1970er und 1980er Jahren zu Logiken mit immer mächtigeren Typsystemen, in denen sich z. B. logische Beweise an sich als Lambda-Ausdruck darstellen lassen.
* In Anlehnung an den Lambda-Kalkül wurde für die Beschreibung nebenläufiger Prozesse der Pi-Kalkül von Robin Milner in den 1990er Jahren entwickelt.

## Der untypisierte Lambda-Kalkül
### Motivation

Ausgehend von einem mathematischen Term, wie beispielsweise $x+2$, lässt sich eine Funktion bilden, die $x$ auf $x+2$ abbildet. Man schreibt auch $x\mapsto x+2$. Beim Lambda-Kalkül geht es zunächst darum, solche Funktionsbildungen sprachlich zu formalisieren. Im Lambda-Kalkül würde man statt $x\mapsto x+2$ den Term
* $\lambda x.x+2$
schreiben. Man sagt, dass die freie Variable $x$ durch λ-Abstraktion gebunden wird. Die Variablen-Bindung kommt in der Mathematik auch in anderen Bereichen vor:
* Mengenlehre: $\{x\mid \Phi (x)\}$
* Logik: $\forall x\;\Phi (x)$ und $\exists x\;\Phi (x)$
* Analysis: $\int _{0}^{1}f(x)\;\mathrm {d} x$
Die abstrahierte Variable muss nicht notwendigerweise im Term vorkommen, z. B. $\lambda x.2$ . Dieser λ-Ausdruck bezeichnet dann die Funktion, die jedes $x$ auf $2$ abbildet. Etwas allgemeiner ist $\lambda x.y$ die Funktion, die konstant $y$ ist. Wird nachträglich noch nach $y$ abstrahiert, so erhält man mit $\lambda y.\lambda x.y$ eine Formalisierung der Funktion, die jedem Wert $y$ die Funktion zuordnet, die konstant $y$ ist. Der Ausdruck $\lambda y.\lambda x.y$ repräsentiert also eine funktionswertige Funktion. Im Lambda-Kalkül lassen sich aber auch Funktionen ausdrücken, deren Argumente bereits Funktionen sind. Nimmt man bspw. die Funktion, die jeder Funktion $f$ eine andere Funktion $f^{2}$ zuordnet, die so entsteht, dass $f$ zweimal angewandt wird, so wird $f^{2}$ durch den λ-Term $\lambda x.f(f(x))$ dargestellt und die Zuordnung $f\mapsto f^{2}$ durch $\lambda f.\lambda x.f(f(x))$.
Da λ-Terme als Funktionen gesehen werden, kann man sie auf ein Argument anwenden. Man spricht von Applikation und schreibt im Lambda-Kalkül eher $f~x$ statt $f(x)$. Klammern können Terme gruppieren. Die Applikation als Verbindungsprinzip von Termen ist definitionsgemäß linksassoziativ, d. h. $f~x~y$ bedeutet $(f~x)~y$. In der üblichen mathematischen Notation würde man hier $(f(x))(y)$ schreiben. Wendet man nun einen Lambda-Term $\lambda x.\theta$ auf ein Argument $a$ an, also $(\lambda x.\theta )~a$, so berechnet sich das Ergebnis dadurch, dass in dem Term $\theta$ jedes Vorkommen der Variablen $x$ durch $a$ ersetzt wird. Diese Ableitungsregel nennt man β-Konversion.
λ-Terme formulieren eher allgemeine Prinzipien der Mathematik und bezeichnen nicht so sehr Objekte des üblichen mathematischen Universums. Beispielsweise formuliert $\lambda x.x$ das Zuordnungsprinzip der identischen Abbildung, doch diese ist immer auf eine gegebene Menge als Definitionsmenge bezogen. Eine universelle Identität als Funktion ist in der mengentheoretischen Formulierung der Mathematik nicht definiert. Der Lambda-Kalkül im strengen Sinne ist daher eher als ein Neuentwurf der Mathematik zu sehen, in dem die Grundobjekte als universelle Funktionen verstanden werden, im Gegensatz zur axiomatischen Mengenlehre, deren Grundobjekte Mengen sind.
Zahlen und Terme wie $x+2$ sind zunächst nicht Bestandteil eines reinen Lambda-Kalküls. Ähnlich wie in der Mengenlehre, in der man Zahlen und Arithmetik allein aus dem Mengenbegriff heraus konstruieren kann, ist es aber auch im Lambda-Kalkül möglich, auf der Basis von λ-Abstraktion und Applikation die Arithmetik zu definieren. Da im Lambda-Kalkül jeder Term als einstellige Funktion verstanden wird, muss eine Addition als die Funktion verstanden werden, die jeder Zahl $y$ diejenige (einstellige) Funktion zuordnet, die zu jeder Zahl $x$ den Wert $y$ addiert (s. Currying).
Lambda-Terme ohne freie Variablen werden auch als Kombinatoren bezeichnet. Die Kombinatorische Logik (oder Kombinator-Kalkül) kann als alternativer Ansatz zum Lambda-Kalkül gesehen werden.

### Formale Definition

In seiner einfachsten, dennoch vollständigen Form gibt es im Lambda-Kalkül drei Sorten von Termen, hier in Backus-Naur-Form:
Term ::= a (Variable) | (Term Term) (Applikation) | λa. Term (Abstraktion)
wobei $a$ für ein beliebiges Symbol aus einer mindestens abzählbar-unendlichen Menge von Variablensymbolen (kurz: Variablen) steht. Für praktische Zwecke wird der Lambda-Kalkül üblicherweise noch um eine weitere Sorte von Termen, die Konstantensymbole, erweitert.
Die Menge der freien Variablen $FV(T)$ kann induktiv über der Struktur eines λ-Terms $T$ wie folgt definiert werden:
* $FV(a)=\{a\}$, falls der Term eine Variable $a$ ist
* $FV(T_{1}~T_{2})=FV(T_{1})\cup FV(T_{2})$ für Applikationen, und
* $FV(\lambda a.T)=FV(T)\setminus \{a\}$, falls der Term eine Abstraktion ist, sind seine freien Variablen die freien Variablen von $T$ außer $a$.
Die Menge der gebundenen Variablen $B(T)$ eines Terms $T$ errechnet sich auch induktiv:
* $B(a)=\emptyset$, falls der Term eine Variable $a$ ist
* $B(T_{1}~T_{2})=B(T_{1})\cup B(T_{2})$ für Applikationen, und
* $B(\lambda a.T)=B(T)\cup \{a\}$, falls der Term eine Abstraktion ist, sind seine gebundenen Variablen die gebundenen Variablen von $T$ vereinigt $a$.
Mittels der Definition von freien und gebundenen Variablen kann nun der Begriff der (freien) Variablensubstitution (Einsetzung) induktiv definiert werden durch:
* $a[x\leftarrow T]=a$ falls Variable $x$ ungleich $a$
* $a[a\leftarrow T]=T$
* $(T_{1}~T_{2})[x\leftarrow T]=(T_{1}[x\leftarrow T]~T_{2}[x\leftarrow T])$
* $(\lambda a.T')[a\leftarrow T]=(\lambda a.T')$
* $(\lambda a.T')[x\leftarrow T]=(\lambda a.T'[x\leftarrow T])$ falls Variable $x$ ungleich $a$ und falls $FV(T)$ disjunkt von $B(\lambda a.T')$.
Hinweis: $S[x\leftarrow T]$ steht für: $S$, in dem die freie Variable $x$ durch $T$ ersetzt wurde (falls $x$ nicht in $S$ vorhanden ist, wird auch nichts ersetzt).
Man beachte, dass die Substitution nur partiell definiert ist; ggf. müssen gebundene Variablen geeignet umbenannt werden (siehe α-Kongruenz im Folgenden), so dass niemals eine freie Variable in einem Substitut durch Einsetzung für eine Variable gebunden wird.
Über der Menge der λ-Terme können nun Kongruenzregeln (hier ≡ geschrieben) definiert werden, die die Intuition formal fassen, dass zwei Ausdrücke dieselbe Funktion beschreiben. Diese Relationen sind durch die sogenannte α-Konversion, die β-Konversion sowie die η-Konversion erfasst.

### Kongruenzregeln
#### α-Konversion

Die α-Konversionsregel formalisiert die Idee, dass die Namen von gebundenen Variablen „Schall und Rauch“ sind; z. B. beschreiben $\lambda x.x$ und $\lambda y.y$ dieselbe Funktion. Allerdings sind die Details nicht ganz so einfach wie es zunächst erscheint: Eine Reihe von Einschränkungen müssen beachtet werden, wenn gebundene Variablen durch andere gebundene Variablen ersetzt werden.
Formal lautet die Regel wie folgt:
    $\lambda V.E~\equiv ~\lambda W.E[V\leftarrow W]$
falls $W$ in $E$ nirgends frei vorkommt und $W$ in $E$ dort nicht gebunden ist, wo es ein $V$ ersetzt. Da eine Kongruenzregel in jedem Teilterm anwendbar ist, erlaubt sie die Ableitung, dass $\lambda x.(\lambda x.x)~x$ gleich $\lambda y.(\lambda x.x)~y$ ist.

#### β-Konversion

Die β-Konversionsregel formalisiert das Konzept der „Funktionsanwendung“. Wird sie ausschließlich von links nach rechts angewandt, spricht man auch von β-Reduktion. Formal lässt sie sich durch
    $((\lambda V.E)~E')~\equiv ~E[V\leftarrow E']$
beschreiben, wobei alle freien Variablen in $E'$ in $E[V\leftarrow E']$ frei bleiben müssen (siehe Nebenbedingung bei der Substitutionsdefinition).
Ein Term heißt in β-Normalform, wenn keine β-Reduktion mehr anwendbar ist (nicht für alle Terme existiert eine β-Normalform; siehe unten). Ein tiefes Resultat von Church und Rosser über den λ-Kalkül besagt, dass die Reihenfolgen von α-Konversionen und β-Reduktionen in gewissem Sinn keine Rolle spielt: wenn man einen Term zu zwei Termen $T_{1}$ und $T_{2}$ ableitet, gibt es immer eine Möglichkeit, $T_{1}$ und $T_{2}$ jeweils zu einem gemeinsamen Term $T_{3}$ abzuleiten.

#### η-Konversion

Die η-Konversion kann optional zum Kalkül hinzugefügt werden. Sie formalisiert das Konzept der Extensionalität, d. h., dass zwei Funktionen genau dann gleich sind, wenn sie für alle Argumente dasselbe Resultat liefern. Formal ist die η-Konversion beschrieben durch:
    $\lambda x.f~x~\equiv ~f$, wenn $x$ nicht freie Variable von $f$ ist.