软件错误总是逻辑上的矛盾吗?

Is a software bug always a logical contradiction?

在研究命题逻辑时,我想到了以下问题:

软件错误是否总是程序与规范之间的逻辑矛盾?

考虑以下示例: 我们的规范告诉我们“我们执行动作 C,前提是 A 和 B 为真”。

具体实现如下:

main ()
  if A then C
  if B then C

很明显,规范不适合实现,因为(考虑上面的程序)“如果前提 A 或前提 B 为真,我们执行 C”。

将我们的规范和程序表示为命题公式,我们得到以下等式:

我们将规范转换为 CNF 并应用解析演算,现在我们可以很容易地看到第一个子句与最后一个子句相矛盾。因此这个公式是不可满足的,因此我们的规范与我们的实现相矛盾。

我现在的问题是(因为以上只是一个例子):

假设有完整的文档,这是否适用于每个软件错误?

如果是:

如果我们将完整的规范转换为命题公式,我们是否可以自动执行软件错误查找过程?

回答我自己的问题:这称为 "Model Checking",在英特尔等大公司的计算机科学中很常见,用于检查硬件是否确实在执行它应该执行的操作。

最近,模型检查也开始越来越多地出现在软件开发中。例如,NASA 和 Microsoft 正在相当程度上使用这项技术。

在其基本形式中,它的工作方式如下:规范被转换为逻辑语句,编译器将给定的软件程序转换为称为 "Kripke Structure" 的树状结构。模型检查器将这些作为输入并给出规范不完整的反例或发出真值。

https://en.wikipedia.org/wiki/Model_checking