在NuSMV中是否可以有一个没有转换到任何其他状态的状态?例如,在我的代码l3中没有任何过渡是否有效?当我运行此NuSMV时,出现“情况不详尽”的错误。谢谢!
MODULE main
VAR
location: {l1,l2,l3};
ASSIGN
init(location):=l1;
next(location):= case
(location = l1): l2;
(location = l2): l1;
(location = l2): l3;
esac;
答案 0 :(得分:1)
通过构造,即所谓的赋值样式 [用于模型中]:
或者,可以使用所谓的约束样式,它允许:
INIT
约束不一致,导致没有初始状态TRANS
约束,导致死锁状态(即,一个状态没有任何向外过渡到某个下一状态的状态) 有关更多信息,请参见the second part of this course,该信息在大多数情况下也适用于NuSMV
。
其中某个状态没有将来状态的FSM的示例是:
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)
有关过渡关系中死锁状态的其他关键结果,请参见this page。
通常,当NuSMV
表示“案例条件并不详尽” 时,会在默认动作中添加一个TRUE
条件case
构造的末尾,当没有任何上述条件适用时触发。 默认操作的最常见选择是自循环,其编码如下:
MODULE main
VAR
location: {l1,l2,l3};
ASSIGN
init(location):= l1;
next(location):=
case
(location = l1): l2;
(location = l2): {l1, l3};
TRUE : location;
esac;
注意::请注意,如果有多个条件具有相同的 guard ,则只会使用其中的第一个条件。因此,在模型location = l2
中时,location
的下一个值只能是l1
,而决不能是l3
。要解决此问题,并在l1
和l3
之间进行一些不确定的选择,必须列出所有可能的未来值,它们的条件与值的 set (即{ {1}})。