Promela - 非确定性不是非确定性的?

时间:2016-02-04 14:55:22

标签: verification non-deterministic spin promela

请考虑以下代码段:

chan sel = [0] of {int};

active proctype Selector(){
    int not_me;

    endselector:
    do
    ::  sel ? not_me;
        if
        :: 0 != not_me -> sel ! 0;
        :: 1 != not_me -> sel ! 1;
        :: 2 != not_me -> sel ! 2;
        :: 3 != not_me -> sel ! 3;
        :: else -> -1;
        fi

    od
}

proctype H(){
    int i = -1;
    int count = 1000;
    do
    :: sel ! i; sel ? i; printf("currently selected: %d\n",i); count = count -1;
    :: count < 0 -> break;
    od

    assert(false);
}

init{
    atomic{
        run H();
    }
}

你希望这可以非常随意地打印0..3的值,直到计数器低于0,此时它可以打印另一个数字,或者它将终止。

然而,情况似乎并非如此。

返回的唯一值是0,然后是1,然后是0,然后是1,然后是0,然后是1,......

我是否误解了if / fi陈述的“非决定论”?

(在ubuntu上使用ispin,如果重要的话)。

2 个答案:

答案 0 :(得分:1)

Relevant part of language spec。对我来说似乎不具有决定性。

如果您只查看(少数)系统的痕迹,那么您将受(伪)随机生成器的支配。

我认为SPIN的主要目的是证明属性。因此,您可以编写一个描述所需跟踪的公式F,然后让SPIN检查&#34;系统和F&#34;有一个模特。

答案 1 :(得分:0)

如果您在'模拟'模式下运行旋转,那么确定地访问else选项,我相信。因此,在Selector proctype中,模拟在if中进行,方法是将选项检查为:0~ = not_me,然后是1,2,3选项。因此,为了执行,您可以在0和1之间进行乒乓。

您可以将if语句替换为:

来确认这一点
if
:: 0 != not_me -> sel ! 0;
:: 1 != not_me -> sel ! 1;
:: else -> assert(false)
fi

,你的模拟永远不会达到断言。

Spin也可以在'验证'模式下运行 - 生成pan可执行文件并执行它。然后,将访问所有案例(内存和时间的模数限制)。但是,在“验证”模式下,没有打印出任何内容 - 因此您可能很难看到其他情况!