3

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

我知道我可以这样写:

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

...但这很麻烦,我实际上需要针对“N out of M”案例概括我的代码,这很难概括。有人可以指出解决此类问题的正确方法吗?是否有可用的功能来简化这一点?

谢谢!

4

1 回答 1

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

于 2013-10-17T06:14:39.700 回答