Loops 什么';这段代码的归纳不变量是什么?
对于这段代码:Loops 什么';这段代码的归纳不变量是什么?,loops,z3,coq,invariants,loop-invariant,Loops,Z3,Coq,Invariants,Loop Invariant,对于这段代码: // n is a user input that can be any integer s = 0 i = 0 while i < n: s = s + 1 i = i + 1 return s //n是用户输入,可以是任何整数 s=0 i=0 而i0那么s=sum(0,n)否则s=0其中sum(s,e)只是从s到e加1,从初始值0开始 我以为不变量是 如果n>0,i
// n is a user input that can be any integer
s = 0
i = 0
while i < n:
s = s + 1
i = i + 1
return s
//n是用户输入,可以是任何整数
s=0
i=0
而i
我想证明post条件是如果n>0那么s=sum(0,n)否则s=0
其中sum(s,e)
只是从s
到e
加1,从初始值0开始
我以为不变量是
如果n>0,i
,但我无法在Coq或z3中证明它。有什么提示吗?您似乎暗示此算法计算总和,但实际上并没有这样做。相反,它将累计到n
。也许你的意图是:
i = 0
s = 0
while i < n:
i = i+1
s = s+i
要了解原因,请记住不变量必须在每次循环迭代之前和之后保持不变;当循环条件为false时,它需要暗示您的post条件。这就是为什么您需要conconcent
i这个解决方案如何:
// Function left unimplemented, for simplicity
function sum(s: Int, e: Int): Int
ensures result == e - s
method foo(n: Int) returns (s: Int)
requires 0 <= n
{
var i: Int := 0
s := 0
while (i < n)
invariant s == n - sum(i, n)
{
s := s + 1
i := i + 1
}
}
//为简单起见,函数未实现
函数和(s:Int,e:Int):Int
确保结果==e-s
方法foo(n:Int)返回(s:Int)
需要0谢谢。对不起,总而言之,我真的想数到n,但不想把所有的数字加起来。而且,我认为你的不变量不起作用,因为如果n<0,那么s就是0。如果你只是在计算,你显然不需要两个变量。在您的程序中,您可以随时轻松证明i=s
。我试图用我的sum
函数来表示不变量。您无法证明这一点,因为它不是真的。例如,对于n=2
,您的程序返回2
,但sum(0,2)=3
。更改为独占。
// Function left unimplemented, for simplicity
function sum(s: Int, e: Int): Int
ensures result == e - s
method foo(n: Int) returns (s: Int)
requires 0 <= n
{
var i: Int := 0
s := 0
while (i < n)
invariant s == n - sum(i, n)
{
s := s + 1
i := i + 1
}
}