Kombinatorische Logik
# Kombinatorische Logik

Kombinatorische Logik (Abgekürzt CL für engl. Combinatory Logic) ist eine Notation, die von Moses Schönfinkel und Haskell Brooks Curry eingeführt wurde, um die Verwendung von Variablen in der Mathematischen Logik zu vermeiden. Sie wird besonders in der Informatik als theoretisches Modell für Berechnung, als auch als Grundlage zum Design funktionaler Programmiersprachen eingesetzt.

## Kombinatorische Logik in der Mathematik

Die Kombinatorische Logik war als einfachere Logik gedacht, die die Bedeutung von quantifizierten Variablen in der Notation von Logik klären und sie tatsächlich unnötig machen sollte.
Siehe Curry, 1958–1972.

## Kombinatorische Logik in der Informatik

In der Informatik dient die kombinatorische Logik als einfaches Modell einer Berechnung. Dieses wird in der Berechenbarkeitstheorie und der Beweistheorie benötigt. In der Tat erfasst die kombinatorische Logik viele Aspekte natürlicher Berechnung.
Man kann die kombinatorische Logik als Variation des Lambda-Kalküls auffassen, wobei die Ausdrücke des Lambda-Kalküls durch einige wenige Kombinatoren ersetzt werden. Kombinatoren sind primitive Funktionen, die keine freien Variablen enthalten. Da es sehr einfach ist, Lambda-Ausdrücke in Terme der CL umzuwandeln, und sich die Reduktion von Kombinatoren wesentlich einfacher gestaltet als die Lambda-Reduktion, wird die CL gerne als Implementationsgrundlage für nicht-strikte Sprachen verwendet.
Man kann die CL auch auf viele andere Art und Weisen betrachten, so zeigen viele frühere Abhandlungen die Äquivalenz verschiedener Kombinatoren zu Axiomen der Logik. [Hindley and Meredith, 1990].

## Eine kurze Zusammenfassung des Lambda-Kalküls

Eine ausführliche Beschreibung des Lambda-Kalküls findet sich unter dessen Artikel.
Lambda-Terme bestehen aus
* Variablen $v$,
* Abstraktionen $\lambda v.T$,
* Applikationen $(T1~T2)$,
wobei $v$ hier für einen beliebigen Variablennamen und $T$, ${\mathit {T}}1$ und $T2$ wiederum für Lambda-Terme stehen. Lambda-Terme werden durch Beta-Reduktion vereinfacht, wobei die Applikation $(\lambda v.E)~a$ ersetzt wird durch die Ersetzung $E[v:=a]$.
Die Kombinatorische Logik ist ein Berechnungsmodell, das äquivalent zum Lambda-Kalkül ist, aber ohne die Abstraktion auskommt.

## Der kombinatorische Kalkül

Da Abstraktion im Lambda-Kalkül verwendet wird, um Funktionen zu modellieren, muss es im kombinatorischen Kalkül etwas Vergleichbares geben. Hier gibt es statt der Abstraktion einige wenige primitive Funktionen (Kombinatoren), aus denen nun weitere Funktionen zusammengesetzt werden können.

### Kombinatorische Terme

Kombinatorische Terme bestehen aus
* Kombinatoren $P$
* Applikationen $(T1~T2)$
$T1$ und $T2$ sind wiederum kombinatorische Terme. Die Applikation ist, wie im Lambda-Kalkül, linksassoziativ, das heißt $T1~T2~T3~T4$ ist gleichbedeutend mit $(((T1~T2)~T3)~T4)$.

### Beispiele von Kombinatoren

$x$, $y$ usw. bezeichnen im Folgenden beliebige Terme.
Der einfachste Kombinator ist $\mathbf {I}$, der Identitätskombinator. Für ihn gilt:
    $({\mathbf {I} }~x)=x$
Ein weiterer, einfacher Kombinator ist $\mathbf {K}$, der Konstantenkombinator. $({\mathbf {K} }~x)$ modelliert eine Funktion, die für ein weiteres Argument immer $x$ zurückgibt, also:
    $({\mathbf {K} }~x~y)=x$
