Ich weiß nicht, wo ich diese Frage sonst stellen soll, ich hoffe, das ist ein guter Ort.
Ich bin nur neugierig zu wissen, ob es möglich ist, einen Lambda-Kalkülgenerator herzustellen. Im Wesentlichen eine Schleife, die bei unendlicher Zeit jede mögliche Lambda-Kalkülfunktion erzeugt. (wie in Form einer Zeichenfolge).
Da der Lambda-Kalkül so einfach ist und nur wenige Elemente in seiner Notation enthält, dachte ich, dass es möglich (wenn auch nicht sehr nützlich) sein könnte, alle möglichen Kombinationen dieser Notationselemente zu erzeugen, beginnend mit den einfachsten Kombinationen, und dadurch jedes mögliche Lambda zu erzeugen Kalkülfunktion.
Natürlich weiß ich fast nichts über Lambda-Kalkül, daher habe ich keine Ahnung, ob dies wirklich möglich ist.
Ist es? Wenn ja, ist es ziemlich einfach, wie ich es mir vorgestellt habe, oder ist es technisch möglich, aber so schwierig, dass es praktisch unmöglich ist?
PS. Ich spreche nicht von Beta-reduzierten Funktionen, ich spreche nur von jeder gültigen Notation jeder Lambda-Kalkülfunktion.
quelle
if n%2==0 ...
Ja. Nehmen Sie etwas, das alle möglichen ASCII-Zeichenfolgen auflistet. Überprüfen Sie für jede Ausgabe, ob es sich um eine gültige Lambda-Kalkülsyntax handelt, die eine Funktion definiert. Wenn nicht, überspringen Sie es. (Diese Überprüfung kann durchgeführt werden.) Damit werden alle Lambda-Kalkülfunktionen aufgelistet.
quelle
Wie bereits erwähnt, werden hier nur Begriffe aus einer kontextfreien Sprache aufgezählt, die definitiv machbar sind. Dahinter steckt jedoch eine interessantere Mathematik, die sich mit der anlytischen Kombinatorik befasst.
Das Papier Zählen und Generieren von Begriffen in der binären Lambda-Rechnung enthält eine Behandlung des Aufzählungsproblems und vieles mehr. Zur Vereinfachung verwenden sie den so genannten binären Lambda-Calulus , bei dem es sich lediglich um eine Codierung von Lambda-Begriffen mit De Bruijn-Indizes handelt , sodass Sie keine Variablen benennen müssen.
Dieses Papier enthält auch konkreten Haskell-Code, der den Generierungsalgorithmus implementiert. Es ist definitiv effektiv möglich.
Ich habe zufällig eine Implementierung ihres Ansatzes in Julia geschrieben.
quelle
Sicher. Wir können sie direkt gemäß der Definition von Lambda-Begriffen erzeugen.
In Haskell definieren wir zuerst den Typ,
und dann mit
wir zählen sie nur auf, wie z
Schauen Sie, der berühmte Begriff ist dort nicht weit von oben!Ω=(λx.xx)(λx.xx)
fjoin
entspricht Omega Monade ‚sdiagonal
.quelle
Ich bin online auf ein Tool gestoßen, das Beispielzeichenfolgen aus einem regulären Ausdruck generieren kann: https://www.browserling.com/tools/text-from-regex . Sie können viele Beispiel-Lambda-Begriffe generieren, indem Sie Folgendes eingeben:
Um Begriffe mit beliebigen Verschachtelungsebenen zu erhalten, müssen Sie natürlich eine kontextfreie Grammatik verwenden, die ein aussagekräftigeres Werkzeug zum Definieren einer Sprache darstellt als ein regulärer Ausdruck. Ich bin nicht auf ein vorhandenes Tool zum Generieren von Beispielsprachensätzen gestoßen, das auf einer kontextfreien Grammatikdefinition basiert, aber es gibt keinen Grund, warum man keine erstellen könnte.
quelle