The algorithm as is does eager evaluation, as for the
general case that is still better than doing selective
evaluation.
If, in your case, the decision of which rules to fire is
an arbitrary application decision, and not based on the actual
constraints of the rules themselves, then the only way would be
by creating a control fact:
rule 1
when
ControlFact( phase == Phase.ONE )
...
rule 2
when
ControlFact( phase == Phase.TWO )
...
This way, if the control fact is the first pattern in each
rule it effectively disables all the beta evaluations for rules
of phases other than the current one. Just be aware that by
blocking the eager evaluation this way, phase switches are
heavier than without the control fact, where most constraints
were already previously evaluated. Obvious, but worth saying out
loud... :)
There is also a feature that Leonardo is working on that
makes the engine automatically unlink and relink parts of the
network, based on the existence and possibility of matching the
other required facts in a rule LHS. It might achieve similar
results to what you are looking for in some cases, but that is
totally based on the constraints in there and not on any
arbitrary application decision.
Edson