我很难正确识别以下函数的循环不变量:
F(y)
X <-- 1
while (y > 1)
do x <-- x * y
y <-- y - 1
return (x)
我已经将循环不变量标识为x = 1 OR x = y!
,因为该语句作为前置条件保持为真,并且作为后置条件保持为真。
对于每次迭代似乎都不成立,例如,如果y = 3,那么在循环的第一次迭代中,x = 1 * 3,相当于3和NOT 3!等于6。
我猜这是我的困惑所在。一些书籍文章声明循环不变量是一个必须在开头或循环(因此是前置条件)等于true的语句,并且必须在循环结束时保持为真(因此在条件后)但不一定需要在循环中保持正常。
上述函数的正确循环不变量是什么?
答案 0 :(得分:5)
可能的循环不变量是x⋅y! = y 0 !其中 y 0 是 y 的初始值,传递给功能。无论循环的迭代次数已经完成,此语句始终为真。
在循环开始之前必须保持前提条件,在循环结束后必须保持后置条件,并且无论循环的迭代次数是多少都必须保持不变(这就是为什么它被称为“不变” - 它并没有改变它是真的。)
通常,同一循环可能存在不同的可能不变量。例如, 1 = 1 对于任何循环都是真的,但为了显示算法的正确性,通常需要找到更强的不变量。
答案 1 :(得分:1)
循环不变量可以从后置条件派生,有点直觉和类似代数的推理。
您知道帖子条件的一部分:x == Y!
,其中Y
是作为参数给出的初始值。 y
是值变化的变量。这就是后期条件的其余部分,BTW:y == 1
。
每次传球都是如此?理由倒退。
在最后一次通过x == Y*Y-1*...*2 and y == 2
。
在此之前? x == Y*Y-1*...*3 and y == 3
。
之前呢?
最初的情况是什么时候y == Y
?
最后。鉴于后置条件和不变量,什么前提条件是设置动态所需的最弱的语句集?代码建议x=1 and y=Y
。
你知道每次通过循环时,必须改变某些东西,程序必须证明可以使状态朝着后置条件前进。真的吗?是否存在循环状态的自然值函数,可证明向零减小? (这似乎是一个棘手的问题,因为y
变量似乎很容易做到这一点。在许多真实世界的循环中并不明显,所以你必须问你的循环设计问题。)