src/HOL/IMP/Fold.thy
author nipkow
Mon, 11 Nov 2013 10:23:01 +0100
changeset 54297 3fc1b77ef750
parent 52825 71fef62c4213
child 55583 a0134252ac29
permissions -rw-r--r--
tuned
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
     1
theory Fold imports Sem_Equiv Vars begin
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
     2
44850
a6095c96a89b tuned headers
nipkow
parents: 44070
diff changeset
     3
subsection "Simple folding of arithmetic expressions"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
     4
45134
9b02f6665fc8 discontinued obsolete 'types' command;
wenzelm
parents: 45015
diff changeset
     5
type_synonym
45212
e87feee00a4c renamed name -> vname
nipkow
parents: 45200
diff changeset
     6
  tab = "vname \<Rightarrow> val option"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
     7
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
     8
fun afold :: "aexp \<Rightarrow> tab \<Rightarrow> aexp" where
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
     9
"afold (N n) _ = N n" |
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
    10
"afold (V x) t = (case t x of None \<Rightarrow> V x | Some k \<Rightarrow> N k)" |
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
    11
"afold (Plus e1 e2) t = (case (afold e1 t, afold e2 t) of
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
    12
  (N n1, N n2) \<Rightarrow> N(n1+n2) | (e1',e2') \<Rightarrow> Plus e1' e2')"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    13
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    14
definition "approx t s \<longleftrightarrow> (ALL x k. t x = Some k \<longrightarrow> s x = k)"
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    15
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
    16
theorem aval_afold[simp]:
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    17
assumes "approx t s"
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
    18
shows "aval (afold a t) s = aval a s"
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
    19
  using assms
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    20
  by (induct a) (auto simp: approx_def split: aexp.split option.split)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    21
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
    22
theorem aval_afold_N:
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    23
assumes "approx t s"
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
    24
shows "afold a t = N n \<Longrightarrow> aval a s = n"
51573
acc4bd79e2e9 replace induction by hammer
kleing
parents: 51514
diff changeset
    25
  by (metis assms aval.simps(1) aval_afold)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    26
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    27
definition
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    28
  "merge t1 t2 = (\<lambda>m. if t1 m = t2 m then t1 m else None)"
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    29
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    30
primrec "defs" :: "com \<Rightarrow> tab \<Rightarrow> tab" where
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    31
"defs SKIP t = t" |
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    32
"defs (x ::= a) t =
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
    33
  (case afold a t of N k \<Rightarrow> t(x \<mapsto> k) | _ \<Rightarrow> t(x:=None))" |
52046
bc01725d7918 replaced `;' by `;;' to disambiguate syntax; unexpected slight increase in build time
nipkow
parents: 51573
diff changeset
    34
"defs (c1;;c2) t = (defs c2 o defs c1) t" |
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    35
"defs (IF b THEN c1 ELSE c2) t = merge (defs c1 t) (defs c2 t)" |
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    36
"defs (WHILE b DO c) t = t |` (-lvars c)"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    37
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    38
primrec fold where
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    39
"fold SKIP _ = SKIP" |
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
    40
"fold (x ::= a) t = (x ::= (afold a t))" |
52046
bc01725d7918 replaced `;' by `;;' to disambiguate syntax; unexpected slight increase in build time
nipkow
parents: 51573
diff changeset
    41
"fold (c1;;c2) t = (fold c1 t;; fold c2 (defs c1 t))" |
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    42
"fold (IF b THEN c1 ELSE c2) t = IF b THEN fold c1 t ELSE fold c2 t" |
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    43
"fold (WHILE b DO c) t = WHILE b DO fold c (t |` (-lvars c))"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    44
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    45
lemma approx_merge:
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    46
  "approx t1 s \<or> approx t2 s \<Longrightarrow> approx (merge t1 t2) s"
