NuSMV传递错误的规范

时间:2017-03-02 09:33:57

标签: logic temporal ctl nusmv

我是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

1 个答案:

答案 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 = astate = 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 = ctrue且违反了!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_1AX没有路径时返回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 = atrue + 单个计数器访问时返回state = a - 示例否则。