NuSMV模型检查中的错误?

时间:2015-12-01 03:54:48

标签: logic model-checking nusmv

假设我具有以下结构M =(S,R,L)其中S = {s0,s1,s2}是可能状态的集合,R是过渡关系,使得:s0 - > s1,s0 - > s2,s1 - > s0,s1 - > s2和s2 - > s2和L是由下式定义的每个状态的标记函数:L(s0)= {p,q},L(s1)= {q,r},并且L(s2)= {r}。我正在使用Huth和Ryan在Logic in Computer Science教科书中描述的符号。

显然,从这样的模型中,我们在s0(初始状态)中满足X r,因为在s1和s2中满足r。我对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为false并产生一个反例。

1 个答案:

答案 0 :(得分: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