What I had is a very simplified version of how calculating transitive
closure could go wrong...
Let's say we have two rules:
rule 1
when
link(a,b)
then
insertLogical(new reachable(a,b))
rule 2
when
link(a,b) reachable(b,c)
then
insertLogical(new reachable(a,c))
Let's say, I have link(a,b), link(b,c), link(b,a), link(c,b). So,
we'll have reachable(a,b), reachable(b,c), reachable(a,c), etc. But,
after I retract link(a,b) and link(b,a), guess what, reachable(c,a)
still exists! This doesn't sound right to me.
But in Drools, this is possible, because we have:
reachable(c,a) <- link(c,b), reachable(b,a)
reachable(b,a) <- link(b,c), reachable(c,a)
The problem here is that we actually inserted reachable(b,a) multiple
times: first supported by link(b,a) and rule 1, and secondly by
link(b,c) and reachable(c,a) and rule 2. When reachable(b,a) was
inserted the second time, link(b,c) and reachable(c,a) become the
additional supporting condition - maintained by the truth maintenance
system. So, even if link(b,a) is retracted, reachable(b,a) still
exists further supporting reachable(c,a).
Is it clearer?
Thanks.
-Simon
2011/3/7 Edson Tirelli <ed.tirelli(a)gmail.com>:
Simon,
The behavior seems correct to me as B is justified by either A or C (or
both). Of course, from the initial state, A is required for C to first
exist, but once it starts to exist, your rules say that B and C justify each
other and so both remain in memory.
This is design as intended, but do you think that is wrong?
Edson
2011/3/7 Simon Chen <simonchennj(a)gmail.com>
>
> Hi all,
>
> An interesting finding:
>
> I have three simple rules:
> rule "A2B"
> when
> A()
> then
> insertLogical(new B());
> end
> rule "B2C"
> when
> B()
> then
> insertLogical(new C());
> end
> rule "C2B"
> when
> C()
> then
> insertLogical(new B());
> end
>
> Basically, once we have an A(), we'll logically insert a B(). Once we
> have a B(), we'll logically insert a C(). Once we have a C(), we'll
> logically insert a B().
>
> So, I first insert an A(), print all the objects. Retract A(), and
> print all the objects. Here's what I got:
> com.sample.B@42
> com.sample.C@43
> com.sample.A@548997d1
> after retract!
> com.sample.B@42
> com.sample.C@43
>
> So, B() and C(), which should be logically depend on A(), somehow are
> not retracted. The problem I see is the truth maintenance system allow
> B() and C() to depend on each other, thus not affected by losing A().
>
> Is this a bug or my bad usage?
>
> Thanks.
> -Simon
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
--
Edson Tirelli
JBoss Drools Core Development
JBoss by Red Hat @
www.jboss.com
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users