44890
22f665a2e91c new fastforce replacing fastsimp - less confusing name
nipkow
parents: 44850
diff changeset
    47
  by (fastforce simp: merge_def approx_def)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    48
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    49
lemma approx_map_le:
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    50
  "approx t2 s \<Longrightarrow> t1 \<subseteq>\<^sub>m t2 \<Longrightarrow> approx t1 s"
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    51
  by (clarsimp simp: approx_def map_le_def dom_def)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    52
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    53
lemma restrict_map_le [intro!, simp]: "t |` S \<subseteq>\<^sub>m t"
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    54
  by (clarsimp simp: restrict_map_def map_le_def)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    55
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    56
lemma merge_restrict:
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    57
  assumes "t1 |` S = t |` S"
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    58
  assumes "t2 |` S = t |` S"
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    59
  shows "merge t1 t2 |` S = t |` S"
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    60
proof -
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    61
  from assms
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
    62
  have "\<forall>x. (t1 |` S) x = (t |` S) x"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    63
   and "\<forall>x. (t2 |` S) x = (t |` S) x" by auto
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    64
  thus ?thesis
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
    65
    by (auto simp: merge_def restrict_map_def
51506
cd573f1a82b2 removed obsolete uses of ext
kleing
parents: 48909
diff changeset
    66
             split: if_splits)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    67
qed
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    68
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    69
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    70
lemma defs_restrict:
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    71
  "defs c t |` (- lvars c) = t |` (- lvars c)"
45015
fdac1e9880eb Updated IMP to use new induction method
nipkow
parents: 44890
diff changeset
    72
proof (induction c arbitrary: t)
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
    73
  case (Seq c1 c2)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    74
  hence "defs c1 t |` (- lvars c1) = t |` (- lvars c1)"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    75
    by simp
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    76
  hence "defs c1 t |` (- lvars c1) |` (-lvars c2) =
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    77
         t |` (- lvars c1) |` (-lvars c2)" by simp
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    78
  moreover
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
    79
  from Seq
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    80
  have "defs c2 (defs c1 t) |` (- lvars c2) =
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    81
        defs c1 t |` (- lvars c2)"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    82
    by simp
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    83
  hence "defs c2 (defs c1 t) |` (- lvars c2) |` (- lvars c1) =
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    84
         defs c1 t |` (- lvars c2) |` (- lvars c1)"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    85
    by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    86
  ultimately
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    87
  show ?case by (clarsimp simp: Int_commute)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    88
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    89
  case (If b c1 c2)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    90
  hence "defs c1 t |` (- lvars c1) = t |` (- lvars c1)" by simp
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    91
  hence "defs c1 t |` (- lvars c1) |` (-lvars c2) =
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    92
         t |` (- lvars c1) |` (-lvars c2)" by simp
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    93
  moreover
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    94
  from If
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    95
  have "defs c2 t |` (- lvars c2) = t |` (- lvars c2)" by simp
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    96
  hence "defs c2 t |` (- lvars c2) |` (-lvars c1) =
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
    97
         t |` (- lvars c2) |` (-lvars c1)" by simp
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    98
  ultimately
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
    99
  show ?case by (auto simp: Int_commute intro: merge_restrict)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   100
qed (auto split: aexp.split)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   101
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   102
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   103
lemma big_step_pres_approx:
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   104
  "(c,s) \<Rightarrow> s' \<Longrightarrow> approx t s \<Longrightarrow> approx (defs c t) s'"
45015
fdac1e9880eb Updated IMP to use new induction method
nipkow
parents: 44890
diff changeset
   105
proof (induction arbitrary: t rule: big_step_induct)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   106
  case Skip thus ?case by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   107
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   108
  case Assign
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   109
  thus ?case
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   110
    by (clarsimp simp: aval_afold_N approx_def split: aexp.split)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   111
next
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   112
  case (Seq c1 s1 s2 c2 s3)
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   113
  have "approx (defs c1 t) s2" by (rule Seq.IH(1)[OF Seq.prems])
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   114
  hence "approx (defs c2 (defs c1 t)) s3" by (rule Seq.IH(2))
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   115
  thus ?case by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   116
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   117
  case (IfTrue b s c1 s')
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   118
  hence "approx (defs c1 t) s'" by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   119
  thus ?case by (simp add: approx_merge)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   120
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   121
  case (IfFalse b s c2 s')
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   122
  hence "approx (defs c2 t) s'" by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   123
  thus ?case by (simp add: approx_merge)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   124
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   125
  case WhileFalse
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   126
  thus ?case by (simp add: approx_def restrict_map_def)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   127
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   128
  case (WhileTrue b s1 c s2 s3)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   129
  hence "approx (defs c t) s2" by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   130
  with WhileTrue
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   131
  have "approx (defs c t |` (-lvars c)) s3" by simp
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   132
  thus ?case by (simp add: defs_restrict)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   133
