There's a subtle difference between the solutions Jason and Wolfgang
posted; you're basically using Jason's, but apparently you want
Wolfgang's.
Jason's and yours will fire for facts for which no single other fact
has *both* a higher index1 and a lower index2. You're using a single
"not" pattern, which restricts these two conditions to applying to a
single other facts.
Wolfgang's will for facts for which *no other fact* has a higher
index1, and *no other fact* has a higher index2. He uses two separate
"not" patterns to describe these two conditions, so each is
considered separately.
Make sense?
On Oct 18, 2007, at 8:30 AM, Nicolas Fortin wrote:
Hello everybody and specially to Jason and Wolfgang. Thank you for
your help guys.
First, concerning what you said Jason, I don't want to hunt fact
with the highest index1 and lowest index2 among all instances of an
arbitrary number of fact template (e.g. My-Template, Queue, etc.).
I did a typo (damn copy and paste), you should have seen only My-
Template. So forget the Queue template.
Second, I have already done an example as you said guys, but what
puzzled me is that the result is not really what I expected. So
let's say I have:
(deftemplate MAIN::My-Template
(slot id (type INTEGER))
(slot index1 (type INTEGER))
(slot index2 (type INTEGER)))
(reset)
(assert (MAIN::My-Template
(id 1) (index1 1) (index2 0)))
(assert (MAIN::My-Template
(id 2) (index1 1) (index2 0)))
(assert (MAIN::My-Template
(id 3) (index1 0) (index2 0)))
(defrule MAIN::greatest-one-smallest-two
"Find the My-Template with greatest index1 and smallest index2"
(MAIN::My-Template
(id ?id1)
(index1 ?index1_1)
(index2 ?index2_1))
(not (MAIN::My-Template
(id ~?id1)
(index1 ?index1_2&:(>= ?index1_2 ?index1_1))
(index2 ?index2_2&:(< ?index2_2 ?index2_1 ))))
=>
(printout t
"No My-Template fact has both a larger index1 and a smallest index2
than fact # " ?id1 crlf)
(printout t
" index1: " ?index1_1 " index2: " ?index2_1 crlf))
(run)
The output is not what I want, since the third fact (id 3)
activates the rule. As far as I can understand it should not,
because its index1 slot is not the greatest. In this example, I
would be expected that only the first and the second facts activate
this rule, since they both have the greatest index1 and the
smallest index2. Maybe I am wrong, but it seems for me that Jess is
performing a *or* rather than an *and* in this example. What is wrong?
Thanks again.
Nicolas
Date: Thu, 18 Oct 2007 02:56:18 -0400From:
[EMAIL PROTECTED]: [EMAIL PROTECTED]: Re: JESS:
How can I write this rule?
Hi NIcolas,
A rule like this seems to work for me:(defrule greatest-one-
smallest-two "Find the My-Template with greatest index1 and
smallest index2" (MAIN::My-Template (id ?id1)(index1 ?i1_1)
(index2 ?i1_2)) (not (MAIN::My-Template
(id ~?id1)
(index1 ?i2_1&:(>= ?i2_1 ?i1_1))
(index2 ?i2_2&:(< ?i2_2 ?i1_2 )))) => (printout t
"No My-Template fact has both a larger index1 and a smallest
index2 than fact # " ?id1 crlf) (printout t
" index1: " ?i1_1 " index2: " ?i1_2 crlf))It seems a bit
more complicated if you want to hunt for a particular fact with the
highest index1 and lowest index2 among all instances of an
arbitrary number of fact templates ( i.e., my-template, queue,
etc.) that share these two slots in common
---------------------------------------------------------
Ernest Friedman-Hill
Informatics & Decision Sciences Phone: (925) 294-2154
Sandia National Labs FAX: (925) 294-2234
PO Box 969, MS 9012 [EMAIL PROTECTED]
Livermore, CA 94550 http://www.jessrules.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]
--------------------------------------------------------------------