src/HOL/Isar_Examples/Expr_Compiler.thy
author wenzelm
Tue, 02 Aug 2016 18:46:24 +0200
changeset 63585 f4a308fdf664
parent 61932 2e48182cc82c
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33026
8f35633c4922 modernized session Isar_Examples;
wenzelm
parents: 31758
diff changeset
     1
(*  Title:      HOL/Isar_Examples/Expr_Compiler.thy
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
     2
    Author:     Makarius
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     3
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     4
Correctness of a simple expression/stack-machine compiler.
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     5
*)
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     6
58882
6e2010ab8bd9 modernized header;
wenzelm
parents: 58614
diff changeset
     7
section \<open>Correctness of a simple expression compiler\<close>
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
     8
31758
3edd5f813f01 observe standard theory naming conventions;
wenzelm
parents: 23373
diff changeset
     9
theory Expr_Compiler
63585
wenzelm
parents: 61932
diff changeset
    10
  imports Main
31758
3edd5f813f01 observe standard theory naming conventions;
wenzelm
parents: 23373
diff changeset
    11
begin
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    12
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    13
text \<open>
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    14
  This is a (rather trivial) example of program verification. We model a
61541
846c72206207 tuned document;
wenzelm
parents: 58882
diff changeset
    15
  compiler for translating expressions to stack machine instructions, and
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    16
  prove its correctness wrt.\ some evaluation semantics.
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    17
\<close>
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    18
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    19
58614
7338eb25226c more cartouches;
wenzelm
parents: 58310
diff changeset
    20
subsection \<open>Binary operations\<close>
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    21
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    22
text \<open>
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    23
  Binary operations are just functions over some type of values. This is both
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    24
  for abstract syntax and semantics, i.e.\ we use a ``shallow embedding''
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    25
  here.
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    26
\<close>
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    27
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
    28
type_synonym 'val binop = "'val \<Rightarrow> 'val \<Rightarrow> 'val"
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    29
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    30
58614
7338eb25226c more cartouches;
wenzelm
parents: 58310
diff changeset
    31
subsection \<open>Expressions\<close>
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    32
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    33
text \<open>
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    34
  The language of expressions is defined as an inductive type, consisting of
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    35
  variables, constants, and binary operations on expressions.
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    36
\<close>
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    37
58310
91ea607a34d8 updated news
blanchet
parents: 58260
diff changeset
    38
datatype (dead 'adr, dead 'val) expr =
37671
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 35416
diff changeset
    39
    Variable 'adr
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 35416
diff changeset
    40
  | Constant 'val
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 35416
diff changeset
    41
  | Binop "'val binop" "('adr, 'val) expr" "('adr, 'val) expr"
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    42
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    43
text \<open>
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    44
  Evaluation (wrt.\ some environment of variable assignments) is defined by
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    45
  primitive recursion over the structure of expressions.
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    46
\<close>
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    47
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
    48
primrec eval :: "('adr, 'val) expr \<Rightarrow> ('adr \<Rightarrow> 'val) \<Rightarrow> 'val"
63585
wenzelm
parents: 61932
diff changeset
    49
  where
wenzelm
parents: 61932
diff changeset
    50
    "eval (Variable x) env = env x"
wenzelm
parents: 61932
diff changeset
    51
  | "eval (Constant c) env = c"
wenzelm
parents: 61932
diff changeset
    52
  | "eval (Binop f e1 e2) env = f (eval e1 env) (eval e2 env)"
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    53
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    54
58614
7338eb25226c more cartouches;
wenzelm
parents: 58310
diff changeset
    55
subsection \<open>Machine\<close>
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    56
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    57
text \<open>
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    58
  Next we model a simple stack machine, with three instructions.
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    59
\<close>
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    60
58310
91ea607a34d8 updated news
blanchet
parents: 58260
diff changeset
    61
datatype (dead 'adr, dead 'val) instr =
37671
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 35416
diff changeset
    62
    Const 'val
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 35416
diff changeset
    63
  | Load 'adr
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 35416
diff changeset
    64
  | Apply "'val binop"
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    65
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    66
text \<open>
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    67
  Execution of a list of stack machine instructions is easily defined as
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    68
  follows.
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    69
\<close>
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    70
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
    71
primrec exec :: "(('adr, 'val) instr) list \<Rightarrow> 'val list \<Rightarrow> ('adr \<Rightarrow> 'val) \<Rightarrow> 'val list"
63585
wenzelm
parents: 61932
diff changeset
    72
  where
wenzelm
parents: 61932
diff changeset
    73
    "exec [] stack env = stack"
wenzelm
parents: 61932
diff changeset
    74
  | "exec (instr # instrs) stack env =
