9

Clojureで自然数のレイジーシーケンスを定義するのは簡単です:(def N (iterate inc 0))。当然、Clojureに(apply min N)を使用してNの最小値を見つけるように頼むと、無限回帰で固まってしまいます。Clojureが最小の自然数であることをClojureに理解させるにはどうすればよいですか?

Nのデータ構造に(= 0 (min N))という事実を「組み込む」方法はありますか?暗黙的に、は、増加関数incが厳密に増加しているので、これを知っています。 min関数は、この知識を悪用する方法を知らず、その代わりに無理矢理解答しようとします。

このコードをプログラムでエンコードする方法はわかりません。私は、制約のような追加の構造を持つレイジーシーケンスを構築する方法を希望します&リレーション)。最適化の問題を解決するために、これらの制約を利用する方法も欲しい(シーケンスの最小値または最小値を見つけることなど)。

ネイティブClojureでこれを行う方法はありますか? Datomicはどうですか?

+0

Datomicはどこに適合しますか?あなたはその特別な制約を保存しようとしていますか? – Jared314

答えて

6

特定の例のメタデータを使用できます。

(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 

さらに一般化する必要がある場合は、独自のタイプを作成する必要があります。

関連する問題