在SPIN ltl公式中使用ne(X)t运算符

时间:2017-08-01 07:44:48

标签: model-checking spin promela

我正在尝试定义一个在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)。

1 个答案:

答案 0 :(得分:1)

LTL 公式的一般结构

  

如果某些声明 p i 中为true,则某些声明 q true处于下一个状态, i + 1

是以下一个:

ltl p0 { [] (p -> X q) }

公式p -> X q

验证
  • 任何州 S i s.t. p S i
  • 中为false
  • 任何州 S i s.t. S i ptrue S i +中qtrue 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 通常需要进行一系列优化才能相互删除/合并状态。