miniKanren
miniKanren är en familj av programmeringsspråk för relationsprogrammering . Eftersom relationer är dubbelriktade , om miniKanren ges ett uttryck och en önskad utgång, kan miniKanren köra uttrycket "bakåt" och hitta alla möjliga indata till uttrycket som ger den önskade utgången. Detta dubbelriktade beteende tillåter användaren att begränsa både indata till programmet och resultatet av programmet samtidigt. miniKanren utför en interfolierad sökning som så småningom kommer att hitta alla lösningar som finns, även om någon gren av sökträdet är oändligt lång och inte innehåller några lösningar. Om det inte finns någon lösning kan miniKanren söka för evigt om sökträdet är oändligt.
Ett exempel på miniKanren-kod är evalo
, ett relationsmål som relaterar uttryck till de värden som de utvärderar till. När evalo
anropas i miniKanren så här: (evalo qq)
, kommer det att generera quines , det vill säga uttryck q
som när de körs kommer att utvärderas för sig själva.
Boken The Reasoned Schemer använder miniKanren för att demonstrera relationsprogrammering och ger en komplett implementering i Scheme . Språkets kärna ryms på två tryckta sidor. Schemaimplementeringen av miniKanren är utformad för att vara lätt att förstå, modifiera och utöka.
αleanTAP är ett program skrivet i αKanren, en förlängning av miniKanren för nominell logik. Med tanke på ett teorem kan det hitta ett bevis, vilket gör det till ett teorembevisande . Med ett bevis kan den hitta satsen, vilket gör den till en satskontroll. Givet en del av ett bevis och en del av ett teorem, kommer det att fylla i de saknade delarna av beviset och satsen, vilket gör det till en satsutforskare.
Det finns implementeringar av miniKanren i Haskell , Racket , Ruby , Clojure , JavaScript , Scala , Swift , Dart och Python . Den kanoniska implementeringen är ett inbäddat språk i Scheme . Clojure core.logic-biblioteket var inspirerat av miniKanren.
Namnet kanren kommer från ett japanskt ord ( 関連 ) som betyder "relation".