<div>&nbsp;</div>
<div>&nbsp;&nbsp; You will have to use regular insert() instead of insertLogical(). This is because:</div>
<div>&nbsp;</div>
<div>rule &quot;reachDirect&quot;<br>&nbsp;&nbsp; salience 10<br>&nbsp;&nbsp; when<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e : Edge(s1 : source, t1 : target)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not( Reach(source == s1, target == t1) )<br>&nbsp;&nbsp; then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertLogical( new Reach(e.getSource(),e.getTarget()) );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( &quot;Reach &quot; + e.getSource() + &quot;,&quot; + e.getTarget() );<br>end<br>&nbsp;</div>
<div>&nbsp;&nbsp; Is initially true, but once the consequence is executed, the insert(new Reach()) will cause the pattern &quot;not(Reach(...))&quot; to become false and so the object is retracted, causing the recursion.</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp; []s</div>
<div>&nbsp;&nbsp; Edson<br><br>&nbsp;</div>
<div><span class="gmail_quote">2008/7/3, Paul Fodor &lt;<a href="mailto:paul.i.fodor@gmail.com">paul.i.fodor@gmail.com</a>&gt;:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">On Thu, Jul 3, 2008 at 3:56 PM, Paul Fodor &lt;<a href="mailto:paul.i.fodor@gmail.com">paul.i.fodor@gmail.com</a>&gt; wrote:<br>
&gt; Dear Sir,<br>&gt;<br>&gt; I am new to Drools and I want to ask how can I implement the classical<br>&gt; transitive closure in Drools. For instance we have a bunch of facts<br>&gt; edge/2 and the transitive closure:<br>
&gt;<br>&gt; reach(X,Y):- edge(X,Y).<br>&gt; reach(X,Y):- edge(X,Z),reach(Z,Y).<br><br>My current version looks like the following, but it never terminates.<br>It re-derives reach(c,c) forever.<br><br>TransitiveClosure.drl :<br>
package org.drools.examples<br><br>import org.drools.examples.TransitiveClosureExample.Edge;<br>import org.drools.examples.TransitiveClosureExample.Reach;<br><br>rule &quot;reachDirect&quot;<br>&nbsp;&nbsp; salience 10<br>&nbsp;&nbsp; when<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e : Edge(s1 : source, t1 : target)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not( Reach(source == s1, target == t1) )<br>&nbsp;&nbsp; then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertLogical( new Reach(e.getSource(),e.getTarget()) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( &quot;Reach &quot; + e.getSource() + &quot;,&quot; + e.getTarget() );<br>
end<br><br>rule &quot;reachIndirect&quot;<br>&nbsp;&nbsp; salience 10<br>&nbsp;&nbsp; when<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e : Edge(s1 : source, t1 : target)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r : Reach(t2 : target, source == t1 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not( Reach(source == s1, target == t2) )<br>&nbsp;&nbsp; then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertLogical( new Reach(e.getSource(),r.getTarget()) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( &quot;Reach &quot; + e.getSource() + &quot;,&quot; + r.getTarget() );<br>end<br><br>TransitiveClosureExample.java :<br><br>package org.drools.examples;<br>
import java.io.InputStreamReader;<br>import org.drools.RuleBase;<br>import org.drools.RuleBaseFactory;<br>import org.drools.StatefulSession;<br>import org.drools.audit.WorkingMemoryFileLogger;<br>import org.drools.compiler.PackageBuilder;<br>
import org.drools.compiler.PackageBuilderConfiguration;<br><br>public class TransitiveClosureExample {<br>&nbsp;&nbsp; public static void main(final String[] args) throws Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PackageBuilderConfiguration conf = new PackageBuilderConfiguration();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final PackageBuilder builder = new PackageBuilder( conf );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder.addPackageFromDrl( new InputStreamReader(<br>TransitiveClosureExample.class.getResourceAsStream(<br>&quot;TransitiveClosure.drl&quot; ) ) );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final RuleBase ruleBase = RuleBaseFactory.newRuleBase();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ruleBase.addPackage( builder.getPackage() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final StatefulSession session = ruleBase.newStatefulSession();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final WorkingMemoryFileLogger logger = new<br>
WorkingMemoryFileLogger( session );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.setFileName( &quot;log/transitiveClosure&quot; );<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Edge edgeAB = new Edge( &quot;a&quot;,&quot;b&quot; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Edge edgeBC = new Edge( &quot;b&quot;,&quot;c&quot; );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Edge edgeCD = new Edge( &quot;c&quot;,&quot;d&quot; );<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.insert( edgeAB );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.insert( edgeBC );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.insert( edgeCD );<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.fireAllRules();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.writeToDisk();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.dispose();<br>&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; public static class Edge {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String source;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String target;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Edge() {}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Edge(String source, String target) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.source = source;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.target = target;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getSource() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return source;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getTarget() {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return source;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; public static class Reach {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String source;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String target;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Reach() {}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Reach(String source, String target) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.source = source;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.target = target;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setSource(String source) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.source = source;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getSource() {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return source;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setTarget(String target) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.target = target;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getTarget() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return target;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br>
}<br><br>Any sugestion?<br><br>Regards,<br>Paul Fodor<br>_______________________________________________<br>rules-users mailing list<br><a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br><a href="https://lists.jboss.org/mailman/listinfo/rules-users">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>&nbsp;&nbsp;Edson Tirelli<br>&nbsp;&nbsp;JBoss Drools Core Development<br>&nbsp;&nbsp;Office: +55 11 3529-6000<br>&nbsp;&nbsp;Mobile: +55 11 9287-5646<br>&nbsp;&nbsp;JBoss, a division of Red Hat @ <a href="http://www.jboss.com">www.jboss.com</a>