src/HOL/IMP/Def_Init_Small.thy
author nipkow
Wed, 24 Jul 2013 22:54:47 +0200
changeset 52726 ee0bd6bababd
parent 52046 bc01725d7918
child 53015 a1119cf551e8
permissions -rw-r--r--
merged Def_Init_Sound_X into Def_Init_X
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     1
(* Author: Tobias Nipkow *)
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     2
50161
4fc4237488ab tuned names
nipkow
parents: 47818
diff changeset
     3
theory Def_Init_Small
52726
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
     4
imports Star Def_Init_Exp Def_Init
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     5
begin
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     6
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     7
subsection "Initialization-Sensitive Small Step Semantics"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     8
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     9
inductive
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    10
  small_step :: "(com \<times> state) \<Rightarrow> (com \<times> state) \<Rightarrow> bool" (infix "\<rightarrow>" 55)
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    11
where
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    12
Assign:  "aval a s = Some i \<Longrightarrow> (x ::= a, s) \<rightarrow> (SKIP, s(x := Some i))" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    13
52046
bc01725d7918 replaced `;' by `;;' to disambiguate syntax; unexpected slight increase in build time
nipkow
parents: 50161
diff changeset
    14
Seq1:   "(SKIP;;c,s) \<rightarrow> (c,s)" |
bc01725d7918 replaced `;' by `;;' to disambiguate syntax; unexpected slight increase in build time
nipkow
parents: 50161
diff changeset
    15
Seq2:   "(c\<^isub>1,s) \<rightarrow> (c\<^isub>1',s') \<Longrightarrow> (c\<^isub>1;;c\<^isub>2,s) \<rightarrow> (c\<^isub>1';;c\<^isub>2,s')" |
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    16
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    17
IfTrue:  "bval b s = Some True \<Longrightarrow> (IF b THEN c\<^isub>1 ELSE c\<^isub>2,s) \<rightarrow> (c\<^isub>1,s)" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    18
IfFalse: "bval b s = Some False \<Longrightarrow> (IF b THEN c\<^isub>1 ELSE c\<^isub>2,s) \<rightarrow> (c\<^isub>2,s)" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    19
52046
bc01725d7918 replaced `;' by `;;' to disambiguate syntax; unexpected slight increase in build time
nipkow
parents: 50161
diff changeset
    20
While:   "(WHILE b DO c,s) \<rightarrow> (IF b THEN c;; WHILE b DO c ELSE SKIP,s)"
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    21
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    22
lemmas small_step_induct = small_step.induct[split_format(complete)]
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    23
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    24
abbreviation small_steps :: "com * state \<Rightarrow> com * state \<Rightarrow> bool" (infix "\<rightarrow>*" 55)
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    25
where "x \<rightarrow>* y == star small_step x y"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    26
52726
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    27
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    28
subsection "Soundness wrt Small Steps"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    29
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    30
theorem progress:
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    31
  "D (dom s) c A' \<Longrightarrow> c \<noteq> SKIP \<Longrightarrow> EX cs'. (c,s) \<rightarrow> cs'"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    32
proof (induction c arbitrary: s A')
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    33
  case Assign thus ?case by auto (metis aval_Some small_step.Assign)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    34
next
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    35
  case (If b c1 c2)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    36
  then obtain bv where "bval b s = Some bv" by (auto dest!:bval_Some)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    37
  then show ?case
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    38
    by(cases bv)(auto intro: small_step.IfTrue small_step.IfFalse)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    39
qed (fastforce intro: small_step.intros)+
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    40
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    41
lemma D_mono:  "D A c M \<Longrightarrow> A \<subseteq> A' \<Longrightarrow> EX M'. D A' c M' & M <= M'"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    42
proof (induction c arbitrary: A A' M)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    43
  case Seq thus ?case by auto (metis D.intros(3))
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    44
next
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    45
  case (If b c1 c2)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    46
  then obtain M1 M2 where "vars b \<subseteq> A" "D A c1 M1" "D A c2 M2" "M = M1 \<inter> M2"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    47
    by auto
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    48
  with If.IH `A \<subseteq> A'` obtain M1' M2'
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    49
    where "D A' c1 M1'" "D A' c2 M2'" and "M1 \<subseteq> M1'" "M2 \<subseteq> M2'" by metis
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    50
  hence "D A' (IF b THEN c1 ELSE c2) (M1' \<inter> M2')" and "M \<subseteq> M1' \<inter> M2'"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    51
    using `vars b \<subseteq> A` `A \<subseteq> A'` `M = M1 \<inter> M2` by(fastforce intro: D.intros)+
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    52
  thus ?case by metis
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    53
next
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    54
  case While thus ?case by auto (metis D.intros(5) subset_trans)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    55
qed (auto intro: D.intros)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    56
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    57
theorem D_preservation:
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    58
  "(c,s) \<rightarrow> (c',s') \<Longrightarrow> D (dom s) c A \<Longrightarrow> EX A'. D (dom s') c' A' & A <= A'"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    59
proof (induction arbitrary: A rule: small_step_induct)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    60
  case (While b c s)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    61
  then obtain A' where "vars b \<subseteq> dom s" "A = dom s" "D (dom s) c A'" by blast
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    62
  moreover
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    63
  then obtain A'' where "D A' c A''" by (metis D_incr D_mono)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    64
  ultimately have "D (dom s) (IF b THEN c;; WHILE b DO c ELSE SKIP) (dom s)"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    65
    by (metis D.If[OF `vars b \<subseteq> dom s` D.Seq[OF `D (dom s) c A'` D.While[OF _ `D A' c A''`]] D.Skip] D_incr Int_absorb1 subset_trans)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    66
  thus ?case by (metis D_incr `A = dom s`)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    67
next
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    68
  case Seq2 thus ?case by auto (metis D_mono D.intros(3))
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    69
qed (auto intro: D.intros)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    70
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    71
theorem D_sound:
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    72
  "(c,s) \<rightarrow>* (c',s') \<Longrightarrow> D (dom s) c A'
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    73
   \<Longrightarrow> (\<exists>cs''. (c',s') \<rightarrow> cs'') \<or> c' = SKIP"
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    74
apply(induction arbitrary: A' rule:star_induct)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    75
apply (metis progress)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    76
by (metis D_preservation)
ee0bd6bababd merged Def_Init_Sound_X into Def_Init_X
nipkow
parents: 52046
diff changeset
    77
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    78
end