You could have something along the lines

class Person {
     Person parent;

     Collection getAncestors() {
           Collection<Person> ancestors = new HashSet<Person>();
           
            Person currentAncestor = parent;

            while(currentAncestor != null) {
                   ancestors.add(currentAncestor);
                   currentAncestor = currentAncestor.getParent();
            }
     }
}

query isAncestor(String a, String b)
   p: Person(name = a)
   c: Person(name = b, ancestors contains p)
end

that should do it

dave

On Wed, Jan 21, 2009 at 8:54 AM, Faron Dutton <fgdutton@gmail.com> wrote:
I know this has probably been asked before but I cannot find any mention of
it. How does one reason over a transitive (recursive) relation in Drools?

-----------------------------------------------------------

The classic example from Prolog:

-- The relation parent(P,C) says that P is a parent of C.
parent(P,C).

-- The predicate ancestor(A,B) implies that A is an ancestor
-- of B if A is a parent of B or A is a parent of C and C
-- is an ancestor of B.
ancestor(A,B) :- parent(A,B).
ancestor(A,B) :- parent(A,C), ancestor(C,B).

-- The query ancestor(bob,frank) asks if bob is an ancestor
-- of frank.
?- ancestor(bob,frank).

-----------------------------------------------------------

In Drools, I can find the parent using

query isParent(String a, String b)
   p: Person(name = a)
   c: Person(name = b, parent = p)
end

likewise, I can find the grandparent using

query isGrandparent(String a, String b)
   g: Person(name = a)
   p: Person(parent = g)
   c: Person(name = b, parent = p)
end

I am unable to formulate the query isAncestor.

_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users