Kombinationslogik

Kombinationslogik ist eine Notation, um die Notwendigkeit zu beseitigen quantifiziert Variablen in Mathematische Logik. Es wurde von vorgestellt von Moses Schönfinkel[1] und Haskell Curry,[2] und wurde in jüngerer Zeit in verwendet Informatik als theoretische Berechnungsmodell und auch als Grundlage für die Gestaltung von Funktionale Programmiersprachen. Es basiert auf Kombinatoren die von vorgestellt wurden durch Schönfinkel 1920 mit der Idee, eine analoge Möglichkeit zu bieten, Funktionen aufzubauen und Variablen zu entfernen - insbesondere in Prädikatlogik. Ein Kombinator ist ein Funktion höherer Ordnung Das benutzt nur Funktionsanwendung und früher definierte Kombinatoren, um ein Ergebnis aus seinen Argumenten zu definieren.

In Mathematik

Die Kombinationslogik war ursprünglich als "prä-logisch" gedacht, die die Rolle von klarstellen würde Quantifizierte Variablen in der Logik, im Wesentlichen durch Eliminieren. Eine andere Möglichkeit, quantifizierte Variablen zu eliminieren, ist Quine's Prädikatfunk -Logik. Während Ausdruckskraft von kombinatorischer Logik übersteigt typischerweise die von Logik erster Ordnung, die ausdrucksstarke Kraft von Prädikatfunk -Logik ist identisch mit der der Ersten Ordnung (Logik erster Ordnung (Quine 1960, 1966, 1976).

Der ursprüngliche Erfinder der Kombinationslogik, Moses Schönfinkel, veröffentlichte nach seinem ursprünglichen Papier von 1924 nichts über kombinatorische Logik. Haskell Curry entdeckte die Kombinatoren wieder, während er als Ausbilder bei arbeitete Princeton Universität Ende 1927.[3] In den späten 1930er Jahren, Alonzo -Kirche und seine Schüler von Princeton erfanden einen konkurrierenden Formalismus zur funktionalen Abstraktion, die Lambda -Kalkül, was sich als beliebter als kombinatorische Logik erwies. Das Ergebnis dieser historischen Eventualitäten war, dass fast alle Arbeit Haskell Curry und seine Schüler oder von Robert Feys in Belgien. Curry und Feys (1958) und Curry et al. (1972) Umfrage Die frühe Geschichte der Kombinationslogik. Für eine modernere Behandlung der kombinatorischen Logik und des Lambda -Kalküls siehe das Buch von Barendregt,[4] welches die überprüft Modelle Dana Scott In den 1960er und 1970er Jahren für kombinatorische Logik entwickelt.

Im Computer

Im InformatikKombinationslogik wird als vereinfachtes Modell von verwendet Berechnung, benutzt in Computerbarkeitstheorie und Beweistheorie. Trotz seiner Einfachheit erfasst die Kombinationslogik viele wesentliche Merkmale der Berechnung.

Kombinationslogik kann als Variante der angesehen werden Lambda -Kalkül, in denen Lambda -Ausdrücke (dargestellt funktionelle Abstraktion) durch einen begrenzten Satz von ersetzt werden Kombinatoren, primitive Funktionen ohne freie Variablen. Es ist leicht, Lambda -Ausdrücke in Kombinatorausdrücke zu verwandeln, und die Verringerung der Kombinator ist viel einfacher als die Lambda -Reduktion. Daher wurde die Kombinationslogik verwendet, um einige zu modellieren Nicht-Strikt Funktionelle Programmierung Sprachen und Hardware-. Die reinste Form dieser Ansicht ist die Programmiersprache Unambda, deren alleinige Primitive die S- und K -Kombinators sind, die mit Zeicheneingang/Ausgang erweitert werden. Obwohl Unambda keine praktische Programmiersprache hat, ist es von einem theoretischen Interesse.

Kombinationslogik kann eine Vielzahl von Interpretationen erhalten. Viele frühe Papiere von Curry zeigten, wie man Axiom -Sets für herkömmliche Logik in kombinatorische Logikgleichungen übersetzt (Hindley und Meredith 1990). Dana Scott In den 1960er und 1970er Jahren zeigten, wie man heiratet Modelltheorie und Kombinationslogik.

Zusammenfassung des Lambda -Kalküls

Lambda Calculus befasst sich mit Objekten, die genannt werden Lambda, die durch die folgenden drei Formen von Strings dargestellt werden können:

