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: [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]
>> --------------------------------------------------------------------
>>
>>
>
>
http://www.nabble.com/file/p13333906/Facts..txt Facts..txt
http://www.nabble.com/file/p13333906/Matches.txt Matches.txt
--
View this message in context:
http://www.nabble.com/JESS%3A-How-can-I-write-this-rule--tf4644690.html#a13333906
Sent from the Jess mailing list archive at Nabble.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]
--------------------------------------------------------------------