On 9/28/05, Alan Moore <[EMAIL PROTECTED]> wrote:
> Jerome,
> I'm a little confused as to why your example below would work for either
> set of facts.

Hey Jerome,

Perhaps this generic example will be of some help....

Since you introduced the notion of sets, let's say that we have a set
called A.  For sake of argument, we'll add that set A has five
properties.  We'll call this set of properties X and we can write
that:

X = {x1, x2, x3, x4, x5}

So, each element of A can be defined by the values of its five
properties.  If we represent elements of set A by ordered facts of
type A, then we can write:

(deftemplate A
        (slot x1) (slot x2) (slot x3) (slot x4) (slot x5))

Now, let's say that we want to find a subset, B, of all type A facts
having certain property values.  Note that we're not creating any new
facts of type B.  We are just extracting a subset from the collection
of A facts.  To do this, we simply restrict the slot values using
Jess's constraints.

For example, if you asked me to find subset B such that:

        x1 < 3
        x2 > 2
        x3 = x4
        x5 = nil

I could write:

(defrule find-subset-B
        (A (x1 ?x1&:(< x1 3)) (x2 ?x2&:(> x2 2)) (x3 ?x3) (x4 ?x3) (x5 nil))
        =>
        ; Rule actions go here...
)
        
This rule would fire on all facts of type A for which these
constraints were satisfied.
A complete program is given below.

Cheers,
-Jason
-----------------------------------------------------
Morris Technical Solutions LLC
www.morristechnicalsolutions.com
[EMAIL PROTECTED]
phone/fax: 503.692.1088


;; -------------------------
;; subset.clp
;; -------------------------

; INIT
(clear)
(watch rules)

(deftemplate A
    (slot x1) (slot x2) (slot x3) (slot x4) (slot x5))

; Load some data
(deffacts load-all-A-facts
    (A (x1 3) (x2 9) (x3 8) (x4 2) (x5 0.4))
    (A (x1 -2) (x2 5) (x3 0.3) (x4 0.3) (x5 nil))
    (A (x1 1) (x2 3) (x3 7) (x4 5) (x5 8))
    (A (x1 3) (x2 5) (x3 9) (x4 1) (x5 nil))
    (A (x1 9) (x2 3) (x3 8) (x4 4) (x5 5))
    (A (x1 3) (x2 2) (x3 1) (x4 1) (x5 2))
    (A (x1 1) (x2 5) (x3 4) (x4 4) (x5 nil))
    (A (x1 0) (x2 4) (x3 4) (x4 1) (x5 3)))

; Filter set A for subset B
(defrule find-subset-B
    ?fact<- (A (x1 ?x1&:(< ?x1 3)) (x2 ?x2&:(> ?x2 2)) (x3 ?x3) (x4
?x3) (x5 nil))
    =>
    (printout t (fact-id ?fact) " matches!"  crlf))

; PROGRAM
(reset)
(run)

; OUTPUT
;Jess, the Rule Engine for the Java Platform
;Copyright (C) 2005 Sandia Corporation
;Jess Version 7.0b2 8/11/2005
;
;FIRE 1 MAIN::find-subset-B f-7
;<Fact-7> matches!
;FIRE 2 MAIN::find-subset-B f-2
;<Fact-2> matches!


--------------------------------------------------------------------
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]
--------------------------------------------------------------------

Reply via email to