Ein dritter Kombinator ist $\mathbf {S}$, er stellt eine generalisierte Version der Applikation dar:
    $({\mathbf {S} }~x~y~z)=(x~z~(y~z))$
$\mathbf {S}$ wendet $x$ auf $y$ an, setzt jedoch zuvor $z$ in beide ein.
Eigentlich ist $\mathbf {I}$ unnötig, wenn man $\mathbf {S}$ und $\mathbf {K}$ hat, denn
    $(({\mathbf {S} }~{\mathbf {K} }~{\mathbf {K} })~x)$
       $=({\mathbf {S} }~{\mathbf {K} }~{\mathbf {K} }~x)$
       $=({\mathbf {K} }~x~({\mathbf {K} }~x))$
       $=x$.

### Fixpunktkombinator

Noch interessanter ist der Fixpunktkombinator $\mathbf {Y}$, der verwendet wird, um Rekursion zu implementieren.
    $({\mathbf {Y} }~{\mathbf {x} })={\mathbf {x} }~({\mathbf {Y} }~{\mathbf {x} })$
Auch $\mathbf {Y}$ ist unnötig. Es kann, falls keine Typisierung erforderlich ist, als
    ${\mathbf {Y} }={\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~({\mathbf {S} }~({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} }))({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }))$
dargestellt werden.

### Vollständigkeit der Grundlage S-K

Erstaunlich ist, dass man aus $\mathbf {S}$ und $\mathbf {K}$ allein Kombinatoren zusammensetzen kann, die extensional gleich jedem beliebigen Lambda-Term sind, und daher, gemäß der These von Church, extensional gleich jeder beliebigen berechenbaren Funktion. Als Beweis dient eine Transformation $T[~]$, die Lambda-Terme in äquivalente CL-Terme verwandelt.
Einzige Voraussetzung ist, dass der zu transformierende Lambda-Term keine freien Variablen enthält.
$T[~]$ kann folgendermaßen definiert werden:
* $T[V]\Rightarrow V$
* $T[(E1~E2)]\Rightarrow (T[E1]~T[E2])$
* $T[\lambda x.E]\Rightarrow ({\mathbf {K} }~T[E])$ (nur, wenn $x$ nicht frei in $E$)
* $T[\lambda x.x]\Rightarrow {\mathbf {I} }$
* $T[\lambda x.\lambda y.E]\Rightarrow T[\lambda x.T[\lambda y.E]]$ (falls $x$ freie Variable von $E$)
* $T[\lambda x.(E1~E2)]\Rightarrow ({\mathbf {S} }~T[\lambda x.E1]T[\lambda x.E2])$

#### Die Transformation eines Lambda-Terms in einen CL-Term

Als Beispiel wird der Term $\lambda x.\lambda y.(y~x)$ in einen CL-Term übersetzt:
    $T[\lambda x.\lambda y.(y~x)]$
       $=T[\lambda x.T[\lambda y.(y~x)]]$ (Regel 5)
       $=T[\lambda x.({\mathbf {S} }~T[\lambda y.y]~T[\lambda y.x])]$ (Regel 6)
       $=T[\lambda x.({\mathbf {S} }~{\mathbf {I} }~T[\lambda y.x])]$ (Regel 4)
       $=T[\lambda x.({\mathbf {S} }~{\mathbf {I} }~({\mathbf {K} }~x))]$ (Regel 3 und Regel 1)
       $=({\mathbf {S} }~T[\lambda x.({\mathbf {S} }~{\mathbf {I} })]~T[\lambda x.({\mathbf {K} }~x)])$ (Regel 6)
       $=({\mathbf {S} }~({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} }))~T[\lambda x.({\mathbf {K} }~x)])$ (Regel 3)
       $=({\mathbf {S} }~({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} }))~({\mathbf {S} }~T[\lambda x.{\mathbf {K} }]~T[\lambda x.x]))$ (Regel 6)
       $=({\mathbf {S} }~({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} }))~({\mathbf {S} }~({\mathbf {K} }~{\mathbf {K} })~T[\lambda x.x]))$ (Regel 3)
       $=({\mathbf {S} }~({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} }))~({\mathbf {S} }~({\mathbf {K} }~{\mathbf {K} })~{\mathbf {I} }))$ (Regel 4)
