NuSMV中可以有终端状态吗?

时间:2019-02-19 08:50:15

标签: verification nusmv

在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;

1 个答案:

答案 0 :(得分:1)

通过构造,即所谓的赋值样式 [用于模型中]:

  • 总是至少有一个初始状态
  • 所有州都至少有一个下一个州
  • 不确定性很明显

或者,可以使用所谓的约束样式,它允许:

  • INIT约束不一致,导致没有初始状态
  • 不一致的TRANS约束,导致死锁状态(即,一个状态没有任何向外过渡到某个下一状态的状态)
  • 不确定性被隐藏

有关更多信息,请参见the second part of this course,该信息在大多数情况下也适用于NuSMV


其中某个状态没有将来状态的FSM的示例是:

MODULE main
VAR b : boolean;
TRANS b -> FALSE;

btrue的状态没有将来的状态。 相反,bfalse的状态可以自身循环,也可以转到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。要解决此问题,并在l1l3之间进行一些不确定的选择,必须列出所有可能的未来值,它们的条件与值的 set (即{ {1}})。