我知道IVAR
中VAR
(输入变量)和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 <-
有人可以解释为什么这个反例太奇怪了吗?它有几个嵌套循环。输出意味着什么?
答案 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_state
和print_current_state
来导航反例并打印每个州的内容。或者,可以回想一下NuSMV
和nuXmv
仅将变量从一个状态打印到下一个状态,因此执行跟踪应如下所示:
-> 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
因此,基本上在第一次转换之后,我们永远处于同一状态,输入和输出永不改变。
您可能需要联系NuSMV
或nuXmv
邮件列表,并在输出例程中提及此问题。