Encontre elementos em uma coleção usando core.logic

Aqui está uma macro útil para usar core.logic para encontrar um elemento em uma coleção que corresponda a um conjunto de regras.

(defmacro membero-such
"Convenience macro for finding elements in a
collection that match a set of rules.

Generates a new fresh lvar named ~lvar,

which should be membero coll. Pass additional

rules in body. Unify lvar with something else

so its value can escape the scope of this macro."

[lvar coll & body]
`(clojure.core.logic/fresh [~lvar]
(clojure.core.logic/membero ~lvar ~coll)

~@body))

Você vai querer unificar lvar(que é feito de novo) com outra coisa para que seu valor possa escapar do escopo do corpo da macro.

Exemplo de uso:

(defn find-el
[el coll out]
(membero-such e coll
(clojure.core.logic/== e el)
(clojure.core.logic/== e out)))

(clojure.core.logic/run* [q]
(find-el :b [:a :b :c] q)) ; => (:b)