Debugging 软件缺陷总是一个逻辑矛盾吗?

Debugging 软件缺陷总是一个逻辑矛盾吗?,debugging,automated-tests,propositional-calculus,Debugging,Automated Tests,Propositional Calculus,在研究命题逻辑时,我提出了以下问题: 软件缺陷是否总是程序和规范之间的逻辑矛盾? 考虑以下示例: 我们的规范告诉我们“如果前提A和B是真的,我们就做动作C” 具体实施如下: main () if A then C if B then C 很明显,我们可以看到规范不适合实现,因为(考虑上面的程序)“如果前提A或前提B为真,我们就做C” 将我们的规范和程序表示为命题公式,我们得到以下等式: 我们将规范转换为CNF并应用解析演算,现在我们可以很容易地看到第一个子句与最后一个子句相矛盾。因此

在研究命题逻辑时,我提出了以下问题:

软件缺陷是否总是程序和规范之间的逻辑矛盾?

考虑以下示例: 我们的规范告诉我们“如果前提A和B是真的,我们就做动作C”

具体实施如下:

main ()
  if A then C
  if B then C
很明显,我们可以看到规范不适合实现,因为(考虑上面的程序)“如果前提A或前提B为真,我们就做C”

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

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

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

假设文档完整,那么每个软件缺陷都是这样吗?

若有:


如果我们将一个完整的规范转换为命题公式,我们能自动化软件缺陷发现过程吗?

回答我自己的问题:这被称为“模型检查”,在像英特尔这样的大公司的计算机科学中非常常见,用于检查硬件是否真的在做它应该做的事情

最近,模型检查也开始越来越多地出现在软件开发中。例如,美国宇航局和微软在相当程度上使用了这项技术

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


假设一个完整的规范几乎可以让你脱离现实世界的编程。也就是说,你可能会对这样的事情感兴趣。@Mat我的假设更多的是理论方面的,而不是其他方面的,但是谢谢你的链接,我会研究它。听起来很有趣!