Wenn nun dieser Kombinator auf zwei Terme $x$ und $y$ angewendet wird, sieht die Reduktion folgendermaßen aus:
    $({\mathbf {S} }~({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} }))~({\mathbf {S} }~({\mathbf {K} }~{\mathbf {K} })~{\mathbf {I} })~x~y)$
       $=({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} })~x~({\mathbf {S} }~({\mathbf {K} }~{\mathbf {K} })~{\mathbf {I} }~x)~y)$
       $=({\mathbf {S} }~{\mathbf {I} }~({\mathbf {S} }~({\mathbf {K} }~{\mathbf {K} })~{\mathbf {I} }~x)~y)$
       $=({\mathbf {I} }~y~({\mathbf {S} }~({\mathbf {K} }~{\mathbf {K} })~{\mathbf {I} }~x~y))$
       $=(y~({\mathbf {S} }~({\mathbf {K} }~{\mathbf {K} })~{\mathbf {I} }~x~y))$
       $=(y~({\mathbf {K} }~{\mathbf {K} }~x~({\mathbf {I} }~x)~y))$
       $=(y~({\mathbf {K} }~({\mathbf {I} }~x)~y))$
       $=(y~({\mathbf {I} }~x))$
       $=(y~x)$
Die kombinatorische Repräsentation $({\mathbf {S} }~({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} }))~({\mathbf {S} }~({\mathbf {K} }~{\mathbf {K} })~{\mathbf {I} }))$ ist viel länger als der Lambda-Term $\lambda x.\lambda y.(y~x)$. Das ist typisch für die Transformation. Generell kann es passieren, dass eine $T[~]$-Konstruktion einen Lambda-Term der Länge $n$ in einen Kombinator der Länge $\Theta (3^{n})$ umwandelt.

#### Erläuterung der T[ ]-Transformation

Die Motivation der $T[~]$-Transformation ist die Eliminierung von Abstraktionen. Drei der Regeln sind trivial: Regel 4 transformiert $\lambda x.x$ in seine eindeutige Äquivalenz $\mathbf {I}$, Regel 3 transformiert $\lambda x.E$ zu $({\mathbf {K} }~T[E])$, was allerdings nur funktioniert, wenn die gebundene Variable $x$ in $E$ nicht verwendet wird (i.e.: in $E$ nicht frei ist). Regel 2 transformiert die Applikation zweier Terme, was auch in den Termen der CL erlaubt ist.
Regel 1 ist etwas schwierig, denn sie konvertiert Variablen: Variablen können nur durch Regel 4 aufgelöst werden, daher bleiben sie fürs Erste erhalten. Da es keine freien Variablen im Gesamtterm gibt und jede Transformation von Abstraktionen die gebundenen Variablen berücksichtigt (Regeln 3, 4, 5, 6), werden irgendwann alle Variablen aufgelöst.
Die Regeln 5 und 6 verschieben die Abstraktionen ins Innere des Funktionskörpers, bis sie von Regel 4 aufgelöst werden können. Regel 5 konvertiert dazu zuerst den Körper der äußeren Abstraktion, danach die Abstraktion selbst. Regel 6 verteilt die Abstraktion über einer Applikation auf deren Teilterme:
$\lambda x.(E1~E2)$ ist eine Funktion, die ein Argument nimmt und im Lambda-Term $(E1~E2)$ für $x$ einsetzt. Genau dies tut der Kombinator $\mathbf {S}$, nur für Funktionen $E1[x]$ bzw. $E2[x]$:
    $(\lambda x.(E1~E2)~a)=((\lambda x.E1~a)~(\lambda x.E2~a))$
       $=({\mathbf {S} }~\lambda x.E1~\lambda x.E2~a)$
       $=(({\mathbf {S} }~\lambda x.E1~\lambda x.E2)~a)$
Daher gilt, gemäß extensionaler Gleichheit:
    $\lambda x.(E1~E2)=({\mathbf {S} }~\lambda x.E1~\lambda x.E2)$
