<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body text="#000000" bgcolor="#ffffff">
Mark and I were discussing backwards chaining<br>
<a class="moz-txt-link-freetext" href="http://blog.athico.com/2011/04/backward-chaining-emerges-in-drools.html">http://blog.athico.com/2011/04/backward-chaining-emerges-in-drools.html</a><br>
on IRC and we 'd like your opinion on a design issue.<br>
<br>
The example<br>
========<br>
<br>
Let's say you have this data:<br>
Location("crackers", "kitchen")<br>
Location("apple", "kitchen")<br>
Location("chocolate", "living room")<br>
Location("chips", "living room")<br>
<br>
Let's say you have this code:<br>
<br>
<div class="line number1 index0 alt2"><code class="drl keyword">query</code>
<code class="drl plain">editableThings( String thing, String
location ) </code></div>
<div class="line number2 index1 alt1"><code class="drl spaces"> </code><code
class="drl plain">Location(thing, location)</code></div>
<div class="line number4 index3 alt1"><code class="drl keyword">end</code></div>
<br>
And then these 3 rules:<br>
<br>
<div class="line number21 index20 alt2"><code class="drl keyword">rule</code>
<code class="drl plain">outputinput<br>
</code><code class="drl keyword">when</code></div>
<div class="line number22 index21 alt1"><code class="drl spaces"> </code><code
class="drl plain">Here( loc : location) </code></div>
<div class="line number23 index22 alt2"><code class="drl spaces"> </code><code
class="drl plain">?</code><code class="drl plain">editableThings</code><code
class="drl plain">(food, </code><code class="drl plain">loc</code><code
class="drl plain">;)</code></div>
<div class="line number24 index23 alt1"><code class="drl keyword">then</code><br>
System.out.println("Food " + f + " at location " + loc);<br>
// Output:<br>
// Food crackers at location kitchen<br>
// Food apple at location kitchen</div>
<div class="line number29 index28 alt2"><code class="drl keyword">end<br>
</code><br>
<div class="line number21 index20 alt2"><code class="drl keyword">rule</code>
<code class="drl plain">outputOutput<br>
</code><code class="drl keyword">when</code></div>
<div class="line number23 index22 alt2"><code class="drl spaces"> </code><code
class="drl plain">?</code><code class="drl plain">editableThings</code><code
class="drl plain">(food, </code><code class="drl plain">loc</code><code
class="drl plain">;)</code></div>
<div class="line number24 index23 alt1"><code class="drl keyword">then</code><br>
System.out.println("Food " + f + " at location " + loc);<br>
// Output:<br>
// Food crackers at location kitchen<br>
// Food apple at location kitchen<br>
// Food chocolate at location living room<br>
// Food chips at location living room
</div>
<div class="line number29 index28 alt2"><code class="drl keyword">end<br>
<br>
</code>
<div class="line number21 index20 alt2"><code class="drl
keyword">rule</code> <code class="drl plain">typo<br>
</code><code class="drl keyword">when</code></div>
<div class="line number22 index21 alt1"><code class="drl spaces"> </code><code
class="drl plain">Here( looc : location) </code></div>
<div class="line number23 index22 alt2"><code class="drl spaces"> </code><code
class="drl plain">?</code><code class="drl plain">editableThings</code><code
class="drl plain">(food, </code><code class="drl plain">loc</code><code
class="drl plain">;)</code></div>
<div class="line number24 index23 alt1"><code class="drl
keyword">then</code><br>
System.out.println("Food " + f + " at location " + loc);<br>
// Output:<br>
// Food crackers at location kitchen<br>
// Food apple at location kitchen<br>
// Food chocolate at location living room<br>
// Food chips at location living room</div>
<div class="line number29 index28 alt2"><code class="drl
keyword">end</code></div>
<br>
</div>
<br>
</div>
The discussion<br>
=========<br>
<br>
Both rules have the same statement:<br>
<code class="drl plain">?</code><code class="drl plain">editableThings</code><code
class="drl plain">(food, </code><code class="drl plain">loc</code><code
class="drl plain">;)</code><br>
<br>
<code class="drl plain"></code>In the outputInput rule, "<code
class="drl plain"></code><code class="drl plain">loc</code><code
class="drl plain"></code>" is an input variable.<br>
<code class="drl plain"></code>In the outputOutput rule, "<code
class="drl plain"></code><code class="drl plain">loc</code><code
class="drl plain"></code>" is an output variable.<br>
<br>
I am wondering if we don't need a visual demarcation that a variable
is an output variable,<br>
to make it stand out of an input variable?<br>
<br>
Proposition 1: Suffix output variables with ":"<br>
<br>
<div class="line number21 index20 alt2"><code class="drl keyword">rule</code>
<code class="drl plain">outputinput<br>
</code><code class="drl keyword">when</code></div>
<div class="line number22 index21 alt1"><code class="drl spaces"> </code><code
class="drl plain">Here( loc : location) </code></div>
<div class="line number23 index22 alt2"><code class="drl spaces"> </code><code
class="drl plain">?</code><code class="drl plain">editableThings</code><code
class="drl plain">(food:, </code><code class="drl plain">loc</code><code
class="drl plain">;)</code></div>
<div class="line number24 index23 alt1"><code class="drl keyword">then
... end<br>
<br>
</code>
<div class="line number21 index20 alt2"><code class="drl keyword">rule</code>
<code class="drl plain">outputOutput<br>
</code><code class="drl keyword">when</code></div>
<div class="line number23 index22 alt2"><code class="drl spaces"> </code><code
class="drl plain">?</code><code class="drl plain">editableThings</code><code
class="drl plain">(food:, </code><code class="drl plain">loc:</code><code
class="drl plain">;)</code></div>
<div class="line number24 index23 alt1"><code class="drl keyword">then
... end</code><code class="drl keyword"></code></div>
<br>
<div class="line number21 index20 alt2"><code class="drl keyword">rule</code>
<code class="drl plain">typo<br>
</code><code class="drl keyword">when</code></div>
<div class="line number22 index21 alt1"><code class="drl spaces"> </code><code
class="drl plain">Here( looc : location) </code></div>
<div class="line number23 index22 alt2"><code class="drl spaces"> </code><code
class="drl plain">?</code><code class="drl plain">editableThings</code><code
class="drl plain">(food:, </code><code class="drl plain">loc</code><code
class="drl plain">;) // compiler error because input variable
loc is not declared</code><code class="drl plain"></code>
<div class="line number24 index23 alt1"><code class="drl
keyword">then ... end</code></div>
</div>
</div>
<br>
<br>
-- <br>
With kind regards,<br>
Geoffrey De Smet
</body>
</html>