algorithm - 为什么是部分正确而不是完全正确?

标签 algorithm correctness hoare-logic

Hoare logic ,人们经常区分部分正确性和完全正确性。部分正确意味着程序满足其规范,或者不会终止(无限循环或递归)。

有谁知道为什么要引入这种关于终止的微妙之处?对我来说,似乎只有完全正确才有用:程序满足其规范并终止。谁想要执行可能无限循环?

最佳答案

我们谈论部分正确性这一事实并不意味着证明部分正确性同样有用。我们谈论部分正确性是因为我们有一种证明它的技术(霍尔逻辑),并且我们应该了解该技术的局限性。

霍尔逻辑可用于证明算法永远不会以错误结果终止(部分正确),但不能用于证明算法总是以正确结果终止(完全正确)。这些在逻辑上并不等价,但如果我们没有单独的术语来表示它们,那么很容易天真地认为它们是等价的。

Says Wikipedia :

Using standard Hoare logic, only partial correctness can be proven, while termination needs to be proved separately.

考虑霍尔三元组的一种方法是,它是一段代码,用两个 assertions 注释。 ,一个在该段之前,一个在该段之后。断言是一种逻辑测试,当达到断言时,要么通过,要么失败。霍尔三元组表示,如果第一个断言永远不会失败,那么第二个断言也永远不会失败。

从根本上讲,您不能编写一个断言来表示将达到一行代码,因为无论您编写什么条件,如果从未达到,则断言永远不会失败。 请注意,您可以 assert false 表示不会到达某行代码,但 assert true 永远不会失败,无论是否成功曾经达到过。 因此,虽然霍尔逻辑的证明能够得出算法中的最终断言(即其后置条件)永远不会失败的结论,但这并不意味着算法终止。

关于algorithm - 为什么是部分正确而不是完全正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51768952/

相关文章:

statistics - 我如何证明我的导出方程和蒙特卡罗模拟是等价的?

c# - 类数据验证的实现

z3 - Z3中一个if-else和while循环的验证条件

algorithm - 重新排列四叉树/八叉树的数据

c++ - 二进制搜索范围

algorithm - 在通用哈希表中查找项目?

c - 带返回值的 Switch 语句——代码正确性

c - 在快速排序(hoare)中遇到无限循环,但我似乎没有发现问题

python - Python程序验证

arrays - 如何在 O(n) 时间内统计 0, 1, 2, ..., n 中设置的 1 位的个数?