Phiên bản ngắn: Tôi quan tâm đến một số mã Clojure cho phép tôi chỉ định biến đổi của x (ví dụ hoán vị, phép quay) theo đó giá trị của hàm f (x) là bất biến. Tôi có thể tạo ra một chuỗi x thỏa mãn r = f (x) một cách hiệu quả. Có một số phát triển trong đại số máy tính cho Clojure không? Đối (một tầm thường) ví dụĐại số máy tính cho Clojure
(defn #^{:domain #{3 4 7}
:range #{0,1,2}
:invariance-group :full}
f [x] (- x x))
tôi có thể gọi số (preimage f # {0}) và nó có hiệu quả sẽ trở lại # {3 4 7}. Đương nhiên, nó cũng sẽ có thể chú thích tên miền chính xác. Bất kỳ đề xuất?
Phiên bản dài hơn: Tôi có một vấn đề cụ thể khiến tôi quan tâm đến việc tìm hiểu về phát triển đại số máy tính cho Clojure. Bất cứ ai có thể chỉ cho tôi một dự án như vậy? Vấn đề cụ thể của tôi liên quan đến việc tìm kiếm tất cả các kết hợp của các từ thỏa mãn F (x) = r, trong đó F là hàm xếp hạng và r là số nguyên dương. Trong trường hợp cụ thể của tôi f có thể được tính như một số tiền
F (x) = f (x [0]) + f (x [1]) + ... f (x [N-1])
Hơn nữa tôi có một tập hợp các bộ phân tách S = {s_i}, sao cho f (a) = f (b) cho a, b trong s, s trong S. Vì vậy, một chiến lược tạo tất cả x sao cho F (x) = r nên dựa vào yếu tố này của F và sự bất biến của f theo từng s_i. Nói cách khác, tôi tính tất cả hoán vị của các trang web chứa các phần tử của S tổng hợp thành r và soạn chúng với tất cả các kết hợp của các phần tử trong mỗi s_i. Điều này được thực hiện khá cẩu thả trong những điều sau đây:
(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)))))))))
Việc này được thực hiện nhưng bỏ qua hình ảnh cơ bản. Ví dụ, nếu các hoạt động liên kết là một sản phẩm thay vì một số tiền tôi sẽ phải viết lại các phần.
Xem [Expresso] (https://github.com/clojure-numerics/expresso) từ năm 2013. – Zaz