请考虑以下代码段:
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,如果重要的话)。
答案 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
可执行文件并执行它。然后,将访问所有案例(内存和时间的模数限制)。但是,在“验证”模式下,没有打印出任何内容 - 因此您可能很难看到其他情况!