Hmm, I didn't explain it very well. What if I had more knowledge? Maybe I knew two grades sometimes. That could cut down on the list of possible students (assuming there are more than the three in my example).
How could I write a function that worked for both of these cases? (matches [{:course 'Algebra :g 'B}]) (matches [{:course 'Algebra :g 'B} {:course 'Art :g 'C}]) On Sat, May 19, 2012 at 2:02 PM, David Nolen <dnolen.li...@gmail.com> wrote: > I don't think you need to generate goals for something as straightforward as > this: > > (defrel grade person course g) > (fact grade 'Bob 'Algebra 'B) > (fact grade 'Bob 'Art 'C) > (fact grade 'John 'Algebra 'A) > (fact grade 'John 'Art 'A) > (fact grade 'Ricky 'Algebra 'D) > (fact grade 'Ricky 'Art 'A) > > (defn matches [{:keys [course g]}] > (run* [q] > (fresh [p] > (grade p course g) > (== q [p course g])))) > > (matches {:course 'Algebra :g 'B}) > > On Sat, May 19, 2012 at 2:12 PM, Alex Robbins > <alexander.j.robb...@gmail.com> wrote: >> >> I'm just getting started with logic programming, and it is entirely >> possible I'm just approaching this incorrectly. >> >> Is it possible to use dynamically generated goals in run* ? >> >> For example, >> >> (defrel grade person course g) >> (fact grade 'Bob 'Algebra 'B) >> (fact grade 'Bob 'Art 'C) >> (fact grade 'John 'Algebra 'A) >> (fact grade 'John 'Art 'A) >> (fact grade 'Ricky 'Algebra 'D) >> (fact grade 'Ricky 'Art 'A) >> >> (def knowledge >> {:course 'Algebra :g 'B}) >> >> (defn generate-goals [knowledge] >> (map >> (fn [{:keys [course g]}] (list 'grade 'person course g)) >> knowledge)) >> >> I want to do something like this (but valid clojure): >> (run* [person] >> ~@(generate-goals knowledge)) >> >> It should give me back a list of people who match my current >> knowledge. If I have more knowledge about the person, it will generate >> more conditions, less knowledge fewer conditions. However, since run* >> and run are macros, I can't apply them to a list. I can't splice in >> because I'm not in a quotes list. Any ideas? >> >> Thanks! >> >> -- >> 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