distincto vs. fd/distinct in core.logic



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

以下全部返回([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]))))

值得注意的是,尽管你可以在任何可以使用fd/distinct的地方使用distincto(但不能反过来),但memberofd/in的情况却不同。

fd/distinct比必须接收任何类型值的distincto优化得多。fd/distinct在引擎盖下使用集合同时处理约束变量的有效表示,distincto以非常简单的方式使用不定性算子!=

相关内容

  • 没有找到相关文章

最新更新