2013-02-20 18 views
5

Was ist der Vorteil der Verwendung von fd/distinct in Fällen, in denen die Elemente in einer endlichen Domäne statt distincto sind?distinct vs. fd/distinct in core.logic

Die folgenden alle zurück ([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])))) 

Bemerkenswert ist, obwohl es scheint, Sie distincto an jedem Ort verwenden können, wo Sie fd/distinct (aber nicht umgekehrt) verwenden kann, kann man das nicht für membero und fd/in gesagt werden.

Antwort

3

fd/distinct ist viel höher optimiert als distincto, die jede Art von Wert erhalten muss. fd/distinct unter der Haube beschäftigt sich mit effizienten Darstellungen von Constrained-Variablen alle auf einmal, distincto verwendet den Disequalitätsoperator != in einer ziemlich einfachen Art und Weise.