src/HOL/Isar_examples/ExprCompiler.thy
author wenzelm
Fri, 08 Oct 1999 15:09:14 +0200
changeset 7800 8ee919e42174
parent 7761 7fab9592384f
child 7869 c007f801cd59
permissions -rw-r--r--
improved presentation;
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
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
    12
subsection {* Basics *};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    13
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    14
text {*
6792
c68035d06cce tuned comments;
wenzelm
parents: 6746
diff changeset
    15
 First we define a type abbreviation for binary operations over some
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
    16
 type of values.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    17
*};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    18
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    19
types
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    20
  'val binop = "'val => 'val => 'val";
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    21
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    22
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
    23
subsection {* Machine *};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    24
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    25
text {*
6792
c68035d06cce tuned comments;
wenzelm
parents: 6746
diff changeset
    26
 Next we model a simple stack machine, with three instructions.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    27
*};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    28
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    29
datatype ('adr, 'val) instr =
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    30
  Const 'val |
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    31
  Load 'adr |
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    32
  Apply "'val binop";
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    33
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    34
text {*
6792
c68035d06cce tuned comments;
wenzelm
parents: 6746
diff changeset
    35
 Execution of a list of stack machine instructions is
c68035d06cce tuned comments;
wenzelm
parents: 6746
diff changeset
    36
 straight-forward.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    37
*};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    38
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    39
consts
7761
7fab9592384f improved presentation;
wenzelm
parents: 7748
diff changeset
    40
  exec :: "(('adr, 'val) instr) list
7fab9592384f improved presentation;
wenzelm
parents: 7748
diff changeset
    41
    => 'val list => ('adr => 'val) => 'val list";
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    42
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    43
primrec
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    44
  "exec [] stack env = stack"
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    45
  "exec (instr # instrs) stack env =
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    46
    (case instr of
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    47
      Const c => exec instrs (c # stack) env
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    48
    | Load x => exec instrs (env x # stack) env
7761
7fab9592384f improved presentation;
wenzelm
parents: 7748
diff changeset
    49
    | Apply f => exec instrs (f (hd stack) (hd (tl stack))
7fab9592384f improved presentation;
wenzelm
parents: 7748
diff changeset
    50
                   # (tl (tl stack))) env)";
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    51
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    52
constdefs
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    53
  execute :: "(('adr, 'val) instr) list => ('adr => 'val) => 'val"
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    54
  "execute instrs env == hd (exec instrs [] env)";
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    55
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    56
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
    57
subsection {* Expressions *};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    58
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    59
text {*
7761
7fab9592384f improved presentation;
wenzelm
parents: 7748
diff changeset
    60
 We introduce a simple language of expressions: variables, constants,
7fab9592384f improved presentation;
wenzelm
parents: 7748
diff changeset
    61
 binary operations.
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) expr =
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    65
  Variable 'adr |
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    66
  Constant 'val |
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    67
  Binop "'val binop" "('adr, 'val) expr" "('adr, 'val) expr";
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 {*
6792
c68035d06cce tuned comments;
wenzelm
parents: 6746
diff changeset
    70
 Evaluation of expressions does not do any unexpected things.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    71
*};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    72
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    73
consts
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    74
  eval :: "('adr, 'val) expr => ('adr => 'val) => 'val";
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    75
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    76
primrec
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    77
  "eval (Variable x) env = env x"
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    78
  "eval (Constant c) env = c"
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    79
  "eval (Binop f e1 e2) env = f (eval e1 env) (eval e2 env)";
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    80
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    81
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
    82
subsection {* Compiler *};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    83
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    84
text {*
6792
c68035d06cce tuned comments;
wenzelm
parents: 6746
diff changeset
    85
 So we are ready to define the compilation function of expressions to
c68035d06cce tuned comments;
wenzelm
parents: 6746
diff changeset
    86
 lists of stack machine instructions.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    87
*};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    88
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    89
consts
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    90
  comp :: "('adr, 'val) expr => (('adr, 'val) instr) list";
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    91
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    92
primrec
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    93
  "comp (Variable x) = [Load x]"
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    94
  "comp (Constant c) = [Const c]"
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
    95
  "comp (Binop f e1 e2) = comp e2 @ comp e1 @ [Apply f]";
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
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
    98
text {*
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
    99
  The main result of this development is the correctness theorem for
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
   100
  $\idt{comp}$.  We first establish some lemmas about $\idt{exec}$.
6744
9727e83f0578 changed {| |} verbatim syntax to {* *};
wenzelm
parents: 6517
diff changeset
   101
*};
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:
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
   104
  "ALL stack. exec (xs @ ys) stack env =
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
   105
    exec ys (exec xs stack env) env" (is "?P xs");
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7253
diff changeset
   106
proof (induct ?P xs type: list);
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7253
diff changeset
   107
  show "?P []"; by simp;
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   108
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   109
  fix x xs;
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7253
diff changeset
   110
  assume "?P xs";
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7253
diff changeset
   111
  show "?P (x # xs)" (is "?Q x");
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7253
diff changeset
   112
  proof (induct ?Q x type: instr);
7565
bfa85f429629 accomodate refined facts handling;
wenzelm
parents: 7480
diff changeset
   113
    fix val; show "?Q (Const val)"; by (simp!);
6938
914233d95b23 tuned indentation;
wenzelm
parents: 6792
diff changeset
   114
  next;
7565
bfa85f429629 accomodate refined facts handling;
wenzelm
parents: 7480
diff changeset
   115
    fix adr; show "?Q (Load adr)"; by (simp!);
6938
914233d95b23 tuned indentation;
wenzelm
parents: 6792
diff changeset
   116
  next;
7565
bfa85f429629 accomodate refined facts handling;
wenzelm
parents: 7480
diff changeset
   117
    fix fun; show "?Q (Apply fun)"; by (simp!);
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   118
  qed;
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   119
qed;
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   120
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   121
lemma exec_comp:
7748
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
   122
  "ALL stack. exec (comp e) stack env =
5b9c45b21782 improved presentation;
wenzelm
parents: 7740
diff changeset
   123
    eval e env # stack" (is "?P e");
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7253
diff changeset
   124
proof (induct ?P e type: expr);
7565
bfa85f429629 accomodate refined facts handling;
wenzelm
parents: 7480
diff changeset
   125
  fix adr; show "?P (Variable adr)"; by (simp!);
6938
914233d95b23 tuned indentation;
wenzelm
parents: 6792
diff changeset
   126
next;
7565
bfa85f429629 accomodate refined facts handling;
wenzelm
parents: 7480
diff changeset
   127
  fix val; show "?P (Constant val)"; by (simp!);
6938
914233d95b23 tuned indentation;
wenzelm
parents: 6792
diff changeset
   128
next;
7480
0a0e0dbe1269 replaced ?? by ?;
wenzelm
parents: 7253
diff changeset
   129
  fix fun e1 e2; assume "?P e1" "?P e2"; show "?P (Binop fun e1 e2)";
7565
bfa85f429629 accomodate refined facts handling;
wenzelm
parents: 7480
diff changeset
   130
    by (simp! add: exec_append);
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   131
qed;
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   132
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   133
6746
cf6ad8d22793 tuned formal comments;
wenzelm
parents: 6744
diff changeset
   134
text {* Main theorem ahead. *};
6444
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   135
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   136
theorem correctness: "execute (comp e) env = eval e env";
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   137
  by (simp add: execute_def exec_comp);
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   138
2ebe9e630cab Miscellaneous Isabelle/Isar examples for Higher-Order Logic.
wenzelm
parents:
diff changeset
   139
end;