2017-09-15 55 views
1

我开始使用Promela,并且在表达一些LTL公式时遇到问题。参考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

我很欣赏你的问题。 ** a)** *单调递增*函数是s.t. f(x + 1)> f(x)',则您编码*单调非递减*函数,即f(x + 1)> = f(x)'。在我的回答中,我认为比较运算符'> ='是你想要的。 ** b)**包含[多个看似无关的问题](https://meta.stackexchange.com/questions/120633/what-do-we-do-with-with-multiple-question-questions)的问题应该是真的分成多个问题;它可以更轻松地查询重复项,因为标题可以更紧密地匹配问题的内容,并且可以产生更清晰的* Q/A *。 –

+0

谢谢帕特里克。我仍然需要深入解答你的答案,但是关于一个职位中的多个问题:我应该知道的更好。有没有分裂的方法?我可以编辑这篇文章,并为第二部分重新提交另一个问题? –

+0

这似乎是最明智的选择,虽然我的意图仅仅是作为未来的建议。我不认为有人会打扰你的帖子,关于这个问题:我们目前在一个非常小的,紧随其后的stackoverflow子社区。 * 1-rep *用户在这里有很多*多个问题包装的问题*,我建议这样做的唯一原因是因为您有*高级代表*。我几次更新了我的答案,以防您错过任何东西。 –

回答

1

据我所知,

单调非减序列。

线性时序逻辑具有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 ... 
} 

否则,关于prev_valuecur_value不变性可能导致在相应的自动机被打破一些状态s_i(注:这实际上不会妨碍特定LTL财产你有兴趣的验证,但它可以与其他公式的问题)

通配符索引编制。

如果我理解正确,你想表达一个属性s.t. - 在每种状态下,只有从0index-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预处理器以简化属性的编码并避免一遍又一遍地写同样的东西。


注:

让我们curr_intnext_int0-1整数变量S.T. next_int等于在下一个状态(又名curr_intnext_int的前一个值)curr布尔变量s.t.中的值curr_intcurrtrue当且仅当curr_int等于1

然后,由LTL语义,X currtrue当且仅当curr_intnext_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) 

释是我们最后的LTL-encodeable版本的curr_int <= next_int对于给定的状态s_i,当两者都0-1整数变量

+0

这个答案很好。几个问题/笔记。关于帖子的第一部分:因为cur_value的最小值为0,所以我试图使用一个ltl公式,就像一个只在cur_value变成大于0之后声明prev <= cur关系的锁存器。但是,prev_value不是正在建模的系统,所以没有什么大不了的。最后一个问题是:ltl {prev <= cur}不起作用;它从未被侵犯过。我需要ltl {[] prev <= cur}。直觉我认为[]会暗示。我在这里了解到什么?我将深入到tmrw问题的第二部分。 –

+0

@NoahWatkins在这种情况下将'prev'初始化为'0'就足够了。任何简单的原子命题'P'只会检查初始状态's_0'。如果你想让'P'在执行路径中保持*每个状态*,你可以写'[] P',即*全局P *。如果你想让'P'保持一些状态集合'S',你可以编写'[](state_is_in(S) - > P)',其中'state_is_in(S)'是一个原子命题,只有当当前状态属于给定的一组状态'S'。 –

+0

要定义'S',您可以在* Promela *源代码上使用*标签引用*,或者直接写入表达式来引用某些(或全部)变量的值。 如果你必须执行'prev