Представьте, что у меня есть несколько рецептов различных блюд и кладовая с различными ингредиентами на кухне. Я хочу построить модель, используя 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)
Мой вопрос заключается в следующем: как я могу смоделировать эти рецепты, чтобы я мог написать запрос по рецептам и кладовой, чтобы перечислить имена возможных рецептов с учетом текущего содержимого моей кладовой?