src/HOL/Isar_examples/ExprCompiler.thy
author wenzelm
Sat, 19 Aug 2000 12:44:39 +0200
changeset 9659 b9cf6801f3da
parent 8304 e132d147374b
child 10007 64bf7da1994a
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Isar_examples/ExprCompiler.thy
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     4
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     5
Correctness of a simple expression/stack-machine compiler.
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     6
*)
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
     7
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
     8
header {* Correctness of a simple expression compiler *};
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
     9
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    10
theory ExprCompiler = Main:;
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    11
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    12
text {*
7874
180364256231 improved presentation;
wenzelm
parents: 7869
diff changeset
    13
 This is a (rather trivial) example of program verification.  We model
180364256231 improved presentation;
wenzelm
parents: 7869
diff changeset
    14
 a compiler for translating expressions to stack machine instructions,
180364256231 improved presentation;
wenzelm
parents: 7869
diff changeset
    15
 and prove its correctness wrt.\ some evaluation semantics.
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    16
*};
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    17
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    18
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    19
subsection {* Binary operations *};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    20
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    21
text {*
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    22
 Binary operations are just functions over some type of values.  This
7982
d534b897ce39 improved presentation;
wenzelm
parents: 7874
diff changeset
    23
 is both for abstract syntax and semantics, i.e.\ we use a ``shallow
7874
180364256231 improved presentation;
wenzelm
parents: 7869
diff changeset
    24
 embedding'' here.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    25
*};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    26
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    27
types
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    28
  'val binop = "'val => 'val => 'val";
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
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    31
subsection {* Expressions *};
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    32
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    33
text {*
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    34
 The language of expressions is defined as an inductive type,
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    35
 consisting of variables, constants, and binary operations on
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    36
 expressions.
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    37
*};
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    38
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    39
datatype ('adr, 'val) expr =
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    40
  Variable 'adr |
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    41
  Constant 'val |
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    42
  Binop "'val binop" "('adr, 'val) expr" "('adr, 'val) expr";
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    43
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    44
text {*
7874
180364256231 improved presentation;
wenzelm
parents: 7869
diff changeset
    45
 Evaluation (wrt.\ some environment of variable assignments) is
180364256231 improved presentation;
wenzelm
parents: 7869
diff changeset
    46
 defined by primitive recursion over the structure of expressions.
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    47
*};
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    48
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    49
consts
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    50
  eval :: "('adr, 'val) expr => ('adr => 'val) => 'val";
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    51
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    52
primrec
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    53
  "eval (Variable x) env = env x"
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    54
  "eval (Constant c) env = c"
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    55
  "eval (Binop f e1 e2) env = f (eval e1 env) (eval e2 env)";
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    56
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    57
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
    58
subsection {* Machine *};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    59
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    60
text {*
6792
c68035d06cce tuned comments;
wenzelm
parents: 6746
diff changeset
    61
 Next we model a simple stack machine, with three instructions.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    62
*};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    63
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    64
datatype ('adr, 'val) instr =
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    65
  Const 'val |
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    66
  Load 'adr |
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    67
  Apply "'val binop";
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    68
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    69
text {*
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    70
 Execution of a list of stack machine instructions is easily defined
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    71
 as follows.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    72
*};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    73
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    74
consts
7761
7fab9592384f improved presentation;
wenzelm
parents: 7748
diff changeset
    75
  exec :: "(('adr, 'val) instr) list
