src/HOL/IMP/Big_Step.thy
author kleing
Mon, 06 Jun 2011 16:29:38 +0200
changeset 43158 686fa0a0696e
parent 43141 11fce8564415
child 44036 d03f9f28d01d
permissions -rw-r--r--
imported rest of new IMP
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43141
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
     1
(* Author: Gerwin Klein, Tobias Nipkow *)
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
     2
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
     3
theory Big_Step imports Com begin
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
     4
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
     5
subsection "Big-Step Semantics of Commands"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
     6
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
     7
inductive
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
     8
  big_step :: "com \<times> state \<Rightarrow> state \<Rightarrow> bool" (infix "\<Rightarrow>" 55)
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
     9
where
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    10
Skip:    "(SKIP,s) \<Rightarrow> s" |
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    11
Assign:  "(x ::= a,s) \<Rightarrow> s(x := aval a s)" |
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    12
Semi:    "\<lbrakk> (c\<^isub>1,s\<^isub>1) \<Rightarrow> s\<^isub>2;  (c\<^isub>2,s\<^isub>2) \<Rightarrow> s\<^isub>3 \<rbrakk> \<Longrightarrow>
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    13
          (c\<^isub>1;c\<^isub>2, s\<^isub>1) \<Rightarrow> s\<^isub>3" |
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    14
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    15
IfTrue:  "\<lbrakk> bval b s;  (c\<^isub>1,s) \<Rightarrow> t \<rbrakk> \<Longrightarrow>
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    16
         (IF b THEN c\<^isub>1 ELSE c\<^isub>2, s) \<Rightarrow> t" |
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    17
IfFalse: "\<lbrakk> \<not>bval b s;  (c\<^isub>2,s) \<Rightarrow> t \<rbrakk> \<Longrightarrow>
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    18
         (IF b THEN c\<^isub>1 ELSE c\<^isub>2, s) \<Rightarrow> t" |
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    19
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    20
WhileFalse: "\<not>bval b s \<Longrightarrow> (WHILE b DO c,s) \<Rightarrow> s" |
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    21
WhileTrue:  "\<lbrakk> bval b s\<^isub>1;  (c,s\<^isub>1) \<Rightarrow> s\<^isub>2;  (WHILE b DO c, s\<^isub>2) \<Rightarrow> s\<^isub>3 \<rbrakk> \<Longrightarrow>
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    22
             (WHILE b DO c, s\<^isub>1) \<Rightarrow> s\<^isub>3"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    23
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    24
schematic_lemma ex: "(''x'' ::= N 5; ''y'' ::= V ''x'', s) \<Rightarrow> ?t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    25
apply(rule Semi)
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    26
apply(rule Assign)
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    27
apply simp
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    28
apply(rule Assign)
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    29
done
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    30
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    31
thm ex[simplified]
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    32
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    33
text{* We want to execute the big-step rules: *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    34
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    35
code_pred big_step .
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    36
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    37
text{* For inductive definitions we need command
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    38
       \texttt{values} instead of \texttt{value}. *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    39
43158
686fa0a0696e imported rest of new IMP
kleing
parents: 43141
diff changeset
    40
values "{t. (SKIP, %_. 0) \<Rightarrow> t}"
43141
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    41
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    42
text{* We need to translate the result state into a list
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    43
to display it. *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    44
43158
686fa0a0696e imported rest of new IMP
kleing
parents: 43141
diff changeset
    45
values "{map t [''x''] |t. (SKIP, [''x'' \<rightarrow> 42]) \<Rightarrow> t}"
43141
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    46
43158
686fa0a0696e imported rest of new IMP
kleing
parents: 43141
diff changeset
    47
values "{map t [''x''] |t. (''x'' ::= N 2, [''x'' \<rightarrow> 42]) \<Rightarrow> t}"
43141
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    48
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    49
values "{map t [''x'',''y''] |t.
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    50
  (WHILE Less (V ''x'') (V ''y'') DO (''x'' ::= Plus (V ''x'') (N 5)),
43158
686fa0a0696e imported rest of new IMP
kleing
parents: 43141
diff changeset
    51
   [''x'' \<rightarrow> 0, ''y'' \<rightarrow> 13]) \<Rightarrow> t}"
43141
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    52
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    53
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    54
text{* Proof automation: *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    55
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    56
declare big_step.intros [intro]
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    57
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    58
text{* The standard induction rule 
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    59
@{thm [display] big_step.induct [no_vars]} *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    60
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    61
thm big_step.induct
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    62
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    63
text{* A customized induction rule for (c,s) pairs: *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    64
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    65
lemmas big_step_induct = big_step.induct[split_format(complete)]
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    66
thm big_step_induct
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    67
text {*
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    68
@{thm [display] big_step_induct [no_vars]}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    69
*}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    70
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    71
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    72
subsection "Rule inversion"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    73
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    74
text{* What can we deduce from @{prop "(SKIP,s) \<Rightarrow> t"} ?
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    75
That @{prop "s = t"}. This is how we can automatically prove it: *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    76
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    77
inductive_cases skipE[elim!]: "(SKIP,s) \<Rightarrow> t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    78
thm skipE
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    79
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    80
text{* This is an \emph{elimination rule}. The [elim] attribute tells auto,
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    81
blast and friends (but not simp!) to use it automatically; [elim!] means that
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    82
it is applied eagerly.
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    83
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    84
Similarly for the other commands: *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    85
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    86
inductive_cases AssignE[elim!]: "(x ::= a,s) \<Rightarrow> t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    87
thm AssignE
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    88
inductive_cases SemiE[elim!]: "(c1;c2,s1) \<Rightarrow> s3"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    89
thm SemiE
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    90
inductive_cases IfE[elim!]: "(IF b THEN c1 ELSE c2,s) \<Rightarrow> t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    91
thm IfE
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    92
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    93
inductive_cases WhileE[elim]: "(WHILE b DO c,s) \<Rightarrow> t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    94
thm WhileE
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    95
text{* Only [elim]: [elim!] would not terminate. *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    96
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    97
text{* An automatic example: *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    98
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
    99
lemma "(IF b THEN SKIP ELSE SKIP, s) \<Rightarrow> t \<Longrightarrow> t = s"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   100
by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   101
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   102
text{* Rule inversion by hand via the ``cases'' method: *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   103
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   104
lemma assumes "(IF b THEN SKIP ELSE SKIP, s) \<Rightarrow> t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   105
shows "t = s"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   106
proof-
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   107
  from assms show ?thesis
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   108
  proof cases  --"inverting assms"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   109
    case IfTrue thm IfTrue
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   110
    thus ?thesis by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   111
  next
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   112
    case IfFalse thus ?thesis by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   113
  qed
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   114
qed
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   115
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   116
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   117
subsection "Command Equivalence"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   118
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   119
text {*
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   120
  We call two statements @{text c} and @{text c'} equivalent wrt.\ the
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   121
  big-step semantics when \emph{@{text c} started in @{text s} terminates
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   122
  in @{text s'} iff @{text c'} started in the same @{text s} also terminates
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   123
  in the same @{text s'}}. Formally:
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   124
*}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   125
abbreviation
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   126
  equiv_c :: "com \<Rightarrow> com \<Rightarrow> bool" (infix "\<sim>" 50) where
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   127
  "c \<sim> c' == (\<forall>s t. (c,s) \<Rightarrow> t  =  (c',s) \<Rightarrow> t)"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   128
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   129
text {*
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   130
Warning: @{text"\<sim>"} is the symbol written \verb!\ < s i m >! (without spaces).
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   131
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   132
  As an example, we show that loop unfolding is an equivalence
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   133
  transformation on programs:
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   134
*}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   135
lemma unfold_while:
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   136
  "(WHILE b DO c) \<sim> (IF b THEN c; WHILE b DO c ELSE SKIP)" (is "?w \<sim> ?iw")
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   137
proof -
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   138
  -- "to show the equivalence, we look at the derivation tree for"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   139
  -- "each side and from that construct a derivation tree for the other side"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   140
  { fix s t assume "(?w, s) \<Rightarrow> t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   141
    -- "as a first thing we note that, if @{text b} is @{text False} in state @{text s},"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   142
    -- "then both statements do nothing:"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   143
    { assume "\<not>bval b s"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   144
      hence "t = s" using `(?w,s) \<Rightarrow> t` by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   145
      hence "(?iw, s) \<Rightarrow> t" using `\<not>bval b s` by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   146
    }
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   147
    moreover
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   148
    -- "on the other hand, if @{text b} is @{text True} in state @{text s},"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   149
    -- {* then only the @{text WhileTrue} rule can have been used to derive @{text "(?w, s) \<Rightarrow> t"} *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   150
    { assume "bval b s"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   151
      with `(?w, s) \<Rightarrow> t` obtain s' where
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   152
        "(c, s) \<Rightarrow> s'" and "(?w, s') \<Rightarrow> t" by auto
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   153
      -- "now we can build a derivation tree for the @{text IF}"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   154
      -- "first, the body of the True-branch:"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   155
      hence "(c; ?w, s) \<Rightarrow> t" by (rule Semi)
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   156
      -- "then the whole @{text IF}"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   157
      with `bval b s` have "(?iw, s) \<Rightarrow> t" by (rule IfTrue)
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   158
    }
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   159
    ultimately
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   160
    -- "both cases together give us what we want:"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   161
    have "(?iw, s) \<Rightarrow> t" by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   162
  }
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   163
  moreover
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   164
  -- "now the other direction:"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   165
  { fix s t assume "(?iw, s) \<Rightarrow> t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   166
    -- "again, if @{text b} is @{text False} in state @{text s}, then the False-branch"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   167
    -- "of the @{text IF} is executed, and both statements do nothing:"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   168
    { assume "\<not>bval b s"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   169
      hence "s = t" using `(?iw, s) \<Rightarrow> t` by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   170
      hence "(?w, s) \<Rightarrow> t" using `\<not>bval b s` by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   171
    }
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   172
    moreover
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   173
    -- "on the other hand, if @{text b} is @{text True} in state @{text s},"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   174
    -- {* then this time only the @{text IfTrue} rule can have be used *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   175
    { assume "bval b s"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   176
      with `(?iw, s) \<Rightarrow> t` have "(c; ?w, s) \<Rightarrow> t" by auto
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   177
      -- "and for this, only the Semi-rule is applicable:"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   178
      then obtain s' where
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   179
        "(c, s) \<Rightarrow> s'" and "(?w, s') \<Rightarrow> t" by auto
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   180
      -- "with this information, we can build a derivation tree for the @{text WHILE}"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   181
      with `bval b s`
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   182
      have "(?w, s) \<Rightarrow> t" by (rule WhileTrue)
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   183
    }
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   184
    ultimately
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   185
    -- "both cases together again give us what we want:"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   186
    have "(?w, s) \<Rightarrow> t" by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   187
  }
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   188
  ultimately
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   189
  show ?thesis by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   190
qed
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   191
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   192
text {* Luckily, such lengthy proofs are seldom necessary.  Isabelle can
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   193
prove many such facts automatically.  *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   194
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   195
lemma 
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   196
  "(WHILE b DO c) \<sim> (IF b THEN c; WHILE b DO c ELSE SKIP)"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   197
by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   198
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   199
lemma triv_if:
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   200
  "(IF b THEN c ELSE c) \<sim> c"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   201
by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   202
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   203
lemma commute_if:
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   204
  "(IF b1 THEN (IF b2 THEN c11 ELSE c12) ELSE c2) 
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   205
   \<sim> 
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   206
   (IF b2 THEN (IF b1 THEN c11 ELSE c2) ELSE (IF b1 THEN c12 ELSE c2))"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   207
by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   208
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   209
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   210
subsection "Execution is deterministic"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   211
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   212
text {* This proof is automatic. *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   213
theorem big_step_determ: "\<lbrakk> (c,s) \<Rightarrow> t; (c,s) \<Rightarrow> u \<rbrakk> \<Longrightarrow> u = t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   214
apply (induct arbitrary: u rule: big_step.induct)
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   215
apply blast+
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   216
done
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   217
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   218
text {*
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   219
  This is the proof as you might present it in a lecture. The remaining
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   220
  cases are simple enough to be proved automatically:
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   221
*}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   222
theorem
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   223
  "(c,s) \<Rightarrow> t  \<Longrightarrow>  (c,s) \<Rightarrow> t'  \<Longrightarrow>  t' = t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   224
proof (induct arbitrary: t' rule: big_step.induct)
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   225
  -- "the only interesting case, @{text WhileTrue}:"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   226
  fix b c s s1 t t'
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   227
  -- "The assumptions of the rule:"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   228
  assume "bval b s" and "(c,s) \<Rightarrow> s1" and "(WHILE b DO c,s1) \<Rightarrow> t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   229
  -- {* Ind.Hyp; note the @{text"\<And>"} because of arbitrary: *}
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   230
  assume IHc: "\<And>t'. (c,s) \<Rightarrow> t' \<Longrightarrow> t' = s1"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   231
  assume IHw: "\<And>t'. (WHILE b DO c,s1) \<Rightarrow> t' \<Longrightarrow> t' = t"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   232
  -- "Premise of implication:"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   233
  assume "(WHILE b DO c,s) \<Rightarrow> t'"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   234
  with `bval b s` obtain s1' where
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   235
      c: "(c,s) \<Rightarrow> s1'" and
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   236
      w: "(WHILE b DO c,s1') \<Rightarrow> t'"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   237
    by auto
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   238
  from c IHc have "s1' = s1" by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   239
  with w IHw show "t' = t" by blast
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   240
qed blast+ -- "prove the rest automatically"
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   241
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   242
11fce8564415 Replacing old IMP with new Semantics material
nipkow
parents:
diff changeset
   243
end