正确性的下限(通过测试)与上限(通过证明)

Lower Bound (via testing) vs. Upper Bound (via proof) for Correctness

Chris Smith's article "What to know before debating type systems" 包含以下无法解释的语句:

Testing: establishes upper bounds on correctness
Proof: establishes lower bounds on correctness

上下文比较了证明程序正确性(例如使用类型检查器)与测试程序行为(例如使用动态类型语言中的 TDD)的好处。

在这种情况下,"upper" 和 "lower" 的正确性界限是什么?

假设您有一个程序,但您对它的工作原理基本上一无所知。它应该有一堆属性(比如 X、Y 和 Z),但你不确定它是否真的有。你能做些什么来解决这个问题?

一种选择是尝试使用程序验证工具正式证明程序具有属性 X、Y 和 Z。不幸的是,通常无法自动验证程序是否具有任何有趣的属性 (谢谢,停止问题!),所以即使程序确实具有这些属性,您也可能永远无法确定这一点。但是,如果程序检查器报告该程序确实有 属性 X,您可以说 至少 ,该程序确实有 X。从这个意义上说,您关于 "lower-bounding" 程序的正确性:它肯定有 属性 X,并且可能有更多的属性。

另一种选择是 运行 程序,看看会发生什么。假设在测试期间您发现一个导致程序行为异常的测试用例,因此肯定没有 属性 Z。但是您的测试用例没有暴露任何其他错误。在那种情况下,因为您看到程序运行异常,您肯定知道它没有 属性 Z。因此,您已经 "upper-bounded" 程序是多么正确 - 它绝对没有属性 Z,但你不能排除其他任何可能性。

如果你把这两个放在一起,你就得到了你的程序有 属性 X 的证据,并且你有直接证据表明它没有 属性 Z。你没有不知道它是否有 属性 Y,因为这两种方式都没有解决。

希望对您有所帮助!