我怎样才能帮助Clojure理解0是最小的自然数?

Tom*_*tta 9 clojure mathematical-optimization minimum relation datomic

在Clojure中很容易定义一个懒惰的自然数序列:(def N (iterate inc 0)).不出所料,如果我们要求Clojure找到N的最小值(apply min N),它会陷入无限回归.

有没有办法"建立" (= 0 (min N))N的数据结构这一事实?隐含地,我们知道这一点,因为增量函数inc是严格增加的.该min功能不知道如何利用这些知识,而是试图强行解决问题.

我不知道如何以编程方式编码.我想用一种方法来构造具有附加结构的惰性序列,如约束和关系).我还想要一种方法来利用这些约束来解决优化问题(比如找到序列的最小值或下限).

有没有办法在原生Clojure中做到这一点?怎么样用Datomic

Jar*_*314 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
Run Code Online (Sandbox Code Playgroud)

如果您需要更通用的内容,则可能需要考虑创建自己的类型.