同时循环为Z3或Smt2

时间:2017-03-07 14:35:07

标签: z3 smt

如何将简单的while循环(c-代码)转换为smt2语言或z3? 例如:

int x,a;
while(x > 10 && x < 100){
    a = x + a;
    x++;
}

1 个答案:

答案 0 :(得分:4)

SMT求解器的输入语言是一阶逻辑(带有理论),因此没有计算操作的概念,如循环。

你可以

  • 使用循环不变量来编码任意循环迭代(以及循环的前后状态)并证明您的相关属性相对于该任意迭代,这是演绎程序验证程序,如Boogie,Dafny或Viper做

  • 或者,如果静态知道迭代次数,则展开循环并基本上使用单个静态赋值表单对不同的展开进行编码

对于你的循环,后者看起来如下(这里没有使用正确的SMT语法,因为我很懒):

declare x0, a0 // initial values
declare a1, x1 // values after first unrolling
x0 > 10 && x0 < 100 ==> a1 == a0 + x0 && x1 == x0 + 1
declare a2, x2 // values after second unrolling
x1 > 10 && x1 < 100 ==> a2 == a1 + x1 && x2 == x1 + 1
...