wo ist ein variabler Name, der aus einem vordefinierten unendlichen Satz von variablen Namen stammt, und und sind lambda-terms.

Bedingungen der Form werden genannt Abstraktionen. Die Variable v wird genannt formaler Parameter der Abstraktion und ist der Karosserie der Abstraktion. Der Begriff repräsentiert die Funktion, die, die auf ein Argument angewendet wird, den formalen Parameter bindet v zum Argument und berechnet dann den resultierenden Wert von - Das heißt, es kehrt zurück mit jedem Auftreten von v ersetzt durch das Argument.

Bedingungen der Form werden genannt Anwendungen. Aufruf oder Ausführung von Anwendungsmodellfunktionen: Die Funktion wird durch dargestellt ist aufgerufen zu werden, mit als Argument, und das Ergebnis wird berechnet. Wenn (manchmal genannt das Applicand) ist eine Abstraktion, der Begriff kann seinreduziert: , das Argument, kann in den Körper von durchgesetzt werden anstelle des formalen Parameters von und das Ergebnis ist ein neuer Lambda -Begriff, der ist Äquivalent zum alten. Wenn ein Lambda -Term keine Teiler der Form enthält dann kann es nicht reduziert werden und soll in sein Normale Form.

Der Ausdruck repräsentiert das Ergebnis der Begriff E und alle freien Ereignisse von ersetzen v darin mit a. So schreiben wir

Durch Konvention nehmen wir als Abkürzung für (d. h. Anwendung ist links assoziativ).

Die Motivation für diese Definition der Reduktion besteht darin, dass sie das wesentliche Verhalten aller mathematischen Funktionen erfasst. Betrachten Sie beispielsweise die Funktion, die das Quadrat einer Zahl berechnet. Wir könnten schreiben

Das Quadrat von x ist

(Verwenden ""Um Multiplikation anzuzeigen.) x Hier ist der formaler Parameter der Funktion. Um das Quadrat für ein bestimmtes Argument zu bewerten, sagen wir es 3, setzen wir es anstelle des formalen Parameters in die Definition ein:

Das Quadrat von 3 ist

Um den daraus resultierenden Ausdruck zu bewerten Wir müssten unser Wissen über die Multiplikation und die Zahl 3. zurückgreifen. Da jede Berechnung lediglich eine Zusammensetzung der Bewertung geeigneter Funktionen zu geeigneten primitiven Argumenten ist, reicht dieses einfache Substitutionsprinzip aus, um den wesentlichen Mechanismus der Berechnung zu erfassen. Darüber hinaus in Lambda -Kalkül, Vorstellungen wie '3' und ''kann ohne extern definierte primitive Operatoren oder Konstanten dargestellt werden. Es ist möglich, Begriffe in Lambda Calculus zu identifizieren, die, wenn sie angemessen interpretiert werden, wie die Nummer 3 und den Multiplikationsoperator q.v. Kirchenkodierung.

Es ist bekannt, dass Lambda -Kalkül in Bezug Turing -Maschinen); Das heißt, jede Berechnung, die in einem dieser anderen Modelle erreicht werden kann, kann in Lambda -Kalkül und umgekehrt ausgedrückt werden. Laut dem These der KircheBeide Modelle können jede mögliche Berechnung ausdrücken.

Es ist vielleicht überraschend, dass Lambda-Calculus jede denkbare Berechnung darstellen kann, die nur die einfachen Funktionen der Funktionsabstraktion und Anwendung basierend auf der einfachen textuellen Substitution von Begriffen für Variablen anhand der einfachen textuellen Ersatzbegriffe darstellen kann. Noch bemerkenswerter ist jedoch, dass eine Abstraktion nicht einmal erforderlich ist. Kombinationslogik ist ein Modell des Berechnungsmittels, der dem Lambda -Kalkül entspricht, jedoch ohne Abstraktion. Der Vorteil davon ist, dass die Bewertung der Ausdrücke im Lambda -Kalkül sehr kompliziert ist, da die Substitutionssemantik mit großer Sorgfalt spezifiziert werden muss, um variable Erfassungsprobleme zu vermeiden. Im Gegensatz dazu ist die Bewertung der Ausdrücke in der kombinatorischen Logik viel einfacher, da es keinen Substitutionsbegriff gibt.

Kombinatorische Berechnung

Da die Abstraktion die einzige Möglichkeit ist, Funktionen im Lambda -Kalkül herzustellen, muss etwas sie im kombinatorischen Kalkül ersetzen. Anstelle von Abstraktion liefert Kombinationsrechnung eine begrenzte Reihe von primitiven Funktionen, aus denen andere Funktionen erstellt werden können.

