在Promela LTL语句中引用先前的状态

时间:2017-09-15 17:35:29

标签: model-checking spin promela

我开始使用Promela,而且我无法表达一些LTL公式。

一个例子是我想断言的以下sequence值是单调递增的。直觉上我想在下一个状态写出,序列是> =它以前的值,但通过文档查看,我没有看到表达方式。有没有表达这种公式的方法?

byte sequence = 0;
ltl p0 { [] sequence >= prev(sequence) }
... processes that manipulate sequence ...

假设可以表达上面sequence的单调递增属性,我想知道是否存在通配符数组索引的语法。与上面的例子类似,我直觉地希望引用所有以前的索引条目。

byte values[N];
byte index = 0;
ltl p1 { values[0..index-1] are monotonically increasing }
... processes ...

非常感谢你的帮助。 Promela看起来真的很棒:)。

2 个答案:

答案 0 :(得分:1)

AFAIK,

单调非递减序列。

线性时间逻辑有一个X运算符,允许用户表示一个属性,该属性引用布尔条件保存在下一个状态,而不是以前的状态

但是,无法直接将当前状态的整数值与 LTL 公式中的下一个状态值进行比较,因为X计算为a布尔值。

理论上,人们可以做的是通过 bit-blasting <=运算符编码为整数作为布尔属性,例如通过一些巧妙使用模运算符或按位运算 (使用无符号变量不应该太难)位到位比较相应的布尔值(参见最后的注释)

然而,从建模的角度来看,最简单的方法是使用prev_value变量来丰富您的模型,并在每个状态中检查属性prev_value <= cur_value是否成立。请注意,在这种情况下,您应该使用d_step命令将两个值赋值组合在一起,以便将它们合并在一个没有中间转换的状态中,例如

...
byte prev_value;
byte cur_value;
...
d_step {
    prev_value = cur_value;
    cur_value = ... non-blocking function ...
}

否则,prev_valuecur_value相关的不变属性可能会导致某些状态{{1}的相应自动机被破坏}。 (注意:这实际上不会阻碍您感兴趣的特定LTL属性的验证,但它可能是其他公式的问题)

通配符索引。

如果我理解正确,你想表达一个属性s.t. - 在每个州 - 只有s_i0的内存位置必须单调非递减index-1是一个变量,可以更改值(任意?)

此类财产的结构应为:

index

我相信你问题的答案是。但是,我建议您使用作为 C预处理器,以简化属性的编码,避免反复编写相同的内容。

注意:

让我们来看ltl p1 { [] ( ((1 <= index) -> "... values[0] is monotonically non-decreasing ...") && ((2 <= index) -> "... values[1] is monotonically non-decreasing ...") && ((3 <= index) -> "... values[2] is monotonically non-decreasing ...") && ... ((N <= index) -> "... values[N-1] is monotonically non-decreasing ...") ) } curr_int 0-1整数变量s.t. next_int等于下一个州next_int的值(又名,curr_intcurr_int的前一个值),以及{ {1}}布尔变量st当且仅当next_int等于curr时,currtrue

然后,通过 LTL 语义,当{并且仅当curr_int 1)X curr为true >在下一个(当前)状态中等于curr_int

考虑以下 fact-table 状态next_int

1

从上面的定义中,我们可以将其重写为:

s_i

真值表可以看出curr_int | next_int | curr_int <= next_int 0 | 0 | 1 0 | 1 | 1 1 | 0 | 0 1 | 1 | 1 对应

  curr   |  X curr  |         EXPR

  false  |  false   |         true
  false  |  true    |         true
  true   |  false   |         false
  true   |  true    |         true

可以更优雅地重写为

EXPR

对于给定状态 !curr v (X curr) ,当我们 0-1整数变量时,它是我们 curr -> (X curr) 的最终 LTL可编码版本。

答案 1 :(得分:1)

Promela中没有这样的符号。然而,任何Past Time LTL公式都可以转化为未来时间LTL(可能更加繁琐)。

不确定是否有一种简单的方法可以比较不同状态下的变量值。

同时检查LTL specification pattern repository过去。

参见CS stackexhange中的讨论

https://cstheory.stackexchange.com/questions/29444/do-past-time-ltl-and-future-time-ltl-have-the-same-expressiveness