Towards Bottom-Up Enumeration in miniKanren via Pruning and Memoization
Dit artikel introduceert twee miniKanren-bibliotheekcombinatoren, `prune` en `defrel/bank`, die bottom-up enumeratie mogelijk maken met observationele deduplicatie en memoisatie om de prestaties van relationele programma-synthese op diepe doelstellingen aanzienlijk te verbeteren, terwijl ook een gewogen variant wordt voorgesteld om gevallen aan te pakken waarin de canonieke depth-first ordening faalt in het vinden van compacte representanten.
Oorspronkelijk artikel gelicentieerd onder CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Dit is een AI-gegenereerde uitleg van het onderstaande artikel. Het is niet geschreven of goedgekeurd door de auteurs. Raadpleeg het oorspronkelijke artikel voor technische nauwkeurigheid. Lees de volledige disclaimer
Stel je voor dat je een detective bent die een mysterie probeert op te lossen, maar in plaats van naar aanwijzingen te zoeken, probeer je een machine te bouwen die een specifieke taak kan uitvoeren, zoals het getal 2 in 4 veranderen, 3 in 9 en 4 in 16. Je weet de exacte formule die de machine gebruikt niet; je kent alleen de resultaten. Dit wordt "Programming by Example" genoemd. Om het antwoord te vinden, zou je elke mogelijke machine kunnen bouwen, één voor één, beginnend met de eenvoudigste tandwielen en hendels, en elke machine testen om te zien of deze werkt. Dit is een beetje zoals een chef die probeert een geheim recept te vinden door elke mogelijke combinatie van bloem, suiker en eieren te bakken totdat er één goed smaakt.
In de wereld van de informatica is er een speciale manier van denken die "relationele programmering" wordt genoemd. In plaats van de computer precies te vertellen hoe hij het antwoord moet vinden stap voor stap, beschrijf je wat het antwoord moet zijn en laat je de computer het pad uitzoeken. Het is alsof je een robot vertelt: "Vind een pad door de doolhof," in plaats van "Ga naar links, loop drie stappen, en ga dan naar rechts." De computer is geweldig in het tegelijkertijd verkennen van veel paden, maar heeft een lastige gewoonte: de neiging om steeds weer dezelfde doodlopende wegen te verkennen, of vast te komen zitten in een lange, kronkelende tunnel terwijl er een korte, slimme afkorting vlak naast ligt. Dit artikel pakt dat probleem aan door de computer te leren hoe een slimmere, meer georganiseerde ontdekkingsreiziger te zijn.
Het Probleen: Verdwalen in de Doolhof
Stel je voor dat je een specifieke sleutel probeert te vinden in een enorme, rommelige zolder vol met miljoenen sleutels. De meeste van deze sleutels zien er verschillend uit, maar ze openen allemaal precies dezelfde deur. Als je een onhandige ontdekkingsreiziger bent, pak je misschien een sleutel op, probeert hem uit, merkt dat hij werkt, en brengt dan uren door met het oppakken van andere sleutels die er anders uitzien maar ook werken, alleen maar om het zeker te weten. Je verspilt tijd aan het controleren van sleutels die precies hetzelfde werk doen.
In de wereld van computerprogramma's gebeurt dit de hele tijd. Wanneer een computer probeert een programma te bouwen om inputs in outputs te veranderen, genereert hij duizenden verschillende ogende codestukjes. Veel van deze codestukjes zijn "tweelingen" in vermomming—ze doen exact hetzelfde, ook al zien ze er van binnen anders uit. Een standaard zoekmethode van een computer, die werkt als een diepgaande ontdekkingsreiziger, controleert eerst één tweeling, dan de volgende, dan de volgende, waardoor hij steeds langzamer wordt naarmate de zolder groter wordt. Het is alsof je een naald in een hooiberg probeert te vinden, maar de hooiberg bestaat uit miljoenen naalden die er allemaal net iets anders uitzien.
De Oplossing: De "Prune" en de "Bank"
De auteurs van dit artikel, Nikolai Kudasov, kwamen met twee slimme hulpmiddelen om deze puinhoop op te lossen. Denk aan hen als een magisch filter en een slimme bibliotheek.
1. Het "Prune"-hulpmiddel (Het Filter)
Stel je voor dat je een lopende band hebt van sleutels die uit een machine komen. Het "Prune"-hulpmiddel is een bewaker die naast de band staat. Terwijl elke sleutel arriveert, controleert de bewaker welke deur de sleutel opent. Als de bewaker al een sleutel heeft gezien die diezelfde deur opent, gooit de bewaker de nieuwe sleutel simpelweg in de prullenbak zonder deze zelfs maar te testen. Ze houden alleen de allereerste sleutel die een specifieke deur opent. Op deze manier vervoert de lopende band alleen unieke, nuttige sleutels. De computer verspilt geen tijd meer aan duplicaten.
2. Het "Bank"-hulpmiddel (De Slimme Bibliotheek)
Stel je nu voor dat je, in plaats van elke keer vanaf nul een sleutel te bouwen wanneer je er een nodig hebt, een magische bibliotheek hebt. Wanneer je de bibliotheek om een sleutel vraagt, geeft hij je niet zomaar één; hij bouwt één keer een hele plank met unieke sleutels, van onderaf opgebouwd, en slaat ze op. Als je later weer om een sleutel vraagt, geeft de bibliotheek je gewoon de sleutel die hij al gebouwd heeft.
In de taal van het artikel wordt dit defrel/bank genoemd. Het dwingt de computer om zijn lijst met kandidaat-programma's op een specifieke, georganiseerde manier op te bouwen (beginnend met de eenvoudigste) en slaat de resultaten op. Als de computer later een klein stukje van een programma nodig heeft, bouwt hij het niet opnieuw; hij pakt gewoon het stukje uit de "bank". Dit bespaart een enorme hoeveelheid tijd omdat de computer nooit twee keer hetzelfde werk hoeft te doen.
De Twist: Soms is "Snel" niet "Beste"
De auteurs realiseerden zich ook dat alleen georganiseerd zijn niet altijd genoeg is. Soms bouwt de "Bank" zijn planken in een volgorde die snel is voor de computer, maar traag voor de mens. Bijvoorbeeld, de Bank bouwt misschien eerst alle "vermenigvuldigingsmachines" en bouwt pas veel later de "optellingsmachines". Als het antwoord dat je zoekt een "optellingsmachine" is, moet de computer misschien duizenden vermenigvuldigingsmachines controleren voordat hij eindelijk degene vindt die je nodig hebt.
Om dit op te lossen, creëerden ze een derde hulpmiddel genaamd defrel/bank-w (de "Gewogen" Bank). Dit hulpmiddel is als een bibliothecaris die weet dat sommige soorten sleutels waarschijnlijker het antwoord zijn. Het gebruikt een speciale "score" om te beslissen welke sleutels het eerst aan je worden getoond. Het probeert je eerst de eenvoudigste, meest compacte sleutels te tonen, zelfs als ze diep in de bibliotheek verborgen liggen. Dit is geweldig als je de meest elegante oplossing wilt, maar kan trager zijn als het antwoord eigenlijk een complexe, diepe machine is.
Wat ze vonden: Snelheid vs. Strategie
De auteurs testten deze hulpmiddelen op een reeks wiskundige en string-puzzels (zoals het veranderen van "Hello" in "Hello, World!"). Hier is wat zij ontdekten:
- De "Bank" is een snelheidspiraat: Op 6 van de 8 moeilijke wiskundeproblemen was de
defrel/bank-tool 9 tot 99 keer sneller dan de oude, standaard zoekmethode. Het was zo snel dat het problemen oploste in een fractie van een seconde, terwijl de oude methode minuten nodig had om klaar te zijn. - Maar het heeft een blinde vlek: De Bank is zo georganiseerd dat hij soms het antwoord mist als dat antwoord verborgen ligt in een deel van de bibliotheek dat hij pas laat bezoekt. Bijvoorbeeld, als het antwoord het optellen van getallen op een specifieke manier inhoudt (zoals ), kan de Bank vastlopen in het controleren van duizenden vermenigvuldigingsvoorbeelden eerst. In die gevallen wint de oude, tragere methode het eigenlijk, omdat deze de dingen in een andere volgorde controleert.
- De "Gewogen" Bank is een afweging: De
defrel/bank-w-tool is uitstekend in het vinden van de meest compacte, elegante antwoorden. Het vond het juiste antwoord voor een lastige string-puzzel in 10,4 milliseconden, waarmee het de standaardmethode van 31,5 milliseconden versloeg. Echter, voor zeer diepe wiskundeproblemen kwam het soms in de knoop door te veel mogelijkheden te willen controleren en liep het vast (time-out).
De Kern van het Verhaal
Dit artikel beweert niet dat het elk probleem in de computerwetenschap heeft opgelost. In plaats daarvan laat het zien dat door een beetje "pruning" (het wegfilteren van duplicaten) en "banking" (werk opslaan voor later) toe te voegen, we computerprogramma's kunnen maken die andere programma's veel, veel sneller bouwen.
De auteurs suggereren dat als je een systeem bouwt om puzzels op te lossen, je de Bank-tool als je standaard moet gebruiken, omdat deze meestal de snelste is. Echter, als je op zoek bent naar een zeer specifieke, compacte oplossing, of als het probleem ondiep en eenvoudig is, wil je misschien de Gewogen Bank of zelfs de ouderwetse methode gebruiken. Het gaat er niet om dat één hulpmiddel perfect is; het gaat erom dat je het juiste hulpmiddel hebt voor de vorm van de puzzel die je probeert op te lossen. Het artikel eindigt met de suggestie dat toekomstig werk deze hulpmiddelen zal testen op nog complexere puzzels, zoals het bouwen van programma's die lijsten of getypeerde data begrijpen, om te zien of deze versnelling standhoudt in de echte wereld.
Verdrinkt u in papers in uw vakgebied?
Ontvang dagelijkse digests van de nieuwste papers die bij uw onderzoekswoorden passen — met technische samenvattingen, in uw taal.