Skip to content

算法正确性

Algorithm correctness · Partial and total correctness

所有合法执行都符合规格,并在完全正确时保证终止。

条目类型
定义

形式陈述

P 是初始状态的前置条件,C 是程序,Q 是可同时提及初始和终止状态的关系式规格。以 C,σσ 表示一次从 σσ 的终止执行。部分正确性定义为

σ,σ.P(σ)C,σσQ(σ,σ).

对非确定程序,这里量化所有终止执行,而不是仅某条成功路径。完全正确性还要求每个满足 P 的初始状态下,所有允许执行都终止并满足 Q。确定函数式算法是只产生一个结果的特例。用 Hoare 三元组可把部分正确性写作 {P}C{Q};完全正确性还需独立的终止证明

正确性永远相对于已经写明的规格。离散算法常能直接断言输出值;数值算法还要指定误差度量、算术模型和停止条件,学习算法则须把“按样本正确求解目标”与对未知分布的统计保证分开。它们只是扩展了 Q 所表达的内容或概率量词,并不改变部分正确性与终止性必须分别证明这一基本结构。

直觉

测试只观察有限多次执行,规格中的量词却覆盖全部合法执行。结果符合规格通常靠不变量与归纳证明;终止性则靠某个进入良基关系并沿每一步严格下降的排名或变体。两项义务可独立失败,所以必须分开陈述。

部分正确性与终止性
例子与边界

二分查找维护不变量“若目标存在,则位于当前区间 [l,r)”。区间空时,不变量说明目标不存在;每轮后 rl 严格下降则证明终止。若把更新写成 l = mid 而非 mid + 1,候选区间可能不再缩小:结果论证仍看似合理,终止义务却已失败。

while true do skip 没有终止执行,因而对任意 P,Q 都真空地满足部分正确性,却不满足完全正确性。正确性也永远相对于规格:一份严密证明可以准确验证一条写错的规格,却不能替代对需求本身的确认。Collatz 迭代对所有正整数是否终止至今未知;对任意程序自动判定终止性更是不可能,这是停机问题的直接边界。

推论与应用

循环不变式最弱前置条件把结果证明分解为可检查的局部义务,良基关系上的递减量负责终止。模型检查若发现失败,可用反例轨迹见证某条允许执行违反规格;若给出证明证书,检查器也只是在核对证书相对于该规格是否成立。规格本身是否忠实表达需求,仍是另一项审查。

当算法允许近似、随机错误或在线交互时,必须把扩展保证写进规格:近似算法说明允许的数值偏差,随机算法说明坏事件及其概率,在线算法固定输入揭示方式和比较对象。运行时间、空间与通信量则是成本保证,不应与“输出是否符合 Q”混成一句话。非确定程序仍需覆盖所有允许执行;并发程序往往把完整调用—返回历史而非单个终态作为规格对象。

参考资料
  • Thomas H. Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, §2.1–2.2.
  • Edsger W. Dijkstra, A Discipline of Programming, Prentice Hall, 1976, Chapter 4.
关系图谱89 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

使用的工具

被这些条目使用