Кодирование "два из трех" в clojure.core.logic
Мне нужно написать код core.logic, который проверяет, успешны ли две из трех целей.
Я знаю, что могу написать так:
(run* [a b c]
(conde [goal1 goal2]
[goal2 goal3]
[goal3 goal1]))
... но это громоздко, и мне действительно нужно обобщить мой код для случая "N из M", и это будет трудно обобщить. Может ли кто-нибудь указать мне правильный подход к решению проблемы такого типа? Есть ли функция, которая упрощает это?
Спасибо!
1 ответ
Решение
Вероятно, макрос может помочь:
(defmacro n-of-m-goals [n all-goals]
`(conde ~@(combinations all-goals n))
Тогда ваш пример станет:
(run* [a b c]
(n-of-m-goals 2 [goal1 goal2 goal3]))
комбинации от math.combinatorics