2013-02-20 26 views
5

在元素位于有限域而不是distincto的情况下使用fd/distinct的优点是什么?distincto vs. fd/distinct in core.logic

以下全部返回([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,同样不能说是为memberofd/in

回答

3

fd/distinctdistincto更高度优化,它必须接受任何类型的价值。底下的fd/distinct使用集合一次处理约束变量的高效表示,distincto以非常简单的方式使用不等式运算符!=