【问题标题】:Bug in NuSMV Model Checking?NuSMV 模型检查中的错误?
【发布时间】:2015-12-01 03:54:48
【问题描述】:

假设我有以下结构 M = (S, R, L) 其中 S = {s0, s1, s2} 是可能状态的集合,R 是一个转换关系,这样:s0 -> s1, s0 -> s2, s1 -> s0, s1 -> s2, and s2 -> s2, L是每个状态的标记函数,定义为: L(s0) = {p, q}, L(s1) = {q, r },并且 L(s2) = {r}。我正在使用 Huth 和 Ryan 在计算机科学教科书中的逻辑中描述的符号。

显然,从这样的模型中,我们在 s0(初始状态)中满足 X r,因为 r 在 s1 和 s2 中满足。我的 Kripke 结构的 NuSMV 代码如下 (as described here)。

MODULE main
VAR
    p : boolean;
    q : boolean;
    r : boolean;
    state : {s0, s1, s2};

ASSIGN
    init(state) := s0;
    next(state) := 
    case
        state = s0          : {s1, s2};
        state = s1          : {s2};
        state = s2          : {s2};
        TRUE                : state;
    esac;

   init(p) := TRUE; 
   init(q) := TRUE;
   init(r) := FALSE;

   next(p) :=
    case
        state = s1 | state = s2     : FALSE;
    esac;
    next(q) :=
    case
        state = s1                  : TRUE;
        state = s2                  : FALSE;
        TRUE                        : q;
    esac;
   next(r) :=
    case
        state = s1                  : FALSE;
        state = s2                  : TRUE;
        TRUE                        : r;
    esac;

LTLSPEC
    X r

但 NuSMV 返回规范 X r 为假并产生反例。

【问题讨论】:

    标签: logic model-checking nusmv


    【解决方案1】:

    您的模型不正确。最初,states0rFALSE

    当计算next(r) 时,state 仍然是s0。因此,只有最后一种情况为真,r 仍然是FALSE。结果,X r 不成立。

    您可以如下修改您的模型,其中DEFINE 用于定义标注功能:

    MODULE main
    VAR
      state : {s0, s1, s2};
    
    ASSIGN
      init(state) := s0;
      next(state) :=
      case
        state = s0          : {s1, s2};
        state = s1          : {s0, s2};
        state = s2          : {s2};
      esac;
    
    DEFINE
      p := state = s0;
      q := state = s0 | state = s1;
      r := state = s1 | state = s2;
    
    LTLSPEC
      X r
    

    【讨论】:

    • 感谢您的解释。去掉代码中的TRUE : state可以吗?我添加TRUE : state 的原因是为了防止出现“案例条件并非详尽无遗”的警告。我之前的代码是基于this discussion.
    • 无论如何,警告“有限状态机的初始状态集为空。这可能会使模型检查的结果不可信。”方法?此警告显示在 NuSMV 生成“规范 X r 为真”之前。
    • 如果state 的所有可能值都已被覆盖,您可以删除TRUE 分支,这里就是这种情况。
    • 奇怪,我没有那个警告...初始状态不应该是空的,因为我们声明了init(state) := s0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多