
Type: Bug

Status: Resolved (View Workflow)

Priority: Major

Resolution: Done

Affects Version/s: 5.1.1.FINAL

Fix Version/s: 5.2.0.M1

Component/s: None

Labels:None
Given classes
class Triangle
class Quadrangle
{ int a, b, c, d;... }with appropriate getters (but no hashCode or equals) and these facts
Triangle( 3, 3, 3 )
Triangle( 3, 3, 3 ) // a duplicate, intentional
Quadrangle ( 3, 4, 5, 6 );
the rule
rule "all equilaterals have a 'fitting' quadrangle"
when
forall( Triangle( $a: a, b == $a, c == $a )
Quadrangle( a == $a  b == $a  c == $a  d == $a ) )
then // ...
end
works as expected  it fires.
But the rule
rule "all equilaterals have a duplicate"
when
forall( $t: Triangle( $a: a, b == $a, c == $a )
Triangle( this != $t, a == $a, b == $a , c == $a ) )
then // ...
end
does not fire, not even when I omit this != $t.
Since he following rule is just a variant of (Expert) Example 4.66, "All Buses are Red", I think that there is a bug, in 5.1.1:
// Does not fire even though all Triangle have all sides > 0
rule "All triangle sides are greater than 0"
when
forall( Triangle( a > 0, b > 0, c > 0 ) )
then
System.out.println( "All triangle sides are > 0." );
end
Also, the tortuous equivalent does not fire:
// Does not fire even though all Triangle have all sides > 0
rule "All triangle sides are greater than 0"
when
forall( $t: Triangle()
Triangle( this == $t, a > 0, b > 0, c > 0 ) )
then
System.out.println( "All triangle sides are > 0." );
end
 is incorporated by

JBRULES2769 Create a "transaction"like context for WMA to prevent inconsistent intermediatestates
 Open