这是一个计算机科学问题,不是编程问题,所以https://cs.stackexchange.com/ 更合适,但我还是会回答。
考虑这个程序来寻找大海捞针的第一个索引。 (干草堆可能包含许多针;我们想停在第一个。)如果干草堆不包含针,则索引等于干草堆的大小(这不是干草堆的有效索引)。
i = 0
while i < haystack.count && haystack[i] != needle {
i = i + 1
}
“后置条件”是关于程序状态的断言,通常表示程序已经计算了一些有用的东西(在后置条件点)。对于示例程序,我们可以编写后置条件断言它计算了我们想要的结果:
i = 0
while i < haystack.count && haystack[i] != needle {
i = i + 1
}
assert(i == haystack.count || haystack[i] == needle) // first postcondition
haystack[0 ..< i].forEach { assert($0 != needle) } // second postcondition
(注意:0 ..< i 表示所有j 使得0 ≤ j < i。)
第一个后置条件断言 i 是大海捞针的数量,或者 i 是针的索引。
第二个后置条件断言在索引 i 之前的任何地方都没有出现在大海捞针中。因此程序找到第一根针,如果它找到任何针。
因此,如果这些后置条件为真,程序就会执行我们想要的操作。
“前置条件”是关于程序状态的断言,当与程序的后续动作结合时,可用于证明后置条件。我们可以在示例程序中添加前置条件:
i = 0
while i < haystack.count && haystack[i] != needle {
haystack[0 ... i].forEach { assert($0 != needle) } // precondition
i = i + 1
}
assert(i == haystack.count || haystack[i] == needle) // first postcondition
haystack[0 ..< i].forEach { assert($0 != needle) } // second postcondition
(注意:0 ... i 表示所有j 使得0 ≤ j ≤ i。)
前提条件告诉我们,直到并包括索引i 处的元素在内的所有干草堆元素都不是针。
你可以用induction来证明每次程序到达前提条件都是真的。循环在其条件为假时结束,这意味着第一个后置条件为真。 (第一个后置条件是循环条件的反例。)循环前置条件为真意味着第二个后置条件也为真。