Я пытаюсь смоделировать поведение других средств проверки моделей с помощью Spin. Для этого мне нужно иметь возможность проверить какое-то произвольное условие в очереди сообщений. Например, я хочу проверить, есть ли где-то в канале какое-то сообщение с int больше 5. Мало того, мне нужно, чтобы такое условие было внутри атомарного блока.
Я попытался сделать что-то вроде этого:
int mid;
do
:: atomic {
in??[msg(mid)] && mid > 5 -> (...)
}
Но Спин читает это условие как
in??[msg(mid)] && 0 > 5
Я пробовал что-то в этом роде:
do
:: atomic {
in??<msg(mid)>;
if
:: mid > 5 ->
in??msg(eval(mid));
(...)
:: else -> skip
fi }
Это работает, но семантически отличается от того, что я хочу, потому что он попадает в атомарный блок только для того, чтобы не выполнить это условие и пропустить его.
Итак, есть ли способ проверить произвольное условие в очереди сообщений и выполнить атомарный блок только в том случае, если такое условие действительно?