简短版本:我对一些 Clojure 代码感兴趣,它允许我指定 x 的转换(例如排列、旋转),在这种转换下,函数 f(x) 的值是不变的,这样我就可以有效地生成 x 的序列满足 r = f(x)。Clojure 的计算机代数是否有一些发展?对于(一个微不足道的)示例
(defn #^{:domain #{3 4 7}
:range #{0,1,2}
:invariance-group :full}
f [x] (- x x))
我可以调用 (preimage f #{0}),它会有效地返回 #{3 4 7}。自然,它也能够正确地注释 codomain。有什么建议么?
更长的版本:我有一个特定的问题让我有兴趣了解有关 Clojure 计算机代数的开发。谁能指出我这样的项目?我的具体问题涉及找到满足 F(x) = r 的所有单词组合,其中 F 是排名函数,ra 是正整数。在我的特殊情况下, f 可以计算为总和
F(x) = f(x[0]) + f(x[1]) + ... f(x[N-1])
此外,我有一组不相交的集合 S = {s_i},使得 f(a)=f(b) for a,b in s, s in S. 所以生成所有 x 的策略使得 F(x) = r 应该依赖于 F 的这种因式分解和每个 s_i 下 f 的不变性。换句话说,我计算了包含 S 元素总和为 r 的站点的所有排列,并将它们与每个 s_i 中元素的所有组合组成。这在以下情况下非常草率地完成:
(use 'clojure.contrib.combinatorics)
(use 'clojure.contrib.seq-utils)
(defn expand-counter [c]
(flatten (for [m c] (let [x (m 0) y (m 1)] (repeat y x)))))
(defn partition-by-rank-sum [A N f r]
(let [M (group-by f A)
image-A (set (keys M))
;integer-partition computes restricted integer partitions,
;returning a multiset as key value pairs
rank-partitions (integer-partition r (disj image-A 0))
]
(apply concat (for [part rank-partitions]
(let [k (- N (reduce + (vals part)))
rank-map (if (pos? k) (assoc part 0 k) part)
all-buckets (lex-permutations (expand-counter rank-map))
]
(apply concat (for [bucket all-buckets]
(let [val-bucket (map M bucket)
filled-buckets (apply cartesian-product val-bucket)]
(map vec filled-buckets)))))))))
这完成了工作,但错过了潜在的画面。例如,如果关联操作是乘积而不是总和,我将不得不重写部分。