[rules-users] Re: transitive closure

Edson Tirelli tirelli at post.com
Thu Jul 3 21:48:36 EDT 2008


   You will have to use regular insert() instead of insertLogical(). This is
because:

rule "reachDirect"
   salience 10
   when
       e : Edge(s1 : source, t1 : target)
       not( Reach(source == s1, target == t1) )
   then
       insertLogical( new Reach(e.getSource(),e.getTarget()) );
       System.out.println( "Reach " + e.getSource() + "," + e.getTarget() );
end

   Is initially true, but once the consequence is executed, the insert(new
Reach()) will cause the pattern "not(Reach(...))" to become false and so the
object is retracted, causing the recursion.

   []s
   Edson


2008/7/3, Paul Fodor <paul.i.fodor at gmail.com>:
>
> On Thu, Jul 3, 2008 at 3:56 PM, Paul Fodor <paul.i.fodor at gmail.com> wrote:
> > Dear Sir,
> >
> > I am new to Drools and I want to ask how can I implement the classical
> > transitive closure in Drools. For instance we have a bunch of facts
> > edge/2 and the transitive closure:
> >
> > reach(X,Y):- edge(X,Y).
> > reach(X,Y):- edge(X,Z),reach(Z,Y).
>
> My current version looks like the following, but it never terminates.
> It re-derives reach(c,c) forever.
>
> TransitiveClosure.drl :
> package org.drools.examples
>
> import org.drools.examples.TransitiveClosureExample.Edge;
> import org.drools.examples.TransitiveClosureExample.Reach;
>
> rule "reachDirect"
>    salience 10
>    when
>        e : Edge(s1 : source, t1 : target)
>        not( Reach(source == s1, target == t1) )
>    then
>        insertLogical( new Reach(e.getSource(),e.getTarget()) );
>        System.out.println( "Reach " + e.getSource() + "," + e.getTarget()
> );
> end
>
> rule "reachIndirect"
>    salience 10
>    when
>        e : Edge(s1 : source, t1 : target)
>        r : Reach(t2 : target, source == t1 )
>        not( Reach(source == s1, target == t2) )
>    then
>        insertLogical( new Reach(e.getSource(),r.getTarget()) );
>        System.out.println( "Reach " + e.getSource() + "," + r.getTarget()
> );
> end
>
> TransitiveClosureExample.java :
>
> package org.drools.examples;
> import java.io.InputStreamReader;
> import org.drools.RuleBase;
> import org.drools.RuleBaseFactory;
> import org.drools.StatefulSession;
> import org.drools.audit.WorkingMemoryFileLogger;
> import org.drools.compiler.PackageBuilder;
> import org.drools.compiler.PackageBuilderConfiguration;
>
> public class TransitiveClosureExample {
>    public static void main(final String[] args) throws Exception {
>        PackageBuilderConfiguration conf = new
> PackageBuilderConfiguration();
>        final PackageBuilder builder = new PackageBuilder( conf );
>        builder.addPackageFromDrl( new InputStreamReader(
> TransitiveClosureExample.class.getResourceAsStream(
> "TransitiveClosure.drl" ) ) );
>        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
>        ruleBase.addPackage( builder.getPackage() );
>        final StatefulSession session = ruleBase.newStatefulSession();
>        final WorkingMemoryFileLogger logger = new
> WorkingMemoryFileLogger( session );
>        logger.setFileName( "log/transitiveClosure" );
>
>        final Edge edgeAB = new Edge( "a","b" );
>        final Edge edgeBC = new Edge( "b","c" );
>        final Edge edgeCD = new Edge( "c","d" );
>
>        session.insert( edgeAB );
>        session.insert( edgeBC );
>        session.insert( edgeCD );
>
>        session.fireAllRules();
>        logger.writeToDisk();
>        session.dispose();
>    }
>
>    public static class Edge {
>        private String source;
>        private String target;
>        public Edge() {}
>        public Edge(String source, String target) {
>            super();
>            this.source = source;
>            this.target = target;
>        }
>        public String getSource() {
>            return source;
>        }
>        public String getTarget() {
>            return source;
>        }
>    }
>
>    public static class Reach {
>        private String source;
>        private String target;
>        public Reach() {}
>        public Reach(String source, String target) {
>            super();
>            this.source = source;
>            this.target = target;
>        }
>        public void setSource(String source) {
>            this.source = source;
>        }
>        public String getSource() {
>            return source;
>        }
>        public void setTarget(String target) {
>            this.target = target;
>        }
>        public String getTarget() {
>            return target;
>        }
>    }
> }
>
> Any sugestion?
>
> Regards,
> Paul Fodor
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



-- 
  Edson Tirelli
  JBoss Drools Core Development
  Office: +55 11 3529-6000
  Mobile: +55 11 9287-5646
  JBoss, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080703/a5a2f22b/attachment.html 


More information about the rules-users mailing list