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