For wildcards you can use symbol-macrolet from tools.macro (macro/symbol-macrolet [_ (lvar)] (all (== [_ _ [_ _ 'milk _ _] _ _] hs) ....))
On Sat, Nov 5, 2011 at 1:24 PM, Ambrose Bonnaire-Sergeant < abonnaireserge...@gmail.com> wrote: > I gave the wildcard requirement a bit of thought, no inspiration at the > moment. > > Maybe someone else can suggest a strategy. > > Ambrose > > > On Sun, Nov 6, 2011 at 1:14 AM, Ambrose Bonnaire-Sergeant < > abonnaireserge...@gmail.com> wrote: > >> Hey Michael, >> >> Here's a solution using core.logic. >> >> ;; We can define a "permission" relation with "defrel". >> >> (defrel permission roles ops state) >> >> ;; and a helper function to add each combination of permissions >> >> (defn add-permision [roles ops states] >> (for [r roles >> o ops >> s states] >> (fact permission r o s))) >> >> ;; Here is your first example >> >> (add-permision #{:admin :operator} #{:reject :accept} #{:applied}) >> >> ;; Now lets ask what are the permissions for the :admin role >> >> logic-introduction.perm=> (run* [q] >> (fresh [ops states] >> (permission :admin ops states) >> (== q [ops states]))) >> ([:reject :applied] [:accept :applied]) >> >> ;; Ask what permissions either a :admin or :operator role has >> >> logic-introduction.perm=> (run* [q] >> (fresh [role ops states] >> (conde >> ((== role :admin)) >> ((== role :operator))) >> (== q [ops states]) >> (permission role ops states))) >> ([:reject :applied] [:accept :applied] [:reject :applied] [:accept >> :applied]) >> >> >> Thanks, >> Ambrose >> >> On Sun, Nov 6, 2011 at 12:51 AM, Michael Jaaka < >> michael.ja...@googlemail.com> wrote: >> >>> Hi, >>> >>> I would like to use logic programing to describe permissions. The >>> definition is >>> >>> We have set of triples which looks like: >>> Set of roles; set of operations; set of states >>> >>> Triples are defined in scope of some entity with states, wildcard is >>> defined with _ >>> >>> All I need is to answer on some operation invocation if given user >>> with his role is able to execute that operation for particular entity >>> which is in one of its states >>> >>> Example: >>> Roles: admin, operator, auditor >>> Entity: data form with states dirty, applied, rejected, executed >>> Operations on data form: reject, acept, list, enter >>> Triples of permissions: >>> admin, operator; reject, accept; applied >>> auditor, operator; list; _ >>> operator; enter; dirty >>> >>> The additional question beside checking permission is: >>> What are operations avaiable for given role and given state of entity >>> >>> >>> Any thoughts? Maybe core.logic? It seems that I know its purpose but >>> don't know how to use it. >>> Thanks in advance. >>> >>> -- >>> 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 >> >> >> > -- > 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 > -- 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