qed
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   134
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   135
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   136
lemma big_step_pres_approx_restrict:
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   137
  "(c,s) \<Rightarrow> s' \<Longrightarrow> approx (t |` (-lvars c)) s \<Longrightarrow> approx (t |` (-lvars c)) s'"
45015
fdac1e9880eb Updated IMP to use new induction method
nipkow
parents: 44890
diff changeset
   138
proof (induction arbitrary: t rule: big_step_induct)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   139
  case Assign
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   140
  thus ?case by (clarsimp simp: approx_def)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   141
next
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   142
  case (Seq c1 s1 s2 c2 s3)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   143
  hence "approx (t |` (-lvars c2) |` (-lvars c1)) s1"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   144
    by (simp add: Int_commute)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   145
  hence "approx (t |` (-lvars c2) |` (-lvars c1)) s2"
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   146
    by (rule Seq)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   147
  hence "approx (t |` (-lvars c1) |` (-lvars c2)) s2"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   148
    by (simp add: Int_commute)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   149
  hence "approx (t |` (-lvars c1) |` (-lvars c2)) s3"
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   150
    by (rule Seq)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   151
  thus ?case by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   152
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   153
  case (IfTrue b s c1 s' c2)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   154
  hence "approx (t |` (-lvars c2) |` (-lvars c1)) s"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   155
    by (simp add: Int_commute)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   156
  hence "approx (t |` (-lvars c2) |` (-lvars c1)) s'"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   157
    by (rule IfTrue)
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   158
  thus ?case by (simp add: Int_commute)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   159
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   160
  case (IfFalse b s c2 s' c1)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   161
  hence "approx (t |` (-lvars c1) |` (-lvars c2)) s"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   162
    by simp
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   163
  hence "approx (t |` (-lvars c1) |` (-lvars c2)) s'"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   164
    by (rule IfFalse)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   165
  thus ?case by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   166
qed auto
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   167
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   168
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   169
declare assign_simp [simp]
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   170
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   171
lemma approx_eq:
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   172
  "approx t \<Turnstile> c \<sim> fold c t"
45015
fdac1e9880eb Updated IMP to use new induction method
nipkow
parents: 44890
diff changeset
   173
proof (induction c arbitrary: t)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   174
  case SKIP show ?case by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   175
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   176
  case Assign
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   177
  show ?case by (simp add: equiv_up_to_def)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   178
next
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   179
  case Seq
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   180
  thus ?case by (auto intro!: equiv_up_to_seq big_step_pres_approx)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   181
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   182
  case If
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   183
  thus ?case by (auto intro!: equiv_up_to_if_weak)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   184
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   185
  case (While b c)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   186
  hence "approx (t |` (- lvars c)) \<Turnstile>
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   187
         WHILE b DO c \<sim> WHILE b DO fold c (t |` (- lvars c))"
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   188
    by (auto intro: equiv_up_to_while_weak big_step_pres_approx_restrict)
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   189
  thus ?case
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   190
    by (auto intro: equiv_up_to_weaken approx_map_le)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   191
qed
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   192
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   193
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   194
lemma approx_empty [simp]:
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   195
  "approx empty = (\<lambda>_. True)"
51506
cd573f1a82b2 removed obsolete uses of ext
kleing
parents: 48909
diff changeset
   196
  by (auto simp: approx_def)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   197
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   198
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   199
theorem constant_folding_equiv:
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   200
  "fold c empty \<sim> c"
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   201
  using approx_eq [of empty c]
52825
71fef62c4213 removed duplicate lemma
kleing
parents: 52072
diff changeset
   202
  by (simp add: equiv_up_to_True sim_sym)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   203
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   204
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   205
44850
a6095c96a89b tuned headers
nipkow
parents: 44070
diff changeset
   206
subsection {* More ambitious folding including boolean expressions *}
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   207
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   208
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   209
fun bfold :: "bexp \<Rightarrow> tab \<Rightarrow> bexp" where
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   210
"bfold (Less a1 a2) t = less (afold a1 t) (afold a2 t)" |
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   211
"bfold (And b1 b2) t = and (bfold b1 t) (bfold b2 t)" |
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   212
"bfold (Not b) t = not(bfold b t)" |
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   213
"bfold (Bc bc) _ = Bc bc"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   214
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   215
theorem bval_bfold [simp]:
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   216
  assumes "approx t s"
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   217
  shows "bval (bfold b t) s = bval b s"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   218
  using assms by (induct b) auto
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   219
45200
1f1897ac7877 renamed B to Bc
nipkow
parents: 45134
diff changeset
   220
lemma not_Bc [simp]: "not (Bc v) = Bc (\<not>v)"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   221
  by (cases v) auto
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   222
45200
1f1897ac7877 renamed B to Bc
nipkow
parents: 45134
diff changeset
   223
lemma not_Bc_eq [simp]: "(not b = Bc v) = (b = Bc (\<not>v))"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   224
  by (cases b) auto
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   225
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   226
lemma and_Bc_eq:
45200
1f1897ac7877 renamed B to Bc
nipkow
parents: 45134
diff changeset
   227
  "(and a b = Bc v) =
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   228
   (a = Bc False \<and> \<not>v  \<or>  b = Bc False \<and> \<not>v \<or>
45200
1f1897ac7877 renamed B to Bc
nipkow
parents: 45134
diff changeset
   229
    (\<exists>v1 v2. a = Bc v1 \<and> b = Bc v2 \<and> v = v1 \<and> v2))"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   230
  by (rule and.induct) auto
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   231
45200
1f1897ac7877 renamed B to Bc
nipkow
parents: 45134
diff changeset
   232
lemma less_Bc_eq [simp]:
1f1897ac7877 renamed B to Bc
nipkow
parents: 45134
diff changeset
   233
  "(less a b = Bc v) = (\<exists>n1 n2. a = N n1 \<and> b = N n2 \<and> v = (n1 < n2))"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   234
  by (rule less.induct) auto
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   235
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   236
theorem bval_bfold_Bc:
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   237
assumes "approx t s"
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   238
shows "bfold b t = Bc v \<Longrightarrow> bval b s = v"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   239
  using assms
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   240
  by (induct b arbitrary: v)
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   241
     (auto simp: approx_def and_Bc_eq aval_afold_N
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   242
           split: bexp.splits bool.splits)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   243
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   244
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   245
primrec "bdefs" :: "com \<Rightarrow> tab \<Rightarrow> tab" where
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   246
"bdefs SKIP t = t" |
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   247
"bdefs (x ::= a) t =
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   248
  (case afold a t of N k \<Rightarrow> t(x \<mapsto> k) | _ \<Rightarrow> t(x:=None))" |
52046
bc01725d7918 replaced `;' by `;;' to disambiguate syntax; unexpected slight increase in build time
nipkow
parents: 51573
diff changeset
   249
"bdefs (c1;;c2) t = (bdefs c2 o bdefs c1) t" |
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   250
"bdefs (IF b THEN c1 ELSE c2) t = (case bfold b t of
45200
1f1897ac7877 renamed B to Bc
nipkow
parents: 45134
diff changeset
   251
    Bc True \<Rightarrow> bdefs c1 t
1f1897ac7877 renamed B to Bc
nipkow
parents: 45134
diff changeset
   252
  | Bc False \<Rightarrow> bdefs c2 t
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   253
  | _ \<Rightarrow> merge (bdefs c1 t) (bdefs c2 t))" |
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   254
"bdefs (WHILE b DO c) t = t |` (-lvars c)"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   255
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   256
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   257
primrec fold' where
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   258
"fold' SKIP _ = SKIP" |
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   259
"fold' (x ::= a) t = (x ::= (afold a t))" |
52046
bc01725d7918 replaced `;' by `;;' to disambiguate syntax; unexpected slight increase in build time
nipkow
parents: 51573
diff changeset
   260
"fold' (c1;;c2) t = (fold' c1 t;; fold' c2 (bdefs c1 t))" |
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   261
"fold' (IF b THEN c1 ELSE c2) t = (case bfold b t of
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   262
    Bc True \<Rightarrow> fold' c1 t
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   263
  | Bc False \<Rightarrow> fold' c2 t
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   264
  | _ \<Rightarrow> IF bfold b t THEN fold' c1 t ELSE fold' c2 t)" |
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   265
"fold' (WHILE b DO c) t = (case bfold b t of
45200
1f1897ac7877 renamed B to Bc
nipkow
parents: 45134
diff changeset
   266
    Bc False \<Rightarrow> SKIP
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   267
  | _ \<Rightarrow> WHILE bfold b (t |` (-lvars c)) DO fold' c (t |` (-lvars c)))"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   268
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   269
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   270
lemma bdefs_restrict:
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   271
  "bdefs c t |` (- lvars c) = t |` (- lvars c)"
