src/Pure/Tools/nbe_codegen.ML
author nipkow
Tue, 21 Feb 2006 16:18:50 +0100
changeset 19116 d065ec558092
child 19118 52f751b50716
permissions -rwxr-xr-x
New normalization-by-evaluation package
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     1
(*  ID:         $Id$
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     2
    Author:     Klaus Aehlig, Tobias Nipkow
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     3
*)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     4
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     5
(* Global asssumptions:
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     6
   For each function: there is at least one defining eqns and
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     7
   all defining equations have same number of arguments.
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     8
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     9
FIXME
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    10
fun MLname s = "nbe_" ^ s;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    11
val quote = quote;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    12
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    13
FIXME xtab in theory
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    14
*)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    15
(*
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    16
structure NBE_Codegen =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    17
struct
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    18
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    19
FIXME CodegenThingol names! which "error"?
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    20
*)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    21
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    22
val is_constr = NBE_Eval.is_constr;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    23
val Eval = "NBE_Eval";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    24
val Eval_register= Eval ^ ".register";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    25
val Eval_lookup  = Eval ^ ".lookup";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    26
val Eval_apply   = Eval ^ ".apply";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    27
val Eval_Constr  = Eval ^ ".Constr";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    28
val Eval_C       = Eval ^ ".C";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    29
val Eval_AbsN    = Eval ^ ".AbsN";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    30
val Eval_Fun     = Eval ^ ".Fun";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    31
val Eval_BVar    = Eval ^ ".BVar";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    32
val Eval_new_name = Eval ^ ".new_name";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    33
val Eval_to_term = Eval ^ ".to_term";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    34
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    35
fun MLname s = "nbe_" ^ s;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    36
fun MLvname s  = "v_" ^ MLname s;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    37
fun MLparam n  = "p_" ^ string_of_int n;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    38
fun MLintern s = "i_" ^ MLname s;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    39
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    40
fun MLparams n = map MLparam (1 upto n);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    41
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    42
structure S =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    43
struct
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    44
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    45
val quote = quote; (* FIXME *)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    46
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    47
fun app e1 e2 = "(" ^ e1 ^ " " ^ e2 ^ ")";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    48
fun abs v e = "(fn" ^ v ^ " => " ^ e ^ ")";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    49
fun tup es = "(" ^ commas es ^ ")";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    50
fun list es = "[" ^ commas es ^ "]";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    51
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    52
fun apps s ss = Library.foldl (uncurry app) (s, ss);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    53
fun nbe_apps s ss =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    54
  Library.foldr (fn (s,e) => app (app Eval_apply e) s) (ss,s);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    55
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    56
fun eqns name ees =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    57
  let fun eqn (es,e) = name ^ " " ^ space_implode " " es ^ " = " ^ e
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    58
  in "fun " ^ space_implode "\n  | " (map eqn ees) ^ ";\n" end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    59
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    60
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    61
fun Val v s = "val " ^ v ^ " = " ^ s;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    62
fun Let ds e = "let\n" ^ (space_implode "\n" ds) ^ " in " ^ e ^ " end"
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    63
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    64
end
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    65
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    66
fun mk_nbeFUN(nm,e) =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    67
  S.app Eval_Fun (S.tup [S.abs(S.list [MLvname nm])e,S.list [],"1",
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    68
      S.abs(S.tup [])(S.Let 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    69
        [S.Val (MLintern "var") (S.app Eval_new_name (S.tup [])),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    70
         S.Val (MLvname nm) (S.app Eval_BVar (S.tup [(MLintern "var"), S.list []]))]
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    71
	(S.app Eval_AbsN(S.tup[MLintern "var",(S.app Eval_to_term e)])))]);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    72
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    73
fun take_last n xs = rev (Library.take(n, rev xs));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    74
fun drop_last n xs = rev (Library.drop(n, rev xs));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    75
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    76
fun selfcall nm ar args =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    77
	if (ar <= length args) then 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    78
	  S.nbe_apps (S.app (MLname nm) (S.list (take_last ar args)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    79
	             (drop_last ar args)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    80
        else S.app Eval_Fun (S.tup [MLname nm,S.list args,
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    81
	           string_of_int(ar - (length args)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    82
		   S.abs (S.tup []) (S.app Eval_C
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    83
	(S.quote nm))]);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    84
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    85
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    86
fun mk_rexpr nm ar =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    87
  let fun mk args t = case t of
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    88
    CodegenThingol.IConst((s,_),_) => 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    89
    if s=nm then selfcall nm ar args
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    90
    else if is_constr s then S.app Eval_Constr 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    91
                                   (S.tup [S.quote s,S.list args ])
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    92
    else S.nbe_apps (MLname s) args
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    93
  | CodegenThingol.IVarE(s,_) => S.nbe_apps (MLvname s) args
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    94
  | CodegenThingol.IApp(e1,e2) => mk (args @ [mk [] e2]) e1
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    95
  | CodegenThingol.IAbs(CodegenThingol.IVarE(nm,_), e) =>
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    96
      S.nbe_apps (mk_nbeFUN(nm, mk [] e)) args
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    97
  | _ => sys_error "NBE mkexpr"
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    98
  in mk [] end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    99
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   100
val mk_lexpr =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   101
  let fun mk args t = case t of
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   102
    CodegenThingol.IConst((s,_),_) =>
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   103
      S.app Eval_Constr (S.tup [S.quote s, S.list args])
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   104
  | CodegenThingol.IVarE(s,_) => if args = [] then MLvname s else 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   105
      sys_error "NBE mk_lexpr illegal higher order pattern"
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   106
  | CodegenThingol.IApp(e1,e2) => mk (args @ [mk [] e2]) e1
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   107
  | _ => sys_error "NBE mk_lexpr illegal pattern"
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   108
  in mk [] end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   109
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   110
fun mk_eqn nm ar (lhs,e) = ([S.list(map mk_lexpr (rev lhs))], mk_rexpr nm ar e);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   111
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   112
fun funs_of_expr(CodegenThingol.IConst((s,_),_),fs) = s::fs
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   113
  | funs_of_expr(CodegenThingol.IApp(e1,e2),fs) =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   114
      funs_of_expr(e1, funs_of_expr(e2, fs))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   115
  | funs_of_expr(CodegenThingol.IAbs(_, e),fs) = funs_of_expr(e,fs)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   116
  | funs_of_expr(_,fs) = fs;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   117
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   118
fun lookup nm =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   119
  S.Val (MLname nm) (S.app Eval_lookup (S.quote nm));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   120
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   121
fun export thy (nm,CodegenThingol.Fun(eqns,_)) =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   122
  let
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   123
    val ar = length(fst(hd eqns));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   124
    val params = S.list (rev (MLparams ar));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   125
    val funs = Library.flat(map (fn (_,e) => funs_of_expr(e,[])) eqns) \ nm;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   126
    val globals = map lookup (filter_out is_constr funs);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   127
    val default_eqn = ([params], S.app Eval_Constr (S.tup[S.quote nm,params]));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   128
    val code = S.eqns (MLname nm) (map (mk_eqn nm ar) eqns @ [default_eqn])
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   129
    val register = S.app Eval_register
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   130
                     (S.tup[S.quote nm, MLname nm, string_of_int ar])
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   131
  in
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   132
    S.Let (globals @ [code]) register
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   133
  end
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   134
  | export _ _ = "\"NBE no op\"";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   135
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   136
val use_show = fn s => (writeln ("\n---generated code:\n"^ s);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   137
     use_text(writeln o enclose "\n---compiler echo:\n" "\n---\n",
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   138
              writeln o enclose "\n--- compiler echo (with error!):\n" 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   139
                                "\n---\n")
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   140
      true s);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   141
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   142
val dummyIT = CodegenThingol.IType("DUMMY",[]);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   143
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   144
use_show(export "" ("append",CodegenThingol.Fun(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   145
  [([CodegenThingol.IConst(("Nil",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   146
     CodegenThingol.IVarE("ys",dummyIT)],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   147
    CodegenThingol.IVarE("ys",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   148
   ([CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   149
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   150
         CodegenThingol.IConst(("Cons",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   151
         CodegenThingol.IVarE("x",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   152
       CodegenThingol.IVarE("xs",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   153
     CodegenThingol.IVarE("ys",dummyIT)],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   154
    CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   155
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   156
         CodegenThingol.IConst(("Cons",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   157
         CodegenThingol.IVarE("x",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   158
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   159
         CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   160
           CodegenThingol.IConst(("append",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   161
           CodegenThingol.IVarE("xs",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   162
         CodegenThingol.IVarE("ys",dummyIT))))]
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   163
  ,([],dummyIT))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   164
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   165
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   166
let
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   167
fun test a b = if a=b then () else error "oops!";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   168
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   169
val CNil = Const("Nil",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   170
val CCons = Const("Cons",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   171
val Cappend = Const("append",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   172
val Fx = Free("x",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   173
val Fy = Free("y",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   174
val Fxs = Free("xs",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   175
val Fys = Free("ys",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   176
open NBE_Eval
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   177
in
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   178
test (nbe(CNil)) (C "Nil");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   179
test (nbe(CCons)) (C "Cons");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   180
test (nbe(Cappend)) (C "append");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   181
test (nbe(Cappend $ CNil $ CNil)) (C "Nil");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   182
test (nbe(Cappend $ Fxs)) (A (C "append", V "xs"));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   183
test (nbe(Cappend $ Fxs $ Fys)) (A (A (C "append", V "xs"), V "ys"));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   184
test (nbe(Cappend $ CNil $ Fxs)) (V "xs");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   185
test (nbe(Cappend $ (CCons $ Fx $ Fxs) $ Fys))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   186
     (A (A (C "Cons", V "x"), A (A (C "append", V "xs"), V "ys")));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   187
test (nbe(Cappend $ (CCons $ Fx $ Fxs) $ (CCons $ Fy $ Fys)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   188
     (A (A (C "Cons", V "x"), A (A (C "append", V "xs"), A (A (C "Cons", V "y"), V "ys"))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   189
test (nbe(Cappend $ (CCons $ Fx $ (CCons $ Fy $ Fxs)) $ (CCons$Fy$Fys)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   190
 (A
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   191
      (A (C "Cons", V "x"),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   192
         A
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   193
            (A (C "Cons", V "y"),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   194
               A (A (C "append", V "xs"), A (A (C "Cons", V "y"), V "ys")))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   195
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   196
end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   197
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   198
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   199
use_show(export "" ("app",CodegenThingol.Fun(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   200
  [
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   201
  ([CodegenThingol.IConst(("Nil",dummyIT),[])],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   202
    CodegenThingol.IAbs(CodegenThingol.IVarE("ys",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   203
                        CodegenThingol.IVarE("ys",dummyIT))),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   204
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   205
   ([CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   206
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   207
         CodegenThingol.IConst(("Cons",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   208
         CodegenThingol.IVarE("x",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   209
       CodegenThingol.IVarE("xs",dummyIT))],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   210
    CodegenThingol.IAbs(CodegenThingol.IVarE("ys",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   211
    CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   212
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   213
         CodegenThingol.IConst(("Cons",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   214
         CodegenThingol.IVarE("x",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   215
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   216
         CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   217
           CodegenThingol.IConst(("app",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   218
           CodegenThingol.IVarE("xs",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   219
         CodegenThingol.IVarE("ys",dummyIT)))))]
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   220
  ,([],dummyIT))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   221
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   222
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   223
let
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   224
fun test a b = if a=b then () else error "oops!";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   225
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   226
val CNil = Const("Nil",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   227
val CCons = Const("Cons",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   228
val Cappend = Const("app",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   229
val Fx = Free("x",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   230
val Fy = Free("y",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   231
val Fxs = Free("xs",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   232
val Fys = Free("ys",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   233
open NBE_Eval
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   234
in
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   235
test (nbe(CNil)) (C "Nil");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   236
test (nbe(CCons)) (C "Cons");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   237
test (nbe(Cappend)) (C "app");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   238
test (nbe(Cappend $ CNil)) (AbsN (1, B 1));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   239
test (nbe(Cappend $ CNil $ CNil)) (C "Nil");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   240
test (nbe(Cappend $ Fxs)) (A (C "app", V "xs"));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   241
test (nbe(Cappend $ Fxs $ Fys)) (A (A (C "app", V "xs"), V "ys"));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   242
test (nbe(Cappend $ CNil $ Fxs)) (V "xs");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   243
test (nbe(Cappend $ (CCons $ Fx $ Fxs) $ Fys))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   244
     (A (A (C "Cons", V "x"), A (A (C "app", V "xs"), V "ys")));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   245
test (nbe(Cappend $ (CCons $ Fx $ Fxs))) 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   246
   (AbsN (1, A (A (C "Cons", V "x"), A (A (C "app", V "xs"), B 1))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   247
test (nbe(Cappend $ (CCons $ Fx $ Fxs) $ (CCons $ Fy $ Fys)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   248
     (A (A (C "Cons", V "x"), A (A (C "app", V "xs"), A (A (C "Cons", V "y"), V "ys"))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   249
test (nbe(Cappend $ (CCons $ Fx $ (CCons $ Fy $ Fxs)) $ (CCons$Fy$Fys)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   250
 (A
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   251
      (A (C "Cons", V "x"),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   252
         A
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   253
            (A (C "Cons", V "y"),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   254
               A (A (C "app", V "xs"), A (A (C "Cons", V "y"), V "ys")))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   255
()
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   256
end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   257
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   258
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   259
use_show(export "" ("add",CodegenThingol.Fun(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   260
  [
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   261
  ([CodegenThingol.IConst(("0",dummyIT),[])],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   262
    CodegenThingol.IAbs(CodegenThingol.IVarE("n",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   263
                        CodegenThingol.IVarE("n",dummyIT))),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   264
   ([CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   265
       CodegenThingol.IConst(("S",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   266
       CodegenThingol.IVarE("n",dummyIT))],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   267
    CodegenThingol.IAbs(CodegenThingol.IVarE("m",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   268
      CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   269
         CodegenThingol.IConst(("S",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   270
           CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   271
             CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   272
               CodegenThingol.IConst(("add",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   273
               CodegenThingol.IVarE("n",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   274
             CodegenThingol.IVarE("m",dummyIT)))))]
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   275
  ,([],dummyIT))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   276
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   277
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   278
let
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   279
fun test a b = if a=b then () else error "oops!";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   280
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   281
val C0 = Const("0",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   282
val CS = Const("S",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   283
val Cadd = Const("add",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   284
val Fx = Free("x",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   285
val Fy = Free("y",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   286
open NBE_Eval
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   287
in
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   288
test (nbe(Cadd $ C0)) (AbsN (1, B 1));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   289
test (nbe(Cadd $ C0 $ C0)) (C "0");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   290
test (nbe(Cadd $ (CS $ (CS $ (CS $ Fx))) $ (CS $ (CS $ (CS $ Fy)))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   291
(A (C "S", A (C "S", A (C "S", A (A (C "add", V "x"), A (C "S", A (C "S", A (C "S", V "y")))))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   292
)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   293
end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   294
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   295
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   296
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   297
use_show(export "" ("mul",CodegenThingol.Fun(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   298
  [
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   299
  ([CodegenThingol.IConst(("0",dummyIT),[])],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   300
    CodegenThingol.IAbs(CodegenThingol.IVarE("n",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   301
                        CodegenThingol.IConst(("0",dummyIT),[]))),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   302
   ([CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   303
       CodegenThingol.IConst(("S",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   304
       CodegenThingol.IVarE("n",dummyIT))],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   305
    CodegenThingol.IAbs(CodegenThingol.IVarE("m",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   306
      CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   307
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   308
         CodegenThingol.IConst(("add",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   309
        CodegenThingol.IVarE("m",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   310
           CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   311
             CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   312
               CodegenThingol.IConst(("mul",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   313
               CodegenThingol.IVarE("n",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   314
             CodegenThingol.IVarE("m",dummyIT)))))]
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   315
  ,([],dummyIT))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   316
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   317
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   318
let
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   319
fun test a b = if a=b then () else error "oops!";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   320
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   321
val C0 = Const("0",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   322
val CS = Const("S",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   323
val Cmul = Const("mul",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   324
val Fx = Free("x",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   325
val Fy = Free("y",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   326
open NBE_Eval
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   327
in
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   328
test (nbe(Cmul $ C0)) (AbsN (1, C "0"));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   329
test (nbe(Cmul $ C0 $ Fx)) (C "0");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   330
test (nbe(Cmul $ (CS $ (CS $ (CS $ C0)))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   331
(AbsN (1, A (A (C "add", B 1), A (A (C "add", B 1), A (A (C "add", B 1), C "0")))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   332
test (nbe(Cmul $ (CS $ (CS $ (CS $ Fx)))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   333
 (AbsN (1, A (A (C "add", B 1), A (A (C "add", B 1),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   334
                     A (A (C "add", B 1), A (A (C "mul", V "x"), B 1))))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   335
test (nbe(Cmul $ (CS $ (CS $ Fx)) $ (CS $ (CS $ (CS $ Fy)))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   336
(A (C "S", A(C "S",A(C "S",A(A (C "add", V "y"),A(C "S",A(C "S",A(C "S",A
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   337
 (A (C "add", V "y"),A(A (C "mul", V "x"),A(C "S",A(C "S",A(C "S", V"y")))))))))))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   338
()
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   339
end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   340
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   341
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   342
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   343
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   344
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   345
(*
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   346
  | export(nm,Fun(cls,(_,ty)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   347
  | export _ = ""
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   348
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   349
fun top_eval st thy =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   350
let val t = Sign.read_term thy st
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   351
    val tabs = CodegenPackage.mk_tabs thy;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   352
    val thy') =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   353
      CodegenPackage.expand_module NONE (CodegenPackage.codegen_term
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   354
         thy tabs [t]) thy
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   355
    val s = map export diff
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   356
in use s; (* FIXME val thy'' = thy' |> *)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   357
   Pretty.writeln (Sign.pretty_term thy t');
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   358
   thy'
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   359
end
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   360
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   361
structure P = OuterParse;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   362
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   363
val nbeP =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   364
  OuterSyntax.command "norm_by_eval" "norm by eval" K.thy_decl
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   365
    (P.term >> (Toplevel.theory o top_eval));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   366
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   367
val _ = OuterSyntax.add_parsers [nbeP];
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   368
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   369
ProofGeneral.write_keywords "nbe";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   370
(* isar-keywords-nbe.el -> isabelle/etc/
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   371
   Isabelle -k nbe *)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   372
*)