我正在尝试定义一个在SPIN中使用ne(X)t运算符的ltl公式。我的问题与this问题非常相似。我有一个状态机,我想验证如果某个语句 p 在state0中为真,那么在下一个状态state1中某些语句 q 为真。 ltl公式如下所示:
ltl p0 {p X q}
当我尝试使用spin -a test.pml
生成验证程序时,出现以下错误:
spin: test.pml:20, Error: syntax error saw 'X'
我使用-DNXT标志编译了SPIN(建议为this)。我知道ne(X)t运算符无法在启用部分降阶的情况下进行测试。我发现禁用部分顺序减少的唯一方法是在编译验证程序时使用-DNOREDUCE标志。但是,我甚至不能在第一时间生成验证器(pan.c)。
答案 0 :(得分:1)
LTL 公式的一般结构
如果某些声明 p 在州 i 中为
true
,则某些声明 q 为true
处于下一个状态,州 i + 1
是以下一个:
ltl p0 { [] (p -> X q) }
公式p -> X q
由
p
在 S i false
p
为true
, S i +中q
为true
1 ,其中 S i + 1 是 S i 的继承者当前正在评估的执行路径 全局运算符[]
需要使模型检查器验证条件p -> X q
是否适用于执行路径中的任何状态。如果省略它,则仅检查属性p -> X q
的初始状态,在 99.99%的情况下,这不是您想要的。
示例强>
在以下模型中,如果cc
为偶数,那么流程计数器会将其增加1,否则流程会以非确定性的方式终止或减少cc
方式。
我们要检查的属性是,只要计数器达到给定的检查点状态,cc
是偶数,经过2次转换{{1很奇怪。
cc
验证了ltl属性byte cc = 0;
active proctype counter()
{
checkpoint:
do
:: cc % 2 == 0 -> cc++;
:: else ->
if
:: cc--;
:: break;
fi;
od;
}
#define even ( cc % 2 == 0 )
#define odd ( cc % 2 == 1 )
ltl p0 { [] ( (counter[0]@checkpoint & even) -> X X odd) }
:
p0
注意事项:
在此示例中,使用标签 ~$ spin -a test.pml
~$ gcc -DNXT -DNOREDUCE -o run pan.c
~$ ./run -a
(Spin Version 6.4.3 -- 16 December 2014)
Full statespace search for:
never claim + (p0)
assertion violations + (if within scope of claim)
acceptance cycles + (fairness disabled)
invalid end states - (disabled by never claim)
State-vector 28 byte, depth reached 11, errors: 0
8 states, stored (10 visited)
2 states, matched
12 transitions (= visited+matched)
0 atomic steps
hash conflicts: 0 (resolved)
Stats on memory usage (in Megabytes):
0.000 equivalent memory usage for states (stored*(State-vector + overhead))
0.289 actual memory usage for states
128.000 memory used for hash table (-w24)
0.534 memory used for DFS stack (-m10000)
128.730 total actual memory usage
unreached in proctype counter
(0 of 11 states)
unreached in claim p0
_spin_nvr.tmp:16, state 20, "-end-"
(1 of 20 states)
pan: elapsed time 0 seconds
是完全可选的。使用 ltl公式 checkpoint:
可以获得相同的结果。但是,标签经常在具有结构{ [] ( even -> X X odd) }
的公式的上下文中使用,所以我认为在我的示例中使用一些空的前缀来推送它是有用的。
我通常更喜欢较弱的[] (p -> X g)
条件到较强的语句F odd
,除非由于要验证的属性的性质而不可行/可取。实际上,通过 Spin ,一眼就能看出从一个语句到另一个语句有多少转换是不容易的,因为 AFAIK model 通常需要进行一系列优化才能相互删除/合并状态。