Well, despite of fact that core.logic is fine tool and is worth of study, I have implemented own solution to my problem.
Here is a full implementation: http://pastebin.com/Z5BETZd3 And the idea is to index each value in record perserving the record and meaning of values. Then search by these values. The mini DSL contains "from insert select where" keywords. The resulting usage code is: (defn permission[ roles ops states ] (letfn [ (or-nil [ a ] (or a #{ nil })) ] (from :permission (doseq[ r (or-nil roles) o (or-nil ops) s (or-nil states) ] (insert { :role r :op o :state s }))))) (permission #{:admin :operator } #{:reject :accept} #{:applied} ) (permission #{:auditor :operator } #{:list} any ) (permission #{:operator } #{:enter} #{:dirty} ) (defn can-access[ role op state ] (not (empty? (from :permission (where { :role role :op op :state state }))))) (defn get-operations[ role state ] (map :op (from :permission (select [ :op ] (where { :role role :state state }))))) ; Some tests (get-operations :operator :applied) (can-access :auditor :list :applied) (can-access :admin :enter :dirty) -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en