src/HOL/IMP/VC.thy
author wenzelm
Sun, 30 Jan 2011 13:02:18 +0100
changeset 41648 6d736d983d5c
parent 41589 bbd861837ebc
permissions -rw-r--r--
clarified example settings for Proof General;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1451
diff changeset
     1
(*  Title:      HOL/IMP/VC.thy
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1451
diff changeset
     2
    Author:     Tobias Nipkow
1447
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
     3
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
     4
acom: annotated commands
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
     5
vc:   verification-conditions
2810
c4e16b36bc57 Added wp_while.
nipkow
parents: 1900
diff changeset
     6
awp:   weakest (liberal) precondition
1447
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
     7
*)
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
     8
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
     9
header "Verification Conditions"
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    10
35754
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    11
theory VC imports Hoare_Op begin
1447
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
    12
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
    13
datatype  acom = Askip
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
    14
               | Aass   loc aexp
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
    15
               | Asemi  acom acom
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
    16
               | Aif    bexp acom acom
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
    17
               | Awhile bexp assn acom
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
    18
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    19
primrec awp :: "acom => assn => assn"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    20
where
2810
c4e16b36bc57 Added wp_while.
nipkow
parents: 1900
diff changeset
    21
  "awp Askip Q = Q"
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    22
| "awp (Aass x a) Q = (\<lambda>s. Q(s[x\<mapsto>a s]))"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    23
| "awp (Asemi c d) Q = awp c (awp d Q)"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    24
| "awp (Aif b c d) Q = (\<lambda>s. (b s-->awp c Q s) & (~b s-->awp d Q s))"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    25
| "awp (Awhile b I c) Q = I"
1447
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
    26
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    27
primrec vc :: "acom => assn => assn"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    28
where
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    29
  "vc Askip Q = (\<lambda>s. True)"
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    30
| "vc (Aass x a) Q = (\<lambda>s. True)"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    31
| "vc (Asemi c d) Q = (\<lambda>s. vc c (awp d Q) s & vc d Q s)"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    32
| "vc (Aif b c d) Q = (\<lambda>s. vc c Q s & vc d Q s)"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    33
| "vc (Awhile b I c) Q = (\<lambda>s. (I s & ~b s --> Q s) &
2810
c4e16b36bc57 Added wp_while.
nipkow
parents: 1900
diff changeset
    34
                              (I s & b s --> awp c I s) & vc c I s)"
1447
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
    35
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    36
primrec astrip :: "acom => com"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    37
where
1900
c7a869229091 Simplified primrec definitions.
berghofe
parents: 1696
diff changeset
    38
  "astrip Askip = SKIP"
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    39
| "astrip (Aass x a) = (x:==a)"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    40
| "astrip (Asemi c d) = (astrip c;astrip d)"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    41
| "astrip (Aif b c d) = (\<IF> b \<THEN> astrip c \<ELSE> astrip d)"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    42
| "astrip (Awhile b I c) = (\<WHILE> b \<DO> astrip c)"
1451
6803ecb9b198 Added vcwp
nipkow
parents: 1447
diff changeset
    43
2810
c4e16b36bc57 Added wp_while.
nipkow
parents: 1900
diff changeset
    44
(* simultaneous computation of vc and awp: *)
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    45
primrec vcawp :: "acom => assn => assn \<times> assn"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    46
where
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    47
  "vcawp Askip Q = (\<lambda>s. True, Q)"
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    48
| "vcawp (Aass x a) Q = (\<lambda>s. True, \<lambda>s. Q(s[x\<mapsto>a s]))"
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    49
| "vcawp (Asemi c d) Q = (let (vcd,wpd) = vcawp d Q;
2810
c4e16b36bc57 Added wp_while.
nipkow
parents: 1900
diff changeset
    50
                              (vcc,wpc) = vcawp c wpd
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    51
                          in (\<lambda>s. vcc s & vcd s, wpc))"
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    52
| "vcawp (Aif b c d) Q = (let (vcd,wpd) = vcawp d Q;
2810
c4e16b36bc57 Added wp_while.
nipkow
parents: 1900
diff changeset
    53
                              (vcc,wpc) = vcawp c Q
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    54
                          in (\<lambda>s. vcc s & vcd s,
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    55
                              \<lambda>s.(b s --> wpc s) & (~b s --> wpd s)))"
27362
a6dc1769fdda modernized specifications;
wenzelm
parents: 26342
diff changeset
    56
| "vcawp (Awhile b I c) Q = (let (vcc,wpc) = vcawp c I
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    57
                             in (\<lambda>s. (I s & ~b s --> Q s) &
2810
c4e16b36bc57 Added wp_while.
nipkow
parents: 1900
diff changeset
    58
                                     (I s & b s --> wpc s) & vcc s, I))"
