我很难理解如何混合 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 的参数,但是我如何让 run* 在一组临时事实的上下文中进行评估?
我当然可以编写一个函数来返回我想要的没有 core.logic 的东西,但这似乎不太优雅。也许我在叫错树(我对 Clojure 和 core.logic 都是新手),这根本不是一个约束问题。
所以我的问题是:
当您从直到运行时才知道的来源中提取事实和约束时,您如何混合核心逻辑?
与此相关的是,您如何在一个新的事实环境中评估一组约束的环境中这样做?