Ernest

Thanks, I really appreciate your speedy help.
I like the progn implementation.  As I said,
I am new to this so that kinda thing helps a lot.

I am now suffering from making my example too simple
compared to what I am trying to do!!!  I did think
of the defglobal but I am trying to do this for
different customers:

(assert (PURCHASE 100 1234))
(assert (PURCHASE 150 1234))
(assert (PURCHASE 100 9999))

etc, where the second param is the customer id.

So, I need a way to be able to define a static
variable type of construct within a rule.  Does that
make sense?

I was thinking that I might write a small java class
that looked like a rule and took a customer id.  this
class could then have a hashtable of ids with associated
amounts.  I was hoping for more of a built-in way
of doing though as I am not even sure that would
work.

Thanks

John.

----Original Message Follows----
I think John Goalby wrote:
 > I understand the approach that you outlined and have got
 > someway to implementing it when I realized that I might
 > be looking for something a little different.
 >
 > I want to be able to add up the payments as the facts
 > get asserted - as I am doing backchaining.
 >
 > The payments are asserted separately (assert (PURCHASE 100)).
 >
 > I want to be able to define a rule such that I can accumulate
 > the purchases as they happen.  The rule may look like:
 >
 > (defrule CHECKIT (PURCHASE ?AMT) (test (> ?AMT 80)) => (printout t ?AMT
 > crlf))
 >
 > What I would like is a rule to then specify that if the running
 > total is over a certain amount then printout a warning.
 >
 > (defrule CHECKIT (PURCHASE ?AMT) (test (> ?AMT 80)) (test (> ?TOT 200)) 
=>
 > (printout t  WARNING " " ?TOT crlf))
 >
 > Obviously I have not shown how to calc ?TOT as I don't
 > know how!!!  This is where my knowledge is very limited.


Well, as always, there are about a million ways to do it. Here's one:
you could put the sum in a defglobal:

(defglobal ?*sum* = 0)

Then you could do something like this:

(defrule CHECKIT
         (PURCHASE ?AMT)
         (test (> ?AMT 80))
         (test (progn (bind ?*sum* (+ ?*sum* ?AMT))
                      (> ?*sum* 200)))
         =>
         (printout t  WARNING " " ?*sum* crlf))


(progn) just groups function calls together, so you can call more than
one thing during a single (test) CE.

 >
 > Thanks
 >
 > John.
 >
 > ----Original Message Follows----
 > This is the trditional CLIPS solution, but it involves lots, lots more
 > computational work (both in CLIPS and in Jess.) If the number of
 > "purchase" facts is N, then roughly 2(N^2) partial matches will be
 > formed.  The total number of rule activations is almost as large. The
 > defquery solution forms only N partial matches. If N is 50, 2(N^2) is
 > 5000, so the traditional solution does ~100 times more computation
 > (actually worse since all the activations have to be processed and the
 > rule has to fire ~50 times.) Plus, as you say, it's destructive.
 >
 > Defqueries are a Good Thing for applications like this.
 >
 > I think Thomas Gentsch wrote:
 >  >
 >  > I would have done something like that:
 >  >
 >  > (defrule sum
 >  >   ?f1 <- (purchase ?s1)
 >  >   ?f2 <- (purchase ?s2)
 >  >          (test (neq ?f1 ?f2))
 >  > =>
 >  >   (retract ?f1)
 >  >   (retract ?f2)
 >  >   (assert (purchase (+ ?s1 ?s2)))
 >  > )
 >  >
 >  > Works at least with CLIPS but I suppose with Jess as well. How does 
that
 >  > compare performance-wise?
 >  >
 >  > (Of course, your initial facts are gone afterwards - if you want to 
keep
 >  > them, it gets a little more difficult).
 >  >
 >  >   tge
 >  >
 >  > [EMAIL PROTECTED] wrote:
 >  > >
 >  > > The most efficient way to do it would be to use a defquery to find 
all
 >  > > the PURCHASE facts, then iterate over the query result directly and
 >  > > add them up. You could define a deffunction to do this.
 >  > >
 >  > > I think John Goalby wrote:
 >  > > > I would like to be able to have the following facts...
 >  > > >
 >  > > > (assert (PURCHASE 100))
 >  > > > (assert (PURCHASE 150))
 >  > > > (assert (PURCHASE 70))
 >  > > >
 >  > > > and then be able to have a rule that would give me the
 >  > > > sum of these purchases.  Is that possible?
 >  > > >
 >  > > > Thanks
 >  > > >
 >  > > > John.
 >  > >
 >  >
 >  > --
 >  >     Thomas Gentsch
 >  >
 >  >
 >  > ---------------------------------------------------------------------
 >  > 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]
 >  > ---------------------------------------------------------------------
 >  >
 >
 >
 >
 > ---------------------------------------------------------
 > Ernest Friedman-Hill
 > Distributed Systems Research        Phone: (925) 294-2154
 > Sandia National Labs                FAX:   (925) 294-2234
 > Org. 8920, MS 9012                  [EMAIL PROTECTED]
 > PO Box 969                  http://herzberg.ca.sandia.gov
 > Livermore, CA 94550
 >
 > ---------------------------------------------------------------------
 > 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]
 > ---------------------------------------------------------------------
 >
 >
 > _________________________________________________________________
 > Get your FREE download of MSN Explorer at http://explorer.msn.com
 >



---------------------------------------------------------
Ernest Friedman-Hill
Distributed Systems Research        Phone: (925) 294-2154
Sandia National Labs                FAX:   (925) 294-2234
Org. 8920, MS 9012                  [EMAIL PROTECTED]
PO Box 969                  http://herzberg.ca.sandia.gov
Livermore, CA 94550

_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com


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