旋转:无限次访问语句

时间:2013-10-03 10:56:16

标签: spin promela

我想知道是否可以在具有公平约束的程序中验证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公式)。

我认为进度标签会强制执行通过它们无限次地执行,但情况似乎并非如此。 那么,是否有可能增加这种公平约束?

谢谢, 努诺

2 个答案:

答案 0 :(得分:2)

仅包含进度标签本身并不能保证执行仅限于非进度情况。您需要在ltlnever声明中的某处添加“非进度”。

作为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) }