Kombinatorische Begriffe

Ein kombinatorischer Begriff hat eine der folgenden Formen:

Syntax Name Beschreibung
x Variable Ein Zeichen oder eine Zeichenfolge, die einen kombinatorischen Begriff darstellt.
P Primitive Funktion Eines der Kombinatorsymbole I, K, S.
(M n) Anwendung Anwendung einer Funktion auf ein Argument. M und N sind kombinatorische Begriffe.

Die primitiven Funktionen sind Kombinatorenoder Funktionen, die, wenn sie als Lambda -Begriffe angesehen werden, nein enthalten freie Variablen.

Um die Notationen zu verkürzen, ist eine allgemeine Konvention das , oder auch bezeichnet den Begriff . Dies ist dieselbe allgemeine Übereinkommen (links-assoziativität) wie bei mehreren Anwendungen im Lambda-Kalkül.

Verringerung der Kombinationslogik

In der Kombinationslogik verfügt jeder primitive Kombinator mit einer Reduktionsregel der Form

(P x1 ... xn) = E

wo E ist ein Begriff, der nur Variablen aus dem Satz erwähnt {x1 ... xn}. Auf diese Weise verhalten sich primitive Kombinatoren als Funktionen.

Beispiele für Kombinatoren

Das einfachste Beispiel eines Kombinators ist I, der Identitätskombinator, definiert durch

(I x) = x

für alle Begriffe x. Ein weiterer einfacher Kombinator ist K, die ständige Funktionen erzeugt: (K x) ist die Funktion, die für jedes Argument zurückgibt xAlso sagen wir

((K x) y) = x

für alle Begriffe x und y. Oder nach der Übereinkommen für mehrere Anwendungen,

(K x y) = x

Ein dritter Kombinator ist S, was eine verallgemeinerte Version der Anwendung ist:

(S x y z) = ((x z (y z))

S gilt x zu y nach dem ersten Ersatz z in jeden von ihnen. Oder einen anderen Weg, wie x wird angewendet auf y Innerhalb der Umgebung z.

Gegeben S und K, I selbst ist unnötig, da es aus den anderen beiden gebaut werden kann:

((S k k) x))
= (S k k x)
= (K x (K x))
= x

