假设我具有以下结构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并产生一个反例。
答案 0 :(得分:1)
您的型号不正确。最初,state
为s0
,r
为FALSE
。
计算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