<!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>