我想知道是否可以在具有公平约束的程序中验证LTL属性,该公平约束声明必须经常无限地执行多个语句。
E.g:
bool no_flip;
bool flag;
active[1] proctype node()
{
do
:: skip -> progress00: no_flip = 1
:: skip -> progress01: flag = 1
:: !no_flip -> flag = 0
od;
}
// eventually we have flag==1 forever
ltl p0 { <> ([] (flag == 1)) }
如果最终no_flip
标志变为真且 flag
变为真,则此程序是正确的。
然而,同时运行'pan -a'和'pan -a -f'(弱公平)会产生一个循环通过no_flip=1
语句和接受状态(来自LTL公式)。
我认为进度标签会强制执行通过它们无限次地执行,但情况似乎并非如此。 那么,是否有可能增加这种公平约束?
谢谢, 努诺
答案 0 :(得分:2)
仅包含进度标签本身并不能保证执行仅限于非进度情况。您需要在ltl
或never
声明中的某处添加“非进度”。
作为never
声明,您使用<>[](np_)
强制执行进度(使用spin -p '<>[](np_)'
生成永不声明的声明)。验证的可能ltl
表单是:
ltl { []<>!(np_) && <>[](flag==1) }
另请注意,制作“进度”并不意味着无限次地访问每个进度标签;这意味着无限次地访问任何进度标签。因此,在执行进度时,通过代码的可行路径是第一个do
选项 - 这不是您所期望的。
答案 1 :(得分:0)
回答我自己的问题,对于这个简单的例子,我可以将每个循环分支拆分为单独的进程。然后通过在弱公平模式下运行pan,我保证最终将安排每个进程。 但是,对于我的情况,这个“解决方案”并不是很有趣,因为我在每个流程中都有一个包含数十个分支的模型。还有其他想法吗?
bool no_flip;
bool flag;
active[1] proctype n1()
{
do
:: skip -> no_flip = 1
od;
}
active[1] proctype n2()
{
do
:: skip -> flag = 1
od;
}
active[1] proctype n3()
{
do
:: !no_flip -> flag = 0
od;
}
// eventually we have flag==1 forever
ltl p0 { <>[] (flag == 1) }