我正在上一个软件分析课,并被问到以下问题。这与编程逻辑有关,因此是我在此处发布它的原因。 (我也将其发布到数学堆栈溢出站点。):
假设SHADED部分表示所有不包含被零除错误的程序,黑色矩形内的UNSHADED部分表示所有包含此类错误的程序。
让A1,A2和A3是不同的程序分析,这些程序检查零除错误。每个分析要么是ACCEPTS(即声明没有零除错误),要么是REJECTS(即声明至少存在一个除零错误)给定程序。
对于每个分析,该分析接受的程序都包含在相应的椭圆形内部,而该分析拒绝的程序包含在相应椭圆形的外部。
参考问题4,假设我们设计了一个分析A4,该分析在输入程序P上的行为如下:
if (A1 rejects P) reject P;
else if (A3 accepts P) accept P;
else run forever;
A4声音吗? A4完成了吗?
我选择A4听起来不错,因为A1接受有效的程序,而拒绝无效的程序。这被标记为正确。我说这是不完整的,因为A4不接受确实有效的程序,并被标记为错误。想知道是否有人可以为我阐明一点?提前致谢。
答案 0 :(得分:1)
我认为这将是完整的。假设您有一个出现DBZ错误的程序,我们要对此进行测试。将该程序发送到A1。 A1包含有和没有DBZ的两个程序的空间。因此它可以被A1接受,也可以被A1拒绝。如果它被A1拒绝,那么我们可以将程序视为存在DBZ错误而拒绝。如果A1没有拒绝它,则转到A3,它仅接受没有DBZ错误的程序。请记住,这是针对未被A1拒绝的程序。如果程序被A3接受,那么我们知道它没有DBZ错误。如果它在这里也被拒绝,我们知道它包含DBZ错误。
仅使用A1不能完全确定是否接受该程序。但是由于A3仅包含可以接受的程序空间,因此,如果A1和A3中接受了A3,则可以推断出它是有效程序。
从这种解释看来,如果一个程序有效,那么即使A1不会将其视为无效,A3也会接受该程序,因为A3仅接受有效程序,这与您所说的相反。为什么A4无法完成。
让我知道是否应该澄清此答案中的一些要点。