Um nun einen Kombinator für $\lambda x.(E1~E2)$ zu finden, reicht es aus, einem Kombinator für $({\mathbf {S} }~\lambda x.E1~\lambda x.E2)$ zu finden, also:
    $({\mathbf {S} }~T[\lambda x.E1]~T[\lambda x.E2])$

### Vereinfachung der Transformation
#### η-Reduktion

Die Kombinatoren, die $T[~]$ liefert, werden kürzer wenn wir die η-Reduktion aus dem Lambda-Kalkül verwenden:
    $T[\lambda x.(E~x)]=T[E]$ (nur, wenn $x$ nicht frei in $E$)
$[[\lambda x.(E~x)]]$ ist die Funktion, die ein Argument $x$ nimmt, und es in die Funktion $E$ einsetzt; dies ist extensional gleich der Funktion $E$ selbst. Es ist daher ausreichend, einfach $E$ in seine Kombinatorische Form zu transformieren.
Mit dieser Vereinfachung wird das obige Beispiel zu:
    $T[\lambda x.\lambda y.(y~x)]$
       $=\ldots$
       $=({\mathbf {S} }~({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} }))~T[\lambda x.({\mathbf {K} }~x)])$
       $=({\mathbf {S} }~({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} }))~{\mathbf {K} })$ (durch η-Reduktion)
Dieser Kombinator ist (extensional) gleich dem längeren aus dem vorangegangenen Beispiel:
    $({\mathbf {S} }~({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} }))~{\mathbf {K} }~x~y)$
       $=({\mathbf {K} }~({\mathbf {S} }~{\mathbf {I} })~x~({\mathbf {K} }~x)~y)$
       $=({\mathbf {S} }~{\mathbf {I} }~({\mathbf {K} }~x)~y)$
       $=({\mathbf {I} }~y~({\mathbf {K} }~x~y))$
       $=(y~({\mathbf {K} }~x~y))$
       $=(y~x)$
Ganz ähnlich würde die normale $T[~]$-Transformation die Identitätsfunktion $\lambda f.\lambda x.(f~x)$ verwandeln in $({\mathbf {S} }~({\mathbf {S} }~({\mathbf {K} }~{\mathbf {S} })~({\mathbf {S} }~({\mathbf {K} }~{\mathbf {K} })~{\mathbf {I} }))~({\mathbf {K} }~{\mathbf {I} }))$. Mit der neuen η-Reduktionsregel wird aus $\lambda f.\lambda x.(f~x)$ einfach nur $\mathbf {I}$.

#### Die Kombinatoren B, C von Curry

Die Kombinatoren $\mathbf {S}$ und $\mathbf {K}$ tauchen bereits in der Arbeit von Schönfinkel auf (allerdings hieß $\mathbf {K}$ dort $\mathbf {C}$), Curry führte in seiner Dissertation Grundlagen der kombinatorischen Logik weiterhin $\mathbf {B}$, $\mathbf {C}$, $\mathbf {W}$ (und $\mathbf {K}$) ein.
$\mathbf {B}$ und $\mathbf {C}$ können viele Reduktionen vereinfachen, sie sehen folgendermaßen aus:
    $({\mathbf {C} }~a~b~c)=(a~c~b)$
    $({\mathbf {B} }~a~b~c)=(a~(b~c))$
