“逻辑编程、项重写、定理证明和模式匹配也依赖统一;算法正确性需要同时证明返回替换确为统一子、最一般,并在不可统一时可靠失败。”
形式陈述 ​
设
对非确定程序,这里量化所有终止执行,而不是仅某条成功路径。完全正确性还要求每个满足
正确性永远相对于已经写明的规格。离散算法常能直接断言输出值;数值算法还要指定误差度量、算术模型和停止条件,学习算法则须把“按样本正确求解目标”与对未知分布的统计保证分开。它们只是扩展了
直觉
测试只观察有限多次执行,规格中的量词却覆盖全部合法执行。结果符合规格通常靠不变量与归纳证明;终止性则靠某个进入良基关系并沿每一步严格下降的排名或变体。两项义务可独立失败,所以必须分开陈述。
例子与边界
二分查找维护不变量“若目标存在,则位于当前区间 l = mid 而非 mid + 1,候选区间可能不再缩小:结果论证仍看似合理,终止义务却已失败。
while true do skip 没有终止执行,因而对任意
推论与应用
循环不变式与 最弱前置条件把结果证明分解为可检查的局部义务,良基关系上的递减量负责终止。模型检查若发现失败,可用反例轨迹见证某条允许执行违反规格;若给出证明证书,检查器也只是在核对证书相对于该规格是否成立。规格本身是否忠实表达需求,仍是另一项审查。
当算法允许近似、随机错误或在线交互时,必须把扩展保证写进规格:近似算法说明允许的数值偏差,随机算法说明坏事件及其概率,在线算法固定输入揭示方式和比较对象。运行时间、空间与通信量则是成本保证,不应与“输出是否符合
参考资料
- 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.