2013-02-20 10 views
5

Jaka jest zaleta korzystania z fd/distinct w przypadkach, gdy elementy będą w skończonej domenie zamiast distincto?distincto vs. fd/distinct in core.logic

Następujący all return ([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])))) 

Warto zauważyć, że chociaż wydaje się, można użyć distincto w każdym miejscu, gdzie można skorzystać fd/distinct (ale nie na odwrót), tym samym nie można powiedzieć o membero i fd/in.

Odpowiedz

3

fd/distinct jest o wiele bardziej zoptymalizowany niż distincto, który musi otrzymać jakąkolwiek wartość. fd/distinct pod maską radzi sobie z wydajnymi reprezentacjami ograniczonych zmiennych za jednym razem przy użyciu zestawów,w prosty sposób wykorzystuje operator odstępności !=.