Die zugrunde liegende Frage:
Was macht die Lambda-Rechnung für uns, was wir mit den in der Mittelschulalgebra allgemein erlernten Grundfunktionseigenschaften und der Notation nicht anfangen können?
Was bedeutet abstrakt im Zusammenhang mit der Lambda-Rechnung? Mein Verständnis des Wortes abstrakt ist etwas, das von der Maschinerie, der konzeptuellen Zusammenfassung eines Konzepts, getrennt ist.
Lambda-Funktionen verhindern jedoch eine bestimmte Abstraktionsebene, indem sie auf Funktionsnamen verzichten. Beispielsweise:
f(x) = x + 2
h(x, y) = x + 5 y
Aber auch ohne die Maschinerie dieser Funktionen zu definieren, können wir leicht über ihre Zusammensetzung sprechen. Beispielsweise:
1. h(x, y) . f(x) . f(x) . h(x, y) or
2. h . f . f . h
Wir können die Argumente einbeziehen, wenn wir wollen, oder wir können vollständig abstrahieren, um einen Überblick darüber zu geben, was passiert. Und wir können sie schnell auf eine einzige Funktion reduzieren. Schauen wir uns Komposition 2 an. Ich kann Schüler-Detailebenen haben, mit denen ich je nach Schwerpunkt schreiben kann:
g = h . f . f . h
g(x, y) = h(x, y) . f(x) . f(x) . h(x, y)
g(x, y) = h . f . f . h = x + 10 y + 4
Lassen Sie uns das Obige mit Lambda-Kalkül durchführen oder zumindest die Funktionen definieren. Ich bin mir nicht sicher, ob dies richtig ist, aber ich glaube, dass der erste und der zweite Ausdruck um 2 erhöht werden.
(λuv.u(u(uv)))(λwyx.y(wyx))x
Und mit 5y multiplizieren.
(λz.y(5z))
Anstatt abstrakt zu sein, scheint dies in die Maschinerie dessen zu geraten, was es bedeutet, zu addieren, zu multiplizieren usw. Abstraktion bedeutet in meinen Augen eher eine höhere Ebene als eine niedrigere Ebene.
Außerdem kämpfe ich darum, warum Lambda-Kalkül überhaupt eine Sache ist. Was ist der Vorteil von
(λuv.u(u(uv)))(λwyx.y(wyx))x
Über
h(x) = x + 5 y
oder eine kombinierte Notation
Hxy.x+5y
oder sogar Haskells Notation
h x y = x + 5 * y
Wiederum, was macht Lambda-Kalkül für uns, was wir mit den Eigenschaften und der Notation der f (x) -Stil-Funktion, mit denen viele vertraut sind, nicht tun können.
Antworten:
Es gibt viele Gründe, warum die Lambda-Rechnung so wichtig ist.
Ein sehr wichtiger Grund ist, dass die Lambda-Berechnung ein Berechnungsmodell ermöglicht, in dem berechenbare Funktionen erstklassige Bürger sind.
Funktionen höherer Ordnung kann man in der Sprache der Mittelschulalgebra nicht ausdrücken .
Nehmen Sie als Beispiel den Lambda-Ausdruck
Dieser einfache Ausdruck zeigt uns, dass im Lambda-Kalkül die Funktionszusammensetzung selbst eine Funktion ist. In der Mittelschulalgebra ist dies nicht leicht auszudrücken.
Im Lambda-Kalkül ist es sehr einfach auszudrücken, dass eine Funktion als Ergebnis eine Funktion zurückgibt.
Hier ist ein kleines Beispiel. Der Ausdruck (wobei ich hier einen angewandten Lambda-Kalkül mit Additions- und Integer-Konstanten annehme)
reduziert sich auf
Beachten Sie auch, dass im Lambda-Kalkül Funktionen Ausdrücke und keine Definitionen der Form . Dies befreit uns von der Notwendigkeit, Funktionen zu benennen und zwischen einer syntaktischen Kategorie von Ausdrücken und einer syntaktischen Kategorie von Definitionen zu unterscheiden.f( x ) = e
Auch wenn es unmöglich (oder nur notativ umständlich) wird, Funktionen höherer Ordnung auszudrücken, wird man Probleme haben, Ausdrücken Typen zuzuweisen.
Die Funktionszusammensetzung hat den polymorphen Typ
im Hindley-Milner-Typ-System.
Ein sehr starkes Verkaufsargument für den Lambda-Kalkül ist der Begriff des typisierten Lambda-Kalküls . Die verschiedenen Typsysteme für funktionale Programmiersprachen wie Haskell und die ML-Familie basieren auf Typsystemen für Lambda-Kalküle, und diese Typsysteme bieten starke Garantien in Form von mathematischen Theoremen:
Wenn ein Programm gut typisiert ist und sich auf den Rest reduziert , dann ist auch gut typisiert.e e ' e 'e e e′ e′
Und wenn gut getippt ist, zeigt keine bestimmten Fehler.ee e
Besonders hervorzuheben sind die Nachweise als Programmkorrespondenz . Der Curry-Howard-Isomorphismus (siehe zB https://www.rocq.inria.fr/semdoc/Presentations/20150217_PierreMariePedrot.pdf ) zeigt, dass es eine sehr genaue Entsprechung zwischen der einfach typisierten Lambda-Rechnung und der intuitionistischen Aussagenlogik gibt: Zu jeder Art entspricht einer logischen Formel . Ein Proof von entspricht einem Lambda-Term vom Typ , und eine Beta-Reduktion dieses Terms entspricht einer Schnitteliminierung im Proof.ϕ T ϕ T TT ϕT ϕT T
Ich fordere diejenigen, die glauben, dass die Mittelschulalgebra eine gute Alternative zur Lambda-Rechnung ist, auf, einen Bericht über die polymorph getypte Mittelschulalgebra höherer Ordnung zusammen mit einem entsprechenden Begriff des Curry-Howard-Isomorphismus zu entwickeln. Wenn Sie sogar einen interaktiven Proofassistenten auf der Grundlage der Mittelschulalgebra ausarbeiten können, der es uns ermöglicht, die vielen Theoreme zu beweisen, die unter Verwendung von Beweisassistenten auf Lambda-Basis wie Coq und Isabelle formalisiert wurden, ist dies sogar noch besser. Ich würde dann anfangen, Mittelschulalgebra zu verwenden, und so würden sicher viele andere mit mir.
quelle
Wenn Funktionen zum ersten Mal für Jugendliche beschrieben werden, werden sie im Wesentlichen mit Diagrammen (Plots) oder vielleicht mit Formeln identifiziert; Auf diese Weise wurden Funktionen historisch verstanden, bevor formalistische Trends in der Mathematik aufkamen. Heutzutage sind Funktionen, wie sie in der ersten Jahresrechnung gelehrt werden, echte Funktionen, dh Funktionen von bis .RR R
Die Funktionen in der Lambda-Rechnung sind viel allgemeiner. Die genaue Definition hängt davon ab, ob Ihr Lambda-Kalkül typisiert oder nicht typisiert ist. In der reinen untypisierten Lambda-Rechnung ist alles eine Funktion. Dies ist viel allgemeiner als die eigentlichen Funktionen des Kalküls.
Sogar prozedurale Sprachen verwenden manchmal Ideen aus der Lambda-Rechnung. Die Sortierfunktion in C akzeptiert als Parameter eine Vergleichsfunktion , mit der Elemente verglichen werden. Die Lambda-Rechnung geht noch viel weiter - Funktionen akzeptieren Funktionen nicht nur als Eingaben, sondern können sie auch ausgeben.
Die Lambda-Rechnung ist ein Berechnungsmodell, das der Leistung von Turing-Maschinen entspricht. Es ist ein System für sich. In der reinen Lambda-Rechnung gibt es keine "5" oder "+" als Grundbegriffe - sie können innerhalb der Rechnung definiert werden, genau wie "5" und "+" keine Grundbegriffe der Mengenlehre sind. (Praktische Programmiersprachen implementieren natürliche Zahlen aus Gründen der Effizienz.)
Ich vermute, einer der Gründe, warum Sie von Lambda nicht beeindruckt sind, ist, dass seine Ideen den Programmierdiskurs so durchdrungen haben, dass er nicht mehr innovativ aussieht.
quelle
Eine der grundlegenden Ambiguitäten der allgemeinen mathematischen Notation ist, dass manchmal verwendet wird, um eine Zahl zu bezeichnen (das Quadrat der Zahl ), und manchmal verwendet wird, um eine Funktion zu bezeichnen (die Funktion, die das Quadrat ihrer zurückgibt Streit). x x 2x2 x x2
Lambda-Kalkül beseitigt diese Mehrdeutigkeit; Sie können schreiben , um auf die Funktion zu verweisen, was es eindeutig macht, dass auf eine Zahl verweist, wie es sollte.x 2λx.x2 x2
Ja, Sie können den Fluss eines Arguments oder einer Berechnung unterbrechen, indem Sie sagen "Jetzt definiere durch " und dann , aber das wird schnell umständlich. Mit der Lambda-Abstraktion können Sie dies inline tun, ohne eine Unterbrechung vorzunehmen.f ( x ) = x 2 ff f(x)=x2 f
Die Verwendung von Lambda-Ausdrücken in Programmiersprachen hat einen ähnlichen Vorteil. Sie können schreiben, was die Funktion genau dort tut, wo sie benötigt wird, anstatt an anderer Stelle in Ihrem Programm eine ganz neue Funktion definieren zu müssen.
Sie können sogar die in der Mathematik implizite Lambda-Abstraktion sehen; ZB werden die Studenten der Analysis nur in Ableitungen von Funktionen unterrichtet. Um die Leibniz-Notation mit Ableitungen von Funktionen in Einklang zu bringen , können Sie so interpretieren, dass sie implizit eine Lambda-Abstraktion durchführen auf , um es als Funktion zu interpretieren. Sie sind mehr oder weniger gezwungen, dies zu tun, wenn Sie die im ersten Absatz beschriebene Mehrdeutigkeit nicht haben möchten.dddxx2 x2ddx x2
Außerdem fühlen sich Menschen mit funktionsbewerteten Funktionen in traditioneller Notation oft unwohl. zB ist die übliche Abbildung , die einen endlichdimensionalen Vektorraum mit seinem doppelten Dual identifiziert, durch definiertθ:V→V∗∗
Viele Menschen empfinden diese doppelte Bewertungsnotation als verwirrend und / oder beunruhigend sowie die rekursive Verwendung der punktweisen Definition einer Funktion. Die Lambda-Abstraktionsversion
hat dieses Problem nicht.
Schließlich gibt es einen Satz des abstrakten Unsinns, der besagt, dass "einfach typisierte Lambda-Rechnung" im Grunde genommen dasselbe ist wie "kartesische geschlossene Kategorie". Wenn Sie also jemals in einer kartesischen geschlossenen Kategorie rechnen wollen, ist es wahrscheinlich eine gute Idee, ihn zu verwenden tippte einfach Lambda-Kalkül, um dies zu tun.
quelle
Ich sage ganz vorne, ich bin kein Experte für dieses Thema, aber ich habe ein bisschen Zeit damit verbracht, es zu studieren, und eines der faszinierendsten Dinge für mich in jedem Thema ist die Geschichte dahinter. Wenn ich ein bisschen die Geschichte hinter der Lambda-Rechnung verstehe, kann ich erklären, warum sie nützlich ist.
Die kurze Zusammenfassung ist, dass in den frühen 1900er Jahren, nachdem die Mengenlehre zu beginnen begann und die Mathematik auf der Grundlage von Mengen neu gedacht wurde, einige Mathematiker bemerkten, dass eine Mengenlehre-Definition es Ihnen erlaubt, zu behaupten, dass eine bestimmte Struktur existiert, aber nicht sagt, wie um es zu konstruieren und zu berechnen. Mengen-theoretische Definitionen sind also nicht konstruktiv . Mathematiker begannen sich zu fragen, ob es einen Weg gibt, konstruktive Definitionen zu entwickeln , die über den Nachweis hinausgehen, dass etwas ist, und stattdessen beweisen, wie es ist .
Aus Wikipedia :
Turing entwickelte die Turing-Automaten, um die Frage zu beantworten, und Church entwickelte die Lambda-Rechnung, um die Frage zu beantworten. Kleene entwickelte auch eine Methode mit dem Kleene Star , die in reguläre Ausdrücke übernommen wurde, und es gab jemanden (den man nicht ohne weiteres zurückrufen kann), der noch eine andere Methode entwickelte. All dies wurde entwickelt, um ein mathematisches System aufzubauen, das von Anfang an konstruktive Definitionen zulässt.∗
Dann wurde gezeigt, dass Lambda-Kalkül und die Turing-Maschine jede berechenbare Funktion darstellen können und somit äquivalent sind.
Theoretisch kann jede mathematische Funktion oder jedes mathematische Konzept in Form einer Lambda-Rechnung kodiert und berechnet werden. Dies bedeutet, dass die Lambda-Berechnung eine völlig separate, wenn auch offensichtlich äußerst mühsame Grundlage für die Mathematik sein kann.
Lambda-Kalkül ist nicht "nützlich" in dem Sinne, dass Sie keinen Code damit schreiben werden, aber es bildet die Grundlage für die Denotationssemantik, die zur Beschreibung von Programmen und ihren dynamischen Effekten verwendet wird. Dies wird in Diskussionen über Programmkorrektheit und semantische Bedeutung verwendet. Es hat natürlich auch die Entwicklung funktionaler Programmiersprachen stark beeinflusst, die ihr gesamtes Ausführungskonzept aus der Lambda-Rechnung beziehen.
Ich hoffe, das hilft.
Bearbeiten, um hinzuzufügen: Ich wurde gerade auf dieses Papier verwiesen, das die Beziehung zwischen Topologie, Lambda-Kalkül und Physik zeigt. Beim kurzen Überfliegen bin ich auf diese fantastische Aussage gestoßen:
Der Punkt ist, dass die Lambda-Rechnung ein idealisiertes Modell der Software-Berechnung ist und als solches nicht an eine bestimmte Implementierung in irgendeiner Programmiersprache gebunden ist. Es modelliert die reine Berechnung .
quelle
Wie Yuval in den Kommentaren betonte, basiert Haskell auf dem Kalkül. Ein weiterer Grund, warum die Lambda-Rechnung so wichtig ist, ist der Church-Rosser-Satz , der die Existenz einer faulen Bewertung rechtfertigt. (Welches ist eines der vielen coolen Features von Haskell?)λ
quelle
Lambda-Kalkül war nicht als Programmiersprache konzipiert. Tatsächlich wurde es in den 1930er Jahren erstellt, Jahrzehnte bevor wir überhaupt programmierbare Computer hatten. Es wurde vielmehr als formales Modell für das Studium der Berechnung selbst geschaffen. Wenn Sie enttäuscht sind, wie einfach es ist, Code oder mathematische Funktionen auszudrücken, dann ist das nicht das, wofür es ist.
quelle
Lambda-Kalkül existiert, so dass anonyme (alias Lambda) Funktionen erstellt werden können. Wenn Sie die Funktionsnamen nicht weglassen, kann der Namespace überfüllt sein und die verfügbaren Funktionsnamen können knapp werden. Dies ist besonders wichtig, wenn es sich um sogenannte "Funktionen höherer Ordnung" handelt, die aus offensichtlichen Gründen Funktionen (oder Funktionszeiger) zurückgeben.
Im Wesentlichen entsprechen Lambda-Funktionen Variablen mit lokalem Gültigkeitsbereich. Funktionale Programmierung ohne Lambda-Funktionen ist analog zur prozeduralen Programmierung ohne lokale Variablen, dh eine schreckliche Idee.
"Warum Lambda-Kalkül überhaupt eine Sache ist" Mathematiker lieben Redundanz. Lambda-Kalkül wird in der Mathematik selten verwendet, da die Notation, wie Sie festgestellt haben, nicht sehr nützlich ist.
"Wenn Sie sogar einen interaktiven Proofassistenten auf der Grundlage der Mittelschulalgebra ausarbeiten könnten, der es uns ermöglicht, die vielen Sätze zu beweisen, die mit Proofassistenten auf Lambda-Basis wie Coq und Isabelle formalisiert wurden, wäre das noch besser. Ich würde Fangen Sie dann an, die Mittelschulalgebra zu verwenden, und ich bin sicher, dass viele andere mit mir gehen würden. " Hast du von Metamath gehört? Da keine Lambda-Rechnung beteiligt ist, können viele der Coq / Isabelle-Theoreme bewiesen werden
quelle
let
, aber währendlet
es mit anonymen Funktionen codiert werden kann, können Sie eindeutig nicht den anderen Weg gehen. Funktionale Programmierung ist nicht erforderlich „Lambda - Funktionen“, zB Backus' FP oder Sisal .