Если я правильно понял пример, то он выглядит довольно линейно.
Если предположить что X запускается только по событиям А, то логику можно оформить псевдокодом.
На_Событие_А() {
if "5 событий C, паузы S секунд и ещё 5 событий C" было меньше P секунда назад {
X();
} else if 10 событий B в окне M секунд отменяют было меньше L секунд нада {
// не запускаем X
} if (Последний запуск Х был позже 5 сек) или (не было ещё K событий A) {
Х();
}
}
Графически можно попробовать представить в виде систем переходов.
Где состояния:
x_idle - Х не запущен
x_running - X работает
x_cooldown - N секунд с запуска X не прошло
not_yet_K_A - K событий A еще не было
K_A_occured - K событий A было
L_cooldown_ON - отмена всех запусков механизма X на следующие L секунд активна
...
ну и т.д.
Событиями будут, например:
A
B
C
Запуск X
Прошло N секунд с запуска X
K событий A
10 событий B в окне M секунд
Прошло L секунд с момента 10 событий B в окне M секунд
5 событий C, паузы S секунд и ещё 5 событий C
Прошло P секунд (с момента 5 событий C, паузы S секунд и ещё 5 событий C)
Соответственно, все возможные сочетания это произведение всех состояний всех систем помноженное на события.
Т.е берем первую комбинацию
x_idle, not_yet_K_A, l_cooldown_OFF, green_light_off и проверяем как система реагиурет на каждое событие.
Это не законченная схема, просто направление мысли.
Для исчерпывающих тестов также можно попробовать какой-нибудь автоматический верификатор вроде NuSMV, Alloy.