Run Rules

Description

Run a set of rules to infer more findings from a set of input facts.

The rules process is relatively simple.

It takes as its inputs:

  • A set of rules, each one of which:
    • Describes a condition based on one or more facts combined with AND, NOT and OR conditions.
    • Lists a set of findings which should be made if the condition is true
  • A set of input facts

As its output, it lists new findings that have been inferred by the rules.

Input

<RunRules>
<RuleList> <Rule> <name/> <salience/> <condition> : condition </condition> <FindingList> <finding>reference</finding> </FindingList> </Rule> </RuleList>
<FactList> <fact>reference</fact> </FactList> </RunRules>

<name> is a name for the rule, which will be used for any error reporting. It does not have to be unique, but obviously it helps if it is.

<salience> is a number which provides a priority for the rule, in which higher numbers are applied first. This can usually be left to the default value of 0.

<condition> holds a boolean condition, which, if true, sets the findings in the finding list.

At its simplest, the <condition> element lists one or more facts, all of which must be present for the condition to fire. Each fact is surrounded by <fact>.

The <condition> element may contain other elements which evaluate to true or false:

  • <fact> - true if the contained fact is present
  • <or> - true if any of the contained elements are true
  • <and> - true if all of the contained elements are true
  • <not> - if the contained element (of which there must be only one) is not true

These elements may be nested. For example:

<condition>
  <or>
    <fact>a</fact>
    <not>
      <and>
        <fact>b</fact>
        <fact>c</fact>
      </and>
    </not>
  <or>
  <fact>d</fact>
</condition>

This is "(a or not(b and c)) and d"

Logically, <condition> is the same as a high-level <and>.

Once a finding has been made, it will not be re-made.

Output findings can be referred to by reference as facts, i.e. once the finding is inferred it is treated as a fact. You can think of a fact as a input finding, or a finding as an output fact.

Example call:

<RunRules>
  <RuleList>
    <Rule>
      <name>Identify Mammal</name>
      <condition>
        <or>
          <fact>fur</fact>
          <and>
            <fact>suckles.young</fact>
            <fact>breathes.air</fact>
          </and>
        </or>
      </condition>
      <FindingList>
        <finding>mammal</finding>
      </FindingList>
    </Rule>
    <Rule>
      <name>Identify Reptile</name>
      <condition>
        <fact>scales</fact>
        <fact>breathes.air</fact>
      </condition>
      <FindingList>
        <finding>reptile</finding>
      </FindingList>
    </Rule>
  </RuleList>
  <FactList>
    <fact>scales</fact>
    <fact>breathes.air</fact>
  </FactList>
</RunRules>

Output is:

<RunRules>
  <errorNumber>0</errorNumber>
  <FindingList>
    <finding>reptile</finding>
  </FindingList>
</RunRules>

Output

<RunRules>
<errorNumber>0</errorNumber>
<FindingList> <finding>reference</finding> </FindingList> </RunRules>

The service outputs the new findings inferred by the rules.

Errors

103 - Parameter error

Class

com.metrici.xerula.RunRulesService