wenzelm
parents: 61932
diff changeset
    75
      (case instr of
wenzelm
parents: 61932
diff changeset
    76
        Const c \<Rightarrow> exec instrs (c # stack) env
wenzelm
parents: 61932
diff changeset
    77
      | Load x \<Rightarrow> exec instrs (env x # stack) env
wenzelm
parents: 61932
diff changeset
    78
      | Apply f \<Rightarrow> exec instrs (f (hd stack) (hd (tl stack)) # (tl (tl stack))) env)"
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    79
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
    80
definition execute :: "(('adr, 'val) instr) list \<Rightarrow> ('adr \<Rightarrow> 'val) \<Rightarrow> 'val"
37671
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 35416
diff changeset
    81
  where "execute instrs env = hd (exec instrs [] env)"
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    82
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    83
58614
7338eb25226c more cartouches;
wenzelm
parents: 58310
diff changeset
    84
subsection \<open>Compiler\<close>
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    85
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    86
text \<open>
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    87
  We are ready to define the compilation function of expressions to lists of
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    88
  stack machine instructions.
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    89
\<close>
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    90
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
    91
primrec compile :: "('adr, 'val) expr \<Rightarrow> (('adr, 'val) instr) list"
63585
wenzelm
parents: 61932
diff changeset
    92
  where
wenzelm
parents: 61932
diff changeset
    93
    "compile (Variable x) = [Load x]"
wenzelm
parents: 61932
diff changeset
    94
  | "compile (Constant c) = [Const c]"
wenzelm
parents: 61932
diff changeset
    95
  | "compile (Binop f e1 e2) = compile e2 @ compile e1 @ [Apply f]"
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    96
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    97
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    98
text \<open>
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
    99
  The main result of this development is the correctness theorem for
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
   100
  \<open>compile\<close>. We first establish a lemma about \<open>exec\<close> and list append.
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
   101
\<close>
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   102
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   103
lemma exec_append:
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   104
  "exec (xs @ ys) stack env =
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   105
    exec ys (exec xs stack env) env"
20503
503ac4c5ef91 induct method: renamed 'fixing' to 'arbitrary';
wenzelm
parents: 18193
diff changeset
   106
proof (induct xs arbitrary: stack)
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   107
  case Nil
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   108
  show ?case by simp
11809
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10007
diff changeset
   109
next
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   110
  case (Cons x xs)
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   111
  show ?case
11809
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10007
diff changeset
   112
  proof (induct x)
23373
ead82c82da9e tuned proofs: avoid implicit prems;
wenzelm
parents: 20523
diff changeset
   113
    case Const
ead82c82da9e tuned proofs: avoid implicit prems;
wenzelm
parents: 20523
diff changeset
   114
    from Cons show ?case by simp
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   115
  next
23373
ead82c82da9e tuned proofs: avoid implicit prems;
wenzelm
parents: 20523
diff changeset
   116
    case Load
ead82c82da9e tuned proofs: avoid implicit prems;
wenzelm
parents: 20523
diff changeset
   117
    from Cons show ?case by simp
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   118
  next
23373
ead82c82da9e tuned proofs: avoid implicit prems;
wenzelm
parents: 20523
diff changeset
   119
    case Apply
ead82c82da9e tuned proofs: avoid implicit prems;
wenzelm
parents: 20523
diff changeset
   120
    from Cons show ?case by simp
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   121
  qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   122
qed
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   123
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   124
theorem correctness: "execute (compile e) env = eval e env"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   125
proof -
18193
54419506df9e tuned document;
wenzelm
parents: 18153
diff changeset
   126
  have "\<And>stack. exec (compile e) stack env = eval e env # stack"
11809
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10007
diff changeset
   127
  proof (induct e)
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   128
    case Variable
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   129
    show ?case by simp
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   130
  next
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   131
    case Constant
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   132
    show ?case by simp
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   133
  next
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   134
    case Binop
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   135
    then show ?case by (simp add: exec_append)
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   136
  qed
23373
ead82c82da9e tuned proofs: avoid implicit prems;
wenzelm
parents: 20523
diff changeset
   137
  then show ?thesis by (simp add: execute_def)
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   138
qed
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   139
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   140
61541
846c72206207 tuned document;
wenzelm
parents: 58882
diff changeset
   141
text \<open>
846c72206207 tuned document;
wenzelm
parents: 58882
diff changeset
   142
  \<^bigskip>
846c72206207 tuned document;
wenzelm
parents: 58882
diff changeset
   143
  In the proofs above, the \<open>simp\<close> method does quite a lot of work behind the
846c72206207 tuned document;
wenzelm
parents: 58882
diff changeset
   144
  scenes (mostly ``functional program execution''). Subsequently, the same
846c72206207 tuned document;
wenzelm
parents: 58882
diff changeset
   145
  reasoning is elaborated in detail --- at most one recursive function
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
   146
  definition is used at a time. Thus we get a better idea of what is actually
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61799
diff changeset
   147
  going on.
61541
846c72206207 tuned document;
wenzelm
parents: 58882
diff changeset
   148
\<close>
8051
wenzelm
parents: 8031
diff changeset
   149
13524
604d0f3622d6 *** empty log message ***
wenzelm
parents: 11809
diff changeset
   150
lemma exec_append':
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   151
  "exec (xs @ ys) stack env = exec ys (exec xs stack env) env"
20503
503ac4c5ef91 induct method: renamed 'fixing' to 'arbitrary';
wenzelm
parents: 18193
diff changeset
   152
proof (induct xs arbitrary: stack)
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   153
  case (Nil s)
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   154
  have "exec ([] @ ys) s env = exec ys s env"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   155
    by simp
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   156
  also have "\<dots> = exec ys (exec [] s env) env"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   157
    by simp
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   158
  finally show ?case .
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   159
next
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   160
  case (Cons x xs s)
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   161
  show ?case
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   162
  proof (induct x)
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   163
    case (Const val)
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   164
    have "exec ((Const val # xs) @ ys) s env = exec (Const val # xs @ ys) s env"
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   165
      by simp
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   166
    also have "\<dots> = exec (xs @ ys) (val # s) env"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   167
      by simp
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   168
    also from Cons have "\<dots> = exec ys (exec xs (val # s) env) env" .
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   169
    also have "\<dots> = exec ys (exec (Const val # xs) s env) env"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   170
      by simp
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   171
    finally show ?case .
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   172
  next
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   173
    case (Load adr)
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   174
    from Cons show ?case
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61541
diff changeset
   175
      by simp \<comment> \<open>same as above\<close>
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   176
  next
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20503
diff changeset
   177
    case (Apply fn)
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20503
diff changeset
   178
    have "exec ((Apply fn # xs) @ ys) s env =
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20503
diff changeset
   179
        exec (Apply fn # xs @ ys) s env" by simp
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   180
    also have "\<dots> =
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   181
        exec (xs @ ys) (fn (hd s) (hd (tl s)) # (tl (tl s))) env"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   182
      by simp
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   183
    also from Cons have "\<dots> =
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20503
diff changeset
   184
        exec ys (exec xs (fn (hd s) (hd (tl s)) # tl (tl s)) env) env" .
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   185
    also have "\<dots> = exec ys (exec (Apply fn # xs) s env) env"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   186
      by simp
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   187
    finally show ?case .
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   188
  qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   189
qed
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   190
13537
f506eb568121 avoid duplicate fact bindings;
wenzelm
parents: 13524
diff changeset
   191
theorem correctness': "execute (compile e) env = eval e env"
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   192
proof -
18193
54419506df9e tuned document;
wenzelm
parents: 18153
diff changeset
   193
  have exec_compile: "\<And>stack. exec (compile e) stack env = eval e env # stack"
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   194
  proof (induct e)
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   195
    case (Variable adr s)
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   196
    have "exec (compile (Variable adr)) s env = exec [Load adr] s env"
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   197
      by simp
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   198
    also have "\<dots> = env adr # s"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   199
      by simp
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   200
    also have "env adr = eval (Variable adr) env"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   201
      by simp
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   202
    finally show ?case .
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   203
  next
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   204
    case (Constant val s)
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61541
diff changeset
   205
    show ?case by simp \<comment> \<open>same as above\<close>
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   206
  next
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20503
diff changeset
   207
    case (Binop fn e1 e2 s)
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20503
diff changeset
   208
    have "exec (compile (Binop fn e1 e2)) s env =
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   209
        exec (compile e2 @ compile e1 @ [Apply fn]) s env"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   210
      by simp
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   211
    also have "\<dots> = exec [Apply fn]
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   212
        (exec (compile e1) (exec (compile e2) s env) env) env"
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   213
      by (simp only: exec_append)
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   214
    also have "exec (compile e2) s env = eval e2 env # s"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   215
      by fact
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   216
    also have "exec (compile e1) \<dots> env = eval e1 env # \<dots>"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   217
      by fact
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   218
    also have "exec [Apply fn] \<dots> env =
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   219
        fn (hd \<dots>) (hd (tl \<dots>)) # (tl (tl \<dots>))"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   220
      by simp
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   221
    also have "\<dots> = fn (eval e1 env) (eval e2 env) # s"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   222
      by simp
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20503
diff changeset
   223
    also have "fn (eval e1 env) (eval e2 env) =
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20503
diff changeset
   224
        eval (Binop fn e1 e2) env"
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   225
      by simp
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
   226
    finally show ?case .
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   227
  qed
8051
wenzelm
parents: 8031
diff changeset
   228
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   229
  have "execute (compile e) env = hd (exec (compile e) [] env)"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   230
    by (simp add: execute_def)
37671
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 35416
diff changeset
   231
  also from exec_compile have "exec (compile e) [] env = [eval e env]" .
55640
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   232
  also have "hd \<dots> = eval e env"
abc140f21caa tuned proofs;
wenzelm
parents: 46582
diff changeset
   233
    by simp
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   234
  finally show ?thesis .
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   235
qed
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   236
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
   237
end