Towards Bottom-Up Enumeration in miniKanren via Pruning and Memoization
Dieses Paper führt zwei miniKanren-Library-Kombinatoren, `prune` und `defrel/bank`, ein, die eine Bottom-up-Enumeration mit beobachtender Dedupulierung und Memoisierung ermöglichen, um die Performance der relationalen Programmsynthese auf tiefen Zielstrukturen signifikant zu verbessern, während gleichzeitig eine gewichtete Variante vorgeschlagen wird, um Fälle zu adressieren, in denen die kanonische Tiefensuche fehlschlägt, kompakte Repräsentanten zu finden.
Originalarbeit lizenziert unter CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Dies ist eine KI-generierte Erklärung des untenstehenden Papers. Sie wurde nicht von den Autoren verfasst oder gebilligt. Für technische Genauigkeit konsultieren Sie das Originalpaper. Vollständigen Haftungsausschluss lesen
Stellen Sie sich vor, Sie sind ein Detektiv, der versucht, ein Rätsel zu lösen, aber anstatt nach Hinweisen zu suchen, versuchen Sie, eine Maschine zu bauen, die eine bestimmte Aufgabe erledigen kann, wie zum Beispiel die Zahl 2 in die 4 zu verwandeln, die 3 in die 9 und die 4 in die 16. Sie kennen die genaue Formel, die die Maschine verwendet, nicht; Sie kennen nur die Ergebnisse. Dies wird „Programming by Example“ genannt. Um die Antwort zu finden, könnten Sie versuchen, jede mögliche Maschine, eine nach der anderen, zu bauen, beginnend mit den einfachsten Zahnrädern und Hebeln, und jede einzeln zu testen, um zu sehen, ob sie funktioniert. Das ist ein wenig so, als würde ein Koch versuchen, ein geheimes Rezept zu finden, indem er jede mögliche Kombination aus Mehl, Zucker und Eiern backt, bis eine davon richtig schmeckt.
In der Welt der Informatik gibt es eine spezielle Denkweise, die „relationale Programmierung“ genannt wird. Anstatt dem Computer genau zu sagen, wie er die Antwort Schritt für Schritt findet, beschreiben Sie, was die Antwort ist, und lassen den Computer den Weg finden. Es ist wie wenn man einem Roboter sagt: „Finde einen Weg durch das Labyrinth“, anstatt „Drehe dich nach links, gehe drei Schritte und drehe dich dann nach rechts.“ Der Computer ist großartig darin, viele Pfade gleichzeitig zu erkoren, aber er hat eine tückische Angewohnheit: Er neigt dazu, immer wieder dieselben Sackgassen zu erkunden oder in einem langen, gewundenen Tunnel steckenzubleiben, während er einen kurzen, cleveren Abkürzung direkt daneben übersieht. Diese Arbeit befasst sich mit diesem Problem, indem sie den Computer lehrt, ein klügerer, organisierterer Entdecker zu sein.
Das Problem: Sich im Labyrinth zu verirren
Stellen Sie sich vor, Sie versuchen, einen bestimmten Schlüssel in einem riesigen, unordentlichen Dachboden zu finden, der mit Millionen von Schlüsseln gefüllt ist. Die meisten Schlüssel sehen unterschiedlich aus, aber sie alle öffnen exakt dieselbe Tür. Wenn Sie ein tollpatschiger Entdecker sind, könnten Sie einen Schlüssel aufheben, ihn ausprobieren, feststellen, dass er funktioniert, und dann Stunden damit verbringen, andere Schlüssel aufzuheben, die anders aussehen, aber auch funktionieren, nur um sicherzugehen. Sie verschwenden Zeit damit, Schlüssel zu prüfen, die exakt dieselbe Aufgabe erfüllen.
In der Welt der Computerprogramme passiert das ständig. Wenn ein Computer versucht, ein Programm zu erstellen, das Eingaben in Ausgaben umwandelt, generiert er tausende von unterschiedlich aussehenden Code-Schnipseln. Viele dieser Schnipsel sind „Zwillinge“ in Verkleidung – sie tun exakt dasselbe, obwohl sie im Inneren unterschiedlich aussehen. Eine standardmäßige Computersuchmethode, die wie ein Tiefenforscher arbeitet, prüft einen Zwilling, dann den nächsten, dann den nächsten, und wird dabei immer langsamer, je größer der Dachboden wird. Es ist, als versuche man, eine Nadel im Heuhaufen zu finden, aber der Heuhaufen besteht aus Millionen von Nadeln, die alle leicht unterschiedlich aussehen.
Die Lösung: Das „Prune“- und das „Bank“-Werkzeug
Die Autoren dieser Arbeit, Nikolai Kudasov, haben zwei clevere Werkzeuge entwickelt, um dieses Chaos zu beheben. Betrachten Sie diese als einen magischen Filter und eine intelligente Bibliothek.
1. Das „Prune“-Werkzeug (Der Filter)
Stellen Sie sich vor, Sie haben ein Förderband mit Schlüsseln, die aus einer Maschine kommen. Das „Prune“-Werkzeug ist ein Wächter, der neben dem Band steht. Wenn ein Schlüssel ankommt, prüft der Wächter, welche Tür er öffnet. Wenn der Wächter bereits einen Schlüssel gesehen hat, der dieselbe Tür öffnet, wirft er den neuen Schlüssel einfach in den Müll, ohne ihn überhaupt zu testen. Er behält nur den allerersten Schlüssel, der eine bestimmte Tür öffnet. Auf diese Weise transportiert das Förderband nur einzigartige, nützliche Schlüssel. Der Computer verschwendet keine Zeit mehr mit Duplikaten.
2. Das „Bank“-Werkzeug (Die intelligente Bibliothek)
Stellen Sie sich nun vor, dass Sie anstatt jedes Mal einen Schlüssel von Grund auf neu zu bauen, eine magische Bibliothek besitzen. Wenn Sie die Bibliothek nach einem Schlüssel fragen, gibt sie Ihnen nicht nur einen; sie baut einmalig ein ganzes Regal mit einzigartigen Schlüsseln, ausgehend von der Basis auf, und speichert diese. Wenn Sie später erneut nach einem Schlüssel fragen, reicht Ihnen die Bibliothek einfach denjenigen, den sie bereits gebaut hat.
In der Sprache der Arbeit wird dies als defrel/bank bezeichnet. Es zwingt den Computer, seine Liste der Kandidatenprogramme in einer spezifischen, organisierten Weise aufzubauen (beginnend mit den einfachsten) und speichert die Ergebnisse. Wenn der Computer später ein kleines Stück eines Programms benötigt, baut er es nicht neu; er greift einfach das Stück aus der „Bank“. Dies spart eine enorme Menge an Zeit, da der Computer niemals dieselbe Arbeit zweimal erledigen muss.
Die Wendung: Manchmal ist „Schnell“ nicht „Am besten“
Die Autoren haben auch erkannt, dass bloße Organisation nicht immer ausreicht. Manchmal baut die „Bank“ ihre Regale in einer Reihenfolge auf, die für den Computer schnell, aber für den Menschen langsam ist. Zum Beispiel könnte die Bank zuerst alle „Multiplikations“-Maschinen bauen und erst viel später die „Additions“-Maschinen. Wenn die Antwort, die Sie suchen, eine „Additions“-Maschine ist, muss der Computer vielleicht tausende Multiplikationsmaschinen prüfen, bevor er schließlich die findet, die Sie benötigen.
Um dies zu beheben, haben sie ein drittes Werkzeug namens defrel/bank-w (die „gewichtete“ Bank) geschaffen. Dieses Werkzeug ist wie ein Bibliothekar, der weiß, dass manche Arten von Schlüsseln wahrscheinlicher die Antwort sind. Es verwendet einen speziellen „Score“, um zu entscheiden, welche Schlüssel Ihnen zuerst gezeigt werden. Es versucht, Ihnen zuerst die einfachsten, kompaktesten Schlüssel zu zeigen, selbst wenn diese tief in der Bibliothek vergraben sind. Dies ist großartig, wenn Sie die eleganteste Lösung suchen, kann aber langsamer sein, wenn die Antwort tatsächlich eine komplexe, tiefe Maschine ist.
Was sie herausgefunden haben: Geschwindigkeit vs. Strategie
Die Autoren haben diese Werkzeuge an einer Reihe von Mathe- und String-Rätseln (wie zum Beispiel die Verwandlung von „Hello“ in „Hello, World!“) getestet. Hier ist, was sie herausgefunden haben:
- Die „Bank“ ist ein Geschwindigkeitsmonster: Bei 6 von 8 schwierigen Mathematikaufgaben war das
defrel/bank-Werkzeug 9- bis 99-mal schneller als die alte, standardmäßige Suchmethode. Es war so schnell, dass es Probleme in einem Bruchteil einer Sekunde löste, für die die alte Methode Minuten gebraucht hätte. - Aber sie hat einen blinden Fleck: Die Bank ist so organisiert, dass sie die Antwort manchmal übersieht, wenn diese in einem Teil der Bibliothek versteckt ist, den sie erst spät besucht. Wenn die Antwort beispielsweise beinhaltet, Zahlen auf eine bestimmte Weise zu addieren (wie ), könnte die Bank stecken bleiben und tausende Multiplikationsbeispiele prüfen, bevor sie die richtige findet. In diesen Fällen gewinnt die alte, langsamere Methode tatsächlich, weil sie die Dinge in einer anderen Reihenfolge prüft.
- Die „gewichtete“ Bank ist ein Kompromiss: Das
defrel/bank-w-Werkzeug ist exzellent darin, die kompaktesten, elegantesten Antworten zu finden. Es fand die richtige Antwort für ein kniffliges String-Rätsel in 10,4 Millisekunden und schlug damit die standardmäßige Methode mit 31,5 Millisekunden. Bei sehr tiefen mathematischen Problemen konnte es jedoch manchmal in die Falle tappen, zu viele Möglichkeiten prüfen zu wollen, und brach mit einem Timeout ab.
Das Fazit
Diese Arbeit behauptet nicht, jedes Problem der Informatik gelöst zu haben. Stattdessen zeigt sie, dass wir durch das Hinzufügen von ein wenig „Pruning“ (Filtern von Duplikaten) und „Banking“ (Speichern von Arbeit für später) Computerprogramme, die andere Programme erstellen, viel, viel schneller machen können.
Die Autoren schlagen vor, dass man das Bank-Werkzeug als Standard verwenden sollte, wenn man ein System zur Lösung von Rätseln baut, da es in der Regel am schnellsten ist. Wenn man jedoch nach einer sehr spezifischen, kompakten Lösung sucht oder wenn das Problem flach und einfach ist, möchte man vielleicht die gewichtete Bank oder sogar die altmodische Methode verwenden. Es geht nicht darum, dass ein Werkzeug perfekt ist; es geht darum, das richtige Werkzeug für die Form des Rätsels zu haben, das man lösen möchte. Die Arbeit endet mit dem Hinweis, dass zukünftige Arbeiten diese Werkzeuge an noch komplexeren Rätseln testen werden, wie etwa dem Aufbau von Programmen, die Listen oder typisierte Daten verstehen, um zu sehen, ob sich diese Beschleunigung in der realen Welt durchhält.
Ertrinken Sie in Arbeiten in Ihrem Fachgebiet?
Erhalten Sie tägliche Digests der neuesten Arbeiten passend zu Ihren Forschungsbegriffen — mit technischen Zusammenfassungen, in Ihrer Sprache.