[rules-users] Misunderstanding salience?

Michael Anstis michael.anstis at gmail.com
Wed Mar 9 02:58:11 EST 2011


You had me fooled Peter, I thought you worked in a zombie related field ;-)

Control Facts can also be used, which I think David eluded to with his use
of "null advice", such that:-

*rule* "General brain eating advice"

       *when*

              p : Patient(eatsBrains == *true*)

                     not Diagnosis( patient == $p )

       *then*

              p.setAdvice("Stop eating brains, or at least, try to cut
down");


              insertLogical( new Diagnosis( $p ) );

*end*



*rule* "Zombie exception to brain eating advice"

       *salience* -50

       *when*

              p : Patient(eatsBrains == *true*, isZombie == *true*)

                     not Diagnosis( patient == $p )

       *then*

              p.setAdvice("Evidence suggests that the undead cannot contract
Kuru or that the effects are irellevant given the " +

                              "patient's current zombified state.\nSuggest
euthenasing patient lest he/she eat your (or someone " +

                              "else's) brains");

              insertLogical( new Diagnosis( $p ) );

*
*
*end*

As David states, more specific rules should have higher salience than the
more general that should have lower. Salience controls conflict resolution,
which is the order in which activations on the agenda are evaluated, it does
not control which rules are evaluated - which happens as facts are inserted
into working memory and not when fireAllRules( ) invoked.

With kind regards,

Mike

2011/3/9 Peter Ashford <petera at bestpractice.org.nz>

> Thanks for the ideas, David.
>
>
>
> What I ultimately want to achieve is to have the individual rules
> independent of each other to the maximal degree to which that is possible.
> That’s why I didn’ t want to have isZombie==false in the general rule – I
> wanted the general case to be unaware of the exceptions.  The field in which
> I’m working is clinical decision support where there might be a number of
> exceptions and corner cases.  I’d like to be able to express the core logic
> without reference to the corner cases and then deal with the exceptions
> separately.
>
>
>
> I think your idea of using salience but only adding advice if it hasn’t
> already been given fits the bill – that way the general case can be simple
> and not have to explicitly exclude all the exception cases.
>
>
>
> Thanks very much for the feedback – it’s really valuable to get an idea
> about what options are available and what’s considered best practice.
>
>
>
> Cheers!
>
>
>
> Peter.
>
>
>
>
>
> *From:* rules-users-bounces at lists.jboss.org [mailto:
> rules-users-bounces at lists.jboss.org] *On Behalf Of *David Faulkner
> *Sent:* Wednesday, 9 March 2011 4:51 p.m.
>
> *To:* Rules Users List
> *Subject:* Re: [rules-users] Misunderstanding salience?
>
>
>
> Peter,
>
>
>
> The EXACT way to accomplish the functionality that you are looking for is
> “activation-group”; if two rules are in the same activation group, only one
> of them will fire. Note that the rule with HIGHER salience will fire first;
> to accomplish what you are looking for you’d have to give the exception rule
> a higher salience.
>
>
>
> I would also note that although there are specific instances where
> activation-group has a strong need, many in the community find that the most
> power and flexibility from the rule engine comes from “letting go” of trying
> to exactly order your rule execution, and instead letting the rule engine
> decide what would happen here. One way to accomplish this in your case would
> be to simply add (isZombie == false) to your constraint on the general rule.
>  Another way that involves salience but NOT agenda groups is to set a high
> salience on your exception rule, but only add advice if advice is null. The
> possibilities are endless.
>
>
>
> With kind regards,
>
> David Faulkner
>
> david.faulkner at amentra.com
>
>
>
> *From:* rules-users-bounces at lists.jboss.org [mailto:
> rules-users-bounces at lists.jboss.org] *On Behalf Of *Peter Ashford
> *Sent:* Wednesday, March 09, 2011 7:24 AM
> *To:* Rules Users List
> *Subject:* Re: [rules-users] Misunderstanding salience?
>
>
>
> Actually, I think I’ve figured this one out : in the Zombie case, it’s
> firing both rules and it’s just that with the negative salience,  the zombie
> exception rule is the last rule fired, therefore, the last thing written
> into advice.
>
>
>
> So... what would be the correct way to do what I’m trying to do here?  The
> idea is that the Zombie exception rule should fire in preference to the
> general rule and that none of the general processing should occur at all
> (imaging that these rules had side-effects for the rest of the system
> they’re attached to, we don’t want all the general rule side effects to
> apply and then all the exception case side effects)
>
>
>
> Thanks in advance!
>
>
>
> Peter.
>
>
>
> *From:* rules-users-bounces at lists.jboss.org [mailto:
> rules-users-bounces at lists.jboss.org] *On Behalf Of *Peter Ashford
> *Sent:* Wednesday, 9 March 2011 1:31 p.m.
> *To:* rules-users at lists.jboss.org
> *Subject:* [rules-users] Misunderstanding salience?
>
>
>
> Hi There
>
>
>
> I’m new to drools.  I’ve just set up the Drools-Server and it is (finally!)
> working and serving my test rule-set.  The one thing that’s not working as I
> expect it is the rule ordering via salience.  This is my simple test rule
> set:
>
>
>
> *rule* "General brain eating advice"
>
>        *when*
>
>               p : Patient(eatsBrains == *true*)
>
>        *then*
>
>               p.setAdvice("Stop eating brains, or at least, try to cut
> down");
>
> *end*
>
>
>
> *rule* "Zombie exception to brain eating advice"
>
>        *salience* -50
>
>        *when*
>
>               p : Patient(eatsBrains == *true*, isZombie == *true*)
>
>        *then*
>
>               p.setAdvice("Evidence suggests that the undead cannot
> contract Kuru or that the effects are irellevant given the " +
>
>                               "patient's current zombified state.\nSuggest
> euthenasing patient lest he/she eat your (or someone " +
>
>                               "else's) brains");
>
> *end*
>
>
>
>
>
> The idea is that the first rule fires all the time unless the patient
> happens to be a zombie, in which case the exception rule (the second rule)
> kicks in.  Now, as I have it here, with the exception at salience at -50 it
> actually works, which is the opposite of what I was expecting.  I’d thought
> that I would have had to have the exception at a higher salience to fire
> first.  That was what I tried first but that didn’t work – everyone got the
> general advice, zombies included.
>
>
>
> What am I misunderstanding here?
>
>
>
> Thanks!
>
>
>
> Peter.
>
>
>
> ---
>
> “It is very difficult to get a man to understand something when his tribal
> identity depends on his not understanding it” - Michael Bérubé on
> Republican climate change denial.
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110309/463b1f45/attachment.html 


More information about the rules-users mailing list