在元素将位于有限域而不是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}}。
答案 0 :(得分:5)
fd/distinct
比distincto
高度优化,必须获得任何价值。引擎盖下的fd/distinct
使用集合同时处理约束变量的有效表示,distincto
以非常简单的方式使用不等运算符!=
。