The forall conditional element provides a mechanism for determining if a group of specified CEs is satisfied for every occurence of another specified CE.
<forall-CE> ::= (forall <conditional-element> <conditional-element>+)
The forall CE is implemented by replacing the forall keyword with combinations of not and and CEs. For example, the following rule
(defrule example (forall (a ?x) (b ?x) (c ?x)) =>)
is equivalent to the rule below
(defrule example (not (and (a ?x) (not (and (b ?x) (c ?x))))) =>)
Because of the way the forall CE is implemented using not CEs, the restrictions which apply to CE found within not CEs (such as binding a pattern CE to a factaddress) also apply to the CEs found within an forall CE.
The following rule determines if every student has passed in reading, writing, and arithmetic by using the forall CE.
CLIPS> (clear) CLIPS> (defrule all-students-passed (forall (student ?name) (reading ?name) (writing ?name) (arithmetic ?name)) => (printout t "All students passed." crlf)) CLIPS>
The following commands illustrate how the forall CE works in the allstudentspassed rule. Note that initially the allstudentspassed rule is satisfied because there are no students.
CLIPS> (reset) CLIPS> (agenda) 0 all-students-passed: f-0, For a total of 1 activation. CLIPS>
After the (student Bob) fact is asserted, the rule is no longer satisfied since Bob has not passed reading, writing, and arithmetic.
CLIPS> (assert (student Bob)) <Fact-1> CLIPS> (agenda) CLIPS>
The rule is still not satisfied after Bob has passed reading and writing, since he still has not passed arithmetic.
CLIPS> (assert (reading Bob) (writing Bob)) <Fact-3> CLIPS> (agenda) CLIPS>
Once Bob has passed arithmetic, the allstudentspassed rule is reactivated.
CLIPS> (assert (arithmetic Bob)) <Fact-4> CLIPS> (agenda) 0 all-students-passed: f-0, For a total of 1 activation. CLIPS>
If a new student is asserted, then the rule is taken off the agenda, since John has not passed reading, writing, and arithmetic.
CLIPS> (assert (student John)) <Fact-5> CLIPS> (agenda) CLIPS>
Removing both student facts reactivates the rule again.
CLIPS> (retract 1 5) CLIPS> (agenda) 0 all-students-passed: f-0, For a total of 1 activation. CLIPS>