在clojure.core.logic中编码“三分之二”

时间:2013-10-16 21:34:27

标签: clojure clojure-core.logic

我需要编写一些core.logic代码来检查三个目标中的两个是否成功。

我知道我可以这样写:

(run* [a b c]
      (conde [goal1 goal2]
             [goal2 goal3]
             [goal3 goal1]))

...但这很麻烦,我实际上需要将我的代码概括为“N out of M”的情况,这很难概括。有人能指出我使用这种问题的正确方法吗?是否有可用的功能简化了这个?

谢谢!

1 个答案:

答案 0 :(得分: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