I am trying to write a rule to check whether a package (chosen by a user
via a UI) is appropriate for a location. If the chosen
package is not appropriate, we want to warn the user.
Here is a simplified version of the domain
(deftemplate box (slot id)(multislot objects)) ;boxes can contain
multiple objects
(deftemplate location (slot id) (slot need)) ;locations have needs,
which are integers
(deftemplate satisfies-need (slot box) (slot location) (slot object))
;some objects in a box can satisfy a need of a location.
(deftemplate pkg (slot package-name)(slot location) (multislot boxes)) ;
a package for a location consists of multiple boxes.
(deftemplate satisfies-need-pkg (slot package-name)(slot location))
(assert (box (id b1) (objects o1 o2)))
(assert (box (id b2) (objects o3 o4)))
(assert (box (id b3) (objects o5 o6)))
(assert (box (id b4) (objects o7 o8 o9)))
(assert (box (id b5) (objects o10 o11 o12)))
(assert (location (id l1) (need 3))) ;location l1 has 3 needs
(assert (satisfies-need (box b1) (location l1) (object o1))); object o1
satisfies a need of location l1
(assert (satisfies-need (box b2) (location l1) (object o3))); object o3
satisfies a need of location l1
(assert (satisfies-need (box b3) (location l1) (object o6))); object o6
satisfies a need of location l1
;The following might be asserted as a result of the user defining a
package using the UI.
(assert (pkg (package-name p1)(location l1) (boxes b1 b2))) ; user
chooses a pakckage p1 consisting of boxes b1 and b2
(assert (pkg (package-name p2)(location l1) (boxes b1 b2 b3))); user
chooses a package p2 consisting of boxes b1, b2 and b3.
To see whether a package satisfies the need at a location, we do the
following. Initialize count to zero.
(a) Look at each box (call it b) in the package and look at each
object inside b. If that object
satisfies the need at the location, we add 1 to count.
Otherwise we do nothing.
(b) If the count at the end is greater than or equal to the value
of the need slot of the location, the package
satisfies the need.
Example: Package p1 does not satisfy the need of location 1, since
the count is only 2 (due to o1 and o3)and the need is 3
Package p2 does satisfy the need of location l (from o1,
o3 and o6)
Note that the satisfied-need facts are asserted as a result of other
rule firings to determine whether
an object does satisfy the need of a location (and thus are not
directly asserted as in the example above).
The question is how do I write a rule to determine whether a package
satisfies a need for a location:
(defrule satisfies-need-pkg
?????
==>
(assert (satisfied-need-pkg (package-name $p) (location $l)))
)
It seems that I should be able to use accumulate CE, but I am having a
hard-time making it work. Any suggestions on how to do this (with or
without using the accumulate CE)
Thanks,
Kartha
--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [email protected]'
in the BODY of a message to [email protected], NOT to the list
(use your own address!) List problems? Notify [email protected].
--------------------------------------------------------------------