2013-02-20 13 views
5

Qual è il vantaggio dell'utilizzo di fd/distinct nei casi in cui gli elementi si troveranno in un dominio limitato anziché distincto?distincto vs. fd/distinct in core.logic

Quanto segue restituisce ([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])))) 

In particolare, anche se sembra si può utilizzare distincto in qualsiasi luogo in cui è possibile utilizzare fd/distinct (ma non viceversa), lo stesso non può dirsi per membero e fd/in.

risposta

3

fd/distinct è molto più ottimizzato di distincto che deve ricevere qualsiasi tipo di valore. fd/distinct sotto il cofano si occupa di rappresentazioni efficienti di variabili vincolate tutte contemporaneamente utilizzando insiemi, distincto utilizza l'operatore di disuguaglianza != in un modo piuttosto semplice.

Problemi correlati