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