As compared to Bob's solution, there is no clause that restricts the 2nd not to those facts where the priority is equal to the established maximum. This is now required because the earliest time has to be found among those with the highest priority only. (Cf. the warning I added to the original solution where there was no requirement restricting the minimum to those facts matching the maximum!)

(defrule MAIN::Station-3-Rule
   (MAIN::Station
       (id 3)
       (OBJECT ?station))
   (MAIN::EntitiesQueue
       (downStreamRessourceId 3)
       (enqueuePriority ?priority1)
       (enqueueTimeStamp ?timeStamp1)
       (OBJECT ?upstreamQueue))
   (not (MAIN::EntitiesQueue
           (downStreamRessourceId 3)
           (enqueuePriority ?priority2&:(< ?priority1 ?priority2))))
   (not (MAIN::EntitiesQueue
           (downStreamRessourceId 3)

           (enqueuePriority ?priority1)   ; <<<<<<<<<<<<<<<<<<<

           (enqueueTimeStamp ?timeStamp2&:(> ?timeStamp1 ?timeStamp2))))
   =>
   (printout t "Station-3-Rule has been activated !" crlf)
   )

Fires for:
 EntitiesQueue id=37, enqueuePriority=1, enqueueTimeStamp=30

kr
Wolfgang

Nicolas Fortin wrote:

Hello group,

Thank you very much Robert and Wolfgang for helping me even if it is the
week end. I really appreciate this.

After some tries in a test program with the rule that you suggested, I
modified my real program to integrate the new rule. As you can see this rule
is similar to Wolfgang's last:

(defrule MAIN::Station-3-Rule
   (MAIN::Station
       (id 3)
       (OBJECT ?station))
   (MAIN::EntitiesQueue
       (downStreamRessourceId 3)
       (enqueuePriority ?priority1)
       (enqueueTimeStamp ?timeStamp1)
       (OBJECT ?upstreamQueue))
   (not (MAIN::EntitiesQueue
           (downStreamRessourceId 3)
           (enqueuePriority ?priority2&:(< ?priority1 ?priority2))))
   (not (MAIN::EntitiesQueue
           (downStreamRessourceId 3)
           (enqueueTimeStamp ?timeStamp2&:(> ?timeStamp1 ?timeStamp2))))
   =>
   (printout t "Station-3-Rule has been activated !" crlf)
   )

Unfortunately it is never activated and I can't figure out why. If I look
the working memory it should.

Attached to this post is the facts list (Facts.txt). Note that I inserted
">>  " before the relevant facts, i.e. Station (id 3) (a single relevant
fact) and EntitiesQueue (downStreamStationId 3) (3 relevant facts).

I also attached the result of (matches MAIN::Station-3-Rule) function call
(Matches.txt).

Sorry for giving a lot of details. I rather like to give smallest example
but I am not able to reproduce the problem.

Any help or advice that could help me to debug this rule would be
appreciate.

Regards,

Nicolas.


Wolfgang Laun-2 wrote:
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: jess-users@sandia.gov
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]
--------------------------------------------------------------------


http://www.nabble.com/file/p13333906/Facts..txt Facts..txt http://www.nabble.com/file/p13333906/Matches.txt Matches.txt

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