45015
fdac1e9880eb Updated IMP to use new induction method
nipkow
parents: 44890
diff changeset
   272
proof (induction c arbitrary: t)
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   273
  case (Seq c1 c2)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   274
  hence "bdefs c1 t |` (- lvars c1) = t |` (- lvars c1)"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   275
    by simp
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   276
  hence "bdefs c1 t |` (- lvars c1) |` (-lvars c2) =
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   277
         t |` (- lvars c1) |` (-lvars c2)" by simp
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   278
  moreover
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   279
  from Seq
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   280
  have "bdefs c2 (bdefs c1 t) |` (- lvars c2) =
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   281
        bdefs c1 t |` (- lvars c2)"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   282
    by simp
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   283
  hence "bdefs c2 (bdefs c1 t) |` (- lvars c2) |` (- lvars c1) =
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   284
         bdefs c1 t |` (- lvars c2) |` (- lvars c1)"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   285
    by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   286
  ultimately
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   287
  show ?case by (clarsimp simp: Int_commute)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   288
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   289
  case (If b c1 c2)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   290
  hence "bdefs c1 t |` (- lvars c1) = t |` (- lvars c1)" by simp
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   291
  hence "bdefs c1 t |` (- lvars c1) |` (-lvars c2) =
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   292
         t |` (- lvars c1) |` (-lvars c2)" by simp
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   293
  moreover
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   294
  from If
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   295
  have "bdefs c2 t |` (- lvars c2) = t |` (- lvars c2)" by simp
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   296
  hence "bdefs c2 t |` (- lvars c2) |` (-lvars c1) =
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   297
         t |` (- lvars c2) |` (-lvars c1)" by simp
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   298
  ultimately
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   299
  show ?case
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   300
    by (auto simp: Int_commute intro: merge_restrict
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   301
             split: bexp.splits bool.splits)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   302
qed (auto split: aexp.split bexp.split bool.split)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   303
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   304
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   305
lemma big_step_pres_approx_b:
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   306
  "(c,s) \<Rightarrow> s' \<Longrightarrow> approx t s \<Longrightarrow> approx (bdefs c t) s'"
45015
fdac1e9880eb Updated IMP to use new induction method
nipkow
parents: 44890
diff changeset
   307
proof (induction arbitrary: t rule: big_step_induct)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   308
  case Skip thus ?case by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   309
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   310
  case Assign
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   311
  thus ?case
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   312
    by (clarsimp simp: aval_afold_N approx_def split: aexp.split)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   313
next
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   314
  case (Seq c1 s1 s2 c2 s3)
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   315
  have "approx (bdefs c1 t) s2" by (rule Seq.IH(1)[OF Seq.prems])
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   316
  hence "approx (bdefs c2 (bdefs c1 t)) s3" by (rule Seq.IH(2))
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   317
  thus ?case by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   318
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   319
  case (IfTrue b s c1 s')
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   320
  hence "approx (bdefs c1 t) s'" by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   321
  thus ?case using `bval b s` `approx t s`
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   322
    by (clarsimp simp: approx_merge bval_bfold_Bc
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   323
                 split: bexp.splits bool.splits)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   324
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   325
  case (IfFalse b s c2 s')
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   326
  hence "approx (bdefs c2 t) s'" by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   327
  thus ?case using `\<not>bval b s` `approx t s`
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   328
    by (clarsimp simp: approx_merge bval_bfold_Bc
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   329
                 split: bexp.splits bool.splits)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   330
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   331
  case WhileFalse
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   332
  thus ?case
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   333
    by (clarsimp simp: bval_bfold_Bc approx_def restrict_map_def
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   334
                 split: bexp.splits bool.splits)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   335
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   336
  case (WhileTrue b s1 c s2 s3)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   337
  hence "approx (bdefs c t) s2" by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   338
  with WhileTrue
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   339
  have "approx (bdefs c t |` (- lvars c)) s3"
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   340
    by simp
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   341
  thus ?case
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   342
    by (simp add: bdefs_restrict)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   343
