Versión corta: Estoy interesado en algún código Clojure que me permita especificar las transformaciones de x (por ejemplo, permutaciones, rotaciones) bajo las cuales el valor de una función f (x) es invariante, de modo que Puedo generar eficientemente una secuencia de x que satisfaga r = f (x). ¿Hay algún desarrollo en álgebra computacional para Clojure? Para (a trivial) ejemploAlgebra computacional para Clojure
(defn #^{:domain #{3 4 7}
:range #{0,1,2}
:invariance-group :full}
f [x] (- x x))
que podría llamar (imagen inversa f # {0}) y sería volver eficientemente # {3 4 7}. Naturalmente, también podría anotar correctamente el codominio. ¿Alguna sugerencia?
Versión más larga: Tengo un problema específico que me interesa saber sobre el desarrollo del álgebra computacional para Clojure. ¿Alguien puede indicarme un proyecto así? Mi problema específico implica encontrar todas las combinaciones de palabras que satisfagan F (x) = r, donde F es una función de clasificación yr es un entero positivo. En mi caso particular f puede calcularse como una suma
F (x) = f (x [0]) + f (x [1]) + ... f (x [n-1])
Además, tengo un conjunto de conjuntos disjuntos S = {s_i}, tal que f (a) = f (b) para a, b en s, s en S. Entonces, una estrategia para generar todo x tal que F (x) = r debería basarse en esta factorización de F y la invarianza de f debajo de cada s_i. En palabras, calculo todas las permutaciones de sitios que contienen elementos de S que suman r y los componen con todas las combinaciones de los elementos en cada s_i. Esto se hace bastante descuidado en lo siguiente:
(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)))))))))
Esto hace el trabajo pero no ve la imagen subyacente. Por ejemplo, si la operación asociativa fuera un producto en lugar de una suma, tendría que volver a escribir porciones.
Consulte [Expresso] (https://github.com/clojure-numerics/expresso) desde 2013. – Zaz