[rules-users] Reasoning over hierarchies.

Faron Dutton fgdutton at gmail.com
Wed Jan 21 10:14:38 EST 2009


Thanks. I'll look into this.

On Wed, Jan 21, 2009 at 9:46 AM, Anstis, Michael (M.) <manstis1 at ford.com> wrote:
> I wonder whether a custom accumulate function could be used to move your
> logic out of the object model?
>
> Not that accumulate was (probably) meant for this sort of function but the
> "init" method could create the empty set and "accumulate" perform your
> iteration below?
>
> Just the musing of an idle mind.
>
> ________________________________
> From: rules-users-bounces at lists.jboss.org
> [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of David Sinclair
> Sent: 21 January 2009 14:28
> To: Rules Users List
> Subject: Re: [rules-users] Reasoning over hierarchies.
>
> 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 at 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 at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
> _______________________________________________
> 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