In ALL, the application of an if-added rule is triggered by the assertion of a fact (into a slot from which the rule can be accessed) which matches the first atomic-formula of the antecedent of the rule. This contrasts with some expert system shells in which every rule is applied whenever a new fact is asserted. One potential problem with this approach is that, if one is not careful, it can be the case that accessible rules, whose antecedents are entailed by the knowledge-base, may never fire.
For example, consider a knowledge-base including the rule:
Suppose we assert the fact (r1 frame1 frame2), but the rule fails because no fact in the knowledge-base matches (r2 frame2 ?z). Later, if we assert (r2 frame2 frame3), the rule will not be triggered. We refer to this problem as if-added incompleteness . Algernon's solution to this problem is to complete the rule (when (r1 frame1 frame2) is added), by adding the shortened rule:
This rule is added to the selfset of frame2 (the selfset of a frame is the set consisting exactly of the frame). One might worry that rule completion would add a large number of rules to the knowledge-base and thus slow reasoning. However, since they are associated with selfsets, such rules are inaccessible to almost all operations.
One problem with rule completion is that it requires one to be careful when removing facts from the knowledge-base (always a very dangerous operation). In the case above, if you later delete the fact (r1 frame1 frame2), using (:clear-slot frame1 r1) for example, the rule completion is not undone and the shortened rule remains. This is a symptom of the larger problem that Algernon expects to reason monotonically and is not prepared to `roll back' the assertion of a fact. If you want to be able to later retract a fact then you must enter it as an assumption (see section 2.2 above).