我在纏繞clojure和core.logic的時候遇到了麻煩。如何在更大的Clojure程序中以實用的方式使用core.logic?
例如說我有以下問題:
我有鍵值對附帶分數列表:
(:foo "10" 2)
(:bar "20" 3)
(:baz "30" 7)
而且我也有一張地圖:
{:foo "10",
:bar "42",
:baz "30"}
我想要做的是根據地圖評估的分數列表返回分數列表。
使用核心邏輯,我可以做這樣的事情:
(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))))
我也得到了預期的結果:
(2 7)
我的問題是我不知道如何把它變成的東西,我可以動態地運行一個更大的程序。這意味着我將在不同的時間應用不同的地圖和不同的約束條件。我認爲我可以通過編寫一個函數來創建conde參數,該函數可以接受映射並輸出約束,但是如何在一組臨時事實的上下文中評估?
我當然可以編寫一個函數來返回我想要的但沒有core.logic的東西,但這看起來不那麼優雅。也許我在吠叫錯誤的樹(我對Clojure和core.logic都陌生),這根本不是約束問題。
所以我的問題是:
如何在覈心邏輯混合,當你從一個來源,你不會知道,直到運行時拉你的事實和約束?
和相關的,你如何在一個你想要在一個新的事實環境中評估一組約束的環境中這樣做?
非常感謝。這使我走上了正確的道路。我需要通過宏來解決這個問題,但這應該有很大的幫助,我非常確定core.logic是我想解決的問題的正確解決方案。 – jgerman 2013-03-13 21:02:21
另請參閱Wiki以使用API擴展core.logic的示例https://github.com/clojure/core.logic/wiki/Extending-core.logic-%28Datomic-example%29 – 2015-12-29 03:18:39