testing - 能否证明具有副作用的函数的正确性

标签 testing programming-languages implementation

我正在阅读很多有关算法中“正确性证明”*的内容。

有人说证明适用于算法而不是实现,但演示大多数时候是通过代码源完成的,而不是数学。并且代码源可能会有副作用。所以,我想知道是否有任何基本原则阻止某人证明不纯函数的正确性。

我觉得这是真的,但说不出来为什么。如果存在这样的原理,您能解释一下吗?

谢谢

* 抱歉,如果措辞不正确,不确定什么是好的。

最佳答案

答案是,虽然数学中没有副作用,但可以对具有副作用的代码进行数学建模。

事实上,我们甚至可以利用这个技巧将不纯的代码变成纯代码(无需首先进行数学计算。因此,代替 (psuedocode) 函数:

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 做了类似的事情来模拟副作用,但不让它们成为语言的一部分,但是做了大量的工作使其比这更符合人体工程学。)但是因为它可以做到,所以我们知道副作用是一个很好的-定义的概念。

这意味着我们可以证明有关具有副作用的语言的事情,只要它们的规范为我们提供了足够的信息来了解如何将其中的程序重写为状态传递样式。

关于testing - 能否证明具有副作用的函数的正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18452995/

相关文章:

programming-languages - 学习新语言还是继续使用Java?

programming-languages - 编译为 native 代码并包含电池的编程语言

c++ - 什么是用于在 C++ 中分配连接的服务器的点对点聊天程序的良好实现?

java - 实现扩展接口(interface) J 的接口(interface) I 的类 B 是否也扩展类型 I?

java - 如何在不将类标记为事务性的情况下测试 dao 层

testing - 找不到机器人框架资源文件

python - 你能在 Python 的核心类型上修改补丁方法吗?

javac 声称我没有覆盖抽象类实现中的方法,而我显然是

javascript - Jest : How to mock a promise on the same file for resolve and reject options?

ios - 如何每次都像第一次一样测试 iOS 应用程序?