AFAIK,
单调非递减序列。
线性时序逻辑有一个X
运算符,它允许人们表达一个属性,该属性指的是在下一个状态中保持的布尔条件,而不是前一个状态。
但是,不能直接将当前状态的整数值与LTL公式中的下一个状态的整数值进行比较,因为X
其计算结果为布尔值。
理论上,可以做的是通过位爆破<=
将整数上的运算符编码为布尔属性,例如通过一些巧妙地使用模运算符或按位运算(对于无符号变量不应该太难)以及相应布尔值的逐位比较(见最后注)。
然而,从建模的角度来看,最简单的方法是使用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 ...
}
否则,与相关的不变性质可能会导致在某些状态的相应自动机上被破坏。(注意:这实际上不会妨碍您感兴趣的特定 LTL 属性的验证,但它可能是其他公式的问题)prev_value
cur_value
s_i
通配符索引。
如果我理解正确,您想表达一个属性 st --在每个状态中 -- 只需要从0
up toindex-1
的内存位置是单调非递减的,并且index
是一个可以改变值的变量(任意?)。
此类财产的结构应为:
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 ...")
)
}
我相信你的问题的答案是否定的。但是,我建议您使用C 预处理器的宏来简化属性的编码并避免一遍又一遍地编写相同的内容。
笔记:
让我们假设0-1 整数变量 st在下一个状态curr_int
中等于 的值(也就是 的前一个值),而布尔变量 st是当且仅当等于 时。next_int
next_int
curr_int
curr_int
next_int
curr
curr
true
curr_int
1
然后,根据LTL语义,当且X curr
仅true
当curr_int
( 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)
可以更优雅地重写为
curr -> (X curr)
Thich 是给定 state的最终LTL 可编码版本,当两者都是0-1 Integer variables时。curr_int <= next_int
s_i