Ich habe Probleme, meinen Kopf darum herumzulegen, wie man clojure und core.logic mischt.Wie benutzt man core.logic in einem größeren Clojure-Programm?
Zum Beispiel sagen, ich habe folgendes Problem:
Ich habe eine Liste von Schlüssel-Wert-Paar mit angebautem Noten:
(:foo "10" 2)
(:bar "20" 3)
(:baz "30" 7)
Und ich habe auch eine Karte:
{:foo "10",
:bar "42",
:baz "30"}
Was ich tun möchte, ist, eine Liste der Ergebnisse auf der Grundlage der Liste der Bewertungen, die in Bezug auf die Karte bewertet wurden, zurückzugeben.
Mit Core-Logik kann ich so etwas tun:
(defrel score key value score)
(fact score :foo "10" 2)
(fact score :bar "20" 3)
(fact score :baz "30" 7)
(run* [q]
(conde
((score :foo "10" q))
((score :baz "30" q))))
Und ich bekomme das gewünschte Ergebnis:
(2 7)
Mein Problem ist, ich sehe nicht, wie dies verwandeln sich in etwas, das Ich kann dynamisch in einem größeren Programm laufen. Das bedeutet, dass ich verschiedene Karten und verschiedene Einschränkungen haben werde, um sie zu verschiedenen Zeiten anzuwenden. Ich denke, ich kann das Conde-Argument erstellen, indem ich eine Funktion schreibe, die die Map aufnimmt und die Constraints ausgibt, aber wie kann ich das im Zusammenhang mit einer Menge temporärer Fakten bewerten? ?
Ich könnte sicherlich eine Funktion schreiben, um zurückzukehren, was ich ohne core.logic will, aber das scheint weniger elegant. Vielleicht bell ich den falschen Baum (ich bin neu in Clojure und core.logic) und das ist überhaupt kein Einschränkungsproblem.
Also meine Frage lautet:
Wie Sie in Kernlogik mischen, wenn Sie Ihre Tatsachen und Abhängigkeiten von einer Quellen sind Ziehen Sie erst zur Laufzeit wissen?
Und wie sehen Sie dies in einer Umgebung, in der Sie eine Reihe von Einschränkungen in einer neuen Umgebung von Fakten bewerten möchten?
Vielen Dank. Das hat mich auf den richtigen Weg gebracht. Ich muss das Makro durcharbeiten, aber das sollte mir sehr helfen und ich bin mir ziemlich sicher, dass core.logic die richtige Lösung für das Problem ist, das ich lösen möchte. – jgerman
Siehe auch Wiki zum Erweitern von core.logic mit API https://github.com/clojure/core.logic/wiki/Extending-core.logic-%28Datomic-example%29 –