We only need to execute an action when a rule containing
it is fired. We fire a rule only when all of its conditions are
satisfied. To detect this we shall assign a counter to each rule
and use it to keep track of exactly how many of the
conditions in the rule are currently satisfied. Thus, we only
check to see if a rule is ready to fire when one of its
conditions has become true. In turn, a condition needs to be
evaluated only when all of its attributes have been defined
and one has changed. This is kept track of with a counter
assigned to that condition. In addition, an attribute is
flagged as true or false.