软件错误总是逻辑上的矛盾吗?
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" 的树状结构。模型检查器将这些作为输入并给出规范不完整的反例或发出真值。
在研究命题逻辑时,我想到了以下问题:
软件错误是否总是程序与规范之间的逻辑矛盾?
考虑以下示例: 我们的规范告诉我们“我们执行动作 C,前提是 A 和 B 为真”。
具体实现如下:
main ()
if A then C
if B then C
很明显,规范不适合实现,因为(考虑上面的程序)“如果前提 A 或前提 B 为真,我们执行 C”。
将我们的规范和程序表示为命题公式,我们得到以下等式:
我们将规范转换为 CNF 并应用解析演算,现在我们可以很容易地看到第一个子句与最后一个子句相矛盾。因此这个公式是不可满足的,因此我们的规范与我们的实现相矛盾。
我现在的问题是(因为以上只是一个例子):
假设有完整的文档,这是否适用于每个软件错误?
如果是:
如果我们将完整的规范转换为命题公式,我们是否可以自动执行软件错误查找过程?
回答我自己的问题:这称为 "Model Checking",在英特尔等大公司的计算机科学中很常见,用于检查硬件是否确实在执行它应该执行的操作。
最近,模型检查也开始越来越多地出现在软件开发中。例如,NASA 和 Microsoft 正在相当程度上使用这项技术。
在其基本形式中,它的工作方式如下:规范被转换为逻辑语句,编译器将给定的软件程序转换为称为 "Kripke Structure" 的树状结构。模型检查器将这些作为输入并给出规范不完整的反例或发出真值。