Я пытаюсь решить первую головоломку в книге Смаллиана «Издеваться над пересмешником» с помощью clojure.core.logic не потому, что это особенно сложно, а скорее в качестве упражнения. В загадке говорится, что есть сад с цветами трех цветов: красный, желтый и синий. Каждый цвет присутствует хотя бы один раз, и независимо от того, какие три цветка вы выберете, среди них будет красный и желтый. Вопрос: третий обязательно должен быть синим?
Базовый скелет логического кода довольно прост:
(run 5 [flowers]
(counto flowers 3)
(containso flowers [:red :yellow])
(fresh [garden]
(containso garden [:red :yellow :blue])
(containso garden flowers)
(forall [flower-selection] (...))))
counto
и containso
реализованы вручную и делают очевидную вещь. Я новичок в этом, поэтому может быть существующая поддержка библиотек, которую мне не хватает. Важная строка начинается с forall
. forall
- это в основном то, что я хотел бы, но не могу найти. Единственная известная мне конструкция, которая может быть здесь, это fresh
. Но fresh
по существу выполняет экзистенциальную квантификацию ∃. Здесь мне нужна универсальная количественная оценка ∀.
Меня не интересует сад, для которого возможно выбрать три цветка, содержащие красный и желтый цвет. Меня интересует сад, который обязательно приводит к такому выбору.
all
? возможно - найдено здесь github.com/clojure/core.logic/wiki/Examples-(наверное нет) - person birdspider   schedule 13.06.2017