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

时间:2013-10-20 22:16:03

标签: clojure mathematical-optimization relation minimum datomic

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

有没有办法“建立”{N}的数据结构(= 0 (min N))的事实?隐含地,我们知道这一点,因为增量函数inc严格增加。 min函数不知道如何利用这些知识,而是试图蛮力地回答答案。

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

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

1 个答案:

答案 0 :(得分: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

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