2013-02-20 66 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以非常簡單的方式使用不等式運算符!=