1451
6803ecb9b198 Added vcwp
nipkow
parents: 1447
diff changeset
    59
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    60
(*
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    61
Soundness and completeness of vc
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    62
*)
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    63
35754
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    64
declare hoare.conseq [intro]
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    65
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    66
35754
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    67
lemma vc_sound: "(ALL s. vc c Q s) \<Longrightarrow> |- {awp c Q} astrip c {Q}"
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    68
proof(induct c arbitrary: Q)
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    69
  case (Awhile b I c)
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    70
  show ?case
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    71
  proof(simp, rule While')
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    72
    from `\<forall>s. vc (Awhile b I c) Q s`
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    73
    have vc: "ALL s. vc c I s" and IQ: "ALL s. I s \<and> \<not> b s \<longrightarrow> Q s" and
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    74
         awp: "ALL s. I s & b s --> awp c I s" by simp_all
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    75
    from vc have "|- {awp c I} astrip c {I}" using Awhile.hyps by blast
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    76
    with awp show "|- {\<lambda>s. I s \<and> b s} astrip c {I}"
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    77
      by(rule strengthen_pre)
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    78
    show "\<forall>s. I s \<and> \<not> b s \<longrightarrow> Q s" by(rule IQ)
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    79
  qed
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    80
qed auto
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    81
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    82
35754
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    83
lemma awp_mono:
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    84
  "(!s. P s --> Q s) ==> awp c P s ==> awp c Q s"
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    85
proof (induct c arbitrary: P Q s)
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    86
  case Asemi thus ?case by simp metis
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    87
qed simp_all
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    88
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    89
lemma vc_mono:
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    90
  "(!s. P s --> Q s) ==> vc c P s ==> vc c Q s"
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    91
proof(induct c arbitrary: P Q)
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    92
  case Asemi thus ?case by simp (metis awp_mono)
8e7dba5f00f5 Reorganized Hoare logic theories; added Hoare_Den
nipkow
parents: 27362
diff changeset
    93
qed simp_all
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
    94
13596
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
    95
lemma vc_complete: assumes der: "|- {P}c{Q}"
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    96
  shows "(\<exists>ac. astrip ac = c & (\<forall>s. vc ac Q s) & (\<forall>s. P s --> awp ac Q s))"
13596
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
    97
  (is "? ac. ?Eq P c Q ac")
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
    98
using der
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
    99
proof induct
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   100
  case skip
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   101
  show ?case (is "? ac. ?C ac")
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   102
  proof show "?C Askip" by simp qed
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   103
next
23746
a455e69c31cc Adapted to new inductive definition package.
berghofe
parents: 20503
diff changeset
   104
  case (ass P x a)
13596
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   105
  show ?case (is "? ac. ?C ac")
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   106
  proof show "?C(Aass x a)" by simp qed
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   107
next
23746
a455e69c31cc Adapted to new inductive definition package.
berghofe
parents: 20503
diff changeset
   108
  case (semi P c1 Q c2 R)
13596
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   109
  from semi.hyps obtain ac1 where ih1: "?Eq P c1 Q ac1" by fast
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   110
  from semi.hyps obtain ac2 where ih2: "?Eq Q c2 R ac2" by fast
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   111
  show ?case (is "? ac. ?C ac")
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   112
  proof
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   113
    show "?C(Asemi ac1 ac2)"
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   114
      using ih1 ih2 by simp (fast elim!: awp_mono vc_mono)
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   115
  qed
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   116
next
23746
a455e69c31cc Adapted to new inductive definition package.
berghofe
parents: 20503
diff changeset
   117
  case (If P b c1 Q c2)
13596
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   118
  from If.hyps obtain ac1 where ih1: "?Eq (%s. P s & b s) c1 Q ac1" by fast
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   119
  from If.hyps obtain ac2 where ih2: "?Eq (%s. P s & ~b s) c2 Q ac2" by fast
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   120
  show ?case (is "? ac. ?C ac")
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   121
  proof
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   122
    show "?C(Aif b ac1 ac2)"
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   123
      using ih1 ih2 by simp
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   124
  qed
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   125
next
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   126
  case (While P b c)
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   127
  from While.hyps obtain ac where ih: "?Eq (%s. P s & b s) c P ac" by fast
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   128
  show ?case (is "? ac. ?C ac")
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   129
  proof show "?C(Awhile b P ac)" using ih by simp qed
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   130
next
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   131
  case conseq thus ?case by(fast elim!: awp_mono vc_mono)
ee5f79b210c1 modified induct method
nipkow
parents: 12434
diff changeset
   132
qed
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
   133
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   134
lemma vcawp_vc_awp: "vcawp c Q = (vc c Q, awp c Q)"
20503
503ac4c5ef91 induct method: renamed 'fixing' to 'arbitrary';
wenzelm
parents: 18372
diff changeset
   135
  by (induct c arbitrary: Q) (simp_all add: Let_def)
12431
07ec657249e5 converted to Isar
kleing
parents: 9241
diff changeset
   136
1447
bc2c0acbbf29 Added a verified verification-condition generator.
nipkow
parents:
diff changeset
   137
end