我想知道是否有人可以帮我回答这个问题。这是从以前的试卷开始,我可以知道今年考试的答案。
这个问题看起来很简单,我完全迷失了,究竟是什么要求?
考虑以下涉及整数变量的代码部分:
if (i < j) { m = i; } else { m = j; }
通过陈述适当的输出条件然后验证 这段代码的正确性,证明执行后,m等于 i和j的最小值。
我的帖子条件如下: {m =i∧i&lt; j∨m=j∧j&lt; I}
这是对的吗?你怎么验证这个?这似乎很简单。
感谢。
答案 0 :(得分:3)
你的帖子条件是否正确。我个人觉得以下变体(相当于)更自然:
(i<j → m=i) ∧ (i≥j → m=j)
要证明程序满足后置条件,请执行以下操作。
请注意,为确保程序始终满足发布条件,您应使用true
作为前提条件。
所以你有以下Hoare三重奏:
{true}
if (i < j) {
m = i;
} else {
m = j;
}
{(i < j → m = i) ∧ (i ≥ j → m = j)}
后置条件需要保留在两个分支的末尾,所以(根据条件的标准最弱前提规则)我们有
{true}
if (i < j) {
m = i;
{(i < j → m = i) ∧ (i ≥ j → m = j)} <--.
} else { |
|
|
m = j; | copy
{(i < j → m = i) ∧ (i ≥ j → m = j)} <--|
} |
{(i < j → m = i) ∧ (i ≥ j → m = j)} ----------'
根据分配产量最弱的前提条件进一步推进公式
{true}
if (i < j) {
{(i < j → i = i) ∧ (i ≥ j → i = j)} <---.
m = i; | m replaced by i
{(i < j → m = i) ∧ (i ≥ j → m = j)} ----'
} else {
{(i < j → j = i) ∧ (i ≥ j → j = j)} <---.
m = j; | m replaced by j
{(i < j → m = i) ∧ (i ≥ j → m = j)} ----'
}
{(i < j → m = i) ∧ (i ≥ j → m = j)}
在真正分支的顶部我们知道i < j
,而在else分支的顶部我们知道¬(i < j)
:
{true}
if (i < j) {
{i < j} (1) <--- added
{(i < j → i = i) ∧ (i ≥ j → i = j)} (2)
m = i;
{(i < j → m = i) ∧ (i ≥ j → m = j)}
} else {
{¬(i < j)} (3) <--- added
{(i < j → j = i) ∧ (i ≥ j → j = j)} (4)
m = j;
{(i < j → m = i) ∧ (i ≥ j → m = j)}
}
{(i < j → m = i) ∧ (i ≥ j → m = j)}
剩下要显示的是任何两个连续的断言,第一个断言暗示第二个断言。 (这些通常被称为“证明义务”。)我们有两个这样的义务:(1)
应该暗示(2)
和(3)
应该暗示(4)
。情况显然如此。
- “qed”: - )