我开始使用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看起来真的很棒:)。
答案 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_value
与cur_value
相关的不变属性可能会导致某些状态{{1}的相应自动机被破坏}。 (注意:这实际上不会阻碍您感兴趣的特定LTL属性的验证,但它可能是其他公式的问题)
通配符索引。
如果我理解正确,你想表达一个属性s.t. - 在每个州 - 只有s_i
到0
的内存位置必须单调非递减,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_int
是curr_int
的前一个值),以及{ {1}}布尔变量st当且仅当next_int
等于curr
时,curr
为true
。
然后,通过 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中的讨论