По построению, в так называемом стиле присвоения [используется в вашей модели]:
- всегда есть хотя бы одно начальное состояние
- все состояния имеют по крайней мере одно следующее состояние
- явление недетерминизма
В качестве альтернативы можно использовать так называемый стиль ограничения , который позволяет:
- несовместимые
INIT
ограничения, которые приводят к отсутствию начальных состояний - несовместимые
TRANS
ограничения, которые приводят к состояниям взаимоблокировки (т.е. состояние без какого-либо исходящего переходав следующее состояние) - скрыт недетерминизм
Для получения дополнительной информации см. вторую часть этого курса , которая также применяется кNuSMV
по большей части.
Примером автомата, в котором какое-либо состояние не имеет будущего состояния, является:
MODULE main
VAR b : boolean;
TRANS b -> FALSE;
Состояние, в котором b
равно true
не имеет будущего состояния.И наоборот, состояние, в котором b
равно false
, может зацикливаться само по себе или переходить в состояние, в котором b = true
.
Вы можете использовать команду check_fsm
для обнаружения тупиковых состояний.
Обратите внимание, что наличие взаимоблокировочных состояний может препятствовать правильности проверки модели в некоторых ситуациях.Например:
FAQ # 007: Спецификация CTL с квантификатором экзистенциального пути верхнего уровня ошибочно указана как нарушенная.Например, для модели, представленной ниже, обе спецификации указываются как ложные, хотя одна является просто отрицанием другой!Я знаю, что такие проблемы могут возникать с состояниями взаимоблокировки, но запуск его с -ctt говорит, что все в порядке.
MODULE main
VAR b : boolean;
TRANS next(b) = b;
CTLSPEC EF b
CTLSPEC !(EF b)
Для других критических последствий взаимоблокировки состояния в переходном отношении, см. эту страницу .
Обычно, когда NuSMV
говорит, что "условия случая не являются исчерпывающими" одиндобавляет действие по умолчанию с условием TRUE
в конце конструкции case
, которое запускается, когда не применяется ни одно из предыдущих условий.Наиболее распространенный выбор для действия по умолчанию - это self-loop , который кодируется следующим образом:
MODULE main
VAR
location: {l1,l2,l3};
ASSIGN
init(location):= l1;
next(location):=
case
(location = l1): l2;
(location = l2): {l1, l3};
TRUE : location;
esac;
ПРИМЕЧАНИЕ: пожалуйстаобратите внимание, что если существует несколько условий с одним и тем же охранником , то используется только первое из этих условий.По этой причине, когда в вашей модели location = l2
, следующее значение location
может быть только l1
и никогда l3
.Чтобы исправить это, и сделать некоторый недетерминированный выбор среди l1
и l3
, необходимо перечислить все возможные будущие значения при том же условии, что и набор значений (то есть {l1, l3}
).