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)