我是NuSMV和CTL的新手,正在尝试简单的例子。我有3个状态A,B和C,并且存在从A->的转变。乙
我在NuSMV中对它建模并想检查是否有从B到A的任何执行路径。尽管我没有定义这样的转换,但规范给出了反例。
Module main
VAR
state:{a,b};
ASSIGN
init(state):=a;
next(state):=b;
SPEC !EF(state=a -> state=c)
SPEC !EF(state=b -> state=a)
有人能说出这个错误吗?
我如何编写“是否可从B到达?”的规范? - 由于没有定义转换,这应该返回false
答案 0 :(得分:1)
注意:您的代码示例无法在我的计算机上运行,它报告了一些语法错误,所以我实际上将其更改为如下所示:
MODULE main ()
VAR
state : {a,b,c};
ASSIGN
init(state):=a;
next(state):=b;
评论您的方法。
属性SPEC !EF(state=a -> state=c)
可以理解为:
从初始状态开始存在路径,这样逻辑条件
state=a -> state=c
迟早会true
,这是不正确的。
条件state = a -> state = c
对于所有状态true
仅为state != a
,因为不存在条件state = a
和state = c
可以容纳的状态在同一时间。
如果您运行 NuSMV ,您将获得以下反例:
NuSMV > reset; read_model -i test.smv; go; check_property
-- specification !(EF (state = a -> state = c)) is false
-- as demonstrated by the following execution sequence
Trace Description: CTL Counterexample
Trace Type: Counterexample
-> State: 1.1 <-
state = a
-> State: 1.2 <-
state = b
在状态1.2
中,变量state
等于b
,因此state = a -> state = c
为true
且违反了!EF(state = a -> state = c)
。
类似的注意事项适用于属性SPEC !EF(state=b -> state=a)
。
一步到达。 如果您要检查<{1}}保持的状态<{1}}保持的状态一步 过渡,然后你可以使用以下属性:
state = a
这是:
对于所有状态,可以在从所有初始状态开始的所有执行路径之后到达, CTL 属性
state = c
始终验证。这样的属性表示,如果处于当前状态SPEC AG (state = a -> AX state != c)
,则必然在所有可能立即下一个状态的值state = a -> AX state != c
的情况下}与state = a
不同。
如果我们使用 NuSMV 检查此类属性,我们会发现它已经过验证:
state
类似的示例适用于您要编码的其他属性。
路径可达性。如果您要检查是否存在路径,由任意和变量组成> 中间转换的数量,从c
成立的状态开始到达NuSMV > reset; read_model -i test.smv; go; check_property
-- specification AG (state = a -> AX state != c) is true
成立的状态,然后编码略有不同:
state = c
这是:
对于所有状态,可以在从所有初始状态开始的所有执行路径之后到达, CTL 属性
,此类属性为state = a
始终验证。对于所有州SPEC AG (state = a -> AX AG state != c)
s.t。state = a -> AX AG state != c
在
true
中s'
或
{li>
state != a
位于s'
,state = a
位于s'
开始的所有传出路径上的所有可达状态state != c
如果我们使用 NuSMV 检查此类属性,我们会发现它已经过验证:
s''
为了更好地概述两种编码之间的区别,我将在这里放置一个模型示例,其中第一个属性是s'
但第二个是NuSMV > reset; read_model -i test.smv; go; check_property
-- specification AG (state = a -> AX (AG state != c)) is true
:
false
如果您在此示例中运行 NuSMV ,则输出如下:
true
显然,如果发现第一个属性为MODULE main ()
VAR
state : {a,b,c};
ASSIGN
init(state):=a;
next(state) := case
state = a : b;
state = b : c;
TRUE : state;
esac;
SPEC AG (state = a -> AX state != c)
SPEC AG (state = a -> AX AG state != c)
,则第二个属性也必须为NuSMV > reset; read_model -i test.smv; go; check_property
-- specification AG (state = a -> AX state != c) is true
-- specification AG (state = a -> AX (AG state != c)) is false
-- as demonstrated by the following execution sequence
Trace Description: CTL Counterexample
Trace Type: Counterexample
-> State: 1.1 <-
state = a
-> State: 1.2 <-
state = b
-> State: 1.3 <-
state = c
。
K-Steps可达性。
通过增加公式中false
的数量,可以将一步可达性编码推广为完全 k 步骤中的可达性:
false
<强> ETA:强>
在此用例场景中,属性
AX
可以简化为
SPEC AG (state = a -> AX state != c) -- state != c after 1 transition
SPEC AG (state = a -> AX AX state != c) -- state != c after 2 transitions
SPEC AG (state = a -> AX AX AX state != c) -- state != c after 3 transitions
SPEC AG (state = a -> AX ... state != c) -- state != c after 1 + |...| transitions
和显然,它仍然有用。
但是,有一个原因我没有这样做:两种编码之间存在微妙的语义差异,即使后者可用于验证可达性< / em>属性在某些情况下,前编码 更健壮,因为它更接近匹配实际的语义 可达性问题。 例如模板SPEC AG (state = a -> AX AG state != c)
在SPEC AG (state = a -> AG state != c)
时失败,因为任何状态B_COND_1 -> AG B_COND_2
验证前提B_COND_2 := !B_COND_1
结论s'
- - 可以改写为B_COND_1
- 不可能持有;在结论前加AG B_COND_2
会增加一个间接级别,并且它更正确,因为结论只需要从下一个状态开始执行树。
ETA#2:
你写道:
我如何编写规范&#34;是否可以从B到达?&#34; - 由于没有定义转换,这应该返回false
当AG !B_COND_1
到AX
没有路径时返回false
的属性如下:
state = b
如果您想验证 从state = a
无法访问SPEC AG (state = b -> EF state = a)
,那么这实际上是坏主意有两个原因:
如果该属性已经过验证,则不会为执行跟踪 s.t返回见证计数器示例。 state = a
可以从state = b
到达state = a
,因此您可以自行决定为什么模型会出现这种情况
如果属性为state = b
,则该工具需要列出从false
开始的所有(可能指数级很多)路径,以便{{1} }} 无法连接。
由于这些原因,我实际上反过来编码了可访问性问题,当state = b
无法从state = a
和true
+ 单个计数器访问时返回state = a
- 示例否则。