Für diese beiden Kombinatoren werden die Regeln folgendermaßen erweitert:
* $T[V]\Rightarrow V$
* $T[(E1~E2)]\Rightarrow (T[E1]~T[E2])$
* $T[\lambda x.E]\Rightarrow ({\mathbf {K} }~T[E])$ (nur, wenn $x$ nicht frei in $E$)
* $T[\lambda x.x]\Rightarrow {\mathbf {I} }$
* $T[\lambda x.\lambda y.E]\Rightarrow T[\lambda x.T[\lambda y.E]]$ (falls $x$ freie Variable von $E$)
* $T[\lambda x.(E1~E2)]\Rightarrow ({\mathbf {S} }~T[\lambda x.E1]~T[\lambda x.E2])$ (falls $x$ freie Variable von $E1$ und $E2$)
* $T[\lambda x.(E1~E2)]\Rightarrow ({\mathbf {C} }~T[\lambda x.E1]~T[E2])$ (falls $x$ freie Variable von $E1$ aber nicht von $E2$)
* $T[\lambda x.(E1~E2)]\Rightarrow ({\mathbf {B} }~T[E1]~T[\lambda x.E2])$ (falls $x$ freie Variable von $E2$ aber nicht von $E1$)
Zum Beispiel sieht die Transformation von $\lambda x.\lambda y.(y~x)$ so aus:
    $T[\lambda x.\lambda y.(y~x)]$
       $=T[\lambda x.T[\lambda y.(y~x)]]$
       $=T[\lambda x.({\mathbf {C} }~T[\lambda y.y]~x)]$ (Regel 7)
       $=T[\lambda x.({\mathbf {C} }~{\mathbf {I} }~x)]$
       $=({\mathbf {C} }~{\mathbf {I} })$ (η-Reduktion)
       $={\mathbf {C} }_{\ast }$ (Notation für: ${\mathbf {X} }_{\ast }={\mathbf {X} }~{\mathbf {I} }$)
       $={\mathbf {I} }'$ (Notation für: ${\mathbf {X} }'={\mathbf {C} }~{\mathbf {X} }$)
Tatsächlich reduziert $({\mathbf {C} }~{\mathbf {I} }~x~y)$ zu $(y~x)$:
    $({\mathbf {C} }~{\mathbf {I} }~x~y)$
       $=({\mathbf {I} }~y~x)$
       $=(y~x)$
$\mathbf {B}$ und $\mathbf {C}$ stellen beschränkte Versionen von $\mathbf {S}$ dar. Während $\mathbf {S}$ einen Wert sowohl in den Applikanten als auch in das Argument einsetzt, setzt $\mathbf {C}$ diesen nur in den Applikanten und $\mathbf {B}$ nur in das Argument ein.

### Umgekehrte Transformation

Die Transformation $L[~]$ von CL-Termen in Lambda-Terme ist denkbar einfach, da wir im Lambda-Kalkül alle Möglichkeiten haben, die auch in der CL zur Verfügung stehen:
    $L[{\mathbf {I} }]=\lambda x.x$
    $L[{\mathbf {K} }]=\lambda x.\lambda y.x$
    $L[{\mathbf {C} }]=\lambda x.\lambda y.\lambda z.(x~z~y)$
    $L[{\mathbf {B} }]=\lambda x.\lambda y.\lambda z.(x~(y~z))$
    $L[{\mathbf {S} }]=\lambda x.\lambda y.\lambda z.(x~z~(y~z))$
    $L[(E1~E2)]=(L[E1]~L[E2])$
Wichtig ist jedoch zu wissen, dass diese Transformation nicht das Inverse der $T[~]$-Transformation ist, da $T[L[x]]$ zwar extensional gleich $x$ ist, aber der Term dabei nicht zwingend erhalten bleibt.

## Unentscheidbarkeit des kombinatorischen Kalküls

Es ist unentscheidbar, ob ein genereller Kombinator eine Normalform hat, ob zwei Kombinatoren gleich sind usw. Dies ergibt sich schon aus der Ähnlichkeit zum Lambda-Kalkül, aber hier noch einmal ein direkter Beweis:
Der Term
    ${\mathbf {\Omega } }=({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }))$
hat keine Normalform, da er mit drei Schritten wieder zu sich selbst reduziert:
    $({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }))$
       $=({\mathbf {I} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} })~({\mathbf {I} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} })))$
       $=({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~({\mathbf {I} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} })))$
       $=({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }))$
und es keinen anderen Weg geben kann, der den Kombinator kürzer macht.
Sei nun $\mathbf {N}$ ein Kombinator, der auf Normalform testet, so dass
    $({\mathbf {N} }~x)\Rightarrow {\mathbf {T} }$, wenn $x$ eine Normalform hat,
    ${\mathbf {F} }$, andernfalls.
($\mathbf {T}$ und $\mathbf {F}$ sind hier die korrespondierenden Kombinatoren zu $true$ und $false$ aus dem Lambda-Kalkül:
    $true=\lambda x.\lambda y.x={\mathbf {K} }={\mathbf {T} }$
    $false=\lambda x.\lambda y.y=({\mathbf {K} }~{\mathbf {I} })={\mathbf {F} }$)
