考虑这个简单的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在某些时候是假的,所以为什么永远不会声称不起作用,尽管我用旋转生成它?
我错过了一些基本的东西吗?
答案 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
恕我直言,使用额外的工具来构建声明中的自动机非常不方便,而且经常令人困惑。