7fab9592384f improved presentation;
wenzelm
parents: 7748
diff changeset
    76
    => 'val list => ('adr => 'val) => 'val list";
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    77
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    78
primrec
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    79
  "exec [] stack env = stack"
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    80
  "exec (instr # instrs) stack env =
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    81
    (case instr of
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    82
      Const c => exec instrs (c # stack) env
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    83
    | Load x => exec instrs (env x # stack) env
7761
7fab9592384f improved presentation;
wenzelm
parents: 7748
diff changeset
    84
    | Apply f => exec instrs (f (hd stack) (hd (tl stack))
7fab9592384f improved presentation;
wenzelm
parents: 7748
diff changeset
    85
                   # (tl (tl stack))) env)";
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    86
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    87
constdefs
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    88
  execute :: "(('adr, 'val) instr) list => ('adr => 'val) => 'val"
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    89
  "execute instrs env == hd (exec instrs [] env)";
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    90
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    91
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
    92
subsection {* Compiler *};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    93
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    94
text {*
7869
c007f801cd59 improved presentation;
wenzelm
parents: 7761
diff changeset
    95
 We are ready to define the compilation function of expressions to
6792
c68035d06cce tuned comments;
wenzelm
parents: 6746
diff changeset
    96
 lists of stack machine instructions.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    97
*};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    98
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    99
consts
8031
826c6222cca2 renamed comp to compile (avoids clash with Relation.comp);
wenzelm
parents: 7982
diff changeset
   100
  compile :: "('adr, 'val) expr => (('adr, 'val) instr) list";
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   101
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   102
primrec
8031
826c6222cca2 renamed comp to compile (avoids clash with Relation.comp);
wenzelm
parents: 7982
diff changeset
   103
  "compile (Variable x) = [Load x]"
826c6222cca2 renamed comp to compile (avoids clash with Relation.comp);
wenzelm
parents: 7982
diff changeset
   104
  "compile (Constant c) = [Const c]"
826c6222cca2 renamed comp to compile (avoids clash with Relation.comp);
wenzelm
parents: 7982
diff changeset
   105
  "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
   106
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   107
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
   108
text {*
8051
wenzelm
parents: 8031
diff changeset
   109
 The main result of this development is the correctness theorem for
wenzelm
parents: 8031
diff changeset
   110
 $\idt{compile}$.  We first establish a lemma about $\idt{exec}$ and
wenzelm
parents: 8031
diff changeset
   111
 list append.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
   112
*};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   113
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   114
lemma exec_append:
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
   115
  "ALL stack. exec (xs @ ys) stack env =
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
   116
    exec ys (exec xs stack env) env" (is "?P xs");
8304
e132d147374b even better induct setup;
wenzelm
parents: 8281
diff changeset
   117
proof (induct ?P xs type: list);
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7253
diff changeset
   118
  show "?P []"; by simp;
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   119
8051
wenzelm
parents: 8031
diff changeset
   120
  fix x xs; assume "?P xs";
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7253
diff changeset
   121
  show "?P (x # xs)" (is "?Q x");
8304
e132d147374b even better induct setup;
wenzelm
parents: 8281
diff changeset
   122
  proof (induct ?Q x type: instr);
8052
wenzelm
parents: 8051
diff changeset
   123
    show "!!val. ?Q (Const val)"; by (simp!);
wenzelm
parents: 8051
diff changeset
   124
    show "!!adr. ?Q (Load adr)"; by (simp!);
wenzelm
parents: 8051
diff changeset
   125
    show "!!fun. ?Q (Apply fun)"; by (simp!);
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   126
  qed;
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   127
qed;
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   128
8051
wenzelm
parents: 8031
diff changeset
   129
theorem correctness: "execute (compile e) env = eval e env";
wenzelm
parents: 8031
diff changeset
   130
proof -;
wenzelm
parents: 8031
diff changeset
   131
  have "ALL stack. exec (compile e) stack env =
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
   132
    eval e env # stack" (is "?P e");
8304
e132d147374b even better induct setup;
wenzelm
parents: 8281
diff changeset
   133
  proof (induct ?P e type: expr);
8052
wenzelm
parents: 8051
diff changeset
   134
    show "!!adr. ?P (Variable adr)"; by simp;
wenzelm
parents: 8051
diff changeset
   135
    show "!!val. ?P (Constant val)"; by simp;
wenzelm
parents: 8051
diff changeset
   136
    show "!!fun e1 e2. (?P e1 ==> ?P e2 ==> ?P (Binop fun e1 e2))";
wenzelm
parents: 8051
diff changeset
   137
      by (simp add: exec_append);
8051
wenzelm
parents: 8031
diff changeset
   138
  qed;
wenzelm
parents: 8031
diff changeset
   139
  thus ?thesis; by (simp add: execute_def);
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   140
qed;
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   141
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   142
8051
wenzelm
parents: 8031
diff changeset
   143
text {*
wenzelm
parents: 8031
diff changeset
   144
 \bigskip In the proofs above, the \name{simp} method does quite a lot
wenzelm
parents: 8031
diff changeset
   145
 of work behind the scenes (mostly ``functional program execution'').
wenzelm
parents: 8031
diff changeset
   146
 Subsequently, the same reasoning is elaborated in detail --- at most
wenzelm
parents: 8031
diff changeset
   147
 one recursive function definition is used at a time.  Thus we get a
wenzelm
parents: 8031
diff changeset
   148
 better idea of what is actually going on.
wenzelm
parents: 8031
diff changeset
   149
*};
wenzelm
parents: 8031
diff changeset
   150
wenzelm
parents: 8031
diff changeset
   151
lemma exec_append:
8052
wenzelm
parents: 8051
diff changeset
   152
  "ALL stack. exec (xs @ ys) stack env
8051
wenzelm
parents: 8031
diff changeset
   153
    = exec ys (exec xs stack env) env" (is "?P xs");
wenzelm
parents: 8031
diff changeset
   154
proof (induct ?P xs);
wenzelm
parents: 8031
diff changeset
   155
  show "?P []" (is "ALL s. ?Q s");
wenzelm
parents: 8031
diff changeset
   156
  proof;
wenzelm
parents: 8031
diff changeset
   157
    fix s; have "exec ([] @ ys) s env = exec ys s env"; by simp;
wenzelm
parents: 8031
diff changeset
   158
    also; have "... = exec ys (exec [] s env) env"; by simp;
wenzelm
parents: 8031
diff changeset
   159
    finally; show "?Q s"; .;
wenzelm
parents: 8031
diff changeset
   160
  qed;
wenzelm
parents: 8031
diff changeset
   161
  fix x xs; assume hyp: "?P xs";
wenzelm
parents: 8031
diff changeset
   162
  show "?P (x # xs)";
wenzelm
parents: 8031
diff changeset
   163
  proof (induct x);
8052
wenzelm
parents: 8051
diff changeset
   164
    fix val;
8051
wenzelm
parents: 8031
diff changeset
   165
    show "?P (Const val # xs)" (is "ALL s. ?Q s");
wenzelm
parents: 8031
diff changeset
   166
    proof;
wenzelm
parents: 8031
diff changeset
   167
      fix s;
8052
wenzelm
parents: 8051
diff changeset
   168
      have "exec ((Const val # xs) @ ys) s env =
wenzelm
parents: 8051
diff changeset
   169
          exec (Const val # xs @ ys) s env";
wenzelm
parents: 8051
diff changeset
   170
        by simp;
8051
wenzelm
parents: 8031
diff changeset
   171
      also; have "... = exec (xs @ ys) (val # s) env"; by simp;
9659
wenzelm
parents: 8304
diff changeset
   172
      also; from hyp;
wenzelm
parents: 8304
diff changeset
   173
        have "... = exec ys (exec xs (val # s) env) env"; ..;
8052
wenzelm
parents: 8051
diff changeset
   174
      also; have "... = exec ys (exec (Const val # xs) s env) env";
wenzelm
parents: 8051
diff changeset
   175
        by simp;
8051
wenzelm
parents: 8031
diff changeset
   176
      finally; show "?Q s"; .;
wenzelm
parents: 8031
diff changeset
   177
    qed;
wenzelm
parents: 8031
diff changeset
   178
  next;
wenzelm
parents: 8031
diff changeset
   179
    fix adr; from hyp; show "?P (Load adr # xs)"; by simp -- {* same as above *};
wenzelm
parents: 8031
diff changeset
   180
  next;
8052
wenzelm
parents: 8051
diff changeset
   181
    fix fun;
8051
wenzelm
parents: 8031
diff changeset
   182
    show "?P (Apply fun # xs)" (is "ALL s. ?Q s");
wenzelm
parents: 8031
diff changeset
   183
    proof;
wenzelm
parents: 8031
diff changeset
   184
      fix s;
8052
wenzelm
parents: 8051
diff changeset
   185
      have "exec ((Apply fun # xs) @ ys) s env =
wenzelm
parents: 8051
diff changeset
   186
          exec (Apply fun # xs @ ys) s env";
8051
wenzelm
parents: 8031
diff changeset
   187
        by simp;
8052
wenzelm
parents: 8051
diff changeset
   188
      also; have "... =
wenzelm
parents: 8051
diff changeset
   189
          exec (xs @ ys) (fun (hd s) (hd (tl s)) # (tl (tl s))) env";
wenzelm
parents: 8051
diff changeset
   190
        by simp;
wenzelm
parents: 8051
diff changeset
   191
      also; from hyp; have "... =
9659
wenzelm
parents: 8304
diff changeset
   192
        exec ys (exec xs (fun (hd s) (hd (tl s)) # tl (tl s)) env) env";
wenzelm
parents: 8304
diff changeset
   193
        ..;
8051
wenzelm
parents: 8031
diff changeset
   194
      also; have "... = exec ys (exec (Apply fun # xs) s env) env"; by simp;
wenzelm
parents: 8031
diff changeset
   195
      finally; show "?Q s"; .;
wenzelm
parents: 8031
diff changeset
   196
    qed;
wenzelm
parents: 8031
diff changeset
   197
  qed;
wenzelm
parents: 8031
diff changeset
   198
qed;
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   199
8031
826c6222cca2 renamed comp to compile (avoids clash with Relation.comp);
wenzelm
parents: 7982
diff changeset
   200
theorem correctness: "execute (compile e) env = eval e env";
8051
wenzelm
parents: 8031
diff changeset
   201
proof -;
8052
wenzelm
parents: 8051
diff changeset
   202
  have exec_compile:
9659
wenzelm
parents: 8304
diff changeset
   203
    "ALL stack. exec (compile e) stack env = eval e env # stack"
wenzelm
parents: 8304
diff changeset
   204
    (is "?P e");
8051
wenzelm
parents: 8031
diff changeset
   205
  proof (induct e);
wenzelm
parents: 8031
diff changeset
   206
    fix adr; show "?P (Variable adr)" (is "ALL s. ?Q s");
wenzelm
parents: 8031
diff changeset
   207
    proof;
wenzelm
parents: 8031
diff changeset
   208
      fix s;
8052
wenzelm
parents: 8051
diff changeset
   209
      have "exec (compile (Variable adr)) s env = exec [Load adr] s env";
wenzelm
parents: 8051
diff changeset
   210
        by simp;
8051
wenzelm
parents: 8031
diff changeset
   211
      also; have "... = env adr # s"; by simp;
wenzelm
parents: 8031
diff changeset
   212
      also; have "env adr = eval (Variable adr) env"; by simp;
wenzelm
parents: 8031
diff changeset
   213
      finally; show "?Q s"; .;
wenzelm
parents: 8031
diff changeset
   214
    qed;
wenzelm
parents: 8031
diff changeset
   215
  next;
wenzelm
parents: 8031
diff changeset
   216
    fix val; show "?P (Constant val)"; by simp -- {* same as above *};
wenzelm
parents: 8031
diff changeset
   217
  next;
wenzelm
parents: 8031
diff changeset
   218
    fix fun e1 e2; assume hyp1: "?P e1" and hyp2: "?P e2";
wenzelm
parents: 8031
diff changeset
   219
    show "?P (Binop fun e1 e2)" (is "ALL s. ?Q s");
wenzelm
parents: 8031
diff changeset
   220
    proof;
8052
wenzelm
parents: 8051
diff changeset
   221
      fix s; have "exec (compile (Binop fun e1 e2)) s env
8051
wenzelm
parents: 8031
diff changeset
   222
        = exec (compile e2 @ compile e1 @ [Apply fun]) s env"; by simp;
9659
wenzelm
parents: 8304
diff changeset
   223
      also; have "... = exec [Apply fun]
wenzelm
parents: 8304
diff changeset
   224
          (exec (compile e1) (exec (compile e2) s env) env) env";
8052
wenzelm
parents: 8051
diff changeset
   225
        by (simp only: exec_append);
9659
wenzelm
parents: 8304
diff changeset
   226
      also; from hyp2;
wenzelm
parents: 8304
diff changeset
   227
        have "exec (compile e2) s env = eval e2 env # s"; ..;
wenzelm
parents: 8304
diff changeset
   228
      also; from hyp1;
wenzelm
parents: 8304
diff changeset
   229
        have "exec (compile e1) ... env = eval e1 env # ..."; ..;
8052
wenzelm
parents: 8051
diff changeset
   230
      also; have "exec [Apply fun] ... env =
wenzelm
parents: 8051
diff changeset
   231
        fun (hd ...) (hd (tl ...)) # (tl (tl ...))"; by simp;
8051
wenzelm
parents: 8031
diff changeset
   232
      also; have "... = fun (eval e1 env) (eval e2 env) # s"; by simp;
9659
wenzelm
parents: 8304
diff changeset
   233
      also; have "fun (eval e1 env) (eval e2 env) =
wenzelm
parents: 8304
diff changeset
   234
          eval (Binop fun e1 e2) env";
8051
wenzelm
parents: 8031
diff changeset
   235
        by simp;
wenzelm
parents: 8031
diff changeset
   236
      finally; show "?Q s"; .;
wenzelm
parents: 8031
diff changeset
   237
    qed;
wenzelm
parents: 8031
diff changeset
   238
  qed;
wenzelm
parents: 8031
diff changeset
   239
8052
wenzelm
parents: 8051
diff changeset
   240
  have "execute (compile e) env = hd (exec (compile e) [] env)";
8051
wenzelm
parents: 8031
diff changeset
   241
    by (simp add: execute_def);
9659
wenzelm
parents: 8304
diff changeset
   242
  also; from exec_compile;
wenzelm
parents: 8304
diff changeset
   243
    have "exec (compile e) [] env = [eval e env]"; ..;
8051
wenzelm
parents: 8031
diff changeset
   244
  also; have "hd ... = eval e env"; by simp;
wenzelm
parents: 8031
diff changeset
   245
  finally; show ?thesis; .;
wenzelm
parents: 8031
diff changeset
   246
qed;
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   247
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   248
end;