As you've shown the second reset is causing an issue. The reset removes
all facts and asserts the
initial-fact and any facts that have been defined in your deffacts list
(none in this case).
So it still works correctly.
 
If you were to list the facts at the end of the 2nd example you'd see
that only the initial fact
remains ... so the rule fires.

        -----Original Message-----
        From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Mike Stopper
        Sent: Monday, May 07, 2007 11:38 PM
        To: [email protected]
        Cc: [EMAIL PROTECTED]
        Subject: Re: JESS: Fire a rule when multiple conditions NOT true
        
        

        OK, I believe I traced it down to an extra "reset" prior to run.
My original tests had a number of different clp files being batched and
I'm guessing there was a spurious reset in there somewhere.  The
negative case seems to work now that I've reduced the test to just these
scripts; but if I actually have the B/D assertions in there, the extra
reset incorrectly causes the not-present rule to fire.  So what exactly
is the reset doing that causes the LHS to evaluate to true in those
cases?? 
        
        ============= 
        works 
        ============= 
        (watch all) 
        (reset) 
        (assert (value "Aa")) 
        (assert (value "Bb")) 
        (assert (value "Cc")) 
        (assert (value "Dd")) 
        
        (defrule only-when-starts-with-B-and-D-NOT-present 
               (not (value /B.*/)) 
               (not (value /D.*/)) 
               => 
               (printout t crlf "B* and D* NOT present" crlf) 
          
        ) 
        ;;(reset) 
        (run) 
        
         ==> Focus MAIN 
         ==> f-0 (MAIN::initial-fact) 
         ==> f-1 (MAIN::value "Aa") 
         ==> f-2 (MAIN::value "Bb") 
         ==> f-3 (MAIN::value "Cc") 
         ==> f-4 (MAIN::value "Dd") 
        ==> Activation: MAIN::only-when-starts-with-B-and-D-NOT-present
:  f-0,, 
        <== Activation: MAIN::only-when-starts-with-B-and-D-NOT-present
:  f-0,, 
        MAIN::only-when-starts-with-B-and-D-NOT-present:
+1+1+1+1+1+2+1+2+t 
         <== Focus MAIN 
        
        
        
        
        
        elapsed time = 235 millis 
        
        =================== 
        doesn't work 
        =================== 
        
        (watch all) 
        (reset) 
        (assert (value "Aa")) 
        (assert (value "Bb")) 
        (assert (value "Cc")) 
        (assert (value "Dd")) 
        
        (defrule only-when-starts-with-B-and-D-NOT-present 
               (not (value /B.*/)) 
               (not (value /D.*/)) 
               => 
               (printout t crlf "B* and D* NOT present" crlf) 
          
        ) 
        (reset) 
        (run) 
        
         ==> Focus MAIN 
         ==> f-0 (MAIN::initial-fact) 
         ==> f-1 (MAIN::value "Aa") 
         ==> f-2 (MAIN::value "Bb") 
         ==> f-3 (MAIN::value "Cc") 
         ==> f-4 (MAIN::value "Dd") 
        ==> Activation: MAIN::only-when-starts-with-B-and-D-NOT-present
:  f-0,, 
        <== Activation: MAIN::only-when-starts-with-B-and-D-NOT-present
:  f-0,, 
        MAIN::only-when-starts-with-B-and-D-NOT-present:
+1+1+1+1+1+2+1+2+t 
         ==> Focus MAIN 
         ==> f-0 (MAIN::initial-fact) 
        ==> Activation: MAIN::only-when-starts-with-B-and-D-NOT-present
:  f-0,, 
        FIRE 1 MAIN::only-when-starts-with-B-and-D-NOT-present f-0,, 
        
        B* and D* NOT present 
         <== Focus MAIN 
        
        
        
        
        
        elapsed time = 234 millis
        
        -- Mike
        ____________________
        
        Michael Stopper
        Systems Development Scientist
        SPS Enterprise Architect
        CACI Transformation Solutions Group
        
        Tel 703.460.1845
        Mobile 703.407.7058
        [EMAIL PROTECTED]  | www.caci.com
        
        
        
        
        
"Ernest Friedman-Hill" <[EMAIL PROTECTED]> 
Sent by: [EMAIL PROTECTED] 

05/07/2007 11:16 PM 
Please respond to
[email protected]


To
[email protected] 
cc
Subject
Re: JESS: Fire a rule when multiple conditions NOT true

        




        Well, what we have here, I suspect, is a failure to communicate.