qed
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   344
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   345
lemma fold'_equiv:
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   346
  "approx t \<Turnstile> c \<sim> fold' c t"
45015
fdac1e9880eb Updated IMP to use new induction method
nipkow
parents: 44890
diff changeset
   347
proof (induction c arbitrary: t)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   348
  case SKIP show ?case by simp
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   349
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   350
  case Assign
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   351
  thus ?case by (simp add: equiv_up_to_def)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   352
next
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 45212
diff changeset
   353
  case Seq
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   354
  thus ?case by (auto intro!: equiv_up_to_seq big_step_pres_approx_b)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   355
next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   356
  case (If b c1 c2)
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   357
  hence "approx t \<Turnstile> IF b THEN c1 ELSE c2 \<sim>
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   358
                   IF bfold b t THEN fold' c1 t ELSE fold' c2 t"
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   359
    by (auto intro: equiv_up_to_if_weak simp: bequiv_up_to_def)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   360
  thus ?case using If
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   361
    by (fastforce simp: bval_bfold_Bc split: bexp.splits bool.splits
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   362
                 intro: equiv_up_to_trans)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   363
  next
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   364
  case (While b c)
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   365
  hence "approx (t |` (- lvars c)) \<Turnstile>
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   366
                   WHILE b DO c \<sim>
