[rules-users] Reasoning over hierarchies.
Mark Proctor
mproctor at codehaus.org
Wed Jan 21 15:49:32 EST 2009
you can do something like this to drive backward chaining queries.
Notice it inserts a new fact to drive the query down the graph, but
deletes that driver once all it's children have been evaluated. It uses
the -5 salience to ensure it's done after all the children have been
evaluated. So just insert an initial FindAncestor fact call
fireAllRules() and it'll println if it's an ancesor, you could ofcourse
have it insert a result object, or set a value on the originally
inserted FindAncestor.
rule "query parent"
when
FindAncestor( $name == name, $ancestor : ancestor )
$child : Person( name == $name, $parent : parent )
$parent : Person( this == $parent, this != ancestor)
then
insert( new FindAncestor( $parent, $ancestor ) )
end
rule "retract query parent driver"
salience - 5
when
$f : FindAncestor( $name == name, $ancestor : ancestor )
$child : Person( name == $name, $parent : parent )
$parent : Person( this == $parent, this != ancestor)
then
retract( $f )
end
rule "ancestor found"
when
FindAncestor( $name == name, $ancestor : ancestor )
$child : Person( name == $name, $parent : parent )
$parent : Person( this == $parent, this == ancestor)
then
println( "is ancestor" )
end
rule "retract query ancestor found driver"
salience - 5
when
$f : FindAncestor( $name == name, $ancestor : ancestor )
$child : Person( name == $name, $parent : parent )
$parent : Person( this == $parent, this == ancestor)
then
retract( $f )
end
Mark
Faron Dutton wrote:
> 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
>>
>>
>>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090121/4881464f/attachment.html
More information about the rules-users
mailing list