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

Why partial correctness instead of total correctness?

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

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

虽然可以通过对 Hoare 逻辑进行少量增强来解决许多终止情况,并且可以重写更多的终止情况,但并非所有情况都是如此。

因此,在一般情况下,您可能需要使用精心设计的证明结构来证明完全正确。这应该足以证明区分部分正确性和完全正确性。

换个角度来看:当证明终止比证明部分正确性困难得多时,实用的工程方法应该考虑额外的努力是否值得。

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

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

Says Wikipedia:

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

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

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