Sei nun
    $Z=({\mathbf {C} }~({\mathbf {C} }~({\mathbf {B} }~{\mathbf {N} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }))~{\mathbf {\Omega } })~{\mathbf {I} })$
Untersuchen wir den Term $({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)$. Hat $({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)$ eine Normalform? Falls ja, müssen auch die folgenden Ableitungen eine Normalform haben:
    $({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)$
       $=({\mathbf {I} }~Z~({\mathbf {I} }~Z))$
       $=(Z~({\mathbf {I} }~Z))$
       $=(Z~Z)$
       $=({\mathbf {C} }~({\mathbf {C} }~({\mathbf {B} }~{\mathbf {N} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }))~{\mathbf {\Omega } })~{\mathbf {I} }~Z)$ (Definition von $Z$)
       $=({\mathbf {C} }~({\mathbf {B} }~{\mathbf {N} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }))~{\mathbf {\Omega } }~Z~{\mathbf {I} })$
       $=({\mathbf {B} }~{\mathbf {N} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} })~Z~{\mathbf {\Omega } }~{\mathbf {I} })$
       $=({\mathbf {N} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)~{\mathbf {\Omega } }~{\mathbf {I} })$
Nun wenden wir $\mathbf {N}$ auf $({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)$ an. Entweder hat $({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)$ eine Normalform oder nicht.
Wenn ja, dann wäre:
    $({\mathbf {N} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)~{\mathbf {\Omega } }~{\mathbf {I} })$
       $=({\mathbf {K} }~{\mathbf {\Omega } }~{\mathbf {I} })$ (Definition von $N$)
       $={\mathbf {\Omega } }$
aber $\mathbf {\Omega }$ hat keine Normalform. $\mathbf {\Omega }$ haben wir durch Ableitungen aus $({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)$ erhalten, also hat auch $({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)$ keine Normalform. Dies ist ein Widerspruch.
Falls $({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)$ keine Normalform hat, reduziert sich der Term folgendermaßen:
    $({\mathbf {N} }~({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)~{\mathbf {\Omega } }~{\mathbf {I} })$
       $=({\mathbf {K} }~{\mathbf {I} }~{\mathbf {\Omega } }~{\mathbf {I} })$ (Definition von $\mathbf {N}$)
       $=({\mathbf {I} }~{\mathbf {I} })$
       $={\mathbf {I} }$
was bedeutet, dass $({\mathbf {S} }~{\mathbf {I} }~{\mathbf {I} }~Z)$ als Normalform einfach $\mathbf {I}$ hat, also wieder ein Widerspruch. Daher kann es keinen solchen Kombinator $\mathbf {N}$ geben.

## Anwendungsgebiete
### Übersetzung funktionaler Programmiersprachen

Funktionale Programmiersprachen basieren häufig auf der einfachen, aber universellen Semantik des Lambda-Kalküls.
David Turner benutzte CL für die Sprache SASL.

## Quellen

* „Über die Bausteine der mathematischen Logik“, Moses Schönfinkel, 1924, übersetzt als „On the Building Blocks of Mathematical Logic“ in From Frege to Gödel: a source book in mathematical logic, 1879–1931, ed. Jean van Heijenoort, Harvard University Press, 1977. ISBN 0-674-32449-8 – Die Originalpublikation über kombinatorische Logik.
* Combinatory Logic. Curry, Haskell B. et al., North-Holland, 1972. ISBN 0-7204-2208-6 – Eine umfassende Übersicht der CL, inklusive der historischen Umrisse.
* Functional Programming. Field, Anthony J. and Peter G. Harrison. Addison-Wesley, 1998. ISBN 0-201-19249-7
* „Foundations of Functional Programming“ (GZIP; 105 kB). Lawrence C. Paulson. University of Cambridge, 1995.
* „Lectures on the Curry-Howard Isomorphism“. Sørensen, Morten Heine B. and Pawel Urzyczyn. University of Copenhagen and University of Warsaw, 1998.
* „Principal Type-Schemes and Condensed Detachment“, Hindley and Meredith, Journal of Symbolic Logic (JSL), Volume 55 (1990), Number 1, pages 90–105