52072
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   367
                   WHILE bfold b (t |` (- lvars c))
c25764d7246e defined lvars and rvars of commands separately.
nipkow
parents: 52046
diff changeset
   368
                      DO fold' c (t |` (- lvars c))" (is "_ \<Turnstile> ?W \<sim> ?W'")
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   369
    by (auto intro: equiv_up_to_while_weak big_step_pres_approx_restrict
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   370
             simp: bequiv_up_to_def)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   371
  hence "approx t \<Turnstile> ?W \<sim> ?W'"
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   372
    by (auto intro: equiv_up_to_weaken approx_map_le)
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   373
  thus ?case
48909
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   374
    by (auto split: bexp.splits bool.splits
b2dea007e55e remove Hoare dependency from Fold.thy
Gerwin Klein <gerwin.klein@nicta.com.au>
parents: 47818
diff changeset
   375
             intro: equiv_up_to_while_False
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   376
             simp: bval_bfold_Bc)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   377
qed
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   378
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   379
51514
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   380
theorem constant_folding_equiv':
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   381
  "fold' c empty \<sim> c"
9bed72e55475 simp_const -> afold; bfold -> fold'; bsimp_const -> bfold
kleing
parents: 51506
diff changeset
   382
  using fold'_equiv [of empty c]
52825
71fef62c4213 removed duplicate lemma
kleing
parents: 52072
diff changeset
   383
  by (simp add: equiv_up_to_True sim_sym)
44070
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   384
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   385
cebb7abb54b1 import constant folding theory into IMP
kleing
parents:
diff changeset
   386
end