für jede Begriff x. Beachten Sie zwar ((((S k k))x) = ((I x) für jeden x, (S k k) selbst ist nicht gleich zu I. Wir sagen, die Begriffe sind Erweitert gleich. Die Erweiterungsgleichheit erfasst den mathematischen Begriff der Gleichheit der Funktionen: zwei Funktionen sind gleich Wenn sie immer die gleichen Ergebnisse für die gleichen Argumente erzielen. Im Gegensatz dazu erfassen die Begriffe selbst zusammen mit der Verringerung der primitiven Kombinatoren den Begriff vonintensionale Gleichheit von Funktionen: dass zwei Funktionen sind gleich Nur wenn sie identische Implementierungen haben bis zu Die Expansion primitiver Kombinatoren. Es gibt viele Möglichkeiten, eine Identitätsfunktion zu implementieren. (S k k) und I sind unter diesen Wegen. (S k s) ist noch ein anderer. Wir werden das Wort verwenden Äquivalent Um die Erweiterungsgleichheit anzuzeigen, reservieren gleich für identische kombinatorische Begriffe.

Ein interessanterer Kombinator ist der Fixpunktkombinator oder Y Kombinator, mit dem die Implementierung verwendet werden kann Rekursion.

Vollständigkeit der S-K-Basis

S und K kann zusammengesetzt werden, um Kombinatoren zu produzieren, die erweitert gleich sind irgendein Lambda -Begriff und damit durch die These der Kirche zu jeder rechenbaren Funktion. Der Beweis ist, eine Transformation vorzustellen, T[], Das einen willkürlichen Lambda -Term in einen äquivalenten Kombinator umwandelt.

T[] Kann wie folgt definiert werden:

  1. T[x] => x
  2. T[(EE₂)] => (T[E₁] T[E₂])
  3. T[λx.E] => (K T[E]) (wenn x tritt nicht frei in E)
  4. T[λx.x] => I
  5. T[λx.λy.E] => T[λx.T[λy.E]] (wenn x tritt frei in E)
  6. T[λx. (EE₂)] => (S T[λx.E₁] T[λx.E₂]) (wenn x tritt frei in E₁ oder E₂)

Beachten Sie, dass T[] Wie angegeben ist keine gut typische mathematische Funktion, sondern vielmehr ein Begriff Rewriter: Obwohl es schließlich einen Kombinator liefert, kann die Transformation zwischen den Vermittlungsausdrücken erzeugen, die weder Lambda-Begriffe noch Kombinatoren über Regel (5) sind.

Dieser Prozess ist auch als bekannt als Abstraktionsentscheidung. Diese Definition ist erschöpfend: Jeder Lambda -Ausdruck unterliegt genau einer dieser Regeln (siehe Zusammenfassung des Lambda -Kalküls Oben).

Es hängt mit dem Prozess von zusammen Klammerabstraktion, was einen Ausdruck nimmt E Erstellt aus Variablen und Anwendung und erzeugt einen Kombinatorausdruck [x] e, in dem die Variable x nicht frei ist, so dass [x]Ex = E hält. Ein sehr einfacher Algorithmus für die Abstraktion der Klammer wird durch Induktion auf der Struktur von Ausdrücken wie folgt definiert:[5]

  1. [x]y: = K y
  2. [x]x: = I
  3. [x] (E₁ E₂): = S[x]E₁) ([x]E₂)

Die Abstraktion der Klammer induziert eine Übersetzung von Lambda-Termen zu Kombinatorausdrücken, indem Lambda-Abbindungen unter Verwendung des Bracket-Abstraktionsalgorithmus interpretiert werden.

Umwandlung eines Lambda -Terms in einen äquivalenten kombinatorischen Term

Zum Beispiel werden wir den Lambda -Term konvertieren λx.λy. (y x) zu einem kombinatorischen Begriff:

T[λx.λy. (y x)]
= T[λx.T[λy. (y x)]] (bis 5)
= T[λx. (S T[λy.y] T[λy.x])] (bis 6)
= T[λx. (S i T[λy.x])] (von 4)
= T[λx. (S i (K T[x]))]] (von 3)
= T[λx. (S i (K x))] (durch 1)
= (S T[λx. (S i)] T[λx. (K x)]) (bis 6)
= (S (K (S i)) T[λx. (K x)]) (durch 3)
= (S (K (S i)) (S T[λx.K] T[λx.x])) (bis 6)
= (S (K (S i)) (S (K k k) T[λx.x])) (durch 3)
= (S (K (S i)) (S (K k k) I)) (von 4)

Wenn wir diesen kombinatorischen Begriff auf zwei beliebige Begriffe anwenden x und y (Indem Sie sie in einer Warteschlangengefühle von rechts in den Kombinator füttern), nimmt dies wie folgt ab:

(S (K (S I)) (S (K K) I) x y)
= (K (S I) x (S (K K) I x) y)
= (S I (S (K K) I x) y)
= (I y (S (K K) I x y))
= (y ((S (K K) I x y))
= (y ((K K x (I x) y)))
= (y ((K (I x) y)))
= (y ((I x))
= (y x)

Die kombinatorische Darstellung, (S (K (S i)) (S (K k k) I)) ist viel länger als die Darstellung als Lambda -Begriff, λx.λy. (y x). Dies ist typisch. Im Allgemeinen die T[] Die Konstruktion kann eine Lambda -Länge erweitern n zu einem kombinatorischen LängebegriffΘ(n3).[6]

Erläuterung des T[] Transformation

Das T[] Transformation ist motiviert durch den Wunsch, Abstraktion zu beseitigen. Zwei Sonderfälle, Regeln 3 und 4, sind trivial: λx.x ist eindeutig gleichbedeutend mit I, und λx.E ist eindeutig äquivalent zu (K T[E]) wenn x erscheint nicht kostenlos in E.

Die ersten beiden Regeln sind ebenfalls einfach: Variablen konvertieren auf sich selbst, und Anwendungen, die in kombinatorischen Begriffen zulässig sind, werden in Kombinatoren konvertiert, indem einfach der Applicand und das Argument in Kombinatoren konvertiert werden.

Es sind Regeln 5 und 6, die von Interesse sind. Regel 5 besagt einfach, dass wir zuerst seinen Körper in einen Kombinator umwandeln und dann die Abstraktion beseitigen müssen, um eine komplexe Abstraktion in einen Kombinator umzuwandeln. Regel 6 beseitigt tatsächlich die Abstraktion.

λx. (EE₂) ist eine Funktion, die ein Argument nimmt, sagen wir aund ersetzt es in den Lambda -Begriff (EE₂) anstelle von x, nachgeben (EE₂) [x: = a]. Aber ersetzen a hinein (EE₂) anstelle von x ist genauso wie das Ersetzen in beide E₁ und E₂, so

(EE₂) [x: = a] = ((E₁ [x: = a] E₂ [x: = a]))
(λx. (EE₂) a) = ((((λx.Ea) (λx.Ea))
= (S λx.Eλx.Ea)
= ((((S λx.E₁ λx.E₂) a)

Nach Extensionalgleichheit,

λx. (EE₂) = (S λx.Eλx.E₂)

Daher einen Kombinator zu finden, der gleich äquivalent zu finden ist λx. (EE₂) Es reicht aus, einen Kombinator zu finden, der äquivalent zu ((S λx.Eλx.E₂) und

(S T[λx.E₁] T[λx.E₂])

Offensichtlich passt die Rechnung. E₁ und E₂ jeweils streng weniger Anwendungen als ((EE₂), so dass die Reursion in einem Lambda -Term ohne Anwendungen enden muss - entweder eine Variable oder einen Begriff des Formulars λx.E.

Vereinfachungen der Transformation

η-Reduktion

Die von der erzeugten Kombinatoren T[] Transformation kann kleiner gemacht werden, wenn wir die berücksichtigen η-Reduktion Regel:

T[λx. (E x)] = T[E] (wenn x ist nicht frei in E)

λx. (E x) ist die Funktion, die ein Argument nimmt, xund wendet die Funktion an E dazu; Dies entspricht erweitert der Funktion E selbst. Es reicht daher aus, um sich umzuwandeln E kombinatorische Form.

Unter Berücksichtigung dieser Vereinfachung wird das obige Beispiel:

  T[λx.λy. (y x)]
= ...
= (S (K (S i)) T[λx. (K x)]))
= (S (K (S i)) K) (durch η-Reduktion)

Dieser Kombinator entspricht dem früheren, längeren:

(S (K (S i)) K x y)
= (K (S i) x (K x) y)
= (S i (K x) y)
= (I y (K x y))
= (y (K x y))
= (y x)

In ähnlicher Weise die Originalversion der T[] Transformation transformierte die Identitätsfunktion λf.λx. (f x) hinein (S (S (K s) (S (K k k) I)) (K i)). Mit der η-Reduktionsregel, λf.λx. (f x) wird in transformiert in I.

Ein-Punkte-Basis

Es gibt ein Punkte-Basen, von denen jeder Kombinator ausgeht werden kann irgendein Lambda -Begriff. Das einfachste Beispiel für eine solche Grundlage ist {X} wo:

Xλx.((xS)K)

Es ist nicht schwer zu überprüfen, dass:

X (X (X X)) =β K und
X (X (X (X X))) =β S.

Seit {K, S} ist eine Basis, darunter {{X} ist auch eine Grundlage. Das Jota Programmiersprache verwendet X als alleiniger Kombinator.

Ein weiteres einfaches Beispiel für eine Punktbasis ist:

X'λx.(x K S K) mit
(X' X') X' =β K und
X' (X' X') =β S

Tatsächlich gibt es unendlich viele solcher Basen.[7]

Kombinators B, C.

Zusätzlich zu S und K, SchönfinkelDas Papier enthielt zwei Kombinatoren, die jetzt genannt werden B und C, mit den folgenden Reduktionen:

(C f g x) = ((((f x) g)
(B f g x) = ((f (g x))

Er erklärt auch, wie sie wiederum mit nur mit Verwendung ausgedrückt werden können S und K:

B = (S (K s) K)
C = (S (S (K (S (K s) K)) S) (K k k))

Diese Kombinatoren sind äußerst nützlich, wenn sie Prädikatlogik oder Lambda -Kalkül in Kombinatorausdrücke übersetzen. Sie wurden auch von benutzt von Curryund viel später von David Turner, dessen Name mit ihrer rechnerischen Verwendung in Verbindung gebracht wurde. Mit ihnen können wir die Regeln für die Transformation wie folgt erweitern:

  1. T[x] ⇒ x
  2. T[(E₁ E₂)] ⇒ (T[E₁] T[E₂]))
  3. T[λx.E] ⇒ (K T[E]) (wenn x ist nicht frei in E)
  4. T[λx.x] ⇒ I
  5. T[λx.λy.E] ⇒ T[λx.T[λy.E]] (wenn x ist frei in E)
  6. T[λx. (E₁ E₂)] ⇒ (S T[λx.E₁] T[λx.E₂]) (wenn x ist in beiden frei E₁ und E₂)
  7. T[λx. (E₁ E₂)] ⇒ (C T[λx.E₁] T[E₂]) (wenn x ist frei in E₁ aber nicht E₂)
  8. T[λx. (E₁ E₂)] ⇒ (B T[E₁] T[λx.E₂]) (wenn x ist frei in E₂ aber nicht E₁)

Verwendung B und C Kombinators, die Transformation vonλx.λy. (y x) sieht aus wie das:

   T[λx.λy. (y x)]
= T[λx.T[λy. (y x)]]]
= T[λx. (C T[λy.y] x)] (nach Regel 7)
= T[λx. (C I x)]
= (C I) (η-Reduktion)
= (Traditionelle kanonische Notation: )
= (Traditionelle kanonische Notation: )

Und in der Tat, (C I x y) reduziert sich auf (y x):

(C I x y)
= (I y x)
= (y x)

Die Motivation hier ist das B und C sind begrenzte Versionen von S. Wohingegen S Nimmt einen Wert ein und ersetzt ihn sowohl in den Applicand als auch in sein Argument, bevor er die Anwendung ausführt. C führt den Substitution nur im Applicand aus, und B Nur im Argument.

Die modernen Namen für die Kombinatoren kommen von Haskell Curry's Doktorarbeit von 1930 (siehe B, C, K, W System). Im SchönfinkelDas Originalpapier, was wir jetzt nennen S, K, I, B und C wurden genannt S, C, I, Z, und T beziehungsweise.

Die Verringerung der Kombinatorgröße, die sich aus den neuen Transformationsregeln ergibt, kann auch ohne Einführung erreicht werden B und C, wie in Abschnitt 3.2 von.[8]

ClK gegen ClI Infinitesimalrechnung

Es muss eine Unterscheidung zwischen den gemacht werden ClK Wie in diesem Artikel und der beschrieben ClI Infinitesimalrechnung. Die Unterscheidung entspricht der zwischen λK und das λI Infinitesimalrechnung. Im Gegensatz zum λK Kalkül, das λI Kalkül beschränkt die Abstraktionen auf:

λx.E wo x hat mindestens ein freies Ereignis in E.

Infolgedessen Kombinator K ist im λ nicht vorhandenI Kalkül oder in der ClI Infinitesimalrechnung. Die Konstanten von ClI sind: I, B, C und S, die eine Grundlage bilden, von der alle ClI Begriffe können komponiert werden (Modulo -Gleichheit). Jedes λI Der Term kann in eine gleiche Umgebung umgewandelt werden ClI Kombinator nach Regeln ähnlich denen, die oben für die Umwandlung von λ vorgestellt wurdenK Begriffe in ClK Kombinatoren. Siehe Kapitel 9 in Barendregt (1984).

Rückwärtsumwandlung

Die Umwandlung L[] Von kombinatorischen Begriffen bis hin zu Lambda ist trivial:

L[I] = λx.x
L[K] = λx.λy.x
L[C] = λx.λy.λz. (x z y)
L[B] = λx.λy.λz. (x (y z))
L[S] = λx.λy.λz. (x z (y z))
L[(E₁ E₂)] = (L[E₁] L[E₂]))

Beachten Sie jedoch, dass diese Transformation nicht die inverse Transformation einer der Versionen von ist T[] Das haben wir gesehen.

Unentschlossenheit des kombinatorischen Kalküls

A Normale Form ist ein kombinatorischer Begriff, bei dem die primitiven Kombinatoren, die auftreten, nicht auf genügend Argumente angewendet werden, um vereinfacht zu werden. Es ist unentscheidbar, ob ein allgemeiner kombinatorischer Term eine normale Form hat. Ob zwei kombinatorische Begriffe äquivalent sind usw. Dies entspricht der Unentschlossenheit der entsprechenden Probleme für Lambda -Begriffe. Ein direkter Beweis ist jedoch wie folgt:

Erstens der Begriff

Ω = (S I I (S I I))

hat keine normale Form, weil sie sich nach drei Schritten auf sich selbst reduziert, wie folgt:

   (S I I (S I I))
= (I (S I I) (I (S I I)))
= (S I I (I (S I I)))
= (S I I (S I I))

Und eindeutig kann keine andere Reduktionsreihenfolge den Ausdruck kürzer machen.

Nehmen wir nun an N waren ein Kombinator zur Erkennung normaler Formen, so dass

(Wo T und F die konventionelle darstellen Kirchenkodierungen von wahr und falsch, λx.λy.x und λx.λy.y, in kombinatorische Logik umgewandelt. Die Kombinationsversionen haben T = K und F = (K I).))

Nun lass

Z = (C (C (B N (S I I)) Ω) I)

Betrachten Sie nun den Begriff (S I I Z). Tut (S I I Z) eine normale Form haben? Dies tut es nur dann, wenn das folgende auch folgt:

   (S I I Z)
= (I Z (I Z))
= (Z (I Z))
= (Z Z)
= (C (C (B N (S I I)) Ω) I Z) (Definition von Z)
= (C (B N (S I I)) Ω Z I)
= (B N (S I I) Z Ω I)
= (N (S I I Z) Ω I)

Jetzt müssen wir uns bewerben N zu (S I I Z). Entweder (S I I Z) hat eine normale Form oder nicht. Wenn es tut Haben Sie eine normale Form, dann verringert sich der Vorstehende wie folgt:

   (N (S I I Z) Ω I)
= (K Ω I) (Definition von N)
= Ω

aber Ω tut nicht Haben Sie eine normale Form, also haben wir einen Widerspruch. Doch wenn (S I I Z) tut nicht Haben Sie eine normale Form, der Vorstehende nimmt wie folgt ab:

   (N (S I I Z) Ω I)
= (K I Ω I) (Definition von N)
= (I I)
= I

was bedeutet, dass die normale Form von ((S I I Z) ist einfach I, ein weiterer Widerspruch. Daher der hypothetische Normalform-Kombinator N kann nicht existieren.

Das kombinatorische Logikanalogon von Reis Satz sagt, dass es kein vollständiges nicht triviales Prädikat gibt. EIN Prädikat ist ein Kombinator, der bei Anwendung entweder zurückgibt T oder F. Ein Prädikat N ist nicht trivial Wenn es zwei Argumente gibt A und B so dass N A = T und N B = F. Ein Kombinator N ist Komplett wenn NM hat eine normale Form für jedes Argument M. Das Analogon von Rice's Theorem besagt, dass jedes vollständige Prädikat trivial ist. Der Beweis dieses Satzes ist ziemlich einfach.

Nachweisen

Durch Reduktion ad absurdum. Angenommen, es gibt ein vollständiges nicht triviales Prädikat, beispielsweise N. Da N soll nicht trivial sein, es gibt Kombinatoren A und B so dass

(N A) = T und
(N B) = F.
Definieren Sie die Negation ≡ λx.(wenn (N x) dann B anders A) ≡ λx. (((N x) B A)
Definieren Sie Absurdum ≡ (Y NEGATION)

Fixpunkt -Theorem gibt: absurdum = (negation absurdum), für

Absurdum ≡ (Y Negation) = (Negation (Negation (Y Negation)) ≡ (Negation Absurdum).

Da N soll entweder vollständig sein:

  1. (N Absurdum) = F oder
  2. (N Absurdum) = T
  • Fall 1: F = (N Absurdum) = N (Negation absurdum) = (N A) = T, ein Widerspruch.
  • Fall 2: T = (N Absurdum) = N (Negation absurdum) = (N B) = Fwieder ein Widerspruch.

Somit (N Absurdum) ist keiner T Noch F, was der Voraussetzung widerspricht, dass N wäre ein vollständiges nicht triviales Prädikat. Q.E.D.

Aus diesem Unentschiedenheitstheorem folgt unmittelbar, dass es kein vollständiges Prädikat gibt, das zwischen Begriffen mit normaler Form und Begriffen unterscheiden kann, die keine normale Form haben. Daraus folgt, dass es gibt nein Vollständiges Prädikat, sagen Sie gleich, so dass:

(GLEICH A b) = T wenn A = B und
(GLEICH A b) = F wenn AB.

Wenn gleich existieren, dann für alle A, λx.(GLEICH x a) müsste ein vollständiges nicht triviales Prädikat sein.

Anwendungen

Kompilierung der funktionalen Sprachen

David Turner benutzte seine Kombinators, um die implementieren SASL -Programmiersprache.

Kenneth E. Iverson gebrauchte Primitive basierend auf Currys Kombinators in seinen J Programmiersprache, ein Nachfolger zu Apl. Dies ermöglichte das, was Iverson nannte stillschweigende ProgrammierungDas heißt, die Programmierung in funktionellen Ausdrücken, die keine Variablen enthalten, sowie leistungsstarke Tools für die Arbeit mit solchen Programmen. Es stellt sich heraus, dass in jeder APL-ähnlichen Sprache mit benutzerdefinierten Operatoren eine stillschweigende Programmierung möglich ist.[9]

Logik

Das Curry -Howard Isomorphismus impliziert eine Verbindung zwischen Logik und Programmierung: jeder Beweis eines Satzes von intuitionistische Logik entspricht einer Reduzierung eines typisierten Lambda -Terms und umgekehrt. Darüber hinaus können Theoreme mit Funktionstypsignaturen identifiziert werden. Insbesondere entspricht eine typisierte Kombinationslogik a Hilbert -System in Beweistheorie.

Das K und S Kombinatoren entsprechen den Axiomen

AK: A → (BA),
WIE: (A → (BC)) → (((AB) → (AC)),

und Funktionsanwendung entspricht der Ablösungsregel (Modus Ponens)

MP: aus A und AB schließen B.

Der Kalkül, der aus besteht aus AK, WIE, und MP ist vollständig für das implizite Fragment der intuitionistischen Logik, die wie folgt gesehen werden kann. Betrachten Sie den Satz W von allen deduktiv geschlossenen Formeln, die von bestellt wurden Aufnahme. Dann ist eine intuitionistische Kripke -Rahmenund wir definieren ein Modell in diesem Rahmen von

Diese Definition folgt den Bedingungen zur Zufriedenheit von →: einerseits, wenn , und ist so, dass und , dann von modus ponens. Andererseits, wenn , dann bis zum Abzugstheoremsomit die deduktive Schließung von ist ein Element so dass , , und .

Lassen A Seien Sie jede Formel, die im Kalkül nicht nachweisbar ist. Dann A gehört nicht zur deduktiven Schließung X des leeren Satzes also , und A ist nicht intuitionistisch gültig.

Siehe auch

Verweise

  1. ^ Schönfinkel, Moses (1924). "Über Die Baateine ​​der Mathematischen Logik" (PDF). Mathematische Annalen. 92 (3–4): 305–316. doi:10.1007/bf01448013. S2CID 118507515. Übersetzt von Stefan Bauer Mengelberg als "auf den Bausteinen der mathematischen Logik" in Jean van Heijenoort, 1967. Ein Quellbuch in mathematischer Logik, 1879–1931. Harvard Univ. Drücken Sie: 355–66.
  2. ^ Curry, Haskell Brooks (1930). "Grundlagen der Kombinatorischen Logik" [Grundlagen der kombinatorischen Logik]. American Journal of Mathematics (auf Deutsch). Die Johns Hopkins University Press. 52 (3): 509–536. doi:10.2307/2370619. JStor 2370619.
  3. ^ Seldin, Jonathan (2008). "Die Logik von Curry und Kirche" (PDF). {{}}: Journal zitieren erfordert |journal= (Hilfe)
  4. ^ Barendregt 1984.
  5. ^ Turner, David A. (1979). "Ein weiterer Algorithmus für die Abstraktion der Klammer". Das Journal of Symbolic Logic. 44 (2): 267–270. doi:10.2307/2273733. JStor 2273733. S2CID 35835482.
  6. ^ Lachowski, łukasz (2018). "Über die Komplexität der Standardübersetzung von Lambda -Kalkül in die kombinatorische Logik". Berichte über die mathematische Logik. 2018 (53): 19–42. doi:10.4467/20842589rm.18.002.8835. Abgerufen 9. September 2018.
  7. ^ Goldberg, Mayer (2004). "Ein Bau von Ein-Punkte-Basen in erweiterten Lambda-Kalkül". Informationsverarbeitungsbriefe. 89 (6): 281–286. doi:10.1016/j.ipl.2003.12.005.
  8. ^ Tromp, John (2008). "Binärer Lambda -Kalkül und Kombinationslogik" (PDF). In Calude, Cristian S. (Hrsg.). Zufälligkeit und Komplexität von Leibniz bis Chaitin. World Scientific Publishing Company. Archiviert von das Original (PDF) am 2016-03-04.
  9. ^ Cherlin, Edward (1991). "Reine Funktionen in APL und J". Verfahren der Internationalen Konferenz zu APL '91: 88–93. doi:10.1145/114054.114065. ISBN 0897914414. S2CID 25802202.

Weitere Lektüre

Externe Links