Logic 如何在NuSMV中创建简单的Kripke模型?
我目前正在做一些LTL(线性时间时态逻辑)和CTL(计算树逻辑)的理论研究。我是NuSMV的新手,我很难创建一个简单的Kripke结构 我的结构是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 S)={q,R},L(s2)={R}。我在用胡斯和瑞安在计算机科学教科书中的逻辑描述的符号。我尝试了以下两种代码: 第一个代码:Logic 如何在NuSMV中创建简单的Kripke模型?,logic,ctl,nusmv,Logic,Ctl,Nusmv,我目前正在做一些LTL(线性时间时态逻辑)和CTL(计算树逻辑)的理论研究。我是NuSMV的新手,我很难创建一个简单的Kripke结构 我的结构是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 S)={q,R},L(s2)={R}。我在用胡斯和瑞安在计算机科学教科书中的逻辑描述的符号。我尝试了以下两种代码: 第一个代
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};
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;
esac;
next(r) :=
case
state = s1 : FALSE;
state = s2 : TRUE;
esac;
SPEC
p & q
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;
SPEC
p & q
第二个代码:
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};
esac;
init(p) := TRUE;
init(q) := TRUE;
init(r) := FALSE;
next(p) := !p;
next(q) :=
case
state = s0 & next(state) = s1 : q;
state = s0 & next(state) = s2 : !q;
state = s1 & next(state) = s0 : q;
state = s1 & next(state) = s2 : !q;
esac;
next(r) :=
case
state = s0 & next(state) = s1 : r;
state = s0 & next(state) = s2 : r;
state = s1 & next(state) = s0 : !r;
state = s1 & next(state) = s2 : r;
esac;
LTLSPEC
p & q
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) := !p;
next(q) :=
case
state = s0 & next(state) = s1 : q;
state = s0 & next(state) = s2 : !q;
state = s1 & next(state) = s0 : q;
state = s1 & next(state) = s2 : !q;
TRUE : q;
esac;
next(r) :=
case
state = s0 & next(state) = s1 : r;
state = s0 & next(state) = s2 : r;
state = s1 & next(state) = s0 : !r;
state = s1 & next(state) = s2 : r;
TRUE : r;
esac;
LTLSPEC
p & q
有点不对劲,我得到了这样的信息:“案例条件并非详尽无遗”。这是什么意思?如何解决问题?因为您必须为每个案例输入其“默认值”。 第一个代码:
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};
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;
esac;
next(r) :=
case
state = s1 : FALSE;
state = s2 : TRUE;
esac;
SPEC
p & q
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;
SPEC
p & q
第二个代码:
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};
esac;
init(p) := TRUE;
init(q) := TRUE;
init(r) := FALSE;
next(p) := !p;
next(q) :=
case
state = s0 & next(state) = s1 : q;
state = s0 & next(state) = s2 : !q;
state = s1 & next(state) = s0 : q;
state = s1 & next(state) = s2 : !q;
esac;
next(r) :=
case
state = s0 & next(state) = s1 : r;
state = s0 & next(state) = s2 : r;
state = s1 & next(state) = s0 : !r;
state = s1 & next(state) = s2 : r;
esac;
LTLSPEC
p & q
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) := !p;
next(q) :=
case
state = s0 & next(state) = s1 : q;
state = s0 & next(state) = s2 : !q;
state = s1 & next(state) = s0 : q;
state = s1 & next(state) = s2 : !q;
TRUE : q;
esac;
next(r) :=
case
state = s0 & next(state) = s1 : r;
state = s0 & next(state) = s2 : r;
state = s1 & next(state) = s0 : !r;
state = s1 & next(state) = s2 : r;
TRUE : r;
esac;
LTLSPEC
p & q
谢谢,我看到您通过添加以下脚本修复了我的代码:TRUE:state、TRUE:p、TRUE:q和TRUE:r。你能给我解释一下这些脚本是什么意思吗?我知道,对于一个原子命题x(或一组原子命题),脚本x:TRUE意味着将真值赋给x(或x中的每个元素)。这是我第一次看到反义词(例如TRUE:x)。如果你用任何语言编程,开关的情况下有一个“默认”的情况。如果任何其他情况不正确,则默认情况为true,并且NuSMV需要此情况。在next(r)中,如果前四种情况为假,则最后一种情况(TRUE)为真,然后next(r):=r;你明白吗?请核对我的最后一个问题。。我需要它。