Another "old skool" way of doing it using predicate constraints is...

(deftemplate item (slot name))
(deftemplate bag-of-items (multislot item-names))

(defrule fire-for-all-members-in-bag
  ; If you have a bag of item names ...
  (bag-of-items (item-names $?item-names))
  ; and there is an item whose name is member of this bag ...
  ?item <-(item (name ?name&:(member$ ?name $?item-names)))
  ; ...then do something interesting
  (printout t ?name " is in the bag!" crlf))

;; Program
(assert (item (name A)))
(assert (item (name B)))
(assert (item (name C)))
(assert (bag-of-items (item-names A B C)))

*Jason C. Morris*
President, Principal Consultant
Morris Technical Solutions LLC
President, Rules Fest Association
Chairman, IntelliFest 2013: International Conference on Reasoning
phone: +01.517.376.8314
skype: jcmorris-mts
Invent * Innovate * Implement at IntelliFest!

On Fri, Jul 26, 2013 at 4:55 PM, Aurelien Mazurie <>wrote:

> Dear Jess users,
> I am wondering how to write a rule that would dynamically match multiple
> facts based on their names.
> Let say I have two types of facts; one representing the information that an
> item (with a given name) exists, and the other one representing a list of
> items (e.g., as a list of names in a multislot). It could be something like
> this:
>   (deftemplate item (slot name))
>   (deftemplate bag-of-items (multislot names))
>   (assert (item (name A))
>   (assert (bag-of-items (names A B))
> What I am trying to write is a rule that would, for any bag-of-items fact,
> fire if all the items listed in the multislot 'name' are item facts that
> have been asserted.
> I am wondering if there is an easy way to do that, or if I'll need to hack
> my way through it with loops and tests in the LHS of my rule.
> Any suggestion?
> Best,
> Aurélien
> --
> View this message in context:
> Sent from the Jess mailing list archive at
> --------------------------------------------------------------------
> To unsubscribe, send the words 'unsubscribe jess-users'
> in the BODY of a message to, NOT to the list
> (use your own address!) List problems? Notify

Reply via email to