Here is an actual transcript of a Jess command prompt session. Do you
see something different? If so, show us *exactly* what you typed,
starting with launching Jess. 
        
        [EMAIL PROTECTED] ~]$ java jess.Main
        
        Jess, the Rule Engine for the Java Platform
        Copyright (C) 2006 Sandia Corporation
        Jess Version 7.0p1 12/21/2006
        
        Jess>  (reset)
        TRUE
        Jess> (assert (value "Aa")) 
        <Fact-1>
        Jess>
        Jess> (assert (value "Cc"))
        Jess>
        Jess> <Fact-2>
        Jess> (defrule only-when-starts-with-B-and-D-NOT-present
              (not (value /B.*/))
              (not (value /D.*/)) 
              =>
              (printout t "B* and D* NOT present" crlf)
        )
        TRUE
        Jess> (run)
        B* and D* NOT present
        1
        Jess> (reset)
        TRUE
        Jess>  (assert (value "Aa"))
        <Fact-1> 
        Jess> (assert (value "Bb"))
        <Fact-2>
        Jess> (assert (value "Cc"))
        <Fact-3>
        Jess> (run)
        0
        Jess> (retract 2)
        TRUE
        Jess> (run)
        B* and D* NOT present 
        1
        Jess>          
        
        On 5/7/07, Mike Stopper <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]> > wrote: 
        
        Hmm. That doesn't seem to do it: 
        
        f-10   (MAIN::value "aa") 
        f-11   (MAIN::value "Bb") 
        f-12   (MAIN::value "cc") 
        f-13   (MAIN::value "Dd") 
        f-14   (MAIN::value "ee") 
        
        still yields 
        B* and D* NOT present 
        
        as does 
        f-10   (MAIN::value "aa") 
        f-11   (MAIN::value "cc") 
        f-12   (MAIN::value "ee") 
        
        
        which actually prints it out twice!! 
        
        B* and D* NOT present 
        B* and D* NOT present 
        
        
        This is version 7.0p1 if that makes any difference. 
        
        -- Mike
        ____________________
        
        Michael Stopper
        Systems Development Scientist
        SPS Enterprise Architect
        CACI Transformation Solutions Group
        
        Tel 703.460.1845
        Mobile 703.407.7058
        [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>   | www.caci.com
<http://www.caci.com/> 
        
        
        
        
"Ernest Friedman-Hill" <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> >

Sent by: [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>  

05/07/2007 05:03 PM 

Please respond to
[email protected] <mailto:[email protected]> 



To
[email protected] <mailto:[email protected]>  
cc
Subject
Re: JESS: Fire a rule when multiple conditions NOT true


        


        
        
        
        This should do just what you want:
        
        (defrule only-when-starts-with-B-and-D-NOT-present      
              (not (value /B.*/))
              (not (value /D.*/))
              =>
              (printout t "B* and D* NOT present" crlf)
        )
        
        This rule has two conditions: that there are no B* facts, and
that there are 
        no D* facts. Both must be met for the rule to fire.
        
        
        On Monday 07 May 2007 4:04:59 pm Mike Stopper wrote:
        > I'm having trouble getting my head set straight on this one..
        >
        > I'd like to be able to have a rule fire if two or more facts
are NOT true
        > using regular expressions, but can't seem to figure out the
right rule
        > def.
        >
        > Given the following setup:
        >
        > (assert (value "aa"))
        > (assert (value "Bb"))
        > (assert (value "cc"))
        > (assert (value "Dd"))
        > (assert (value "ee"))
        >
        > (defrule only-when-starts-with-B-and-D-present
        >         (value /B.*/)
        >         (value /D.*/)
        >         =>
        >         (printout t "B* and D* present" crlf)
        > )
        >
        > yields
        >
        > B* and D* present
        >
        >
        > but I can't seem to figure out how to get this one to work
such that the
        > RHS is fired only when no fact starts with either /B.*/ or
/D.*/ regular
        > expressions...
        >
        > (assert (value "aa"))
        > ;;(assert (value "Bb"))
        > (assert (value "cc"))
        > ;;(assert (value "Dd"))
        > (assert (value "ee"))
        >
        > (defrule only-when-starts-with-B-and-D-NOT-present
        >
        >         (value /(?!B).*/)
        >         (value /(?!D).*/)
        >         =>
        >         (printout t "B* and D* NOT present" crlf)
        > )
        >
        > fires whether or not B and D are present or not.
        >
        > I've tried various incarnations of the tests, using a Jess
"not"
        > condition, various flavors of regex expressions, all to no
avail.  Can
        > anyone tell me what I'm doing wrong?? Is it a misuse of
facts/rules, or a
        > misunderstanding of just what the LHS can do?
        >
        > Thanks.
        >
        >
        > -- Mike
        > ____________________
        >
        > Michael Stopper
        > Systems Development Scientist
        > SPS Enterprise Architect
        > CACI Transformation Solutions Group
        >
        > Tel 703.460.1845
        > Mobile 703.407.7058
        > [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>   | www.caci.com
<http://www.caci.com/> 
        
        
        
        -- 
        ---------------------------------------------------------
        Ernest Friedman-Hill
        Advanced Software Research          Phone: (925) 294-2154
        Sandia National Labs                FAX:   (925) 294-2234
        PO Box 969, MS 9012                 [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]> 
        Livermore, CA 94550                 http://www.jessrules.com
<http://www.jessrules.com/> 
        
        
--------------------------------------------------------------------
        To unsubscribe, send the words 'unsubscribe jess-users
[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> '
        in the BODY of a message to [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]> , NOT to the list
        (use your own address!) List problems? Notify
[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> .
        
--------------------------------------------------------------------
        
        
        
        
        
        

Reply via email to