On 10/21/07, Robert Kirby <[EMAIL PROTECTED]> wrote:
>
> If you want to consider only enabled instances,
>
> (defrule CP::enabled-example-rule
> "Enabled My-Template with the greatest index1 and
> among those enabled with the smallest index2."
> (My-Template (id ?id) (enabled TRUE) (index1 ?index1) (index2
> ?index2))
> (not (My-Template (enabled TRUE)
> (index1 ?another-index1:(< ?index1
> ?another-index1))))
> (not (My-Template (enabled TRUE) (index1 ?index1)
> (index1 ?another-index2:(< ?index2
> ?another-index2))))
> =>
> (printout t "Enabled My-Template id=" ?id
> " with greatest index1=" ?index1
> " and smallest index2=" ?index2
> " with greatest index." crlf))
>
The rule isn't quite correct. In the second "not" term, you must
bind slot index2 to ?another-index2, and the condition must
be (> ?index2 ?another-index2). (Also, note the missing '&'.)
Thus:
(defrule enabled-example-rule
(My-Template (id ?id) (enabled TRUE) (index1 ?index1) (index2 ?index2))
(not (My-Template (enabled TRUE)
(index1 ?another-index1 &:(< ?index1
?another-index1))))
(not (My-Template (enabled TRUE) (index1 ?index1)
(index2 ?another-index2 &:(> ?index2
?another-index2))))
=>
(printout t "id=" ?id ", index1=" ?index1 ", index2=" ?index2 crlf)
)
Cheers,
Wolfgang
If you want to only fire the maximal instance when it is enabled,
>
> (defrule CP::example-rule-when-enabled
> "Enabled My-Template with the greatest index1 and
> among those enabled with the smallest index2."
> (My-Template (id ?id) (enabled TRUE) (index1 ?index1) (index2
> ?index2))
> (not (My-Template (index1 ?another-index1:(< ?index1
> ?another-index1))))
> (not (My-Template (index1 ?index1)
> (index1 ?another-index2:(< ?index2
> ?another-index2))))
> =>
> (printout t "My-Template id=" ?id
> " with greatest index1=" ?index1
> " and smallest index2=" ?index2
> " with greatest index is enabled." crlf))
>
> Bob Kirby
>
> At 08:57 AM 10/20/2007, Nicolas Fortin wrote*:
>
> *
>
> Hello everybody,
>
> I have just added a bit more complexity to the previous rule and now I
> have the following template:
>
> (deftemplate MAIN::My-Template
> (slot id (type INTEGER))
> (slot enabled (default FALSE))
> (slot index1 (type INTEGER))
> (slot index2 (type INTEGER)))
>
> What I want to known is among the enabled My-Template with the greatest
> index1, what are those with the smallest index2.
>
> For example, with the following facts:
>
> (assert (MAIN::My-Template
> (id 1) (enabled TRUE) (index1 1) (index2 2)))
> (assert (MAIN::My-Template
> (id 2) (enabled TRUE) (index1 1) (index2 1)))
> (assert (MAIN::My-Template
> (id 3) (enabled TRUE) (index1 0) (index2 0)))
>
> Facts id 1, 2 and 3 are enabled. Only facts id 1 and 2 have the greatest
> index1. But among these facts, it is id 2 that has the smallest index2. So
> id 2 is the fact that I want.
>
> Another example, with the following facts:
>
> (assert (MAIN::My-Template
> (id 1) (enabled FALSE) (index1 1) (index2 2)))
> (assert (MAIN::My-Template
> (id 2) (enabled FALSE) (index1 1) (index2 1)))
> (assert (MAIN::My-Template
> (id 3) (enabled TRUE) (index1 0) (index2 0)))
>
> Facts id 3 is the only fact that is enabled, and there is no other enabled
> fact with greatest index1 and smallest index2. So id 3 is the fact that I
> want.
>
> Is it possible to do that with only one rule?
>
> Thank you.
>
> Nicolas
>
> From: [EMAIL PROTECTED]
> To: [email protected]
> Subject: RE: JESS: How can I write this rule?
> Date: Thu, 18 Oct 2007 16:59:19 -0400
>
>
> Hello Ernest,
>
> 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?
>
>
> It makes a lot of sense. Thank you for your explanation. In fact, I did
> not read Wolfgang's solution enough carefully. Sorry Wolfgang.
>
> Best regards,
>
> Nicolas.
>
>
> 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]
>
> --------------------------------------------------------------------
> 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]
>
> --------------------------------------------------------------------
> 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]
> --------------------------------------------------------------------
>
>