Function 计算阶乘的函数的循环不变量

Function 计算阶乘的函数的循环不变量,function,loops,factorial,invariants,loop-invariant,Function,Loops,Factorial,Invariants,Loop Invariant,我很难正确识别以下函数的循环不变量: F(y) X <-- 1 while (y > 1) do x <-- x * y y <-- y - 1 return (x) F(y) X 1) dox一个可能的循环不变量是x⋅y!=y0!其中,y0是传递给函数的y的初始值。无论循环已经进行了多少次迭代,此语句始终为真 在循环开始之前,先决条件必须保持不变,后决条件必须在循环完成之后保持不变,并且无论循环进行了多少次

我很难正确识别以下函数的循环不变量:

F(y)
    X <-- 1
    while (y > 1)
        do x <-- x * y
           y <-- y - 1
    return (x)
F(y)
X 1)

dox一个可能的循环不变量是x⋅y!=y0!其中,y0是传递给函数的y的初始值。无论循环已经进行了多少次迭代,此语句始终为真

在循环开始之前,先决条件必须保持不变,后决条件必须在循环完成之后保持不变,并且无论循环进行了多少次迭代,不变量都必须保持不变(这就是为什么它被称为“不变量”——它不会改变它是否为真)

通常,同一循环可能有不同的不变量。例如,对于任何循环,1=1作为不变量都是真的,但为了显示算法的正确性,通常必须找到一个更强的不变量。

循环不变量可以从post条件、一点直觉和一些类似代数的推理中推导出来

您知道post条件的一部分:
x==Y
,其中
Y
是作为参数给出的初始值
y
是一个值发生变化的变量。这就是post条件的其余部分,顺便说一句:
y==1

每一关的正确答案是什么?逆向推理

在最后一次传递时,x==Y*Y-1*..*2和Y==2

在那之前<代码>x==Y*Y-1*..*3和Y==3

在那之前

y==y
时,最初什么是正确的

最后。给定post条件和不变量,使事物运动所需的最弱语句集是什么前提?代码显示,
x=1和y=y


您知道,每次通过循环时,都会发生一些变化,并且程序必须可证明地将状态推向post条件。这是真的吗?循环状态是否有一个可证明的自然值函数,它向零递减?(这似乎是一个技巧性的问题,因为
y
变量的作用似乎很小。这在许多实际循环中并不明显,因此您必须问循环设计的问题。)

循环不变不是后条件。你读到的任何内容都是完全错误的。如果你发现一些暗示不变量也是post条件的东西,请包括一个链接或引用。这是不完整的或误导性的。不变条件而不是while条件是post条件。我想我肯定是看错了autor的陈述。我在读Susanna Epp的《离散数学与应用》,我假设循环不变量是前/后条件的组合,而作者的意思似乎是循环不变量也确保了前/后条件的真实性作者的意思是,循环不变量也简单地确保了前置/后置条件的真实性“。考虑到修改后的理解,请更新您的问题,以寻求您真正需要的帮助。您的循环不变量显然是有意义的,并且适用于我尝试过的几个示例。。。但是为了论证起见,另一个循环不变量会有什么问题呢?例如:
x@Brownbay:当您试图使用循环不变量来显示程序做了正确的事情时,问题通常就开始了。使用强循环不变量,可以证明函数将实际返回正确的结果。循环不变量也是完全有效的,但它可能太模糊,无法证明函数的正确性。我猜是用
x