promela - Promela 中如何检查数组中的所有值是否相等?

标签 promela

如何在 Promela 中检查数组的所有值是否相等?

我希望这段代码是原子的并且是可执行的(如果它们是的话)(忙着等待直到所有的都相等)。

有什么办法可以使用for循环吗? (数组的长度作为参数给出)

最佳答案

您可以尝试类似以下代码片段的操作(其中假定数组非空):

#define N 3
int arr[N];

proctype Test(int length) {
  int i, val;
  bool result = true;

  do
    :: atomic {
         /* check for equality */
         val = arr[0];
         for (i : 1 .. length-1) {
           if
            :: arr[i] != val ->
                 result = false;
                 break
            :: else -> skip
           fi
         }

         /* Leave loop if all values are equal,
            else one more iteration (active waiting).
            Before the next entrance into the atomic
            block, other proctypes will have the chance
            to interleave and change the array values */
         if
           :: result -> break;
           :: else -> result = true
         fi
       }
  od

  /* will end up here iff result == true */
}

init {  
  arr[0] = 2;
  arr[1] = 2;
  arr[2] = 2;

  run Test(N);
}

原子 block 内的代码不会阻塞,因此可以连续执行。

/edit (2019-01-24):在原子语句之后的条件 block 的 else 部分中将 result 设置为 true。否则,如果最初的值不相等,检查将永远不会成功。

关于promela - Promela 中如何检查数组中的所有值是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22597100/

相关文章:

automata - 生成 Promela 模型的自动机图像

spin - Promela 中的按引用传递

verification - 什么导致 Promela/SPIN 超时?

verification - 切勿声称在 promela 模型中不起作用

Promela 中的缓存模型

spin - Promela 语法错误 : Error: incomplete structure ref 'table' saw 'operator: ='

matrix - 如何在 Promela 中创建二维数组?

model-checking - 在 SPIN ltl 公式中使用 ne(X)t 运算符

c - 如何在 PROMELA 中广播消息?

verification - SPIN:解释错误跟踪