[rules-users] Nested negation constraints behavior change from Drools 5.x to 6.x
Mark Proctor
mproctor at codehaus.org
Thu Feb 27 15:07:45 EST 2014
If you can work it into some sort of unit test, we’ll fix it ASAP. If you look at:
"Re: [rules-users] NullPointerException with LeftTupleIndexHashTable.remove()”
You’ll see there he created a large project, which we then on the dev mailing list showed how to convert into a single self contained unit test. If you could follow that, it would be appreciated and save us a lot of time.
Mark
On 27 Feb 2014, at 19:50, mikerod <mjr4184 at gmail.com> wrote:
> With both Drools v5.5.0.Final and v5.6.0.Final I observe a different behavior
> than in both v6.0.0.Final and v6.0.1.Final.
> in certain rules with negation wrapped around nested constraints.
>
> I have tried to make the simplest rules to demonstrate the situation.
>
> With a kb consisting of the following rules, which I have comments on that
> describe what I've
> found with the situation:
>
> ```
> // Enabling this rule, makes "negation_over_nested" and
> // "negation_distributed_partially_sharing" fire;
> // without it they do not.
> //
> // I think this is due to some shared structure
> // in the underlying subnetwork (I believe this is referred to as a
> "segment").
> // Perhaps it makes them "linked" in when otherwise they are being missed.
>
> /** *This is commented out, uncommenting causes different firing of other
> rules*
> rule shared_conjunct
> when
> (not (String() and Integer()))
> then
> System.out.println("shared_conjunct");
> end
> */
>
> // Won't fire with no wm facts UNLESS
> // it shares (I think) a node/subnetwork/segment with constraints
> // in a rule like "rule shared_conjunct" that DOES fire
> rule negation_over_nested
> when
> not ( (String() and Integer())
> or
> (String() and Integer()))
> then
> System.out.println("negation_over_nested");
> end
>
> // Won't fire with no wm facts
> rule negation_distributed_partially_no_sharing
> when
> (not (String() and Long()))
> and
> (not (String() and Long()))
> then
> System.out.println("negation_distributed_partially_no_sharing");
> end
>
> // Same situation as "negation_over_nested"
> rule negation_distributed_partially_sharing
> when
> (not (String() and Integer()))
> and
> (not (String() and Integer()))
> then
> System.out.println("negation_distributed_partially_sharing");
> end
>
> // DOES fire with no wm inserts.
> // DOES NOT need "shared_conjunct" to work
> rule negation_distributed_fully
> when
> ((not String()) or (not Integer()))
> and
> ((not String()) or (not Integer()))
> then
> System.out.println("negation_distributed_fully");
> end
>
> ```
>
> ---
>
> This is the only 2 rules in the kb. Running a session, with no facts
> inserted and then firing all rules.
>
> ---
> Drools v5.x output
>
> with "shared_conjuct" rule uncommented:
> ```
> negation_distributed_fully
> negation_distributed_fully
> negation_distributed_fully
> negation_distributed_fully
> negation_distributed_partially_no_sharing
> negation_distributed_partially_sharing
> negation_over_nested
> shared_conjunct
> fired: 8
> time elapsed: 0.0
> done
> ```
>
> with "shared_conjuct" rule commented out:
> ```
> negation_distributed_fully
> negation_distributed_fully
> negation_distributed_fully
> negation_distributed_fully
> negation_distributed_partially_no_sharing
> negation_distributed_partially_sharing
> negation_over_nested
> fired: 7
> time elapsed: 0.0010
> done
> ```
>
> ---
> Drools v6.x output:
> with "shared_conjuct" rule uncommented:
> ```
> shared_conjunct
> negation_over_nested
> negation_distributed_partially_sharing
> negation_distributed_fully
> negation_distributed_fully
> negation_distributed_fully
> negation_distributed_fully
> fired: 7
> time elapsed: 0.0
> done
> ```
>
> with "shared_conjuct" rule commented out:
> ```
> negation_distributed_fully
> negation_distributed_fully
> negation_distributed_fully
> negation_distributed_fully
> fired: 4
> time elapsed: 0.0
> done
> ```
>
> I do note in the v6.x output, "negation_distributed_partially_no_sharing"
> never fires, since it is specifically not sharing any
> negated conjunt with the other rules. This seems to correlate with whether
> or not these rules fire.
> Also, I realize my terminology is slightly off. I think this is an issue
> with rules having shared "segments", where
> one of these segments that is shared is the negation subnetwork introduced
> in "shared_conjunct".
>
> I also note that "negation_distributed_fully" always fires, independent of
> any potential "segment" sharing.
>
> As I mentioned in a comment on "shared_conjuct", I'm thinking this relates
> to the newer PHREAK algorithm vs the original ReteOO.
>
> Is this expected? Is there something incorrect about the structure of the
> negation rules?
> Perhaps I have stumbled upon a defect?
>
> I have not had time to do any sort of deeper debugging into the issue, if I
> find out more info, I'll post it up here.
>
> p.s. I know the types are not meaningful, this is just an example to show
> the difference. I hope it accomplishes this goal.
>
>
>
>
> --
> View this message in context: http://drools.46999.n3.nabble.com/Nested-negation-constraints-behavior-change-from-Drools-5-x-to-6-x-tp4028390.html
> Sent from the Drools: User forum mailing list archive at Nabble.com.
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
More information about the rules-users
mailing list