Кодирование "два из трех" в 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

Другие вопросы по тегам