在Hoare logic中,通常会区分部分正确性和全部正确性。部分正确意味着程序可以满足其规范,或者不终止(无限循环或递归)。
有人知道为什么引入了这种关于终止的微妙之处吗?对我来说,似乎只有完全正确才有用:程序会满足其规范并终止。谁想执行一个可能的无限循环?
答案 0 :(得分:1)
虽然可以通过略微增加Hoare逻辑来解决许多终止情况,并且可以重写更多的终止情况,但这并不是在所有情况下都是如此。
因此,在一般情况下,您可能需要使用精细的证明构造来证明总体正确性。这足以证明区分部分正确性和完全正确性。
换一种方式来看:当证明终止比证明部分正确要困难得多时,一种实用的工程方法应考虑是否值得付出额外的努力。
答案 1 :(得分:1)
我们谈论部分正确性这一事实并不意味着部分正确性同样可以证明这一点。我们之所以讨论部分正确性,是因为我们有一种证明它的技术(Hoare逻辑),并且我们应该了解该技术的局限性。
Hoare逻辑可用于证明算法绝不会以错误的结果终止(部分正确),但不能用于证明算法总是以正确的结果终止(总正确性)。这些在逻辑上不是等效的,但是如果我们没有单独的术语,那么很容易天真地假设它们是等效的。
使用标准的Hoare逻辑,只能证明部分正确性,而终止需要单独证明。
想到Hoare三元组的一种方法是,它是一段代码,用两个assertions注释,一个在该段之前,一个在其后。断言是一种逻辑测试,当达到断言时,测试将通过或失败。霍尔三人说,如果第一个断言永远不会失败,那么第二个断言也永远不会失败。
从根本上讲,您不能编写声明将到达代码行 的断言,因为无论您编写什么条件,断言都永远不会失败。
请注意,您可以assert false
说不会到达代码行 ,但是assert true
永远不会失败,无论是否到达。
因此,尽管通过Hoare逻辑进行的证明可以得出结论,即算法中的最终断言(即其后置条件)永远不会失败,但这并不意味着算法会终止。