证明形式逻辑的正确性

时间:2012-05-24 21:37:39

标签: proof formal-methods post-conditions hoare-logic proof-of-correctness

我想知道是否有人可以帮我回答这个问题。这是从以前的试卷开始,我可以知道今年考试的答案。

这个问题看起来很简单,我完全迷失了,究竟是什么要求?

  

考虑以下涉及整数变量的代码部分:

if (i < j) {
    m = i;
} else {
    m = j;
}
     

通过陈述适当的输出条件然后验证       这段代码的正确性,证明执行后,m等于       i和j的最小值。

我的帖子条件如下: {m =i∧i&lt; j∨m=j∧j&lt; I}

这是对的吗?你怎么验证这个?这似乎很简单。

感谢。

1 个答案:

答案 0 :(得分:3)

你的帖子条件是否正确。我个人觉得以下变体(相当于)更自然:

(i<j → m=i) ∧ (i≥j → m=j)

要证明程序满足后置条件,请执行以下操作。

  1. 请注意,为确保程序始终满足发布条件,您应使用true作为前提条件。

  2. 所以你有以下Hoare三重奏:

    {true}
    if (i < j) {
    
    
        m = i;
    
    } else {
    
    
        m = j;
    
    }
    {(i < j → m = i) ∧ (i ≥ j → m = j)}
    
  3. 后置条件需要保留在两个分支的末尾,所以(根据条件的标准最弱前提规则)我们有

    {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)}  ----------'
    
  4. 根据分配产量最弱的前提条件进一步推进公式

    {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)}
    
  5. 在真正分支的顶部我们知道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)}
    
  6. 剩下要显示的是任何两个连续的断言,第一个断言暗示第二个断言。 (这些通常被称为“证明义务”。)我们有两个这样的义务:(1)应该暗示(2)(3)应该暗示(4)。情况显然如此。

    - “qed”: - )