在元素将位于有限域中而不是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
(但不能反过来),但membero
和fd/in
的情况却不同。
fd/distinct
比必须接收任何类型值的distincto
优化得多。fd/distinct
在引擎盖下使用集合同时处理约束变量的有效表示,distincto
以非常简单的方式使用不定性算子!=
。