【发布时间】:2015-02-02 16:05:05
【问题描述】:
想象一下,我的厨房里有许多不同菜肴的食谱和一个装有各种食材的储藏室。我想使用core.logic 构建一个模型,这将使我能够回答以下问题:对于给定的一组成分(即现在我储藏室中的那些),我可以制作哪些食谱?
食谱有些灵活,我需要能够对此进行建模。稍后我想为它们添加数量,但为了开始,我们暂时不考虑这个。
我可以看到如何为储藏室建模:
(db-rel in-larder x)
(def larder (db
[in-larder :carrots]
[in-larder :rice]
[in-larder :garlic]))
食谱有一个名称和一个成分列表,这些成分可以是可选的或以各种方式组合。有 n 个食谱。例如,食谱可能(非正式地)如下所示:
Risotto A
=========
(carrots OR peas)
rice
(onions OR garlic)
Risotto B
=========
((carrots AND onions)) OR (rice AND peas))
garlic
我正在努力解决如何在core.logic 中表达这一点。 (注意,上面的文字只是说明性的,并不是机器可读的。)
我想查询应该是这样的:
(with-dbs [larder recipes] (run* [q] (possible-recipe q)))
这将返回以下结果(给定上面的储藏室定义):
(:risotto-a :risotto-b)
我的问题是:如何对这些食谱进行建模,以便我可以对食谱和储藏室编写查询,以列出给定储藏室当前内容的可能食谱的名称?
【问题讨论】:
标签: clojure constraint-programming logic-programming clojure-core.logic minikanren