Hello Michael,<br><br><div class="gmail_quote">On 1 April 2011 09:01, Michael Anstis <span dir="ltr"><<a href="mailto:michael.anstis@gmail.com" target="_blank">michael.anstis@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
hehe, so I walked into this one with my eyes wide shut :)<br><br>Given it is only possible to define implicit logical AND's between field constraints within a decision table and given it is not possible to introduce complexity with parenthesis, is the immediate problem domain smaller than the more generalised discussion surrounding "otherwise" or "else"?<br>
<br>The first limitation can be overcome by converting multiple single field constraints on the same field to a single compound field constraint on the same field; thus:-<br><br>r1: age > 14, age <= 28 (i.e. age > 14 && <= 28) becomes<br>
rx: age <= 14 || > 28<br><br>I wonder whether this problem cannot simply be resolved with application of DeMorgan's Theorems (something I know a little about from studying electronics as a student years ago).<br>
</blockquote><div><br>Attaboy!<br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>Unlike some commentators I am not an expert in first order logic, and
therefore would appreciate guidance if people are willing to help.<br></blockquote><div><br>Well, the point is that you can come up with pretty nasty constraints even without parentheses:<br><br> a > $1 && != $2 && < $3 # implicit assumption: $1 < $2 < $3<br>
<br>Of course, de Morgan will help you here, too, but you'll have to develop some hefty symbolic expression handling.<br><br>If expressions E<font size="1">1<font size="2">, E<font size="1">2<font size="2">, are the combined logical expressions for some field from rules r1, r2,..., the "otherwise" condition is<br>
<br>¬ ( </font></font></font></font>E<font size="1">1<font size="2"> || E<font size="1">2</font></font></font> || ... ) =<br><font size="1"><font size="2"><font size="1"><font size="2">¬ </font></font></font></font>E<font size="1">1 && </font><font size="1"><font size="2"><font size="1"><font size="2">¬ </font></font></font></font><font size="1"><font size="2">E<font size="1">2 && ...<br>
<font size="2"><br>and you continue to apply de Morgan's laws to all E<font size="1">i<font size="2">.<br></font></font></font></font></font></font><br><font size="1"><font size="2"><font size="1"><font size="2"><font size="1"><font size="2">But what about the very natural constraint combination of two or more fields as in my age/income example?<br>
<br></font></font></font></font></font></font><font size="1"><font size="2"><font size="1"><font size="2"><font size="1"><font size="2">Perhaps an entirely different approach should be considered, too. I'm thinking of a generic mechanism, which would have to gain control before any rule from a certain rule table is executed for another fact or set of facts. Then you could inspect all pending activations, and whenever you have one for a rule without an "otherwise" in a column it should discard any activations for the same fact set for rules with an "otherwise" in that column. I think this could be done from an agenda listener.<br>
<br>-W<br><br></font></font></font></font></font></font><br><br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>Thanks,<br><br>Mike<br><br><div class="gmail_quote">On 1 April 2011 07:02, Wolfgang Laun <span dir="ltr"><<a href="mailto:wolfgang.laun@gmail.com" target="_blank">wolfgang.laun@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Michael,<br>
<br>
My position is that an otherwise for a single column is likely to<br>
cause trouble by misunderstandings. Especially the operators >, >=, <,<br>
<= are likely to be used to separate intervals, as in<br>
r1: age > 14, age <= 28<br>
r2: age > 28, age <= 42<br>
<br>
If you apply the proposed definition, the otherwise results in<br>
rx: age <= 14, age > 42<br>
which is obviously never true.<br>
<br>
You can construct similar blackouts with two different fields, e.g.<br>
r1: age > 60, income > 100000<br>
r2: age > 40, income > 80000<br>
<br>
You will have to do an in-depth analysis of the AST resulting from the<br>
condition definition resulting from rule table lines $n+2 and $n+3 in<br>
order to get it right.<br>
<br>
My opinion is: Don't do it unless you can do it right.<br>
<br>
Cheers<br>
<font color="#888888">Wolfgang<br>
</font><br>
PS: I could provide a definition for otherwise with matches and<br>
soundslike, but I'd rather not.<br>
<div><div></div><div><br>
<br>
On 31 March 2011 21:25, Michael Anstis <<a href="mailto:michael.anstis@gmail.com" target="_blank">michael.anstis@gmail.com</a>> wrote:<br>
> Hi,<br>
><br>
> I'm adding support for "otherwise" to (for the time being) the guided<br>
> decision table in Guvnor.<br>
><br>
> The idea being if you set a cell to represent "otherwise" the generated rule<br>
> is the opposite of the accumulation of the other cells; perhaps best<br>
> explained with an example:-<br>
><br>
> Person( name == )<br>
> Mark<br>
> Kris<br>
> Geoffrey<br>
> <otherwise><br>
><br>
> This would generate:-<br>
><br>
> Person(name not in ("Mark", "Kris", "Geoffrey")<br>
><br>
> Equals is the simple example, this is my thoughts for the other operators we<br>
> might like to support:-<br>
><br>
> != becomes "in (<list of the other cells' values)"<br>
> < becomes ">= the maximum value of the other cells' values<br>
><br>
> For example:-<br>
><br>
> Person ( age < )<br>
> 10<br>
> 20<br>
> 30<br>
> <otherwise><br>
><br>
> Person ( age >= 30 )<br>
><br>
> <= becomes "> the maximum value of the other cells' values<br>
>> becomes "<= the minimum value of the other cells' values<br>
>>= becomes "< the minimum value of the other cells' values<br>
> "in" becomes "not in (<a list of all values contained in all the other<br>
> cells' lists of values>)"<br>
><br>
> For example:-<br>
><br>
> Person ( name in )<br>
> Jim, Jack<br>
> Lisa, Jane, Paul<br>
> <otherwise><br>
><br>
> Person ( name not in ("Jim", "Jack", "Lisa", "Jane", "Paul" ) )<br>
><br>
> I'm not sure there is a simple solution for "matches" and "soundslike" but<br>
> welcome advice, although a possibility might be to create a compound field<br>
> constraint:-<br>
><br>
> Person ( name soundslike )<br>
> Fred<br>
> Phil<br>
><br>
> not Person ( name soundslike "Fred" || soundslike "Phil" )<br>
><br>
><br>
> Would this be considered the most suitable approach?<br>
><br>
> Inputs and thoughts welcome.<br>
><br>
> Thanks,<br>
><br>
> Mike<br>
><br>
><br>
</div></div><div><div></div><div>> _______________________________________________<br>
> rules-dev mailing list<br>
> <a href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a><br>
> <a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
><br>
><br>
_______________________________________________<br>
rules-dev mailing list<br>
<a href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
</div></div></blockquote></div><br>
<br>_______________________________________________<br>
rules-dev mailing list<br>
<a href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
<br></blockquote></div><br>