我正在尝试在我的编程语言概念课程中学习测试。
我想了解如何解决这个问题。我们的教授说,只要他能理解我们所说的话,我们就不需要用正式的符号来证明这个问题。
我错过了他解决问题的讲座,我很难找到资源来帮助我自己解决问题。
非常感谢您的解释。
假设前提条件为真,使用公理语义证明在执行程序后后置条件为真
Precondition: n ≥ 0 and A contains n elements indexed from 0
bound = n;
while (bound > 0) {
t = 0;
for (i = 0; i < bound-1; i++) {
if (A[i] > A[i+1]) {
swap = A[i];
A[i] = A[i+1];
A[i+1] = swap;
t = i+1;
}
}
bound = t;
}
Postcondition: A[0] ≤ A[1] ≤ ...≤ A[n-1]
答案 0 :(得分:0)
让行编号以供参考:
1. bound = n;
2. while (bound > 0) {
3. t = 0;
4. for (i = 0; i < bound-1; i++) {
5. if (A[i] > A[i+1]) {
6. swap = A[i];
7. A[i] = A[i+1];
8. A[i+1] = swap;
9. t = i+1;
10. }
11. }
12. bound = t;
13. }
考虑以下断言:
在输入12之前
t < bound
在输入11之前
所有A[i] <= A[t]
i
,0 <= i < t
在输入13之前
对于所有索引A[k] <= A[j]
和k
j
,bound <= k <= j <= n-1
离开12后
bound
已减少
现在让我们看看为什么断言是真的
这是正确的,因为t=0
在循环之前,如果在if
内设置,则
t = i + 1 < (bound - 1) + 1 = bound.
这是真的,因为否则会发生交换。
for
不会将索引j
的条目从bound
更改为n-1
。从断言4开始,我们推断出while
循环,以及算法,在n
时最多以bound = 0
步为结束。
后置条件现在来自bound = 0
的断言3。