2013-10-20 14 views
9

Thật dễ dàng để xác định một chuỗi số tự nhiên lười biếng trong Clojure: (def N (iterate inc 0)). Không ngạc nhiên, nếu chúng ta yêu cầu Clojure tìm ra mức tối thiểu của N bằng cách sử dụng (apply min N), nó bị kẹt trong một hồi quy vô hạn.Làm cách nào để giúp Clojure hiểu rằng 0 là số tự nhiên nhỏ nhất?

Có cách nào để "xây dựng" thực tế là (= 0 (min N)) đến cấu trúc dữ liệu của N không? Ngụ ý, chúng tôi biết điều này, vì chức năng gia tăng inc đang tăng lên nghiêm ngặt. Hàm min không biết cách khai thác kiến ​​thức này, và thay vào đó cố gắng tìm cách trả lời cho câu trả lời.

Tôi không biết cách mã hóa chương trình này theo cách lập trình. Tôi muốn một cách để xây dựng các trình tự lười biếng với cấu trúc bổ sung như ràng buộc quan hệ &). Tôi cũng muốn một cách để khai thác các ràng buộc này để giải quyết các vấn đề tối ưu hóa (như tìm kiếm tối thiểu hoặc tối ưu của chuỗi).

Có cách nào để thực hiện điều này trong Clojure bản địa không? Còn với Datomic thì sao?

+0

Datomic khớp với đâu? Bạn đang cố gắng để lưu trữ thêm hạn chế? – Jared314

Trả lời

6

Bạn có thể sử dụng siêu dữ liệu cho ví dụ cụ thể mà bạn có.

(defn my-range 
    ([] (my-range 0)) 
    ([n] (with-meta 
     (cons n (lazy-seq (my-range (inc n)))) 
     {:onlyincreases true}))) 

(defn my-min [x] (if (:onlyincreases (meta x)) (first x) (min x))) 

(my-min (my-range)) ;; => 0 
(my-min (next (my-range))) ;; => 1 
(my-min (nnext (my-range))) ;; => 2 

Nếu bạn cần một cái gì đó tổng quát hơn, bạn có thể phải xem xét việc tạo kiểu của riêng bạn.

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