假设前置条件为真,使用语义证明在执行程序后后置条件为真

时间:2016-02-23 19:08:01

标签: compilation semantics proof

我正在尝试在我的编程语言概念课程中学习测试。

我想了解如何解决这个问题。我们的教授说,只要他能理解我们所说的话,我们就不需要用正式的符号来证明这个问题。

我错过了他解决问题的讲座,我很难找到资源来帮助我自己解决问题。

非常感谢您的解释。

问题

  

假设前提条件为真,使用公理语义证明在执行程序后后置条件为真

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]

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. }

考虑以下断言:

  1. 在输入12之前

    t < bound
    
  2. 在输入11之前

    所有A[i] <= A[t]

    i0 <= i < t

  3. 在输入13之前

    对于所有索引A[k] <= A[j]k

    jbound <= k <= j <= n-1

  4. 离开12后

    bound已减少

  5. 现在让我们看看为什么断言是真的

    1. 这是正确的,因为t=0在循环之前,如果在if内设置,则

      t = i + 1 < (bound - 1) + 1 = bound.
      
    2. 这是真的,因为否则会发生交换。

    3. 这是因为2,因为for不会将索引j的条目从bound更改为n-1
    4. 这是因为1。
    5. 从断言4开始,我们推断出while循环,以及算法,在n时最多以bound = 0步为结束。

      后置条件现在来自bound = 0的断言3。