我在算法中阅读了很多关于“正确性证明”*的内容。
有人说证明适用于算法而非实现,但演示大部分时间都是使用代码源完成的,而不是数学。代码源可能有副作用。所以,我想知道是否有任何基本原则阻止某人证明不正确的功能是正确的。
我觉得这是真的,但不能说为什么。如果存在这样的原则,你能解释一下吗?
由于
*对不起,如果措辞不正确,不确定会有什么好处。
答案 0 :(得分:2)
答案是,尽管数学中没有副作用,但可以在数学上对具有副作用的代码进行建模。
事实上,我们甚至可以利用这个技巧将不纯的代码转换为纯代码(首先不必去数学。所以,而不是(伪代码)函数:
f(x) = {
y := y + x
return y
}
......我们可以写:
f(x, state_before) = {
let old_y = lookup_y(state_before)
let state_after = update_y(state_before, old_y + x)
let new_y = lookup_y(state_after)
return (new_y, state_after)
}
...可以完成同样的事情,没有副作用。当然,必须重写整个程序以显式传递这些状态值,并且您需要为所有可变变量编写适当的lookup_
和update_
函数,但这是一个理论上简单的过程
当然,没有人愿意这样编程。 (Haskell做了类似于模拟副作用而不让它们成为语言的一部分的东西,但是很多工作都是为了使它更符合人体工程学。)但是因为它可以做到,我们知道副作用很好 - 定义的概念。
这意味着我们可以证明有副作用的语言,只要他们的规范为我们提供了足够的信息来知道如何将程序中的程序重写为状态传递方式。