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

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