想象一下,我的厨房里有许多不同菜肴的食谱和一个装有各种食材的储藏室。我想构建一个模型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)
我的问题是:如何对这些食谱进行建模,以便我可以对食谱和储藏室编写查询,以列出给定储藏室当前内容的可能食谱的名称?