2013-02-20 24 views
5

Lợi thế của việc sử dụng fd/distinct trong trường hợp các phần tử sẽ nằm trong một miền hữu hạn thay vì distincto là gì?distincto so với fd/khác biệt trong core.logic

Sau đây tất cả trở về ([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])))) 

Đáng chú ý, mặc dù nó xuất hiện bạn có thể sử dụng trong bất kỳ distincto nơi mà bạn có thể sử dụng fd/distinct (nhưng không phải là cách khác xung quanh), cùng không thể nói cho memberofd/in.

Trả lời

3

fd/distinct được tối ưu hóa cao hơn nhiều so với distincto phải nhận bất kỳ loại giá trị nào. fd/distinct theo thỏa thuận mui xe với các biểu diễn hiệu quả của các biến bị ràng buộc cùng một lúc bằng cách sử dụng các bộ, distincto sử dụng toán tử disequality != theo cách khá đơn giản.

Các vấn đề liên quan