Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得CBMC中的所有排列?_C_Math_Combinations_Model Checking_Cbmc - Fatal编程技术网

如何获得CBMC中的所有排列?

如何获得CBMC中的所有排列?,c,math,combinations,model-checking,cbmc,C,Math,Combinations,Model Checking,Cbmc,我试图在CBMC中获得数组的所有排列。 对于小案例,例如[1,2,3],我想我可以写 i1 = nondet() i2 = nondet() i3 = nondet() assume (i > 0 && i < 4); ... assume (i1 != i2 && i2 != i3 && i1 != i3); // do stuffs with i1,i2,i3 但是对于较大的元素,代码将非常混乱。 因此,我的问题是,有没有更好的/

我试图在CBMC中获得数组的所有排列。 对于小案例,例如[1,2,3],我想我可以写

i1 = nondet()
i2 = nondet()
i3 = nondet()
assume (i > 0 && i < 4); ...
assume (i1 != i2 && i2 != i3 && i1 != i3);
// do stuffs with i1,i2,i3
但是对于较大的元素,代码将非常混乱。
因此,我的问题是,有没有更好的/通用的方法来表达这一点?

基于Craig关于使用数组的建议,您可以循环您想要排列的值,并确定选择一个未被占据的位置。例如,像这样的循环,其中序列预先初始化为所有值的-1

for(int i = 1; i <= count; ++i) {
  int nondet;
  assume(nondet >= 0 && nondet < count);
  // ensure we don't pick a spot already picked
  assume(sequence[nondet] == -1); 
  sequence[nondet] = i;
}
所以一个完整的程序应该是这样的:

#include <assert.h>
#include <memory.h>

int sum(int *array, int count) {
    int total = 0;
    for(int i = 0; i < count; ++i) {
        total += array[i];
    }
    return total;
}

int main(){

    int count = 5; // 1, ..., 6
    int *sequence = malloc(sizeof(int) * count);

    // this isn't working - not sure why, but constant propagator should
    // unroll the loop anyway
    // memset(sequence, -1, count);
    for(int i = 0; i < count; ++i) {
        sequence[i] = -1;
    }

    assert(sum(sequence, count) == -1 * count);

    for(int i = 1; i <= count; ++i) {
      int nondet;
      __CPROVER_assume(nondet >= 0);
      __CPROVER_assume(nondet < count);
      __CPROVER_assume(sequence[nondet] == -1); // ensure we don't pick a spot already picked
      sequence[nondet] = i;
    }

    int total = (count * (count + 1)) / 2;
    // verify this is a permuation
    assert(sum(sequence, count) == total);
}

然而,对于值>6的情况,这是相当缓慢的,尽管我没有将其与您的方法进行比较-它不会在解卷时卡住,而是在解卷时卡住

使用数组怎么样?e、 g.定义计数1000整数数组[计数];对于int i=0;i