Choosing which action to execute
Another situation in which and not logic can help terminate event listeners is when you want to specify a choice of one or more actions and terminate the event listeners after one is chosen. An example of this appears below. This is the CEP equivalent of a case statement.
on Pattern_1() and not PatternMatched() processCase1(); 
on Pattern_2() and not PatternMatched() processCase2(); 
on Pattern_3() and not PatternMatched() processCase3(); 
on Pattern_1() or Pattern_2() or Pattern_3() 
{   
   route PatternMatched(); 
}
When you inject a monitor that contains this type of code the correlator immediately sets up multiple event listeners. For the example in 
Pausing event listeners, the event listeners would be watching for these events:
 Pattern_1
Pattern_1 PatternMatched
PatternMatched Pattern_2
Pattern_2 Pattern_3
Pattern_3Initially, all and not event templates evaluate to true. Suppose Pattern_2 arrives. This causes these two event listeners to trigger:
on Pattern_2() and not PatternMatched() processCase2(); 
on Pattern_1() or Pattern_2() or Pattern_3()
It is unknown which event listener action the correlator executes first, but the order does not matter. The correlator does all of the following:

The correlator executes the 
processCase2() action.

The correlator terminates the event listener that specifies 
processCase2() because it has found its match and it does not specify 
all.

The correlator routes a 
PatternMatched event to the front of the context's input queue.
When the correlator processes the PatternMatched() event, the two event templates that are still watching for and not PatternMatched become false. Consequently, those event listeners will never trigger and the correlator terminates them.
Following is another example of specifying and not to make a choice:
on Ack() and not Nack() 
{ 
   processAck(); 
} 
on Nack() and not Ack() 
{ 
   processNack(); 
}