src/Pure/Tools/nbe.ML
author haftmann
Thu, 06 Apr 2006 16:08:25 +0200
changeset 19341 3414c04fbc39
parent 19181 5c9f58562602
child 19795 746274ca400b
permissions -rw-r--r--
added definitional code generator module: codegen_theorems.ML
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
     1
(*  ID:         $Id$
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
     2
    Author:     Tobias Nipkow, Florian Haftmann, TU Muenchen
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
     3
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
     4
Toplevel theory interface for "normalization by evaluation"
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
     5
*)
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
     6
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
     7
signature NBE =
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
     8
sig
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
     9
  val norm_by_eval_i: term -> theory -> term * theory;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    10
  val lookup: string -> NBE_Eval.Univ;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    11
  val update: string * NBE_Eval.Univ -> unit;
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    12
end;
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    13
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    14
structure NBE: NBE =
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    15
struct
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    16
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    17
structure NBE_Data = TheoryDataFun
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    18
(struct
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    19
  val name = "Pure/NBE";
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    20
  type T = NBE_Eval.Univ Symtab.table;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    21
  val empty = Symtab.empty;
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    22
  val copy = I;
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    23
  val extend = I;
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    24
  fun merge _ = Symtab.merge (K true);
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    25
  fun print _ _ = ();
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    26
end);
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    27
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    28
val _ = Context.add_setup NBE_Data.init;
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    29
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    30
val tab : NBE_Eval.Univ Symtab.table ref = ref Symtab.empty;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    31
fun lookup s = (the o Symtab.lookup (!tab)) s;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    32
fun update sx = (tab := Symtab.update sx (!tab));
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    33
fun defined s = Symtab.defined (!tab) s;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    34
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    35
fun use_show s = (writeln ("\n---generated code:\n"^ s);
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    36
     use_text(writeln o enclose "\n---compiler echo:\n" "\n---\n",
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    37
              writeln o enclose "\n--- compiler echo (with error!):\n" 
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    38
                                "\n---\n")
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    39
      true s);
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    40
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    41
fun norm_by_eval_i t thy =
19150
1457d810b408 class package and codegen refinements
haftmann
parents: 19147
diff changeset
    42
  let
1457d810b408 class package and codegen refinements
haftmann
parents: 19147
diff changeset
    43
    val nbe_tab = NBE_Data.get thy;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19181
diff changeset
    44
    val modl_old = CodegenThingol.project_module (Symtab.keys nbe_tab)
19150
1457d810b408 class package and codegen refinements
haftmann
parents: 19147
diff changeset
    45
      (CodegenPackage.get_root_module thy);
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    46
    val (t', thy') = CodegenPackage.codegen_term t thy;
19167
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19150
diff changeset
    47
    val modl_new = CodegenPackage.get_root_module thy';
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19150
diff changeset
    48
    val diff = CodegenThingol.diff_module (modl_new, modl_old);
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19150
diff changeset
    49
    val _ = writeln ("new definitions: " ^ (commas o map fst) diff);
19150
1457d810b408 class package and codegen refinements
haftmann
parents: 19147
diff changeset
    50
    val _ = (tab := nbe_tab;
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    51
             Library.seq (use_show o NBE_Codegen.generate defined) diff);
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    52
    val thy'' = NBE_Data.put (!tab) thy';
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    53
    val nt' = NBE_Eval.nbe (!tab) t';
19181
5c9f58562602 minor changes
nipkow
parents: 19177
diff changeset
    54
    val _ = print nt';
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    55
    val t' = NBE_Codegen.nterm_to_term thy'' nt';
19181
5c9f58562602 minor changes
nipkow
parents: 19177
diff changeset
    56
(*
5c9f58562602 minor changes
nipkow
parents: 19177
diff changeset
    57
    val _ = print t';
5c9f58562602 minor changes
nipkow
parents: 19177
diff changeset
    58
    val (t'', _) =
5c9f58562602 minor changes
nipkow
parents: 19177
diff changeset
    59
      Sign.infer_types (Sign.pp thy) thy (Sign.consts_of thy) (K NONE) (K NONE)
5c9f58562602 minor changes
nipkow
parents: 19177
diff changeset
    60
        [] true ([t'], type_of t);
5c9f58562602 minor changes
nipkow
parents: 19177
diff changeset
    61
*)
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    62
    val _ = (Pretty.writeln o Sign.pretty_term thy'') t';
19150
1457d810b408 class package and codegen refinements
haftmann
parents: 19147
diff changeset
    63
  in
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    64
    (t', thy'')
19150
1457d810b408 class package and codegen refinements
haftmann
parents: 19147
diff changeset
    65
  end;
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    66
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    67
fun norm_by_eval raw_t thy = norm_by_eval_i (Sign.read_term thy raw_t) thy;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    68
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    69
structure P = OuterParse and K = OuterKeyword;
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    70
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    71
val nbeP =
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    72
  OuterSyntax.command "norm_by_eval" "normalization by evaluation" K.thy_decl
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    73
    (P.term >> (fn t => Toplevel.theory (snd o norm_by_eval t)));
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    74
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    75
val _ = OuterSyntax.add_parsers [nbeP];
0f584853b6a4 added nbe, updated neb_*
nipkow
parents:
diff changeset
    76
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    77
end;