Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Loops 什么';这段代码的归纳不变量是什么?_Loops_Z3_Coq_Invariants_Loop Invariant - Fatal编程技术网

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
  }
}