Ich habe mir den Vortrag von Jim Weirich mit dem Titel " Adventures in Functional Programming " angesehen. In dieser Vorlesung stellt er das Konzept der Y-Kombinatoren vor, die im Wesentlichen den Fixpunkt für Funktionen höherer Ordnung finden.
Eine der Beweggründe, wie er es erwähnt, ist, rekursive Funktionen mit Lambda-Kalkül ausdrücken zu können, damit die Theorie der Kirche (alles, was effektiv berechenbar ist, kann mit Lambda-Kalkül berechnet werden) erhalten bleibt.
Das Problem ist, dass eine Funktion sich nicht einfach so aufrufen kann, weil die Lambda-Rechnung keine benannten Funktionen zulässt, dh
kann den Namen ' ' nicht tragen , er muss anonym definiert werden:
Warum ist es für die Lambda-Rechnung wichtig, Funktionen zu haben, die nicht benannt sind? Welches Prinzip wird verletzt, wenn es benannte Funktionen gibt? Oder habe ich gerade das Video von Jim falsch verstanden?
quelle
Antworten:
Der Hauptsatz zu diesem Thema stammt von einem britischen Mathematiker aus dem Ende des 16. Jahrhunderts, William Shakespeare . Sein bekanntester Aufsatz zu diesem Thema trägt den Titel " Romeo und Julia " und wurde 1597 veröffentlicht, obwohl die Forschungsarbeiten einige Jahre zuvor durchgeführt wurden, inspiriert aber solche Vorläufer wie Arthur Brooke und William Painter.
Sein Hauptergebnis, angegeben in Akt II. Szene II ist der berühmte Satz :
Dieser Satz kann intuitiv als "Namen tragen nicht zur Bedeutung bei" verstanden werden.
Der größte Teil der Arbeit ist einem Beispiel gewidmet, das den Satz ergänzt und zeigt, dass Namen, obwohl sie keine Bedeutung haben, die Ursache für endlose Probleme sind.
Wie Shakespeare betonte, können Namen ohne Änderung der Bedeutung geändert werden. Diese Operation wurde später von Alonzo Church und seinen Anhängern als -Umwandlung bezeichnet . Infolgedessen ist es nicht unbedingt einfach zu bestimmen, was mit einem Namen bezeichnet wird. Dies wirft eine Reihe von Fragen auf, z. B. die Entwicklung eines Umgebungskonzepts, in dem die Namensbedeutungszuordnung angegeben ist, und Regeln, um die aktuelle Umgebung zu ermitteln, wenn Sie versuchen, die mit einem Namen verknüpfte Bedeutung zu bestimmen. Dies verwirrte die Informatiker für eine Weile und führte zu technischen Schwierigkeiten wie dem berüchtigten Funarg-Problemα . In einigen populären Programmiersprachen sind Umgebungen nach wie vor ein Problem, aber es wird allgemein als physikalisch unsicher angesehen, genauer zu sein, fast so tödlich wie das Beispiel, das Shakespeare in seinem Aufsatz herausgearbeitet hat.
Diese Frage steht auch in engem Zusammenhang mit den Problemen, die in der formalen Sprachtheorie aufgeworfen werden, wenn Alphabete und formale Systeme bis zu einem Isomorphismus definiert werden müssen, um zu unterstreichen, dass die Symbole der Alphabete abstrakte Einheiten sind , unabhängig davon, wie sie sich als "materialisieren" Elemente aus einem Satz.
Dieses Hauptergebnis von Shakespeare zeigt auch, dass die Wissenschaft damals von Magie und Religion abwich, wo ein Wesen oder eine Bedeutung einen wahren Namen haben könnte .
Die Schlussfolgerung daraus ist, dass es für theoretische Arbeiten oft bequemer ist, sich nicht von Namen belasten zu lassen, auch wenn es sich für die praktische Arbeit und den Alltag einfacher anfühlt. Aber denken Sie daran, dass nicht jeder, der Mama heißt, Ihre Mutter ist.
Hinweis :
Das Problem wurde in jüngerer Zeit von der amerikanischen Logikerin Gertrude Stein aus dem 20. Jahrhundert angesprochen . Ihre Mathematikerkollegen überlegen sich jedoch immer noch die genauen technischen Implikationen ihres Hauptsatzes :
veröffentlicht 1913 in einer kurzen Mitteilung mit dem Titel "Heilige Emily".
quelle
Ich möchte eine Meinung wagen, die sich von der von @babou und @YuvalFilmus unterscheidet: Es ist wichtig, dass der reine Kalkül anonyme Funktionen hat. Das Problem mit nur benannten Funktionen besteht darin, dass Sie im Voraus wissen müssen, wie viele Namen Sie benötigen. Aber im reinen Kalkül ist die Anzahl der verwendeten Funktionen nicht von vornherein festgelegt (denken Sie an die Rekursion). Sie verwenden also entweder (1) anonyme Funktionen oder (2) Sie gehen den Kalkül-Weg und geben sie an ein Kombinator für neue Namen ( in -calculus), der zur Laufzeit ein unerschöpfliches Angebot an neuen Namen liefert.λ λ π νx . P π
Der Grund, warum der reine Kalkül keinen expliziten Mechanismus für die Rekursion hat, ist, dass der reine Kalkül ursprünglich eine Grundlage der Mathematik von A. Church sein sollte, und die Rekursion macht eine solche Grundlage trivial unsund. So kam es zu einem Schock, als Stephen Kleene und JB Rosser entdeckten, dass reiner Kalk als Grundlage der Mathematik ungeeignet ist ( Kleene-Rosser-Paradoxon ). Haskell Curry analysierte das Kleene-Rosser-Paradoxon und erkannte, dass sein Wesen das ist, was wir heute als Y-Combinator kennen.λ λ λ
Hinzugefügt nach @ babous Kommentar: Es ist nichts Falsches daran, Funktionen benannt zu haben. Sie können dies folgendermaßen tun: ist eine Abkürzung für im Call-by-Value -calculus.l e t f= Min n n ( λ f. N) M λ
quelle
Ich glaube, die Idee ist, dass Namen nicht notwendig sind. Alles, was anscheinend Namen erfordert, kann als anonyme Funktion geschrieben werden.
Sie können sich den Lambda-Kalkül als Assemblersprache vorstellen. Jemand in einem Assembly-Vortrag könnte sagen: "In der Assemblersprache gibt es keine objektorientierten Vererbungsbäume." Sie könnten sich dann eine clevere Möglichkeit überlegen, Vererbungsbäume zu implementieren, aber das ist nicht der Punkt. Der Punkt ist, dass Vererbungsbäume nicht auf der grundlegendsten Ebene der Programmierung eines physischen Computers erforderlich sind.
In der Lambda-Rechnung ist der Punkt, dass Namen nicht erforderlich sind, um einen Algorithmus auf der grundlegendsten Ebene zu beschreiben.
quelle
Ich genieße die drei Antworten hier, insbesondere die Shakespearen-Analyse von @ babou, aber sie geben keinen Aufschluss darüber, was meiner Meinung nach das Wesentliche dieser Frage ist.
λ-calculus bindet Namen an Funktionen, wenn Sie eine Funktion auf eine Funktion anwenden. Das Problem ist nicht der Mangel an Namen.
"Das Problem ist, dass eine Funktion sich nicht einfach selbst aufrufen kann", indem sie auf ihren Namen verweist.
(In Pure Lisp liegt die Bindung name -> function nicht im Gültigkeitsbereich des Funktionskörpers. Damit sich eine Funktion nach ihrem Namen aufruft, muss sich die Funktion auf eine Umgebung beziehen, die sich auf die Funktion bezieht. Pure Lisp hat keine zyklische Datenstrukturen. Unreines Lisp tut dies, indem es die Umgebung mutiert, auf die sich die Funktion bezieht.)
Wie @MartinBerger hervorhob, war der historische Grund, warum sich eine Funktion im λ-Kalkül nicht beim Namen nennen lässt, der Versuch, Currys Paradoxon auszuschließen , wenn man versucht, den λ-Kalkül als Grundlage der Mathematik einschließlich der deduktiven Logik zu verwenden. Dies hat nicht funktioniert, da Techniken wie der Y-Kombinator eine Rekursion auch ohne Selbstreferenz ermöglichen.
Aus Wikipedia:
quelle
λ.x x x
übersetzt in Lisp als(lambda (x) (x x))
und in JavaScript alsfunction (x) {return x(x);}
.x⇒y
bedeutetx implies y
etwa das Gleiche wie(NOT x) OR y
. Siehe en.wikipedia.org/wiki/Lambda_calculus