corelogic中的distinct与fd / distinct不同

时间:2013-02-20 16:57:23

标签: clojure clojure-core.logic

在元素将位于有限域而不是fd/distinct的情况下使用distincto有什么好处?

以下全部返回([0 1] [1 0])

;;; With distincto
(run* [q]
  (fresh [x y]
    (fd/in x y (fd/interval 1))
      (distincto [x y])
      (== q [x y])))

;;; With fd/distinct
(run* [q]
  (fresh [x y]
    (fd/in x y (fd/interval 1))
      (fd/distinct [x y])
      (== q [x y])))

;;; Without fd at all. 
(let [interval [0 1]]
  (run* [q]
    (fresh [x y]
      (membero x interval)
      (membero y interval)
      (distincto [x y])
      (== q [x y]))))

值得注意的是,虽然看起来您可能会在distincto使用fd/distinct的地方使用membero(但不是相反),fd/in和{{{1}} { {1}}。

1 个答案:

答案 0 :(得分:5)

fd/distinctdistincto高度优化,必须获得任何价值。引擎盖下的fd/distinct使用集合同时处理约束变量的有效表示,distincto以非常简单的方式使用不等运算符!=