NuSMV:IVAR和VAR

时间:2018-05-11 16:49:48

标签: models nusmv

我知道IVARVAR(输入变量)和NuSMV(状态变量)之间的区别。但是,我能够理解使用VAR时的反例,但我不是在另一种情况下。

让我用一个例子来展示它。

MODULE main

VAR

  v1: 0..20;

  v2: 0..20;

  v3: 0..100;


INIT

v3 = 0;

TRANS

    ((v2+v1 = 0)  -> (next(v3) = 10)) &

    (!(v2+v1 = 0) -> (next(v3) = v1 + v2))

LTLSPEC
  G(v3 = 10);

NuSMV给出的反例(足够清楚)是:

Trace Type: Counterexample 

  -> State: 1.1 <-

    v1 = 0

    v2 = 0

    v3 = 0

  -- Loop starts here

  -> State: 1.2 <-

    v3 = 10

  -> State: 1.3 <-

    v1 = 7

    v2 = 6

  -> State: 1.4 <-
    v1 = 0

    v2 = 0

    v3 = 13
  -> State: 1.5 <-

    v3 = 10

现在,将v1和v2更改为IVAR。

MODULE main

IVAR

  v1: 0..20;

  v2: 0..20;

VAR

  v3: 0..100;

INIT

    v3 = 0;

TRANS

    ((v2+v1 = 0)  -> (next(v3) = 10)) &

    (!(v2+v1 = 0) -> (next(v3) = v1 + v2))

LTLSPEC
  G(v3 = 10);

反例是:

Trace Type: Counterexample 

  -> State: 1.1 <-

    v3 = 0

  -> Input: 1.2 <-

    v1 = 7

    v2 = 3

  -- Loop starts here

  -> State: 1.2 <-

    v3 = 10

  -> Input: 1.3 <-

  -- Loop starts here

  -> State: 1.3 <-

  -> Input: 1.4 <-

  -- Loop starts here

  -> State: 1.4 <-

  -> Input: 1.5 <-

  -- Loop starts here

  -> State: 1.5 <-

  -> Input: 1.6 <-

  -- Loop starts here

  -> State: 1.6 <-

  -> Input: 1.7 <-

  -> State: 1.7 <-

有人可以解释为什么这个反例太奇怪了吗?它有几个嵌套循环。输出意味着什么?

1 个答案:

答案 0 :(得分:0)

两个反例都在执行跟踪的第一个状态中伪造了属性,所以接下来发生的事情有点不太相关。

来自nuXmv的文档:

  

4.7跟踪

     

跟踪由初始状态组成,可选地后跟a   状态序列 - 对应于可能执行的输入对   该模型。除了从最初的状态,每对包含   导致转换到新状态和新状态的输入   本身。初始状态没有定义这样的输入值   不依赖于任何输入的值。 [...]

因此,跟踪通常具有以下结构:

S_0 | I_0 -> S_1 | I_1 -> S_2 | ... | I_{N-1} -> S_N

我们的想法是通过将输入S_{k+1}应用于州I_k来获得州S_k

可以尝试使用命令goto_stateprint_current_state来导航反例并打印每个州的内容。或者,可以回想一下NuSMVnuXmv仅将变量从一个状态打印到下一个状态,因此执行跟踪应如下所示:

  -> State: 1.1 <-
    v3 = 0
  -> Input: 1.2 <-
    v1 = 7
    v2 = 3

  -- Loop starts here
  -> State: 1.2 <-
    v3 = 10
  -> Input: 1.3 <-
    v1 = 7
    v2 = 3

  -- Loop starts here
  -> State: 1.3 <-
    v3 = 10
  -> Input: 1.4 <-
    v1 = 7
    v2 = 3

  -- Loop starts here
  -> State: 1.4 <-
    v3 = 10
  -> Input: 1.5 <-
    v1 = 7
    v2 = 3

  -> State: 1.5 <-
    v3 = 10

因此,基本上在第一次转换之后,我们永远处于同一状态,输入和输出永不改变。

您可能需要联系NuSMVnuXmv邮件列表,并在输出例程中提及此问题。