永远不会声称在promela模型中不起作用

时间:2016-02-16 09:12:07

标签: verification model-checking spin promela

考虑这个简单的PROMELA模型:

#define p (x!=4)

int x = 0;

init {
    do
    :: x < 10 ->
        x++;
    od
}

我想用这个简单的声明来验证这个模型,它是使用spin -f:

生成的
never {    /* []p */
accept_init:
T0_init:
    do
    :: ((p)) -> goto T0_init
    od;
}

但是,验证使用

spin -a model.pml
cc -o pan pan.c
./pan

没有结果。尝试使用-a选项也无法提供结果。 任何随机模拟显示,显然p在某些时候是假的,所以为什么永远不会声称不起作用,尽管我用旋转生成它?

我错过了一些基本的东西吗?

2 个答案:

答案 0 :(得分:0)

如果您想查看[]p,则需要为never构建![]p声明。

来自reference

  

要将LTL公式转换为永不索赔,我们必须首先考虑公式是表示正面还是负面属性。积极的属性表达了我们希望我们的系统具有的良好行为。负面属性表示我们声称系统没有的不良行为。从不声明通常仅用于形式化负面属性(不应该发生的行为),这意味着在将属性转换为声明之前必须否定正面属性。

答案 1 :(得分:0)

将声明放在源代码中(例如,check.pml)

int x = 0;

init {
    do
    :: x < 10 ->
        x++;
    od
}

ltl  { [] (x != 4) }

然后

spin -a check.pml
cc     pan.c   -o pan
./pan -a

这给出了

pan:1: assertion violated  !( !((x!=4))) (at depth 16)
pan: wrote check.pml.trail

您可以使用

观看路径
./pan -r -v

恕我直言,使用额外的工具来构建声明中的自动机非常不方便,而且经常令人困惑。