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 predicate of the antecedent of the rule. 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. Consider, for example, a knowledge-base in which (r1 frame1 frame2) is known and we have a rule:
If we then assert (r2 frame2 frame3), this will not trigger the rule. 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 side effect of 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 retract (r1 frame1 frame2), using (:clear-slot frame1 r1) for example, then the rule completion is not undone and the shortened rule remains. This is a symptom of the larger problem that Algernon generally 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).